leafer-draw 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
  const debug$4 = Debug.get('LeaferCanvas');
6077
6131
  class LeaferCanvas extends LeaferCanvasBase {
@@ -6492,7 +6546,6 @@ function updateChange(updateList) {
6492
6546
  }
6493
6547
 
6494
6548
  const { worldBounds } = LeafBoundsHelper;
6495
- const bigBounds = { x: 0, y: 0, width: 100000, height: 100000 };
6496
6549
  class LayoutBlockData {
6497
6550
  constructor(list) {
6498
6551
  this.updatedBounds = new Bounds();
@@ -6506,13 +6559,7 @@ class LayoutBlockData {
6506
6559
  this.beforeBounds.setListWithFn(this.updatedList.list, worldBounds);
6507
6560
  }
6508
6561
  setAfter() {
6509
- const { list } = this.updatedList;
6510
- if (list.some(leaf => leaf.noBounds)) {
6511
- this.afterBounds.set(bigBounds);
6512
- }
6513
- else {
6514
- this.afterBounds.setListWithFn(list, worldBounds);
6515
- }
6562
+ this.afterBounds.setListWithFn(this.updatedList.list, worldBounds);
6516
6563
  this.updatedBounds.setList([this.beforeBounds, this.afterBounds]);
6517
6564
  }
6518
6565
  merge(data) {
@@ -6714,6 +6761,22 @@ class Renderer {
6714
6761
  requestLayout() {
6715
6762
  this.target.emit(LayoutEvent.REQUEST);
6716
6763
  }
6764
+ checkRender() {
6765
+ if (this.running) {
6766
+ const { target } = this;
6767
+ if (target.isApp) {
6768
+ target.emit(RenderEvent.CHILD_START, target);
6769
+ target.children.forEach(leafer => {
6770
+ leafer.renderer.FPS = this.FPS;
6771
+ leafer.renderer.checkRender();
6772
+ });
6773
+ target.emit(RenderEvent.CHILD_END, target);
6774
+ }
6775
+ if (this.changed && this.canvas.view)
6776
+ this.render();
6777
+ this.target.emit(RenderEvent.NEXT);
6778
+ }
6779
+ }
6717
6780
  render(callback) {
6718
6781
  if (!(this.running && this.canvas.view))
6719
6782
  return this.update();
@@ -6722,8 +6785,6 @@ class Renderer {
6722
6785
  this.totalBounds = new Bounds();
6723
6786
  debug$2.log(target.innerName, '--->');
6724
6787
  try {
6725
- if (!target.isApp)
6726
- target.app.emit(RenderEvent.CHILD_START, target);
6727
6788
  this.emitRender(RenderEvent.START);
6728
6789
  this.renderOnce(callback);
6729
6790
  this.emitRender(RenderEvent.END, this.totalBounds);
@@ -6791,20 +6852,12 @@ class Renderer {
6791
6852
  }
6792
6853
  clipRender(block) {
6793
6854
  const t = Run.start('PartRender');
6794
- const { canvas } = this;
6795
- const bounds = block.getIntersect(canvas.bounds);
6796
- const includes = block.includes(this.target.__world);
6797
- const realBounds = new Bounds(bounds);
6855
+ const { canvas } = this, bounds = block.getIntersect(canvas.bounds), realBounds = new Bounds(bounds);
6798
6856
  canvas.save();
6799
- if (includes && !Debug.showRepaint) {
6800
- canvas.clear();
6801
- }
6802
- else {
6803
- bounds.spread(10 + 1 / this.canvas.pixelRatio).ceil();
6804
- canvas.clearWorld(bounds, true);
6805
- canvas.clipWorld(bounds, true);
6806
- }
6807
- this.__render(bounds, includes, realBounds);
6857
+ bounds.spread(Renderer.clipSpread).ceil();
6858
+ canvas.clearWorld(bounds, true);
6859
+ canvas.clipWorld(bounds, true);
6860
+ this.__render(bounds, realBounds);
6808
6861
  canvas.restore();
6809
6862
  Run.end(t);
6810
6863
  }
@@ -6813,28 +6866,22 @@ class Renderer {
6813
6866
  const { canvas } = this;
6814
6867
  canvas.save();
6815
6868
  canvas.clear();
6816
- this.__render(canvas.bounds, true);
6869
+ this.__render(canvas.bounds);
6817
6870
  canvas.restore();
6818
6871
  Run.end(t);
6819
6872
  }
6820
- __render(bounds, includes, realBounds) {
6821
- const options = bounds.includes(this.target.__world) ? { includes } : { bounds, includes };
6873
+ __render(bounds, realBounds) {
6874
+ const { canvas } = this, includes = bounds.includes(this.target.__world), options = includes ? { includes } : { bounds, includes };
6822
6875
  if (this.needFill)
6823
- this.canvas.fillWorld(bounds, this.config.fill);
6876
+ canvas.fillWorld(bounds, this.config.fill);
6824
6877
  if (Debug.showRepaint)
6825
- this.canvas.strokeWorld(bounds, 'red');
6826
- this.target.__render(this.canvas, options);
6878
+ Debug.drawRepaint(canvas, bounds);
6879
+ this.target.__render(canvas, options);
6827
6880
  this.renderBounds = realBounds = realBounds || bounds;
6828
6881
  this.renderOptions = options;
6829
6882
  this.totalBounds.isEmpty() ? this.totalBounds = realBounds : this.totalBounds.add(realBounds);
6830
- if (Debug.showHitView)
6831
- this.renderHitView(options);
6832
- if (Debug.showBoundsView)
6833
- this.renderBoundsView(options);
6834
- this.canvas.updateRender(realBounds);
6835
- }
6836
- renderHitView(_options) { }
6837
- renderBoundsView(_options) { }
6883
+ canvas.updateRender(realBounds);
6884
+ }
6838
6885
  addBlock(block) {
6839
6886
  if (!this.updateBlocks)
6840
6887
  this.updateBlocks = [];
@@ -6850,17 +6897,16 @@ class Renderer {
6850
6897
  }
6851
6898
  }
6852
6899
  __requestRender() {
6853
- if (this.requestTime)
6900
+ const target = this.target;
6901
+ if (this.requestTime || !target)
6854
6902
  return;
6903
+ if (target.parentApp)
6904
+ return target.parentApp.requestRender(false);
6855
6905
  const requestTime = this.requestTime = Date.now();
6856
6906
  Platform.requestRender(() => {
6857
6907
  this.FPS = Math.min(60, Math.ceil(1000 / (Date.now() - requestTime)));
6858
6908
  this.requestTime = 0;
6859
- if (this.running) {
6860
- if (this.changed && this.canvas.view)
6861
- this.render();
6862
- this.target.emit(RenderEvent.NEXT);
6863
- }
6909
+ this.checkRender();
6864
6910
  });
6865
6911
  }
6866
6912
  __onResize(e) {
@@ -6918,6 +6964,7 @@ class Renderer {
6918
6964
  }
6919
6965
  }
6920
6966
  }
6967
+ Renderer.clipSpread = 10;
6921
6968
 
6922
6969
  Object.assign(Creator, {
6923
6970
  watcher: (target, options) => new Watcher(target, options),
@@ -7006,6 +7053,7 @@ class UIData extends LeafData {
7006
7053
  return strokeWidth;
7007
7054
  }
7008
7055
  get __hasStroke() { return this.stroke && this.strokeWidth; }
7056
+ get __hasHalf() { const t = this; return (t.stroke && t.strokeAlign === 'center' && t.strokeWidth % 2) || undefined; }
7009
7057
  get __hasMultiPaint() {
7010
7058
  const t = this;
7011
7059
  if ((t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect)
@@ -7050,14 +7098,14 @@ class UIData extends LeafData {
7050
7098
  this.__removeInput('fill');
7051
7099
  PaintImage.recycleImage('fill', this);
7052
7100
  this.__isFills = false;
7053
- if (this.__pixelFill)
7054
- this.__pixelFill = false;
7101
+ this.__pixelFill && (this.__pixelFill = false);
7055
7102
  }
7056
7103
  this._fill = value;
7057
7104
  }
7058
7105
  else if (typeof value === 'object') {
7059
7106
  this.__setInput('fill', value);
7060
- this.__leaf.__layout.boxChanged || this.__leaf.__layout.boxChange();
7107
+ const layout = this.__leaf.__layout;
7108
+ layout.boxChanged || layout.boxChange();
7061
7109
  this.__isFills = true;
7062
7110
  this._fill || (this._fill = emptyPaint);
7063
7111
  }
@@ -7068,14 +7116,14 @@ class UIData extends LeafData {
7068
7116
  this.__removeInput('stroke');
7069
7117
  PaintImage.recycleImage('stroke', this);
7070
7118
  this.__isStrokes = false;
7071
- if (this.__pixelStroke)
7072
- this.__pixelStroke = false;
7119
+ this.__pixelStroke && (this.__pixelStroke = false);
7073
7120
  }
7074
7121
  this._stroke = value;
7075
7122
  }
7076
7123
  else if (typeof value === 'object') {
7077
7124
  this.__setInput('stroke', value);
7078
- this.__leaf.__layout.boxChanged || this.__leaf.__layout.boxChange();
7125
+ const layout = this.__leaf.__layout;
7126
+ layout.boxChanged || layout.boxChange();
7079
7127
  this.__isStrokes = true;
7080
7128
  this._stroke || (this._stroke = emptyPaint);
7081
7129
  }
@@ -7190,6 +7238,31 @@ class TextData extends UIData {
7190
7238
  this._fontWeight = value;
7191
7239
  }
7192
7240
  }
7241
+ setBoxStyle(value) {
7242
+ let t = this.__leaf, box = t.__box;
7243
+ if (value) {
7244
+ const { boxStyle } = this;
7245
+ if (box)
7246
+ for (let key in boxStyle)
7247
+ box[key] = undefined;
7248
+ else
7249
+ box = t.__box = UICreator.get('Rect', 0);
7250
+ const layout = t.__layout, boxLayout = box.__layout;
7251
+ if (!boxStyle)
7252
+ box.parent = t, box.__world = t.__world, boxLayout.boxBounds = layout.boxBounds;
7253
+ box.set(value);
7254
+ if (boxLayout.strokeChanged)
7255
+ layout.strokeChange();
7256
+ if (boxLayout.renderChanged)
7257
+ layout.renderChange();
7258
+ box.__updateChange();
7259
+ }
7260
+ else if (box) {
7261
+ t.__box = box.parent = null;
7262
+ box.destroy();
7263
+ }
7264
+ this._boxStyle = value;
7265
+ }
7193
7266
  }
7194
7267
 
7195
7268
  class ImageData extends RectData {
@@ -7227,7 +7300,7 @@ class CanvasData extends RectData {
7227
7300
  const UIBounds = {
7228
7301
  __updateStrokeSpread() {
7229
7302
  let width = 0, boxWidth = 0;
7230
- const data = this.__, { strokeAlign, strokeWidth } = data;
7303
+ const data = this.__, { strokeAlign, strokeWidth } = data, box = this.__box;
7231
7304
  if ((data.stroke || data.hitStroke === 'all') && strokeWidth && strokeAlign !== 'inside') {
7232
7305
  boxWidth = width = strokeAlign === 'center' ? strokeWidth / 2 : strokeWidth;
7233
7306
  if (!data.__boxStroke) {
@@ -7238,6 +7311,10 @@ const UIBounds = {
7238
7311
  }
7239
7312
  if (data.__useArrow)
7240
7313
  width += strokeWidth * 5;
7314
+ if (box) {
7315
+ width = Math.max(box.__layout.strokeSpread = box.__updateStrokeSpread(), width);
7316
+ boxWidth = box.__layout.strokeBoxSpread;
7317
+ }
7241
7318
  this.__layout.strokeBoxSpread = boxWidth;
7242
7319
  return width;
7243
7320
  },
@@ -7256,25 +7333,26 @@ const UIBounds = {
7256
7333
  if (backgroundBlur)
7257
7334
  shapeWidth = Math.max(shapeWidth, backgroundBlur);
7258
7335
  this.__layout.renderShapeSpread = shapeWidth;
7259
- return width + (this.__layout.strokeSpread || 0);
7336
+ width += this.__layout.strokeSpread || 0;
7337
+ return this.__box ? Math.max(this.__box.__updateRenderSpread(), width) : width;
7260
7338
  }
7261
7339
  };
7262
7340
 
7263
7341
  const UIRender = {
7264
7342
  __updateChange() {
7265
- const data = this.__;
7343
+ const data = this.__, w = this.__world;
7266
7344
  if (data.__useEffect) {
7267
7345
  const { shadow, innerShadow, blur, backgroundBlur, filter } = this.__;
7268
7346
  data.__useEffect = !!(shadow || innerShadow || blur || backgroundBlur || filter);
7269
7347
  }
7348
+ const half = data.__hasHalf;
7349
+ w.half !== half && (w.half = half);
7270
7350
  data.__checkSingle();
7271
7351
  const complex = data.__isFills || data.__isStrokes || data.cornerRadius || data.__useEffect;
7272
- if (complex) {
7352
+ if (complex)
7273
7353
  data.__complex = true;
7274
- }
7275
- else {
7354
+ else
7276
7355
  data.__complex && (data.__complex = false);
7277
- }
7278
7356
  },
7279
7357
  __drawFast(canvas, options) {
7280
7358
  drawFast(this, canvas, options);
@@ -7361,10 +7439,11 @@ function drawFast(ui, canvas, options) {
7361
7439
 
7362
7440
  const RectRender = {
7363
7441
  __drawFast(canvas, options) {
7364
- let { width, height, fill, stroke, __drawAfterFill } = this.__;
7442
+ let { x, y, width, height } = this.__layout.boxBounds;
7443
+ const { fill, stroke, __drawAfterFill } = this.__;
7365
7444
  if (fill) {
7366
7445
  canvas.fillStyle = fill;
7367
- canvas.fillRect(0, 0, width, height);
7446
+ canvas.fillRect(x, y, width, height);
7368
7447
  }
7369
7448
  if (__drawAfterFill)
7370
7449
  this.__drawAfterFill(canvas, options);
@@ -7383,14 +7462,14 @@ const RectRender = {
7383
7462
  if (width < 0 || height < 0) {
7384
7463
  canvas.save();
7385
7464
  this.__clip(canvas, options);
7386
- canvas.strokeRect(half, half, width, height);
7465
+ canvas.strokeRect(x + half, y + half, width, height);
7387
7466
  canvas.restore();
7388
7467
  }
7389
7468
  else
7390
- canvas.strokeRect(half, half, width, height);
7469
+ canvas.strokeRect(x + half, y + half, width, height);
7391
7470
  break;
7392
7471
  case 'outside':
7393
- canvas.strokeRect(-half, -half, width + __strokeWidth, height + __strokeWidth);
7472
+ canvas.strokeRect(x - half, y - half, width + __strokeWidth, height + __strokeWidth);
7394
7473
  break;
7395
7474
  }
7396
7475
  }
@@ -7546,6 +7625,12 @@ __decorate([
7546
7625
  __decorate([
7547
7626
  surfaceType(false)
7548
7627
  ], UI.prototype, "locked", void 0);
7628
+ __decorate([
7629
+ surfaceType(false)
7630
+ ], UI.prototype, "dim", void 0);
7631
+ __decorate([
7632
+ surfaceType(false)
7633
+ ], UI.prototype, "dimskip", void 0);
7549
7634
  __decorate([
7550
7635
  sortType(0)
7551
7636
  ], UI.prototype, "zIndex", void 0);
@@ -7807,7 +7892,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
7807
7892
  start: true,
7808
7893
  hittable: true,
7809
7894
  smooth: true,
7810
- lazySpeard: 100
7895
+ lazySpeard: 100,
7811
7896
  };
7812
7897
  this.leafs = 0;
7813
7898
  this.__eventIds = [];
@@ -8231,13 +8316,13 @@ let Box = class Box extends Group {
8231
8316
  super.__updateRenderBounds();
8232
8317
  copy$2(childrenRenderBounds, renderBounds);
8233
8318
  this.__updateRectRenderBounds();
8234
- isOverflow = !includes$1(renderBounds, childrenRenderBounds);
8319
+ isOverflow = !includes$1(renderBounds, childrenRenderBounds) || undefined;
8235
8320
  if (isOverflow && this.__.overflow !== 'hide')
8236
8321
  add(renderBounds, childrenRenderBounds);
8237
8322
  }
8238
8323
  else
8239
8324
  this.__updateRectRenderBounds();
8240
- !this.isOverflow !== !isOverflow && (this.isOverflow = isOverflow);
8325
+ this.isOverflow !== isOverflow && (this.isOverflow = isOverflow);
8241
8326
  }
8242
8327
  __updateRectRenderBounds() { }
8243
8328
  __updateRectChange() { }
@@ -8645,33 +8730,13 @@ Canvas = __decorate([
8645
8730
  registerUI()
8646
8731
  ], Canvas);
8647
8732
 
8648
- const { copyAndSpread, includes, isSame: isSame$1, spread, setList } = BoundsHelper;
8733
+ const { copyAndSpread, includes, spread, setList } = BoundsHelper;
8649
8734
  let Text = class Text extends UI {
8650
8735
  get __tag() { return 'Text'; }
8651
- get textDrawData() {
8652
- this.__layout.update();
8653
- return this.__.__textDrawData;
8654
- }
8736
+ get textDrawData() { this.updateLayout(); return this.__.__textDrawData; }
8655
8737
  constructor(data) {
8656
8738
  super(data);
8657
8739
  }
8658
- __drawHitPath(canvas) {
8659
- const { __lineHeight, fontSize, __baseLine, __textDrawData: data } = this.__;
8660
- canvas.beginPath();
8661
- if (this.__.__letterSpacing < 0) {
8662
- this.__drawPathByData(canvas);
8663
- }
8664
- else {
8665
- data.rows.forEach(row => canvas.rect(row.x, row.y - __baseLine, row.width, __lineHeight < fontSize ? fontSize : __lineHeight));
8666
- }
8667
- }
8668
- __drawPathByData(drawer, _data) {
8669
- const { x, y, width, height } = this.__layout.boxBounds;
8670
- drawer.rect(x, y, width, height);
8671
- }
8672
- __drawRenderPath(canvas) {
8673
- canvas.font = this.__.__font;
8674
- }
8675
8740
  __updateTextDrawData() {
8676
8741
  const data = this.__;
8677
8742
  const { lineHeight, letterSpacing, fontFamily, fontSize, fontWeight, italic, textCase, textOverflow, padding } = data;
@@ -8688,15 +8753,16 @@ let Text = class Text extends UI {
8688
8753
  const layout = this.__layout;
8689
8754
  const { fontSize, italic, padding, __autoWidth: autoWidth, __autoHeight: autoHeight } = data;
8690
8755
  this.__updateTextDrawData();
8691
- const { bounds } = data.__textDrawData;
8756
+ const { bounds: contentBounds } = data.__textDrawData;
8692
8757
  const b = layout.boxBounds;
8758
+ layout.contentBounds = contentBounds;
8693
8759
  if (data.__lineHeight < fontSize)
8694
- spread(bounds, fontSize / 2);
8760
+ spread(contentBounds, fontSize / 2);
8695
8761
  if (autoWidth || autoHeight) {
8696
- b.x = autoWidth ? bounds.x : 0;
8697
- b.y = autoHeight ? bounds.y : 0;
8698
- b.width = autoWidth ? bounds.width : data.width;
8699
- b.height = autoHeight ? bounds.height : data.height;
8762
+ b.x = autoWidth ? contentBounds.x : 0;
8763
+ b.y = autoHeight ? contentBounds.y : 0;
8764
+ b.width = autoWidth ? contentBounds.width : data.width;
8765
+ b.height = autoHeight ? contentBounds.height : data.height;
8700
8766
  if (padding) {
8701
8767
  const [top, right, bottom, left] = data.__padding;
8702
8768
  if (autoWidth)
@@ -8710,23 +8776,45 @@ let Text = class Text extends UI {
8710
8776
  super.__updateBoxBounds();
8711
8777
  if (italic)
8712
8778
  b.width += fontSize * 0.16;
8713
- const contentBounds = includes(b, bounds) ? b : bounds;
8714
- if (!isSame$1(contentBounds, layout.contentBounds)) {
8715
- layout.contentBounds = contentBounds;
8716
- layout.renderChanged = true;
8717
- setList(data.__textBoxBounds = {}, [b, bounds]);
8718
- }
8779
+ const isOverflow = !includes(b, contentBounds) || undefined;
8780
+ if (isOverflow)
8781
+ setList(data.__textBoxBounds = {}, [b, contentBounds]), layout.renderChanged = true;
8719
8782
  else
8720
- data.__textBoxBounds = contentBounds;
8783
+ data.__textBoxBounds = b;
8784
+ this.isOverflow !== isOverflow && (this.isOverflow = isOverflow);
8785
+ }
8786
+ __onUpdateSize() {
8787
+ if (this.__box)
8788
+ this.__box.__onUpdateSize();
8789
+ super.__onUpdateSize();
8721
8790
  }
8722
8791
  __updateRenderSpread() {
8723
8792
  let width = super.__updateRenderSpread();
8724
8793
  if (!width)
8725
- width = this.__layout.boxBounds === this.__layout.contentBounds ? 0 : 1;
8794
+ width = this.isOverflow ? 1 : 0;
8726
8795
  return width;
8727
8796
  }
8728
8797
  __updateRenderBounds() {
8729
- copyAndSpread(this.__layout.renderBounds, this.__.__textBoxBounds, this.__layout.renderSpread);
8798
+ const { renderBounds, renderSpread } = this.__layout;
8799
+ copyAndSpread(renderBounds, this.__.__textBoxBounds, renderSpread);
8800
+ if (this.__box)
8801
+ this.__box.__layout.renderBounds = renderBounds;
8802
+ }
8803
+ __drawRenderPath(canvas) {
8804
+ canvas.font = this.__.__font;
8805
+ }
8806
+ __draw(canvas, options, originCanvas) {
8807
+ const box = this.__box;
8808
+ if (box)
8809
+ box.__nowWorld = this.__nowWorld, box.__draw(canvas, options, originCanvas);
8810
+ if (this.textEditing && !Export.running)
8811
+ return;
8812
+ super.__draw(canvas, options, originCanvas);
8813
+ }
8814
+ destroy() {
8815
+ if (this.boxStyle)
8816
+ this.boxStyle = null;
8817
+ super.destroy();
8730
8818
  }
8731
8819
  };
8732
8820
  __decorate([
@@ -8738,6 +8826,9 @@ __decorate([
8738
8826
  __decorate([
8739
8827
  boundsType(0)
8740
8828
  ], Text.prototype, "height", void 0);
8829
+ __decorate([
8830
+ surfaceType()
8831
+ ], Text.prototype, "boxStyle", void 0);
8741
8832
  __decorate([
8742
8833
  dataType(false)
8743
8834
  ], Text.prototype, "resizeFontSize", void 0);
@@ -9223,9 +9314,11 @@ const tempBox = new Bounds();
9223
9314
  const tempPoint = {};
9224
9315
  const tempScaleData = {};
9225
9316
  function createData(leafPaint, image, paint, box) {
9226
- const { blendMode, sync } = paint;
9317
+ const { blendMode, changeful, sync } = paint;
9227
9318
  if (blendMode)
9228
9319
  leafPaint.blendMode = blendMode;
9320
+ if (changeful)
9321
+ leafPaint.changeful = changeful;
9229
9322
  if (sync)
9230
9323
  leafPaint.sync = sync;
9231
9324
  leafPaint.data = getPatternData(paint, box, image);
@@ -9458,40 +9551,32 @@ function createPattern(ui, paint, pixelRatio) {
9458
9551
  }
9459
9552
 
9460
9553
  const { abs } = Math;
9461
- function checkImage(ui, canvas, paint, allowPaint) {
9554
+ function checkImage(ui, canvas, paint, allowDraw) {
9462
9555
  const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9463
- const { pixelRatio } = canvas;
9464
- if (!paint.data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
9556
+ const { pixelRatio } = canvas, { data } = paint;
9557
+ if (!data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
9465
9558
  return false;
9466
9559
  }
9467
9560
  else {
9468
- const { data } = paint;
9469
- if (allowPaint) {
9470
- if (!data.repeat) {
9471
- let { width, height } = data;
9472
- width *= abs(scaleX) * pixelRatio;
9473
- height *= abs(scaleY) * pixelRatio;
9474
- if (data.scaleX) {
9475
- width *= data.scaleX;
9476
- height *= data.scaleY;
9477
- }
9478
- allowPaint = (width * height > Platform.image.maxCacheSize) || Export.running;
9561
+ if (allowDraw) {
9562
+ if (data.repeat) {
9563
+ allowDraw = false;
9479
9564
  }
9480
9565
  else {
9481
- allowPaint = false;
9566
+ if (!(paint.changeful || ResizeEvent.isResizing(ui) || Export.running)) {
9567
+ let { width, height } = data;
9568
+ width *= abs(scaleX) * pixelRatio;
9569
+ height *= abs(scaleY) * pixelRatio;
9570
+ if (data.scaleX) {
9571
+ width *= data.scaleX;
9572
+ height *= data.scaleY;
9573
+ }
9574
+ allowDraw = (width * height > Platform.image.maxCacheSize);
9575
+ }
9482
9576
  }
9483
9577
  }
9484
- if (allowPaint) {
9485
- canvas.save();
9486
- ui.windingRule ? canvas.clip(ui.windingRule) : canvas.clip();
9487
- if (paint.blendMode)
9488
- canvas.blendMode = paint.blendMode;
9489
- if (data.opacity)
9490
- canvas.opacity *= data.opacity;
9491
- if (data.transform)
9492
- canvas.transform(data.transform);
9493
- canvas.drawImage(paint.image.getFull(data.filters), 0, 0, data.width, data.height);
9494
- canvas.restore();
9578
+ if (allowDraw) {
9579
+ drawImage(ui, canvas, paint, data);
9495
9580
  return true;
9496
9581
  }
9497
9582
  else {
@@ -9512,13 +9597,26 @@ function checkImage(ui, canvas, paint, allowPaint) {
9512
9597
  }
9513
9598
  }
9514
9599
  }
9600
+ function drawImage(ui, canvas, paint, data) {
9601
+ canvas.save();
9602
+ ui.windingRule ? canvas.clip(ui.windingRule) : canvas.clip();
9603
+ if (paint.blendMode)
9604
+ canvas.blendMode = paint.blendMode;
9605
+ if (data.opacity)
9606
+ canvas.opacity *= data.opacity;
9607
+ if (data.transform)
9608
+ canvas.transform(data.transform);
9609
+ canvas.drawImage(paint.image.getFull(data.filters), 0, 0, data.width, data.height);
9610
+ canvas.restore();
9611
+ }
9515
9612
 
9516
9613
  function recycleImage(attrName, data) {
9517
9614
  const paints = data['_' + attrName];
9518
9615
  if (paints instanceof Array) {
9519
- let image, recycleMap, input, url;
9616
+ let paint, image, recycleMap, input, url;
9520
9617
  for (let i = 0, len = paints.length; i < len; i++) {
9521
- image = paints[i].image;
9618
+ paint = paints[i];
9619
+ image = paint.image;
9522
9620
  url = image && image.url;
9523
9621
  if (url) {
9524
9622
  if (!recycleMap)
@@ -9533,8 +9631,6 @@ function recycleImage(attrName, data) {
9533
9631
  }
9534
9632
  image.unload(paints[i].loadId, !input.some((item) => item.url === url));
9535
9633
  }
9536
- else
9537
- paints[i].style = null;
9538
9634
  }
9539
9635
  }
9540
9636
  return recycleMap;
@@ -9713,7 +9809,7 @@ const { toOffsetOutBounds } = BoundsHelper;
9713
9809
  const offsetOutBounds = {};
9714
9810
  function innerShadow(ui, current, shape) {
9715
9811
  let copyBounds, spreadScale;
9716
- const { __nowWorld: nowWorld, __layout: __layout } = ui;
9812
+ const { __nowWorld: nowWorld, __layout } = ui;
9717
9813
  const { innerShadow } = ui.__;
9718
9814
  const { worldCanvas, bounds, shapeBounds, scaleX, scaleY } = shape;
9719
9815
  const other = current.getSameCanvas();