Merge pull request #15281 from Snuffleupagus/getTransform
Remove `mozCurrentTransform`/`mozCurrentTransformInverse` usage
This commit is contained in:
commit
d55903764e
@ -26,7 +26,12 @@ import {
|
||||
Util,
|
||||
warn,
|
||||
} from "../shared/util.js";
|
||||
import { getRGB, PixelsPerInch } from "./display_utils.js";
|
||||
import {
|
||||
getCurrentTransform,
|
||||
getCurrentTransformInverse,
|
||||
getRGB,
|
||||
PixelsPerInch,
|
||||
} from "./display_utils.js";
|
||||
import {
|
||||
getShadingPattern,
|
||||
PathType,
|
||||
@ -54,13 +59,6 @@ const MAX_SIZE_TO_COMPILE = 1000;
|
||||
|
||||
const FULL_CHUNK_HEIGHT = 16;
|
||||
|
||||
// Because of https://bugs.chromium.org/p/chromium/issues/detail?id=1170396
|
||||
// some curves aren't rendered correctly.
|
||||
// Multiplying lineWidth by this factor should help to have "correct"
|
||||
// rendering with no artifacts.
|
||||
// Once the bug is fixed upstream, we can remove this constant and its use.
|
||||
const LINEWIDTH_SCALE_FACTOR = 1.000001;
|
||||
|
||||
/**
|
||||
* Overrides certain methods on a 2d ctx so that when they are called they
|
||||
* will also call the same method on the destCtx. The methods that are
|
||||
@ -191,177 +189,21 @@ function mirrorContextOperations(ctx, destCtx) {
|
||||
};
|
||||
}
|
||||
|
||||
function addContextCurrentTransform(ctx) {
|
||||
if (ctx._transformStack) {
|
||||
// Reset the transform stack.
|
||||
ctx._transformStack = [];
|
||||
}
|
||||
// If the context doesn't expose a `mozCurrentTransform`, add a JS based one.
|
||||
if (ctx.mozCurrentTransform) {
|
||||
return;
|
||||
}
|
||||
ctx._originalSave = ctx.save;
|
||||
ctx._originalRestore = ctx.restore;
|
||||
ctx._originalRotate = ctx.rotate;
|
||||
ctx._originalScale = ctx.scale;
|
||||
ctx._originalTranslate = ctx.translate;
|
||||
ctx._originalTransform = ctx.transform;
|
||||
ctx._originalSetTransform = ctx.setTransform;
|
||||
ctx._originalResetTransform = ctx.resetTransform;
|
||||
|
||||
ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];
|
||||
ctx._transformStack = [];
|
||||
|
||||
try {
|
||||
// The call to getOwnPropertyDescriptor throws an exception in Node.js:
|
||||
// "TypeError: Method lineWidth called on incompatible receiver
|
||||
// #<CanvasRenderingContext2D>".
|
||||
const desc = Object.getOwnPropertyDescriptor(
|
||||
Object.getPrototypeOf(ctx),
|
||||
"lineWidth"
|
||||
);
|
||||
|
||||
ctx._setLineWidth = desc.set;
|
||||
ctx._getLineWidth = desc.get;
|
||||
|
||||
Object.defineProperty(ctx, "lineWidth", {
|
||||
set: function setLineWidth(width) {
|
||||
this._setLineWidth(width * LINEWIDTH_SCALE_FACTOR);
|
||||
},
|
||||
get: function getLineWidth() {
|
||||
return this._getLineWidth();
|
||||
},
|
||||
});
|
||||
} catch (_) {}
|
||||
|
||||
Object.defineProperty(ctx, "mozCurrentTransform", {
|
||||
get: function getCurrentTransform() {
|
||||
return this._transformMatrix;
|
||||
},
|
||||
});
|
||||
|
||||
Object.defineProperty(ctx, "mozCurrentTransformInverse", {
|
||||
get: function getCurrentTransformInverse() {
|
||||
// Calculation done using WolframAlpha:
|
||||
// http://www.wolframalpha.com/input/?
|
||||
// i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
|
||||
|
||||
const [a, b, c, d, e, f] = this._transformMatrix;
|
||||
const ad_bc = a * d - b * c;
|
||||
const bc_ad = b * c - a * d;
|
||||
|
||||
return [
|
||||
d / ad_bc,
|
||||
b / bc_ad,
|
||||
c / bc_ad,
|
||||
a / ad_bc,
|
||||
(d * e - c * f) / bc_ad,
|
||||
(b * e - a * f) / ad_bc,
|
||||
];
|
||||
},
|
||||
});
|
||||
|
||||
ctx.save = function ctxSave() {
|
||||
const old = this._transformMatrix;
|
||||
this._transformStack.push(old);
|
||||
this._transformMatrix = old.slice(0, 6);
|
||||
|
||||
this._originalSave();
|
||||
};
|
||||
|
||||
ctx.restore = function ctxRestore() {
|
||||
if (this._transformStack.length === 0) {
|
||||
warn("Tried to restore a ctx when the stack was already empty.");
|
||||
}
|
||||
const prev = this._transformStack.pop();
|
||||
if (prev) {
|
||||
this._transformMatrix = prev;
|
||||
this._originalRestore();
|
||||
}
|
||||
};
|
||||
|
||||
ctx.translate = function ctxTranslate(x, y) {
|
||||
const m = this._transformMatrix;
|
||||
m[4] = m[0] * x + m[2] * y + m[4];
|
||||
m[5] = m[1] * x + m[3] * y + m[5];
|
||||
|
||||
this._originalTranslate(x, y);
|
||||
};
|
||||
|
||||
ctx.scale = function ctxScale(x, y) {
|
||||
const m = this._transformMatrix;
|
||||
m[0] *= x;
|
||||
m[1] *= x;
|
||||
m[2] *= y;
|
||||
m[3] *= y;
|
||||
|
||||
this._originalScale(x, y);
|
||||
};
|
||||
|
||||
ctx.transform = function ctxTransform(a, b, c, d, e, f) {
|
||||
const m = this._transformMatrix;
|
||||
this._transformMatrix = [
|
||||
m[0] * a + m[2] * b,
|
||||
m[1] * a + m[3] * b,
|
||||
m[0] * c + m[2] * d,
|
||||
m[1] * c + m[3] * d,
|
||||
m[0] * e + m[2] * f + m[4],
|
||||
m[1] * e + m[3] * f + m[5],
|
||||
];
|
||||
|
||||
ctx._originalTransform(a, b, c, d, e, f);
|
||||
};
|
||||
|
||||
ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {
|
||||
this._transformMatrix = [a, b, c, d, e, f];
|
||||
|
||||
ctx._originalSetTransform(a, b, c, d, e, f);
|
||||
};
|
||||
|
||||
ctx.resetTransform = function ctxResetTransform() {
|
||||
this._transformMatrix = [1, 0, 0, 1, 0, 0];
|
||||
|
||||
ctx._originalResetTransform();
|
||||
};
|
||||
|
||||
ctx.rotate = function ctxRotate(angle) {
|
||||
const cosValue = Math.cos(angle);
|
||||
const sinValue = Math.sin(angle);
|
||||
|
||||
const m = this._transformMatrix;
|
||||
this._transformMatrix = [
|
||||
m[0] * cosValue + m[2] * sinValue,
|
||||
m[1] * cosValue + m[3] * sinValue,
|
||||
m[0] * -sinValue + m[2] * cosValue,
|
||||
m[1] * -sinValue + m[3] * cosValue,
|
||||
m[4],
|
||||
m[5],
|
||||
];
|
||||
|
||||
this._originalRotate(angle);
|
||||
};
|
||||
}
|
||||
|
||||
class CachedCanvases {
|
||||
constructor(canvasFactory) {
|
||||
this.canvasFactory = canvasFactory;
|
||||
this.cache = Object.create(null);
|
||||
}
|
||||
|
||||
getCanvas(id, width, height, trackTransform) {
|
||||
getCanvas(id, width, height) {
|
||||
let canvasEntry;
|
||||
if (this.cache[id] !== undefined) {
|
||||
canvasEntry = this.cache[id];
|
||||
this.canvasFactory.reset(canvasEntry, width, height);
|
||||
// reset canvas transform for emulated mozCurrentTransform, if needed
|
||||
canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);
|
||||
} else {
|
||||
canvasEntry = this.canvasFactory.create(width, height);
|
||||
this.cache[id] = canvasEntry;
|
||||
}
|
||||
if (trackTransform) {
|
||||
addContextCurrentTransform(canvasEntry.context);
|
||||
}
|
||||
return canvasEntry;
|
||||
}
|
||||
|
||||
@ -390,7 +232,7 @@ function drawImageAtIntegerCoords(
|
||||
destW,
|
||||
destH
|
||||
) {
|
||||
const [a, b, c, d, tx, ty] = ctx.mozCurrentTransform;
|
||||
const [a, b, c, d, tx, ty] = getCurrentTransform(ctx);
|
||||
if (b === 0 && c === 0) {
|
||||
// top-left corner is at (X, Y) and
|
||||
// bottom-right one is at (X + width, Y + height).
|
||||
@ -1250,11 +1092,7 @@ class CanvasGraphics {
|
||||
this.outputScaleY = 1;
|
||||
this.backgroundColor = pageColors?.background || null;
|
||||
this.foregroundColor = pageColors?.foreground || null;
|
||||
if (canvasCtx) {
|
||||
// NOTE: if mozCurrentTransform is polyfilled, then the current state of
|
||||
// the transformation must already be set in canvasCtx._transformMatrix.
|
||||
addContextCurrentTransform(canvasCtx);
|
||||
}
|
||||
|
||||
this._cachedScaleForStroking = null;
|
||||
this._cachedGetSinglePixelWidth = null;
|
||||
this._cachedBitmapsMap = new Map();
|
||||
@ -1350,8 +1188,7 @@ class CanvasGraphics {
|
||||
const transparentCanvas = this.cachedCanvases.getCanvas(
|
||||
"transparent",
|
||||
width,
|
||||
height,
|
||||
/* trackTransform */ true
|
||||
height
|
||||
);
|
||||
this.compositeCtx = this.ctx;
|
||||
this.transparentCanvas = transparentCanvas.canvas;
|
||||
@ -1359,7 +1196,7 @@ class CanvasGraphics {
|
||||
this.ctx.save();
|
||||
// The transform can be applied before rendering, transferring it to
|
||||
// the new canvas.
|
||||
this.ctx.transform(...this.compositeCtx.mozCurrentTransform);
|
||||
this.ctx.transform(...getCurrentTransform(this.compositeCtx));
|
||||
}
|
||||
|
||||
this.ctx.save();
|
||||
@ -1372,7 +1209,7 @@ class CanvasGraphics {
|
||||
this.ctx.transform(...viewport.transform);
|
||||
this.viewportScale = viewport.scale;
|
||||
|
||||
this.baseTransform = this.ctx.mozCurrentTransform.slice();
|
||||
this.baseTransform = getCurrentTransform(this.ctx);
|
||||
|
||||
if (this.imageLayer) {
|
||||
this.imageLayer.beginLayout();
|
||||
@ -1529,8 +1366,7 @@ class CanvasGraphics {
|
||||
tmpCanvas = this.cachedCanvases.getCanvas(
|
||||
tmpCanvasId,
|
||||
newWidth,
|
||||
newHeight,
|
||||
/* trackTransform */ false
|
||||
newHeight
|
||||
);
|
||||
tmpCtx = tmpCanvas.context;
|
||||
tmpCtx.clearRect(0, 0, newWidth, newHeight);
|
||||
@ -1562,7 +1398,7 @@ class CanvasGraphics {
|
||||
const { width, height } = img;
|
||||
const fillColor = this.current.fillColor;
|
||||
const isPatternFill = this.current.patternFill;
|
||||
const currentTransform = ctx.mozCurrentTransform;
|
||||
const currentTransform = getCurrentTransform(ctx);
|
||||
|
||||
let cache, cacheKey, scaled, maskCanvas;
|
||||
if ((img.bitmap || img.data) && img.count > 1) {
|
||||
@ -1603,12 +1439,7 @@ class CanvasGraphics {
|
||||
}
|
||||
|
||||
if (!scaled) {
|
||||
maskCanvas = this.cachedCanvases.getCanvas(
|
||||
"maskCanvas",
|
||||
width,
|
||||
height,
|
||||
/* trackTransform */ false
|
||||
);
|
||||
maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height);
|
||||
putBinaryImageMask(maskCanvas.context, img);
|
||||
}
|
||||
|
||||
@ -1634,8 +1465,7 @@ class CanvasGraphics {
|
||||
const fillCanvas = this.cachedCanvases.getCanvas(
|
||||
"fillCanvas",
|
||||
drawnWidth,
|
||||
drawnHeight,
|
||||
/* trackTransform */ true
|
||||
drawnHeight
|
||||
);
|
||||
const fillCtx = fillCanvas.context;
|
||||
|
||||
@ -1652,7 +1482,7 @@ class CanvasGraphics {
|
||||
// Pre-scale if needed to improve image smoothing.
|
||||
scaled = this._scaleImage(
|
||||
maskCanvas.canvas,
|
||||
fillCtx.mozCurrentTransformInverse
|
||||
getCurrentTransformInverse(fillCtx)
|
||||
);
|
||||
scaled = scaled.img;
|
||||
if (cache && isPatternFill) {
|
||||
@ -1661,7 +1491,7 @@ class CanvasGraphics {
|
||||
}
|
||||
|
||||
fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(
|
||||
fillCtx.mozCurrentTransform,
|
||||
getCurrentTransform(fillCtx),
|
||||
img.interpolate
|
||||
);
|
||||
|
||||
@ -1679,7 +1509,7 @@ class CanvasGraphics {
|
||||
);
|
||||
fillCtx.globalCompositeOperation = "source-in";
|
||||
|
||||
const inverse = Util.transform(fillCtx.mozCurrentTransformInverse, [
|
||||
const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
@ -1830,13 +1660,12 @@ class CanvasGraphics {
|
||||
const scratchCanvas = this.cachedCanvases.getCanvas(
|
||||
cacheId,
|
||||
drawnWidth,
|
||||
drawnHeight,
|
||||
/* trackTransform */ true
|
||||
drawnHeight
|
||||
);
|
||||
this.suspendedCtx = this.ctx;
|
||||
this.ctx = scratchCanvas.context;
|
||||
const ctx = this.ctx;
|
||||
ctx.setTransform(...this.suspendedCtx.mozCurrentTransform);
|
||||
ctx.setTransform(...getCurrentTransform(this.suspendedCtx));
|
||||
copyCtxState(this.suspendedCtx, ctx);
|
||||
mirrorContextOperations(ctx, this.suspendedCtx);
|
||||
|
||||
@ -1940,7 +1769,7 @@ class CanvasGraphics {
|
||||
let x = current.x,
|
||||
y = current.y;
|
||||
let startX, startY;
|
||||
const currentTransform = ctx.mozCurrentTransform;
|
||||
const currentTransform = getCurrentTransform(ctx);
|
||||
|
||||
// Most of the time the current transform is a scaling matrix
|
||||
// so we don't need to transform points before computing min/max:
|
||||
@ -2096,7 +1925,7 @@ class CanvasGraphics {
|
||||
ctx.strokeStyle = strokeColor.getPattern(
|
||||
ctx,
|
||||
this,
|
||||
ctx.mozCurrentTransformInverse,
|
||||
getCurrentTransformInverse(ctx),
|
||||
PathType.STROKE
|
||||
);
|
||||
this.rescaleAndStroke(/* saveRestore */ false);
|
||||
@ -2129,7 +1958,7 @@ class CanvasGraphics {
|
||||
ctx.fillStyle = fillColor.getPattern(
|
||||
ctx,
|
||||
this,
|
||||
ctx.mozCurrentTransformInverse,
|
||||
getCurrentTransformInverse(ctx),
|
||||
PathType.FILL
|
||||
);
|
||||
needRestore = true;
|
||||
@ -2383,7 +2212,7 @@ class CanvasGraphics {
|
||||
if (isAddToPathSet) {
|
||||
const paths = this.pendingTextPaths || (this.pendingTextPaths = []);
|
||||
paths.push({
|
||||
transform: ctx.mozCurrentTransform,
|
||||
transform: getCurrentTransform(ctx),
|
||||
x,
|
||||
y,
|
||||
fontSize,
|
||||
@ -2398,8 +2227,7 @@ class CanvasGraphics {
|
||||
const { context: ctx } = this.cachedCanvases.getCanvas(
|
||||
"isFontSubpixelAAEnabled",
|
||||
10,
|
||||
10,
|
||||
/* trackTransform */ false
|
||||
10
|
||||
);
|
||||
ctx.scale(1.5, 1);
|
||||
ctx.fillText("I", 0, 10);
|
||||
@ -2459,10 +2287,10 @@ class CanvasGraphics {
|
||||
const pattern = current.fillColor.getPattern(
|
||||
ctx,
|
||||
this,
|
||||
ctx.mozCurrentTransformInverse,
|
||||
getCurrentTransformInverse(ctx),
|
||||
PathType.FILL
|
||||
);
|
||||
patternTransform = ctx.mozCurrentTransform;
|
||||
patternTransform = getCurrentTransform(ctx);
|
||||
ctx.restore();
|
||||
ctx.fillStyle = pattern;
|
||||
}
|
||||
@ -2663,8 +2491,7 @@ class CanvasGraphics {
|
||||
let pattern;
|
||||
if (IR[0] === "TilingPattern") {
|
||||
const color = IR[1];
|
||||
const baseTransform =
|
||||
this.baseTransform || this.ctx.mozCurrentTransform.slice();
|
||||
const baseTransform = this.baseTransform || getCurrentTransform(this.ctx);
|
||||
const canvasGraphicsFactory = {
|
||||
createCanvasGraphics: ctx => {
|
||||
return new CanvasGraphics(
|
||||
@ -2735,11 +2562,11 @@ class CanvasGraphics {
|
||||
ctx.fillStyle = pattern.getPattern(
|
||||
ctx,
|
||||
this,
|
||||
ctx.mozCurrentTransformInverse,
|
||||
getCurrentTransformInverse(ctx),
|
||||
PathType.SHADING
|
||||
);
|
||||
|
||||
const inv = ctx.mozCurrentTransformInverse;
|
||||
const inv = getCurrentTransformInverse(ctx);
|
||||
if (inv) {
|
||||
const canvas = ctx.canvas;
|
||||
const width = canvas.width;
|
||||
@ -2790,13 +2617,13 @@ class CanvasGraphics {
|
||||
this.transform(...matrix);
|
||||
}
|
||||
|
||||
this.baseTransform = this.ctx.mozCurrentTransform;
|
||||
this.baseTransform = getCurrentTransform(this.ctx);
|
||||
|
||||
if (bbox) {
|
||||
const width = bbox[2] - bbox[0];
|
||||
const height = bbox[3] - bbox[1];
|
||||
this.ctx.rect(bbox[0], bbox[1], width, height);
|
||||
this.current.updateRectMinMax(this.ctx.mozCurrentTransform, bbox);
|
||||
this.current.updateRectMinMax(getCurrentTransform(this.ctx), bbox);
|
||||
this.clip();
|
||||
this.endPath();
|
||||
}
|
||||
@ -2847,7 +2674,7 @@ class CanvasGraphics {
|
||||
warn("Knockout groups not supported.");
|
||||
}
|
||||
|
||||
const currentTransform = currentCtx.mozCurrentTransform;
|
||||
const currentTransform = getCurrentTransform(currentCtx);
|
||||
if (group.matrix) {
|
||||
currentCtx.transform(...group.matrix);
|
||||
}
|
||||
@ -2859,7 +2686,7 @@ class CanvasGraphics {
|
||||
// will actually be.
|
||||
let bounds = Util.getAxialAlignedBoundingBox(
|
||||
group.bbox,
|
||||
currentCtx.mozCurrentTransform
|
||||
getCurrentTransform(currentCtx)
|
||||
);
|
||||
// Clip the bounding box to the current canvas.
|
||||
const canvasBounds = [
|
||||
@ -2896,8 +2723,7 @@ class CanvasGraphics {
|
||||
const scratchCanvas = this.cachedCanvases.getCanvas(
|
||||
cacheId,
|
||||
drawnWidth,
|
||||
drawnHeight,
|
||||
/* trackTransform */ true
|
||||
drawnHeight
|
||||
);
|
||||
const groupCtx = scratchCanvas.context;
|
||||
|
||||
@ -2959,7 +2785,7 @@ class CanvasGraphics {
|
||||
this.restore();
|
||||
} else {
|
||||
this.ctx.restore();
|
||||
const currentMtx = this.ctx.mozCurrentTransform;
|
||||
const currentMtx = getCurrentTransform(this.ctx);
|
||||
this.restore();
|
||||
this.ctx.save();
|
||||
this.ctx.setTransform(...currentMtx);
|
||||
@ -3003,7 +2829,7 @@ class CanvasGraphics {
|
||||
rect[3] = height;
|
||||
|
||||
const [scaleX, scaleY] = Util.singularValueDecompose2dScale(
|
||||
this.ctx.mozCurrentTransform
|
||||
getCurrentTransform(this.ctx)
|
||||
);
|
||||
const { viewportScale } = this;
|
||||
const canvasWidth = Math.ceil(
|
||||
@ -3021,7 +2847,6 @@ class CanvasGraphics {
|
||||
this.annotationCanvasMap.set(id, canvas);
|
||||
this.annotationCanvas.savedCtx = this.ctx;
|
||||
this.ctx = context;
|
||||
addContextCurrentTransform(this.ctx);
|
||||
this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY);
|
||||
|
||||
resetCtxToDefault(this.ctx, this.foregroundColor);
|
||||
@ -3100,7 +2925,7 @@ class CanvasGraphics {
|
||||
|
||||
const ctx = this.ctx;
|
||||
ctx.save();
|
||||
const currentTransform = ctx.mozCurrentTransform;
|
||||
const currentTransform = getCurrentTransform(ctx);
|
||||
ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0);
|
||||
const mask = this._createMaskCanvas(img);
|
||||
|
||||
@ -3137,8 +2962,7 @@ class CanvasGraphics {
|
||||
const maskCanvas = this.cachedCanvases.getCanvas(
|
||||
"maskCanvas",
|
||||
width,
|
||||
height,
|
||||
/* trackTransform */ false
|
||||
height
|
||||
);
|
||||
const maskCtx = maskCanvas.context;
|
||||
maskCtx.save();
|
||||
@ -3152,7 +2976,7 @@ class CanvasGraphics {
|
||||
? fillColor.getPattern(
|
||||
maskCtx,
|
||||
this,
|
||||
ctx.mozCurrentTransformInverse,
|
||||
getCurrentTransformInverse(ctx),
|
||||
PathType.FILL
|
||||
)
|
||||
: fillColor;
|
||||
@ -3241,17 +3065,19 @@ class CanvasGraphics {
|
||||
const tmpCanvas = this.cachedCanvases.getCanvas(
|
||||
"inlineImage",
|
||||
width,
|
||||
height,
|
||||
/* trackTransform */ false
|
||||
height
|
||||
);
|
||||
const tmpCtx = tmpCanvas.context;
|
||||
putBinaryImageData(tmpCtx, imgData, this.current.transferMaps);
|
||||
imgToPaint = tmpCanvas.canvas;
|
||||
}
|
||||
|
||||
const scaled = this._scaleImage(imgToPaint, ctx.mozCurrentTransformInverse);
|
||||
const scaled = this._scaleImage(
|
||||
imgToPaint,
|
||||
getCurrentTransformInverse(ctx)
|
||||
);
|
||||
ctx.imageSmoothingEnabled = getImageSmoothingEnabled(
|
||||
ctx.mozCurrentTransform,
|
||||
getCurrentTransform(ctx),
|
||||
imgData.interpolate
|
||||
);
|
||||
|
||||
@ -3290,12 +3116,7 @@ class CanvasGraphics {
|
||||
const w = imgData.width;
|
||||
const h = imgData.height;
|
||||
|
||||
const tmpCanvas = this.cachedCanvases.getCanvas(
|
||||
"inlineImage",
|
||||
w,
|
||||
h,
|
||||
/* trackTransform */ false
|
||||
);
|
||||
const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h);
|
||||
const tmpCtx = tmpCanvas.context;
|
||||
putBinaryImageData(tmpCtx, imgData, this.current.transferMaps);
|
||||
|
||||
@ -3409,7 +3230,7 @@ class CanvasGraphics {
|
||||
|
||||
getSinglePixelWidth() {
|
||||
if (!this._cachedGetSinglePixelWidth) {
|
||||
const m = this.ctx.mozCurrentTransform;
|
||||
const m = getCurrentTransform(this.ctx);
|
||||
if (m[1] === 0 && m[2] === 0) {
|
||||
// Fast path
|
||||
this._cachedGetSinglePixelWidth =
|
||||
@ -3433,7 +3254,7 @@ class CanvasGraphics {
|
||||
// to 1 after transform.
|
||||
if (!this._cachedScaleForStroking) {
|
||||
const { lineWidth } = this.current;
|
||||
const m = this.ctx.mozCurrentTransform;
|
||||
const m = getCurrentTransform(this.ctx);
|
||||
let scaleX, scaleY;
|
||||
|
||||
if (m[1] === 0 && m[2] === 0) {
|
||||
@ -3489,7 +3310,7 @@ class CanvasGraphics {
|
||||
|
||||
let savedMatrix, savedDashes, savedDashOffset;
|
||||
if (saveRestore) {
|
||||
savedMatrix = ctx.mozCurrentTransform.slice();
|
||||
savedMatrix = getCurrentTransform(ctx);
|
||||
savedDashes = ctx.getLineDash().slice();
|
||||
savedDashOffset = ctx.lineDashOffset;
|
||||
}
|
||||
@ -3517,7 +3338,7 @@ class CanvasGraphics {
|
||||
}
|
||||
|
||||
getCanvasPosition(x, y) {
|
||||
const transform = this.ctx.mozCurrentTransform;
|
||||
const transform = getCurrentTransform(this.ctx);
|
||||
return [
|
||||
transform[0] * x + transform[2] * y + transform[4],
|
||||
transform[1] * x + transform[3] * y + transform[5],
|
||||
|
@ -641,6 +641,16 @@ function binarySearchFirstItem(items, condition, start = 0) {
|
||||
return minIndex; /* === maxIndex */
|
||||
}
|
||||
|
||||
function getCurrentTransform(ctx) {
|
||||
const { a, b, c, d, e, f } = ctx.getTransform();
|
||||
return [a, b, c, d, e, f];
|
||||
}
|
||||
|
||||
function getCurrentTransformInverse(ctx) {
|
||||
const { a, b, c, d, e, f } = ctx.getTransform().invertSelf();
|
||||
return [a, b, c, d, e, f];
|
||||
}
|
||||
|
||||
export {
|
||||
binarySearchFirstItem,
|
||||
deprecated,
|
||||
@ -649,6 +659,8 @@ export {
|
||||
DOMStandardFontDataFactory,
|
||||
DOMSVGFactory,
|
||||
getColorValues,
|
||||
getCurrentTransform,
|
||||
getCurrentTransformInverse,
|
||||
getFilenameFromUrl,
|
||||
getPdfFilenameFromUrl,
|
||||
getRGB,
|
||||
|
@ -21,6 +21,7 @@ import {
|
||||
Util,
|
||||
warn,
|
||||
} from "../shared/util.js";
|
||||
import { getCurrentTransform } from "./display_utils.js";
|
||||
import { isNodeJS } from "../shared/is_node.js";
|
||||
|
||||
const PathType = {
|
||||
@ -96,7 +97,7 @@ class RadialAxialShadingPattern extends BaseShadingPattern {
|
||||
if (pathType === PathType.STROKE || pathType === PathType.FILL) {
|
||||
const ownerBBox = owner.current.getClippedPathBoundingBox(
|
||||
pathType,
|
||||
ctx.mozCurrentTransform
|
||||
getCurrentTransform(ctx)
|
||||
) || [0, 0, 0, 0];
|
||||
// Create a canvas that is only as big as the current path. This doesn't
|
||||
// allow us to cache the pattern, but it generally creates much smaller
|
||||
@ -409,7 +410,7 @@ class MeshShadingPattern extends BaseShadingPattern {
|
||||
applyBoundingBox(ctx, this._bbox);
|
||||
let scale;
|
||||
if (pathType === PathType.SHADING) {
|
||||
scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);
|
||||
scale = Util.singularValueDecompose2dScale(getCurrentTransform(ctx));
|
||||
} else {
|
||||
// Obtain scale from matrix and current transformation matrix.
|
||||
scale = Util.singularValueDecompose2dScale(owner.baseTransform);
|
||||
@ -584,7 +585,7 @@ class TilingPattern {
|
||||
|
||||
this.clipBbox(graphics, adjustedX0, adjustedY0, adjustedX1, adjustedY1);
|
||||
|
||||
graphics.baseTransform = graphics.ctx.mozCurrentTransform.slice();
|
||||
graphics.baseTransform = getCurrentTransform(graphics.ctx);
|
||||
|
||||
graphics.executeOperatorList(operatorList);
|
||||
|
||||
@ -620,7 +621,7 @@ class TilingPattern {
|
||||
const bboxWidth = x1 - x0;
|
||||
const bboxHeight = y1 - y0;
|
||||
graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);
|
||||
graphics.current.updateRectMinMax(graphics.ctx.mozCurrentTransform, [
|
||||
graphics.current.updateRectMinMax(getCurrentTransform(graphics.ctx), [
|
||||
x0,
|
||||
y0,
|
||||
x1,
|
||||
|
Loading…
Reference in New Issue
Block a user