diff --git a/src/components/App.tsx b/src/components/App.tsx index 3564d0699..97833d0a1 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -361,7 +361,6 @@ export const useExcalidrawSetAppState = () => export const useExcalidrawActionManager = () => useContext(ExcalidrawActionManagerContext); -let refreshTimer = 0; let didTapTwice: boolean = false; let tappedTwiceTimer = 0; let cursorX = 0; @@ -1388,20 +1387,6 @@ class App extends React.Component { cursorButton[socketId] = user.button; }); - const refresh = () => { - // If a scene refresh is cued, restart the countdown. - // This way we are not calling this.setState({}) once per - // ExcalidrawElement. The countdown improves performance - // when there are large numbers of ExcalidrawElements - // executing this refresh() callback. - if (refreshTimer !== 0) { - window.clearTimeout(refreshTimer); - } - refreshTimer = window.setTimeout(() => { - this.refresh(); - window.clearTimeout(refreshTimer); - }, 50); - }; const renderingElements = this.scene .getNonDeletedElements() .filter((element) => { @@ -1449,7 +1434,6 @@ class App extends React.Component { imageCache: this.imageCache, isExporting: false, renderScrollbars: !this.device.isMobile, - renderCb: refresh, }, callback: ({ atLeastOneVisibleElement, scrollBars }) => { if (scrollBars) { diff --git a/src/packages/extensions/ts/mathjax/implementation.tsx b/src/packages/extensions/ts/mathjax/implementation.tsx index 550105e0b..26afe014d 100644 --- a/src/packages/extensions/ts/mathjax/implementation.tsx +++ b/src/packages/extensions/ts/mathjax/implementation.tsx @@ -22,6 +22,7 @@ import { } from "../../../../element/types"; import { newElementWith } from "../../../../element/mutateElement"; import { getElementAbsoluteCoords } from "../../../../element/bounds"; +import Scene from "../../../../scene/Scene"; // Imports for actions import { t, registerAuxLangData } from "../../../../i18n"; @@ -908,7 +909,7 @@ const measureMathElement = function (element, next) { return metrics; } as SubtypeMethods["measureText"]; -const renderMathElement = function (element, context, renderCb) { +const renderMathElement = function (element, context) { ensureMathElement(element); const isMathJaxLoaded = mathJaxLoaded; const _element = element as NonDeleted; @@ -996,9 +997,7 @@ const renderMathElement = function (element, context, renderCb) { if (isMathJaxLoaded) { imageCache[imgKey] = img; } - if (renderCb) { - renderCb(); - } + Scene.getScene(element)?.informMutation(); }; img.src = reader.result as string; }, diff --git a/src/renderer/renderElement.ts b/src/renderer/renderElement.ts index 74a48b184..399b44207 100644 --- a/src/renderer/renderElement.ts +++ b/src/renderer/renderElement.ts @@ -257,7 +257,7 @@ const drawElementOnCanvas = ( context.globalAlpha = element.opacity / 100; const map = getSubtypeMethods(element.subtype); if (map?.render) { - map.render(element, context, renderConfig.renderCb); + map.render(element, context); context.globalAlpha = 1; return; } diff --git a/src/scene/export.ts b/src/scene/export.ts index 17d189aae..6c5712be6 100644 --- a/src/scene/export.ts +++ b/src/scene/export.ts @@ -11,7 +11,6 @@ import { getInitializedImageElements, updateImageCache, } from "../element/image"; -import { ensureSubtypesLoadedForElements } from "../subtypes"; export const SVG_EXPORT_TAG = ``; @@ -52,48 +51,30 @@ export const exportToCanvas = async ( files, }); - let refreshTimer = 0; - - const renderConfig = { - viewBackgroundColor: exportBackground ? viewBackgroundColor : null, - scrollX: -minX + exportPadding, - scrollY: -minY + exportPadding, - zoom: defaultAppState.zoom, - remotePointerViewportCoords: {}, - remoteSelectedElementIds: {}, - shouldCacheIgnoreZoom: false, - remotePointerUsernames: {}, - remotePointerUserStates: {}, - theme: appState.exportWithDarkMode ? "dark" : "light", - imageCache, - renderScrollbars: false, - renderSelection: false, - renderGrid: false, - isExporting: true, - renderCb: () => { - if (refreshTimer !== 0) { - window.clearTimeout(refreshTimer); - } - refreshTimer = window.setTimeout(() => { - renderConfig.renderCb = () => {}; - window.clearTimeout(refreshTimer); - // Here instead of setState({}), call renderScene() again - render(); - }, 50); + renderScene({ + elements, + appState, + scale, + rc: rough.canvas(canvas), + canvas, + renderConfig: { + viewBackgroundColor: exportBackground ? viewBackgroundColor : null, + scrollX: -minX + exportPadding, + scrollY: -minY + exportPadding, + zoom: defaultAppState.zoom, + remotePointerViewportCoords: {}, + remoteSelectedElementIds: {}, + shouldCacheIgnoreZoom: false, + remotePointerUsernames: {}, + remotePointerUserStates: {}, + theme: appState.exportWithDarkMode ? "dark" : "light", + imageCache, + renderScrollbars: false, + renderSelection: false, + renderGrid: false, + isExporting: true, }, - }; - - const render = () => { - renderScene({ - elements, - appState, - scale, - rc: rough.canvas(canvas), - canvas, - renderConfig, - }); - }; - render(); + }); return canvas; }; @@ -187,12 +168,10 @@ export const exportToSvg = async ( } const rsvg = rough.svg(svgRoot); - await ensureSubtypesLoadedForElements(elements, () => { - renderSceneToSvg(elements, rsvg, svgRoot, files || {}, { - offsetX: -minX + exportPadding, - offsetY: -minY + exportPadding, - exportWithDarkMode: appState.exportWithDarkMode, - }); + renderSceneToSvg(elements, rsvg, svgRoot, files || {}, { + offsetX: -minX + exportPadding, + offsetY: -minY + exportPadding, + exportWithDarkMode: appState.exportWithDarkMode, }); return svgRoot; diff --git a/src/scene/types.ts b/src/scene/types.ts index 0cf0a57e1..a54b02b26 100644 --- a/src/scene/types.ts +++ b/src/scene/types.ts @@ -24,7 +24,6 @@ export type RenderConfig = { renderScrollbars?: boolean; renderSelection?: boolean; renderGrid?: boolean; - renderCb?: () => void; /** when exporting the behavior is slightly different (e.g. we can't use CSS filters), and we disable render optimizations for best output */ isExporting: boolean; diff --git a/src/subtypes.ts b/src/subtypes.ts index a26f8bf94..7a4afd340 100644 --- a/src/subtypes.ts +++ b/src/subtypes.ts @@ -241,7 +241,6 @@ export type SubtypeMethods = { render: ( element: NonDeleted, context: CanvasRenderingContext2D, - renderCb?: () => void, ) => void; renderSvg: ( svgRoot: SVGElement,