Merge remote-tracking branch 'origin/master' into danieljgeiger-mathjax

This commit is contained in:
Daniel J. Geiger 2023-01-08 17:06:23 -06:00
commit f86d0f9102
5 changed files with 652 additions and 535 deletions

View File

@ -557,10 +557,10 @@ export const resizeSingleElement = (
mutateElement(element, { mutateElement(element, {
scale: [ scale: [
// defaulting because scaleX/Y can be 0/-0 // defaulting because scaleX/Y can be 0/-0
(Math.sign(scaleX) || stateAtResizeStart.scale[0]) * (Math.sign(newBoundsX2 - stateAtResizeStart.x) ||
stateAtResizeStart.scale[0], stateAtResizeStart.scale[0]) * stateAtResizeStart.scale[0],
(Math.sign(scaleY) || stateAtResizeStart.scale[1]) * (Math.sign(newBoundsY2 - stateAtResizeStart.y) ||
stateAtResizeStart.scale[1], stateAtResizeStart.scale[1]) * stateAtResizeStart.scale[1],
], ],
}); });
} }

View File

@ -720,22 +720,8 @@ const drawElementFromCanvas = (
const cx = ((x1 + x2) / 2 + renderConfig.scrollX) * window.devicePixelRatio; const cx = ((x1 + x2) / 2 + renderConfig.scrollX) * window.devicePixelRatio;
const cy = ((y1 + y2) / 2 + renderConfig.scrollY) * window.devicePixelRatio; const cy = ((y1 + y2) / 2 + renderConfig.scrollY) * window.devicePixelRatio;
const _isPendingImageElement = isPendingImageElement(element, renderConfig);
const scaleXFactor =
"scale" in elementWithCanvas.element && !_isPendingImageElement
? elementWithCanvas.element.scale[0]
: 1;
const scaleYFactor =
"scale" in elementWithCanvas.element && !_isPendingImageElement
? elementWithCanvas.element.scale[1]
: 1;
context.save(); context.save();
context.scale( context.scale(1 / window.devicePixelRatio, 1 / window.devicePixelRatio);
(1 / window.devicePixelRatio) * scaleXFactor,
(1 / window.devicePixelRatio) * scaleYFactor,
);
const boundTextElement = getBoundTextElement(element); const boundTextElement = getBoundTextElement(element);
if (isArrowElement(element) && boundTextElement) { if (isArrowElement(element) && boundTextElement) {
@ -800,7 +786,7 @@ const drawElementFromCanvas = (
zoom, zoom,
); );
context.translate(cx * scaleXFactor, cy * scaleYFactor); context.translate(cx, cy);
context.drawImage( context.drawImage(
tempCanvas, tempCanvas,
(-(x2 - x1) / 2) * window.devicePixelRatio - offsetX / zoom - padding, (-(x2 - x1) / 2) * window.devicePixelRatio - offsetX / zoom - padding,
@ -809,15 +795,30 @@ const drawElementFromCanvas = (
tempCanvas.height / zoom, tempCanvas.height / zoom,
); );
} else { } else {
context.translate(cx * scaleXFactor, cy * scaleYFactor); // we translate context to element center so that rotation and scale
// originates from the element center
context.translate(cx, cy);
context.rotate(element.angle * scaleXFactor * scaleYFactor); context.rotate(element.angle);
if (
"scale" in elementWithCanvas.element &&
!isPendingImageElement(element, renderConfig)
) {
context.scale(
elementWithCanvas.element.scale[0],
elementWithCanvas.element.scale[1],
);
}
// revert afterwards we don't have account for it during drawing
context.translate(-cx, -cy);
context.drawImage( context.drawImage(
elementWithCanvas.canvas!, elementWithCanvas.canvas!,
(-(x2 - x1) / 2) * window.devicePixelRatio - (x1 + renderConfig.scrollX) * window.devicePixelRatio -
(padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom,
(-(y2 - y1) / 2) * window.devicePixelRatio - (y1 + renderConfig.scrollY) * window.devicePixelRatio -
(padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom,
elementWithCanvas.canvas!.width / elementWithCanvas.canvasZoom, elementWithCanvas.canvas!.width / elementWithCanvas.canvasZoom,
elementWithCanvas.canvas!.height / elementWithCanvas.canvasZoom, elementWithCanvas.canvas!.height / elementWithCanvas.canvasZoom,
@ -912,9 +913,6 @@ export const renderElement = (
} }
context.save(); context.save();
context.translate(cx, cy); context.translate(cx, cy);
if (element.type === "image") {
context.scale(element.scale[0], element.scale[1]);
}
if (shouldResetImageFilter(element, renderConfig)) { if (shouldResetImageFilter(element, renderConfig)) {
context.filter = "none"; context.filter = "none";
@ -980,6 +978,12 @@ export const renderElement = (
); );
} else { } else {
context.rotate(element.angle); context.rotate(element.angle);
if (element.type === "image") {
// note: scale must be applied *after* rotating
context.scale(element.scale[0], element.scale[1]);
}
context.translate(-shiftX, -shiftY); context.translate(-shiftX, -shiftY);
drawElementOnCanvas(element, rc, context, renderConfig); drawElementOnCanvas(element, rc, context, renderConfig);
} }

View File

@ -41,8 +41,8 @@ export const centerScrollOn = ({
zoom: Zoom; zoom: Zoom;
}) => { }) => {
return { return {
scrollX: (viewportDimensions.width / 2) * (1 / zoom.value) - scenePoint.x, scrollX: viewportDimensions.width / 2 / zoom.value - scenePoint.x,
scrollY: (viewportDimensions.height / 2) * (1 / zoom.value) - scenePoint.y, scrollY: viewportDimensions.height / 2 / zoom.value - scenePoint.y,
}; };
}; };

File diff suppressed because it is too large Load Diff

View File

@ -352,9 +352,8 @@ export const viewportCoordsToSceneCoords = (
scrollY: number; scrollY: number;
}, },
) => { ) => {
const invScale = 1 / zoom.value; const x = (clientX - offsetLeft) / zoom.value - scrollX;
const x = (clientX - offsetLeft) * invScale - scrollX; const y = (clientY - offsetTop) / zoom.value - scrollY;
const y = (clientY - offsetTop) * invScale - scrollY;
return { x, y }; return { x, y };
}; };