From dbc6ef2e77ddbee70f4ff659d0dda1121d46a88a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Seppa=CC=88nen?= Date: Sun, 27 May 2012 17:24:18 +0300 Subject: [PATCH 1/5] Fix TrueType to Type-3 font conversion The code did not handle correctly glyph contours where the first point was off-path. This changes the conversion algorithm to a hopefully clearer one, which explicitly inserts all implicit on-path points between off-path ones as a first step before outputting the PostScript code. --- ttconv/pprdrv_tt2.cpp | 178 +++++++++++++++++++++++++----------------- 1 file changed, 107 insertions(+), 71 deletions(-) diff --git a/ttconv/pprdrv_tt2.cpp b/ttconv/pprdrv_tt2.cpp index f8c8cef66fdb..13023822a53e 100644 --- a/ttconv/pprdrv_tt2.cpp +++ b/ttconv/pprdrv_tt2.cpp @@ -41,6 +41,7 @@ #include "truetype.h" #include #include +#include class GlyphToType3 { @@ -73,7 +74,10 @@ class GlyphToType3 int nextoutctr(int co); int nearout(int ci); double intest(int co, int ci); - void PSCurveto(TTStreamWriter& stream, FWord x, FWord y, int s, int t); + void PSCurveto(TTStreamWriter& stream, + FWord x0, FWord y0, + FWord x1, FWord y1, + FWord x2, FWord y2); void PSMoveto(TTStreamWriter& stream, int x, int y); void PSLineto(TTStreamWriter& stream, int x, int y); void do_composite(TTStreamWriter& stream, struct TTFONT *font, BYTE *glyph); @@ -83,6 +87,18 @@ class GlyphToType3 ~GlyphToType3(); }; +// Each point on a TrueType contour is either on the path or off it (a +// control point); here's a simple representation for building such +// contours. Added by Jouni Seppänen 2012-05-27. +enum Flag { ON_PATH, OFF_PATH }; +struct FlaggedPoint +{ + enum Flag flag; + FWord x; + FWord y; + FlaggedPoint(Flag flag_, FWord x_, FWord y_): flag(flag_), x(x_), y(y_) {}; +}; + double area(FWord *x, FWord *y, int n); #define sqr(x) ((x)*(x)) @@ -150,8 +166,7 @@ double area(FWord *x, FWord *y, int n) */ void GlyphToType3::PSConvert(TTStreamWriter& stream) { - int i,j,k,fst,start_offpt; - int end_offpt = 0; + int i,j,k; assert(area_ctr == NULL); area_ctr=(double*)calloc(num_ctr, sizeof(double)); @@ -191,56 +206,79 @@ void GlyphToType3::PSConvert(TTStreamWriter& stream) i=j=k=0; while ( i < num_ctr ) { - fst = j = (k==0) ? 0 : (epts_ctr[k-1]+1); + // A TrueType contour consists of on-path and off-path points. + // Two consecutive on-path points are to be joined with a + // line; off-path points between on-path points indicate a + // quadratic spline, where the off-path point is the control + // point. Two consecutive off-path points have an implicit + // on-path point midway between them. + std::list points; - /* Move to the first point on the contour. */ - stack(stream, 3); - PSMoveto(stream,xcoor[j],ycoor[j]); - - start_offpt = 0; /* No off curve points yet. */ - - /* Step thru the remaining points of this contour. */ - for (j++; j <= epts_ctr[k]; j++) + // Represent flags and x/y coordinates as a C++ list + for (; j <= epts_ctr[k]; j++) { - if (!(tt_flags[j]&1)) /* Off curve */ - { - if (!start_offpt) - { - start_offpt = end_offpt = j; - } - else - { - end_offpt++; - } + if (!(tt_flags[j] & 1)) { + points.push_back(FlaggedPoint(OFF_PATH, xcoor[j], ycoor[j])); + } else { + points.push_back(FlaggedPoint(ON_PATH, xcoor[j], ycoor[j])); } - else + } + + // For any two consecutive off-path points, insert the implied + // on-path point. + FlaggedPoint prev = points.back(); + for (std::list::iterator it = points.begin(); + it != points.end(); + it++) + { + if (prev.flag == OFF_PATH && it->flag == OFF_PATH) { - /* On Curve */ - if (start_offpt) - { - stack(stream, 7); - PSCurveto(stream, xcoor[j],ycoor[j],start_offpt,end_offpt); - start_offpt = 0; - } - else - { - stack(stream, 3); - PSLineto(stream, xcoor[j], ycoor[j]); - } + points.insert(it, + FlaggedPoint(ON_PATH, + (prev.x + it->x) / 2, + (prev.y + it->y) / 2)); } + prev = *it; } - - /* Do the final curve or line */ - /* of this coutour. */ - if (start_offpt) + // Handle the wrap-around: insert a point either at the beginning + // or at the end that has the same coordinates as the opposite point. + // This also ensures that the initial point is ON_PATH. + if (points.front().flag == OFF_PATH) { - stack(stream, 7); - PSCurveto(stream, xcoor[fst],ycoor[fst],start_offpt,end_offpt); + assert(points.back().flag == ON_PATH); + points.insert(points.begin(), points.back()); } else { - stack(stream, 3); - PSLineto(stream, xcoor[fst],ycoor[fst]); + assert(points.front().flag == ON_PATH); + points.push_back(points.front()); + } + + // For output, a vector is more convenient than a list. + std::vector points_v(points.begin(), points.end()); + // The first point + stack(stream, 3); + PSMoveto(stream, points_v.front().x, points_v.front().y); + + // Step through the remaining points + for (size_t p = 1; p < points_v.size(); ) + { + const FlaggedPoint& point = points_v.at(p); + if (point.flag == ON_PATH) + { + stack(stream, 3); + PSLineto(stream, point.x, point.y); + p++; + } else { + assert(points_v.at(p-1).flag == ON_PATH); + assert(points_v.at(p+1).flag == ON_PATH); + stack(stream, 7); + PSCurveto(stream, + points_v.at(p-1).x, points_v.at(p-1).y, + point.x, point.y, + points_v.at(p+1).x, points_v.at(p+1).y); + p += 2; + } } k=nextinctr(i,k); @@ -392,36 +430,34 @@ void GlyphToType3::PSLineto(TTStreamWriter& stream, int x, int y) } /* -** Emmit a PostScript "curveto" command. +** Emit a PostScript "curveto" command, assuming the current point +** is (x0, y0), the control point of a quadratic spline is (x1, y1), +** and the endpoint is (x2, y2). Note that this requires a conversion, +** since PostScript splines are cubic. */ -void GlyphToType3::PSCurveto(TTStreamWriter& stream, FWord x, FWord y, int s, int t) +void GlyphToType3::PSCurveto(TTStreamWriter& stream, + FWord x0, FWord y0, + FWord x1, FWord y1, + FWord x2, FWord y2) { - int N, i; - double sx[3], sy[3], cx[4], cy[4]; - - N = t-s+2; - for (i=0; i Date: Tue, 29 May 2012 21:06:37 +0300 Subject: [PATCH 2/5] Add a test case for ttconv If I enable svg, I see artifacts in the resulting file that look like there are similar bugs as #903 in svg. --- lib/matplotlib/mpl-data/fonts/ttf/mpltest.ttf | Bin 0 -> 2264 bytes .../test_ttconv/truetype-conversion.pdf | Bin 0 -> 4408 bytes .../test_ttconv/truetype-conversion.png | Bin 0 -> 13211 bytes lib/matplotlib/tests/test_ttconv.py | 13 +++++++++++++ 4 files changed, 13 insertions(+) create mode 100644 lib/matplotlib/mpl-data/fonts/ttf/mpltest.ttf create mode 100644 lib/matplotlib/tests/baseline_images/test_ttconv/truetype-conversion.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_ttconv/truetype-conversion.png create mode 100644 lib/matplotlib/tests/test_ttconv.py diff --git a/lib/matplotlib/mpl-data/fonts/ttf/mpltest.ttf b/lib/matplotlib/mpl-data/fonts/ttf/mpltest.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b8133a6c7baf8e5359c5c431a23c21c42304b254 GIT binary patch literal 2264 zcmd5;O>C4!7=C7UySuGesI4uDO_*(=TL|oK7uZT|B0p`_R-y#c5HN*p_iJ}$|J?mr z=tU8|)HKn92@w*LHmSz=6Ix6FF~)e1A_qO_1&n$?LmKgf9;)5-nc1&ZOpvSJ?99CH z^Zw2|GvBum0IG2UE*$CUd1h~H;M+Lh`-EuYV_n@nXvcc;Z;)?&YJVtl;QZiKKqSZ? z8A``;?z+lF@;|cg9vZV1{Bj&{(FX33SRq#`(KCFLQ5%DSbTBz z;|9upVUH#Vc)oVsqD1hpkR zm1S4Pa)kt*9`26gGwedQOO+nRL6eEeNh`_MI4B5a#>|;JSHyl1Q#g#XIHMt_H=2Ba zP9j_p8sVlTi^Zn-ZtfMZt5hm|?r1`IRsun1xl$35=FxWddR*=bkM~|m|7*E9)7WI% zP7L4`ypJ!KvD7seo8)O$)QjM(K&W%h>&C6ftf%6;&N-JPiCLG1D>OXk^@u+^=UB>H zk*ziUn!whYX1}PsdHJ$Dy)^8XJf@O+H{*IlzHNL$_-p*S%TJ58m|Xfpo?LoCb{FTx zn@c6?PGMADk?%74YUWc{ABk>jX_DKbk@`AMlZf^vdV3Q;Oy8KEz9GKK@7tH(S6p0} znOT_8aSr2zJkQhQMeX0VBH#^)_CQ1XI^h*h1fqdJRQS$~cP#(J^{!B;D^$F;Vd8`3 zAAOxg*7dCX3HNDVBG4WZ-avzQooIKjiK_ZF9wpyu>3e=dU(Srhlk=i+e!h4^Y)|#q zAMJn8jLpJx;X-lofkKitotr z(b1wcJ#9`;H9lNEx0n)L4lUpnzdJN9nOx=2E;P$S4(*1Q_o#f9E3ighbZ8IpYx=gh zc{jywMk&(*)#7J|mRKc<4(&pZtaWHNs^yCgT>&LeIkboPm)L_mEW}`Qj6-1%;~aaD z#V9gJlJ4VsLt#JVIkp&4i(TOur8W|zdZ?Wtt>-*OC|7*P1rg@lN)4MWhYp0;h8O9)*dozDR9(l*DH=2z5nujrybv^d-7Jyw&H4VT=iy0GfCAKRQs)5E|#$}>R8fF zsGe-b?#bpyEENfcRcpewa~+}3FwtR+1`ET%jAd`Es#+ z3>1{MQA63xn3XRivzg5*l^n7%1x6pu#I5|D%8raFrdj{gO7)P=rL=couUUDLD^HWL z;>l6YdK>SyogJp=|8%Cfv3k3AU<qek oeuJdZt|q@$hcrBIF;TbS%H9NN$M2PiY@24TF1+_pdA`)}7cyOpk^lez literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_ttconv/truetype-conversion.pdf b/lib/matplotlib/tests/baseline_images/test_ttconv/truetype-conversion.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0649058c6200935ad56e910f96a60a0419749b32 GIT binary patch literal 4408 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 G@BJ5^2~hI@ literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_ttconv.py b/lib/matplotlib/tests/test_ttconv.py new file mode 100644 index 000000000000..520d6b9b2bcb --- /dev/null +++ b/lib/matplotlib/tests/test_ttconv.py @@ -0,0 +1,13 @@ +import matplotlib +from matplotlib.testing.decorators import image_comparison +import matplotlib.pyplot as plt + +@image_comparison(baseline_images=["truetype-conversion"], + extensions=["pdf", "png"]) +def test_truetype_conversion(): + matplotlib.rcParams['pdf.fonttype'] = 3 + fig = plt.figure() + ax = fig.add_subplot(111) + ax.text(0, 0, "ABCDE", name="mpltest", fontsize=80) + ax.set_xticks([]) + ax.set_yticks([]) From b8cab7293a2db0fc1ff692bd3eda09beb482af17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Seppa=CC=88nen?= Date: Tue, 29 May 2012 23:30:36 +0300 Subject: [PATCH 3/5] Move test font inside test directory --- .../{mpl-data/fonts/ttf => tests}/mpltest.ttf | Bin lib/matplotlib/tests/test_ttconv.py | 7 ++++++- 2 files changed, 6 insertions(+), 1 deletion(-) rename lib/matplotlib/{mpl-data/fonts/ttf => tests}/mpltest.ttf (100%) diff --git a/lib/matplotlib/mpl-data/fonts/ttf/mpltest.ttf b/lib/matplotlib/tests/mpltest.ttf similarity index 100% rename from lib/matplotlib/mpl-data/fonts/ttf/mpltest.ttf rename to lib/matplotlib/tests/mpltest.ttf diff --git a/lib/matplotlib/tests/test_ttconv.py b/lib/matplotlib/tests/test_ttconv.py index 520d6b9b2bcb..1203da92e7eb 100644 --- a/lib/matplotlib/tests/test_ttconv.py +++ b/lib/matplotlib/tests/test_ttconv.py @@ -1,13 +1,18 @@ import matplotlib +from matplotlib.font_manager import FontProperties from matplotlib.testing.decorators import image_comparison import matplotlib.pyplot as plt +import os.path @image_comparison(baseline_images=["truetype-conversion"], extensions=["pdf", "png"]) def test_truetype_conversion(): + fontname = os.path.join(os.path.dirname(__file__), 'mpltest.ttf') + fontname = os.path.abspath(fontname) + fontprop = FontProperties(fname=fontname, size=80) matplotlib.rcParams['pdf.fonttype'] = 3 fig = plt.figure() ax = fig.add_subplot(111) - ax.text(0, 0, "ABCDE", name="mpltest", fontsize=80) + ax.text(0, 0, "ABCDE", fontproperties=fontprop) ax.set_xticks([]) ax.set_yticks([]) From bd510d8b7d3b3c8739875bdbae82bbf05d0d4c25 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 30 May 2012 11:47:31 -0400 Subject: [PATCH 4/5] Remove PNG from the test_ttconv test -- it doesn't seem to work across freetype versions, and also it doesn't actually test ttconv, wihch is not used by the Agg backend. --- .../test_ttconv/truetype-conversion.png | Bin 13211 -> 0 bytes lib/matplotlib/tests/test_ttconv.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 lib/matplotlib/tests/baseline_images/test_ttconv/truetype-conversion.png diff --git a/lib/matplotlib/tests/baseline_images/test_ttconv/truetype-conversion.png b/lib/matplotlib/tests/baseline_images/test_ttconv/truetype-conversion.png deleted file mode 100644 index eae53ae93de9ea414b75608d9b7257ed9a671313..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13211 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 G@BJ5^2~hI@ diff --git a/lib/matplotlib/tests/test_ttconv.py b/lib/matplotlib/tests/test_ttconv.py index 1203da92e7eb..21f9b79ccb1c 100644 --- a/lib/matplotlib/tests/test_ttconv.py +++ b/lib/matplotlib/tests/test_ttconv.py @@ -5,7 +5,7 @@ import os.path @image_comparison(baseline_images=["truetype-conversion"], - extensions=["pdf", "png"]) + extensions=["pdf"]) def test_truetype_conversion(): fontname = os.path.join(os.path.dirname(__file__), 'mpltest.ttf') fontname = os.path.abspath(fontname) From 3da8212e73043cba6358296a9d72072e5e644eed Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 30 May 2012 11:47:43 -0400 Subject: [PATCH 5/5] Install the mpltest.ttf file --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 5c54c9565116..8f4b0d1977c0 100644 --- a/setup.py +++ b/setup.py @@ -112,6 +112,7 @@ def chop_package(fname): return result baseline_images = [chop_package(f) for f in baseline_images] package_data['matplotlib'].extend(baseline_images) + package_data['matplotlib'].append('tests/mpltest.ttf') if not check_for_numpy(__version__numpy__): sys.exit(1)