@leafer-ui/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.
package/dist/worker.js CHANGED
@@ -48,7 +48,7 @@ var LeaferUI = (function (exports) {
48
48
  };
49
49
  const I$2 = IncrementId;
50
50
 
51
- const { round, pow: pow$1, PI: PI$4 } = Math;
51
+ const { round: round$3, pow: pow$1, PI: PI$4 } = Math;
52
52
  const MathHelper = {
53
53
  within(value, min, max) {
54
54
  if (typeof min === 'object')
@@ -112,7 +112,7 @@ var LeaferUI = (function (exports) {
112
112
  },
113
113
  float(num, maxLength) {
114
114
  const a = maxLength !== undefined ? pow$1(10, maxLength) : 1000000000000;
115
- num = round(num * a) / a;
115
+ num = round$3(num * a) / a;
116
116
  return num === -0 ? 0 : num;
117
117
  },
118
118
  getScaleData(scale, size, originSize, scaleData) {
@@ -135,8 +135,15 @@ var LeaferUI = (function (exports) {
135
135
  scaleData.scaleX = scale.x;
136
136
  scaleData.scaleY = scale.y;
137
137
  }
138
+ },
139
+ randInt,
140
+ randColor(opacity) {
141
+ return `rgba(${randInt(255)},${randInt(255)},${randInt(255)},${opacity || 1})`;
138
142
  }
139
143
  };
144
+ function randInt(num) {
145
+ return Math.round(Math.random() * num);
146
+ }
140
147
  const OneRadian = PI$4 / 180;
141
148
  const PI2 = PI$4 * 2;
142
149
  const PI_2 = PI$4 / 2;
@@ -434,7 +441,7 @@ var LeaferUI = (function (exports) {
434
441
  const M$6 = MatrixHelper;
435
442
 
436
443
  const { toInnerPoint: toInnerPoint$2, toOuterPoint: toOuterPoint$3 } = MatrixHelper;
437
- const { sin: sin$4, cos: cos$4, abs: abs$4, sqrt: sqrt$2, atan2: atan2$2, min: min$1, PI: PI$3 } = Math;
444
+ 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;
438
445
  const PointHelper = {
439
446
  defaultPoint: getPointData(),
440
447
  tempPoint: {},
@@ -455,6 +462,10 @@ var LeaferUI = (function (exports) {
455
462
  t.x = x;
456
463
  t.y = y;
457
464
  },
465
+ round(t, halfPixel) {
466
+ t.x = halfPixel ? round$2(t.x - 0.5) + 0.5 : round$2(t.x);
467
+ t.y = halfPixel ? round$2(t.y - 0.5) + 0.5 : round$2(t.y);
468
+ },
458
469
  move(t, x, y) {
459
470
  t.x += x;
460
471
  t.y += y;
@@ -1320,6 +1331,7 @@ var LeaferUI = (function (exports) {
1320
1331
  'E': 1
1321
1332
  };
1322
1333
 
1334
+ const { randColor } = MathHelper;
1323
1335
  class Debug {
1324
1336
  constructor(name) {
1325
1337
  this.repeatMap = {};
@@ -1334,6 +1346,19 @@ var LeaferUI = (function (exports) {
1334
1346
  static set exclude(name) {
1335
1347
  this.excludeList = getNameList(name);
1336
1348
  }
1349
+ static drawRepaint(canvas, bounds) {
1350
+ const color = randColor();
1351
+ canvas.fillWorld(bounds, color.replace('1)', '.1)'));
1352
+ canvas.strokeWorld(bounds, color);
1353
+ }
1354
+ static drawBounds(leaf, canvas, _options) {
1355
+ const showHit = Debug.showBounds === 'hit', w = leaf.__nowWorld, color = randColor();
1356
+ if (showHit)
1357
+ canvas.setWorld(w), leaf.__drawHitPath(canvas), canvas.fillStyle = color.replace('1)', '.2)'), canvas.fill();
1358
+ canvas.resetTransform();
1359
+ canvas.setStroke(color, 2);
1360
+ showHit ? canvas.stroke() : canvas.strokeWorld(w, color);
1361
+ }
1337
1362
  log(...messages) {
1338
1363
  if (D$4.enable) {
1339
1364
  if (D$4.filterList.length && D$4.filterList.every(name => name !== this.name))
@@ -1420,7 +1445,7 @@ var LeaferUI = (function (exports) {
1420
1445
  return rs;
1421
1446
  },
1422
1447
  need(name) {
1423
- console.error('need plugin: ' + (name.includes('-x') ? '' : '@leafer-in/') + name);
1448
+ console.error('please install plugin: ' + (name.includes('-x') ? '' : '@leafer-in/') + name);
1424
1449
  }
1425
1450
  };
1426
1451
  setTimeout(() => check.forEach(name => Plugin.has(name, true)));
@@ -2020,7 +2045,7 @@ var LeaferUI = (function (exports) {
2020
2045
  contextMethod()
2021
2046
  ], Canvas.prototype, "strokeText", null);
2022
2047
 
2023
- const { copy: copy$9 } = MatrixHelper;
2048
+ const { copy: copy$9, multiplyParent: multiplyParent$3 } = MatrixHelper, { round: round$1 } = Math;
2024
2049
  const minSize = { width: 1, height: 1, pixelRatio: 1 };
2025
2050
  const canvasSizeAttrs = ['width', 'height', 'pixelRatio'];
2026
2051
  class LeaferCanvasBase extends Canvas {
@@ -2029,6 +2054,8 @@ var LeaferUI = (function (exports) {
2029
2054
  get pixelRatio() { return this.size.pixelRatio; }
2030
2055
  get pixelWidth() { return this.width * this.pixelRatio; }
2031
2056
  get pixelHeight() { return this.height * this.pixelRatio; }
2057
+ get pixelSnap() { return this.config.pixelSnap; }
2058
+ set pixelSnap(value) { this.config.pixelSnap = value; }
2032
2059
  get allowBackgroundColor() { return this.view && this.parentView; }
2033
2060
  constructor(config, manager) {
2034
2061
  super();
@@ -2089,15 +2116,22 @@ var LeaferUI = (function (exports) {
2089
2116
  stopAutoLayout() { }
2090
2117
  setCursor(_cursor) { }
2091
2118
  setWorld(matrix, parentMatrix) {
2092
- const { pixelRatio } = this;
2093
- const w = this.worldTransform;
2094
- if (parentMatrix) {
2095
- const { a, b, c, d, e, f } = parentMatrix;
2096
- 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);
2097
- }
2098
- else {
2099
- 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);
2119
+ const { pixelRatio, pixelSnap } = this, w = this.worldTransform;
2120
+ if (parentMatrix)
2121
+ multiplyParent$3(matrix, parentMatrix, w);
2122
+ w.a = matrix.a * pixelRatio;
2123
+ w.b = matrix.b * pixelRatio;
2124
+ w.c = matrix.c * pixelRatio;
2125
+ w.d = matrix.d * pixelRatio;
2126
+ w.e = matrix.e * pixelRatio;
2127
+ w.f = matrix.f * pixelRatio;
2128
+ if (pixelSnap) {
2129
+ if (matrix.half && (matrix.half * pixelRatio) % 2)
2130
+ w.e = round$1(w.e - 0.5) + 0.5, w.f = round$1(w.f - 0.5) + 0.5;
2131
+ else
2132
+ w.e = round$1(w.e), w.f = round$1(w.f);
2100
2133
  }
2134
+ this.setTransform(w.a, w.b, w.c, w.d, w.e, w.f);
2101
2135
  }
2102
2136
  useWorldTransform(worldTransform) {
2103
2137
  if (worldTransform)
@@ -2240,12 +2274,13 @@ var LeaferUI = (function (exports) {
2240
2274
  return this.width === size.width && this.height === size.height && (!size.pixelRatio || this.pixelRatio === size.pixelRatio);
2241
2275
  }
2242
2276
  getSameCanvas(useSameWorldTransform, useSameSmooth) {
2243
- const canvas = this.manager ? this.manager.get(this.size) : Creator.canvas(Object.assign({}, this.size));
2277
+ const { size, pixelSnap } = this, canvas = this.manager ? this.manager.get(size) : Creator.canvas(Object.assign({}, size));
2244
2278
  canvas.save();
2245
2279
  if (useSameWorldTransform)
2246
2280
  copy$9(canvas.worldTransform, this.worldTransform), canvas.useWorldTransform();
2247
2281
  if (useSameSmooth)
2248
2282
  canvas.smooth = this.smooth;
2283
+ canvas.pixelSnap !== pixelSnap && (canvas.pixelSnap = pixelSnap);
2249
2284
  return canvas;
2250
2285
  }
2251
2286
  recycle(clearBounds) {
@@ -3672,7 +3707,7 @@ var LeaferUI = (function (exports) {
3672
3707
  const R = Resource;
3673
3708
 
3674
3709
  const ImageManager = {
3675
- maxRecycled: 100,
3710
+ maxRecycled: 10,
3676
3711
  recycledList: [],
3677
3712
  patternTasker: new TaskProcessor(),
3678
3713
  get(config) {
@@ -4025,9 +4060,8 @@ var LeaferUI = (function (exports) {
4025
4060
  set(value) {
4026
4061
  if (this.__setAttr(key, value)) {
4027
4062
  this.__layout.hitCanvasChanged = true;
4028
- if (Debug.showHitView) {
4063
+ if (Debug.showBounds === 'hit')
4029
4064
  this.__layout.surfaceChanged || this.__layout.surfaceChange();
4030
- }
4031
4065
  if (this.leafer)
4032
4066
  this.leafer.updateCursor();
4033
4067
  }
@@ -4188,7 +4222,7 @@ var LeaferUI = (function (exports) {
4188
4222
  }
4189
4223
 
4190
4224
  const { copy: copy$7, toInnerPoint: toInnerPoint$1, toOuterPoint: toOuterPoint$1, scaleOfOuter: scaleOfOuter$2, rotateOfOuter: rotateOfOuter$2, skewOfOuter, multiplyParent: multiplyParent$2, divideParent, getLayout } = MatrixHelper;
4191
- const matrix$1 = {};
4225
+ const matrix$1 = {}, { round } = Math;
4192
4226
  const LeafHelper = {
4193
4227
  updateAllMatrix(leaf, checkAutoLayout, waitAutoLayout) {
4194
4228
  if (checkAutoLayout && leaf.__hasAutoLayout && leaf.__layout.matrixChanged)
@@ -4262,6 +4296,8 @@ var LeaferUI = (function (exports) {
4262
4296
  y = x.y, x = x.x;
4263
4297
  x += t.x;
4264
4298
  y += t.y;
4299
+ if (t.leafer && t.leafer.config.pointSnap)
4300
+ x = round(x), y = round(y);
4265
4301
  transition ? t.animate({ x, y }, transition) : (t.x = x, t.y = y);
4266
4302
  },
4267
4303
  zoomOfWorld(t, origin, scaleX, scaleY, resize, transition) {
@@ -4500,6 +4536,7 @@ var LeaferUI = (function (exports) {
4500
4536
  set contentBounds(bounds) { this._contentBounds = bounds; }
4501
4537
  get strokeBounds() { return this._strokeBounds || this.boxBounds; }
4502
4538
  get renderBounds() { return this._renderBounds || this.boxBounds; }
4539
+ set renderBounds(bounds) { this._renderBounds = bounds; }
4503
4540
  get localContentBounds() { toOuterOf$2(this.contentBounds, this.leaf.__localMatrix, this[localContent] || (this[localContent] = {})); return this[localContent]; }
4504
4541
  get localStrokeBounds() { return this._localStrokeBounds || this; }
4505
4542
  get localRenderBounds() { return this._localRenderBounds || this; }
@@ -4518,11 +4555,13 @@ var LeaferUI = (function (exports) {
4518
4555
  get height() { return this.boxBounds.height; }
4519
4556
  constructor(leaf) {
4520
4557
  this.leaf = leaf;
4521
- this.boxBounds = { x: 0, y: 0, width: 0, height: 0 };
4522
4558
  if (this.leaf.__local)
4523
4559
  this._localRenderBounds = this._localStrokeBounds = this.leaf.__local;
4524
- this.boxChange();
4525
- this.matrixChange();
4560
+ if (leaf.__world) {
4561
+ this.boxBounds = { x: 0, y: 0, width: 0, height: 0 };
4562
+ this.boxChange();
4563
+ this.matrixChange();
4564
+ }
4526
4565
  }
4527
4566
  createLocal() {
4528
4567
  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 };
@@ -4854,6 +4893,9 @@ var LeaferUI = (function (exports) {
4854
4893
  }
4855
4894
  this.old = oldSize;
4856
4895
  }
4896
+ static isResizing(leaf) {
4897
+ return this.resizingKeys && this.resizingKeys[leaf.innerId] !== undefined;
4898
+ }
4857
4899
  }
4858
4900
  ResizeEvent.RESIZE = 'resize';
4859
4901
 
@@ -4896,6 +4938,7 @@ var LeaferUI = (function (exports) {
4896
4938
  }
4897
4939
  RenderEvent.REQUEST = 'render.request';
4898
4940
  RenderEvent.CHILD_START = 'render.child_start';
4941
+ RenderEvent.CHILD_END = 'render.child_end';
4899
4942
  RenderEvent.START = 'render.start';
4900
4943
  RenderEvent.BEFORE = 'render.before';
4901
4944
  RenderEvent.RENDER = 'render';
@@ -5275,24 +5318,27 @@ var LeaferUI = (function (exports) {
5275
5318
  const LeafRender = {
5276
5319
  __render(canvas, options) {
5277
5320
  if (this.__worldOpacity) {
5321
+ const data = this.__;
5278
5322
  canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
5279
- canvas.opacity = this.__.opacity;
5323
+ canvas.opacity = options.dimOpacity && !data.dimskip ? data.opacity * options.dimOpacity : data.opacity;
5280
5324
  if (this.__.__single) {
5281
- if (this.__.eraser === 'path')
5325
+ if (data.eraser === 'path')
5282
5326
  return this.__renderEraser(canvas, options);
5283
5327
  const tempCanvas = canvas.getSameCanvas(true, true);
5284
5328
  this.__draw(tempCanvas, options, canvas);
5285
5329
  if (this.__worldFlipped) {
5286
- canvas.copyWorldByReset(tempCanvas, this.__nowWorld, null, this.__.__blendMode, true);
5330
+ canvas.copyWorldByReset(tempCanvas, this.__nowWorld, null, data.__blendMode, true);
5287
5331
  }
5288
5332
  else {
5289
- canvas.copyWorldToInner(tempCanvas, this.__nowWorld, this.__layout.renderBounds, this.__.__blendMode);
5333
+ canvas.copyWorldToInner(tempCanvas, this.__nowWorld, this.__layout.renderBounds, data.__blendMode);
5290
5334
  }
5291
5335
  tempCanvas.recycle(this.__nowWorld);
5292
5336
  }
5293
5337
  else {
5294
5338
  this.__draw(canvas, options);
5295
5339
  }
5340
+ if (Debug.showBounds)
5341
+ Debug.drawBounds(this, canvas, options);
5296
5342
  }
5297
5343
  },
5298
5344
  __clip(canvas, options) {
@@ -5322,14 +5368,19 @@ var LeaferUI = (function (exports) {
5322
5368
  __render(canvas, options) {
5323
5369
  this.__nowWorld = this.__getNowWorld(options);
5324
5370
  if (this.__worldOpacity) {
5325
- if (this.__.__single) {
5326
- if (this.__.eraser === 'path')
5371
+ const data = this.__;
5372
+ if (data.dim)
5373
+ options.dimOpacity = data.dim === true ? 0.2 : data.dim;
5374
+ else if (data.dimskip)
5375
+ options.dimOpacity && (options.dimOpacity = 0);
5376
+ if (data.__single) {
5377
+ if (data.eraser === 'path')
5327
5378
  return this.__renderEraser(canvas, options);
5328
5379
  const tempCanvas = canvas.getSameCanvas(false, true);
5329
5380
  this.__renderBranch(tempCanvas, options);
5330
5381
  const nowWorld = this.__nowWorld;
5331
- canvas.opacity = this.__.opacity;
5332
- canvas.copyWorldByReset(tempCanvas, nowWorld, nowWorld, this.__.__blendMode, true);
5382
+ canvas.opacity = options.dimOpacity ? data.opacity * options.dimOpacity : data.opacity;
5383
+ canvas.copyWorldByReset(tempCanvas, nowWorld, nowWorld, data.__blendMode, true);
5333
5384
  tempCanvas.recycle(nowWorld);
5334
5385
  }
5335
5386
  else {
@@ -5404,9 +5455,11 @@ var LeaferUI = (function (exports) {
5404
5455
  reset(data) {
5405
5456
  if (this.leafer)
5406
5457
  this.leafer.forceRender(this.__world);
5407
- 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 };
5408
- if (data !== null)
5409
- this.__local = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0 };
5458
+ if (data !== 0) {
5459
+ 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 };
5460
+ if (data !== null)
5461
+ this.__local = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0 };
5462
+ }
5410
5463
  this.__worldOpacity = 1;
5411
5464
  this.__ = new this.__DataProcessor(this);
5412
5465
  this.__layout = new this.__LayoutProcessor(this);
@@ -5542,9 +5595,10 @@ var LeaferUI = (function (exports) {
5542
5595
  if (options.matrix) {
5543
5596
  if (!this.__cameraWorld)
5544
5597
  this.__cameraWorld = {};
5545
- const cameraWorld = this.__cameraWorld;
5546
- multiplyParent(this.__world, options.matrix, cameraWorld, undefined, this.__world);
5598
+ const cameraWorld = this.__cameraWorld, world = this.__world;
5599
+ multiplyParent(world, options.matrix, cameraWorld, undefined, world);
5547
5600
  toOuterOf(this.__layout.renderBounds, cameraWorld, cameraWorld);
5601
+ cameraWorld.half !== world.half && (cameraWorld.half = world.half);
5548
5602
  return cameraWorld;
5549
5603
  }
5550
5604
  else {
@@ -5704,7 +5758,7 @@ var LeaferUI = (function (exports) {
5704
5758
  __updateHitCanvas() { }
5705
5759
  __render(_canvas, _options) { }
5706
5760
  __drawFast(_canvas, _options) { }
5707
- __draw(_canvas, _options) { }
5761
+ __draw(_canvas, _options, _originCanvas) { }
5708
5762
  __clip(_canvas, _options) { }
5709
5763
  __renderShape(_canvas, _options, _ignoreFill, _ignoreStroke) { }
5710
5764
  __updateWorldOpacity() { }
@@ -6074,7 +6128,7 @@ var LeaferUI = (function (exports) {
6074
6128
  }
6075
6129
  }
6076
6130
 
6077
- const version = "1.5.2";
6131
+ const version = "1.6.0";
6078
6132
 
6079
6133
  class LeaferCanvas extends LeaferCanvasBase {
6080
6134
  get allowBackgroundColor() { return true; }
@@ -6314,7 +6368,6 @@ var LeaferUI = (function (exports) {
6314
6368
  }
6315
6369
 
6316
6370
  const { worldBounds } = LeafBoundsHelper;
6317
- const bigBounds = { x: 0, y: 0, width: 100000, height: 100000 };
6318
6371
  class LayoutBlockData {
6319
6372
  constructor(list) {
6320
6373
  this.updatedBounds = new Bounds();
@@ -6328,13 +6381,7 @@ var LeaferUI = (function (exports) {
6328
6381
  this.beforeBounds.setListWithFn(this.updatedList.list, worldBounds);
6329
6382
  }
6330
6383
  setAfter() {
6331
- const { list } = this.updatedList;
6332
- if (list.some(leaf => leaf.noBounds)) {
6333
- this.afterBounds.set(bigBounds);
6334
- }
6335
- else {
6336
- this.afterBounds.setListWithFn(list, worldBounds);
6337
- }
6384
+ this.afterBounds.setListWithFn(this.updatedList.list, worldBounds);
6338
6385
  this.updatedBounds.setList([this.beforeBounds, this.afterBounds]);
6339
6386
  }
6340
6387
  merge(data) {
@@ -6536,6 +6583,13 @@ var LeaferUI = (function (exports) {
6536
6583
  requestLayout() {
6537
6584
  this.target.emit(LayoutEvent.REQUEST);
6538
6585
  }
6586
+ checkRender() {
6587
+ if (this.running) {
6588
+ if (this.changed && this.canvas.view)
6589
+ this.render();
6590
+ this.target.emit(RenderEvent.NEXT);
6591
+ }
6592
+ }
6539
6593
  render(callback) {
6540
6594
  if (!(this.running && this.canvas.view))
6541
6595
  return this.update();
@@ -6544,8 +6598,6 @@ var LeaferUI = (function (exports) {
6544
6598
  this.totalBounds = new Bounds();
6545
6599
  debug$3.log(target.innerName, '--->');
6546
6600
  try {
6547
- if (!target.isApp)
6548
- target.app.emit(RenderEvent.CHILD_START, target);
6549
6601
  this.emitRender(RenderEvent.START);
6550
6602
  this.renderOnce(callback);
6551
6603
  this.emitRender(RenderEvent.END, this.totalBounds);
@@ -6613,20 +6665,12 @@ var LeaferUI = (function (exports) {
6613
6665
  }
6614
6666
  clipRender(block) {
6615
6667
  const t = Run.start('PartRender');
6616
- const { canvas } = this;
6617
- const bounds = block.getIntersect(canvas.bounds);
6618
- const includes = block.includes(this.target.__world);
6619
- const realBounds = new Bounds(bounds);
6668
+ const { canvas } = this, bounds = block.getIntersect(canvas.bounds), realBounds = new Bounds(bounds);
6620
6669
  canvas.save();
6621
- if (includes && !Debug.showRepaint) {
6622
- canvas.clear();
6623
- }
6624
- else {
6625
- bounds.spread(10 + 1 / this.canvas.pixelRatio).ceil();
6626
- canvas.clearWorld(bounds, true);
6627
- canvas.clipWorld(bounds, true);
6628
- }
6629
- this.__render(bounds, includes, realBounds);
6670
+ bounds.spread(Renderer.clipSpread).ceil();
6671
+ canvas.clearWorld(bounds, true);
6672
+ canvas.clipWorld(bounds, true);
6673
+ this.__render(bounds, block.includes(this.target.__world), realBounds);
6630
6674
  canvas.restore();
6631
6675
  Run.end(t);
6632
6676
  }
@@ -6640,23 +6684,17 @@ var LeaferUI = (function (exports) {
6640
6684
  Run.end(t);
6641
6685
  }
6642
6686
  __render(bounds, includes, realBounds) {
6643
- const options = bounds.includes(this.target.__world) ? { includes } : { bounds, includes };
6687
+ const { canvas } = this, options = includes ? { includes } : { bounds, includes };
6644
6688
  if (this.needFill)
6645
- this.canvas.fillWorld(bounds, this.config.fill);
6689
+ canvas.fillWorld(bounds, this.config.fill);
6646
6690
  if (Debug.showRepaint)
6647
- this.canvas.strokeWorld(bounds, 'red');
6648
- this.target.__render(this.canvas, options);
6691
+ Debug.drawRepaint(canvas, bounds);
6692
+ this.target.__render(canvas, options);
6649
6693
  this.renderBounds = realBounds = realBounds || bounds;
6650
6694
  this.renderOptions = options;
6651
6695
  this.totalBounds.isEmpty() ? this.totalBounds = realBounds : this.totalBounds.add(realBounds);
6652
- if (Debug.showHitView)
6653
- this.renderHitView(options);
6654
- if (Debug.showBoundsView)
6655
- this.renderBoundsView(options);
6656
- this.canvas.updateRender(realBounds);
6657
- }
6658
- renderHitView(_options) { }
6659
- renderBoundsView(_options) { }
6696
+ canvas.updateRender(realBounds);
6697
+ }
6660
6698
  addBlock(block) {
6661
6699
  if (!this.updateBlocks)
6662
6700
  this.updateBlocks = [];
@@ -6672,17 +6710,24 @@ var LeaferUI = (function (exports) {
6672
6710
  }
6673
6711
  }
6674
6712
  __requestRender() {
6713
+ const target = this.target;
6714
+ if (target.parentApp)
6715
+ return target.parentApp.renderer.update(false);
6675
6716
  if (this.requestTime)
6676
6717
  return;
6677
6718
  const requestTime = this.requestTime = Date.now();
6678
6719
  Platform.requestRender(() => {
6679
6720
  this.FPS = Math.min(60, Math.ceil(1000 / (Date.now() - requestTime)));
6680
6721
  this.requestTime = 0;
6681
- if (this.running) {
6682
- if (this.changed && this.canvas.view)
6683
- this.render();
6684
- this.target.emit(RenderEvent.NEXT);
6722
+ if (target.isApp) {
6723
+ target.emit(RenderEvent.CHILD_START, target);
6724
+ target.children.forEach(leafer => {
6725
+ leafer.renderer.FPS = this.FPS;
6726
+ leafer.renderer.checkRender();
6727
+ });
6728
+ target.emit(RenderEvent.CHILD_END, target);
6685
6729
  }
6730
+ this.checkRender();
6686
6731
  });
6687
6732
  }
6688
6733
  __onResize(e) {
@@ -6740,6 +6785,7 @@ var LeaferUI = (function (exports) {
6740
6785
  }
6741
6786
  }
6742
6787
  }
6788
+ Renderer.clipSpread = 10;
6743
6789
 
6744
6790
  const { hitRadiusPoint } = BoundsHelper;
6745
6791
  class Picker {
@@ -6985,6 +7031,7 @@ var LeaferUI = (function (exports) {
6985
7031
  return strokeWidth;
6986
7032
  }
6987
7033
  get __hasStroke() { return this.stroke && this.strokeWidth; }
7034
+ get __hasHalf() { const t = this; return (t.stroke && t.strokeAlign === 'center' && t.strokeWidth % 2) || undefined; }
6988
7035
  get __hasMultiPaint() {
6989
7036
  const t = this;
6990
7037
  if ((t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect)
@@ -7029,14 +7076,14 @@ var LeaferUI = (function (exports) {
7029
7076
  this.__removeInput('fill');
7030
7077
  PaintImage.recycleImage('fill', this);
7031
7078
  this.__isFills = false;
7032
- if (this.__pixelFill)
7033
- this.__pixelFill = false;
7079
+ this.__pixelFill && (this.__pixelFill = false);
7034
7080
  }
7035
7081
  this._fill = value;
7036
7082
  }
7037
7083
  else if (typeof value === 'object') {
7038
7084
  this.__setInput('fill', value);
7039
- this.__leaf.__layout.boxChanged || this.__leaf.__layout.boxChange();
7085
+ const layout = this.__leaf.__layout;
7086
+ layout.boxChanged || layout.boxChange();
7040
7087
  this.__isFills = true;
7041
7088
  this._fill || (this._fill = emptyPaint);
7042
7089
  }
@@ -7047,14 +7094,14 @@ var LeaferUI = (function (exports) {
7047
7094
  this.__removeInput('stroke');
7048
7095
  PaintImage.recycleImage('stroke', this);
7049
7096
  this.__isStrokes = false;
7050
- if (this.__pixelStroke)
7051
- this.__pixelStroke = false;
7097
+ this.__pixelStroke && (this.__pixelStroke = false);
7052
7098
  }
7053
7099
  this._stroke = value;
7054
7100
  }
7055
7101
  else if (typeof value === 'object') {
7056
7102
  this.__setInput('stroke', value);
7057
- this.__leaf.__layout.boxChanged || this.__leaf.__layout.boxChange();
7103
+ const layout = this.__leaf.__layout;
7104
+ layout.boxChanged || layout.boxChange();
7058
7105
  this.__isStrokes = true;
7059
7106
  this._stroke || (this._stroke = emptyPaint);
7060
7107
  }
@@ -7169,6 +7216,31 @@ var LeaferUI = (function (exports) {
7169
7216
  this._fontWeight = value;
7170
7217
  }
7171
7218
  }
7219
+ setBoxStyle(value) {
7220
+ let t = this.__leaf, box = t.__box;
7221
+ if (value) {
7222
+ const { boxStyle } = this;
7223
+ if (box)
7224
+ for (let key in boxStyle)
7225
+ box[key] = undefined;
7226
+ else
7227
+ box = t.__box = UICreator.get('Rect', 0);
7228
+ const layout = t.__layout, boxLayout = box.__layout;
7229
+ if (!boxStyle)
7230
+ box.parent = t, box.__world = t.__world, boxLayout.boxBounds = layout.boxBounds;
7231
+ box.set(value);
7232
+ if (boxLayout.strokeChanged)
7233
+ layout.strokeChange();
7234
+ if (boxLayout.renderChanged)
7235
+ layout.renderChange();
7236
+ box.__updateChange();
7237
+ }
7238
+ else if (box) {
7239
+ t.__box = box.parent = null;
7240
+ box.destroy();
7241
+ }
7242
+ this._boxStyle = value;
7243
+ }
7172
7244
  }
7173
7245
 
7174
7246
  class ImageData extends RectData {
@@ -7206,7 +7278,7 @@ var LeaferUI = (function (exports) {
7206
7278
  const UIBounds = {
7207
7279
  __updateStrokeSpread() {
7208
7280
  let width = 0, boxWidth = 0;
7209
- const data = this.__, { strokeAlign, strokeWidth } = data;
7281
+ const data = this.__, { strokeAlign, strokeWidth } = data, box = this.__box;
7210
7282
  if ((data.stroke || data.hitStroke === 'all') && strokeWidth && strokeAlign !== 'inside') {
7211
7283
  boxWidth = width = strokeAlign === 'center' ? strokeWidth / 2 : strokeWidth;
7212
7284
  if (!data.__boxStroke) {
@@ -7217,6 +7289,10 @@ var LeaferUI = (function (exports) {
7217
7289
  }
7218
7290
  if (data.__useArrow)
7219
7291
  width += strokeWidth * 5;
7292
+ if (box) {
7293
+ width = Math.max(box.__layout.strokeSpread = box.__updateStrokeSpread(), width);
7294
+ boxWidth = box.__layout.strokeBoxSpread;
7295
+ }
7220
7296
  this.__layout.strokeBoxSpread = boxWidth;
7221
7297
  return width;
7222
7298
  },
@@ -7235,25 +7311,26 @@ var LeaferUI = (function (exports) {
7235
7311
  if (backgroundBlur)
7236
7312
  shapeWidth = Math.max(shapeWidth, backgroundBlur);
7237
7313
  this.__layout.renderShapeSpread = shapeWidth;
7238
- return width + (this.__layout.strokeSpread || 0);
7314
+ width += this.__layout.strokeSpread || 0;
7315
+ return this.__box ? Math.max(this.__box.__updateRenderSpread(), width) : width;
7239
7316
  }
7240
7317
  };
7241
7318
 
7242
7319
  const UIRender = {
7243
7320
  __updateChange() {
7244
- const data = this.__;
7321
+ const data = this.__, w = this.__world;
7245
7322
  if (data.__useEffect) {
7246
7323
  const { shadow, innerShadow, blur, backgroundBlur, filter } = this.__;
7247
7324
  data.__useEffect = !!(shadow || innerShadow || blur || backgroundBlur || filter);
7248
7325
  }
7326
+ const half = data.__hasHalf;
7327
+ w.half !== half && (w.half = half);
7249
7328
  data.__checkSingle();
7250
7329
  const complex = data.__isFills || data.__isStrokes || data.cornerRadius || data.__useEffect;
7251
- if (complex) {
7330
+ if (complex)
7252
7331
  data.__complex = true;
7253
- }
7254
- else {
7332
+ else
7255
7333
  data.__complex && (data.__complex = false);
7256
- }
7257
7334
  },
7258
7335
  __drawFast(canvas, options) {
7259
7336
  drawFast(this, canvas, options);
@@ -7340,10 +7417,11 @@ var LeaferUI = (function (exports) {
7340
7417
 
7341
7418
  const RectRender = {
7342
7419
  __drawFast(canvas, options) {
7343
- let { width, height, fill, stroke, __drawAfterFill } = this.__;
7420
+ let { x, y, width, height } = this.__layout.boxBounds;
7421
+ const { fill, stroke, __drawAfterFill } = this.__;
7344
7422
  if (fill) {
7345
7423
  canvas.fillStyle = fill;
7346
- canvas.fillRect(0, 0, width, height);
7424
+ canvas.fillRect(x, y, width, height);
7347
7425
  }
7348
7426
  if (__drawAfterFill)
7349
7427
  this.__drawAfterFill(canvas, options);
@@ -7362,14 +7440,14 @@ var LeaferUI = (function (exports) {
7362
7440
  if (width < 0 || height < 0) {
7363
7441
  canvas.save();
7364
7442
  this.__clip(canvas, options);
7365
- canvas.strokeRect(half, half, width, height);
7443
+ canvas.strokeRect(x + half, y + half, width, height);
7366
7444
  canvas.restore();
7367
7445
  }
7368
7446
  else
7369
- canvas.strokeRect(half, half, width, height);
7447
+ canvas.strokeRect(x + half, y + half, width, height);
7370
7448
  break;
7371
7449
  case 'outside':
7372
- canvas.strokeRect(-half, -half, width + __strokeWidth, height + __strokeWidth);
7450
+ canvas.strokeRect(x - half, y - half, width + __strokeWidth, height + __strokeWidth);
7373
7451
  break;
7374
7452
  }
7375
7453
  }
@@ -7525,6 +7603,12 @@ var LeaferUI = (function (exports) {
7525
7603
  __decorate([
7526
7604
  surfaceType(false)
7527
7605
  ], exports.UI.prototype, "locked", void 0);
7606
+ __decorate([
7607
+ surfaceType(false)
7608
+ ], exports.UI.prototype, "dim", void 0);
7609
+ __decorate([
7610
+ surfaceType(false)
7611
+ ], exports.UI.prototype, "dimskip", void 0);
7528
7612
  __decorate([
7529
7613
  sortType(0)
7530
7614
  ], exports.UI.prototype, "zIndex", void 0);
@@ -7786,7 +7870,7 @@ var LeaferUI = (function (exports) {
7786
7870
  start: true,
7787
7871
  hittable: true,
7788
7872
  smooth: true,
7789
- lazySpeard: 100
7873
+ lazySpeard: 100,
7790
7874
  };
7791
7875
  this.leafs = 0;
7792
7876
  this.__eventIds = [];
@@ -8210,13 +8294,13 @@ var LeaferUI = (function (exports) {
8210
8294
  super.__updateRenderBounds();
8211
8295
  copy$3(childrenRenderBounds, renderBounds);
8212
8296
  this.__updateRectRenderBounds();
8213
- isOverflow = !includes$1(renderBounds, childrenRenderBounds);
8297
+ isOverflow = !includes$1(renderBounds, childrenRenderBounds) || undefined;
8214
8298
  if (isOverflow && this.__.overflow !== 'hide')
8215
8299
  add(renderBounds, childrenRenderBounds);
8216
8300
  }
8217
8301
  else
8218
8302
  this.__updateRectRenderBounds();
8219
- !this.isOverflow !== !isOverflow && (this.isOverflow = isOverflow);
8303
+ this.isOverflow !== isOverflow && (this.isOverflow = isOverflow);
8220
8304
  }
8221
8305
  __updateRectRenderBounds() { }
8222
8306
  __updateRectChange() { }
@@ -8624,33 +8708,13 @@ var LeaferUI = (function (exports) {
8624
8708
  registerUI()
8625
8709
  ], exports.Canvas);
8626
8710
 
8627
- const { copyAndSpread, includes, isSame: isSame$1, spread, setList } = BoundsHelper;
8711
+ const { copyAndSpread, includes, spread, setList } = BoundsHelper;
8628
8712
  exports.Text = class Text extends exports.UI {
8629
8713
  get __tag() { return 'Text'; }
8630
- get textDrawData() {
8631
- this.__layout.update();
8632
- return this.__.__textDrawData;
8633
- }
8714
+ get textDrawData() { this.updateLayout(); return this.__.__textDrawData; }
8634
8715
  constructor(data) {
8635
8716
  super(data);
8636
8717
  }
8637
- __drawHitPath(canvas) {
8638
- const { __lineHeight, fontSize, __baseLine, __textDrawData: data } = this.__;
8639
- canvas.beginPath();
8640
- if (this.__.__letterSpacing < 0) {
8641
- this.__drawPathByData(canvas);
8642
- }
8643
- else {
8644
- data.rows.forEach(row => canvas.rect(row.x, row.y - __baseLine, row.width, __lineHeight < fontSize ? fontSize : __lineHeight));
8645
- }
8646
- }
8647
- __drawPathByData(drawer, _data) {
8648
- const { x, y, width, height } = this.__layout.boxBounds;
8649
- drawer.rect(x, y, width, height);
8650
- }
8651
- __drawRenderPath(canvas) {
8652
- canvas.font = this.__.__font;
8653
- }
8654
8718
  __updateTextDrawData() {
8655
8719
  const data = this.__;
8656
8720
  const { lineHeight, letterSpacing, fontFamily, fontSize, fontWeight, italic, textCase, textOverflow, padding } = data;
@@ -8667,15 +8731,16 @@ var LeaferUI = (function (exports) {
8667
8731
  const layout = this.__layout;
8668
8732
  const { fontSize, italic, padding, __autoWidth: autoWidth, __autoHeight: autoHeight } = data;
8669
8733
  this.__updateTextDrawData();
8670
- const { bounds } = data.__textDrawData;
8734
+ const { bounds: contentBounds } = data.__textDrawData;
8671
8735
  const b = layout.boxBounds;
8736
+ layout.contentBounds = contentBounds;
8672
8737
  if (data.__lineHeight < fontSize)
8673
- spread(bounds, fontSize / 2);
8738
+ spread(contentBounds, fontSize / 2);
8674
8739
  if (autoWidth || autoHeight) {
8675
- b.x = autoWidth ? bounds.x : 0;
8676
- b.y = autoHeight ? bounds.y : 0;
8677
- b.width = autoWidth ? bounds.width : data.width;
8678
- b.height = autoHeight ? bounds.height : data.height;
8740
+ b.x = autoWidth ? contentBounds.x : 0;
8741
+ b.y = autoHeight ? contentBounds.y : 0;
8742
+ b.width = autoWidth ? contentBounds.width : data.width;
8743
+ b.height = autoHeight ? contentBounds.height : data.height;
8679
8744
  if (padding) {
8680
8745
  const [top, right, bottom, left] = data.__padding;
8681
8746
  if (autoWidth)
@@ -8689,23 +8754,45 @@ var LeaferUI = (function (exports) {
8689
8754
  super.__updateBoxBounds();
8690
8755
  if (italic)
8691
8756
  b.width += fontSize * 0.16;
8692
- const contentBounds = includes(b, bounds) ? b : bounds;
8693
- if (!isSame$1(contentBounds, layout.contentBounds)) {
8694
- layout.contentBounds = contentBounds;
8695
- layout.renderChanged = true;
8696
- setList(data.__textBoxBounds = {}, [b, bounds]);
8697
- }
8757
+ const isOverflow = !includes(b, contentBounds) || undefined;
8758
+ if (isOverflow)
8759
+ setList(data.__textBoxBounds = {}, [b, contentBounds]), layout.renderChanged = true;
8698
8760
  else
8699
- data.__textBoxBounds = contentBounds;
8761
+ data.__textBoxBounds = b;
8762
+ this.isOverflow !== isOverflow && (this.isOverflow = isOverflow);
8763
+ }
8764
+ __onUpdateSize() {
8765
+ if (this.__box)
8766
+ this.__box.__onUpdateSize();
8767
+ super.__onUpdateSize();
8700
8768
  }
8701
8769
  __updateRenderSpread() {
8702
8770
  let width = super.__updateRenderSpread();
8703
8771
  if (!width)
8704
- width = this.__layout.boxBounds === this.__layout.contentBounds ? 0 : 1;
8772
+ width = this.isOverflow ? 1 : 0;
8705
8773
  return width;
8706
8774
  }
8707
8775
  __updateRenderBounds() {
8708
- copyAndSpread(this.__layout.renderBounds, this.__.__textBoxBounds, this.__layout.renderSpread);
8776
+ const { renderBounds, renderSpread } = this.__layout;
8777
+ copyAndSpread(renderBounds, this.__.__textBoxBounds, renderSpread);
8778
+ if (this.__box)
8779
+ this.__box.__layout.renderBounds = renderBounds;
8780
+ }
8781
+ __drawRenderPath(canvas) {
8782
+ canvas.font = this.__.__font;
8783
+ }
8784
+ __draw(canvas, options, originCanvas) {
8785
+ const box = this.__box;
8786
+ if (box)
8787
+ box.__nowWorld = this.__nowWorld, box.__draw(canvas, options, originCanvas);
8788
+ if (this.textEditing && !Export.running)
8789
+ return;
8790
+ super.__draw(canvas, options, originCanvas);
8791
+ }
8792
+ destroy() {
8793
+ if (this.boxStyle)
8794
+ this.boxStyle = null;
8795
+ super.destroy();
8709
8796
  }
8710
8797
  };
8711
8798
  __decorate([
@@ -8717,6 +8804,9 @@ var LeaferUI = (function (exports) {
8717
8804
  __decorate([
8718
8805
  boundsType(0)
8719
8806
  ], exports.Text.prototype, "height", void 0);
8807
+ __decorate([
8808
+ surfaceType()
8809
+ ], exports.Text.prototype, "boxStyle", void 0);
8720
8810
  __decorate([
8721
8811
  dataType(false)
8722
8812
  ], exports.Text.prototype, "resizeFontSize", void 0);
@@ -8880,26 +8970,25 @@ var LeaferUI = (function (exports) {
8880
8970
  this.leafer = this;
8881
8971
  this.watcher.disable();
8882
8972
  this.layouter.disable();
8883
- this.__eventIds.push(this.on_(PropertyEvent.CHANGE, this.__onPropertyChange, this));
8884
8973
  }
8885
8974
  start() {
8886
8975
  super.start();
8887
- this.children.forEach(leafer => leafer.start());
8976
+ this.forEach(leafer => leafer.start());
8888
8977
  }
8889
8978
  stop() {
8890
- this.children.forEach(leafer => leafer.stop());
8979
+ this.forEach(leafer => leafer.stop());
8891
8980
  super.stop();
8892
8981
  }
8893
8982
  unlockLayout() {
8894
8983
  super.unlockLayout();
8895
- this.children.forEach(leafer => leafer.unlockLayout());
8984
+ this.forEach(leafer => leafer.unlockLayout());
8896
8985
  }
8897
8986
  lockLayout() {
8898
8987
  super.lockLayout();
8899
- this.children.forEach(leafer => leafer.lockLayout());
8988
+ this.forEach(leafer => leafer.lockLayout());
8900
8989
  }
8901
8990
  forceRender(bounds, sync) {
8902
- this.children.forEach(leafer => leafer.forceRender(bounds, sync));
8991
+ this.forEach(leafer => leafer.forceRender(bounds, sync));
8903
8992
  }
8904
8993
  addLeafer(merge) {
8905
8994
  const leafer = new exports.Leafer(merge);
@@ -8919,9 +9008,8 @@ var LeaferUI = (function (exports) {
8919
9008
  leafer.canvas.childIndex = index;
8920
9009
  this.__listenChildEvents(leafer);
8921
9010
  }
8922
- __onPropertyChange() {
8923
- if (Debug.showHitView)
8924
- this.children.forEach(leafer => leafer.forceUpdate('surface'));
9011
+ forEach(fn) {
9012
+ this.children.forEach(fn);
8925
9013
  }
8926
9014
  __onCreated() {
8927
9015
  this.created = this.children.every(child => child.created);
@@ -8944,18 +9032,18 @@ var LeaferUI = (function (exports) {
8944
9032
  const m = options.matrix;
8945
9033
  if (m)
8946
9034
  canvas.setTransform(m.a, m.b, m.c, m.d, m.e, m.f);
8947
- this.children.forEach(leafer => canvas.copyWorld(leafer.canvas));
9035
+ this.forEach(leafer => canvas.copyWorld(leafer.canvas));
8948
9036
  }
8949
9037
  }
8950
9038
  __onResize(event) {
8951
- this.children.forEach(leafer => leafer.resize(event));
9039
+ this.forEach(leafer => leafer.resize(event));
8952
9040
  super.__onResize(event);
8953
9041
  }
8954
9042
  updateLayout() {
8955
- this.children.forEach(leafer => leafer.updateLayout());
9043
+ this.forEach(leafer => leafer.updateLayout());
8956
9044
  }
8957
9045
  __getChildConfig(userConfig) {
8958
- let config = Object.assign({}, this.config);
9046
+ const config = Object.assign({}, this.config);
8959
9047
  config.hittable = config.realCanvas = undefined;
8960
9048
  if (userConfig)
8961
9049
  DataHelper.assign(config, userConfig);
@@ -9514,6 +9602,7 @@ var LeaferUI = (function (exports) {
9514
9602
  delta: { x: 80 / 4, y: 8.0 },
9515
9603
  },
9516
9604
  pointer: {
9605
+ snap: true,
9517
9606
  hitRadius: 5,
9518
9607
  tapTime: 120,
9519
9608
  longPressTime: 800,
@@ -9608,7 +9697,7 @@ var LeaferUI = (function (exports) {
9608
9697
  if (this.downData) {
9609
9698
  const canDrag = PointHelper.getDistance(this.downData, data) > this.p.dragDistance;
9610
9699
  if (canDrag) {
9611
- if (this.waitTap)
9700
+ if (this.waitTap || this.longPressTimer)
9612
9701
  this.pointerWaitCancel();
9613
9702
  this.waitRightTap = false;
9614
9703
  }
@@ -9869,7 +9958,10 @@ var LeaferUI = (function (exports) {
9869
9958
  }
9870
9959
  getLocal(clientPoint, updateClient) {
9871
9960
  const clientBounds = this.canvas.getClientBounds(updateClient);
9872
- return { x: clientPoint.clientX - clientBounds.x, y: clientPoint.clientY - clientBounds.y };
9961
+ const point = { x: clientPoint.clientX - clientBounds.x, y: clientPoint.clientY - clientBounds.y };
9962
+ if (this.p.snap)
9963
+ PointHelper.round(point);
9964
+ return point;
9873
9965
  }
9874
9966
  emitTap(data) {
9875
9967
  this.emit(exports.PointerEvent.TAP, data);
@@ -10001,25 +10093,26 @@ var LeaferUI = (function (exports) {
10001
10093
  const inner = {};
10002
10094
  const leaf = exports.Leaf.prototype;
10003
10095
  leaf.__hitWorld = function (point) {
10004
- if (!this.__.hitSelf)
10096
+ const data = this.__;
10097
+ if (!data.hitSelf)
10005
10098
  return false;
10006
- if (this.__.hitRadius) {
10099
+ const world = this.__world, layout = this.__layout;
10100
+ const isSmall = world.width < 10 && world.height < 10;
10101
+ if (data.hitRadius) {
10007
10102
  copy$2(inner, point), point = inner;
10008
- setRadius(point, this.__.hitRadius);
10103
+ setRadius(point, data.hitRadius);
10009
10104
  }
10010
- toInnerRadiusPointOf(point, this.__world, inner);
10011
- const { width, height } = this.__world;
10012
- const isSmall = width < 10 && height < 10;
10013
- if (this.__.hitBox || isSmall) {
10014
- if (BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner))
10105
+ toInnerRadiusPointOf(point, world, inner);
10106
+ if (data.hitBox || isSmall) {
10107
+ if (BoundsHelper.hitRadiusPoint(layout.boxBounds, inner))
10015
10108
  return true;
10016
10109
  if (isSmall)
10017
10110
  return false;
10018
10111
  }
10019
- if (this.__layout.hitCanvasChanged || !this.__hitCanvas) {
10112
+ if (layout.hitCanvasChanged || !this.__hitCanvas) {
10020
10113
  this.__updateHitCanvas();
10021
- if (!this.__layout.boundsChanged)
10022
- this.__layout.hitCanvasChanged = false;
10114
+ if (!layout.boundsChanged)
10115
+ layout.hitCanvasChanged = false;
10023
10116
  }
10024
10117
  return this.__hit(inner);
10025
10118
  };
@@ -10032,7 +10125,9 @@ var LeaferUI = (function (exports) {
10032
10125
  const matrix = new Matrix();
10033
10126
  const ui$1 = exports.UI.prototype;
10034
10127
  ui$1.__updateHitCanvas = function () {
10035
- const data = this.__, { hitCanvasManager } = this.leafer;
10128
+ if (this.__box)
10129
+ this.__box.__updateHitCanvas();
10130
+ const data = this.__, { hitCanvasManager } = this.leafer || this.parent.leafer;
10036
10131
  const isHitPixelFill = (data.__pixelFill || data.__isCanvas) && data.hitFill === 'pixel';
10037
10132
  const isHitPixelStroke = data.__pixelStroke && data.hitStroke === 'pixel';
10038
10133
  const isHitPixel = isHitPixelFill || isHitPixelStroke;
@@ -10059,6 +10154,8 @@ var LeaferUI = (function (exports) {
10059
10154
  h.setStrokeOptions(data);
10060
10155
  };
10061
10156
  ui$1.__hit = function (inner) {
10157
+ if (this.__box && this.__box.__hit(inner))
10158
+ return true;
10062
10159
  const data = this.__;
10063
10160
  if (data.__isHitPixel && this.__hitPixel(inner))
10064
10161
  return true;
@@ -10107,6 +10204,15 @@ var LeaferUI = (function (exports) {
10107
10204
  return this.__hitCanvas ? ui.__hitFill.call(this, inner) : BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner);
10108
10205
  };
10109
10206
 
10207
+ exports.Text.prototype.__drawHitPath = function (canvas) {
10208
+ const { __lineHeight, fontSize, __baseLine, __letterSpacing, __textDrawData: data } = this.__;
10209
+ canvas.beginPath();
10210
+ if (__letterSpacing < 0)
10211
+ this.__drawPathByBox(canvas);
10212
+ else
10213
+ data.rows.forEach(row => canvas.rect(row.x, row.y - __baseLine, row.width, __lineHeight < fontSize ? fontSize : __lineHeight));
10214
+ };
10215
+
10110
10216
  function getSelector(ui) {
10111
10217
  return ui.leafer ? ui.leafer.selector : (Platform.selector || (Platform.selector = Creator.selector()));
10112
10218
  }
@@ -10489,9 +10595,11 @@ var LeaferUI = (function (exports) {
10489
10595
  const tempPoint = {};
10490
10596
  const tempScaleData = {};
10491
10597
  function createData(leafPaint, image, paint, box) {
10492
- const { blendMode, sync } = paint;
10598
+ const { blendMode, changeful, sync } = paint;
10493
10599
  if (blendMode)
10494
10600
  leafPaint.blendMode = blendMode;
10601
+ if (changeful)
10602
+ leafPaint.changeful = changeful;
10495
10603
  if (sync)
10496
10604
  leafPaint.sync = sync;
10497
10605
  leafPaint.data = getPatternData(paint, box, image);
@@ -10724,40 +10832,32 @@ var LeaferUI = (function (exports) {
10724
10832
  }
10725
10833
 
10726
10834
  const { abs } = Math;
10727
- function checkImage(ui, canvas, paint, allowPaint) {
10835
+ function checkImage(ui, canvas, paint, allowDraw) {
10728
10836
  const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
10729
- const { pixelRatio } = canvas;
10730
- if (!paint.data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
10837
+ const { pixelRatio } = canvas, { data } = paint;
10838
+ if (!data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
10731
10839
  return false;
10732
10840
  }
10733
10841
  else {
10734
- const { data } = paint;
10735
- if (allowPaint) {
10736
- if (!data.repeat) {
10737
- let { width, height } = data;
10738
- width *= abs(scaleX) * pixelRatio;
10739
- height *= abs(scaleY) * pixelRatio;
10740
- if (data.scaleX) {
10741
- width *= data.scaleX;
10742
- height *= data.scaleY;
10743
- }
10744
- allowPaint = (width * height > Platform.image.maxCacheSize) || Export.running;
10842
+ if (allowDraw) {
10843
+ if (data.repeat) {
10844
+ allowDraw = false;
10745
10845
  }
10746
10846
  else {
10747
- allowPaint = false;
10847
+ if (!(paint.changeful || ResizeEvent.isResizing(ui) || Export.running)) {
10848
+ let { width, height } = data;
10849
+ width *= abs(scaleX) * pixelRatio;
10850
+ height *= abs(scaleY) * pixelRatio;
10851
+ if (data.scaleX) {
10852
+ width *= data.scaleX;
10853
+ height *= data.scaleY;
10854
+ }
10855
+ allowDraw = (width * height > Platform.image.maxCacheSize);
10856
+ }
10748
10857
  }
10749
10858
  }
10750
- if (allowPaint) {
10751
- canvas.save();
10752
- ui.windingRule ? canvas.clip(ui.windingRule) : canvas.clip();
10753
- if (paint.blendMode)
10754
- canvas.blendMode = paint.blendMode;
10755
- if (data.opacity)
10756
- canvas.opacity *= data.opacity;
10757
- if (data.transform)
10758
- canvas.transform(data.transform);
10759
- canvas.drawImage(paint.image.getFull(data.filters), 0, 0, data.width, data.height);
10760
- canvas.restore();
10859
+ if (allowDraw) {
10860
+ drawImage(ui, canvas, paint, data);
10761
10861
  return true;
10762
10862
  }
10763
10863
  else {
@@ -10778,13 +10878,26 @@ var LeaferUI = (function (exports) {
10778
10878
  }
10779
10879
  }
10780
10880
  }
10881
+ function drawImage(ui, canvas, paint, data) {
10882
+ canvas.save();
10883
+ ui.windingRule ? canvas.clip(ui.windingRule) : canvas.clip();
10884
+ if (paint.blendMode)
10885
+ canvas.blendMode = paint.blendMode;
10886
+ if (data.opacity)
10887
+ canvas.opacity *= data.opacity;
10888
+ if (data.transform)
10889
+ canvas.transform(data.transform);
10890
+ canvas.drawImage(paint.image.getFull(data.filters), 0, 0, data.width, data.height);
10891
+ canvas.restore();
10892
+ }
10781
10893
 
10782
10894
  function recycleImage(attrName, data) {
10783
10895
  const paints = data['_' + attrName];
10784
10896
  if (paints instanceof Array) {
10785
- let image, recycleMap, input, url;
10897
+ let paint, image, recycleMap, input, url;
10786
10898
  for (let i = 0, len = paints.length; i < len; i++) {
10787
- image = paints[i].image;
10899
+ paint = paints[i];
10900
+ image = paint.image;
10788
10901
  url = image && image.url;
10789
10902
  if (url) {
10790
10903
  if (!recycleMap)
@@ -10799,8 +10912,6 @@ var LeaferUI = (function (exports) {
10799
10912
  }
10800
10913
  image.unload(paints[i].loadId, !input.some((item) => item.url === url));
10801
10914
  }
10802
- else
10803
- paints[i].style = null;
10804
10915
  }
10805
10916
  }
10806
10917
  return recycleMap;
@@ -10979,7 +11090,7 @@ var LeaferUI = (function (exports) {
10979
11090
  const offsetOutBounds = {};
10980
11091
  function innerShadow(ui, current, shape) {
10981
11092
  let copyBounds, spreadScale;
10982
- const { __nowWorld: nowWorld, __layout: __layout } = ui;
11093
+ const { __nowWorld: nowWorld, __layout } = ui;
10983
11094
  const { innerShadow } = ui.__;
10984
11095
  const { worldCanvas, bounds, shapeBounds, scaleX, scaleY } = shape;
10985
11096
  const other = current.getSameCanvas();