@idraw/renderer 0.4.0-beta.9 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
- import { rotateElement, calcViewBoxSize } from '@idraw/util';
1
+ import { rotateElement, calcViewBoxSize, calcViewElementSize } from '@idraw/util';
2
2
  import { drawBox, drawBoxShadow, getOpacity } from './box';
3
3
  export function drawImage(ctx, elem, opts) {
4
4
  const content = opts.loader.getContent(elem);
5
- const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
6
- const { x, y, w, h, angle } = (calculator === null || calculator === void 0 ? void 0 : calculator.elementSize(elem, viewScaleInfo, viewSizeInfo)) || elem;
5
+ const { viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
6
+ const { x, y, w, h, angle } = calcViewElementSize(elem, { viewScaleInfo }) || elem;
7
7
  const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
8
8
  rotateElement(ctx, { x, y, w, h, angle }, () => {
9
9
  drawBoxShadow(ctx, viewElem, {
@@ -17,7 +17,7 @@ export function drawImage(ctx, elem, opts) {
17
17
  viewSizeInfo,
18
18
  parentOpacity,
19
19
  renderContent: () => {
20
- if (!content) {
20
+ if (!content && !opts.loader.isDestroyed()) {
21
21
  opts.loader.load(elem, opts.elementAssets || {});
22
22
  }
23
23
  if (elem.type === 'image' && content) {
@@ -26,6 +26,10 @@ export function drawImage(ctx, elem, opts) {
26
26
  viewScaleInfo,
27
27
  viewSizeInfo
28
28
  });
29
+ const { detail } = elem;
30
+ const { scaleMode, originW = 0, originH = 0 } = detail;
31
+ const imageW = ctx.$undoPixelRatio(originW);
32
+ const imageH = ctx.$undoPixelRatio(originH);
29
33
  ctx.save();
30
34
  ctx.fillStyle = 'transparent';
31
35
  ctx.beginPath();
@@ -35,9 +39,46 @@ export function drawImage(ctx, elem, opts) {
35
39
  ctx.arcTo(x, y + h, x, y, radiusList[3]);
36
40
  ctx.arcTo(x, y, x + w, y, radiusList[0]);
37
41
  ctx.closePath();
38
- ctx.fill();
39
- ctx.clip();
40
- ctx.drawImage(content, x, y, w, h);
42
+ ctx.fill('nonzero');
43
+ ctx.clip('nonzero');
44
+ if (scaleMode && originH && originW) {
45
+ let sx = 0;
46
+ let sy = 0;
47
+ let sWidth = imageW;
48
+ let sHeight = imageH;
49
+ const dx = x;
50
+ const dy = y;
51
+ const dWidth = w;
52
+ const dHeight = h;
53
+ if (imageW > elem.w || imageH > elem.h) {
54
+ if (scaleMode === 'fill') {
55
+ const sourceScale = Math.max(elem.w / imageW, elem.h / imageH);
56
+ const newImageWidth = imageW * sourceScale;
57
+ const newImageHeight = imageH * sourceScale;
58
+ sx = (newImageWidth - elem.w) / 2 / sourceScale;
59
+ sy = (newImageHeight - elem.h) / 2 / sourceScale;
60
+ sWidth = elem.w / sourceScale;
61
+ sHeight = elem.h / sourceScale;
62
+ }
63
+ else if (scaleMode === 'tile') {
64
+ sx = 0;
65
+ sy = 0;
66
+ sWidth = elem.w;
67
+ sHeight = elem.h;
68
+ }
69
+ else if (scaleMode === 'fit') {
70
+ const sourceScale = Math.min(elem.w / imageW, elem.h / imageH);
71
+ sx = (imageW - elem.w / sourceScale) / 2;
72
+ sy = (imageH - elem.h / sourceScale) / 2;
73
+ sWidth = elem.w / sourceScale;
74
+ sHeight = elem.h / sourceScale;
75
+ }
76
+ }
77
+ ctx.drawImage(content, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
78
+ }
79
+ else {
80
+ ctx.drawImage(content, x, y, w, h);
81
+ }
41
82
  ctx.globalAlpha = parentOpacity;
42
83
  ctx.restore();
43
84
  }
@@ -4,5 +4,7 @@ export { drawImage } from './image';
4
4
  export { drawSVG } from './svg';
5
5
  export { drawHTML } from './html';
6
6
  export { drawText } from './text';
7
+ export { drawGroup, drawElement } from './group';
7
8
  export { drawElementList } from './elements';
8
- export { drawUnderlay } from './underlay';
9
+ export { drawLayout } from './layout';
10
+ export { drawGlobalBackground } from './global';
@@ -4,5 +4,7 @@ export { drawImage } from './image';
4
4
  export { drawSVG } from './svg';
5
5
  export { drawHTML } from './html';
6
6
  export { drawText } from './text';
7
+ export { drawGroup, drawElement } from './group';
7
8
  export { drawElementList } from './elements';
8
- export { drawUnderlay } from './underlay';
9
+ export { drawLayout } from './layout';
10
+ export { drawGlobalBackground } from './global';
@@ -0,0 +1,2 @@
1
+ import type { RendererDrawElementOptions, ViewContext2D, DataLayout } from '@idraw/types';
2
+ export declare function drawLayout(ctx: ViewContext2D, layout: DataLayout, opts: RendererDrawElementOptions, renderContent: (ctx: ViewContext2D) => void): void;
@@ -0,0 +1,44 @@
1
+ import { calcViewElementSize, calcViewBoxSize } from '@idraw/util';
2
+ import { drawBoxShadow, drawBoxBackground, drawBoxBorder } from './box';
3
+ export function drawLayout(ctx, layout, opts, renderContent) {
4
+ const { viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
5
+ const elem = Object.assign({ uuid: 'layout', type: 'group' }, layout);
6
+ const { x, y, w, h } = calcViewElementSize(elem, { viewScaleInfo }) || elem;
7
+ const angle = 0;
8
+ const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
9
+ ctx.globalAlpha = 1;
10
+ drawBoxShadow(ctx, viewElem, {
11
+ viewScaleInfo,
12
+ viewSizeInfo,
13
+ renderContent: () => {
14
+ drawBoxBackground(ctx, viewElem, { viewScaleInfo, viewSizeInfo });
15
+ }
16
+ });
17
+ if (layout.detail.overflow === 'hidden') {
18
+ const { viewScaleInfo, viewSizeInfo } = opts;
19
+ const elem = Object.assign({ uuid: 'layout', type: 'group' }, layout);
20
+ const viewElemSize = calcViewElementSize(elem, { viewScaleInfo }) || elem;
21
+ const viewElem = Object.assign(Object.assign({}, elem), viewElemSize);
22
+ const { x, y, w, h, radiusList } = calcViewBoxSize(viewElem, {
23
+ viewScaleInfo,
24
+ viewSizeInfo
25
+ });
26
+ ctx.save();
27
+ ctx.fillStyle = 'transparent';
28
+ ctx.beginPath();
29
+ ctx.moveTo(x + radiusList[0], y);
30
+ ctx.arcTo(x + w, y, x + w, y + h, radiusList[1]);
31
+ ctx.arcTo(x + w, y + h, x, y + h, radiusList[2]);
32
+ ctx.arcTo(x, y + h, x, y, radiusList[3]);
33
+ ctx.arcTo(x, y, x + w, y, radiusList[0]);
34
+ ctx.closePath();
35
+ ctx.fill('nonzero');
36
+ ctx.clip('nonzero');
37
+ }
38
+ renderContent(ctx);
39
+ if (layout.detail.overflow === 'hidden') {
40
+ ctx.restore();
41
+ }
42
+ drawBoxBorder(ctx, viewElem, { originElem: elem, viewScaleInfo, viewSizeInfo });
43
+ ctx.globalAlpha = parentOpacity;
44
+ }
@@ -1,21 +1,55 @@
1
- import { rotateElement, generateSVGPath } from '@idraw/util';
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { rotateElement, generateSVGPath, calcViewElementSize } from '@idraw/util';
2
13
  import { drawBox, drawBoxShadow } from './box';
3
14
  export function drawPath(ctx, elem, opts) {
15
+ var _a, _b;
4
16
  const { detail } = elem;
5
- const { originX, originY, originW, originH } = detail;
6
- const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
7
- const { x, y, w, h, angle } = (calculator === null || calculator === void 0 ? void 0 : calculator.elementSize(elem, viewScaleInfo, viewSizeInfo)) || elem;
17
+ const { originX, originY, originW, originH, fillRule } = detail;
18
+ const { viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
19
+ const { x, y, w, h, angle } = calcViewElementSize(elem, { viewScaleInfo }) || elem;
8
20
  const scaleW = w / originW;
9
21
  const scaleH = h / originH;
10
22
  const viewOriginX = originX * scaleW;
11
23
  const viewOriginY = originY * scaleH;
12
24
  const internalX = x - viewOriginX;
13
25
  const internalY = y - viewOriginY;
26
+ const _c = elem.detail, { clipPath, clipPathStrokeColor, clipPathStrokeWidth } = _c, restDetail = __rest(_c, ["clipPath", "clipPathStrokeColor", "clipPathStrokeWidth"]);
14
27
  const scaleNum = viewScaleInfo.scale * viewSizeInfo.devicePixelRatio;
15
28
  const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
29
+ let boxViewElem = Object.assign({}, viewElem);
30
+ boxViewElem.detail = restDetail;
31
+ let boxOriginElem = Object.assign({}, elem);
32
+ boxOriginElem.detail = restDetail;
33
+ if (detail.fill &&
34
+ detail.fill !== 'string' &&
35
+ ((_b = (_a = detail.fill) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.includes('gradient'))) {
36
+ boxViewElem = Object.assign(Object.assign({}, viewElem), {
37
+ detail: Object.assign(Object.assign({}, viewElem.detail), {
38
+ background: detail.fill,
39
+ clipPath: {
40
+ commands: detail.commands,
41
+ originX,
42
+ originY,
43
+ originW,
44
+ originH
45
+ }
46
+ })
47
+ });
48
+ boxOriginElem.detail = Object.assign({}, boxViewElem.detail);
49
+ }
16
50
  rotateElement(ctx, { x, y, w, h, angle }, () => {
17
- drawBox(ctx, viewElem, {
18
- originElem: elem,
51
+ drawBox(ctx, boxViewElem, {
52
+ originElem: boxOriginElem,
19
53
  calcElemSize: { x, y, w, h, angle },
20
54
  viewScaleInfo,
21
55
  viewSizeInfo,
@@ -31,8 +65,15 @@ export function drawPath(ctx, elem, opts) {
31
65
  const pathStr = generateSVGPath(detail.commands || []);
32
66
  const path2d = new Path2D(pathStr);
33
67
  if (detail.fill) {
34
- ctx.fillStyle = detail.fill;
35
- ctx.fill(path2d);
68
+ if (typeof detail.fill === 'string') {
69
+ ctx.fillStyle = detail.fill;
70
+ }
71
+ else {
72
+ ctx.fillStyle = 'transparent';
73
+ }
74
+ }
75
+ if (detail.fill) {
76
+ ctx.fill(path2d, fillRule || 'nonzero');
36
77
  }
37
78
  if (detail.stroke && detail.strokeWidth !== 0) {
38
79
  ctx.strokeStyle = detail.stroke;
@@ -1,8 +1,8 @@
1
- import { rotateElement } from '@idraw/util';
1
+ import { rotateElement, calcViewElementSize } from '@idraw/util';
2
2
  import { drawBox, drawBoxShadow } from './box';
3
3
  export function drawRect(ctx, elem, opts) {
4
- const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
5
- const { x, y, w, h, angle } = (calculator === null || calculator === void 0 ? void 0 : calculator.elementSize(elem, viewScaleInfo, viewSizeInfo)) || elem;
4
+ const { viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
5
+ const { x, y, w, h, angle } = calcViewElementSize(elem, { viewScaleInfo }) || elem;
6
6
  const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
7
7
  rotateElement(ctx, { x, y, w, h, angle }, () => {
8
8
  drawBoxShadow(ctx, viewElem, {
@@ -1,11 +1,11 @@
1
- import { rotateElement } from '@idraw/util';
1
+ import { rotateElement, calcViewElementSize } from '@idraw/util';
2
2
  import { getOpacity } from './box';
3
3
  export function drawSVG(ctx, elem, opts) {
4
4
  const content = opts.loader.getContent(elem);
5
- const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
6
- const { x, y, w, h, angle } = (calculator === null || calculator === void 0 ? void 0 : calculator.elementSize(elem, viewScaleInfo, viewSizeInfo)) || elem;
5
+ const { viewScaleInfo, parentOpacity } = opts;
6
+ const { x, y, w, h, angle } = calcViewElementSize(elem, { viewScaleInfo }) || elem;
7
7
  rotateElement(ctx, { x, y, w, h, angle }, () => {
8
- if (!content) {
8
+ if (!content && !opts.loader.isDestroyed()) {
9
9
  opts.loader.load(elem, opts.elementAssets || {});
10
10
  }
11
11
  if (elem.type === 'svg' && content) {
@@ -1,87 +1,46 @@
1
- import { rotateElement } from '@idraw/util';
1
+ import { rotateElement, calcViewElementSize, enhanceFontFamliy } from '@idraw/util';
2
2
  import { is, isColorStr, getDefaultElementDetailConfig } from '@idraw/util';
3
- import { drawBox } from './box';
3
+ import { drawBox, drawBoxShadow, getOpacity } from './box';
4
4
  const detailConfig = getDefaultElementDetailConfig();
5
5
  export function drawText(ctx, elem, opts) {
6
- const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
7
- const { x, y, w, h, angle } = (calculator === null || calculator === void 0 ? void 0 : calculator.elementSize(elem, viewScaleInfo, viewSizeInfo)) || elem;
6
+ const { viewScaleInfo, viewSizeInfo, parentOpacity, calculator } = opts;
7
+ const { x, y, w, h, angle } = calcViewElementSize(elem, { viewScaleInfo }) || elem;
8
8
  const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
9
9
  rotateElement(ctx, { x, y, w, h, angle }, () => {
10
- drawBox(ctx, viewElem, {
11
- originElem: elem,
12
- calcElemSize: { x, y, w, h, angle },
10
+ var _a, _b;
11
+ drawBoxShadow(ctx, viewElem, {
13
12
  viewScaleInfo,
14
13
  viewSizeInfo,
15
- parentOpacity,
16
14
  renderContent: () => {
17
- const detail = Object.assign(Object.assign({}, detailConfig), elem.detail);
18
- const fontSize = (detail.fontSize || detailConfig.fontSize) * viewScaleInfo.scale;
19
- const lineHeight = detail.lineHeight ? detail.lineHeight * viewScaleInfo.scale : fontSize;
20
- ctx.fillStyle = elem.detail.color || detailConfig.color;
21
- ctx.textBaseline = 'top';
22
- ctx.$setFont({
23
- fontWeight: detail.fontWeight,
24
- fontSize: fontSize,
25
- fontFamily: detail.fontFamily
15
+ drawBox(ctx, viewElem, {
16
+ originElem: elem,
17
+ calcElemSize: { x, y, w, h, angle },
18
+ viewScaleInfo,
19
+ viewSizeInfo,
20
+ parentOpacity
26
21
  });
27
- const detailText = detail.text.replace(/\r\n/gi, '\n');
28
- const fontHeight = lineHeight;
29
- const detailTextList = detailText.split('\n');
30
- const lines = [];
31
- let lineNum = 0;
32
- detailTextList.forEach((tempText, idx) => {
33
- let lineText = '';
34
- if (tempText.length > 0) {
35
- for (let i = 0; i < tempText.length; i++) {
36
- if (ctx.measureText(lineText + (tempText[i] || '')).width < ctx.$doPixelRatio(w)) {
37
- lineText += tempText[i] || '';
38
- }
39
- else {
40
- lines.push({
41
- text: lineText,
42
- width: ctx.$undoPixelRatio(ctx.measureText(lineText).width)
43
- });
44
- lineText = tempText[i] || '';
45
- lineNum++;
46
- }
47
- if ((lineNum + 1) * fontHeight > h) {
48
- break;
49
- }
50
- if (tempText.length - 1 === i) {
51
- if ((lineNum + 1) * fontHeight < h) {
52
- lines.push({
53
- text: lineText,
54
- width: ctx.$undoPixelRatio(ctx.measureText(lineText).width)
55
- });
56
- if (idx < detailTextList.length - 1) {
57
- lineNum++;
58
- }
59
- break;
60
- }
61
- }
62
- }
63
- }
64
- else {
65
- lines.push({
66
- text: '',
67
- width: 0
68
- });
69
- }
70
- });
71
- let startY = 0;
72
- if (lines.length * fontHeight < h) {
73
- if (elem.detail.verticalAlign === 'top') {
74
- startY = 0;
75
- }
76
- else if (elem.detail.verticalAlign === 'bottom') {
77
- startY += h - lines.length * fontHeight;
78
- }
79
- else {
80
- startY += (h - lines.length * fontHeight) / 2;
81
- }
82
- }
83
- {
84
- const _y = y + startY;
22
+ }
23
+ });
24
+ {
25
+ const detail = Object.assign(Object.assign({}, detailConfig), elem.detail);
26
+ const originFontSize = detail.fontSize || detailConfig.fontSize;
27
+ const fontSize = originFontSize * viewScaleInfo.scale;
28
+ if (fontSize < 2) {
29
+ return;
30
+ }
31
+ const { parentOpacity } = opts;
32
+ const opacity = getOpacity(elem) * parentOpacity;
33
+ ctx.globalAlpha = opacity;
34
+ ctx.fillStyle = elem.detail.color || detailConfig.color;
35
+ ctx.textBaseline = 'top';
36
+ ctx.$setFont({
37
+ fontWeight: detail.fontWeight,
38
+ fontSize: fontSize,
39
+ fontFamily: enhanceFontFamliy(detail.fontFamily)
40
+ });
41
+ {
42
+ const virtualTextDetail = calculator.getVirtualFlatItem(elem.uuid);
43
+ if (Array.isArray(virtualTextDetail === null || virtualTextDetail === void 0 ? void 0 : virtualTextDetail.textLines) && ((_a = virtualTextDetail === null || virtualTextDetail === void 0 ? void 0 : virtualTextDetail.textLines) === null || _a === void 0 ? void 0 : _a.length) > 0) {
85
44
  if (detail.textShadowColor !== undefined && isColorStr(detail.textShadowColor)) {
86
45
  ctx.shadowColor = detail.textShadowColor;
87
46
  }
@@ -94,18 +53,12 @@ export function drawText(ctx, elem, opts) {
94
53
  if (detail.textShadowBlur !== undefined && is.number(detail.textShadowBlur)) {
95
54
  ctx.shadowBlur = detail.textShadowBlur;
96
55
  }
97
- lines.forEach((line, i) => {
98
- let _x = x;
99
- if (detail.textAlign === 'center') {
100
- _x = x + (w - line.width) / 2;
101
- }
102
- else if (detail.textAlign === 'right') {
103
- _x = x + (w - line.width);
104
- }
105
- ctx.fillText(line.text, _x, _y + fontHeight * i);
56
+ (_b = virtualTextDetail === null || virtualTextDetail === void 0 ? void 0 : virtualTextDetail.textLines) === null || _b === void 0 ? void 0 : _b.forEach((line) => {
57
+ ctx.fillText(line.text, x + line.x * viewScaleInfo.scale, y + line.y * viewScaleInfo.scale);
106
58
  });
107
59
  }
108
60
  }
109
- });
61
+ ctx.globalAlpha = parentOpacity;
62
+ }
110
63
  });
111
64
  }
@@ -2,9 +2,12 @@ import { EventEmitter } from '@idraw/util';
2
2
  import type { LoadItemMap } from '@idraw/types';
3
3
  import { Loader } from './loader';
4
4
  import type { Data, BoardRenderer, RendererOptions, RendererEventMap, RendererDrawOptions } from '@idraw/types';
5
+ import { Calculator } from './calculator';
6
+ export { Calculator };
5
7
  export declare class Renderer extends EventEmitter<RendererEventMap> implements BoardRenderer {
6
8
  #private;
7
9
  constructor(opts: RendererOptions);
10
+ isDestroyed(): boolean;
8
11
  destroy(): void;
9
12
  updateOptions(opts: RendererOptions): void;
10
13
  drawData(data: Data, opts: RendererDrawOptions): void;
@@ -12,5 +15,6 @@ export declare class Renderer extends EventEmitter<RendererEventMap> implements
12
15
  setLoadItemMap(itemMap: LoadItemMap): void;
13
16
  getLoadItemMap(): LoadItemMap;
14
17
  getLoader(): Loader;
18
+ getCalculator(): Calculator;
15
19
  }
16
- export { drawRect } from './draw';
20
+ export { drawCircle, drawRect, drawImage, drawSVG, drawHTML, drawText, drawGroup, drawElement, drawElementList, drawLayout, drawGlobalBackground } from './draw';
package/dist/esm/index.js CHANGED
@@ -9,30 +9,43 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _Renderer_instances, _Renderer_opts, _Renderer_loader, _Renderer_init;
12
+ var _Renderer_instances, _Renderer_opts, _Renderer_loader, _Renderer_calculator, _Renderer_hasDestroyed, _Renderer_init;
13
13
  import { EventEmitter } from '@idraw/util';
14
- import { drawElementList, drawUnderlay } from './draw/index';
14
+ import { drawElementList, drawLayout, drawGlobalBackground } from './draw/index';
15
15
  import { Loader } from './loader';
16
+ import { Calculator } from './calculator';
17
+ export { Calculator };
16
18
  export class Renderer extends EventEmitter {
17
19
  constructor(opts) {
18
20
  super();
19
21
  _Renderer_instances.add(this);
20
22
  _Renderer_opts.set(this, void 0);
21
23
  _Renderer_loader.set(this, new Loader());
24
+ _Renderer_calculator.set(this, void 0);
25
+ _Renderer_hasDestroyed.set(this, false);
22
26
  __classPrivateFieldSet(this, _Renderer_opts, opts, "f");
27
+ __classPrivateFieldSet(this, _Renderer_calculator, new Calculator({
28
+ tempContext: opts.tempContext
29
+ }), "f");
23
30
  __classPrivateFieldGet(this, _Renderer_instances, "m", _Renderer_init).call(this);
24
31
  }
32
+ isDestroyed() {
33
+ return __classPrivateFieldGet(this, _Renderer_hasDestroyed, "f");
34
+ }
25
35
  destroy() {
36
+ this.clear();
26
37
  __classPrivateFieldSet(this, _Renderer_opts, null, "f");
27
38
  __classPrivateFieldGet(this, _Renderer_loader, "f").destroy();
28
39
  __classPrivateFieldSet(this, _Renderer_loader, null, "f");
40
+ __classPrivateFieldSet(this, _Renderer_hasDestroyed, true, "f");
29
41
  }
30
42
  updateOptions(opts) {
31
43
  __classPrivateFieldSet(this, _Renderer_opts, opts, "f");
32
44
  }
33
45
  drawData(data, opts) {
34
46
  const loader = __classPrivateFieldGet(this, _Renderer_loader, "f");
35
- const { calculator } = __classPrivateFieldGet(this, _Renderer_opts, "f");
47
+ const calculator = __classPrivateFieldGet(this, _Renderer_calculator, "f");
48
+ const { sharer } = __classPrivateFieldGet(this, _Renderer_opts, "f");
36
49
  const viewContext = __classPrivateFieldGet(this, _Renderer_opts, "f").viewContext;
37
50
  viewContext.clearRect(0, 0, viewContext.canvas.width, viewContext.canvas.height);
38
51
  const parentElementSize = {
@@ -41,14 +54,24 @@ export class Renderer extends EventEmitter {
41
54
  w: opts.viewSizeInfo.width,
42
55
  h: opts.viewSizeInfo.height
43
56
  };
44
- if (data.underlay) {
45
- drawUnderlay(viewContext, data.underlay, Object.assign({ loader,
46
- calculator,
47
- parentElementSize, parentOpacity: 1 }, opts));
57
+ if (opts.forceDrawAll === true) {
58
+ __classPrivateFieldGet(this, _Renderer_calculator, "f").resetVirtualFlatItemMap(data, {
59
+ viewScaleInfo: opts.viewScaleInfo,
60
+ viewSizeInfo: opts.viewSizeInfo
61
+ });
48
62
  }
49
- drawElementList(viewContext, data, Object.assign({ loader,
63
+ const drawOpts = Object.assign({ loader,
50
64
  calculator,
51
- parentElementSize, elementAssets: data.assets, parentOpacity: 1 }, opts));
65
+ parentElementSize, elementAssets: data.assets, parentOpacity: 1, overrideElementMap: sharer === null || sharer === void 0 ? void 0 : sharer.getActiveOverrideElemenentMap() }, opts);
66
+ drawGlobalBackground(viewContext, data.global, drawOpts);
67
+ if (data.layout) {
68
+ drawLayout(viewContext, data.layout, drawOpts, () => {
69
+ drawElementList(viewContext, data, drawOpts);
70
+ });
71
+ }
72
+ else {
73
+ drawElementList(viewContext, data, drawOpts);
74
+ }
52
75
  }
53
76
  scale(num) {
54
77
  const { sharer } = __classPrivateFieldGet(this, _Renderer_opts, "f");
@@ -84,13 +107,17 @@ export class Renderer extends EventEmitter {
84
107
  getLoader() {
85
108
  return __classPrivateFieldGet(this, _Renderer_loader, "f");
86
109
  }
110
+ getCalculator() {
111
+ return __classPrivateFieldGet(this, _Renderer_calculator, "f");
112
+ }
87
113
  }
88
- _Renderer_opts = new WeakMap(), _Renderer_loader = new WeakMap(), _Renderer_instances = new WeakSet(), _Renderer_init = function _Renderer_init() {
114
+ _Renderer_opts = new WeakMap(), _Renderer_loader = new WeakMap(), _Renderer_calculator = new WeakMap(), _Renderer_hasDestroyed = new WeakMap(), _Renderer_instances = new WeakSet(), _Renderer_init = function _Renderer_init() {
89
115
  const loader = __classPrivateFieldGet(this, _Renderer_loader, "f");
90
116
  loader.on('load', (e) => {
91
117
  this.trigger('load', e);
92
118
  });
93
- loader.on('error', () => {
119
+ loader.on('error', (e) => {
120
+ console.error(e);
94
121
  });
95
122
  };
96
- export { drawRect } from './draw';
123
+ export { drawCircle, drawRect, drawImage, drawSVG, drawHTML, drawText, drawGroup, drawElement, drawElementList, drawLayout, drawGlobalBackground } from './draw';
@@ -1,8 +1,11 @@
1
- import type { RendererLoader, LoaderEventMap, LoadContent, LoadItemMap, LoadElementType, Element, ElementAssets } from '@idraw/types';
1
+ import type { RendererLoader, LoaderEventMap, LoadContent, LoadItemMap, LoadElementType, Element, ElementAssets, RecursivePartial } from '@idraw/types';
2
2
  import { EventEmitter } from '@idraw/util';
3
3
  export declare class Loader extends EventEmitter<LoaderEventMap> implements RendererLoader {
4
4
  #private;
5
5
  constructor();
6
+ isDestroyed(): boolean;
7
+ reset(): void;
8
+ resetElementAsset(element: Element<LoadElementType> | RecursivePartial<Element>): void;
6
9
  destroy(): void;
7
10
  load(element: Element<LoadElementType>, assets: ElementAssets): void;
8
11
  getContent(element: Element<LoadElementType>): LoadContent | null;