From 5a2899c57ecca83454b9aa1c7a4a7ba375a990bb Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 24 May 2022 12:12:53 +0200 Subject: [PATCH] Skip bogus `d1` operators in Type3-glyphs (issue 14953) In the `src/display/canvas.js` code the `d1` operator will be used to set the clipping region, and it obviously cannot be empty since that prevents the Type3-glyph from rendering. Also, the patch removes an outdated comment; refer to PR 12718. --- src/core/evaluator.js | 17 +++++++++++++---- src/display/canvas.js | 2 -- test/pdfs/.gitignore | 1 + test/pdfs/issue14953.pdf | Bin 0 -> 5808 bytes test/test_manifest.json | 6 ++++++ 5 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 test/pdfs/issue14953.pdf diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 45cd1a070..e92e243f8 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -4463,21 +4463,30 @@ class TranslatedFont { "Type3 glyph shall start with the d1 operator." ); } - if (isEmptyBBox) { + const charBBox = Util.normalizeRect(operatorList.argsArray[0].slice(2)), + width = charBBox[2] - charBBox[0], + height = charBBox[3] - charBBox[1]; + + if (width === 0 || height === 0) { + // Skip the d1 operator when its bounds are bogus (fixes issue14953.pdf). + operatorList.fnArray.splice(0, 1); + operatorList.argsArray.splice(0, 1); + } else if (isEmptyBBox) { if (!this._bbox) { this._bbox = [Infinity, Infinity, -Infinity, -Infinity]; } - const charBBox = Util.normalizeRect(operatorList.argsArray[0].slice(2)); - this._bbox[0] = Math.min(this._bbox[0], charBBox[0]); this._bbox[1] = Math.min(this._bbox[1], charBBox[1]); this._bbox[2] = Math.max(this._bbox[2], charBBox[2]); this._bbox[3] = Math.max(this._bbox[3], charBBox[3]); } - let i = 1, + + let i = 0, ii = operatorList.length; while (i < ii) { switch (operatorList.fnArray[i]) { + case OPS.setCharWidthAndBounds: + break; // Handled above. case OPS.setStrokeColorSpace: case OPS.setFillColorSpace: case OPS.setStrokeColor: diff --git a/src/display/canvas.js b/src/display/canvas.js index 469cc588b..886ac2ec5 100644 --- a/src/display/canvas.js +++ b/src/display/canvas.js @@ -2652,8 +2652,6 @@ class CanvasGraphics { } setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) { - // TODO According to the spec we're also suppose to ignore any operators - // that set color or include images while processing this type3 font. this.ctx.rect(llx, lly, urx - llx, ury - lly); this.ctx.clip(); this.endPath(); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index e11b5f45d..f78a3384c 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -49,6 +49,7 @@ !issue7426.pdf !issue7439.pdf !issue7847_radial.pdf +!issue14953.pdf !issue7446.pdf !issue7492.pdf !issue7544.pdf diff --git a/test/pdfs/issue14953.pdf b/test/pdfs/issue14953.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0573dbec8bc711b4a2c615ec5e6ce69e01c6548d GIT binary patch literal 5808 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 literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index b46951ab9..8fd040b75 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -2058,6 +2058,12 @@ "rounds": 1, "type": "eq" }, + { "id": "issue14953", + "file": "pdfs/issue14953.pdf", + "md5": "dd7d6cb92e58d75a0eb8c0476a3bc64a", + "rounds": 1, + "type": "eq" + }, { "id": "extgstate-text", "file": "pdfs/extgstate.pdf", "md5": "001bb4ec04463a01d93aad748361f049",