Skip to content

Commit 659e86b

Browse files
committed
Fix incorrect lineJoin and pathfactor in get_drawings()
Bug 1: lineJoin was multiplied by pathfactor. stroke->linejoin is an enum (0=Miter, 1=Round, 2=Bevel) and should not be scaled. Note that lineCap is already correctly handled as plain integers without pathfactor multiplication. Bug 2: pathfactor calculation only handled some transform patterns correctly. Use sqrt(abs(a*d - b*c)) so uniform scaling with arbitrary rotation is handled correctly; for non-uniform scaling this yields the geometric mean of the scale factors. Fixed in: - src/extra.i (rebased build) - src/__init__.py (Python fallback)
1 parent 17916d6 commit 659e86b

File tree

2 files changed

+4
-15
lines changed

2 files changed

+4
-15
lines changed

src/__init__.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23194,11 +23194,7 @@ def jm_lineart_stroke_path( dev, ctx, path, stroke, ctm, colorspace, color, alph
2319423194
#log(f'{dev.pathdict=} {dev.clips=}')
2319523195
try:
2319623196
assert isinstance( ctm, mupdf.fz_matrix)
23197-
dev.pathfactor = 1
23198-
if ctm.a != 0 and abs(ctm.a) == abs(ctm.d):
23199-
dev.pathfactor = abs(ctm.a)
23200-
elif ctm.b != 0 and abs(ctm.b) == abs(ctm.c):
23201-
dev.pathfactor = abs(ctm.b)
23197+
dev.pathfactor = math.sqrt(abs(ctm.a * ctm.d - ctm.b * ctm.c))
2320223198
dev.ctm = mupdf.FzMatrix( ctm) # fz_concat(ctm, dev_ptm);
2320323199
dev.path_type = trace_device_STROKE_PATH
2320423200

@@ -23214,7 +23210,7 @@ def jm_lineart_stroke_path( dev, ctx, path, stroke, ctm, colorspace, color, alph
2321423210
stroke.dash_cap,
2321523211
stroke.end_cap,
2321623212
)
23217-
dev.pathdict[ 'lineJoin'] = dev.pathfactor * stroke.linejoin
23213+
dev.pathdict[ 'lineJoin'] = float(stroke.linejoin)
2321823214
if 'closePath' not in dev.pathdict:
2321923215
#log('setting dev.pathdict["closePath"] to false')
2322023216
dev.pathdict['closePath'] = False

src/extra.i

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2719,14 +2719,7 @@ jm_lineart_stroke_path(fz_context *ctx, fz_device *dev_, const fz_path *path,
27192719
jm_lineart_device *dev = (jm_lineart_device *)dev_;
27202720
//printf("extra.jm_lineart_stroke_path(): dev->seqno=%zi\n", dev->seqno);
27212721
int i;
2722-
dev->pathfactor = 1;
2723-
if (ctm.a != 0 && fz_abs(ctm.a) == fz_abs(ctm.d)) {
2724-
dev->pathfactor = fz_abs(ctm.a);
2725-
} else {
2726-
if (ctm.b != 0 && fz_abs(ctm.b) == fz_abs(ctm.c)) {
2727-
dev->pathfactor = fz_abs(ctm.b);
2728-
}
2729-
}
2722+
dev->pathfactor = sqrtf(fabsf(ctm.a * ctm.d - ctm.b * ctm.c));
27302723
dev->ctm = ctm; // fz_concat(ctm, trace_device_ptm);
27312724
dev->path_type = STROKE_PATH;
27322725

@@ -2739,7 +2732,7 @@ jm_lineart_stroke_path(fz_context *ctx, fz_device *dev_, const fz_path *path,
27392732
DICT_SETITEMSTR_DROP(dev->pathdict, "color", jm_lineart_color(colorspace, color));
27402733
DICT_SETITEM_DROP(dev->pathdict, dictkey_width, Py_BuildValue("f", dev->pathfactor * stroke->linewidth));
27412734
DICT_SETITEMSTR_DROP(dev->pathdict, "lineCap", Py_BuildValue("iii", stroke->start_cap, stroke->dash_cap, stroke->end_cap));
2742-
DICT_SETITEMSTR_DROP(dev->pathdict, "lineJoin", Py_BuildValue("f", dev->pathfactor * stroke->linejoin));
2735+
DICT_SETITEMSTR_DROP(dev->pathdict, "lineJoin", Py_BuildValue("f", (float)stroke->linejoin));
27432736
if (!PyDict_GetItemString(dev->pathdict, "closePath")) {
27442737
DICT_SETITEMSTR_DROP(dev->pathdict, "closePath", JM_BOOL(0));
27452738
}

0 commit comments

Comments
 (0)