@leafer-draw/worker 1.5.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -45,7 +45,7 @@ const IncrementId = {
45
45
  };
46
46
  const I$1 = IncrementId;
47
47
 
48
- const { round, pow: pow$1, PI: PI$4 } = Math;
48
+ const { round: round$3, pow: pow$1, PI: PI$4 } = Math;
49
49
  const MathHelper = {
50
50
  within(value, min, max) {
51
51
  if (typeof min === 'object')
@@ -109,7 +109,7 @@ const MathHelper = {
109
109
  },
110
110
  float(num, maxLength) {
111
111
  const a = maxLength !== undefined ? pow$1(10, maxLength) : 1000000000000;
112
- num = round(num * a) / a;
112
+ num = round$3(num * a) / a;
113
113
  return num === -0 ? 0 : num;
114
114
  },
115
115
  getScaleData(scale, size, originSize, scaleData) {
@@ -132,8 +132,15 @@ const MathHelper = {
132
132
  scaleData.scaleX = scale.x;
133
133
  scaleData.scaleY = scale.y;
134
134
  }
135
+ },
136
+ randInt,
137
+ randColor(opacity) {
138
+ return `rgba(${randInt(255)},${randInt(255)},${randInt(255)},${opacity || 1})`;
135
139
  }
136
140
  };
141
+ function randInt(num) {
142
+ return Math.round(Math.random() * num);
143
+ }
137
144
  const OneRadian = PI$4 / 180;
138
145
  const PI2 = PI$4 * 2;
139
146
  const PI_2 = PI$4 / 2;
@@ -431,7 +438,7 @@ const MatrixHelper = {
431
438
  const M$6 = MatrixHelper;
432
439
 
433
440
  const { toInnerPoint: toInnerPoint$2, toOuterPoint: toOuterPoint$3 } = MatrixHelper;
434
- const { sin: sin$4, cos: cos$4, abs: abs$4, sqrt: sqrt$2, atan2: atan2$2, min: min$1, PI: PI$3 } = Math;
441
+ const { sin: sin$4, cos: cos$4, abs: abs$4, sqrt: sqrt$2, atan2: atan2$2, min: min$1, round: round$2, PI: PI$3 } = Math;
435
442
  const PointHelper = {
436
443
  defaultPoint: getPointData(),
437
444
  tempPoint: {},
@@ -452,6 +459,10 @@ const PointHelper = {
452
459
  t.x = x;
453
460
  t.y = y;
454
461
  },
462
+ round(t, halfPixel) {
463
+ t.x = halfPixel ? round$2(t.x - 0.5) + 0.5 : round$2(t.x);
464
+ t.y = halfPixel ? round$2(t.y - 0.5) + 0.5 : round$2(t.y);
465
+ },
455
466
  move(t, x, y) {
456
467
  t.x += x;
457
468
  t.y += y;
@@ -1317,6 +1328,7 @@ const StringNumberMap = {
1317
1328
  'E': 1
1318
1329
  };
1319
1330
 
1331
+ const { randColor } = MathHelper;
1320
1332
  class Debug {
1321
1333
  constructor(name) {
1322
1334
  this.repeatMap = {};
@@ -1331,6 +1343,19 @@ class Debug {
1331
1343
  static set exclude(name) {
1332
1344
  this.excludeList = getNameList(name);
1333
1345
  }
1346
+ static drawRepaint(canvas, bounds) {
1347
+ const color = randColor();
1348
+ canvas.fillWorld(bounds, color.replace('1)', '.1)'));
1349
+ canvas.strokeWorld(bounds, color);
1350
+ }
1351
+ static drawBounds(leaf, canvas, _options) {
1352
+ const showHit = Debug.showBounds === 'hit', w = leaf.__nowWorld, color = randColor();
1353
+ if (showHit)
1354
+ canvas.setWorld(w), leaf.__drawHitPath(canvas), canvas.fillStyle = color.replace('1)', '.2)'), canvas.fill();
1355
+ canvas.resetTransform();
1356
+ canvas.setStroke(color, 2);
1357
+ showHit ? canvas.stroke() : canvas.strokeWorld(w, color);
1358
+ }
1334
1359
  log(...messages) {
1335
1360
  if (D$4.enable) {
1336
1361
  if (D$4.filterList.length && D$4.filterList.every(name => name !== this.name))
@@ -1417,7 +1442,7 @@ const Plugin = {
1417
1442
  return rs;
1418
1443
  },
1419
1444
  need(name) {
1420
- console.error('need plugin: ' + (name.includes('-x') ? '' : '@leafer-in/') + name);
1445
+ console.error('please install plugin: ' + (name.includes('-x') ? '' : '@leafer-in/') + name);
1421
1446
  }
1422
1447
  };
1423
1448
  setTimeout(() => check.forEach(name => Plugin.has(name, true)));
@@ -2017,7 +2042,7 @@ __decorate([
2017
2042
  contextMethod()
2018
2043
  ], Canvas$1.prototype, "strokeText", null);
2019
2044
 
2020
- const { copy: copy$8 } = MatrixHelper;
2045
+ const { copy: copy$8, multiplyParent: multiplyParent$3 } = MatrixHelper, { round: round$1 } = Math;
2021
2046
  const minSize = { width: 1, height: 1, pixelRatio: 1 };
2022
2047
  const canvasSizeAttrs = ['width', 'height', 'pixelRatio'];
2023
2048
  class LeaferCanvasBase extends Canvas$1 {
@@ -2026,6 +2051,8 @@ class LeaferCanvasBase extends Canvas$1 {
2026
2051
  get pixelRatio() { return this.size.pixelRatio; }
2027
2052
  get pixelWidth() { return this.width * this.pixelRatio; }
2028
2053
  get pixelHeight() { return this.height * this.pixelRatio; }
2054
+ get pixelSnap() { return this.config.pixelSnap; }
2055
+ set pixelSnap(value) { this.config.pixelSnap = value; }
2029
2056
  get allowBackgroundColor() { return this.view && this.parentView; }
2030
2057
  constructor(config, manager) {
2031
2058
  super();
@@ -2086,15 +2113,22 @@ class LeaferCanvasBase extends Canvas$1 {
2086
2113
  stopAutoLayout() { }
2087
2114
  setCursor(_cursor) { }
2088
2115
  setWorld(matrix, parentMatrix) {
2089
- const { pixelRatio } = this;
2090
- const w = this.worldTransform;
2091
- if (parentMatrix) {
2092
- const { a, b, c, d, e, f } = parentMatrix;
2093
- this.setTransform(w.a = ((matrix.a * a) + (matrix.b * c)) * pixelRatio, w.b = ((matrix.a * b) + (matrix.b * d)) * pixelRatio, w.c = ((matrix.c * a) + (matrix.d * c)) * pixelRatio, w.d = ((matrix.c * b) + (matrix.d * d)) * pixelRatio, w.e = (((matrix.e * a) + (matrix.f * c) + e)) * pixelRatio, w.f = (((matrix.e * b) + (matrix.f * d) + f)) * pixelRatio);
2094
- }
2095
- else {
2096
- this.setTransform(w.a = matrix.a * pixelRatio, w.b = matrix.b * pixelRatio, w.c = matrix.c * pixelRatio, w.d = matrix.d * pixelRatio, w.e = matrix.e * pixelRatio, w.f = matrix.f * pixelRatio);
2116
+ const { pixelRatio, pixelSnap } = this, w = this.worldTransform;
2117
+ if (parentMatrix)
2118
+ multiplyParent$3(matrix, parentMatrix, w);
2119
+ w.a = matrix.a * pixelRatio;
2120
+ w.b = matrix.b * pixelRatio;
2121
+ w.c = matrix.c * pixelRatio;
2122
+ w.d = matrix.d * pixelRatio;
2123
+ w.e = matrix.e * pixelRatio;
2124
+ w.f = matrix.f * pixelRatio;
2125
+ if (pixelSnap) {
2126
+ if (matrix.half && (matrix.half * pixelRatio) % 2)
2127
+ w.e = round$1(w.e - 0.5) + 0.5, w.f = round$1(w.f - 0.5) + 0.5;
2128
+ else
2129
+ w.e = round$1(w.e), w.f = round$1(w.f);
2097
2130
  }
2131
+ this.setTransform(w.a, w.b, w.c, w.d, w.e, w.f);
2098
2132
  }
2099
2133
  useWorldTransform(worldTransform) {
2100
2134
  if (worldTransform)
@@ -2237,12 +2271,13 @@ class LeaferCanvasBase extends Canvas$1 {
2237
2271
  return this.width === size.width && this.height === size.height && (!size.pixelRatio || this.pixelRatio === size.pixelRatio);
2238
2272
  }
2239
2273
  getSameCanvas(useSameWorldTransform, useSameSmooth) {
2240
- const canvas = this.manager ? this.manager.get(this.size) : Creator.canvas(Object.assign({}, this.size));
2274
+ const { size, pixelSnap } = this, canvas = this.manager ? this.manager.get(size) : Creator.canvas(Object.assign({}, size));
2241
2275
  canvas.save();
2242
2276
  if (useSameWorldTransform)
2243
2277
  copy$8(canvas.worldTransform, this.worldTransform), canvas.useWorldTransform();
2244
2278
  if (useSameSmooth)
2245
2279
  canvas.smooth = this.smooth;
2280
+ canvas.pixelSnap !== pixelSnap && (canvas.pixelSnap = pixelSnap);
2246
2281
  return canvas;
2247
2282
  }
2248
2283
  recycle(clearBounds) {
@@ -3669,7 +3704,7 @@ const Resource = {
3669
3704
  const R = Resource;
3670
3705
 
3671
3706
  const ImageManager = {
3672
- maxRecycled: 100,
3707
+ maxRecycled: 10,
3673
3708
  recycledList: [],
3674
3709
  patternTasker: new TaskProcessor(),
3675
3710
  get(config) {
@@ -4022,9 +4057,8 @@ function hitType(defaultValue) {
4022
4057
  set(value) {
4023
4058
  if (this.__setAttr(key, value)) {
4024
4059
  this.__layout.hitCanvasChanged = true;
4025
- if (Debug.showHitView) {
4060
+ if (Debug.showBounds === 'hit')
4026
4061
  this.__layout.surfaceChanged || this.__layout.surfaceChange();
4027
- }
4028
4062
  if (this.leafer)
4029
4063
  this.leafer.updateCursor();
4030
4064
  }
@@ -4185,7 +4219,7 @@ function registerUIEvent() {
4185
4219
  }
4186
4220
 
4187
4221
  const { copy: copy$6, toInnerPoint: toInnerPoint$1, toOuterPoint: toOuterPoint$1, scaleOfOuter: scaleOfOuter$2, rotateOfOuter: rotateOfOuter$2, skewOfOuter, multiplyParent: multiplyParent$2, divideParent, getLayout } = MatrixHelper;
4188
- const matrix = {};
4222
+ const matrix = {}, { round } = Math;
4189
4223
  const LeafHelper = {
4190
4224
  updateAllMatrix(leaf, checkAutoLayout, waitAutoLayout) {
4191
4225
  if (checkAutoLayout && leaf.__hasAutoLayout && leaf.__layout.matrixChanged)
@@ -4259,6 +4293,8 @@ const LeafHelper = {
4259
4293
  y = x.y, x = x.x;
4260
4294
  x += t.x;
4261
4295
  y += t.y;
4296
+ if (t.leafer && t.leafer.config.pointSnap)
4297
+ x = round(x), y = round(y);
4262
4298
  transition ? t.animate({ x, y }, transition) : (t.x = x, t.y = y);
4263
4299
  },
4264
4300
  zoomOfWorld(t, origin, scaleX, scaleY, resize, transition) {
@@ -4497,6 +4533,7 @@ class LeafLayout {
4497
4533
  set contentBounds(bounds) { this._contentBounds = bounds; }
4498
4534
  get strokeBounds() { return this._strokeBounds || this.boxBounds; }
4499
4535
  get renderBounds() { return this._renderBounds || this.boxBounds; }
4536
+ set renderBounds(bounds) { this._renderBounds = bounds; }
4500
4537
  get localContentBounds() { toOuterOf$2(this.contentBounds, this.leaf.__localMatrix, this[localContent] || (this[localContent] = {})); return this[localContent]; }
4501
4538
  get localStrokeBounds() { return this._localStrokeBounds || this; }
4502
4539
  get localRenderBounds() { return this._localRenderBounds || this; }
@@ -4515,11 +4552,13 @@ class LeafLayout {
4515
4552
  get height() { return this.boxBounds.height; }
4516
4553
  constructor(leaf) {
4517
4554
  this.leaf = leaf;
4518
- this.boxBounds = { x: 0, y: 0, width: 0, height: 0 };
4519
4555
  if (this.leaf.__local)
4520
4556
  this._localRenderBounds = this._localStrokeBounds = this.leaf.__local;
4521
- this.boxChange();
4522
- this.matrixChange();
4557
+ if (leaf.__world) {
4558
+ this.boxBounds = { x: 0, y: 0, width: 0, height: 0 };
4559
+ this.boxChange();
4560
+ this.matrixChange();
4561
+ }
4523
4562
  }
4524
4563
  createLocal() {
4525
4564
  const local = this.leaf.__local = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0 };
@@ -4851,6 +4890,9 @@ class ResizeEvent extends Event {
4851
4890
  }
4852
4891
  this.old = oldSize;
4853
4892
  }
4893
+ static isResizing(leaf) {
4894
+ return this.resizingKeys && this.resizingKeys[leaf.innerId] !== undefined;
4895
+ }
4854
4896
  }
4855
4897
  ResizeEvent.RESIZE = 'resize';
4856
4898
 
@@ -4893,6 +4935,7 @@ class RenderEvent extends Event {
4893
4935
  }
4894
4936
  RenderEvent.REQUEST = 'render.request';
4895
4937
  RenderEvent.CHILD_START = 'render.child_start';
4938
+ RenderEvent.CHILD_END = 'render.child_end';
4896
4939
  RenderEvent.START = 'render.start';
4897
4940
  RenderEvent.BEFORE = 'render.before';
4898
4941
  RenderEvent.RENDER = 'render';
@@ -5272,24 +5315,27 @@ const LeafBounds = {
5272
5315
  const LeafRender = {
5273
5316
  __render(canvas, options) {
5274
5317
  if (this.__worldOpacity) {
5318
+ const data = this.__;
5275
5319
  canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
5276
- canvas.opacity = this.__.opacity;
5320
+ canvas.opacity = options.dimOpacity && !data.dimskip ? data.opacity * options.dimOpacity : data.opacity;
5277
5321
  if (this.__.__single) {
5278
- if (this.__.eraser === 'path')
5322
+ if (data.eraser === 'path')
5279
5323
  return this.__renderEraser(canvas, options);
5280
5324
  const tempCanvas = canvas.getSameCanvas(true, true);
5281
5325
  this.__draw(tempCanvas, options, canvas);
5282
5326
  if (this.__worldFlipped) {
5283
- canvas.copyWorldByReset(tempCanvas, this.__nowWorld, null, this.__.__blendMode, true);
5327
+ canvas.copyWorldByReset(tempCanvas, this.__nowWorld, null, data.__blendMode, true);
5284
5328
  }
5285
5329
  else {
5286
- canvas.copyWorldToInner(tempCanvas, this.__nowWorld, this.__layout.renderBounds, this.__.__blendMode);
5330
+ canvas.copyWorldToInner(tempCanvas, this.__nowWorld, this.__layout.renderBounds, data.__blendMode);
5287
5331
  }
5288
5332
  tempCanvas.recycle(this.__nowWorld);
5289
5333
  }
5290
5334
  else {
5291
5335
  this.__draw(canvas, options);
5292
5336
  }
5337
+ if (Debug.showBounds)
5338
+ Debug.drawBounds(this, canvas, options);
5293
5339
  }
5294
5340
  },
5295
5341
  __clip(canvas, options) {
@@ -5319,14 +5365,19 @@ const BranchRender = {
5319
5365
  __render(canvas, options) {
5320
5366
  this.__nowWorld = this.__getNowWorld(options);
5321
5367
  if (this.__worldOpacity) {
5322
- if (this.__.__single) {
5323
- if (this.__.eraser === 'path')
5368
+ const data = this.__;
5369
+ if (data.dim)
5370
+ options.dimOpacity = data.dim === true ? 0.2 : data.dim;
5371
+ else if (data.dimskip)
5372
+ options.dimOpacity && (options.dimOpacity = 0);
5373
+ if (data.__single) {
5374
+ if (data.eraser === 'path')
5324
5375
  return this.__renderEraser(canvas, options);
5325
5376
  const tempCanvas = canvas.getSameCanvas(false, true);
5326
5377
  this.__renderBranch(tempCanvas, options);
5327
5378
  const nowWorld = this.__nowWorld;
5328
- canvas.opacity = this.__.opacity;
5329
- canvas.copyWorldByReset(tempCanvas, nowWorld, nowWorld, this.__.__blendMode, true);
5379
+ canvas.opacity = options.dimOpacity ? data.opacity * options.dimOpacity : data.opacity;
5380
+ canvas.copyWorldByReset(tempCanvas, nowWorld, nowWorld, data.__blendMode, true);
5330
5381
  tempCanvas.recycle(nowWorld);
5331
5382
  }
5332
5383
  else {
@@ -5401,9 +5452,11 @@ let Leaf = class Leaf {
5401
5452
  reset(data) {
5402
5453
  if (this.leafer)
5403
5454
  this.leafer.forceRender(this.__world);
5404
- this.__world = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0, scaleX: 1, scaleY: 1 };
5405
- if (data !== null)
5406
- this.__local = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0 };
5455
+ if (data !== 0) {
5456
+ this.__world = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0, scaleX: 1, scaleY: 1 };
5457
+ if (data !== null)
5458
+ this.__local = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0 };
5459
+ }
5407
5460
  this.__worldOpacity = 1;
5408
5461
  this.__ = new this.__DataProcessor(this);
5409
5462
  this.__layout = new this.__LayoutProcessor(this);
@@ -5539,9 +5592,10 @@ let Leaf = class Leaf {
5539
5592
  if (options.matrix) {
5540
5593
  if (!this.__cameraWorld)
5541
5594
  this.__cameraWorld = {};
5542
- const cameraWorld = this.__cameraWorld;
5543
- multiplyParent(this.__world, options.matrix, cameraWorld, undefined, this.__world);
5595
+ const cameraWorld = this.__cameraWorld, world = this.__world;
5596
+ multiplyParent(world, options.matrix, cameraWorld, undefined, world);
5544
5597
  toOuterOf(this.__layout.renderBounds, cameraWorld, cameraWorld);
5598
+ cameraWorld.half !== world.half && (cameraWorld.half = world.half);
5545
5599
  return cameraWorld;
5546
5600
  }
5547
5601
  else {
@@ -5701,7 +5755,7 @@ let Leaf = class Leaf {
5701
5755
  __updateHitCanvas() { }
5702
5756
  __render(_canvas, _options) { }
5703
5757
  __drawFast(_canvas, _options) { }
5704
- __draw(_canvas, _options) { }
5758
+ __draw(_canvas, _options, _originCanvas) { }
5705
5759
  __clip(_canvas, _options) { }
5706
5760
  __renderShape(_canvas, _options, _ignoreFill, _ignoreStroke) { }
5707
5761
  __updateWorldOpacity() { }
@@ -6071,7 +6125,7 @@ class LeafLevelList {
6071
6125
  }
6072
6126
  }
6073
6127
 
6074
- const version = "1.5.2";
6128
+ const version = "1.6.0";
6075
6129
 
6076
6130
  class LeaferCanvas extends LeaferCanvasBase {
6077
6131
  get allowBackgroundColor() { return true; }
@@ -6311,7 +6365,6 @@ function updateChange(updateList) {
6311
6365
  }
6312
6366
 
6313
6367
  const { worldBounds } = LeafBoundsHelper;
6314
- const bigBounds = { x: 0, y: 0, width: 100000, height: 100000 };
6315
6368
  class LayoutBlockData {
6316
6369
  constructor(list) {
6317
6370
  this.updatedBounds = new Bounds();
@@ -6325,13 +6378,7 @@ class LayoutBlockData {
6325
6378
  this.beforeBounds.setListWithFn(this.updatedList.list, worldBounds);
6326
6379
  }
6327
6380
  setAfter() {
6328
- const { list } = this.updatedList;
6329
- if (list.some(leaf => leaf.noBounds)) {
6330
- this.afterBounds.set(bigBounds);
6331
- }
6332
- else {
6333
- this.afterBounds.setListWithFn(list, worldBounds);
6334
- }
6381
+ this.afterBounds.setListWithFn(this.updatedList.list, worldBounds);
6335
6382
  this.updatedBounds.setList([this.beforeBounds, this.afterBounds]);
6336
6383
  }
6337
6384
  merge(data) {
@@ -6533,6 +6580,13 @@ class Renderer {
6533
6580
  requestLayout() {
6534
6581
  this.target.emit(LayoutEvent.REQUEST);
6535
6582
  }
6583
+ checkRender() {
6584
+ if (this.running) {
6585
+ if (this.changed && this.canvas.view)
6586
+ this.render();
6587
+ this.target.emit(RenderEvent.NEXT);
6588
+ }
6589
+ }
6536
6590
  render(callback) {
6537
6591
  if (!(this.running && this.canvas.view))
6538
6592
  return this.update();
@@ -6541,8 +6595,6 @@ class Renderer {
6541
6595
  this.totalBounds = new Bounds();
6542
6596
  debug$2.log(target.innerName, '--->');
6543
6597
  try {
6544
- if (!target.isApp)
6545
- target.app.emit(RenderEvent.CHILD_START, target);
6546
6598
  this.emitRender(RenderEvent.START);
6547
6599
  this.renderOnce(callback);
6548
6600
  this.emitRender(RenderEvent.END, this.totalBounds);
@@ -6610,20 +6662,12 @@ class Renderer {
6610
6662
  }
6611
6663
  clipRender(block) {
6612
6664
  const t = Run.start('PartRender');
6613
- const { canvas } = this;
6614
- const bounds = block.getIntersect(canvas.bounds);
6615
- const includes = block.includes(this.target.__world);
6616
- const realBounds = new Bounds(bounds);
6665
+ const { canvas } = this, bounds = block.getIntersect(canvas.bounds), realBounds = new Bounds(bounds);
6617
6666
  canvas.save();
6618
- if (includes && !Debug.showRepaint) {
6619
- canvas.clear();
6620
- }
6621
- else {
6622
- bounds.spread(10 + 1 / this.canvas.pixelRatio).ceil();
6623
- canvas.clearWorld(bounds, true);
6624
- canvas.clipWorld(bounds, true);
6625
- }
6626
- this.__render(bounds, includes, realBounds);
6667
+ bounds.spread(Renderer.clipSpread).ceil();
6668
+ canvas.clearWorld(bounds, true);
6669
+ canvas.clipWorld(bounds, true);
6670
+ this.__render(bounds, block.includes(this.target.__world), realBounds);
6627
6671
  canvas.restore();
6628
6672
  Run.end(t);
6629
6673
  }
@@ -6637,23 +6681,17 @@ class Renderer {
6637
6681
  Run.end(t);
6638
6682
  }
6639
6683
  __render(bounds, includes, realBounds) {
6640
- const options = bounds.includes(this.target.__world) ? { includes } : { bounds, includes };
6684
+ const { canvas } = this, options = includes ? { includes } : { bounds, includes };
6641
6685
  if (this.needFill)
6642
- this.canvas.fillWorld(bounds, this.config.fill);
6686
+ canvas.fillWorld(bounds, this.config.fill);
6643
6687
  if (Debug.showRepaint)
6644
- this.canvas.strokeWorld(bounds, 'red');
6645
- this.target.__render(this.canvas, options);
6688
+ Debug.drawRepaint(canvas, bounds);
6689
+ this.target.__render(canvas, options);
6646
6690
  this.renderBounds = realBounds = realBounds || bounds;
6647
6691
  this.renderOptions = options;
6648
6692
  this.totalBounds.isEmpty() ? this.totalBounds = realBounds : this.totalBounds.add(realBounds);
6649
- if (Debug.showHitView)
6650
- this.renderHitView(options);
6651
- if (Debug.showBoundsView)
6652
- this.renderBoundsView(options);
6653
- this.canvas.updateRender(realBounds);
6654
- }
6655
- renderHitView(_options) { }
6656
- renderBoundsView(_options) { }
6693
+ canvas.updateRender(realBounds);
6694
+ }
6657
6695
  addBlock(block) {
6658
6696
  if (!this.updateBlocks)
6659
6697
  this.updateBlocks = [];
@@ -6669,17 +6707,24 @@ class Renderer {
6669
6707
  }
6670
6708
  }
6671
6709
  __requestRender() {
6710
+ const target = this.target;
6711
+ if (target.parentApp)
6712
+ return target.parentApp.renderer.update(false);
6672
6713
  if (this.requestTime)
6673
6714
  return;
6674
6715
  const requestTime = this.requestTime = Date.now();
6675
6716
  Platform.requestRender(() => {
6676
6717
  this.FPS = Math.min(60, Math.ceil(1000 / (Date.now() - requestTime)));
6677
6718
  this.requestTime = 0;
6678
- if (this.running) {
6679
- if (this.changed && this.canvas.view)
6680
- this.render();
6681
- this.target.emit(RenderEvent.NEXT);
6719
+ if (target.isApp) {
6720
+ target.emit(RenderEvent.CHILD_START, target);
6721
+ target.children.forEach(leafer => {
6722
+ leafer.renderer.FPS = this.FPS;
6723
+ leafer.renderer.checkRender();
6724
+ });
6725
+ target.emit(RenderEvent.CHILD_END, target);
6682
6726
  }
6727
+ this.checkRender();
6683
6728
  });
6684
6729
  }
6685
6730
  __onResize(e) {
@@ -6737,6 +6782,7 @@ class Renderer {
6737
6782
  }
6738
6783
  }
6739
6784
  }
6785
+ Renderer.clipSpread = 10;
6740
6786
 
6741
6787
  Object.assign(Creator, {
6742
6788
  watcher: (target, options) => new Watcher(target, options),
@@ -6825,6 +6871,7 @@ class UIData extends LeafData {
6825
6871
  return strokeWidth;
6826
6872
  }
6827
6873
  get __hasStroke() { return this.stroke && this.strokeWidth; }
6874
+ get __hasHalf() { const t = this; return (t.stroke && t.strokeAlign === 'center' && t.strokeWidth % 2) || undefined; }
6828
6875
  get __hasMultiPaint() {
6829
6876
  const t = this;
6830
6877
  if ((t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect)
@@ -6869,14 +6916,14 @@ class UIData extends LeafData {
6869
6916
  this.__removeInput('fill');
6870
6917
  PaintImage.recycleImage('fill', this);
6871
6918
  this.__isFills = false;
6872
- if (this.__pixelFill)
6873
- this.__pixelFill = false;
6919
+ this.__pixelFill && (this.__pixelFill = false);
6874
6920
  }
6875
6921
  this._fill = value;
6876
6922
  }
6877
6923
  else if (typeof value === 'object') {
6878
6924
  this.__setInput('fill', value);
6879
- this.__leaf.__layout.boxChanged || this.__leaf.__layout.boxChange();
6925
+ const layout = this.__leaf.__layout;
6926
+ layout.boxChanged || layout.boxChange();
6880
6927
  this.__isFills = true;
6881
6928
  this._fill || (this._fill = emptyPaint);
6882
6929
  }
@@ -6887,14 +6934,14 @@ class UIData extends LeafData {
6887
6934
  this.__removeInput('stroke');
6888
6935
  PaintImage.recycleImage('stroke', this);
6889
6936
  this.__isStrokes = false;
6890
- if (this.__pixelStroke)
6891
- this.__pixelStroke = false;
6937
+ this.__pixelStroke && (this.__pixelStroke = false);
6892
6938
  }
6893
6939
  this._stroke = value;
6894
6940
  }
6895
6941
  else if (typeof value === 'object') {
6896
6942
  this.__setInput('stroke', value);
6897
- this.__leaf.__layout.boxChanged || this.__leaf.__layout.boxChange();
6943
+ const layout = this.__leaf.__layout;
6944
+ layout.boxChanged || layout.boxChange();
6898
6945
  this.__isStrokes = true;
6899
6946
  this._stroke || (this._stroke = emptyPaint);
6900
6947
  }
@@ -7009,6 +7056,31 @@ class TextData extends UIData {
7009
7056
  this._fontWeight = value;
7010
7057
  }
7011
7058
  }
7059
+ setBoxStyle(value) {
7060
+ let t = this.__leaf, box = t.__box;
7061
+ if (value) {
7062
+ const { boxStyle } = this;
7063
+ if (box)
7064
+ for (let key in boxStyle)
7065
+ box[key] = undefined;
7066
+ else
7067
+ box = t.__box = UICreator.get('Rect', 0);
7068
+ const layout = t.__layout, boxLayout = box.__layout;
7069
+ if (!boxStyle)
7070
+ box.parent = t, box.__world = t.__world, boxLayout.boxBounds = layout.boxBounds;
7071
+ box.set(value);
7072
+ if (boxLayout.strokeChanged)
7073
+ layout.strokeChange();
7074
+ if (boxLayout.renderChanged)
7075
+ layout.renderChange();
7076
+ box.__updateChange();
7077
+ }
7078
+ else if (box) {
7079
+ t.__box = box.parent = null;
7080
+ box.destroy();
7081
+ }
7082
+ this._boxStyle = value;
7083
+ }
7012
7084
  }
7013
7085
 
7014
7086
  class ImageData extends RectData {
@@ -7046,7 +7118,7 @@ class CanvasData extends RectData {
7046
7118
  const UIBounds = {
7047
7119
  __updateStrokeSpread() {
7048
7120
  let width = 0, boxWidth = 0;
7049
- const data = this.__, { strokeAlign, strokeWidth } = data;
7121
+ const data = this.__, { strokeAlign, strokeWidth } = data, box = this.__box;
7050
7122
  if ((data.stroke || data.hitStroke === 'all') && strokeWidth && strokeAlign !== 'inside') {
7051
7123
  boxWidth = width = strokeAlign === 'center' ? strokeWidth / 2 : strokeWidth;
7052
7124
  if (!data.__boxStroke) {
@@ -7057,6 +7129,10 @@ const UIBounds = {
7057
7129
  }
7058
7130
  if (data.__useArrow)
7059
7131
  width += strokeWidth * 5;
7132
+ if (box) {
7133
+ width = Math.max(box.__layout.strokeSpread = box.__updateStrokeSpread(), width);
7134
+ boxWidth = box.__layout.strokeBoxSpread;
7135
+ }
7060
7136
  this.__layout.strokeBoxSpread = boxWidth;
7061
7137
  return width;
7062
7138
  },
@@ -7075,25 +7151,26 @@ const UIBounds = {
7075
7151
  if (backgroundBlur)
7076
7152
  shapeWidth = Math.max(shapeWidth, backgroundBlur);
7077
7153
  this.__layout.renderShapeSpread = shapeWidth;
7078
- return width + (this.__layout.strokeSpread || 0);
7154
+ width += this.__layout.strokeSpread || 0;
7155
+ return this.__box ? Math.max(this.__box.__updateRenderSpread(), width) : width;
7079
7156
  }
7080
7157
  };
7081
7158
 
7082
7159
  const UIRender = {
7083
7160
  __updateChange() {
7084
- const data = this.__;
7161
+ const data = this.__, w = this.__world;
7085
7162
  if (data.__useEffect) {
7086
7163
  const { shadow, innerShadow, blur, backgroundBlur, filter } = this.__;
7087
7164
  data.__useEffect = !!(shadow || innerShadow || blur || backgroundBlur || filter);
7088
7165
  }
7166
+ const half = data.__hasHalf;
7167
+ w.half !== half && (w.half = half);
7089
7168
  data.__checkSingle();
7090
7169
  const complex = data.__isFills || data.__isStrokes || data.cornerRadius || data.__useEffect;
7091
- if (complex) {
7170
+ if (complex)
7092
7171
  data.__complex = true;
7093
- }
7094
- else {
7172
+ else
7095
7173
  data.__complex && (data.__complex = false);
7096
- }
7097
7174
  },
7098
7175
  __drawFast(canvas, options) {
7099
7176
  drawFast(this, canvas, options);
@@ -7180,10 +7257,11 @@ function drawFast(ui, canvas, options) {
7180
7257
 
7181
7258
  const RectRender = {
7182
7259
  __drawFast(canvas, options) {
7183
- let { width, height, fill, stroke, __drawAfterFill } = this.__;
7260
+ let { x, y, width, height } = this.__layout.boxBounds;
7261
+ const { fill, stroke, __drawAfterFill } = this.__;
7184
7262
  if (fill) {
7185
7263
  canvas.fillStyle = fill;
7186
- canvas.fillRect(0, 0, width, height);
7264
+ canvas.fillRect(x, y, width, height);
7187
7265
  }
7188
7266
  if (__drawAfterFill)
7189
7267
  this.__drawAfterFill(canvas, options);
@@ -7202,14 +7280,14 @@ const RectRender = {
7202
7280
  if (width < 0 || height < 0) {
7203
7281
  canvas.save();
7204
7282
  this.__clip(canvas, options);
7205
- canvas.strokeRect(half, half, width, height);
7283
+ canvas.strokeRect(x + half, y + half, width, height);
7206
7284
  canvas.restore();
7207
7285
  }
7208
7286
  else
7209
- canvas.strokeRect(half, half, width, height);
7287
+ canvas.strokeRect(x + half, y + half, width, height);
7210
7288
  break;
7211
7289
  case 'outside':
7212
- canvas.strokeRect(-half, -half, width + __strokeWidth, height + __strokeWidth);
7290
+ canvas.strokeRect(x - half, y - half, width + __strokeWidth, height + __strokeWidth);
7213
7291
  break;
7214
7292
  }
7215
7293
  }
@@ -7365,6 +7443,12 @@ __decorate([
7365
7443
  __decorate([
7366
7444
  surfaceType(false)
7367
7445
  ], UI.prototype, "locked", void 0);
7446
+ __decorate([
7447
+ surfaceType(false)
7448
+ ], UI.prototype, "dim", void 0);
7449
+ __decorate([
7450
+ surfaceType(false)
7451
+ ], UI.prototype, "dimskip", void 0);
7368
7452
  __decorate([
7369
7453
  sortType(0)
7370
7454
  ], UI.prototype, "zIndex", void 0);
@@ -7626,7 +7710,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
7626
7710
  start: true,
7627
7711
  hittable: true,
7628
7712
  smooth: true,
7629
- lazySpeard: 100
7713
+ lazySpeard: 100,
7630
7714
  };
7631
7715
  this.leafs = 0;
7632
7716
  this.__eventIds = [];
@@ -8050,13 +8134,13 @@ let Box = class Box extends Group {
8050
8134
  super.__updateRenderBounds();
8051
8135
  copy$2(childrenRenderBounds, renderBounds);
8052
8136
  this.__updateRectRenderBounds();
8053
- isOverflow = !includes$1(renderBounds, childrenRenderBounds);
8137
+ isOverflow = !includes$1(renderBounds, childrenRenderBounds) || undefined;
8054
8138
  if (isOverflow && this.__.overflow !== 'hide')
8055
8139
  add(renderBounds, childrenRenderBounds);
8056
8140
  }
8057
8141
  else
8058
8142
  this.__updateRectRenderBounds();
8059
- !this.isOverflow !== !isOverflow && (this.isOverflow = isOverflow);
8143
+ this.isOverflow !== isOverflow && (this.isOverflow = isOverflow);
8060
8144
  }
8061
8145
  __updateRectRenderBounds() { }
8062
8146
  __updateRectChange() { }
@@ -8464,33 +8548,13 @@ Canvas = __decorate([
8464
8548
  registerUI()
8465
8549
  ], Canvas);
8466
8550
 
8467
- const { copyAndSpread, includes, isSame: isSame$1, spread, setList } = BoundsHelper;
8551
+ const { copyAndSpread, includes, spread, setList } = BoundsHelper;
8468
8552
  let Text = class Text extends UI {
8469
8553
  get __tag() { return 'Text'; }
8470
- get textDrawData() {
8471
- this.__layout.update();
8472
- return this.__.__textDrawData;
8473
- }
8554
+ get textDrawData() { this.updateLayout(); return this.__.__textDrawData; }
8474
8555
  constructor(data) {
8475
8556
  super(data);
8476
8557
  }
8477
- __drawHitPath(canvas) {
8478
- const { __lineHeight, fontSize, __baseLine, __textDrawData: data } = this.__;
8479
- canvas.beginPath();
8480
- if (this.__.__letterSpacing < 0) {
8481
- this.__drawPathByData(canvas);
8482
- }
8483
- else {
8484
- data.rows.forEach(row => canvas.rect(row.x, row.y - __baseLine, row.width, __lineHeight < fontSize ? fontSize : __lineHeight));
8485
- }
8486
- }
8487
- __drawPathByData(drawer, _data) {
8488
- const { x, y, width, height } = this.__layout.boxBounds;
8489
- drawer.rect(x, y, width, height);
8490
- }
8491
- __drawRenderPath(canvas) {
8492
- canvas.font = this.__.__font;
8493
- }
8494
8558
  __updateTextDrawData() {
8495
8559
  const data = this.__;
8496
8560
  const { lineHeight, letterSpacing, fontFamily, fontSize, fontWeight, italic, textCase, textOverflow, padding } = data;
@@ -8507,15 +8571,16 @@ let Text = class Text extends UI {
8507
8571
  const layout = this.__layout;
8508
8572
  const { fontSize, italic, padding, __autoWidth: autoWidth, __autoHeight: autoHeight } = data;
8509
8573
  this.__updateTextDrawData();
8510
- const { bounds } = data.__textDrawData;
8574
+ const { bounds: contentBounds } = data.__textDrawData;
8511
8575
  const b = layout.boxBounds;
8576
+ layout.contentBounds = contentBounds;
8512
8577
  if (data.__lineHeight < fontSize)
8513
- spread(bounds, fontSize / 2);
8578
+ spread(contentBounds, fontSize / 2);
8514
8579
  if (autoWidth || autoHeight) {
8515
- b.x = autoWidth ? bounds.x : 0;
8516
- b.y = autoHeight ? bounds.y : 0;
8517
- b.width = autoWidth ? bounds.width : data.width;
8518
- b.height = autoHeight ? bounds.height : data.height;
8580
+ b.x = autoWidth ? contentBounds.x : 0;
8581
+ b.y = autoHeight ? contentBounds.y : 0;
8582
+ b.width = autoWidth ? contentBounds.width : data.width;
8583
+ b.height = autoHeight ? contentBounds.height : data.height;
8519
8584
  if (padding) {
8520
8585
  const [top, right, bottom, left] = data.__padding;
8521
8586
  if (autoWidth)
@@ -8529,23 +8594,45 @@ let Text = class Text extends UI {
8529
8594
  super.__updateBoxBounds();
8530
8595
  if (italic)
8531
8596
  b.width += fontSize * 0.16;
8532
- const contentBounds = includes(b, bounds) ? b : bounds;
8533
- if (!isSame$1(contentBounds, layout.contentBounds)) {
8534
- layout.contentBounds = contentBounds;
8535
- layout.renderChanged = true;
8536
- setList(data.__textBoxBounds = {}, [b, bounds]);
8537
- }
8597
+ const isOverflow = !includes(b, contentBounds) || undefined;
8598
+ if (isOverflow)
8599
+ setList(data.__textBoxBounds = {}, [b, contentBounds]), layout.renderChanged = true;
8538
8600
  else
8539
- data.__textBoxBounds = contentBounds;
8601
+ data.__textBoxBounds = b;
8602
+ this.isOverflow !== isOverflow && (this.isOverflow = isOverflow);
8603
+ }
8604
+ __onUpdateSize() {
8605
+ if (this.__box)
8606
+ this.__box.__onUpdateSize();
8607
+ super.__onUpdateSize();
8540
8608
  }
8541
8609
  __updateRenderSpread() {
8542
8610
  let width = super.__updateRenderSpread();
8543
8611
  if (!width)
8544
- width = this.__layout.boxBounds === this.__layout.contentBounds ? 0 : 1;
8612
+ width = this.isOverflow ? 1 : 0;
8545
8613
  return width;
8546
8614
  }
8547
8615
  __updateRenderBounds() {
8548
- copyAndSpread(this.__layout.renderBounds, this.__.__textBoxBounds, this.__layout.renderSpread);
8616
+ const { renderBounds, renderSpread } = this.__layout;
8617
+ copyAndSpread(renderBounds, this.__.__textBoxBounds, renderSpread);
8618
+ if (this.__box)
8619
+ this.__box.__layout.renderBounds = renderBounds;
8620
+ }
8621
+ __drawRenderPath(canvas) {
8622
+ canvas.font = this.__.__font;
8623
+ }
8624
+ __draw(canvas, options, originCanvas) {
8625
+ const box = this.__box;
8626
+ if (box)
8627
+ box.__nowWorld = this.__nowWorld, box.__draw(canvas, options, originCanvas);
8628
+ if (this.textEditing && !Export.running)
8629
+ return;
8630
+ super.__draw(canvas, options, originCanvas);
8631
+ }
8632
+ destroy() {
8633
+ if (this.boxStyle)
8634
+ this.boxStyle = null;
8635
+ super.destroy();
8549
8636
  }
8550
8637
  };
8551
8638
  __decorate([
@@ -8557,6 +8644,9 @@ __decorate([
8557
8644
  __decorate([
8558
8645
  boundsType(0)
8559
8646
  ], Text.prototype, "height", void 0);
8647
+ __decorate([
8648
+ surfaceType()
8649
+ ], Text.prototype, "boxStyle", void 0);
8560
8650
  __decorate([
8561
8651
  dataType(false)
8562
8652
  ], Text.prototype, "resizeFontSize", void 0);
@@ -9042,9 +9132,11 @@ const tempBox = new Bounds();
9042
9132
  const tempPoint = {};
9043
9133
  const tempScaleData = {};
9044
9134
  function createData(leafPaint, image, paint, box) {
9045
- const { blendMode, sync } = paint;
9135
+ const { blendMode, changeful, sync } = paint;
9046
9136
  if (blendMode)
9047
9137
  leafPaint.blendMode = blendMode;
9138
+ if (changeful)
9139
+ leafPaint.changeful = changeful;
9048
9140
  if (sync)
9049
9141
  leafPaint.sync = sync;
9050
9142
  leafPaint.data = getPatternData(paint, box, image);
@@ -9277,40 +9369,32 @@ function createPattern(ui, paint, pixelRatio) {
9277
9369
  }
9278
9370
 
9279
9371
  const { abs } = Math;
9280
- function checkImage(ui, canvas, paint, allowPaint) {
9372
+ function checkImage(ui, canvas, paint, allowDraw) {
9281
9373
  const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9282
- const { pixelRatio } = canvas;
9283
- if (!paint.data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
9374
+ const { pixelRatio } = canvas, { data } = paint;
9375
+ if (!data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
9284
9376
  return false;
9285
9377
  }
9286
9378
  else {
9287
- const { data } = paint;
9288
- if (allowPaint) {
9289
- if (!data.repeat) {
9290
- let { width, height } = data;
9291
- width *= abs(scaleX) * pixelRatio;
9292
- height *= abs(scaleY) * pixelRatio;
9293
- if (data.scaleX) {
9294
- width *= data.scaleX;
9295
- height *= data.scaleY;
9296
- }
9297
- allowPaint = (width * height > Platform.image.maxCacheSize) || Export.running;
9379
+ if (allowDraw) {
9380
+ if (data.repeat) {
9381
+ allowDraw = false;
9298
9382
  }
9299
9383
  else {
9300
- allowPaint = false;
9384
+ if (!(paint.changeful || ResizeEvent.isResizing(ui) || Export.running)) {
9385
+ let { width, height } = data;
9386
+ width *= abs(scaleX) * pixelRatio;
9387
+ height *= abs(scaleY) * pixelRatio;
9388
+ if (data.scaleX) {
9389
+ width *= data.scaleX;
9390
+ height *= data.scaleY;
9391
+ }
9392
+ allowDraw = (width * height > Platform.image.maxCacheSize);
9393
+ }
9301
9394
  }
9302
9395
  }
9303
- if (allowPaint) {
9304
- canvas.save();
9305
- ui.windingRule ? canvas.clip(ui.windingRule) : canvas.clip();
9306
- if (paint.blendMode)
9307
- canvas.blendMode = paint.blendMode;
9308
- if (data.opacity)
9309
- canvas.opacity *= data.opacity;
9310
- if (data.transform)
9311
- canvas.transform(data.transform);
9312
- canvas.drawImage(paint.image.getFull(data.filters), 0, 0, data.width, data.height);
9313
- canvas.restore();
9396
+ if (allowDraw) {
9397
+ drawImage(ui, canvas, paint, data);
9314
9398
  return true;
9315
9399
  }
9316
9400
  else {
@@ -9331,13 +9415,26 @@ function checkImage(ui, canvas, paint, allowPaint) {
9331
9415
  }
9332
9416
  }
9333
9417
  }
9418
+ function drawImage(ui, canvas, paint, data) {
9419
+ canvas.save();
9420
+ ui.windingRule ? canvas.clip(ui.windingRule) : canvas.clip();
9421
+ if (paint.blendMode)
9422
+ canvas.blendMode = paint.blendMode;
9423
+ if (data.opacity)
9424
+ canvas.opacity *= data.opacity;
9425
+ if (data.transform)
9426
+ canvas.transform(data.transform);
9427
+ canvas.drawImage(paint.image.getFull(data.filters), 0, 0, data.width, data.height);
9428
+ canvas.restore();
9429
+ }
9334
9430
 
9335
9431
  function recycleImage(attrName, data) {
9336
9432
  const paints = data['_' + attrName];
9337
9433
  if (paints instanceof Array) {
9338
- let image, recycleMap, input, url;
9434
+ let paint, image, recycleMap, input, url;
9339
9435
  for (let i = 0, len = paints.length; i < len; i++) {
9340
- image = paints[i].image;
9436
+ paint = paints[i];
9437
+ image = paint.image;
9341
9438
  url = image && image.url;
9342
9439
  if (url) {
9343
9440
  if (!recycleMap)
@@ -9352,8 +9449,6 @@ function recycleImage(attrName, data) {
9352
9449
  }
9353
9450
  image.unload(paints[i].loadId, !input.some((item) => item.url === url));
9354
9451
  }
9355
- else
9356
- paints[i].style = null;
9357
9452
  }
9358
9453
  }
9359
9454
  return recycleMap;
@@ -9532,7 +9627,7 @@ const { toOffsetOutBounds } = BoundsHelper;
9532
9627
  const offsetOutBounds = {};
9533
9628
  function innerShadow(ui, current, shape) {
9534
9629
  let copyBounds, spreadScale;
9535
- const { __nowWorld: nowWorld, __layout: __layout } = ui;
9630
+ const { __nowWorld: nowWorld, __layout } = ui;
9536
9631
  const { innerShadow } = ui.__;
9537
9632
  const { worldCanvas, bounds, shapeBounds, scaleX, scaleY } = shape;
9538
9633
  const other = current.getSameCanvas();