@idraw/renderer 0.4.0-beta.3 → 0.4.0-beta.5

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,4 +1,5 @@
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;
@@ -6,6 +7,7 @@ export declare function drawBox(ctx: ViewContext2D, viewElem: Element<ElementTyp
6
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;
@@ -1,25 +1,29 @@
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
  }
@@ -57,11 +61,6 @@ function drawBoxBackground(ctx, viewElem, opts) {
57
61
  var _a, _b;
58
62
  const { pattern, viewScaleInfo, viewSizeInfo } = opts;
59
63
  const transform = [];
60
- let { borderRadius } = viewElem.detail;
61
- const { borderWidth } = viewElem.detail;
62
- if (typeof borderWidth !== 'number') {
63
- borderRadius = 0;
64
- }
65
64
  if (viewElem.detail.background || pattern) {
66
65
  const { x, y, w, h, radiusList } = calcViewBoxSize(viewElem, {
67
66
  viewScaleInfo,
@@ -120,19 +119,12 @@ function drawBoxBackground(ctx, viewElem, opts) {
120
119
  }
121
120
  }
122
121
  function drawBoxBorder(ctx, viewElem, opts) {
123
- var _a, _b;
124
122
  if (viewElem.detail.borderWidth === 0) {
125
123
  return;
126
124
  }
127
125
  if (!isColorStr(viewElem.detail.borderColor)) {
128
126
  return;
129
127
  }
130
- 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) {
131
- ctx.globalAlpha = viewElem.detail.opacity;
132
- }
133
- else {
134
- ctx.globalAlpha = 1;
135
- }
136
128
  const { viewScaleInfo } = opts;
137
129
  const { scale } = viewScaleInfo;
138
130
  let borderColor = defaultElemConfig.borderColor;
@@ -263,7 +255,6 @@ function drawBoxBorder(ctx, viewElem, opts) {
263
255
  ctx.arcTo(x, y, x + w, y, radiusList[0]);
264
256
  ctx.closePath();
265
257
  ctx.stroke();
266
- ctx.globalAlpha = 1;
267
258
  }
268
259
  ctx.setLineDash([]);
269
260
  }
@@ -1,10 +1,17 @@
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;
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;
8
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 }, () => {
@@ -12,17 +19,26 @@ export function drawCircle(ctx, elem, opts) {
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;
22
- }
23
- else {
24
- ctx.globalAlpha = 1;
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
+ }
25
39
  }
40
+ const opacity = getOpacity(viewElem) * parentOpacity;
41
+ ctx.globalAlpha = opacity;
26
42
  if (typeof borderWidth === 'number' && borderWidth > 0) {
27
43
  const ba = borderWidth / 2 + a;
28
44
  const bb = borderWidth / 2 + b;
@@ -43,7 +59,7 @@ export function drawCircle(ctx, elem, opts) {
43
59
  ctx.circle(centerX, centerY, a, b, 0, 0, 2 * Math.PI);
44
60
  ctx.closePath();
45
61
  ctx.fill();
46
- ctx.globalAlpha = 1;
62
+ ctx.globalAlpha = parentOpacity;
47
63
  }
48
64
  });
49
65
  });
@@ -4,6 +4,7 @@ const defaultDetail = getDefaultElementDetailConfig();
4
4
  export function drawElementList(ctx, data, opts) {
5
5
  var _a;
6
6
  const { elements = [] } = data;
7
+ const { parentOpacity } = opts;
7
8
  for (let i = 0; i < elements.length; i++) {
8
9
  const element = elements[i];
9
10
  const elem = Object.assign(Object.assign({}, element), {
@@ -15,7 +16,9 @@ export function drawElementList(ctx, data, opts) {
15
16
  }
16
17
  }
17
18
  try {
18
- drawElement(ctx, elem, opts);
19
+ drawElement(ctx, elem, Object.assign(Object.assign({}, opts), {
20
+ parentOpacity
21
+ }));
19
22
  }
20
23
  catch (err) {
21
24
  console.error(err);
@@ -5,7 +5,7 @@ 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;
@@ -57,10 +57,11 @@ export function drawElement(ctx, elem, opts) {
57
57
  }
58
58
  }
59
59
  export function drawGroup(ctx, elem, opts) {
60
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
60
+ const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
61
61
  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
62
  const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
63
63
  rotateElement(ctx, { x, y, w, h, angle }, () => {
64
+ ctx.globalAlpha = getOpacity(elem) * parentOpacity;
64
65
  drawBoxShadow(ctx, viewElem, {
65
66
  viewScaleInfo,
66
67
  viewSizeInfo,
@@ -70,6 +71,7 @@ export function drawGroup(ctx, elem, opts) {
70
71
  calcElemSize: { x, y, w, h, angle },
71
72
  viewScaleInfo,
72
73
  viewSizeInfo,
74
+ parentOpacity,
73
75
  renderContent: () => {
74
76
  const { x, y, w, h, radiusList } = calcViewBoxSize(viewElem, {
75
77
  viewScaleInfo,
@@ -110,7 +112,7 @@ export function drawGroup(ctx, elem, opts) {
110
112
  }
111
113
  }
112
114
  try {
113
- drawElement(ctx, child, Object.assign({}, opts));
115
+ drawElement(ctx, child, Object.assign(Object.assign({}, opts), { parentOpacity: parentOpacity * getOpacity(elem) }));
114
116
  }
115
117
  catch (err) {
116
118
  console.error(err);
@@ -118,12 +120,12 @@ export function drawGroup(ctx, elem, opts) {
118
120
  }
119
121
  }
120
122
  if (elem.detail.overflow === 'hidden') {
121
- ctx.globalAlpha = 1;
122
123
  ctx.restore();
123
124
  }
124
125
  }
125
126
  });
126
127
  }
127
128
  });
129
+ ctx.globalAlpha = parentOpacity;
128
130
  });
129
131
  }
@@ -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 { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
5
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,8 +1,8 @@
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;
5
+ const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
6
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 }, () => {
@@ -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
  }
@@ -3,7 +3,7 @@ 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;
6
+ const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
7
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;
@@ -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,7 +1,7 @@
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;
4
+ const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
5
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 }, () => {
@@ -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 { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
5
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,7 +3,7 @@ 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;
6
+ const { calculator, viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
7
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 }, () => {
@@ -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;
@@ -1,4 +1,5 @@
1
1
  import { EventEmitter } from '@idraw/util';
2
+ import type { LoadItemMap } from '@idraw/types';
2
3
  import type { Data, BoardRenderer, RendererOptions, RendererEventMap, RendererDrawOptions } from '@idraw/types';
3
4
  export declare class Renderer extends EventEmitter<RendererEventMap> implements BoardRenderer {
4
5
  #private;
@@ -6,4 +7,6 @@ export declare class Renderer extends EventEmitter<RendererEventMap> implements
6
7
  updateOptions(opts: RendererOptions): void;
7
8
  drawData(data: Data, opts: RendererDrawOptions): void;
8
9
  scale(num: number): void;
10
+ setLoadItemMap(itemMap: LoadItemMap): void;
11
+ getLoadItemMap(): LoadItemMap;
9
12
  }
package/dist/esm/index.js CHANGED
@@ -38,7 +38,7 @@ export class Renderer extends EventEmitter {
38
38
  };
39
39
  drawElementList(viewContext, data, Object.assign({ loader,
40
40
  calculator,
41
- parentElementSize, elementAssets: data.assets }, opts));
41
+ parentElementSize, elementAssets: data.assets, parentOpacity: 1 }, opts));
42
42
  }
43
43
  scale(num) {
44
44
  const { sharer } = __classPrivateFieldGet(this, _Renderer_opts, "f");
@@ -65,6 +65,12 @@ export class Renderer extends EventEmitter {
65
65
  });
66
66
  }
67
67
  }
68
+ setLoadItemMap(itemMap) {
69
+ __classPrivateFieldGet(this, _Renderer_loader, "f").setLoadItemMap(itemMap);
70
+ }
71
+ getLoadItemMap() {
72
+ return __classPrivateFieldGet(this, _Renderer_loader, "f").getLoadItemMap();
73
+ }
68
74
  }
69
75
  _Renderer_opts = new WeakMap(), _Renderer_loader = new WeakMap(), _Renderer_instances = new WeakSet(), _Renderer_init = function _Renderer_init() {
70
76
  const loader = __classPrivateFieldGet(this, _Renderer_loader, "f");
@@ -1,17 +1,10 @@
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;
15
6
  load(element: Element<LoadElementType>, assets: ElementAssets): void;
16
7
  getContent(element: Element<LoadElementType>): LoadContent | null;
8
+ getLoadItemMap(): LoadItemMap;
9
+ setLoadItemMap(itemMap: LoadItemMap): void;
17
10
  }