Skip to content

Commit

Permalink
fix: image render perf (excalidraw#8697)
Browse files Browse the repository at this point in the history
  • Loading branch information
dwelle authored Oct 23, 2024
1 parent 4cedf3d commit 958e03f
Showing 1 changed file with 8 additions and 14 deletions.
22 changes: 8 additions & 14 deletions packages/excalidraw/renderer/renderElement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ export interface ExcalidrawElementWithCanvas {
canvasOffsetX: number;
canvasOffsetY: number;
boundTextElementVersion: number | null;
imageCrop: ExcalidrawImageElement["crop"] | null;
containingFrameOpacity: number;
boundTextCanvas: HTMLCanvasElement;
}
Expand Down Expand Up @@ -334,6 +335,7 @@ const generateElementCanvas = (
getContainingFrame(element, elementsMap)?.opacity || 100,
boundTextCanvas,
angle: element.angle,
imageCrop: isImageElement(element) ? element.crop : null,
};
};

Expand Down Expand Up @@ -535,6 +537,7 @@ const generateElementWithCanvas = (
!appState?.shouldCacheIgnoreZoom;
const boundTextElement = getBoundTextElement(element, elementsMap);
const boundTextElementVersion = boundTextElement?.version || null;
const imageCrop = isImageElement(element) ? element.crop : null;

const containingFrameOpacity =
getContainingFrame(element, elementsMap)?.opacity || 100;
Expand All @@ -544,6 +547,7 @@ const generateElementWithCanvas = (
shouldRegenerateBecauseZoom ||
prevElementWithCanvas.theme !== appState.theme ||
prevElementWithCanvas.boundTextElementVersion !== boundTextElementVersion ||
prevElementWithCanvas.imageCrop !== imageCrop ||
prevElementWithCanvas.containingFrameOpacity !== containingFrameOpacity ||
// since we rotate the canvas when copying from cached canvas, we don't
// regenerate the cached canvas. But we need to in case of labels which are
Expand Down Expand Up @@ -966,24 +970,14 @@ export const renderElement = (
context.restore();
}

const _elementWithCanvas = generateElementCanvas(
elementWithCanvas.element,
allElementsMap,
appState.zoom,
drawElementFromCanvas(
elementWithCanvas,
context,
renderConfig,
appState,
allElementsMap,
);

if (_elementWithCanvas) {
drawElementFromCanvas(
_elementWithCanvas,
context,
renderConfig,
appState,
allElementsMap,
);
}

// reset
context.imageSmoothingEnabled = currentImageSmoothingStatus;
}
Expand Down

0 comments on commit 958e03f

Please sign in to comment.