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 {