@idraw/renderer 0.4.0-beta.0 → 0.4.0-beta.10

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,14 +1,16 @@
1
1
  import { ViewContext2D, Element, ElementType, ElementSize, ViewScaleInfo, ViewSizeInfo } from '@idraw/types';
2
+ export declare function getOpacity(elem: Element): number;
2
3
  export declare function drawBox(ctx: ViewContext2D, viewElem: Element<ElementType>, opts: {
3
4
  originElem: Element<ElementType>;
4
5
  calcElemSize: ElementSize;
5
6
  pattern?: string | CanvasPattern | null;
6
- renderContent: Function;
7
+ renderContent: () => void;
7
8
  viewScaleInfo: ViewScaleInfo;
8
9
  viewSizeInfo: ViewSizeInfo;
10
+ parentOpacity: number;
9
11
  }): void;
10
12
  export declare function drawBoxShadow(ctx: ViewContext2D, viewElem: Element<ElementType>, opts: {
11
13
  viewScaleInfo: ViewScaleInfo;
12
14
  viewSizeInfo: ViewSizeInfo;
13
- renderContent: Function;
15
+ renderContent: () => void;
14
16
  }): void;
@@ -1,31 +1,35 @@
1
1
  import { istype, isColorStr, generateSVGPath, rotateElement, is, getDefaultElementDetailConfig, calcViewBoxSize } from '@idraw/util';
2
2
  import { createColorStyle } from './color';
3
3
  const defaultElemConfig = getDefaultElementDetailConfig();
4
+ export function getOpacity(elem) {
5
+ var _a, _b, _c, _d;
6
+ let opacity = 1;
7
+ if (((_a = elem === null || elem === void 0 ? void 0 : elem.detail) === null || _a === void 0 ? void 0 : _a.opacity) !== undefined && ((_b = elem === null || elem === void 0 ? void 0 : elem.detail) === null || _b === void 0 ? void 0 : _b.opacity) >= 0 && ((_c = elem === null || elem === void 0 ? void 0 : elem.detail) === null || _c === void 0 ? void 0 : _c.opacity) <= 1) {
8
+ opacity = (_d = elem === null || elem === void 0 ? void 0 : elem.detail) === null || _d === void 0 ? void 0 : _d.opacity;
9
+ }
10
+ return opacity;
11
+ }
4
12
  export function drawBox(ctx, viewElem, opts) {
5
13
  const { pattern, renderContent, originElem, calcElemSize, viewScaleInfo, viewSizeInfo } = opts || {};
14
+ const { parentOpacity } = opts;
15
+ const opacity = getOpacity(originElem) * parentOpacity;
6
16
  drawClipPath(ctx, viewElem, {
7
17
  originElem,
8
18
  calcElemSize,
9
19
  viewScaleInfo,
10
20
  viewSizeInfo,
11
21
  renderContent: () => {
12
- var _a, _b;
13
- if (((_a = viewElem === null || viewElem === void 0 ? void 0 : viewElem.detail) === null || _a === void 0 ? void 0 : _a.opacity) !== undefined && ((_b = viewElem === null || viewElem === void 0 ? void 0 : viewElem.detail) === null || _b === void 0 ? void 0 : _b.opacity) >= 0) {
14
- ctx.globalAlpha = viewElem.detail.opacity;
15
- }
16
- else {
17
- ctx.globalAlpha = 1;
18
- }
22
+ ctx.globalAlpha = opacity;
19
23
  drawBoxBackground(ctx, viewElem, { pattern, viewScaleInfo, viewSizeInfo });
20
24
  renderContent === null || renderContent === void 0 ? void 0 : renderContent();
21
25
  drawBoxBorder(ctx, viewElem, { viewScaleInfo, viewSizeInfo });
22
- ctx.globalAlpha = 1;
26
+ ctx.globalAlpha = parentOpacity;
23
27
  }
24
28
  });
25
29
  }
26
30
  function drawClipPath(ctx, viewElem, opts) {
27
- const { renderContent, originElem, calcElemSize, viewScaleInfo, viewSizeInfo } = opts;
28
- const totalScale = viewScaleInfo.scale * viewSizeInfo.devicePixelRatio;
31
+ const { renderContent, originElem, calcElemSize, viewSizeInfo } = opts;
32
+ const totalScale = viewSizeInfo.devicePixelRatio;
29
33
  const { clipPath } = (originElem === null || originElem === void 0 ? void 0 : originElem.detail) || {};
30
34
  if (clipPath && calcElemSize && clipPath.commands) {
31
35
  const { x, y, w, h } = calcElemSize;
@@ -34,8 +38,8 @@ function drawClipPath(ctx, viewElem, opts) {
34
38
  const scaleH = h / originH;
35
39
  const viewOriginX = originX * scaleW;
36
40
  const viewOriginY = originY * scaleH;
37
- let internalX = x - viewOriginX;
38
- let internalY = y - viewOriginY;
41
+ const internalX = x - viewOriginX;
42
+ const internalY = y - viewOriginY;
39
43
  ctx.save();
40
44
  ctx.translate(internalX, internalY);
41
45
  ctx.scale(totalScale * scaleW, totalScale * scaleH);
@@ -56,11 +60,7 @@ function drawClipPath(ctx, viewElem, opts) {
56
60
  function drawBoxBackground(ctx, viewElem, opts) {
57
61
  var _a, _b;
58
62
  const { pattern, viewScaleInfo, viewSizeInfo } = opts;
59
- let transform = [];
60
- let { borderRadius, borderWidth } = viewElem.detail;
61
- if (typeof borderWidth !== 'number') {
62
- borderRadius = 0;
63
- }
63
+ const transform = [];
64
64
  if (viewElem.detail.background || pattern) {
65
65
  const { x, y, w, h, radiusList } = calcViewBoxSize(viewElem, {
66
66
  viewScaleInfo,
@@ -119,19 +119,12 @@ function drawBoxBackground(ctx, viewElem, opts) {
119
119
  }
120
120
  }
121
121
  function drawBoxBorder(ctx, viewElem, opts) {
122
- var _a, _b;
123
122
  if (viewElem.detail.borderWidth === 0) {
124
123
  return;
125
124
  }
126
125
  if (!isColorStr(viewElem.detail.borderColor)) {
127
126
  return;
128
127
  }
129
- if (((_a = viewElem === null || viewElem === void 0 ? void 0 : viewElem.detail) === null || _a === void 0 ? void 0 : _a.opacity) !== undefined && ((_b = viewElem === null || viewElem === void 0 ? void 0 : viewElem.detail) === null || _b === void 0 ? void 0 : _b.opacity) >= 0) {
130
- ctx.globalAlpha = viewElem.detail.opacity;
131
- }
132
- else {
133
- ctx.globalAlpha = 1;
134
- }
135
128
  const { viewScaleInfo } = opts;
136
129
  const { scale } = viewScaleInfo;
137
130
  let borderColor = defaultElemConfig.borderColor;
@@ -262,7 +255,6 @@ function drawBoxBorder(ctx, viewElem, opts) {
262
255
  ctx.arcTo(x, y, x + w, y, radiusList[0]);
263
256
  ctx.closePath();
264
257
  ctx.stroke();
265
- ctx.globalAlpha = 1;
266
258
  }
267
259
  ctx.setLineDash([]);
268
260
  }
@@ -1,49 +1,67 @@
1
1
  import { rotateElement } from '@idraw/util';
2
2
  import { createColorStyle } from './color';
3
- import { drawBoxShadow } from './box';
3
+ import { drawBoxShadow, getOpacity } from './box';
4
4
  export function drawCircle(ctx, elem, opts) {
5
5
  const { detail, angle } = elem;
6
- const { background = '#000000', borderColor = '#000000', borderWidth = 0 } = detail;
7
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
8
- const { x, y, w, h } = calculator.elementSize({ x: elem.x, y: elem.y, w: elem.w, h: elem.h }, viewScaleInfo, viewSizeInfo);
6
+ const { background = '#000000', borderColor = '#000000', boxSizing, borderWidth = 0 } = detail;
7
+ let bw = 0;
8
+ if (typeof borderWidth === 'number' && borderWidth > 0) {
9
+ bw = borderWidth;
10
+ }
11
+ else if (Array.isArray(borderWidth) && typeof borderWidth[0] === 'number' && borderWidth[0] > 0) {
12
+ bw = borderWidth[0];
13
+ }
14
+ const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
15
+ const { x, y, w, h } = (calculator === null || calculator === void 0 ? void 0 : calculator.elementSize({ x: elem.x, y: elem.y, w: elem.w, h: elem.h }, viewScaleInfo, viewSizeInfo)) || elem;
9
16
  const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
10
17
  rotateElement(ctx, { x, y, w, h, angle }, () => {
11
18
  drawBoxShadow(ctx, viewElem, {
12
19
  viewScaleInfo,
13
20
  viewSizeInfo,
14
21
  renderContent: () => {
15
- var _a, _b;
16
- const a = w / 2;
17
- const b = h / 2;
22
+ let a = w / 2;
23
+ let b = h / 2;
18
24
  const centerX = x + a;
19
25
  const centerY = y + b;
20
- if (((_a = elem === null || elem === void 0 ? void 0 : elem.detail) === null || _a === void 0 ? void 0 : _a.opacity) !== undefined && ((_b = elem === null || elem === void 0 ? void 0 : elem.detail) === null || _b === void 0 ? void 0 : _b.opacity) >= 0) {
21
- ctx.globalAlpha = elem.detail.opacity;
26
+ if (bw > 0) {
27
+ if (boxSizing === 'border-box') {
28
+ a = a - bw;
29
+ b = b - bw;
30
+ }
31
+ else if (boxSizing === 'center-line') {
32
+ a = a - bw / 2;
33
+ b = b - bw / 2;
34
+ }
35
+ else {
36
+ a = a - bw;
37
+ b = b - bw;
38
+ }
22
39
  }
23
- else {
24
- ctx.globalAlpha = 1;
25
- }
26
- if (typeof borderWidth === 'number' && borderWidth > 0) {
27
- const ba = borderWidth / 2 + a;
28
- const bb = borderWidth / 2 + b;
40
+ if (a >= 0 && b >= 0) {
41
+ const opacity = getOpacity(viewElem) * parentOpacity;
42
+ ctx.globalAlpha = opacity;
43
+ if (typeof borderWidth === 'number' && borderWidth > 0) {
44
+ const ba = borderWidth / 2 + a;
45
+ const bb = borderWidth / 2 + b;
46
+ ctx.beginPath();
47
+ ctx.strokeStyle = borderColor;
48
+ ctx.lineWidth = borderWidth;
49
+ ctx.circle(centerX, centerY, ba, bb, 0, 0, 2 * Math.PI);
50
+ ctx.closePath();
51
+ ctx.stroke();
52
+ }
29
53
  ctx.beginPath();
30
- ctx.strokeStyle = borderColor;
31
- ctx.lineWidth = borderWidth;
32
- ctx.circle(centerX, centerY, ba, bb, 0, 0, 2 * Math.PI);
54
+ const fillStyle = createColorStyle(ctx, background, {
55
+ viewElementSize: { x, y, w, h },
56
+ viewScaleInfo,
57
+ opacity: ctx.globalAlpha
58
+ });
59
+ ctx.fillStyle = fillStyle;
60
+ ctx.circle(centerX, centerY, a, b, 0, 0, 2 * Math.PI);
33
61
  ctx.closePath();
34
- ctx.stroke();
62
+ ctx.fill();
63
+ ctx.globalAlpha = parentOpacity;
35
64
  }
36
- ctx.beginPath();
37
- const fillStyle = createColorStyle(ctx, background, {
38
- viewElementSize: { x, y, w, h },
39
- viewScaleInfo,
40
- opacity: ctx.globalAlpha
41
- });
42
- ctx.fillStyle = fillStyle;
43
- ctx.circle(centerX, centerY, a, b, 0, 0, 2 * Math.PI);
44
- ctx.closePath();
45
- ctx.fill();
46
- ctx.globalAlpha = 1;
47
65
  }
48
66
  });
49
67
  });
@@ -2,17 +2,23 @@ import { getDefaultElementDetailConfig } from '@idraw/util';
2
2
  import { drawElement } from './group';
3
3
  const defaultDetail = getDefaultElementDetailConfig();
4
4
  export function drawElementList(ctx, data, opts) {
5
+ var _a;
5
6
  const { elements = [] } = data;
7
+ const { parentOpacity } = opts;
6
8
  for (let i = 0; i < elements.length; i++) {
7
9
  const element = elements[i];
8
10
  const elem = Object.assign(Object.assign({}, element), {
9
11
  detail: Object.assign(Object.assign({}, defaultDetail), element === null || element === void 0 ? void 0 : element.detail)
10
12
  });
11
- if (!opts.calculator.isElementInView(elem, opts.viewScaleInfo, opts.viewSizeInfo)) {
12
- continue;
13
+ if (opts.forceDrawAll !== true) {
14
+ if (!((_a = opts.calculator) === null || _a === void 0 ? void 0 : _a.isElementInView(elem, opts.viewScaleInfo, opts.viewSizeInfo))) {
15
+ continue;
16
+ }
13
17
  }
14
18
  try {
15
- drawElement(ctx, elem, opts);
19
+ drawElement(ctx, elem, Object.assign(Object.assign({}, opts), {
20
+ parentOpacity
21
+ }));
16
22
  }
17
23
  catch (err) {
18
24
  console.error(err);
@@ -5,13 +5,18 @@ import { drawImage } from './image';
5
5
  import { drawText } from './text';
6
6
  import { drawSVG } from './svg';
7
7
  import { drawHTML } from './html';
8
- import { drawBox, drawBoxShadow } from './box';
8
+ import { drawBox, drawBoxShadow, getOpacity } from './box';
9
9
  import { drawPath } from './path';
10
10
  export function drawElement(ctx, elem, opts) {
11
11
  var _a;
12
12
  if (((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.invisible) === true) {
13
13
  return;
14
14
  }
15
+ const { w, h } = elem;
16
+ const { scale } = opts.viewScaleInfo;
17
+ if ((scale < 1 && (w * scale < 1 || h * scale < 1)) || opts.parentOpacity === 0) {
18
+ return;
19
+ }
15
20
  try {
16
21
  switch (elem.type) {
17
22
  case 'rect': {
@@ -57,10 +62,11 @@ export function drawElement(ctx, elem, opts) {
57
62
  }
58
63
  }
59
64
  export function drawGroup(ctx, elem, opts) {
60
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
61
- const { x, y, w, h, angle } = calculator.elementSize({ x: elem.x, y: elem.y, w: elem.w, h: elem.h, angle: elem.angle }, viewScaleInfo, viewSizeInfo);
65
+ const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
66
+ const { x, y, w, h, angle } = (calculator === null || calculator === void 0 ? void 0 : calculator.elementSize({ x: elem.x, y: elem.y, w: elem.w, h: elem.h, angle: elem.angle }, viewScaleInfo, viewSizeInfo)) || elem;
62
67
  const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
63
68
  rotateElement(ctx, { x, y, w, h, angle }, () => {
69
+ ctx.globalAlpha = getOpacity(elem) * parentOpacity;
64
70
  drawBoxShadow(ctx, viewElem, {
65
71
  viewScaleInfo,
66
72
  viewSizeInfo,
@@ -70,6 +76,7 @@ export function drawGroup(ctx, elem, opts) {
70
76
  calcElemSize: { x, y, w, h, angle },
71
77
  viewScaleInfo,
72
78
  viewSizeInfo,
79
+ parentOpacity,
73
80
  renderContent: () => {
74
81
  const { x, y, w, h, radiusList } = calcViewBoxSize(viewElem, {
75
82
  viewScaleInfo,
@@ -104,11 +111,13 @@ export function drawGroup(ctx, elem, opts) {
104
111
  x: newParentSize.x + child.x,
105
112
  y: newParentSize.y + child.y
106
113
  });
107
- if (!calculator.isElementInView(child, opts.viewScaleInfo, opts.viewSizeInfo)) {
108
- continue;
114
+ if (opts.forceDrawAll !== true) {
115
+ if (!(calculator === null || calculator === void 0 ? void 0 : calculator.isElementInView(child, opts.viewScaleInfo, opts.viewSizeInfo))) {
116
+ continue;
117
+ }
109
118
  }
110
119
  try {
111
- drawElement(ctx, child, Object.assign({}, opts));
120
+ drawElement(ctx, child, Object.assign(Object.assign({}, opts), { parentOpacity: parentOpacity * getOpacity(elem) }));
112
121
  }
113
122
  catch (err) {
114
123
  console.error(err);
@@ -116,12 +125,12 @@ export function drawGroup(ctx, elem, opts) {
116
125
  }
117
126
  }
118
127
  if (elem.detail.overflow === 'hidden') {
119
- ctx.globalAlpha = 1;
120
128
  ctx.restore();
121
129
  }
122
130
  }
123
131
  });
124
132
  }
125
133
  });
134
+ ctx.globalAlpha = parentOpacity;
126
135
  });
127
136
  }
@@ -1,17 +1,17 @@
1
1
  import { rotateElement } from '@idraw/util';
2
+ import { getOpacity } from './box';
2
3
  export function drawHTML(ctx, elem, opts) {
3
4
  const content = opts.loader.getContent(elem);
4
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
5
- const { x, y, w, h, angle } = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
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;
6
7
  rotateElement(ctx, { x, y, w, h, angle }, () => {
7
8
  if (!content) {
8
9
  opts.loader.load(elem, opts.elementAssets || {});
9
10
  }
10
11
  if (elem.type === 'html' && content) {
11
- const { opacity } = elem.detail;
12
- ctx.globalAlpha = opacity ? opacity : 1;
12
+ ctx.globalAlpha = getOpacity(elem) * parentOpacity;
13
13
  ctx.drawImage(content, x, y, w, h);
14
- ctx.globalAlpha = 1;
14
+ ctx.globalAlpha = parentOpacity;
15
15
  }
16
16
  });
17
17
  }
@@ -1,9 +1,9 @@
1
1
  import { rotateElement, calcViewBoxSize } from '@idraw/util';
2
- import { drawBox, drawBoxShadow } from './box';
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 } = opts;
6
- const { x, y, w, h, angle } = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
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;
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, {
@@ -15,13 +15,13 @@ export function drawImage(ctx, elem, opts) {
15
15
  calcElemSize: { x, y, w, h, angle },
16
16
  viewScaleInfo,
17
17
  viewSizeInfo,
18
+ parentOpacity,
18
19
  renderContent: () => {
19
20
  if (!content) {
20
21
  opts.loader.load(elem, opts.elementAssets || {});
21
22
  }
22
23
  if (elem.type === 'image' && content) {
23
- const { opacity } = elem.detail;
24
- ctx.globalAlpha = opacity ? opacity : 1;
24
+ ctx.globalAlpha = getOpacity(elem) * parentOpacity;
25
25
  const { x, y, w, h, radiusList } = calcViewBoxSize(viewElem, {
26
26
  viewScaleInfo,
27
27
  viewSizeInfo
@@ -38,7 +38,7 @@ export function drawImage(ctx, elem, opts) {
38
38
  ctx.fill();
39
39
  ctx.clip();
40
40
  ctx.drawImage(content, x, y, w, h);
41
- ctx.globalAlpha = 1;
41
+ ctx.globalAlpha = parentOpacity;
42
42
  ctx.restore();
43
43
  }
44
44
  }
@@ -5,3 +5,4 @@ export { drawSVG } from './svg';
5
5
  export { drawHTML } from './html';
6
6
  export { drawText } from './text';
7
7
  export { drawElementList } from './elements';
8
+ export { drawUnderlay } from './underlay';
@@ -5,3 +5,4 @@ export { drawSVG } from './svg';
5
5
  export { drawHTML } from './html';
6
6
  export { drawText } from './text';
7
7
  export { drawElementList } from './elements';
8
+ export { drawUnderlay } from './underlay';
@@ -3,8 +3,8 @@ import { drawBox, drawBoxShadow } from './box';
3
3
  export function drawPath(ctx, elem, opts) {
4
4
  const { detail } = elem;
5
5
  const { originX, originY, originW, originH } = detail;
6
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
7
- const { x, y, w, h, angle } = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
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;
8
8
  const scaleW = w / originW;
9
9
  const scaleH = h / originH;
10
10
  const viewOriginX = originX * scaleW;
@@ -19,6 +19,7 @@ export function drawPath(ctx, elem, opts) {
19
19
  calcElemSize: { x, y, w, h, angle },
20
20
  viewScaleInfo,
21
21
  viewSizeInfo,
22
+ parentOpacity,
22
23
  renderContent: () => {
23
24
  drawBoxShadow(ctx, viewElem, {
24
25
  viewScaleInfo,
@@ -1,8 +1,8 @@
1
1
  import { rotateElement } from '@idraw/util';
2
2
  import { drawBox, drawBoxShadow } from './box';
3
3
  export function drawRect(ctx, elem, opts) {
4
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
5
- let { x, y, w, h, angle } = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
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;
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, {
@@ -14,6 +14,7 @@ export function drawRect(ctx, elem, opts) {
14
14
  calcElemSize: { x, y, w, h, angle },
15
15
  viewScaleInfo,
16
16
  viewSizeInfo,
17
+ parentOpacity,
17
18
  renderContent: () => {
18
19
  }
19
20
  });
@@ -1,17 +1,17 @@
1
1
  import { rotateElement } from '@idraw/util';
2
+ import { getOpacity } from './box';
2
3
  export function drawSVG(ctx, elem, opts) {
3
4
  const content = opts.loader.getContent(elem);
4
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
5
- const { x, y, w, h, angle } = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
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;
6
7
  rotateElement(ctx, { x, y, w, h, angle }, () => {
7
8
  if (!content) {
8
9
  opts.loader.load(elem, opts.elementAssets || {});
9
10
  }
10
11
  if (elem.type === 'svg' && content) {
11
- const { opacity } = elem.detail;
12
- ctx.globalAlpha = opacity ? opacity : 1;
12
+ ctx.globalAlpha = getOpacity(elem) * parentOpacity;
13
13
  ctx.drawImage(content, x, y, w, h);
14
- ctx.globalAlpha = 1;
14
+ ctx.globalAlpha = parentOpacity;
15
15
  }
16
16
  });
17
17
  }
@@ -3,8 +3,8 @@ import { is, isColorStr, getDefaultElementDetailConfig } from '@idraw/util';
3
3
  import { drawBox } from './box';
4
4
  const detailConfig = getDefaultElementDetailConfig();
5
5
  export function drawText(ctx, elem, opts) {
6
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
7
- const { x, y, w, h, angle } = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
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;
8
8
  const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
9
9
  rotateElement(ctx, { x, y, w, h, angle }, () => {
10
10
  drawBox(ctx, viewElem, {
@@ -12,6 +12,7 @@ export function drawText(ctx, elem, opts) {
12
12
  calcElemSize: { x, y, w, h, angle },
13
13
  viewScaleInfo,
14
14
  viewSizeInfo,
15
+ parentOpacity,
15
16
  renderContent: () => {
16
17
  const detail = Object.assign(Object.assign({}, detailConfig), elem.detail);
17
18
  const fontSize = (detail.fontSize || detailConfig.fontSize) * viewScaleInfo.scale;
@@ -0,0 +1,2 @@
1
+ import type { RendererDrawElementOptions, ViewContext2D, DataUnderlay } from '@idraw/types';
2
+ export declare function drawUnderlay(ctx: ViewContext2D, underlay: DataUnderlay, opts: RendererDrawElementOptions): void;
@@ -0,0 +1,23 @@
1
+ import { drawBox, drawBoxShadow } from './box';
2
+ export function drawUnderlay(ctx, underlay, opts) {
3
+ const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
4
+ const elem = Object.assign({ uuid: 'underlay' }, underlay);
5
+ const { x, y, w, h } = (calculator === null || calculator === void 0 ? void 0 : calculator.elementSize(elem, viewScaleInfo, viewSizeInfo)) || elem;
6
+ const angle = 0;
7
+ const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
8
+ drawBoxShadow(ctx, viewElem, {
9
+ viewScaleInfo,
10
+ viewSizeInfo,
11
+ renderContent: () => {
12
+ drawBox(ctx, viewElem, {
13
+ originElem: elem,
14
+ calcElemSize: { x, y, w, h, angle },
15
+ viewScaleInfo,
16
+ viewSizeInfo,
17
+ parentOpacity,
18
+ renderContent: () => {
19
+ }
20
+ });
21
+ }
22
+ });
23
+ }
@@ -1,11 +1,16 @@
1
1
  import { EventEmitter } from '@idraw/util';
2
+ import type { LoadItemMap } from '@idraw/types';
3
+ import { Loader } from './loader';
2
4
  import type { Data, BoardRenderer, RendererOptions, RendererEventMap, RendererDrawOptions } from '@idraw/types';
3
5
  export declare class Renderer extends EventEmitter<RendererEventMap> implements BoardRenderer {
4
- private _opts;
5
- private _loader;
6
+ #private;
6
7
  constructor(opts: RendererOptions);
7
- private _init;
8
+ destroy(): void;
8
9
  updateOptions(opts: RendererOptions): void;
9
10
  drawData(data: Data, opts: RendererDrawOptions): void;
10
11
  scale(num: number): void;
12
+ setLoadItemMap(itemMap: LoadItemMap): void;
13
+ getLoadItemMap(): LoadItemMap;
14
+ getLoader(): Loader;
11
15
  }
16
+ export { drawRect } from './draw';
package/dist/esm/index.js CHANGED
@@ -1,28 +1,39 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _Renderer_instances, _Renderer_opts, _Renderer_loader, _Renderer_init;
1
13
  import { EventEmitter } from '@idraw/util';
2
- import { drawElementList } from './draw/index';
14
+ import { drawElementList, drawUnderlay } from './draw/index';
3
15
  import { Loader } from './loader';
4
16
  export class Renderer extends EventEmitter {
5
17
  constructor(opts) {
6
18
  super();
7
- this._loader = new Loader();
8
- this._opts = opts;
9
- this._init();
10
- }
11
- _init() {
12
- const { _loader: loader } = this;
13
- loader.on('load', (e) => {
14
- this.trigger('load', e);
15
- });
16
- loader.on('error', () => {
17
- });
19
+ _Renderer_instances.add(this);
20
+ _Renderer_opts.set(this, void 0);
21
+ _Renderer_loader.set(this, new Loader());
22
+ __classPrivateFieldSet(this, _Renderer_opts, opts, "f");
23
+ __classPrivateFieldGet(this, _Renderer_instances, "m", _Renderer_init).call(this);
24
+ }
25
+ destroy() {
26
+ __classPrivateFieldSet(this, _Renderer_opts, null, "f");
27
+ __classPrivateFieldGet(this, _Renderer_loader, "f").destroy();
28
+ __classPrivateFieldSet(this, _Renderer_loader, null, "f");
18
29
  }
19
30
  updateOptions(opts) {
20
- this._opts = opts;
31
+ __classPrivateFieldSet(this, _Renderer_opts, opts, "f");
21
32
  }
22
33
  drawData(data, opts) {
23
- const { _loader: loader } = this;
24
- const { calculator } = this._opts;
25
- const { viewContext } = this._opts.viewContent;
34
+ const loader = __classPrivateFieldGet(this, _Renderer_loader, "f");
35
+ const { calculator } = __classPrivateFieldGet(this, _Renderer_opts, "f");
36
+ const viewContext = __classPrivateFieldGet(this, _Renderer_opts, "f").viewContext;
26
37
  viewContext.clearRect(0, 0, viewContext.canvas.width, viewContext.canvas.height);
27
38
  const parentElementSize = {
28
39
  x: 0,
@@ -30,12 +41,20 @@ export class Renderer extends EventEmitter {
30
41
  w: opts.viewSizeInfo.width,
31
42
  h: opts.viewSizeInfo.height
32
43
  };
44
+ if (data.underlay) {
45
+ drawUnderlay(viewContext, data.underlay, Object.assign({ loader,
46
+ calculator,
47
+ parentElementSize, parentOpacity: 1 }, opts));
48
+ }
33
49
  drawElementList(viewContext, data, Object.assign({ loader,
34
50
  calculator,
35
- parentElementSize, elementAssets: data.assets }, opts));
51
+ parentElementSize, elementAssets: data.assets, parentOpacity: 1 }, opts));
36
52
  }
37
53
  scale(num) {
38
- const { sharer } = this._opts;
54
+ const { sharer } = __classPrivateFieldGet(this, _Renderer_opts, "f");
55
+ if (!sharer) {
56
+ return;
57
+ }
39
58
  const { data, offsetTop, offsetBottom, offsetLeft, offsetRight, width, height, contextHeight, contextWidth, devicePixelRatio } = sharer.getActiveStoreSnapshot();
40
59
  if (data) {
41
60
  this.drawData(data, {
@@ -56,4 +75,22 @@ export class Renderer extends EventEmitter {
56
75
  });
57
76
  }
58
77
  }
78
+ setLoadItemMap(itemMap) {
79
+ __classPrivateFieldGet(this, _Renderer_loader, "f").setLoadItemMap(itemMap);
80
+ }
81
+ getLoadItemMap() {
82
+ return __classPrivateFieldGet(this, _Renderer_loader, "f").getLoadItemMap();
83
+ }
84
+ getLoader() {
85
+ return __classPrivateFieldGet(this, _Renderer_loader, "f");
86
+ }
59
87
  }
88
+ _Renderer_opts = new WeakMap(), _Renderer_loader = new WeakMap(), _Renderer_instances = new WeakSet(), _Renderer_init = function _Renderer_init() {
89
+ const loader = __classPrivateFieldGet(this, _Renderer_loader, "f");
90
+ loader.on('load', (e) => {
91
+ this.trigger('load', e);
92
+ });
93
+ loader.on('error', () => {
94
+ });
95
+ };
96
+ export { drawRect } from './draw';
@@ -1,17 +1,11 @@
1
- import type { RendererLoader, LoaderEventMap, LoadContent, LoadElementType, Element, ElementAssets } from '@idraw/types';
1
+ import type { RendererLoader, LoaderEventMap, LoadContent, LoadItemMap, LoadElementType, Element, ElementAssets } from '@idraw/types';
2
2
  import { EventEmitter } from '@idraw/util';
3
3
  export declare class Loader extends EventEmitter<LoaderEventMap> implements RendererLoader {
4
- private _loadFuncMap;
5
- private _currentLoadItemMap;
6
- private _storageLoadItemMap;
4
+ #private;
7
5
  constructor();
8
- private _registerLoadFunc;
9
- private _getLoadElementSource;
10
- private _createLoadItem;
11
- private _emitLoad;
12
- private _emitError;
13
- private _loadResource;
14
- private _isExistingErrorStorage;
6
+ destroy(): void;
15
7
  load(element: Element<LoadElementType>, assets: ElementAssets): void;
16
8
  getContent(element: Element<LoadElementType>): LoadContent | null;
9
+ getLoadItemMap(): LoadItemMap;
10
+ setLoadItemMap(itemMap: LoadItemMap): void;
17
11
  }