Skip to content

Commit

Permalink
Use a transparent color when setting fill/stroke colors in a pattern …
Browse files Browse the repository at this point in the history
…context but with no colorspace
  • Loading branch information
calixteman committed Jul 20, 2024
1 parent 5b0e15a commit af37162
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 13 deletions.
41 changes: 34 additions & 7 deletions src/core/evaluator.js
Original file line number Diff line number Diff line change
Expand Up @@ -2007,9 +2007,8 @@ class PartialEvaluator {
localColorSpaceCache,
})
.then(function (colorSpace) {
if (colorSpace) {
stateManager.state.fillColorSpace = colorSpace;
}
stateManager.state.fillColorSpace =
colorSpace || ColorSpace.singletons.gray;
})
);
return;
Expand Down Expand Up @@ -2079,7 +2078,12 @@ class PartialEvaluator {
args = ColorSpace.singletons.rgb.getRgb(args, 0);
break;
case OPS.setFillColorN:
cs = stateManager.state.fillColorSpace;
cs = stateManager.state.patternFillColorSpace;
if (!cs) {
args = [];
fn = OPS.setFillTransparent;
break;
}
if (cs.name === "Pattern") {
next(
self.handleColorN(
Expand All @@ -2101,7 +2105,12 @@ class PartialEvaluator {
fn = OPS.setFillRGBColor;
break;
case OPS.setStrokeColorN:
cs = stateManager.state.strokeColorSpace;
cs = stateManager.state.patternStrokeColorSpace;
if (!cs) {
args = [];
fn = OPS.setStrokeTransparent;
break;
}
if (cs.name === "Pattern") {
next(
self.handleColorN(
Expand Down Expand Up @@ -4873,8 +4882,26 @@ class EvalState {
this.ctm = new Float32Array(IDENTITY_MATRIX);
this.font = null;
this.textRenderingMode = TextRenderingMode.FILL;
this.fillColorSpace = ColorSpace.singletons.gray;
this.strokeColorSpace = ColorSpace.singletons.gray;
this._fillColorSpace = ColorSpace.singletons.gray;
this._strokeColorSpace = ColorSpace.singletons.gray;
this.patternFillColorSpace = null;
this.patternStrokeColorSpace = null;
}

get fillColorSpace() {
return this._fillColorSpace;
}

set fillColorSpace(colorSpace) {
this._fillColorSpace = this.patternFillColorSpace = colorSpace;
}

get strokeColorSpace() {
return this._strokeColorSpace;
}

set strokeColorSpace(colorSpace) {
this._strokeColorSpace = this.patternStrokeColorSpace = colorSpace;
}

clone() {
Expand Down
21 changes: 15 additions & 6 deletions src/display/canvas.js
Original file line number Diff line number Diff line change
Expand Up @@ -2386,15 +2386,24 @@ class CanvasGraphics {
}

setStrokeRGBColor(r, g, b) {
const color = Util.makeHexColor(r, g, b);
this.ctx.strokeStyle = color;
this.current.strokeColor = color;
this.ctx.strokeStyle = this.current.strokeColor = Util.makeHexColor(
r,
g,
b
);
}

setStrokeTransparent() {
this.ctx.strokeStyle = this.current.strokeColor = "transparent";
}

setFillRGBColor(r, g, b) {
const color = Util.makeHexColor(r, g, b);
this.ctx.fillStyle = color;
this.current.fillColor = color;
this.ctx.fillStyle = this.current.fillColor = Util.makeHexColor(r, g, b);
this.current.patternFill = false;
}

setFillTransparent() {
this.ctx.fillStyle = this.current.fillColor = "transparent";
this.current.patternFill = false;
}

Expand Down
2 changes: 2 additions & 0 deletions src/shared/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,8 @@ const OPS = {
paintImageMaskXObjectRepeat: 89,
paintSolidColorImageMask: 90,
constructPath: 91,
setStrokeTransparent: 92,
setFillTransparent: 93,
};

const PasswordResponses = {
Expand Down
1 change: 1 addition & 0 deletions test/pdfs/issue18466.pdf.link
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
https://github.com/user-attachments/files/16319966/image2.pdf
8 changes: 8 additions & 0 deletions test/test_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -10170,5 +10170,13 @@
"firstPage": 1,
"lastPage": 1,
"type": "eq"
},
{
"id": "issue18466",
"file": "pdfs/issue18466.pdf",
"md5": "251197bf19b237e084551d19f885c6b6",
"rounds": 1,
"link": true,
"type": "eq"
}
]

0 comments on commit af37162

Please sign in to comment.