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;