@leafer-ui/draw 1.6.4 → 1.6.6

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.
@@ -0,0 +1,2072 @@
1
+ import { defineKey, decorateLeafAttr, attr, Plugin, PathConvert, DataHelper, Debug, LeafData, canvasSizeAttrs, UICreator, dataProcessor, dataType, surfaceType, opacityType, visibleType, sortType, maskType, eraserType, positionType, boundsType, scaleType, rotationType, autoLayoutType, naturalBoundsType, pathInputType, pathType, hitType, strokeType, cursorType, rewrite, Leaf, useModule, rewriteAble, MathHelper, pen, PathCorner, PathDrawer, registerUI, Branch, LeafList, Resource, getBoundsData, Creator, CanvasManager, WaitHelper, LeaferEvent, Bounds, ResizeEvent, AutoBounds, Run, LayoutEvent, RenderEvent, WatchEvent, ImageManager, BoundsHelper, affectRenderBoundsType, PathCommandDataHelper, Platform, PointHelper, PathBounds, affectStrokeBoundsType, getPointData, LeaferImage, ImageEvent, Matrix, PathCreator } from '@leafer/core';
2
+ export * from '@leafer/core';
3
+
4
+ /******************************************************************************
5
+ Copyright (c) Microsoft Corporation.
6
+
7
+ Permission to use, copy, modify, and/or distribute this software for any
8
+ purpose with or without fee is hereby granted.
9
+
10
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
11
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
13
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
15
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16
+ PERFORMANCE OF THIS SOFTWARE.
17
+ ***************************************************************************** */
18
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
19
+
20
+
21
+ function __decorate(decorators, target, key, desc) {
22
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
23
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
24
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
25
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
26
+ }
27
+
28
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
29
+ var e = new Error(message);
30
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
31
+ };
32
+
33
+ function effectType(defaultValue) {
34
+ return decorateLeafAttr(defaultValue, (key) => attr({
35
+ set(value) {
36
+ this.__setAttr(key, value);
37
+ if (value)
38
+ this.__.__useEffect = true;
39
+ this.__layout.renderChanged || this.__layout.renderChange();
40
+ }
41
+ }));
42
+ }
43
+ function resizeType(defaultValue) {
44
+ return decorateLeafAttr(defaultValue, (key) => attr({
45
+ set(value) {
46
+ this.__setAttr(key, value);
47
+ this.__layout.boxChanged || this.__layout.boxChange();
48
+ this.__updateSize();
49
+ }
50
+ }));
51
+ }
52
+ function zoomLayerType() {
53
+ return (target, key) => {
54
+ const privateKey = '_' + key;
55
+ defineKey(target, key, {
56
+ set(value) { if (this.isLeafer)
57
+ this[privateKey] = value; },
58
+ get() {
59
+ return this.isApp
60
+ ? this.tree.zoomLayer
61
+ : (this.isLeafer ? (this[privateKey] || this) : this.leafer && this.leafer.zoomLayer);
62
+ }
63
+ });
64
+ };
65
+ }
66
+
67
+ function hasTransparent$1(color) {
68
+ if (!color || color.length === 7 || color.length === 4)
69
+ return false;
70
+ if (color === 'transparent')
71
+ return true;
72
+ const first = color[0];
73
+ if (first === '#') {
74
+ switch (color.length) {
75
+ case 5: return color[4] !== 'f' && color[4] !== 'F';
76
+ case 9: return (color[7] !== 'f' && color[7] !== 'F') || (color[8] !== 'f' && color[8] !== 'F');
77
+ }
78
+ }
79
+ else if (first === 'r' || first === 'h') {
80
+ if (color[3] === 'a') {
81
+ const i = color.lastIndexOf(',');
82
+ if (i > -1)
83
+ return parseFloat(color.slice(i + 1)) < 1;
84
+ }
85
+ }
86
+ return false;
87
+ }
88
+
89
+ const TextConvert = {};
90
+ const ColorConvert = {
91
+ hasTransparent: hasTransparent$1
92
+ };
93
+ const UnitConvert = {
94
+ number(value, percentRefer) {
95
+ return typeof value === 'object' ? (value.type === 'percent' ? value.value * percentRefer : value.value) : value;
96
+ }
97
+ };
98
+ const PathArrow = {};
99
+ const Paint = {};
100
+ const PaintImage = {};
101
+ const PaintGradient = {};
102
+ const Effect = {};
103
+ const Filter = {
104
+ apply() { Plugin.need('filter'); }
105
+ };
106
+ const Export = {};
107
+ const State = {
108
+ setStyleName() { return Plugin.need('state'); },
109
+ set() { return Plugin.need('state'); }
110
+ };
111
+ const Transition = {
112
+ list: {},
113
+ register(attrName, fn) { Transition.list[attrName] = fn; },
114
+ get(attrName) { return Transition.list[attrName]; }
115
+ };
116
+
117
+ const { parse, objectToCanvasData } = PathConvert;
118
+ const { stintSet: stintSet$1 } = DataHelper, { hasTransparent } = ColorConvert;
119
+ const emptyPaint = {};
120
+ const debug$1 = Debug.get('UIData');
121
+ class UIData extends LeafData {
122
+ get scale() { const { scaleX, scaleY } = this; return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX; }
123
+ get __strokeWidth() {
124
+ const { strokeWidth, strokeWidthFixed } = this;
125
+ if (strokeWidthFixed) {
126
+ const ui = this.__leaf;
127
+ let { scaleX } = ui.__nowWorld || ui.__world;
128
+ if (scaleX < 0)
129
+ scaleX = -scaleX;
130
+ return scaleX > 1 ? strokeWidth / scaleX : strokeWidth;
131
+ }
132
+ else
133
+ return strokeWidth;
134
+ }
135
+ get __hasStroke() { return this.stroke && this.strokeWidth; }
136
+ get __hasHalf() { const t = this; return (t.stroke && t.strokeAlign === 'center' && t.strokeWidth % 2) || undefined; }
137
+ get __hasMultiPaint() {
138
+ const t = this;
139
+ if ((t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect)
140
+ return true;
141
+ return t.fill && this.__hasStroke;
142
+ }
143
+ get __clipAfterFill() { const t = this; return (t.cornerRadius || t.innerShadow || t.__pathInputed); }
144
+ get __hasSurface() { const t = this; return (t.fill || t.stroke); }
145
+ get __autoWidth() { return !this._width; }
146
+ get __autoHeight() { return !this._height; }
147
+ get __autoSide() { return !this._width || !this._height; }
148
+ get __autoSize() { return !this._width && !this._height; }
149
+ setVisible(value) {
150
+ this._visible = value;
151
+ const { leafer } = this.__leaf;
152
+ if (leafer)
153
+ leafer.watcher.hasVisible = true;
154
+ }
155
+ setWidth(value) {
156
+ if (value < 0) {
157
+ this._width = -value;
158
+ this.__leaf.scaleX *= -1;
159
+ debug$1.warn('width < 0, instead -scaleX ', this);
160
+ }
161
+ else
162
+ this._width = value;
163
+ }
164
+ setHeight(value) {
165
+ if (value < 0) {
166
+ this._height = -value;
167
+ this.__leaf.scaleY *= -1;
168
+ debug$1.warn('height < 0, instead -scaleY', this);
169
+ }
170
+ else
171
+ this._height = value;
172
+ }
173
+ setFill(value) {
174
+ if (this.__naturalWidth)
175
+ this.__removeNaturalSize();
176
+ if (typeof value === 'string' || !value) {
177
+ stintSet$1(this, '__isTransparentFill', hasTransparent(value));
178
+ this.__isFills && this.__removePaint('fill', true);
179
+ this._fill = value;
180
+ }
181
+ else if (typeof value === 'object') {
182
+ this.__setPaint('fill', value);
183
+ }
184
+ }
185
+ setStroke(value) {
186
+ if (typeof value === 'string' || !value) {
187
+ stintSet$1(this, '__isTransparentStroke', hasTransparent(value));
188
+ this.__isStrokes && this.__removePaint('stroke', true);
189
+ this._stroke = value;
190
+ }
191
+ else if (typeof value === 'object') {
192
+ this.__setPaint('stroke', value);
193
+ }
194
+ }
195
+ setPath(value) {
196
+ const isString = typeof value === 'string';
197
+ if (isString || (value && typeof value[0] === 'object')) {
198
+ this.__setInput('path', value);
199
+ this._path = isString ? parse(value) : objectToCanvasData(value);
200
+ }
201
+ else {
202
+ if (this.__input)
203
+ this.__removeInput('path');
204
+ this._path = value;
205
+ }
206
+ }
207
+ setShadow(value) {
208
+ setArray(this, 'shadow', value);
209
+ }
210
+ setInnerShadow(value) {
211
+ setArray(this, 'innerShadow', value);
212
+ }
213
+ setFilter(value) {
214
+ setArray(this, 'filter', value);
215
+ }
216
+ __computePaint() {
217
+ const { fill, stroke } = this.__input;
218
+ if (fill)
219
+ Paint.compute('fill', this.__leaf);
220
+ if (stroke)
221
+ Paint.compute('stroke', this.__leaf);
222
+ this.__needComputePaint = undefined;
223
+ }
224
+ __setPaint(attrName, value) {
225
+ this.__setInput(attrName, value);
226
+ const layout = this.__leaf.__layout;
227
+ layout.boxChanged || layout.boxChange();
228
+ if (value instanceof Array && !value.length) {
229
+ this.__removePaint(attrName);
230
+ }
231
+ else {
232
+ if (attrName === 'fill')
233
+ this.__isFills = true, this._fill || (this._fill = emptyPaint);
234
+ else
235
+ this.__isStrokes = true, this._stroke || (this._stroke = emptyPaint);
236
+ }
237
+ }
238
+ __removePaint(attrName, removeInput) {
239
+ if (removeInput)
240
+ this.__removeInput(attrName);
241
+ PaintImage.recycleImage(attrName, this);
242
+ if (attrName === 'fill') {
243
+ stintSet$1(this, '__isAlphaPixelFill', undefined);
244
+ this._fill = this.__isFills = undefined;
245
+ }
246
+ else {
247
+ stintSet$1(this, '__isAlphaPixelStroke', undefined);
248
+ this._stroke = this.__isStrokes = undefined;
249
+ }
250
+ }
251
+ }
252
+ function setArray(data, key, value) {
253
+ data.__setInput(key, value);
254
+ if (value instanceof Array) {
255
+ if (value.some((item) => item.visible === false))
256
+ value = value.filter((item) => item.visible !== false);
257
+ value.length || (value = undefined);
258
+ }
259
+ else
260
+ value = value && value.visible !== false ? [value] : undefined;
261
+ data['_' + key] = value;
262
+ }
263
+
264
+ class GroupData extends UIData {
265
+ }
266
+
267
+ class BoxData extends GroupData {
268
+ get __boxStroke() { return !this.__pathInputed; }
269
+ get __drawAfterFill() { const t = this; return (t.overflow === 'hide' && (t.__clipAfterFill || t.innerShadow) && t.__leaf.children.length); }
270
+ get __clipAfterFill() { return this.__leaf.isOverflow || super.__clipAfterFill; }
271
+ }
272
+
273
+ class LeaferData extends GroupData {
274
+ __getInputData(names, options) {
275
+ const data = super.__getInputData(names, options);
276
+ canvasSizeAttrs.forEach(key => delete data[key]);
277
+ return data;
278
+ }
279
+ }
280
+
281
+ class FrameData extends BoxData {
282
+ }
283
+
284
+ class LineData extends UIData {
285
+ }
286
+
287
+ class RectData extends UIData {
288
+ get __boxStroke() { return !this.__pathInputed; }
289
+ }
290
+
291
+ class EllipseData extends UIData {
292
+ get __boxStroke() { return !this.__pathInputed; }
293
+ }
294
+
295
+ class PolygonData extends UIData {
296
+ }
297
+
298
+ class StarData extends UIData {
299
+ }
300
+
301
+ class PathData extends UIData {
302
+ get __pathInputed() { return 2; }
303
+ }
304
+
305
+ class PenData extends GroupData {
306
+ }
307
+
308
+ const fontWeightMap = {
309
+ 'thin': 100,
310
+ 'extra-light': 200,
311
+ 'light': 300,
312
+ 'normal': 400,
313
+ 'medium': 500,
314
+ 'semi-bold': 600,
315
+ 'bold': 700,
316
+ 'extra-bold': 800,
317
+ 'black': 900
318
+ };
319
+ class TextData extends UIData {
320
+ get __useNaturalRatio() { return false; }
321
+ setFontWeight(value) {
322
+ if (typeof value === 'string') {
323
+ this.__setInput('fontWeight', value);
324
+ value = fontWeightMap[value] || 400;
325
+ }
326
+ else if (this.__input)
327
+ this.__removeInput('fontWeight');
328
+ this._fontWeight = value;
329
+ }
330
+ setBoxStyle(value) {
331
+ let t = this.__leaf, box = t.__box;
332
+ if (value) {
333
+ const { boxStyle } = this;
334
+ if (box)
335
+ for (let key in boxStyle)
336
+ box[key] = undefined;
337
+ else
338
+ box = t.__box = UICreator.get('Rect', 0);
339
+ const layout = t.__layout, boxLayout = box.__layout;
340
+ if (!boxStyle)
341
+ box.parent = t, box.__world = t.__world, boxLayout.boxBounds = layout.boxBounds;
342
+ box.set(value);
343
+ if (boxLayout.strokeChanged)
344
+ layout.strokeChange();
345
+ if (boxLayout.renderChanged)
346
+ layout.renderChange();
347
+ box.__updateChange();
348
+ }
349
+ else if (box) {
350
+ t.__box = box.parent = null;
351
+ box.destroy();
352
+ }
353
+ this._boxStyle = value;
354
+ }
355
+ }
356
+
357
+ class ImageData extends RectData {
358
+ setUrl(value) {
359
+ this.__setImageFill(value);
360
+ this._url = value;
361
+ }
362
+ __setImageFill(value) {
363
+ this.fill = value ? { type: 'image', mode: 'stretch', url: value } : undefined;
364
+ }
365
+ __getData() {
366
+ const data = super.__getData();
367
+ delete data.fill;
368
+ return data;
369
+ }
370
+ __getInputData(names, options) {
371
+ const data = super.__getInputData(names, options);
372
+ delete data.fill;
373
+ return data;
374
+ }
375
+ }
376
+
377
+ class CanvasData extends RectData {
378
+ get __isCanvas() { return true; }
379
+ get __drawAfterFill() { return true; }
380
+ __getInputData(names, options) {
381
+ const data = super.__getInputData(names, options);
382
+ data.url = this.__leaf.canvas.toDataURL('image/png');
383
+ return data;
384
+ }
385
+ }
386
+
387
+ const UIBounds = {
388
+ __updateStrokeSpread() {
389
+ let width = 0, boxWidth = 0;
390
+ const data = this.__, { strokeAlign, strokeWidth } = data, box = this.__box;
391
+ if ((data.stroke || data.hitStroke === 'all') && strokeWidth && strokeAlign !== 'inside') {
392
+ boxWidth = width = strokeAlign === 'center' ? strokeWidth / 2 : strokeWidth;
393
+ if (!data.__boxStroke) {
394
+ const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * width;
395
+ const storkeCapAddWidth = data.strokeCap === 'none' ? 0 : strokeWidth;
396
+ width += Math.max(miterLimitAddWidth, storkeCapAddWidth);
397
+ }
398
+ }
399
+ if (data.__useArrow)
400
+ width += strokeWidth * 5;
401
+ if (box) {
402
+ width = Math.max(box.__layout.strokeSpread = box.__updateStrokeSpread(), width);
403
+ boxWidth = box.__layout.strokeBoxSpread;
404
+ }
405
+ this.__layout.strokeBoxSpread = boxWidth;
406
+ return width;
407
+ },
408
+ __updateRenderSpread() {
409
+ let width = 0;
410
+ const { shadow, innerShadow, blur, backgroundBlur, filter } = this.__;
411
+ if (shadow)
412
+ shadow.forEach(item => width = Math.max(width, Math.max(Math.abs(item.y), Math.abs(item.x)) + (item.spread > 0 ? item.spread : 0) + item.blur * 1.5));
413
+ if (blur)
414
+ width = Math.max(width, blur);
415
+ if (filter)
416
+ width += Filter.getSpread(filter);
417
+ let shapeWidth = width = Math.ceil(width);
418
+ if (innerShadow)
419
+ innerShadow.forEach(item => shapeWidth = Math.max(shapeWidth, Math.max(Math.abs(item.y), Math.abs(item.x)) + (item.spread < 0 ? -item.spread : 0) + item.blur * 1.5));
420
+ if (backgroundBlur)
421
+ shapeWidth = Math.max(shapeWidth, backgroundBlur);
422
+ this.__layout.renderShapeSpread = shapeWidth;
423
+ width += this.__layout.strokeSpread || 0;
424
+ return this.__box ? Math.max(this.__box.__updateRenderSpread(), width) : width;
425
+ }
426
+ };
427
+
428
+ const { stintSet } = DataHelper;
429
+ const UIRender = {
430
+ __updateChange() {
431
+ const data = this.__;
432
+ if (data.__useEffect) {
433
+ const { shadow, fill, stroke } = data, otherEffect = data.innerShadow || data.blur || data.backgroundBlur || data.filter;
434
+ stintSet(data, '__isFastShadow', shadow && !otherEffect && shadow.length < 2 && !shadow[0].spread && !(shadow[0].box && data.__isTransparentFill) && fill && !(fill instanceof Array && fill.length > 1) && (this.useFastShadow || !stroke || (stroke && data.strokeAlign === 'inside')));
435
+ data.__useEffect = !!(shadow || otherEffect);
436
+ }
437
+ stintSet(this.__world, 'half', data.__hasHalf);
438
+ stintSet(data, '__fillAfterStroke', data.stroke && data.strokeAlign === 'outside' && data.fill && !data.__isTransparentFill);
439
+ data.__checkSingle();
440
+ stintSet(data, '__complex', data.__isFills || data.__isStrokes || data.cornerRadius || data.__useEffect);
441
+ },
442
+ __drawFast(canvas, options) {
443
+ drawFast(this, canvas, options);
444
+ },
445
+ __draw(canvas, options, originCanvas) {
446
+ const data = this.__;
447
+ if (data.__complex) {
448
+ if (data.__needComputePaint)
449
+ data.__computePaint();
450
+ const { fill, stroke, __drawAfterFill, __fillAfterStroke, __isFastShadow } = data;
451
+ this.__drawRenderPath(canvas);
452
+ if (data.__useEffect && !__isFastShadow) {
453
+ const shape = Paint.shape(this, canvas, options);
454
+ this.__nowWorld = this.__getNowWorld(options);
455
+ const { shadow, innerShadow, filter } = data;
456
+ if (shadow)
457
+ Effect.shadow(this, canvas, shape);
458
+ if (__fillAfterStroke)
459
+ data.__isStrokes ? Paint.strokes(stroke, this, canvas) : Paint.stroke(stroke, this, canvas);
460
+ if (fill)
461
+ data.__isFills ? Paint.fills(fill, this, canvas) : Paint.fill(fill, this, canvas);
462
+ if (__drawAfterFill)
463
+ this.__drawAfterFill(canvas, options);
464
+ if (innerShadow)
465
+ Effect.innerShadow(this, canvas, shape);
466
+ if (stroke && !__fillAfterStroke)
467
+ data.__isStrokes ? Paint.strokes(stroke, this, canvas) : Paint.stroke(stroke, this, canvas);
468
+ if (filter)
469
+ Filter.apply(filter, this, this.__nowWorld, canvas, originCanvas, shape);
470
+ if (shape.worldCanvas)
471
+ shape.worldCanvas.recycle();
472
+ shape.canvas.recycle();
473
+ }
474
+ else {
475
+ if (__fillAfterStroke)
476
+ data.__isStrokes ? Paint.strokes(stroke, this, canvas) : Paint.stroke(stroke, this, canvas);
477
+ if (__isFastShadow) {
478
+ const shadow = data.shadow[0], { scaleX, scaleY } = this.__nowWorld;
479
+ canvas.save(), canvas.setWorldShadow(shadow.x * scaleX, shadow.y * scaleY, shadow.blur * scaleX, ColorConvert.string(shadow.color));
480
+ }
481
+ if (fill)
482
+ data.__isFills ? Paint.fills(fill, this, canvas) : Paint.fill(fill, this, canvas);
483
+ if (__isFastShadow)
484
+ canvas.restore();
485
+ if (__drawAfterFill)
486
+ this.__drawAfterFill(canvas, options);
487
+ if (stroke && !__fillAfterStroke)
488
+ data.__isStrokes ? Paint.strokes(stroke, this, canvas) : Paint.stroke(stroke, this, canvas);
489
+ }
490
+ }
491
+ else {
492
+ if (data.__pathInputed)
493
+ drawFast(this, canvas, options);
494
+ else
495
+ this.__drawFast(canvas, options);
496
+ }
497
+ },
498
+ __renderShape(canvas, options, ignoreFill, ignoreStroke) {
499
+ if (this.__worldOpacity) {
500
+ canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
501
+ const { fill, stroke } = this.__;
502
+ this.__drawRenderPath(canvas);
503
+ if (fill && !ignoreFill)
504
+ this.__.__isAlphaPixelFill ? Paint.fills(fill, this, canvas) : Paint.fill('#000000', this, canvas);
505
+ if (this.__.__isCanvas)
506
+ this.__drawAfterFill(canvas, options);
507
+ if (stroke && !ignoreStroke)
508
+ this.__.__isAlphaPixelStroke ? Paint.strokes(stroke, this, canvas) : Paint.stroke('#000000', this, canvas);
509
+ }
510
+ },
511
+ __drawAfterFill(canvas, options) {
512
+ if (this.__.__clipAfterFill) {
513
+ canvas.save();
514
+ canvas.clipUI(this);
515
+ this.__drawContent(canvas, options);
516
+ canvas.restore();
517
+ }
518
+ else
519
+ this.__drawContent(canvas, options);
520
+ }
521
+ };
522
+ function drawFast(ui, canvas, options) {
523
+ const { fill, stroke, __drawAfterFill, __fillAfterStroke } = ui.__;
524
+ ui.__drawRenderPath(canvas);
525
+ if (__fillAfterStroke)
526
+ Paint.stroke(stroke, ui, canvas);
527
+ if (fill)
528
+ Paint.fill(fill, ui, canvas);
529
+ if (__drawAfterFill)
530
+ ui.__drawAfterFill(canvas, options);
531
+ if (stroke && !__fillAfterStroke)
532
+ Paint.stroke(stroke, ui, canvas);
533
+ }
534
+
535
+ const RectRender = {
536
+ __drawFast(canvas, options) {
537
+ let { x, y, width, height } = this.__layout.boxBounds;
538
+ const { fill, stroke, __drawAfterFill } = this.__;
539
+ if (fill) {
540
+ canvas.fillStyle = fill;
541
+ canvas.fillRect(x, y, width, height);
542
+ }
543
+ if (__drawAfterFill)
544
+ this.__drawAfterFill(canvas, options);
545
+ if (stroke) {
546
+ const { strokeAlign, __strokeWidth } = this.__;
547
+ if (!__strokeWidth)
548
+ return;
549
+ canvas.setStroke(stroke, __strokeWidth, this.__);
550
+ const half = __strokeWidth / 2;
551
+ switch (strokeAlign) {
552
+ case 'center':
553
+ canvas.strokeRect(0, 0, width, height);
554
+ break;
555
+ case 'inside':
556
+ width -= __strokeWidth, height -= __strokeWidth;
557
+ if (width < 0 || height < 0) {
558
+ canvas.save();
559
+ this.__clip(canvas, options);
560
+ canvas.strokeRect(x + half, y + half, width, height);
561
+ canvas.restore();
562
+ }
563
+ else
564
+ canvas.strokeRect(x + half, y + half, width, height);
565
+ break;
566
+ case 'outside':
567
+ canvas.strokeRect(x - half, y - half, width + __strokeWidth, height + __strokeWidth);
568
+ break;
569
+ }
570
+ }
571
+ }
572
+ };
573
+
574
+ var UI_1;
575
+ let UI = UI_1 = class UI extends Leaf {
576
+ get app() { return this.leafer && this.leafer.app; }
577
+ get isFrame() { return false; }
578
+ set scale(value) { MathHelper.assignScale(this, value); }
579
+ get scale() { return this.__.scale; }
580
+ get pen() {
581
+ const { path } = this.__;
582
+ pen.set(this.path = path || []);
583
+ if (!path)
584
+ this.__drawPathByBox(pen);
585
+ return pen;
586
+ }
587
+ constructor(data) {
588
+ super(data);
589
+ }
590
+ reset(_data) { }
591
+ set(data, transition) {
592
+ if (data) {
593
+ if (transition) {
594
+ if (transition === 'temp') {
595
+ this.lockNormalStyle = true;
596
+ Object.assign(this, data);
597
+ this.lockNormalStyle = false;
598
+ }
599
+ else
600
+ this.animate(data, transition);
601
+ }
602
+ else
603
+ Object.assign(this, data);
604
+ }
605
+ }
606
+ get(name) {
607
+ return typeof name === 'string' ? this.__.__getInput(name) : this.__.__getInputData(name);
608
+ }
609
+ createProxyData() { return undefined; }
610
+ find(_condition, _options) { return Plugin.need('find'); }
611
+ findTag(tag) { return this.find({ tag }); }
612
+ findOne(_condition, _options) { return Plugin.need('find'); }
613
+ findId(id) { return this.findOne({ id }); }
614
+ getPath(curve, pathForRender) {
615
+ this.__layout.update();
616
+ let path = pathForRender ? this.__.__pathForRender : this.__.path;
617
+ if (!path)
618
+ pen.set(path = []), this.__drawPathByBox(pen);
619
+ return curve ? PathConvert.toCanvasData(path, true) : path;
620
+ }
621
+ getPathString(curve, pathForRender, floatLength) {
622
+ return PathConvert.stringify(this.getPath(curve, pathForRender), floatLength);
623
+ }
624
+ load() {
625
+ this.__.__computePaint();
626
+ }
627
+ __onUpdateSize() {
628
+ if (this.__.__input) {
629
+ const data = this.__;
630
+ (data.lazy && !this.__inLazyBounds && !Export.running) ? data.__needComputePaint = true : data.__computePaint();
631
+ }
632
+ }
633
+ __updateRenderPath() {
634
+ if (this.__.path) {
635
+ const data = this.__;
636
+ data.__pathForRender = data.cornerRadius ? PathCorner.smooth(data.path, data.cornerRadius, data.cornerSmoothing) : data.path;
637
+ if (data.__useArrow)
638
+ PathArrow.addArrows(this, !data.cornerRadius);
639
+ }
640
+ }
641
+ __drawRenderPath(canvas) {
642
+ canvas.beginPath();
643
+ this.__drawPathByData(canvas, this.__.__pathForRender);
644
+ }
645
+ __drawPath(canvas) {
646
+ canvas.beginPath();
647
+ this.__drawPathByData(canvas, this.__.path);
648
+ }
649
+ __drawPathByData(drawer, data) {
650
+ data ? PathDrawer.drawPathByData(drawer, data) : this.__drawPathByBox(drawer);
651
+ }
652
+ __drawPathByBox(drawer) {
653
+ const { x, y, width, height } = this.__layout.boxBounds;
654
+ if (this.__.cornerRadius) {
655
+ const { cornerRadius } = this.__;
656
+ drawer.roundRect(x, y, width, height, typeof cornerRadius === 'number' ? [cornerRadius] : cornerRadius);
657
+ }
658
+ else
659
+ drawer.rect(x, y, width, height);
660
+ }
661
+ drawImagePlaceholder(canvas, _image) {
662
+ Paint.fill(this.__.placeholderColor, this, canvas);
663
+ }
664
+ animate(_keyframe, _options, _type, _isTemp) {
665
+ return Plugin.need('animate');
666
+ }
667
+ killAnimate(_type, _nextStyle) { }
668
+ export(_filename, _options) {
669
+ return Plugin.need('export');
670
+ }
671
+ syncExport(_filename, _options) {
672
+ return Plugin.need('export');
673
+ }
674
+ clone(data) {
675
+ const json = DataHelper.clone(this.toJSON());
676
+ if (data)
677
+ Object.assign(json, data);
678
+ return UI_1.one(json);
679
+ }
680
+ static one(data, x, y, width, height) {
681
+ return UICreator.get(data.tag || this.prototype.__tag, data, x, y, width, height);
682
+ }
683
+ static registerUI() {
684
+ registerUI()(this);
685
+ }
686
+ static registerData(data) {
687
+ dataProcessor(data)(this.prototype);
688
+ }
689
+ static setEditConfig(_config) { }
690
+ static setEditOuter(_toolName) { }
691
+ static setEditInner(_editorName) { }
692
+ destroy() {
693
+ this.fill = this.stroke = null;
694
+ if (this.__animate)
695
+ this.killAnimate();
696
+ super.destroy();
697
+ }
698
+ };
699
+ __decorate([
700
+ dataProcessor(UIData)
701
+ ], UI.prototype, "__", void 0);
702
+ __decorate([
703
+ zoomLayerType()
704
+ ], UI.prototype, "zoomLayer", void 0);
705
+ __decorate([
706
+ dataType('')
707
+ ], UI.prototype, "id", void 0);
708
+ __decorate([
709
+ dataType('')
710
+ ], UI.prototype, "name", void 0);
711
+ __decorate([
712
+ dataType('')
713
+ ], UI.prototype, "className", void 0);
714
+ __decorate([
715
+ surfaceType('pass-through')
716
+ ], UI.prototype, "blendMode", void 0);
717
+ __decorate([
718
+ opacityType(1)
719
+ ], UI.prototype, "opacity", void 0);
720
+ __decorate([
721
+ visibleType(true)
722
+ ], UI.prototype, "visible", void 0);
723
+ __decorate([
724
+ surfaceType(false)
725
+ ], UI.prototype, "locked", void 0);
726
+ __decorate([
727
+ surfaceType(false)
728
+ ], UI.prototype, "dim", void 0);
729
+ __decorate([
730
+ surfaceType(false)
731
+ ], UI.prototype, "dimskip", void 0);
732
+ __decorate([
733
+ sortType(0)
734
+ ], UI.prototype, "zIndex", void 0);
735
+ __decorate([
736
+ maskType(false)
737
+ ], UI.prototype, "mask", void 0);
738
+ __decorate([
739
+ eraserType(false)
740
+ ], UI.prototype, "eraser", void 0);
741
+ __decorate([
742
+ positionType(0, true)
743
+ ], UI.prototype, "x", void 0);
744
+ __decorate([
745
+ positionType(0, true)
746
+ ], UI.prototype, "y", void 0);
747
+ __decorate([
748
+ boundsType(100, true)
749
+ ], UI.prototype, "width", void 0);
750
+ __decorate([
751
+ boundsType(100, true)
752
+ ], UI.prototype, "height", void 0);
753
+ __decorate([
754
+ scaleType(1, true)
755
+ ], UI.prototype, "scaleX", void 0);
756
+ __decorate([
757
+ scaleType(1, true)
758
+ ], UI.prototype, "scaleY", void 0);
759
+ __decorate([
760
+ rotationType(0, true)
761
+ ], UI.prototype, "rotation", void 0);
762
+ __decorate([
763
+ rotationType(0, true)
764
+ ], UI.prototype, "skewX", void 0);
765
+ __decorate([
766
+ rotationType(0, true)
767
+ ], UI.prototype, "skewY", void 0);
768
+ __decorate([
769
+ positionType(0, true)
770
+ ], UI.prototype, "offsetX", void 0);
771
+ __decorate([
772
+ positionType(0, true)
773
+ ], UI.prototype, "offsetY", void 0);
774
+ __decorate([
775
+ positionType(0, true)
776
+ ], UI.prototype, "scrollX", void 0);
777
+ __decorate([
778
+ positionType(0, true)
779
+ ], UI.prototype, "scrollY", void 0);
780
+ __decorate([
781
+ autoLayoutType()
782
+ ], UI.prototype, "origin", void 0);
783
+ __decorate([
784
+ autoLayoutType()
785
+ ], UI.prototype, "around", void 0);
786
+ __decorate([
787
+ dataType(false)
788
+ ], UI.prototype, "lazy", void 0);
789
+ __decorate([
790
+ naturalBoundsType(1)
791
+ ], UI.prototype, "pixelRatio", void 0);
792
+ __decorate([
793
+ pathInputType()
794
+ ], UI.prototype, "path", void 0);
795
+ __decorate([
796
+ pathType()
797
+ ], UI.prototype, "windingRule", void 0);
798
+ __decorate([
799
+ pathType(true)
800
+ ], UI.prototype, "closed", void 0);
801
+ __decorate([
802
+ boundsType(0)
803
+ ], UI.prototype, "padding", void 0);
804
+ __decorate([
805
+ boundsType(false)
806
+ ], UI.prototype, "lockRatio", void 0);
807
+ __decorate([
808
+ boundsType()
809
+ ], UI.prototype, "widthRange", void 0);
810
+ __decorate([
811
+ boundsType()
812
+ ], UI.prototype, "heightRange", void 0);
813
+ __decorate([
814
+ dataType(false)
815
+ ], UI.prototype, "draggable", void 0);
816
+ __decorate([
817
+ dataType()
818
+ ], UI.prototype, "dragBounds", void 0);
819
+ __decorate([
820
+ dataType(false)
821
+ ], UI.prototype, "editable", void 0);
822
+ __decorate([
823
+ hitType(true)
824
+ ], UI.prototype, "hittable", void 0);
825
+ __decorate([
826
+ hitType('path')
827
+ ], UI.prototype, "hitFill", void 0);
828
+ __decorate([
829
+ strokeType('path')
830
+ ], UI.prototype, "hitStroke", void 0);
831
+ __decorate([
832
+ hitType(false)
833
+ ], UI.prototype, "hitBox", void 0);
834
+ __decorate([
835
+ hitType(true)
836
+ ], UI.prototype, "hitChildren", void 0);
837
+ __decorate([
838
+ hitType(true)
839
+ ], UI.prototype, "hitSelf", void 0);
840
+ __decorate([
841
+ hitType()
842
+ ], UI.prototype, "hitRadius", void 0);
843
+ __decorate([
844
+ cursorType('')
845
+ ], UI.prototype, "cursor", void 0);
846
+ __decorate([
847
+ surfaceType()
848
+ ], UI.prototype, "fill", void 0);
849
+ __decorate([
850
+ strokeType()
851
+ ], UI.prototype, "stroke", void 0);
852
+ __decorate([
853
+ strokeType('inside')
854
+ ], UI.prototype, "strokeAlign", void 0);
855
+ __decorate([
856
+ strokeType(1)
857
+ ], UI.prototype, "strokeWidth", void 0);
858
+ __decorate([
859
+ strokeType(false)
860
+ ], UI.prototype, "strokeWidthFixed", void 0);
861
+ __decorate([
862
+ strokeType('none')
863
+ ], UI.prototype, "strokeCap", void 0);
864
+ __decorate([
865
+ strokeType('miter')
866
+ ], UI.prototype, "strokeJoin", void 0);
867
+ __decorate([
868
+ strokeType()
869
+ ], UI.prototype, "dashPattern", void 0);
870
+ __decorate([
871
+ strokeType(0)
872
+ ], UI.prototype, "dashOffset", void 0);
873
+ __decorate([
874
+ strokeType(10)
875
+ ], UI.prototype, "miterLimit", void 0);
876
+ __decorate([
877
+ pathType(0)
878
+ ], UI.prototype, "cornerRadius", void 0);
879
+ __decorate([
880
+ pathType()
881
+ ], UI.prototype, "cornerSmoothing", void 0);
882
+ __decorate([
883
+ effectType()
884
+ ], UI.prototype, "shadow", void 0);
885
+ __decorate([
886
+ effectType()
887
+ ], UI.prototype, "innerShadow", void 0);
888
+ __decorate([
889
+ effectType()
890
+ ], UI.prototype, "blur", void 0);
891
+ __decorate([
892
+ effectType()
893
+ ], UI.prototype, "backgroundBlur", void 0);
894
+ __decorate([
895
+ effectType()
896
+ ], UI.prototype, "grayscale", void 0);
897
+ __decorate([
898
+ effectType()
899
+ ], UI.prototype, "filter", void 0);
900
+ __decorate([
901
+ surfaceType()
902
+ ], UI.prototype, "placeholderColor", void 0);
903
+ __decorate([
904
+ dataType(100)
905
+ ], UI.prototype, "placeholderDelay", void 0);
906
+ __decorate([
907
+ dataType({})
908
+ ], UI.prototype, "data", void 0);
909
+ __decorate([
910
+ rewrite(Leaf.prototype.reset)
911
+ ], UI.prototype, "reset", null);
912
+ UI = UI_1 = __decorate([
913
+ useModule(UIBounds),
914
+ useModule(UIRender),
915
+ rewriteAble()
916
+ ], UI);
917
+
918
+ let Group = class Group extends UI {
919
+ get __tag() { return 'Group'; }
920
+ get isBranch() { return true; }
921
+ constructor(data) {
922
+ super(data);
923
+ }
924
+ reset(data) {
925
+ this.__setBranch();
926
+ super.reset(data);
927
+ }
928
+ __setBranch() {
929
+ if (!this.children)
930
+ this.children = [];
931
+ }
932
+ set(data, transition) {
933
+ if (data) {
934
+ if (data.children) {
935
+ const { children } = data;
936
+ delete data.children;
937
+ this.children ? this.clear() : this.__setBranch();
938
+ super.set(data, transition);
939
+ children.forEach(child => this.add(child));
940
+ data.children = children;
941
+ }
942
+ else
943
+ super.set(data, transition);
944
+ }
945
+ }
946
+ toJSON(options) {
947
+ const data = super.toJSON(options);
948
+ data.children = this.children.map(child => child.toJSON(options));
949
+ return data;
950
+ }
951
+ pick(_hitPoint, _options) { return undefined; }
952
+ addAt(child, index) {
953
+ this.add(child, index);
954
+ }
955
+ addAfter(child, after) {
956
+ this.add(child, this.children.indexOf(after) + 1);
957
+ }
958
+ addBefore(child, before) {
959
+ this.add(child, this.children.indexOf(before));
960
+ }
961
+ add(_child, _index) { }
962
+ addMany(..._children) { }
963
+ remove(_child, _destroy) { }
964
+ removeAll(_destroy) { }
965
+ clear() { }
966
+ };
967
+ __decorate([
968
+ dataProcessor(GroupData)
969
+ ], Group.prototype, "__", void 0);
970
+ __decorate([
971
+ boundsType(0)
972
+ ], Group.prototype, "width", void 0);
973
+ __decorate([
974
+ boundsType(0)
975
+ ], Group.prototype, "height", void 0);
976
+ Group = __decorate([
977
+ useModule(Branch),
978
+ registerUI()
979
+ ], Group);
980
+
981
+ var Leafer_1;
982
+ const debug = Debug.get('Leafer');
983
+ let Leafer = Leafer_1 = class Leafer extends Group {
984
+ get __tag() { return 'Leafer'; }
985
+ get isApp() { return false; }
986
+ get app() { return this.parent || this; }
987
+ get isLeafer() { return true; }
988
+ get imageReady() { return this.viewReady && Resource.isComplete; }
989
+ get layoutLocked() { return !this.layouter.running; }
990
+ get FPS() { return this.renderer ? this.renderer.FPS : 60; }
991
+ get cursorPoint() { return (this.interaction && this.interaction.hoverData) || { x: this.width / 2, y: this.height / 2 }; }
992
+ get clientBounds() { return (this.canvas && this.canvas.getClientBounds(true)) || getBoundsData(); }
993
+ constructor(userConfig, data) {
994
+ super(data);
995
+ this.config = {
996
+ start: true,
997
+ hittable: true,
998
+ smooth: true,
999
+ lazySpeard: 100,
1000
+ };
1001
+ this.leafs = 0;
1002
+ this.__eventIds = [];
1003
+ this.__controllers = [];
1004
+ this.__readyWait = [];
1005
+ this.__viewReadyWait = [];
1006
+ this.__viewCompletedWait = [];
1007
+ this.__nextRenderWait = [];
1008
+ this.userConfig = userConfig;
1009
+ if (userConfig && (userConfig.view || userConfig.width))
1010
+ this.init(userConfig);
1011
+ Leafer_1.list.add(this);
1012
+ }
1013
+ init(userConfig, parentApp) {
1014
+ if (this.canvas)
1015
+ return;
1016
+ let start;
1017
+ const { config } = this;
1018
+ this.__setLeafer(this);
1019
+ if (parentApp) {
1020
+ this.parentApp = parentApp;
1021
+ this.__bindApp(parentApp);
1022
+ start = parentApp.running;
1023
+ }
1024
+ if (userConfig) {
1025
+ this.parent = parentApp;
1026
+ this.initType(userConfig.type);
1027
+ this.parent = undefined;
1028
+ DataHelper.assign(config, userConfig);
1029
+ }
1030
+ const canvas = this.canvas = Creator.canvas(config);
1031
+ this.__controllers.push(this.renderer = Creator.renderer(this, canvas, config), this.watcher = Creator.watcher(this, config), this.layouter = Creator.layouter(this, config));
1032
+ if (this.isApp)
1033
+ this.__setApp();
1034
+ this.__checkAutoLayout(config, parentApp);
1035
+ this.view = canvas.view;
1036
+ if (!parentApp) {
1037
+ this.selector = Creator.selector(this);
1038
+ this.interaction = Creator.interaction(this, canvas, this.selector, config);
1039
+ if (this.interaction) {
1040
+ this.__controllers.unshift(this.interaction);
1041
+ this.hitCanvasManager = Creator.hitCanvasManager();
1042
+ }
1043
+ this.canvasManager = new CanvasManager();
1044
+ start = config.start;
1045
+ }
1046
+ this.hittable = config.hittable;
1047
+ this.fill = config.fill;
1048
+ this.canvasManager.add(canvas);
1049
+ this.__listenEvents();
1050
+ if (start)
1051
+ this.__startTimer = setTimeout(this.start.bind(this));
1052
+ WaitHelper.run(this.__initWait);
1053
+ this.onInit();
1054
+ }
1055
+ onInit() { }
1056
+ initType(_type) { }
1057
+ set(data, transition) {
1058
+ this.waitInit(() => { super.set(data, transition); });
1059
+ }
1060
+ start() {
1061
+ clearTimeout(this.__startTimer);
1062
+ if (!this.running && this.canvas) {
1063
+ this.running = true;
1064
+ this.ready ? this.emitLeafer(LeaferEvent.RESTART) : this.emitLeafer(LeaferEvent.START);
1065
+ this.__controllers.forEach(item => item.start());
1066
+ if (!this.isApp)
1067
+ this.renderer.render();
1068
+ }
1069
+ }
1070
+ stop() {
1071
+ clearTimeout(this.__startTimer);
1072
+ if (this.running && this.canvas) {
1073
+ this.__controllers.forEach(item => item.stop());
1074
+ this.running = false;
1075
+ this.emitLeafer(LeaferEvent.STOP);
1076
+ }
1077
+ }
1078
+ unlockLayout() {
1079
+ this.layouter.start();
1080
+ this.updateLayout();
1081
+ }
1082
+ lockLayout() {
1083
+ this.updateLayout();
1084
+ this.layouter.stop();
1085
+ }
1086
+ resize(size) {
1087
+ const data = DataHelper.copyAttrs({}, size, canvasSizeAttrs);
1088
+ Object.keys(data).forEach(key => this[key] = data[key]);
1089
+ }
1090
+ forceRender(bounds, sync) {
1091
+ const { renderer } = this;
1092
+ if (renderer) {
1093
+ renderer.addBlock(bounds ? new Bounds(bounds) : this.canvas.bounds);
1094
+ if (this.viewReady)
1095
+ sync ? renderer.render() : renderer.update();
1096
+ }
1097
+ }
1098
+ requestRender(change = false) {
1099
+ if (this.renderer)
1100
+ this.renderer.update(change);
1101
+ }
1102
+ updateCursor(cursor) {
1103
+ const i = this.interaction;
1104
+ if (i)
1105
+ cursor ? i.setCursor(cursor) : i.updateCursor();
1106
+ }
1107
+ updateLazyBounds() {
1108
+ this.lazyBounds = this.canvas.bounds.clone().spread(this.config.lazySpeard);
1109
+ }
1110
+ __doResize(size) {
1111
+ const { canvas } = this;
1112
+ if (!canvas || canvas.isSameSize(size))
1113
+ return;
1114
+ const old = DataHelper.copyAttrs({}, this.canvas, canvasSizeAttrs);
1115
+ canvas.resize(size);
1116
+ this.updateLazyBounds();
1117
+ this.__onResize(new ResizeEvent(size, old));
1118
+ }
1119
+ __onResize(event) {
1120
+ this.emitEvent(event);
1121
+ DataHelper.copyAttrs(this.__, event, canvasSizeAttrs);
1122
+ setTimeout(() => { if (this.canvasManager)
1123
+ this.canvasManager.clearRecycled(); }, 0);
1124
+ }
1125
+ __setApp() { }
1126
+ __bindApp(app) {
1127
+ this.selector = app.selector;
1128
+ this.interaction = app.interaction;
1129
+ this.canvasManager = app.canvasManager;
1130
+ this.hitCanvasManager = app.hitCanvasManager;
1131
+ }
1132
+ __setLeafer(leafer) {
1133
+ this.leafer = leafer;
1134
+ this.__level = 1;
1135
+ }
1136
+ __checkAutoLayout(config, parentApp) {
1137
+ if (!parentApp) {
1138
+ if (!config.width || !config.height)
1139
+ this.autoLayout = new AutoBounds(config);
1140
+ this.canvas.startAutoLayout(this.autoLayout, this.__onResize.bind(this));
1141
+ }
1142
+ }
1143
+ __setAttr(attrName, newValue) {
1144
+ if (this.canvas) {
1145
+ if (canvasSizeAttrs.includes(attrName)) {
1146
+ this.__changeCanvasSize(attrName, newValue);
1147
+ }
1148
+ else if (attrName === 'fill') {
1149
+ this.__changeFill(newValue);
1150
+ }
1151
+ else if (attrName === 'hittable') {
1152
+ if (!this.parent)
1153
+ this.canvas.hittable = newValue;
1154
+ }
1155
+ else if (attrName === 'zIndex') {
1156
+ this.canvas.zIndex = newValue;
1157
+ setTimeout(() => this.parent && this.parent.__updateSortChildren());
1158
+ }
1159
+ }
1160
+ return super.__setAttr(attrName, newValue);
1161
+ }
1162
+ __getAttr(attrName) {
1163
+ if (this.canvas && canvasSizeAttrs.includes(attrName))
1164
+ return this.canvas[attrName];
1165
+ return super.__getAttr(attrName);
1166
+ }
1167
+ __changeCanvasSize(attrName, newValue) {
1168
+ const data = DataHelper.copyAttrs({}, this.canvas, canvasSizeAttrs);
1169
+ data[attrName] = this.config[attrName] = newValue;
1170
+ if (newValue)
1171
+ this.canvas.stopAutoLayout();
1172
+ this.__doResize(data);
1173
+ }
1174
+ __changeFill(newValue) {
1175
+ this.config.fill = newValue;
1176
+ if (this.canvas.allowBackgroundColor)
1177
+ this.canvas.backgroundColor = newValue;
1178
+ else
1179
+ this.forceRender();
1180
+ }
1181
+ __onCreated() {
1182
+ this.created = true;
1183
+ }
1184
+ __onReady() {
1185
+ this.ready = true;
1186
+ this.emitLeafer(LeaferEvent.BEFORE_READY);
1187
+ this.emitLeafer(LeaferEvent.READY);
1188
+ this.emitLeafer(LeaferEvent.AFTER_READY);
1189
+ WaitHelper.run(this.__readyWait);
1190
+ }
1191
+ __onViewReady() {
1192
+ if (this.viewReady)
1193
+ return;
1194
+ this.viewReady = true;
1195
+ this.emitLeafer(LeaferEvent.VIEW_READY);
1196
+ WaitHelper.run(this.__viewReadyWait);
1197
+ }
1198
+ __onLayoutEnd() {
1199
+ const { grow, width: fixedWidth, height: fixedHeight } = this.config;
1200
+ if (grow) {
1201
+ let { width, height, pixelRatio } = this;
1202
+ const bounds = grow === 'box' ? this.worldBoxBounds : this.__world;
1203
+ if (!fixedWidth)
1204
+ width = Math.max(1, bounds.x + bounds.width);
1205
+ if (!fixedHeight)
1206
+ height = Math.max(1, bounds.y + bounds.height);
1207
+ this.__doResize({ width, height, pixelRatio });
1208
+ }
1209
+ if (!this.ready)
1210
+ this.__onReady();
1211
+ }
1212
+ __onNextRender() {
1213
+ if (this.viewReady) {
1214
+ WaitHelper.run(this.__nextRenderWait);
1215
+ const { imageReady } = this;
1216
+ if (imageReady && !this.viewCompleted)
1217
+ this.__checkViewCompleted();
1218
+ if (!imageReady) {
1219
+ this.viewCompleted = false;
1220
+ this.requestRender();
1221
+ }
1222
+ }
1223
+ else
1224
+ this.requestRender();
1225
+ }
1226
+ __checkViewCompleted(emit = true) {
1227
+ this.nextRender(() => {
1228
+ if (this.imageReady) {
1229
+ if (emit)
1230
+ this.emitLeafer(LeaferEvent.VIEW_COMPLETED);
1231
+ WaitHelper.run(this.__viewCompletedWait);
1232
+ this.viewCompleted = true;
1233
+ }
1234
+ });
1235
+ }
1236
+ __onWatchData() {
1237
+ if (this.watcher.childrenChanged && this.interaction) {
1238
+ this.nextRender(() => this.interaction.updateCursor());
1239
+ }
1240
+ }
1241
+ waitInit(item, bind) {
1242
+ if (bind)
1243
+ item = item.bind(bind);
1244
+ if (!this.__initWait)
1245
+ this.__initWait = [];
1246
+ this.canvas ? item() : this.__initWait.push(item);
1247
+ }
1248
+ waitReady(item, bind) {
1249
+ if (bind)
1250
+ item = item.bind(bind);
1251
+ this.ready ? item() : this.__readyWait.push(item);
1252
+ }
1253
+ waitViewReady(item, bind) {
1254
+ if (bind)
1255
+ item = item.bind(bind);
1256
+ this.viewReady ? item() : this.__viewReadyWait.push(item);
1257
+ }
1258
+ waitViewCompleted(item, bind) {
1259
+ if (bind)
1260
+ item = item.bind(bind);
1261
+ this.__viewCompletedWait.push(item);
1262
+ if (this.viewCompleted)
1263
+ this.__checkViewCompleted(false);
1264
+ else if (!this.running)
1265
+ this.start();
1266
+ }
1267
+ nextRender(item, bind, off) {
1268
+ if (bind)
1269
+ item = item.bind(bind);
1270
+ const list = this.__nextRenderWait;
1271
+ if (off) {
1272
+ for (let i = 0; i < list.length; i++) {
1273
+ if (list[i] === item) {
1274
+ list.splice(i, 1);
1275
+ break;
1276
+ }
1277
+ }
1278
+ }
1279
+ else
1280
+ list.push(item);
1281
+ this.requestRender();
1282
+ }
1283
+ zoom(_zoomType, _padding, _fixedScale, _transition) {
1284
+ return Plugin.need('view');
1285
+ }
1286
+ getValidMove(moveX, moveY) { return { x: moveX, y: moveY }; }
1287
+ getValidScale(changeScale) { return changeScale; }
1288
+ getWorldPointByClient(clientPoint, updateClient) {
1289
+ return this.interaction && this.interaction.getLocal(clientPoint, updateClient);
1290
+ }
1291
+ getPagePointByClient(clientPoint, updateClient) {
1292
+ return this.getPagePoint(this.getWorldPointByClient(clientPoint, updateClient));
1293
+ }
1294
+ getClientPointByWorld(worldPoint) {
1295
+ const { x, y } = this.clientBounds;
1296
+ return { x: x + worldPoint.x, y: y + worldPoint.y };
1297
+ }
1298
+ updateClientBounds() {
1299
+ this.canvas && this.canvas.updateClientBounds();
1300
+ }
1301
+ receiveEvent(_event) { }
1302
+ emitLeafer(type) {
1303
+ this.emitEvent(new LeaferEvent(type, this));
1304
+ }
1305
+ __listenEvents() {
1306
+ const runId = Run.start('FirstCreate ' + this.innerName);
1307
+ this.once([
1308
+ [LeaferEvent.START, () => Run.end(runId)],
1309
+ [LayoutEvent.START, this.updateLazyBounds, this],
1310
+ [RenderEvent.START, this.__onCreated, this],
1311
+ [RenderEvent.END, this.__onViewReady, this]
1312
+ ]);
1313
+ this.__eventIds.push(this.on_([
1314
+ [WatchEvent.DATA, this.__onWatchData, this],
1315
+ [LayoutEvent.END, this.__onLayoutEnd, this],
1316
+ [RenderEvent.NEXT, this.__onNextRender, this]
1317
+ ]));
1318
+ }
1319
+ __removeListenEvents() {
1320
+ this.off_(this.__eventIds);
1321
+ }
1322
+ destroy(sync) {
1323
+ const doDestory = () => {
1324
+ if (!this.destroyed) {
1325
+ Leafer_1.list.remove(this);
1326
+ try {
1327
+ this.stop();
1328
+ this.emitEvent(new LeaferEvent(LeaferEvent.END, this));
1329
+ this.__removeListenEvents();
1330
+ this.__controllers.forEach(item => !(this.parent && item === this.interaction) && item.destroy());
1331
+ this.__controllers.length = 0;
1332
+ if (!this.parent) {
1333
+ if (this.selector)
1334
+ this.selector.destroy();
1335
+ if (this.hitCanvasManager)
1336
+ this.hitCanvasManager.destroy();
1337
+ this.canvasManager.destroy();
1338
+ }
1339
+ this.canvas.destroy();
1340
+ this.config.view = this.view = this.parentApp = null;
1341
+ if (this.userConfig)
1342
+ this.userConfig.view = null;
1343
+ super.destroy();
1344
+ setTimeout(() => { ImageManager.clearRecycled(); }, 100);
1345
+ }
1346
+ catch (e) {
1347
+ debug.error(e);
1348
+ }
1349
+ }
1350
+ };
1351
+ sync ? doDestory() : setTimeout(doDestory);
1352
+ }
1353
+ };
1354
+ Leafer.list = new LeafList();
1355
+ __decorate([
1356
+ dataProcessor(LeaferData)
1357
+ ], Leafer.prototype, "__", void 0);
1358
+ __decorate([
1359
+ boundsType()
1360
+ ], Leafer.prototype, "pixelRatio", void 0);
1361
+ Leafer = Leafer_1 = __decorate([
1362
+ registerUI()
1363
+ ], Leafer);
1364
+
1365
+ let Rect = class Rect extends UI {
1366
+ get __tag() { return 'Rect'; }
1367
+ constructor(data) {
1368
+ super(data);
1369
+ }
1370
+ };
1371
+ __decorate([
1372
+ dataProcessor(RectData)
1373
+ ], Rect.prototype, "__", void 0);
1374
+ Rect = __decorate([
1375
+ useModule(RectRender),
1376
+ rewriteAble(),
1377
+ registerUI()
1378
+ ], Rect);
1379
+
1380
+ const { copy, add, includes: includes$1 } = BoundsHelper;
1381
+ const rect = Rect.prototype, group = Group.prototype;
1382
+ const childrenRenderBounds = {};
1383
+ let Box = class Box extends Group {
1384
+ get __tag() { return 'Box'; }
1385
+ get isBranchLeaf() { return true; }
1386
+ constructor(data) {
1387
+ super(data);
1388
+ this.__layout.renderChanged || this.__layout.renderChange();
1389
+ }
1390
+ __updateStrokeSpread() { return 0; }
1391
+ __updateRectRenderSpread() { return 0; }
1392
+ __updateRenderSpread() { return this.__updateRectRenderSpread() || -1; }
1393
+ __updateRectBoxBounds() { }
1394
+ __updateBoxBounds(_secondLayout) {
1395
+ const data = this.__;
1396
+ if (this.children.length && !this.pathInputed) {
1397
+ if (data.__autoSide) {
1398
+ if (data.__hasSurface)
1399
+ this.__extraUpdate();
1400
+ super.__updateBoxBounds();
1401
+ const { boxBounds } = this.__layout;
1402
+ if (!data.__autoSize) {
1403
+ if (data.__autoWidth) {
1404
+ boxBounds.width += boxBounds.x, boxBounds.x = 0;
1405
+ boxBounds.height = data.height, boxBounds.y = 0;
1406
+ }
1407
+ else {
1408
+ boxBounds.height += boxBounds.y, boxBounds.y = 0;
1409
+ boxBounds.width = data.width, boxBounds.x = 0;
1410
+ }
1411
+ }
1412
+ this.__updateNaturalSize();
1413
+ }
1414
+ else
1415
+ this.__updateRectBoxBounds();
1416
+ }
1417
+ else
1418
+ this.__updateRectBoxBounds();
1419
+ }
1420
+ __updateStrokeBounds() { }
1421
+ __updateRenderBounds() {
1422
+ let isOverflow;
1423
+ const { renderBounds } = this.__layout;
1424
+ if (this.children.length) {
1425
+ super.__updateRenderBounds();
1426
+ copy(childrenRenderBounds, renderBounds);
1427
+ this.__updateRectRenderBounds();
1428
+ isOverflow = !includes$1(renderBounds, childrenRenderBounds);
1429
+ if (isOverflow && this.__.overflow !== 'hide')
1430
+ add(renderBounds, childrenRenderBounds);
1431
+ }
1432
+ else
1433
+ this.__updateRectRenderBounds();
1434
+ DataHelper.stintSet(this, 'isOverflow', isOverflow);
1435
+ }
1436
+ __updateRectRenderBounds() { }
1437
+ __updateRectChange() { }
1438
+ __updateChange() {
1439
+ super.__updateChange();
1440
+ this.__updateRectChange();
1441
+ }
1442
+ __renderRect(_canvas, _options) { }
1443
+ __renderGroup(_canvas, _options) { }
1444
+ __render(canvas, options) {
1445
+ if (this.__.__drawAfterFill) {
1446
+ this.__renderRect(canvas, options);
1447
+ }
1448
+ else {
1449
+ this.__renderRect(canvas, options);
1450
+ if (this.children.length)
1451
+ this.__renderGroup(canvas, options);
1452
+ }
1453
+ }
1454
+ __drawContent(canvas, options) {
1455
+ this.__renderGroup(canvas, options);
1456
+ if (this.__.__hasStroke) {
1457
+ canvas.setWorld(this.__nowWorld);
1458
+ this.__drawRenderPath(canvas);
1459
+ }
1460
+ }
1461
+ };
1462
+ __decorate([
1463
+ dataProcessor(BoxData)
1464
+ ], Box.prototype, "__", void 0);
1465
+ __decorate([
1466
+ boundsType(100)
1467
+ ], Box.prototype, "width", void 0);
1468
+ __decorate([
1469
+ boundsType(100)
1470
+ ], Box.prototype, "height", void 0);
1471
+ __decorate([
1472
+ dataType(false)
1473
+ ], Box.prototype, "resizeChildren", void 0);
1474
+ __decorate([
1475
+ affectRenderBoundsType('show')
1476
+ ], Box.prototype, "overflow", void 0);
1477
+ __decorate([
1478
+ rewrite(rect.__updateStrokeSpread)
1479
+ ], Box.prototype, "__updateStrokeSpread", null);
1480
+ __decorate([
1481
+ rewrite(rect.__updateRenderSpread)
1482
+ ], Box.prototype, "__updateRectRenderSpread", null);
1483
+ __decorate([
1484
+ rewrite(rect.__updateBoxBounds)
1485
+ ], Box.prototype, "__updateRectBoxBounds", null);
1486
+ __decorate([
1487
+ rewrite(rect.__updateStrokeBounds)
1488
+ ], Box.prototype, "__updateStrokeBounds", null);
1489
+ __decorate([
1490
+ rewrite(rect.__updateRenderBounds)
1491
+ ], Box.prototype, "__updateRectRenderBounds", null);
1492
+ __decorate([
1493
+ rewrite(rect.__updateChange)
1494
+ ], Box.prototype, "__updateRectChange", null);
1495
+ __decorate([
1496
+ rewrite(rect.__render)
1497
+ ], Box.prototype, "__renderRect", null);
1498
+ __decorate([
1499
+ rewrite(group.__render)
1500
+ ], Box.prototype, "__renderGroup", null);
1501
+ Box = __decorate([
1502
+ rewriteAble(),
1503
+ registerUI()
1504
+ ], Box);
1505
+
1506
+ let Frame = class Frame extends Box {
1507
+ get __tag() { return 'Frame'; }
1508
+ get isFrame() { return true; }
1509
+ constructor(data) {
1510
+ super(data);
1511
+ }
1512
+ };
1513
+ __decorate([
1514
+ dataProcessor(FrameData)
1515
+ ], Frame.prototype, "__", void 0);
1516
+ __decorate([
1517
+ surfaceType('#FFFFFF')
1518
+ ], Frame.prototype, "fill", void 0);
1519
+ __decorate([
1520
+ affectRenderBoundsType('hide')
1521
+ ], Frame.prototype, "overflow", void 0);
1522
+ Frame = __decorate([
1523
+ registerUI()
1524
+ ], Frame);
1525
+
1526
+ const { moveTo: moveTo$3, closePath: closePath$2, ellipse } = PathCommandDataHelper;
1527
+ let Ellipse = class Ellipse extends UI {
1528
+ get __tag() { return 'Ellipse'; }
1529
+ constructor(data) {
1530
+ super(data);
1531
+ }
1532
+ __updatePath() {
1533
+ const { width, height, innerRadius, startAngle, endAngle } = this.__;
1534
+ const rx = width / 2, ry = height / 2;
1535
+ const path = this.__.path = [];
1536
+ if (innerRadius) {
1537
+ if (startAngle || endAngle) {
1538
+ if (innerRadius < 1)
1539
+ ellipse(path, rx, ry, rx * innerRadius, ry * innerRadius, 0, startAngle, endAngle, false);
1540
+ ellipse(path, rx, ry, rx, ry, 0, endAngle, startAngle, true);
1541
+ if (innerRadius < 1)
1542
+ closePath$2(path);
1543
+ }
1544
+ else {
1545
+ if (innerRadius < 1) {
1546
+ ellipse(path, rx, ry, rx * innerRadius, ry * innerRadius);
1547
+ moveTo$3(path, width, ry);
1548
+ }
1549
+ ellipse(path, rx, ry, rx, ry, 0, 360, 0, true);
1550
+ }
1551
+ if (Platform.ellipseToCurve)
1552
+ this.__.path = this.getPath(true);
1553
+ }
1554
+ else {
1555
+ if (startAngle || endAngle) {
1556
+ moveTo$3(path, rx, ry);
1557
+ ellipse(path, rx, ry, rx, ry, 0, startAngle, endAngle, false);
1558
+ closePath$2(path);
1559
+ }
1560
+ else {
1561
+ ellipse(path, rx, ry, rx, ry);
1562
+ }
1563
+ }
1564
+ }
1565
+ };
1566
+ __decorate([
1567
+ dataProcessor(EllipseData)
1568
+ ], Ellipse.prototype, "__", void 0);
1569
+ __decorate([
1570
+ pathType(0)
1571
+ ], Ellipse.prototype, "innerRadius", void 0);
1572
+ __decorate([
1573
+ pathType(0)
1574
+ ], Ellipse.prototype, "startAngle", void 0);
1575
+ __decorate([
1576
+ pathType(0)
1577
+ ], Ellipse.prototype, "endAngle", void 0);
1578
+ Ellipse = __decorate([
1579
+ registerUI()
1580
+ ], Ellipse);
1581
+
1582
+ const { moveTo: moveTo$2, lineTo: lineTo$2, drawPoints: drawPoints$1 } = PathCommandDataHelper;
1583
+ const { rotate, getAngle, getDistance, defaultPoint } = PointHelper;
1584
+ const { toBounds } = PathBounds;
1585
+ let Line = class Line extends UI {
1586
+ get __tag() { return 'Line'; }
1587
+ get toPoint() {
1588
+ const { width, rotation } = this.__;
1589
+ const to = getPointData();
1590
+ if (width)
1591
+ to.x = width;
1592
+ if (rotation)
1593
+ rotate(to, rotation);
1594
+ return to;
1595
+ }
1596
+ set toPoint(value) {
1597
+ this.width = getDistance(defaultPoint, value);
1598
+ this.rotation = getAngle(defaultPoint, value);
1599
+ if (this.height)
1600
+ this.height = 0;
1601
+ }
1602
+ constructor(data) {
1603
+ super(data);
1604
+ }
1605
+ __updatePath() {
1606
+ const data = this.__;
1607
+ const path = data.path = [];
1608
+ if (data.points) {
1609
+ drawPoints$1(path, data.points, false, data.closed);
1610
+ }
1611
+ else {
1612
+ moveTo$2(path, 0, 0);
1613
+ lineTo$2(path, this.width, 0);
1614
+ }
1615
+ }
1616
+ __updateRenderPath() {
1617
+ const data = this.__;
1618
+ if (!this.pathInputed && data.points && data.curve) {
1619
+ drawPoints$1(data.__pathForRender = [], data.points, data.curve, data.closed);
1620
+ if (data.__useArrow)
1621
+ PathArrow.addArrows(this, false);
1622
+ }
1623
+ else
1624
+ super.__updateRenderPath();
1625
+ }
1626
+ __updateBoxBounds() {
1627
+ if (this.points) {
1628
+ toBounds(this.__.__pathForRender, this.__layout.boxBounds);
1629
+ }
1630
+ else
1631
+ super.__updateBoxBounds();
1632
+ }
1633
+ };
1634
+ __decorate([
1635
+ dataProcessor(LineData)
1636
+ ], Line.prototype, "__", void 0);
1637
+ __decorate([
1638
+ affectStrokeBoundsType('center')
1639
+ ], Line.prototype, "strokeAlign", void 0);
1640
+ __decorate([
1641
+ boundsType(0)
1642
+ ], Line.prototype, "height", void 0);
1643
+ __decorate([
1644
+ pathType()
1645
+ ], Line.prototype, "points", void 0);
1646
+ __decorate([
1647
+ pathType(0)
1648
+ ], Line.prototype, "curve", void 0);
1649
+ __decorate([
1650
+ pathType(false)
1651
+ ], Line.prototype, "closed", void 0);
1652
+ Line = __decorate([
1653
+ registerUI()
1654
+ ], Line);
1655
+
1656
+ const { sin: sin$1, cos: cos$1, PI: PI$1 } = Math;
1657
+ const { moveTo: moveTo$1, lineTo: lineTo$1, closePath: closePath$1, drawPoints } = PathCommandDataHelper;
1658
+ const line = Line.prototype;
1659
+ let Polygon = class Polygon extends UI {
1660
+ get __tag() { return 'Polygon'; }
1661
+ constructor(data) {
1662
+ super(data);
1663
+ }
1664
+ __updatePath() {
1665
+ const path = this.__.path = [];
1666
+ if (this.__.points) {
1667
+ drawPoints(path, this.__.points, false, true);
1668
+ }
1669
+ else {
1670
+ const { width, height, sides } = this.__;
1671
+ const rx = width / 2, ry = height / 2;
1672
+ moveTo$1(path, rx, 0);
1673
+ for (let i = 1; i < sides; i++) {
1674
+ lineTo$1(path, rx + rx * sin$1((i * 2 * PI$1) / sides), ry - ry * cos$1((i * 2 * PI$1) / sides));
1675
+ }
1676
+ }
1677
+ closePath$1(path);
1678
+ }
1679
+ __updateRenderPath() { }
1680
+ __updateBoxBounds() { }
1681
+ };
1682
+ __decorate([
1683
+ dataProcessor(PolygonData)
1684
+ ], Polygon.prototype, "__", void 0);
1685
+ __decorate([
1686
+ pathType(3)
1687
+ ], Polygon.prototype, "sides", void 0);
1688
+ __decorate([
1689
+ pathType()
1690
+ ], Polygon.prototype, "points", void 0);
1691
+ __decorate([
1692
+ pathType(0)
1693
+ ], Polygon.prototype, "curve", void 0);
1694
+ __decorate([
1695
+ rewrite(line.__updateRenderPath)
1696
+ ], Polygon.prototype, "__updateRenderPath", null);
1697
+ __decorate([
1698
+ rewrite(line.__updateBoxBounds)
1699
+ ], Polygon.prototype, "__updateBoxBounds", null);
1700
+ Polygon = __decorate([
1701
+ rewriteAble(),
1702
+ registerUI()
1703
+ ], Polygon);
1704
+
1705
+ const { sin, cos, PI } = Math;
1706
+ const { moveTo, lineTo, closePath } = PathCommandDataHelper;
1707
+ let Star = class Star extends UI {
1708
+ get __tag() { return 'Star'; }
1709
+ constructor(data) {
1710
+ super(data);
1711
+ }
1712
+ __updatePath() {
1713
+ const { width, height, corners, innerRadius } = this.__;
1714
+ const rx = width / 2, ry = height / 2;
1715
+ const path = this.__.path = [];
1716
+ moveTo(path, rx, 0);
1717
+ for (let i = 1; i < corners * 2; i++) {
1718
+ lineTo(path, rx + (i % 2 === 0 ? rx : rx * innerRadius) * sin((i * PI) / corners), ry - (i % 2 === 0 ? ry : ry * innerRadius) * cos((i * PI) / corners));
1719
+ }
1720
+ closePath(path);
1721
+ }
1722
+ };
1723
+ __decorate([
1724
+ dataProcessor(StarData)
1725
+ ], Star.prototype, "__", void 0);
1726
+ __decorate([
1727
+ pathType(5)
1728
+ ], Star.prototype, "corners", void 0);
1729
+ __decorate([
1730
+ pathType(0.382)
1731
+ ], Star.prototype, "innerRadius", void 0);
1732
+ Star = __decorate([
1733
+ registerUI()
1734
+ ], Star);
1735
+
1736
+ let Image = class Image extends Rect {
1737
+ get __tag() { return 'Image'; }
1738
+ get ready() { const { image } = this; return image && image.ready; }
1739
+ get image() { const { fill } = this.__; return fill instanceof Array && fill[0].image; }
1740
+ constructor(data) {
1741
+ super(data);
1742
+ }
1743
+ };
1744
+ __decorate([
1745
+ dataProcessor(ImageData)
1746
+ ], Image.prototype, "__", void 0);
1747
+ __decorate([
1748
+ boundsType('')
1749
+ ], Image.prototype, "url", void 0);
1750
+ Image = __decorate([
1751
+ registerUI()
1752
+ ], Image);
1753
+ const MyImage = Image;
1754
+
1755
+ let Canvas = class Canvas extends Rect {
1756
+ get __tag() { return 'Canvas'; }
1757
+ get context() { return this.canvas.context; }
1758
+ get ready() { return !this.url; }
1759
+ constructor(data) {
1760
+ super(data);
1761
+ this.canvas = Creator.canvas(this.__);
1762
+ if (data && data.url)
1763
+ this.drawImage(data.url);
1764
+ }
1765
+ drawImage(url) {
1766
+ new LeaferImage({ url }).load((image) => {
1767
+ this.context.drawImage(image.view, 0, 0);
1768
+ this.url = undefined;
1769
+ this.paint();
1770
+ this.emitEvent(new ImageEvent(ImageEvent.LOADED, { image }));
1771
+ });
1772
+ }
1773
+ draw(ui, offset, scale, rotation) {
1774
+ const matrix = new Matrix(ui.worldTransform).invert();
1775
+ const m = new Matrix();
1776
+ if (offset)
1777
+ m.translate(offset.x, offset.y);
1778
+ if (scale)
1779
+ typeof scale === 'number' ? m.scale(scale) : m.scale(scale.x, scale.y);
1780
+ if (rotation)
1781
+ m.rotate(rotation);
1782
+ matrix.multiplyParent(m);
1783
+ ui.__render(this.canvas, { matrix: matrix.withScale() });
1784
+ this.paint();
1785
+ }
1786
+ paint() {
1787
+ this.forceRender();
1788
+ }
1789
+ __drawContent(canvas, _options) {
1790
+ const { width, height } = this.__, { view } = this.canvas;
1791
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
1792
+ }
1793
+ __updateSize() {
1794
+ const { canvas } = this;
1795
+ if (canvas) {
1796
+ const { smooth, safeResize } = this.__;
1797
+ canvas.resize(this.__, safeResize);
1798
+ if (canvas.smooth !== smooth)
1799
+ canvas.smooth = smooth;
1800
+ }
1801
+ }
1802
+ destroy() {
1803
+ if (this.canvas) {
1804
+ this.canvas.destroy();
1805
+ this.canvas = null;
1806
+ }
1807
+ super.destroy();
1808
+ }
1809
+ };
1810
+ __decorate([
1811
+ dataProcessor(CanvasData)
1812
+ ], Canvas.prototype, "__", void 0);
1813
+ __decorate([
1814
+ resizeType(100)
1815
+ ], Canvas.prototype, "width", void 0);
1816
+ __decorate([
1817
+ resizeType(100)
1818
+ ], Canvas.prototype, "height", void 0);
1819
+ __decorate([
1820
+ resizeType(1)
1821
+ ], Canvas.prototype, "pixelRatio", void 0);
1822
+ __decorate([
1823
+ resizeType(true)
1824
+ ], Canvas.prototype, "smooth", void 0);
1825
+ __decorate([
1826
+ dataType(false)
1827
+ ], Canvas.prototype, "safeResize", void 0);
1828
+ __decorate([
1829
+ resizeType()
1830
+ ], Canvas.prototype, "contextSettings", void 0);
1831
+ Canvas = __decorate([
1832
+ registerUI()
1833
+ ], Canvas);
1834
+
1835
+ const { copyAndSpread, includes, spread, setList } = BoundsHelper;
1836
+ let Text = class Text extends UI {
1837
+ get __tag() { return 'Text'; }
1838
+ get textDrawData() { this.updateLayout(); return this.__.__textDrawData; }
1839
+ constructor(data) {
1840
+ super(data);
1841
+ }
1842
+ __updateTextDrawData() {
1843
+ const data = this.__;
1844
+ const { lineHeight, letterSpacing, fontFamily, fontSize, fontWeight, italic, textCase, textOverflow, padding } = data;
1845
+ data.__lineHeight = UnitConvert.number(lineHeight, fontSize);
1846
+ data.__letterSpacing = UnitConvert.number(letterSpacing, fontSize);
1847
+ data.__padding = padding ? MathHelper.fourNumber(padding) : undefined;
1848
+ data.__baseLine = data.__lineHeight - (data.__lineHeight - fontSize * 0.7) / 2;
1849
+ data.__font = `${italic ? 'italic ' : ''}${textCase === 'small-caps' ? 'small-caps ' : ''}${fontWeight !== 'normal' ? fontWeight + ' ' : ''}${fontSize}px ${fontFamily}`;
1850
+ data.__clipText = textOverflow !== 'show' && !data.__autoSize;
1851
+ data.__textDrawData = TextConvert.getDrawData((data.__isPlacehold = data.placeholder && data.text === '') ? data.placeholder : data.text, this.__);
1852
+ }
1853
+ __updateBoxBounds() {
1854
+ const data = this.__;
1855
+ const layout = this.__layout;
1856
+ const { fontSize, italic, padding, __autoWidth: autoWidth, __autoHeight: autoHeight } = data;
1857
+ this.__updateTextDrawData();
1858
+ const { bounds: contentBounds } = data.__textDrawData;
1859
+ const b = layout.boxBounds;
1860
+ layout.contentBounds = contentBounds;
1861
+ if (data.__lineHeight < fontSize)
1862
+ spread(contentBounds, fontSize / 2);
1863
+ if (autoWidth || autoHeight) {
1864
+ b.x = autoWidth ? contentBounds.x : 0;
1865
+ b.y = autoHeight ? contentBounds.y : 0;
1866
+ b.width = autoWidth ? contentBounds.width : data.width;
1867
+ b.height = autoHeight ? contentBounds.height : data.height;
1868
+ if (padding) {
1869
+ const [top, right, bottom, left] = data.__padding;
1870
+ if (autoWidth)
1871
+ b.x -= left, b.width += (right + left);
1872
+ if (autoHeight)
1873
+ b.y -= top, b.height += (bottom + top);
1874
+ }
1875
+ this.__updateNaturalSize();
1876
+ }
1877
+ else
1878
+ super.__updateBoxBounds();
1879
+ if (italic)
1880
+ b.width += fontSize * 0.16;
1881
+ DataHelper.stintSet(this, 'isOverflow', !includes(b, contentBounds));
1882
+ if (this.isOverflow)
1883
+ setList(data.__textBoxBounds = {}, [b, contentBounds]), layout.renderChanged = true;
1884
+ else
1885
+ data.__textBoxBounds = b;
1886
+ }
1887
+ __onUpdateSize() {
1888
+ if (this.__box)
1889
+ this.__box.__onUpdateSize();
1890
+ super.__onUpdateSize();
1891
+ }
1892
+ __updateRenderSpread() {
1893
+ let width = super.__updateRenderSpread();
1894
+ if (!width)
1895
+ width = this.isOverflow ? 1 : 0;
1896
+ return width;
1897
+ }
1898
+ __updateRenderBounds() {
1899
+ const { renderBounds, renderSpread } = this.__layout;
1900
+ copyAndSpread(renderBounds, this.__.__textBoxBounds, renderSpread);
1901
+ if (this.__box)
1902
+ this.__box.__layout.renderBounds = renderBounds;
1903
+ }
1904
+ __drawRenderPath(canvas) {
1905
+ canvas.font = this.__.__font;
1906
+ }
1907
+ __draw(canvas, options, originCanvas) {
1908
+ const box = this.__box;
1909
+ if (box)
1910
+ box.__nowWorld = this.__nowWorld, box.__draw(canvas, options, originCanvas);
1911
+ if (this.textEditing && !Export.running)
1912
+ return;
1913
+ super.__draw(canvas, options, originCanvas);
1914
+ }
1915
+ destroy() {
1916
+ if (this.boxStyle)
1917
+ this.boxStyle = null;
1918
+ super.destroy();
1919
+ }
1920
+ };
1921
+ __decorate([
1922
+ dataProcessor(TextData)
1923
+ ], Text.prototype, "__", void 0);
1924
+ __decorate([
1925
+ boundsType(0)
1926
+ ], Text.prototype, "width", void 0);
1927
+ __decorate([
1928
+ boundsType(0)
1929
+ ], Text.prototype, "height", void 0);
1930
+ __decorate([
1931
+ surfaceType()
1932
+ ], Text.prototype, "boxStyle", void 0);
1933
+ __decorate([
1934
+ dataType(false)
1935
+ ], Text.prototype, "resizeFontSize", void 0);
1936
+ __decorate([
1937
+ surfaceType('#000000')
1938
+ ], Text.prototype, "fill", void 0);
1939
+ __decorate([
1940
+ affectStrokeBoundsType('outside')
1941
+ ], Text.prototype, "strokeAlign", void 0);
1942
+ __decorate([
1943
+ hitType('all')
1944
+ ], Text.prototype, "hitFill", void 0);
1945
+ __decorate([
1946
+ boundsType('')
1947
+ ], Text.prototype, "text", void 0);
1948
+ __decorate([
1949
+ boundsType('')
1950
+ ], Text.prototype, "placeholder", void 0);
1951
+ __decorate([
1952
+ boundsType('caption')
1953
+ ], Text.prototype, "fontFamily", void 0);
1954
+ __decorate([
1955
+ boundsType(12)
1956
+ ], Text.prototype, "fontSize", void 0);
1957
+ __decorate([
1958
+ boundsType('normal')
1959
+ ], Text.prototype, "fontWeight", void 0);
1960
+ __decorate([
1961
+ boundsType(false)
1962
+ ], Text.prototype, "italic", void 0);
1963
+ __decorate([
1964
+ boundsType('none')
1965
+ ], Text.prototype, "textCase", void 0);
1966
+ __decorate([
1967
+ boundsType('none')
1968
+ ], Text.prototype, "textDecoration", void 0);
1969
+ __decorate([
1970
+ boundsType(0)
1971
+ ], Text.prototype, "letterSpacing", void 0);
1972
+ __decorate([
1973
+ boundsType({ type: 'percent', value: 1.5 })
1974
+ ], Text.prototype, "lineHeight", void 0);
1975
+ __decorate([
1976
+ boundsType(0)
1977
+ ], Text.prototype, "paraIndent", void 0);
1978
+ __decorate([
1979
+ boundsType(0)
1980
+ ], Text.prototype, "paraSpacing", void 0);
1981
+ __decorate([
1982
+ boundsType('x')
1983
+ ], Text.prototype, "writingMode", void 0);
1984
+ __decorate([
1985
+ boundsType('left')
1986
+ ], Text.prototype, "textAlign", void 0);
1987
+ __decorate([
1988
+ boundsType('top')
1989
+ ], Text.prototype, "verticalAlign", void 0);
1990
+ __decorate([
1991
+ boundsType(true)
1992
+ ], Text.prototype, "autoSizeAlign", void 0);
1993
+ __decorate([
1994
+ boundsType('normal')
1995
+ ], Text.prototype, "textWrap", void 0);
1996
+ __decorate([
1997
+ boundsType('show')
1998
+ ], Text.prototype, "textOverflow", void 0);
1999
+ __decorate([
2000
+ surfaceType(false)
2001
+ ], Text.prototype, "textEditing", void 0);
2002
+ Text = __decorate([
2003
+ registerUI()
2004
+ ], Text);
2005
+
2006
+ let Path = class Path extends UI {
2007
+ get __tag() { return 'Path'; }
2008
+ constructor(data) {
2009
+ super(data);
2010
+ }
2011
+ };
2012
+ __decorate([
2013
+ dataProcessor(PathData)
2014
+ ], Path.prototype, "__", void 0);
2015
+ __decorate([
2016
+ affectStrokeBoundsType('center')
2017
+ ], Path.prototype, "strokeAlign", void 0);
2018
+ Path = __decorate([
2019
+ registerUI()
2020
+ ], Path);
2021
+
2022
+ let Pen = class Pen extends Group {
2023
+ get __tag() { return 'Pen'; }
2024
+ constructor(data) {
2025
+ super(data);
2026
+ }
2027
+ setStyle(data) {
2028
+ const path = this.pathElement = new Path(data);
2029
+ this.pathStyle = data;
2030
+ this.__path = path.path || (path.path = []);
2031
+ this.add(path);
2032
+ return this;
2033
+ }
2034
+ beginPath() { return this; }
2035
+ moveTo(_x, _y) { return this; }
2036
+ lineTo(_x, _y) { return this; }
2037
+ bezierCurveTo(_x1, _y1, _x2, _y2, _x, _y) { return this; }
2038
+ quadraticCurveTo(_x1, _y1, _x, _y) { return this; }
2039
+ closePath() { return this; }
2040
+ rect(_x, _y, _width, _height) { return this; }
2041
+ roundRect(_x, _y, _width, _height, _cornerRadius) { return this; }
2042
+ ellipse(_x, _y, _radiusX, _radiusY, _rotation, _startAngle, _endAngle, _anticlockwise) { return this; }
2043
+ arc(_x, _y, _radius, _startAngle, _endAngle, _anticlockwise) { return this; }
2044
+ arcTo(_x1, _y1, _x2, _y2, _radius) { return this; }
2045
+ drawEllipse(_x, _y, _radiusX, _radiusY, _rotation, _startAngle, _endAngle, _anticlockwise) { return this; }
2046
+ drawArc(_x, _y, _radius, _startAngle, _endAngle, _anticlockwise) { return this; }
2047
+ drawPoints(_points, _curve, _close) { return this; }
2048
+ clearPath() { return this; }
2049
+ paint() {
2050
+ if (!this.pathElement.__layout.boxChanged)
2051
+ this.pathElement.forceUpdate('path');
2052
+ }
2053
+ };
2054
+ __decorate([
2055
+ dataProcessor(PenData)
2056
+ ], Pen.prototype, "__", void 0);
2057
+ __decorate([
2058
+ penPathType()
2059
+ ], Pen.prototype, "path", void 0);
2060
+ Pen = __decorate([
2061
+ useModule(PathCreator, ['set', 'path', 'paint']),
2062
+ registerUI()
2063
+ ], Pen);
2064
+ function penPathType() {
2065
+ return (target, key) => {
2066
+ defineKey(target, key, {
2067
+ get() { return this.__path; }
2068
+ });
2069
+ };
2070
+ }
2071
+
2072
+ export { Box, BoxData, Canvas, CanvasData, ColorConvert, Effect, Ellipse, EllipseData, Export, Filter, Frame, FrameData, Group, GroupData, Image, ImageData, Leafer, LeaferData, Line, LineData, MyImage, Paint, PaintGradient, PaintImage, Path, PathArrow, PathData, Pen, PenData, Polygon, PolygonData, Rect, RectData, RectRender, Star, StarData, State, Text, TextConvert, TextData, Transition, UI, UIBounds, UIData, UIRender, UnitConvert, effectType, resizeType, zoomLayerType };