diff --git a/src/display/svg.js b/src/display/svg.js index 2aa214824..0430c6650 100644 --- a/src/display/svg.js +++ b/src/display/svg.js @@ -361,6 +361,7 @@ SVGGraphics = (function SVGGraphicsClosure() { this.extraStack = []; this.commonObjs = commonObjs; this.objs = objs; + this.pendingClip = null; this.pendingEOFill = false; this.embedFonts = false; @@ -389,6 +390,7 @@ SVGGraphics = (function SVGGraphicsClosure() { this.transformMatrix = this.transformStack.pop(); this.current = this.extraStack.pop(); + this.pendingClip = null; this.tgrp = null; }, @@ -894,9 +896,10 @@ SVGGraphics = (function SVGGraphicsClosure() { current.setCurrentPoint(x, y); }, - endPath: function SVGGraphics_endPath() {}, - - clip: function SVGGraphics_clip(type) { + endPath: function SVGGraphics_endPath() { + if (!this.pendingClip) { + return; + } var current = this.current; // Add current path to clipping path var clipId = 'clippath' + clipCount; @@ -905,17 +908,18 @@ SVGGraphics = (function SVGGraphicsClosure() { clipPath.setAttributeNS(null, 'id', clipId); clipPath.setAttributeNS(null, 'transform', pm(this.transformMatrix)); var clipElement = current.element.cloneNode(); - if (type === 'evenodd') { + if (this.pendingClip === 'evenodd') { clipElement.setAttributeNS(null, 'clip-rule', 'evenodd'); } else { clipElement.setAttributeNS(null, 'clip-rule', 'nonzero'); } + this.pendingClip = null; clipPath.appendChild(clipElement); this.defs.appendChild(clipPath); if (current.activeClipUrl) { // The previous clipping group content can go out of order -- resetting - // cached clipGroup's. + // cached clipGroups. current.clipGroup = null; this.extraStack.forEach(function (prev) { prev.clipGroup = null; @@ -926,6 +930,10 @@ SVGGraphics = (function SVGGraphicsClosure() { this.tgrp = null; }, + clip: function SVGGraphics_clip(type) { + this.pendingClip = type; + }, + closePath: function SVGGraphics_closePath() { var current = this.current; var d = current.path.getAttributeNS(null, 'd'); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index abaf1da18..774e4d31a 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -90,6 +90,7 @@ !issue3879r.pdf !issue5686.pdf !issue3928.pdf +!clippath.pdf !close-path-bug.pdf !issue6019.pdf !issue6621.pdf diff --git a/test/pdfs/clippath.pdf b/test/pdfs/clippath.pdf new file mode 100644 index 000000000..03d5316b7 --- /dev/null +++ b/test/pdfs/clippath.pdf @@ -0,0 +1,37 @@ +%PDF-1.1 +1 0 obj +<> +endobj +2 0 obj +<> +endobj +3 0 obj +<> +endobj +4 0 obj +<> +stream +W +40 20 m +160 20 l +160 80 l +40 80 l +h +n +0 0 0 sc +0 0 200 100 re +f +endstream +endobj +xref +0 5 +0000000000 65535 f +0000000009 00000 n +0000000054 00000 n +0000000128 00000 n +0000000186 00000 n +trailer +<> +startxref +299 +%%EOF diff --git a/test/test_manifest.json b/test/test_manifest.json index 2241eae98..4f2f176a9 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -2776,6 +2776,14 @@ "type": "eq", "about": "CFF font that is drawn with clipping." }, + { "id": "clippath", + "file": "pdfs/clippath.pdf", + "md5": "7ab95c0f106dccd90d6569f241fe8771", + "rounds": 1, + "link": false, + "type": "eq", + "about": "Clipping before a path exists, followed by adding a path and then drawing a rectangle." + }, { "id": "annotation-tx", "file": "pdfs/annotation-tx.pdf", "md5": "56321ea830be9c4f8437ca17ac535b2d",