From 88b013251f75f7c43fdc42017751c3493cc3b8f7 Mon Sep 17 00:00:00 2001 From: Nigel Tao Date: Fri, 9 Dec 2016 22:46:30 +1100 Subject: [PATCH] font/sfnt: implement rrcurveto. Change-Id: I2e24293568b296dd916b2ef6a9c1113ffd5f9253 Reviewed-on: https://go-review.googlesource.com/34171 Reviewed-by: Dave Day --- font/sfnt/postscript.go | 19 ++++++++++++++++++- font/sfnt/sfnt_test.go | 14 ++++++++++++++ font/testdata/CFFTest.otf | Bin 2172 -> 2248 bytes font/testdata/CFFTest.sfd | 30 +++++++++++++++++++++++++++--- 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/font/sfnt/postscript.go b/font/sfnt/postscript.go index 93f5490..d5d6d9a 100644 --- a/font/sfnt/postscript.go +++ b/font/sfnt/postscript.go @@ -548,7 +548,7 @@ var psOperators = [...][2][]psOperator{ 5: {-1, "rlineto", t2CRlineto}, 6: {-1, "hlineto", t2CHlineto}, 7: {-1, "vlineto", t2CVlineto}, - 8: {}, // rrcurveto. + 8: {-1, "rrcurveto", t2CRrcurveto}, 9: {}, // Reserved. 10: {}, // callsubr. 11: {}, // return. @@ -834,6 +834,23 @@ func t2CVcurveto(p *psInterpreter, i int32) (j int32) { return i } +func t2CRrcurveto(p *psInterpreter) error { + if !p.type2Charstrings.seenWidth || p.stack.top < 6 || p.stack.top%6 != 0 { + return errInvalidCFFTable + } + for i := int32(0); i != p.stack.top; i += 6 { + t2CAppendCubeto(p, + p.stack.a[i+0], + p.stack.a[i+1], + p.stack.a[i+2], + p.stack.a[i+3], + p.stack.a[i+4], + p.stack.a[i+5], + ) + } + return nil +} + func t2CEndchar(p *psInterpreter) error { t2CReadWidth(p, 0) if p.stack.top != 0 || len(p.instructions) != 0 { diff --git a/font/sfnt/sfnt_test.go b/font/sfnt/sfnt_test.go index 68ef19c..fe43d32 100644 --- a/font/sfnt/sfnt_test.go +++ b/font/sfnt/sfnt_test.go @@ -125,6 +125,20 @@ func TestPostScript(t *testing.T) { lineTo(300, 0), lineTo(300, 800), lineTo(100, 800), + }, { + // Q + // - contour #0 + moveTo(657, 237), + lineTo(289, 387), + lineTo(519, 615), + // - contour #1 + moveTo(792, 169), + cubeTo(867, 263, 926, 502, 791, 665), + cubeTo(645, 840, 380, 831, 228, 673), + cubeTo(71, 509, 110, 231, 242, 93), + cubeTo(369, -39, 641, 18, 722, 93), + lineTo(802, 3), + lineTo(864, 83), }, { // uni4E2D // - contour #0 diff --git a/font/testdata/CFFTest.otf b/font/testdata/CFFTest.otf index 1f10cfcc519caa0124267bb7707a353428f64c16..a21738ba09834b44aa07437eb3351a3404fa44ee 100644 GIT binary patch delta 683 zcmX|9TWAwe5S@GXk=P_A!Iq@B#zkTaV$DOSCO#0-tUub=xM1-?8%#(*qk%+?0ZCgy zvGqf_2qK6-TA^T}we+iqh=?K<1gT*BmWpD3)JxnzoS4PC%*>f{?#z8{!}Z!-P3U?8 zY%m4_1Y??}-kYA}0P-jR^=O)Y_=32)1;Bb20F;9RaSfc{!@P{SFL5*w9)7ooI#Dqn zJ)KV#Ae#&Uh~JS*<}#_Y?d|dt)Rxftb4bX)#UaE$(fql5sam!xWEmSSAkmpml?xyp zK}fvluN^3v9wFGVq}g*Z;>f zR%QhiC|J?j18a~0INsAP5VDYlPE%|L2>>^O9z;6H{6wchH>;3H?`FE^-?}J(g`P37 z1TK2V#4_@W>=Wth-A@d>SR$^&x$Ef(6HB1dqKReXr=RYiF4`T%1I0kYPlpT?p@eyh zi?9(~NhgvOge+o7aVzinE48hP~U$co!u#KAUoAYxYTXR{z zbczUUT$*EXdC*gD)E6X$2u=mSr4YMYflUhe!)D|c4hWO$AQ9rvRi1re7cG}#^<(v| ze7vh6@@>4r%MyRoNOrA!eZ{XD8~HAyhsTWj6UKHUY=n&6^TrJK8a}?k@bZT*Kd)G8 zp*J;&{jdZ)mmbt-r{pPn$6Cjl-Of+iYPY#;cd&pp>M0C7CirjAVMvo(kjB@!g80T? Dvoxk` delta 627 zcmX|8OK4M35Iy((8k1-eKUDBho)~O5NnamQZ0tswK0&al_yj3}h9+qi=7WtiW|Ke{ zDsHS7cP^|87lI3I>qf!SRmn~e@w0O0E}KXz72okx+n0cm14P?(y-T&data8{0x&P6r(HxaMBk=Al({nMTwULI#axU2&G}Nc z`gC%m18BSCE*A6ITyXm96UN?C#)~BMWo47NONkdtwPrnVMqK8Dw@5@w*?JY4UrQXP zGRoOfepxL{&~E{1y;@nU^%|QFLutk>2tO5g{KNZlBQp65A@wI2d@8iJ_pSexu4+L+ zfb#$F4jEwXv~ta7L>D<6_0j&(05(DmO*tmx!sA`p5EH|vl&ODp{osJI)WM?oVm>Jx?|9f3Gg&Hxr6jKCaCI(HhCSMp^L2(b75b