@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.
- package/dist/esm/draw/box.d.ts +4 -2
- package/dist/esm/draw/box.js +17 -25
- package/dist/esm/draw/circle.js +48 -30
- package/dist/esm/draw/elements.js +9 -3
- package/dist/esm/draw/group.js +16 -7
- package/dist/esm/draw/html.js +5 -5
- package/dist/esm/draw/image.js +6 -6
- package/dist/esm/draw/index.d.ts +1 -0
- package/dist/esm/draw/index.js +1 -0
- package/dist/esm/draw/path.js +3 -2
- package/dist/esm/draw/rect.js +3 -2
- package/dist/esm/draw/svg.js +5 -5
- package/dist/esm/draw/text.js +3 -2
- package/dist/esm/draw/underlay.d.ts +2 -0
- package/dist/esm/draw/underlay.js +23 -0
- package/dist/esm/index.d.ts +8 -3
- package/dist/esm/index.js +55 -18
- package/dist/esm/loader.d.ts +5 -11
- package/dist/esm/loader.js +117 -98
- package/dist/index.global.js +377 -202
- package/dist/index.global.min.js +1 -1
- package/package.json +3 -3
package/dist/esm/draw/box.d.ts
CHANGED
|
@@ -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:
|
|
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:
|
|
15
|
+
renderContent: () => void;
|
|
14
16
|
}): void;
|
package/dist/esm/draw/box.js
CHANGED
|
@@ -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
|
-
|
|
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 =
|
|
26
|
+
ctx.globalAlpha = parentOpacity;
|
|
23
27
|
}
|
|
24
28
|
});
|
|
25
29
|
}
|
|
26
30
|
function drawClipPath(ctx, viewElem, opts) {
|
|
27
|
-
const { renderContent, originElem, calcElemSize,
|
|
28
|
-
const totalScale =
|
|
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
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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
|
}
|
package/dist/esm/draw/circle.js
CHANGED
|
@@ -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
|
-
|
|
8
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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 (
|
|
21
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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.
|
|
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 (
|
|
12
|
-
|
|
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);
|
package/dist/esm/draw/group.js
CHANGED
|
@@ -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 (
|
|
108
|
-
|
|
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
|
}
|
package/dist/esm/draw/html.js
CHANGED
|
@@ -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
|
-
|
|
12
|
-
ctx.globalAlpha = opacity ? opacity : 1;
|
|
12
|
+
ctx.globalAlpha = getOpacity(elem) * parentOpacity;
|
|
13
13
|
ctx.drawImage(content, x, y, w, h);
|
|
14
|
-
ctx.globalAlpha =
|
|
14
|
+
ctx.globalAlpha = parentOpacity;
|
|
15
15
|
}
|
|
16
16
|
});
|
|
17
17
|
}
|
package/dist/esm/draw/image.js
CHANGED
|
@@ -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
|
-
|
|
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 =
|
|
41
|
+
ctx.globalAlpha = parentOpacity;
|
|
42
42
|
ctx.restore();
|
|
43
43
|
}
|
|
44
44
|
}
|
package/dist/esm/draw/index.d.ts
CHANGED
package/dist/esm/draw/index.js
CHANGED
package/dist/esm/draw/path.js
CHANGED
|
@@ -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,
|
package/dist/esm/draw/rect.js
CHANGED
|
@@ -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
|
-
|
|
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
|
});
|
package/dist/esm/draw/svg.js
CHANGED
|
@@ -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
|
-
|
|
12
|
-
ctx.globalAlpha = opacity ? opacity : 1;
|
|
12
|
+
ctx.globalAlpha = getOpacity(elem) * parentOpacity;
|
|
13
13
|
ctx.drawImage(content, x, y, w, h);
|
|
14
|
-
ctx.globalAlpha =
|
|
14
|
+
ctx.globalAlpha = parentOpacity;
|
|
15
15
|
}
|
|
16
16
|
});
|
|
17
17
|
}
|
package/dist/esm/draw/text.js
CHANGED
|
@@ -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,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
|
+
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -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
|
|
5
|
-
private _loader;
|
|
6
|
+
#private;
|
|
6
7
|
constructor(opts: RendererOptions);
|
|
7
|
-
|
|
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
|
-
|
|
8
|
-
this
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
31
|
+
__classPrivateFieldSet(this, _Renderer_opts, opts, "f");
|
|
21
32
|
}
|
|
22
33
|
drawData(data, opts) {
|
|
23
|
-
const
|
|
24
|
-
const { calculator } = this
|
|
25
|
-
const
|
|
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
|
|
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';
|
package/dist/esm/loader.d.ts
CHANGED
|
@@ -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
|
|
5
|
-
private _currentLoadItemMap;
|
|
6
|
-
private _storageLoadItemMap;
|
|
4
|
+
#private;
|
|
7
5
|
constructor();
|
|
8
|
-
|
|
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
|
}
|