Skip to content

Commit

Permalink
Correctly render the glyph outline when it has a stroke pattern
Browse files Browse the repository at this point in the history
It fixes #19360.

Each glyph in the test case has a fill and a stroke pattern, so the current transform used
to scale the glyph outline must be the same.
In setting the stroke color to green, I noticed that the last outline contains some non-closed
subpaths, so when generating the glyph outline, every time we 'moveTo', we close the previous
subpath.
  • Loading branch information
calixteman committed Jan 21, 2025
1 parent 23dc3ff commit be5722f
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 3 deletions.
12 changes: 12 additions & 0 deletions src/core/font_renderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,11 @@ function lookupCmap(ranges, unicode) {

function compileGlyf(code, cmds, font) {
function moveTo(x, y) {
if (firstPoint) {
// Close the current subpath in adding a straight line to the first point.
cmds.add("L", firstPoint);
}
firstPoint = [x, y];
cmds.add("M", [x, y]);
}
function lineTo(x, y) {
Expand All @@ -182,6 +187,7 @@ function compileGlyf(code, cmds, font) {
let i = 0;
const numberOfContours = getInt16(code, i);
let flags;
let firstPoint = null;
let x = 0,
y = 0;
i += 10;
Expand Down Expand Up @@ -350,6 +356,11 @@ function compileGlyf(code, cmds, font) {

function compileCharString(charStringCode, cmds, font, glyphId) {
function moveTo(x, y) {
if (firstPoint) {
// Close the current subpath in adding a straight line to the first point.
cmds.add("L", firstPoint);
}
firstPoint = [x, y];
cmds.add("M", [x, y]);
}
function lineTo(x, y) {
Expand All @@ -363,6 +374,7 @@ function compileCharString(charStringCode, cmds, font, glyphId) {
let x = 0,
y = 0;
let stems = 0;
let firstPoint = null;

function parse(code) {
let i = 0;
Expand Down
7 changes: 4 additions & 3 deletions src/display/canvas.js
Original file line number Diff line number Diff line change
Expand Up @@ -2043,12 +2043,13 @@ class CanvasGraphics {
ctx.save();
ctx.translate(x, y);
ctx.scale(fontSize, -fontSize);
let currentTransform;
if (
fillStrokeMode === TextRenderingMode.FILL ||
fillStrokeMode === TextRenderingMode.FILL_STROKE
) {
if (patternFillTransform) {
const currentTransform = ctx.getTransform();
currentTransform = ctx.getTransform();
ctx.setTransform(...patternFillTransform);
ctx.fill(
this.#getScaledPath(path, currentTransform, patternFillTransform)
Expand All @@ -2061,14 +2062,14 @@ class CanvasGraphics {
fillStrokeMode === TextRenderingMode.STROKE ||
fillStrokeMode === TextRenderingMode.FILL_STROKE
) {
ctx.lineWidth /= fontSize;
if (patternStrokeTransform) {
const currentTransform = ctx.getTransform();
currentTransform ||= ctx.getTransform();
ctx.setTransform(...patternStrokeTransform);
ctx.stroke(
this.#getScaledPath(path, currentTransform, patternStrokeTransform)
);
} else {
ctx.lineWidth /= fontSize;
ctx.stroke(path);
}
}
Expand Down
1 change: 1 addition & 0 deletions test/pdfs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -696,3 +696,4 @@
!issue18911.pdf
!issue19207.pdf
!issue19239.pdf
!issue19360.pdf
Binary file added test/pdfs/issue19360.pdf
Binary file not shown.
7 changes: 7 additions & 0 deletions test/test_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -11286,5 +11286,12 @@
"firstPage": 2,
"lastPage": 2,
"type": "eq"
},
{
"id": "issue19360",
"file": "pdfs/issue19360.pdf",
"md5": "b2de376f7e96fa2b6afc00dac016c40a",
"rounds": 1,
"type": "eq"
}
]

0 comments on commit be5722f

Please sign in to comment.