Skip to content

Commit a45f961

Browse files
Merge pull request #19751 from Snuffleupagus/applyTransform-in-place
Change `Util.applyTransform` to use the point-argument as an in/out parameter
2 parents b743737 + 4262603 commit a45f961

5 files changed

Lines changed: 42 additions & 30 deletions

File tree

src/core/annotation.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,8 +1320,10 @@ class Annotation {
13201320
const transform = getTransformMatrix(rect, bbox, matrix);
13211321
transform[4] -= rect[0];
13221322
transform[5] -= rect[1];
1323-
coords = Util.applyTransform(coords, transform);
1324-
return Util.applyTransform(coords, matrix);
1323+
const p = coords.slice();
1324+
Util.applyTransform(p, transform);
1325+
Util.applyTransform(p, matrix);
1326+
return p;
13251327
}
13261328

13271329
/**

src/core/operator_list.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -524,11 +524,11 @@ addState(
524524
switch (buffer[k++]) {
525525
case DrawOPS.moveTo:
526526
case DrawOPS.lineTo:
527-
Util.applyTransformInPlace(buffer.subarray(k), transform);
527+
Util.applyTransform(buffer.subarray(k), transform);
528528
k += 2;
529529
break;
530530
case DrawOPS.curveTo:
531-
Util.applyTransformToBezierInPlace(buffer.subarray(k), transform);
531+
Util.applyTransformToBezier(buffer.subarray(k), transform);
532532
k += 6;
533533
break;
534534
}

src/display/canvas.js

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -340,10 +340,14 @@ class CanvasExtraState {
340340
}
341341

342342
updateRectMinMax(transform, rect) {
343-
const p1 = Util.applyTransform(rect, transform);
344-
const p2 = Util.applyTransform(rect.slice(2), transform);
345-
const p3 = Util.applyTransform([rect[0], rect[3]], transform);
346-
const p4 = Util.applyTransform([rect[2], rect[1]], transform);
343+
const p1 = [rect[0], rect[1]];
344+
Util.applyTransform(p1, transform);
345+
const p2 = [rect[2], rect[3]];
346+
Util.applyTransform(p2, transform);
347+
const p3 = [rect[0], rect[3]];
348+
Util.applyTransform(p3, transform);
349+
const p4 = [rect[2], rect[1]];
350+
Util.applyTransform(p4, transform);
347351

348352
this.minX = Math.min(this.minX, p1[0], p2[0], p3[0], p4[0]);
349353
this.minY = Math.min(this.minY, p1[1], p2[1], p3[1], p4[1]);
@@ -2109,8 +2113,9 @@ class CanvasGraphics {
21092113
this.restore();
21102114
}
21112115

2112-
const transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
2113-
width = transformed[0] * fontSize + spacing;
2116+
const p = [glyph.width, 0];
2117+
Util.applyTransform(p, fontMatrix);
2118+
width = p[0] * fontSize + spacing;
21142119

21152120
ctx.translate(width, 0);
21162121
current.x += width * textHScale;
@@ -2587,8 +2592,9 @@ class CanvasGraphics {
25872592
positions[i + 1],
25882593
]);
25892594

2590-
const [x, y] = Util.applyTransform([0, 0], trans);
2591-
ctx.drawImage(mask.canvas, x, y);
2595+
// Here we want to apply the transform at the origin,
2596+
// hence no additional computation is necessary.
2597+
ctx.drawImage(mask.canvas, trans[4], trans[5]);
25922598
}
25932599
ctx.restore();
25942600
this.compose();

src/display/display_utils.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,9 @@ class PageViewport {
257257
* @see {@link convertToViewportRectangle}
258258
*/
259259
convertToViewportPoint(x, y) {
260-
return Util.applyTransform([x, y], this.transform);
260+
const p = [x, y];
261+
Util.applyTransform(p, this.transform);
262+
return p;
261263
}
262264

263265
/**
@@ -268,8 +270,10 @@ class PageViewport {
268270
* @see {@link convertToViewportPoint}
269271
*/
270272
convertToViewportRectangle(rect) {
271-
const topLeft = Util.applyTransform([rect[0], rect[1]], this.transform);
272-
const bottomRight = Util.applyTransform([rect[2], rect[3]], this.transform);
273+
const topLeft = [rect[0], rect[1]];
274+
Util.applyTransform(topLeft, this.transform);
275+
const bottomRight = [rect[2], rect[3]];
276+
Util.applyTransform(bottomRight, this.transform);
273277
return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]];
274278
}
275279

@@ -283,7 +287,9 @@ class PageViewport {
283287
* @see {@link convertToViewportPoint}
284288
*/
285289
convertToPdfPoint(x, y) {
286-
return Util.applyInverseTransform([x, y], this.transform);
290+
const p = [x, y];
291+
Util.applyInverseTransform(p, this.transform);
292+
return p;
287293
}
288294
}
289295

src/shared/util.js

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -742,19 +742,13 @@ class Util {
742742

743743
// For 2d affine transforms
744744
static applyTransform(p, m) {
745-
const xt = p[0] * m[0] + p[1] * m[2] + m[4];
746-
const yt = p[0] * m[1] + p[1] * m[3] + m[5];
747-
return [xt, yt];
748-
}
749-
750-
static applyTransformInPlace(p, m) {
751745
const [p0, p1] = p;
752746
p[0] = p0 * m[0] + p1 * m[2] + m[4];
753747
p[1] = p0 * m[1] + p1 * m[3] + m[5];
754748
}
755749

756750
// For 2d affine transforms
757-
static applyTransformToBezierInPlace(p, [m0, m1, m2, m3, m4, m5]) {
751+
static applyTransformToBezier(p, [m0, m1, m2, m3, m4, m5]) {
758752
for (let i = 0; i < 6; i += 2) {
759753
const pI = p[i];
760754
const pI1 = p[i + 1];
@@ -764,19 +758,23 @@ class Util {
764758
}
765759

766760
static applyInverseTransform(p, m) {
761+
const [p0, p1] = p;
767762
const d = m[0] * m[3] - m[1] * m[2];
768-
const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
769-
const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
770-
return [xt, yt];
763+
p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
764+
p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
771765
}
772766

773767
// Applies the transform to the rectangle and finds the minimum axially
774768
// aligned bounding box.
775769
static getAxialAlignedBoundingBox(r, m) {
776-
const p1 = this.applyTransform(r, m);
777-
const p2 = this.applyTransform(r.slice(2, 4), m);
778-
const p3 = this.applyTransform([r[0], r[3]], m);
779-
const p4 = this.applyTransform([r[2], r[1]], m);
770+
const p1 = [r[0], r[1]];
771+
Util.applyTransform(p1, m);
772+
const p2 = [r[2], r[3]];
773+
Util.applyTransform(p2, m);
774+
const p3 = [r[0], r[3]];
775+
Util.applyTransform(p3, m);
776+
const p4 = [r[2], r[1]];
777+
Util.applyTransform(p4, m);
780778
return [
781779
Math.min(p1[0], p2[0], p3[0], p4[0]),
782780
Math.min(p1[1], p2[1], p3[1], p4[1]),

0 commit comments

Comments
 (0)