@leafer-draw/miniapp 1.5.3 → 1.6.1

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.3";
6128
+ const version = "1.6.1";
6075
6129
 
6076
6130
  class LeaferCanvas extends LeaferCanvasBase {
6077
6131
  get allowBackgroundColor() { return false; }
@@ -6450,7 +6504,6 @@ function updateChange(updateList) {
6450
6504
  }
6451
6505
 
6452
6506
  const { worldBounds } = LeafBoundsHelper;
6453
- const bigBounds = { x: 0, y: 0, width: 100000, height: 100000 };
6454
6507
  class LayoutBlockData {
6455
6508
  constructor(list) {
6456
6509
  this.updatedBounds = new Bounds();
@@ -6464,13 +6517,7 @@ class LayoutBlockData {
6464
6517
  this.beforeBounds.setListWithFn(this.updatedList.list, worldBounds);
6465
6518
  }
6466
6519
  setAfter() {
6467
- const { list } = this.updatedList;
6468
- if (list.some(leaf => leaf.noBounds)) {
6469
- this.afterBounds.set(bigBounds);
6470
- }
6471
- else {
6472
- this.afterBounds.setListWithFn(list, worldBounds);
6473
- }
6520
+ this.afterBounds.setListWithFn(this.updatedList.list, worldBounds);
6474
6521
  this.updatedBounds.setList([this.beforeBounds, this.afterBounds]);
6475
6522
  }
6476
6523
  merge(data) {
@@ -6672,6 +6719,22 @@ class Renderer {
6672
6719
  requestLayout() {
6673
6720
  this.target.emit(LayoutEvent.REQUEST);
6674
6721
  }
6722
+ checkRender() {
6723
+ if (this.running) {
6724
+ const { target } = this;
6725
+ if (target.isApp) {
6726
+ target.emit(RenderEvent.CHILD_START, target);
6727
+ target.children.forEach(leafer => {
6728
+ leafer.renderer.FPS = this.FPS;
6729
+ leafer.renderer.checkRender();
6730
+ });
6731
+ target.emit(RenderEvent.CHILD_END, target);
6732
+ }
6733
+ if (this.changed && this.canvas.view)
6734
+ this.render();
6735
+ this.target.emit(RenderEvent.NEXT);
6736
+ }
6737
+ }
6675
6738
  render(callback) {
6676
6739
  if (!(this.running && this.canvas.view))
6677
6740
  return this.update();
@@ -6680,8 +6743,6 @@ class Renderer {
6680
6743
  this.totalBounds = new Bounds();
6681
6744
  debug$2.log(target.innerName, '--->');
6682
6745
  try {
6683
- if (!target.isApp)
6684
- target.app.emit(RenderEvent.CHILD_START, target);
6685
6746
  this.emitRender(RenderEvent.START);
6686
6747
  this.renderOnce(callback);
6687
6748
  this.emitRender(RenderEvent.END, this.totalBounds);
@@ -6749,20 +6810,12 @@ class Renderer {
6749
6810
  }
6750
6811
  clipRender(block) {
6751
6812
  const t = Run.start('PartRender');
6752
- const { canvas } = this;
6753
- const bounds = block.getIntersect(canvas.bounds);
6754
- const includes = block.includes(this.target.__world);
6755
- const realBounds = new Bounds(bounds);
6813
+ const { canvas } = this, bounds = block.getIntersect(canvas.bounds), realBounds = new Bounds(bounds);
6756
6814
  canvas.save();
6757
- if (includes && !Debug.showRepaint) {
6758
- canvas.clear();
6759
- }
6760
- else {
6761
- bounds.spread(10 + 1 / this.canvas.pixelRatio).ceil();
6762
- canvas.clearWorld(bounds, true);
6763
- canvas.clipWorld(bounds, true);
6764
- }
6765
- this.__render(bounds, includes, realBounds);
6815
+ bounds.spread(Renderer.clipSpread).ceil();
6816
+ canvas.clearWorld(bounds, true);
6817
+ canvas.clipWorld(bounds, true);
6818
+ this.__render(bounds, realBounds);
6766
6819
  canvas.restore();
6767
6820
  Run.end(t);
6768
6821
  }
@@ -6771,28 +6824,22 @@ class Renderer {
6771
6824
  const { canvas } = this;
6772
6825
  canvas.save();
6773
6826
  canvas.clear();
6774
- this.__render(canvas.bounds, true);
6827
+ this.__render(canvas.bounds);
6775
6828
  canvas.restore();
6776
6829
  Run.end(t);
6777
6830
  }
6778
- __render(bounds, includes, realBounds) {
6779
- const options = bounds.includes(this.target.__world) ? { includes } : { bounds, includes };
6831
+ __render(bounds, realBounds) {
6832
+ const { canvas } = this, includes = bounds.includes(this.target.__world), options = includes ? { includes } : { bounds, includes };
6780
6833
  if (this.needFill)
6781
- this.canvas.fillWorld(bounds, this.config.fill);
6834
+ canvas.fillWorld(bounds, this.config.fill);
6782
6835
  if (Debug.showRepaint)
6783
- this.canvas.strokeWorld(bounds, 'red');
6784
- this.target.__render(this.canvas, options);
6836
+ Debug.drawRepaint(canvas, bounds);
6837
+ this.target.__render(canvas, options);
6785
6838
  this.renderBounds = realBounds = realBounds || bounds;
6786
6839
  this.renderOptions = options;
6787
6840
  this.totalBounds.isEmpty() ? this.totalBounds = realBounds : this.totalBounds.add(realBounds);
6788
- if (Debug.showHitView)
6789
- this.renderHitView(options);
6790
- if (Debug.showBoundsView)
6791
- this.renderBoundsView(options);
6792
- this.canvas.updateRender(realBounds);
6793
- }
6794
- renderHitView(_options) { }
6795
- renderBoundsView(_options) { }
6841
+ canvas.updateRender(realBounds);
6842
+ }
6796
6843
  addBlock(block) {
6797
6844
  if (!this.updateBlocks)
6798
6845
  this.updateBlocks = [];
@@ -6808,17 +6855,16 @@ class Renderer {
6808
6855
  }
6809
6856
  }
6810
6857
  __requestRender() {
6811
- if (this.requestTime)
6858
+ const target = this.target;
6859
+ if (this.requestTime || !target)
6812
6860
  return;
6861
+ if (target.parentApp)
6862
+ return target.parentApp.requestRender(false);
6813
6863
  const requestTime = this.requestTime = Date.now();
6814
6864
  Platform.requestRender(() => {
6815
6865
  this.FPS = Math.min(60, Math.ceil(1000 / (Date.now() - requestTime)));
6816
6866
  this.requestTime = 0;
6817
- if (this.running) {
6818
- if (this.changed && this.canvas.view)
6819
- this.render();
6820
- this.target.emit(RenderEvent.NEXT);
6821
- }
6867
+ this.checkRender();
6822
6868
  });
6823
6869
  }
6824
6870
  __onResize(e) {
@@ -6876,6 +6922,7 @@ class Renderer {
6876
6922
  }
6877
6923
  }
6878
6924
  }
6925
+ Renderer.clipSpread = 10;
6879
6926
 
6880
6927
  Object.assign(Creator, {
6881
6928
  watcher: (target, options) => new Watcher(target, options),
@@ -6964,6 +7011,7 @@ class UIData extends LeafData {
6964
7011
  return strokeWidth;
6965
7012
  }
6966
7013
  get __hasStroke() { return this.stroke && this.strokeWidth; }
7014
+ get __hasHalf() { const t = this; return (t.stroke && t.strokeAlign === 'center' && t.strokeWidth % 2) || undefined; }
6967
7015
  get __hasMultiPaint() {
6968
7016
  const t = this;
6969
7017
  if ((t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect)
@@ -7008,14 +7056,14 @@ class UIData extends LeafData {
7008
7056
  this.__removeInput('fill');
7009
7057
  PaintImage.recycleImage('fill', this);
7010
7058
  this.__isFills = false;
7011
- if (this.__pixelFill)
7012
- this.__pixelFill = false;
7059
+ this.__pixelFill && (this.__pixelFill = false);
7013
7060
  }
7014
7061
  this._fill = value;
7015
7062
  }
7016
7063
  else if (typeof value === 'object') {
7017
7064
  this.__setInput('fill', value);
7018
- this.__leaf.__layout.boxChanged || this.__leaf.__layout.boxChange();
7065
+ const layout = this.__leaf.__layout;
7066
+ layout.boxChanged || layout.boxChange();
7019
7067
  this.__isFills = true;
7020
7068
  this._fill || (this._fill = emptyPaint);
7021
7069
  }
@@ -7026,14 +7074,14 @@ class UIData extends LeafData {
7026
7074
  this.__removeInput('stroke');
7027
7075
  PaintImage.recycleImage('stroke', this);
7028
7076
  this.__isStrokes = false;
7029
- if (this.__pixelStroke)
7030
- this.__pixelStroke = false;
7077
+ this.__pixelStroke && (this.__pixelStroke = false);
7031
7078
  }
7032
7079
  this._stroke = value;
7033
7080
  }
7034
7081
  else if (typeof value === 'object') {
7035
7082
  this.__setInput('stroke', value);
7036
- this.__leaf.__layout.boxChanged || this.__leaf.__layout.boxChange();
7083
+ const layout = this.__leaf.__layout;
7084
+ layout.boxChanged || layout.boxChange();
7037
7085
  this.__isStrokes = true;
7038
7086
  this._stroke || (this._stroke = emptyPaint);
7039
7087
  }
@@ -7148,6 +7196,31 @@ class TextData extends UIData {
7148
7196
  this._fontWeight = value;
7149
7197
  }
7150
7198
  }
7199
+ setBoxStyle(value) {
7200
+ let t = this.__leaf, box = t.__box;
7201
+ if (value) {
7202
+ const { boxStyle } = this;
7203
+ if (box)
7204
+ for (let key in boxStyle)
7205
+ box[key] = undefined;
7206
+ else
7207
+ box = t.__box = UICreator.get('Rect', 0);
7208
+ const layout = t.__layout, boxLayout = box.__layout;
7209
+ if (!boxStyle)
7210
+ box.parent = t, box.__world = t.__world, boxLayout.boxBounds = layout.boxBounds;
7211
+ box.set(value);
7212
+ if (boxLayout.strokeChanged)
7213
+ layout.strokeChange();
7214
+ if (boxLayout.renderChanged)
7215
+ layout.renderChange();
7216
+ box.__updateChange();
7217
+ }
7218
+ else if (box) {
7219
+ t.__box = box.parent = null;
7220
+ box.destroy();
7221
+ }
7222
+ this._boxStyle = value;
7223
+ }
7151
7224
  }
7152
7225
 
7153
7226
  class ImageData extends RectData {
@@ -7185,7 +7258,7 @@ class CanvasData extends RectData {
7185
7258
  const UIBounds = {
7186
7259
  __updateStrokeSpread() {
7187
7260
  let width = 0, boxWidth = 0;
7188
- const data = this.__, { strokeAlign, strokeWidth } = data;
7261
+ const data = this.__, { strokeAlign, strokeWidth } = data, box = this.__box;
7189
7262
  if ((data.stroke || data.hitStroke === 'all') && strokeWidth && strokeAlign !== 'inside') {
7190
7263
  boxWidth = width = strokeAlign === 'center' ? strokeWidth / 2 : strokeWidth;
7191
7264
  if (!data.__boxStroke) {
@@ -7196,6 +7269,10 @@ const UIBounds = {
7196
7269
  }
7197
7270
  if (data.__useArrow)
7198
7271
  width += strokeWidth * 5;
7272
+ if (box) {
7273
+ width = Math.max(box.__layout.strokeSpread = box.__updateStrokeSpread(), width);
7274
+ boxWidth = box.__layout.strokeBoxSpread;
7275
+ }
7199
7276
  this.__layout.strokeBoxSpread = boxWidth;
7200
7277
  return width;
7201
7278
  },
@@ -7214,25 +7291,26 @@ const UIBounds = {
7214
7291
  if (backgroundBlur)
7215
7292
  shapeWidth = Math.max(shapeWidth, backgroundBlur);
7216
7293
  this.__layout.renderShapeSpread = shapeWidth;
7217
- return width + (this.__layout.strokeSpread || 0);
7294
+ width += this.__layout.strokeSpread || 0;
7295
+ return this.__box ? Math.max(this.__box.__updateRenderSpread(), width) : width;
7218
7296
  }
7219
7297
  };
7220
7298
 
7221
7299
  const UIRender = {
7222
7300
  __updateChange() {
7223
- const data = this.__;
7301
+ const data = this.__, w = this.__world;
7224
7302
  if (data.__useEffect) {
7225
7303
  const { shadow, innerShadow, blur, backgroundBlur, filter } = this.__;
7226
7304
  data.__useEffect = !!(shadow || innerShadow || blur || backgroundBlur || filter);
7227
7305
  }
7306
+ const half = data.__hasHalf;
7307
+ w.half !== half && (w.half = half);
7228
7308
  data.__checkSingle();
7229
7309
  const complex = data.__isFills || data.__isStrokes || data.cornerRadius || data.__useEffect;
7230
- if (complex) {
7310
+ if (complex)
7231
7311
  data.__complex = true;
7232
- }
7233
- else {
7312
+ else
7234
7313
  data.__complex && (data.__complex = false);
7235
- }
7236
7314
  },
7237
7315
  __drawFast(canvas, options) {
7238
7316
  drawFast(this, canvas, options);
@@ -7319,10 +7397,11 @@ function drawFast(ui, canvas, options) {
7319
7397
 
7320
7398
  const RectRender = {
7321
7399
  __drawFast(canvas, options) {
7322
- let { width, height, fill, stroke, __drawAfterFill } = this.__;
7400
+ let { x, y, width, height } = this.__layout.boxBounds;
7401
+ const { fill, stroke, __drawAfterFill } = this.__;
7323
7402
  if (fill) {
7324
7403
  canvas.fillStyle = fill;
7325
- canvas.fillRect(0, 0, width, height);
7404
+ canvas.fillRect(x, y, width, height);
7326
7405
  }
7327
7406
  if (__drawAfterFill)
7328
7407
  this.__drawAfterFill(canvas, options);
@@ -7341,14 +7420,14 @@ const RectRender = {
7341
7420
  if (width < 0 || height < 0) {
7342
7421
  canvas.save();
7343
7422
  this.__clip(canvas, options);
7344
- canvas.strokeRect(half, half, width, height);
7423
+ canvas.strokeRect(x + half, y + half, width, height);
7345
7424
  canvas.restore();
7346
7425
  }
7347
7426
  else
7348
- canvas.strokeRect(half, half, width, height);
7427
+ canvas.strokeRect(x + half, y + half, width, height);
7349
7428
  break;
7350
7429
  case 'outside':
7351
- canvas.strokeRect(-half, -half, width + __strokeWidth, height + __strokeWidth);
7430
+ canvas.strokeRect(x - half, y - half, width + __strokeWidth, height + __strokeWidth);
7352
7431
  break;
7353
7432
  }
7354
7433
  }
@@ -7504,6 +7583,12 @@ __decorate([
7504
7583
  __decorate([
7505
7584
  surfaceType(false)
7506
7585
  ], UI.prototype, "locked", void 0);
7586
+ __decorate([
7587
+ surfaceType(false)
7588
+ ], UI.prototype, "dim", void 0);
7589
+ __decorate([
7590
+ surfaceType(false)
7591
+ ], UI.prototype, "dimskip", void 0);
7507
7592
  __decorate([
7508
7593
  sortType(0)
7509
7594
  ], UI.prototype, "zIndex", void 0);
@@ -7765,7 +7850,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
7765
7850
  start: true,
7766
7851
  hittable: true,
7767
7852
  smooth: true,
7768
- lazySpeard: 100
7853
+ lazySpeard: 100,
7769
7854
  };
7770
7855
  this.leafs = 0;
7771
7856
  this.__eventIds = [];
@@ -8189,13 +8274,13 @@ let Box = class Box extends Group {
8189
8274
  super.__updateRenderBounds();
8190
8275
  copy$2(childrenRenderBounds, renderBounds);
8191
8276
  this.__updateRectRenderBounds();
8192
- isOverflow = !includes$1(renderBounds, childrenRenderBounds);
8277
+ isOverflow = !includes$1(renderBounds, childrenRenderBounds) || undefined;
8193
8278
  if (isOverflow && this.__.overflow !== 'hide')
8194
8279
  add(renderBounds, childrenRenderBounds);
8195
8280
  }
8196
8281
  else
8197
8282
  this.__updateRectRenderBounds();
8198
- !this.isOverflow !== !isOverflow && (this.isOverflow = isOverflow);
8283
+ this.isOverflow !== isOverflow && (this.isOverflow = isOverflow);
8199
8284
  }
8200
8285
  __updateRectRenderBounds() { }
8201
8286
  __updateRectChange() { }
@@ -8603,33 +8688,13 @@ Canvas = __decorate([
8603
8688
  registerUI()
8604
8689
  ], Canvas);
8605
8690
 
8606
- const { copyAndSpread, includes, isSame: isSame$1, spread, setList } = BoundsHelper;
8691
+ const { copyAndSpread, includes, spread, setList } = BoundsHelper;
8607
8692
  let Text = class Text extends UI {
8608
8693
  get __tag() { return 'Text'; }
8609
- get textDrawData() {
8610
- this.__layout.update();
8611
- return this.__.__textDrawData;
8612
- }
8694
+ get textDrawData() { this.updateLayout(); return this.__.__textDrawData; }
8613
8695
  constructor(data) {
8614
8696
  super(data);
8615
8697
  }
8616
- __drawHitPath(canvas) {
8617
- const { __lineHeight, fontSize, __baseLine, __textDrawData: data } = this.__;
8618
- canvas.beginPath();
8619
- if (this.__.__letterSpacing < 0) {
8620
- this.__drawPathByData(canvas);
8621
- }
8622
- else {
8623
- data.rows.forEach(row => canvas.rect(row.x, row.y - __baseLine, row.width, __lineHeight < fontSize ? fontSize : __lineHeight));
8624
- }
8625
- }
8626
- __drawPathByData(drawer, _data) {
8627
- const { x, y, width, height } = this.__layout.boxBounds;
8628
- drawer.rect(x, y, width, height);
8629
- }
8630
- __drawRenderPath(canvas) {
8631
- canvas.font = this.__.__font;
8632
- }
8633
8698
  __updateTextDrawData() {
8634
8699
  const data = this.__;
8635
8700
  const { lineHeight, letterSpacing, fontFamily, fontSize, fontWeight, italic, textCase, textOverflow, padding } = data;
@@ -8646,15 +8711,16 @@ let Text = class Text extends UI {
8646
8711
  const layout = this.__layout;
8647
8712
  const { fontSize, italic, padding, __autoWidth: autoWidth, __autoHeight: autoHeight } = data;
8648
8713
  this.__updateTextDrawData();
8649
- const { bounds } = data.__textDrawData;
8714
+ const { bounds: contentBounds } = data.__textDrawData;
8650
8715
  const b = layout.boxBounds;
8716
+ layout.contentBounds = contentBounds;
8651
8717
  if (data.__lineHeight < fontSize)
8652
- spread(bounds, fontSize / 2);
8718
+ spread(contentBounds, fontSize / 2);
8653
8719
  if (autoWidth || autoHeight) {
8654
- b.x = autoWidth ? bounds.x : 0;
8655
- b.y = autoHeight ? bounds.y : 0;
8656
- b.width = autoWidth ? bounds.width : data.width;
8657
- b.height = autoHeight ? bounds.height : data.height;
8720
+ b.x = autoWidth ? contentBounds.x : 0;
8721
+ b.y = autoHeight ? contentBounds.y : 0;
8722
+ b.width = autoWidth ? contentBounds.width : data.width;
8723
+ b.height = autoHeight ? contentBounds.height : data.height;
8658
8724
  if (padding) {
8659
8725
  const [top, right, bottom, left] = data.__padding;
8660
8726
  if (autoWidth)
@@ -8668,23 +8734,45 @@ let Text = class Text extends UI {
8668
8734
  super.__updateBoxBounds();
8669
8735
  if (italic)
8670
8736
  b.width += fontSize * 0.16;
8671
- const contentBounds = includes(b, bounds) ? b : bounds;
8672
- if (!isSame$1(contentBounds, layout.contentBounds)) {
8673
- layout.contentBounds = contentBounds;
8674
- layout.renderChanged = true;
8675
- setList(data.__textBoxBounds = {}, [b, bounds]);
8676
- }
8737
+ const isOverflow = !includes(b, contentBounds) || undefined;
8738
+ if (isOverflow)
8739
+ setList(data.__textBoxBounds = {}, [b, contentBounds]), layout.renderChanged = true;
8677
8740
  else
8678
- data.__textBoxBounds = contentBounds;
8741
+ data.__textBoxBounds = b;
8742
+ this.isOverflow !== isOverflow && (this.isOverflow = isOverflow);
8743
+ }
8744
+ __onUpdateSize() {
8745
+ if (this.__box)
8746
+ this.__box.__onUpdateSize();
8747
+ super.__onUpdateSize();
8679
8748
  }
8680
8749
  __updateRenderSpread() {
8681
8750
  let width = super.__updateRenderSpread();
8682
8751
  if (!width)
8683
- width = this.__layout.boxBounds === this.__layout.contentBounds ? 0 : 1;
8752
+ width = this.isOverflow ? 1 : 0;
8684
8753
  return width;
8685
8754
  }
8686
8755
  __updateRenderBounds() {
8687
- copyAndSpread(this.__layout.renderBounds, this.__.__textBoxBounds, this.__layout.renderSpread);
8756
+ const { renderBounds, renderSpread } = this.__layout;
8757
+ copyAndSpread(renderBounds, this.__.__textBoxBounds, renderSpread);
8758
+ if (this.__box)
8759
+ this.__box.__layout.renderBounds = renderBounds;
8760
+ }
8761
+ __drawRenderPath(canvas) {
8762
+ canvas.font = this.__.__font;
8763
+ }
8764
+ __draw(canvas, options, originCanvas) {
8765
+ const box = this.__box;
8766
+ if (box)
8767
+ box.__nowWorld = this.__nowWorld, box.__draw(canvas, options, originCanvas);
8768
+ if (this.textEditing && !Export.running)
8769
+ return;
8770
+ super.__draw(canvas, options, originCanvas);
8771
+ }
8772
+ destroy() {
8773
+ if (this.boxStyle)
8774
+ this.boxStyle = null;
8775
+ super.destroy();
8688
8776
  }
8689
8777
  };
8690
8778
  __decorate([
@@ -8696,6 +8784,9 @@ __decorate([
8696
8784
  __decorate([
8697
8785
  boundsType(0)
8698
8786
  ], Text.prototype, "height", void 0);
8787
+ __decorate([
8788
+ surfaceType()
8789
+ ], Text.prototype, "boxStyle", void 0);
8699
8790
  __decorate([
8700
8791
  dataType(false)
8701
8792
  ], Text.prototype, "resizeFontSize", void 0);
@@ -9181,9 +9272,11 @@ const tempBox = new Bounds();
9181
9272
  const tempPoint = {};
9182
9273
  const tempScaleData = {};
9183
9274
  function createData(leafPaint, image, paint, box) {
9184
- const { blendMode, sync } = paint;
9275
+ const { blendMode, changeful, sync } = paint;
9185
9276
  if (blendMode)
9186
9277
  leafPaint.blendMode = blendMode;
9278
+ if (changeful)
9279
+ leafPaint.changeful = changeful;
9187
9280
  if (sync)
9188
9281
  leafPaint.sync = sync;
9189
9282
  leafPaint.data = getPatternData(paint, box, image);
@@ -9416,40 +9509,32 @@ function createPattern(ui, paint, pixelRatio) {
9416
9509
  }
9417
9510
 
9418
9511
  const { abs } = Math;
9419
- function checkImage(ui, canvas, paint, allowPaint) {
9512
+ function checkImage(ui, canvas, paint, allowDraw) {
9420
9513
  const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9421
- const { pixelRatio } = canvas;
9422
- if (!paint.data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
9514
+ const { pixelRatio } = canvas, { data } = paint;
9515
+ if (!data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
9423
9516
  return false;
9424
9517
  }
9425
9518
  else {
9426
- const { data } = paint;
9427
- if (allowPaint) {
9428
- if (!data.repeat) {
9429
- let { width, height } = data;
9430
- width *= abs(scaleX) * pixelRatio;
9431
- height *= abs(scaleY) * pixelRatio;
9432
- if (data.scaleX) {
9433
- width *= data.scaleX;
9434
- height *= data.scaleY;
9435
- }
9436
- allowPaint = (width * height > Platform.image.maxCacheSize) || Export.running;
9519
+ if (allowDraw) {
9520
+ if (data.repeat) {
9521
+ allowDraw = false;
9437
9522
  }
9438
9523
  else {
9439
- allowPaint = false;
9524
+ if (!(paint.changeful || ResizeEvent.isResizing(ui) || Export.running)) {
9525
+ let { width, height } = data;
9526
+ width *= abs(scaleX) * pixelRatio;
9527
+ height *= abs(scaleY) * pixelRatio;
9528
+ if (data.scaleX) {
9529
+ width *= data.scaleX;
9530
+ height *= data.scaleY;
9531
+ }
9532
+ allowDraw = (width * height > Platform.image.maxCacheSize);
9533
+ }
9440
9534
  }
9441
9535
  }
9442
- if (allowPaint) {
9443
- canvas.save();
9444
- ui.windingRule ? canvas.clip(ui.windingRule) : canvas.clip();
9445
- if (paint.blendMode)
9446
- canvas.blendMode = paint.blendMode;
9447
- if (data.opacity)
9448
- canvas.opacity *= data.opacity;
9449
- if (data.transform)
9450
- canvas.transform(data.transform);
9451
- canvas.drawImage(paint.image.getFull(data.filters), 0, 0, data.width, data.height);
9452
- canvas.restore();
9536
+ if (allowDraw) {
9537
+ drawImage(ui, canvas, paint, data);
9453
9538
  return true;
9454
9539
  }
9455
9540
  else {
@@ -9470,13 +9555,26 @@ function checkImage(ui, canvas, paint, allowPaint) {
9470
9555
  }
9471
9556
  }
9472
9557
  }
9558
+ function drawImage(ui, canvas, paint, data) {
9559
+ canvas.save();
9560
+ ui.windingRule ? canvas.clip(ui.windingRule) : canvas.clip();
9561
+ if (paint.blendMode)
9562
+ canvas.blendMode = paint.blendMode;
9563
+ if (data.opacity)
9564
+ canvas.opacity *= data.opacity;
9565
+ if (data.transform)
9566
+ canvas.transform(data.transform);
9567
+ canvas.drawImage(paint.image.getFull(data.filters), 0, 0, data.width, data.height);
9568
+ canvas.restore();
9569
+ }
9473
9570
 
9474
9571
  function recycleImage(attrName, data) {
9475
9572
  const paints = data['_' + attrName];
9476
9573
  if (paints instanceof Array) {
9477
- let image, recycleMap, input, url;
9574
+ let paint, image, recycleMap, input, url;
9478
9575
  for (let i = 0, len = paints.length; i < len; i++) {
9479
- image = paints[i].image;
9576
+ paint = paints[i];
9577
+ image = paint.image;
9480
9578
  url = image && image.url;
9481
9579
  if (url) {
9482
9580
  if (!recycleMap)
@@ -9491,8 +9589,6 @@ function recycleImage(attrName, data) {
9491
9589
  }
9492
9590
  image.unload(paints[i].loadId, !input.some((item) => item.url === url));
9493
9591
  }
9494
- else
9495
- paints[i].style = null;
9496
9592
  }
9497
9593
  }
9498
9594
  return recycleMap;
@@ -9671,7 +9767,7 @@ const { toOffsetOutBounds } = BoundsHelper;
9671
9767
  const offsetOutBounds = {};
9672
9768
  function innerShadow(ui, current, shape) {
9673
9769
  let copyBounds, spreadScale;
9674
- const { __nowWorld: nowWorld, __layout: __layout } = ui;
9770
+ const { __nowWorld: nowWorld, __layout } = ui;
9675
9771
  const { innerShadow } = ui.__;
9676
9772
  const { worldCanvas, bounds, shapeBounds, scaleX, scaleY } = shape;
9677
9773
  const other = current.getSameCanvas();