perf: tidy svg frame bg render pass

This commit is contained in:
Ryan Di
2026-03-18 19:38:53 +11:00
parent 2b3871856e
commit 8d003a1d21
+45 -23
View File
@@ -720,26 +720,15 @@ export const renderSceneToSvg = (
return; return;
} }
const renderedFrameBackgrounds = new Set<string>(); const nonIframeElements = elements.filter((el) => !isIframeLikeElement(el));
const maybeRenderFrameBackground = ( const frameBackgroundByElementId = new Map<
element: NonDeletedExcalidrawElement | ExcalidrawFrameLikeElement, ExcalidrawElement["id"],
) => { ExcalidrawFrameLikeElement
if ( >();
!renderConfig.frameRendering.enabled ||
(!renderConfig.frameRendering.outline && !renderConfig.exportingFrame)
) {
return;
}
const frame =
renderConfig.exportingFrame ||
(isFrameLikeElement(element)
? element
: getContainingFrame(element, elementsMap));
const renderFrameBackgroundNode = (frame: ExcalidrawFrameLikeElement) => {
if ( if (
!frame || !frame ||
renderedFrameBackgrounds.has(frame.id) ||
!frame.backgroundColor || !frame.backgroundColor ||
isTransparent(frame.backgroundColor) isTransparent(frame.backgroundColor)
) { ) {
@@ -777,19 +766,52 @@ export const renderSceneToSvg = (
rect.setAttribute("stroke", "none"); rect.setAttribute("stroke", "none");
svgRoot.appendChild(rect); svgRoot.appendChild(rect);
};
if (
renderConfig.frameRendering.enabled &&
(renderConfig.frameRendering.outline || renderConfig.exportingFrame)
) {
const renderedFrameBackgrounds = new Set<string>();
if (renderConfig.exportingFrame) {
renderFrameBackgroundNode(renderConfig.exportingFrame);
renderedFrameBackgrounds.add(renderConfig.exportingFrame.id);
}
const maybeQueueFrameBackground = (
element: NonDeletedExcalidrawElement | ExcalidrawFrameLikeElement,
) => {
const frame = isFrameLikeElement(element)
? element
: getContainingFrame(element, elementsMap);
if (
!frame ||
renderedFrameBackgrounds.has(frame.id) ||
!frame.backgroundColor ||
isTransparent(frame.backgroundColor)
) {
return;
}
frameBackgroundByElementId.set(element.id, frame);
renderedFrameBackgrounds.add(frame.id); renderedFrameBackgrounds.add(frame.id);
}; };
if (renderConfig.exportingFrame) { nonIframeElements.forEach((element) => {
maybeRenderFrameBackground(renderConfig.exportingFrame); if (!element.isDeleted) {
maybeQueueFrameBackground(element);
}
});
} }
// render elements // render elements
elements nonIframeElements.forEach((element) => {
.filter((el) => !isIframeLikeElement(el))
.forEach((element) => {
if (!element.isDeleted) { if (!element.isDeleted) {
maybeRenderFrameBackground(element); const frameBackground = frameBackgroundByElementId.get(element.id);
if (frameBackground) {
renderFrameBackgroundNode(frameBackground);
}
if ( if (
isTextElement(element) && isTextElement(element) &&
element.containerId && element.containerId &&