diff --git a/src/packages/excalidraw/example/App.js b/src/packages/excalidraw/example/App.js index 55e09e6eb..64f71af68 100644 --- a/src/packages/excalidraw/example/App.js +++ b/src/packages/excalidraw/example/App.js @@ -29,6 +29,12 @@ const COMMENT_SVG = ( ); +const THUMBS_UP_SVG = ( + + + +); + const resolvablePromise = () => { let resolve; let reject; @@ -176,6 +182,14 @@ export default function App() { > {COMMENT_SVG} + ); }; @@ -204,6 +218,29 @@ export default function App() { transformHandles: false, stackedOnTop: true, }, + { + type: "custom", + customType: "thumbsup", + svg: () => { + return new Promise((resolve, reject) => { + const image = document.createElement("img"); + image.crossOrigin = "Anonymous"; + image.src = + "https://upload.wikimedia.org/wikipedia/commons/1/1f/SMirC-thumbsup.svg"; + + image.onload = function () { + const canvas = document.createElement("canvas"); + canvas.width = 30 * window.devicePixelRatio; + canvas.height = 30 * window.devicePixelRatio; + const context = canvas.getContext("2d"); + context.scale(window.devicePixelRatio, window.devicePixelRatio); + context.drawImage(image, 5, 5, 20, 20); + resolve(canvas.toDataURL()); + }; + image.onerror = (err) => reject(err); + }); + }, + }, ]; }; diff --git a/src/renderer/renderElement.ts b/src/renderer/renderElement.ts index 750ddb9ab..0a9c3d264 100644 --- a/src/renderer/renderElement.ts +++ b/src/renderer/renderElement.ts @@ -272,7 +272,27 @@ const drawElementOnCanvas = ( if (!customElementImgCache[config.customType]) { const img = document.createElement("img"); img.id = config.customType; - img.src = config.svg; + if (typeof config.svg === "string") { + img.src = config.svg; + } else { + const svg = config.svg(element); + if (svg instanceof Promise) { + svg.then((res) => { + img.src = res; + customElementImgCache[img.id] = img; + + context.drawImage( + customElementImgCache[config.customType], + 0, + 0, + element.width, + element.height, + ); + }); + } else { + img.src = svg; + } + } customElementImgCache[img.id] = img; } context.drawImage( diff --git a/src/types.ts b/src/types.ts index f644af1f8..e42c98a68 100644 --- a/src/types.ts +++ b/src/types.ts @@ -228,7 +228,7 @@ export type CustomElementConfig = { type: "custom"; customType: string; transformHandles?: boolean; - svg: string; + svg: string | ((element?: ExcalidrawElement) => string | Promise); width?: number; height?: number; stackedOnTop: boolean;