diff --git a/packages/lab/src/data.ts b/packages/lab/src/data.ts
index 5eb70df..a030a22 100644
--- a/packages/lab/src/data.ts
+++ b/packages/lab/src/data.ts
@@ -143,6 +143,64 @@ const data: Data = {
desc: {
svg: ``
}
+ },
+ {
+ name: 'html-001',
+ uuid: 'xxx-0012',
+ x: 400,
+ y: 200,
+ w: 150,
+ h: 100,
+ type: 'html',
+ angle: 0,
+ desc: {
+ html: `
+
+
+
+
+
+
+
+
+
+ `
+ }
}
]
};
diff --git a/packages/renderer/src/draw/elements.ts b/packages/renderer/src/draw/elements.ts
index fe9ad39..06cfb32 100644
--- a/packages/renderer/src/draw/elements.ts
+++ b/packages/renderer/src/draw/elements.ts
@@ -4,6 +4,7 @@ import { drawRect } from './rect';
import { drawImage } from './image';
import { drawText } from './text';
import { drawSVG } from './svg';
+import { drawHTML } from './html';
export function drawElement(ctx: ViewContext2D, elem: Element, opts: RendererDrawElementOptions) {
try {
@@ -28,6 +29,10 @@ export function drawElement(ctx: ViewContext2D, elem: Element, opts
drawSVG(ctx, elem as Element<'svg'>, opts);
break;
}
+ case 'html': {
+ drawHTML(ctx, elem as Element<'html'>, opts);
+ break;
+ }
default: {
break;
}
diff --git a/packages/renderer/src/draw/html.ts b/packages/renderer/src/draw/html.ts
new file mode 100644
index 0000000..fd6bf47
--- /dev/null
+++ b/packages/renderer/src/draw/html.ts
@@ -0,0 +1,16 @@
+import type { Element, RendererDrawElementOptions, ViewContext2D } from '@idraw/types';
+import { rotateElement } from '@idraw/util';
+
+export function drawHTML(ctx: ViewContext2D, elem: Element<'html'>, opts: RendererDrawElementOptions) {
+ const content = opts.loader.getContent(elem.uuid);
+ const { calculator, scaleInfo } = opts;
+ const { x, y, w, h, angle } = calculator.elementSize(elem, scaleInfo);
+ rotateElement(ctx, { x, y, w, h, angle }, () => {
+ if (!content) {
+ opts.loader.load(elem as Element<'html'>);
+ }
+ if (elem.type === 'html' && content) {
+ ctx.drawImage(content, x, y, w, h);
+ }
+ });
+}
diff --git a/packages/renderer/src/draw/index.ts b/packages/renderer/src/draw/index.ts
index d3c6f46..21bed31 100644
--- a/packages/renderer/src/draw/index.ts
+++ b/packages/renderer/src/draw/index.ts
@@ -2,5 +2,6 @@ export { drawCircle } from './circle';
export { drawRect } from './rect';
export { drawImage } from './image';
export { drawSVG } from './svg';
+export { drawHTML } from './html';
export { drawText } from './text';
export { drawElementList, drawElement } from './elements';
diff --git a/packages/renderer/src/loader.ts b/packages/renderer/src/loader.ts
index 7d721e9..488c445 100644
--- a/packages/renderer/src/loader.ts
+++ b/packages/renderer/src/loader.ts
@@ -24,7 +24,10 @@ export class Loader extends EventEmitter implements RendererLoad
};
});
this._registerLoadFunc<'html'>('html', async (elem: Element<'html'>) => {
- const content = await loadHTML(elem.desc.html, elem.desc);
+ const content = await loadHTML(elem.desc.html, {
+ width: elem.desc.width || elem.w,
+ height: elem.desc.height || elem.h
+ });
return {
uuid: elem.uuid,
lastModified: Date.now(),
diff --git a/packages/types/src/lib/element.ts b/packages/types/src/lib/element.ts
index 7caa95f..222c99a 100644
--- a/packages/types/src/lib/element.ts
+++ b/packages/types/src/lib/element.ts
@@ -46,8 +46,8 @@ interface ElementCircleDesc extends ElementBaseDesc {
interface ElementHTMLDesc extends ElementBaseDesc {
html: string;
- width: number;
- height: number;
+ width?: number;
+ height?: number;
}
interface ElementImageDesc extends ElementBaseDesc {