You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.4 KiB
TypeScript
67 lines
1.4 KiB
TypeScript
6 months ago
|
import type { NewElementSceneRenderConfig } from "../scene/types";
|
||
|
import { throttleRAF } from "../utils";
|
||
|
import { bootstrapCanvas, getNormalizedCanvasDimensions } from "./helpers";
|
||
|
import { renderElement } from "./renderElement";
|
||
|
|
||
|
const _renderNewElementScene = ({
|
||
|
canvas,
|
||
|
rc,
|
||
|
newElement,
|
||
|
elementsMap,
|
||
|
allElementsMap,
|
||
|
scale,
|
||
|
appState,
|
||
|
renderConfig,
|
||
|
}: NewElementSceneRenderConfig) => {
|
||
|
if (canvas) {
|
||
|
const [normalizedWidth, normalizedHeight] = getNormalizedCanvasDimensions(
|
||
|
canvas,
|
||
|
scale,
|
||
|
);
|
||
|
|
||
|
const context = bootstrapCanvas({
|
||
|
canvas,
|
||
|
scale,
|
||
|
normalizedWidth,
|
||
|
normalizedHeight,
|
||
|
});
|
||
|
|
||
|
// Apply zoom
|
||
|
context.save();
|
||
|
context.scale(appState.zoom.value, appState.zoom.value);
|
||
|
|
||
|
if (newElement && newElement.type !== "selection") {
|
||
|
renderElement(
|
||
|
newElement,
|
||
|
elementsMap,
|
||
|
allElementsMap,
|
||
|
rc,
|
||
|
context,
|
||
|
renderConfig,
|
||
|
appState,
|
||
|
);
|
||
|
} else {
|
||
|
context.clearRect(0, 0, normalizedWidth, normalizedHeight);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
export const renderNewElementSceneThrottled = throttleRAF(
|
||
|
(config: NewElementSceneRenderConfig) => {
|
||
|
_renderNewElementScene(config);
|
||
|
},
|
||
|
{ trailing: true },
|
||
|
);
|
||
|
|
||
|
export const renderNewElementScene = (
|
||
|
renderConfig: NewElementSceneRenderConfig,
|
||
|
throttle?: boolean,
|
||
|
) => {
|
||
|
if (throttle) {
|
||
|
renderNewElementSceneThrottled(renderConfig);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
_renderNewElementScene(renderConfig);
|
||
|
};
|