Merge pull request #8542 from Rob--W/svg-clipping

Move svg:clipPath generation from clip to endPath
This commit is contained in:
Tim van der Meij 2017-06-22 23:48:06 +02:00 committed by GitHub
commit c6ee05f7e5
4 changed files with 59 additions and 5 deletions

View File

@ -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');

View File

@ -90,6 +90,7 @@
!issue3879r.pdf
!issue5686.pdf
!issue3928.pdf
!clippath.pdf
!close-path-bug.pdf
!issue6019.pdf
!issue6621.pdf

37
test/pdfs/clippath.pdf Normal file
View File

@ -0,0 +1,37 @@
%PDF-1.1
1 0 obj
<</Type/Catalog/Pages 2 0 R>>
endobj
2 0 obj
<</Type/Pages/Count 1/Kids[3 0 R]/MediaBox [0 0 200 100]>>
endobj
3 0 obj
<</Type/Page/Parent 2 0 R/Contents 4 0 R>>
endobj
4 0 obj
<</Length 65>>
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
<</Root 1 0 R/Size 5>>
startxref
299
%%EOF

View File

@ -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",