Author: jghali
Date: Sat Apr 29 10:51:46 2017
New Revision: 22008

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22008
Log:
#14786: Font outlining artefacts in PDF export

Modified:
    trunk/Scribus/scribus/pdflib_core.cpp

Modified: trunk/Scribus/scribus/pdflib_core.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22008&path=/trunk/Scribus/scribus/pdflib_core.cpp
==============================================================================
--- trunk/Scribus/scribus/pdflib_core.cpp       (original)
+++ trunk/Scribus/scribus/pdflib_core.cpp       Sat Apr 29 10:51:46 2017
@@ -1423,6 +1423,13 @@
        result.method = Use_Type3;
        result.encoding = Encode_256;
 
+       // TrueType font rasterizers use non-zero winding file rule,
+       // vs even-odd for current Postscript font rasterizers
+       // Note: OTF CFF2 will also use non-zero winding rule, so
+       // change code below when adding CCF2 support to Scribus
+       // ref: https://www.microsoft.com/typography/OTSpec/cff2.htm
+       bool useNonZeroRule = (face.type() == ScFace::TTF);
+
        uint SubFonts = 0;
        int glyphCount = 0;
        double minx =  std::numeric_limits<double>::max();
@@ -1468,7 +1475,7 @@
                                np2 = gly.point(poi+2);
                                fon += FToStr(np.x()) + " " + FToStr(np.y()) + 
" " + FToStr(np1.x()) + " " + FToStr(np1.y()) + " " + FToStr(np2.x()) + " " + 
FToStr(np2.y()) + " c\n";
                        }
-                       fon += "h f*\n";
+                       fon += useNonZeroRule? "h f\n" : "h f*\n";
                        np = getMinClipF(&gly);
                        np1 = getMaxClipF(&gly);
                }
@@ -1565,6 +1572,13 @@
        result.method = Use_XForm;
        result.encoding = Encode_224;
 
+       // TrueType font rasterizers use non-zero winding file rule,
+       // vs even-odd for current Postscript font rasterizers
+       // Note: OTF CFF2 will also use non-zero winding rule, so
+       // change code below when adding CCF2 support to Scribus
+       // ref: https://www.microsoft.com/typography/OTSpec/cff2.htm
+       bool useNonZeroRule = (face.type() == ScFace::TTF);
+
        QByteArray fon;
        QMap<uint,FPointArray>::ConstIterator ig;
        for (ig = RealGlyphs.cbegin(); ig != RealGlyphs.cend(); ++ig)
@@ -1599,7 +1613,7 @@
                                FToStr(np1.x()) + " " + FToStr(-np1.y()) + " " +
                                FToStr(np2.x()) + " " + FToStr(-np2.y()) + " 
c\n";
                        }
-                       fon += "h f*\n";
+                       fon += useNonZeroRule? "h f\n" : "h f*\n";
                        np = getMinClipF(&gly);
                        np1 = getMaxClipF(&gly);
                }


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to