From 5f4bf9e75dee7a5623403e0f5bd26caef21f961e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arno=C5=A1t=20Pleskot?= Date: Thu, 10 Aug 2023 23:45:45 +0200 Subject: [PATCH] feat: simplify the rendering --- src/scene/export.ts | 36 +++++++++++------------ src/scene/fancyBackground.ts | 56 +----------------------------------- 2 files changed, 19 insertions(+), 73 deletions(-) diff --git a/src/scene/export.ts b/src/scene/export.ts index c5c097969..f440cb8e8 100644 --- a/src/scene/export.ts +++ b/src/scene/export.ts @@ -6,6 +6,8 @@ import { distance, isOnlyExportingSingleFrame } from "../utils"; import { AppState, BinaryFiles } from "../types"; import { DEFAULT_EXPORT_PADDING, + FANCY_BG_BORDER_RADIUS, + FANCY_BG_PADDING, SVG_NS, THEME, THEME_FILTER, @@ -45,9 +47,17 @@ export const exportToCanvas = async ( return { canvas, scale: appState.exportScale }; }, ) => { - const [minX, minY, width, height] = getCanvasSize(elements, exportPadding); + const exportWithFancyBackground = + exportBackground && + !!appState.fancyBackgroundImageUrl && + elements.length > 0; + const padding = !exportWithFancyBackground + ? exportPadding + : exportPadding + FANCY_BG_PADDING + FANCY_BG_BORDER_RADIUS; - let { canvas, scale = 1 } = createCanvas(width, height); + const [minX, minY, width, height] = getCanvasSize(elements, padding); + + const { canvas, scale = 1 } = createCanvas(width, height); const defaultAppState = getDefaultAppState(); @@ -61,13 +71,13 @@ export const exportToCanvas = async ( const onlyExportingSingleFrame = isOnlyExportingSingleFrame(elements); - let renderConfig: RenderConfig = { + const renderConfig: RenderConfig = { viewBackgroundColor: exportBackground && !appState.fancyBackgroundImageUrl ? viewBackgroundColor : null, - scrollX: -minX + (onlyExportingSingleFrame ? 0 : exportPadding), - scrollY: -minY + (onlyExportingSingleFrame ? 0 : exportPadding), + scrollX: -minX + (onlyExportingSingleFrame ? 0 : padding), + scrollY: -minY + (onlyExportingSingleFrame ? 0 : padding), zoom: defaultAppState.zoom, remotePointerViewportCoords: {}, remoteSelectedElementIds: {}, @@ -83,22 +93,12 @@ export const exportToCanvas = async ( exportBackgroundImage: appState.fancyBackgroundImageUrl, }; - if (exportBackground && appState.fancyBackgroundImageUrl) { - const contentBounds = getCommonBounds(elements); - const updatedRenderProps = await applyFancyBackground({ + if (exportWithFancyBackground) { + await applyFancyBackground({ canvas, - fancyBackgroundImageUrl: appState.fancyBackgroundImageUrl, + fancyBackgroundImageUrl: appState.fancyBackgroundImageUrl!, backgroundColor: viewBackgroundColor, - scale, - renderConfig, - contentDimensions: { - w: contentBounds[2] - contentBounds[0], - h: contentBounds[3] - contentBounds[1], - }, }); - - renderConfig = updatedRenderProps.renderConfig; - scale = updatedRenderProps.scale; } renderScene({ diff --git a/src/scene/fancyBackground.ts b/src/scene/fancyBackground.ts index f77ec617d..a23efcecd 100644 --- a/src/scene/fancyBackground.ts +++ b/src/scene/fancyBackground.ts @@ -1,12 +1,7 @@ -import { - DEFAULT_EXPORT_PADDING, - FANCY_BG_BORDER_RADIUS, - FANCY_BG_PADDING, -} from "../constants"; +import { FANCY_BG_BORDER_RADIUS, FANCY_BG_PADDING } from "../constants"; import { loadHTMLImageElement } from "../element/image"; import { roundRect } from "../renderer/roundRect"; import { DataURL } from "../types"; -import { RenderConfig } from "./types"; type Dimensions = { w: number; h: number }; @@ -19,15 +14,6 @@ const getScaleToFill = (contentSize: Dimensions, containerSize: Dimensions) => { return scale; }; -const getScaleToFit = (contentSize: Dimensions, containerSize: Dimensions) => { - const scale = Math.min( - containerSize.w / contentSize.w, - containerSize.h / contentSize.h, - ); - - return scale; -}; - const addImageBackground = ( context: CanvasRenderingContext2D, canvasDimensions: Dimensions, @@ -134,47 +120,14 @@ const addContentBackground = ( }); }; -const updateRenderConfig = ( - renderConfig: RenderConfig, - canvasDimensions: Dimensions, - contentDimensions: Dimensions, -): { scale: number; renderConfig: RenderConfig } => { - const totalPadding = - FANCY_BG_PADDING + FANCY_BG_BORDER_RADIUS + DEFAULT_EXPORT_PADDING; - - const scale = getScaleToFit(contentDimensions, { - w: canvasDimensions.w - totalPadding * 2, - h: canvasDimensions.h - totalPadding * 2, - }); - - const centeredScrollX = - (canvasDimensions.w - contentDimensions.w * scale) / 2; - const centeredScrollY = - (canvasDimensions.h - contentDimensions.h * scale) / 2; - - return { - renderConfig: { - ...renderConfig, - scrollX: centeredScrollX + renderConfig.scrollX, - scrollY: centeredScrollY + renderConfig.scrollY, - }, - scale, - }; -}; - export const applyFancyBackground = async ({ canvas, fancyBackgroundImageUrl, backgroundColor, - renderConfig, - contentDimensions, }: { canvas: HTMLCanvasElement; fancyBackgroundImageUrl: DataURL; backgroundColor: string; - scale: number; - renderConfig: RenderConfig; - contentDimensions: Dimensions; }) => { const context = canvas.getContext("2d")!; @@ -184,14 +137,7 @@ export const applyFancyBackground = async ({ const canvasDimensions: Dimensions = { w: canvas.width, h: canvas.height }; - // const normalizedDimensions: Dimensions = { - // w: canvas.width / scale, - // h: canvas.height / scale, - // }; - addImageBackground(context, canvasDimensions, fancyBackgroundImage); addContentBackground(context, canvasDimensions, backgroundColor); - - return updateRenderConfig(renderConfig, canvasDimensions, contentDimensions); };