From 8aac2256eda12b23c1d5fa237fc496f77ac5af1c Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Tue, 17 Jan 2012 20:50:49 -0800 Subject: [PATCH] Fix zero width lines. --- src/canvas.js | 19 +++++++++++++++++-- test/pdfs/.gitignore | 1 + test/pdfs/zerowidthline.pdf | Bin 0 -> 6569 bytes test/test_manifest.json | 7 +++++++ 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 test/pdfs/zerowidthline.pdf diff --git a/src/canvas.js b/src/canvas.js index 4feac4efe..5ef900861 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -48,6 +48,7 @@ var CanvasExtraState = (function CanvasExtraStateClosure() { // Note: fill alpha applies to all non-stroking operations this.fillAlpha = 1; this.strokeAlpha = 1; + this.lineWidth = 1; this.old = old; } @@ -329,6 +330,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { // Graphics state setLineWidth: function canvasGraphicsSetLineWidth(width) { + this.current.lineWidth = width; this.ctx.lineWidth = width; }, setLineCap: function canvasGraphicsSetLineCap(style) { @@ -442,6 +444,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { consumePath = typeof consumePath !== 'undefined' ? consumePath : true; var ctx = this.ctx; var strokeColor = this.current.strokeColor; + if (this.current.lineWidth === 0) + ctx.lineWidth = this.getSinglePixelWidth(); // For stroke we want to temporarily change the global alpha to the // stroking alpha. ctx.globalAlpha = this.current.strokeAlpha; @@ -640,7 +644,6 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { ctx.translate(current.x, current.y); ctx.scale(textHScale, 1); - ctx.lineWidth /= current.textMatrix[0]; if (textSelection) { this.save(); @@ -677,7 +680,15 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { } else { ctx.save(); this.applyTextTransforms(); - ctx.lineWidth /= current.textMatrix[0] * fontMatrix[0]; + + var lineWidth = current.lineWidth; + var scale = Math.abs(current.textMatrix[0] * fontMatrix[0]); + if (scale == 0 || lineWidth == 0) + lineWidth = this.getSinglePixelWidth(); + else + lineWidth /= scale; + + ctx.lineWidth = lineWidth; if (textSelection) text.geom = this.getTextGeometry(); @@ -1142,6 +1153,10 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { }, restoreFillRule: function canvasGraphicsRestoreFillRule(rule) { this.ctx.mozFillRule = rule; + }, + getSinglePixelWidth: function getSinglePixelWidth(scale) { + var inverse = this.ctx.mozCurrentTransformInverse; + return Math.abs(inverse[0] + inverse[2]); } }; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 956980782..1aae82800 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -22,3 +22,4 @@ !issue918.pdf !smaskdim.pdf !type4psfunc.pdf +!zerowidthline.pdf diff --git a/test/pdfs/zerowidthline.pdf b/test/pdfs/zerowidthline.pdf new file mode 100644 index 0000000000000000000000000000000000000000..379f18049e93e41061057f67d6fc22c780828d85 GIT binary patch literal 6569 zcmdT}du$v>8DFUgniEx9P}I;uHC*DLfk0=kMR%%2=DkxQ=fsX&B65*0!Ts8U->znR^= z+dDh)sR@77m#lARzQ=su_xrw?`P@~^_lLxABGC2cGbc|4Vn{&7U*loi2>iQYBn(u->-q%Jdq6rVlhbcvOR?&(HMxcY?I(h zp#I2X!zax9?zrI>7nkn*-Rf6fyYJd97oT6fVWl~8{d12WzHu$SZsoSUuYPj;yZiq2 zqwPN^{p<_-_uTp!?L!~y{$To1@zL|wzx2XOPek>dr~kcdS=YCZZTr*F#Mx&)8WnQ6 zTll&sKQr2@TIwjqXSmp-fyfaf8v;VZgBd?4<0-7)}gPT zfARIqWNPe|{nOtZdgI}BzdnBOo-g0?tN7N*Q<0fHe|zow_^umI?4CLLIz2(6JpSy7W_o+WVviB>8AJ6Z3_DQ>NYW33V&J3;?f8p(=@4WKQUmp1T$-`ee z`1unztr+^w?$Tpt6Mave-ud6RpFaNSqc6XBga*a+u^S$m1M^eFLj0YoLc>Z^Xc$o- z8#R_P&B#U?tZs7k1HKSHQk%3{uF;GW5#Ng~;>@fk+6=K(86$oOS0MKNFuhg>9H@F3 z@tajWr(0@cps9)Go43fKX~-kQMiV^bI^dJkLFYgP^19dk-RJ%ufK@Za6xX1Nu6LM$ zc5K7sb|Tvp@Bq4|9*SWXt4_IK==Pa3sOrV%;Zx<(91ova_6fs?3}Xsc;=-K4nOqr)OVRZ-KU6^7f*^`ypaWCg~3LVi%RhbMVy<0ncM4CEKdWN zCrMe=dx95!{!9?5N>6ZetRNJsePl{qzr!RWJBCK(9n*433ErL!Wa{a9rCI?^s9w=@ zD_!piVkosF4d3Z7A4H7Ap6&_e=mZ)o6j7gH5)=&sN<*>`ji8tmjwGanl>8Ku1R=!> zA}=OGVk|8r(?T?u4J^r+N+~@IN#>}5x1OL6NwX0OBVJ6UfLY=tDFhTDYfiUuJ)~R9 zsR&0#o>;P}R&59eqB8NMQL}r3uuQgoMQ+Hg)=Z5_Rb-xMq(XNqUJQ#o6SgFy$mx<{ zR!?ID~>$nOi5j>OtU78gfLQ^|S&vPLtsA6JN64FsAEk@Q*kP8{U zjgld!F=m*fhM{Fg`(UH-k-EbTT6T1t>qL`}vdQgMjE?yIwA5z|j6SDz>PSeKg&heK z;K+#QNO(=(N#%O> zH1!sBMN2$A^tgMDyIFXKHa;ilq7Tu21F( z@b8!#HxA^{B;0otIK_dPw54DoII$qBN@RGGk*doW)UdOVQ9>9gZZ&Gt>lb?|)ih?= zX8mZBz-BMSI)k+uOQkI2NE>5wuEE`gOmFM)g}{;FAUxd`ur_YC)x!zpN^!klaZ?q( zWhouvn#NpJS~wR4Hl#G%wIJe)<@Ng$%tdV42q5a1NjEqJo34u*>CrJvp@7+KIO`Cg z1CW?yVzx1N0@98v=)9!9s#PHe6;EMR@2YtdSK0&7p)+Z_aaF%S+s^Vj)49{l|$HiPjJTIb`K2&zR^*Dmqt$lK-&|X zr5y+O*4i{o&1-!0LDNGspozDMnDhjS;Cz*E+U=ItXCI=+GPmc(Z&JxDF^h1fBDA;c zOz?Ttgx(tCAC#P49qrf;;yLITKvM_SUgjDg~Wg zZ_GBasu7d@9b`n^LBKZXVj6~xXe7ZE1CUn;7RA2jq3xUTE=BZCM6X2jM&!Q`Wji6+ YO1%m@hiNmP#^KK?fv&E#8~Ow90!C8humAu6 literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index 6d04597d8..ebbcad7c5 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -417,5 +417,12 @@ "rounds": 1, "link": true, "type": "eq" + }, + { "id": "zerowidthline", + "file": "pdfs/zerowidthline.pdf", + "md5": "295d26e61a85635433f8e4b768953f60", + "rounds": 1, + "link": false, + "type": "eq" } ]