@leafer-ui/worker 1.9.6 → 1.9.8

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.
@@ -247,18 +247,34 @@ class LeafData {
247
247
  }
248
248
  }
249
249
 
250
- const {round: round$3, pow: pow$1, PI: PI$3} = Math;
251
-
252
- const MathHelper = {
253
- within(value, min, max) {
254
- if (isObject(min)) max = min.max, min = min.min;
255
- if (!isUndefined(min) && value < min) value = min;
256
- if (!isUndefined(max) && value > max) value = max;
257
- return value;
250
+ let tempA, tempB, tempTo;
251
+
252
+ const {max: max$4} = Math, tempFour = [ 0, 0, 0, 0 ];
253
+
254
+ const FourNumberHelper = {
255
+ zero: [ ...tempFour ],
256
+ tempFour: tempFour,
257
+ set(to, top, right, bottom, left) {
258
+ if (right === undefined) right = bottom = left = top;
259
+ to[0] = top;
260
+ to[1] = right;
261
+ to[2] = bottom;
262
+ to[3] = left;
263
+ return to;
258
264
  },
259
- fourNumber(num, maxValue) {
265
+ setTemp(top, right, bottom, left) {
266
+ return set$1(tempFour, top, right, bottom, left);
267
+ },
268
+ toTempAB(a, b, change) {
269
+ tempTo = change ? isNumber(a) ? b : a : [];
270
+ if (isNumber(a)) tempA = setTemp(a), tempB = b; else if (isNumber(b)) tempA = a,
271
+ tempB = setTemp(b); else tempA = a, tempB = b;
272
+ if (tempA.length !== 4) tempA = get$5(tempA);
273
+ if (tempB.length !== 4) tempB = get$5(tempB);
274
+ },
275
+ get(num, maxValue) {
260
276
  let data;
261
- if (isArray(num)) {
277
+ if (!isNumber(num)) {
262
278
  switch (num.length) {
263
279
  case 4:
264
280
  data = isUndefined(maxValue) ? num : [ ...num ];
@@ -281,9 +297,39 @@ const MathHelper = {
281
297
  }
282
298
  }
283
299
  if (!data) data = [ num, num, num, num ];
284
- if (maxValue) for (let i = 0; i < 4; i++) if (data[i] > maxValue) data[i] = maxValue;
300
+ if (!isUndefined(maxValue)) for (let i = 0; i < 4; i++) if (data[i] > maxValue) data[i] = maxValue;
285
301
  return data;
286
302
  },
303
+ max(t, other, change) {
304
+ if (isNumber(t) && isNumber(other)) return max$4(t, other);
305
+ toTempAB(t, other, change);
306
+ return set$1(tempTo, max$4(tempA[0], tempB[0]), max$4(tempA[1], tempB[1]), max$4(tempA[2], tempB[2]), max$4(tempA[3], tempB[3]));
307
+ },
308
+ add(t, other, change) {
309
+ if (isNumber(t) && isNumber(other)) return t + other;
310
+ toTempAB(t, other, change);
311
+ return set$1(tempTo, tempA[0] + tempB[0], tempA[1] + tempB[1], tempA[2] + tempB[2], tempA[3] + tempB[3]);
312
+ },
313
+ swapAndScale(t, scaleX, scaleY, change) {
314
+ if (isNumber(t)) return scaleX === scaleY ? t * scaleX : [ t * scaleY, t * scaleX ];
315
+ const to = change ? t : [];
316
+ const [top, right, bottom, left] = t.length === 4 ? t : get$5(t);
317
+ return set$1(to, bottom * scaleY, left * scaleX, top * scaleY, right * scaleX);
318
+ }
319
+ };
320
+
321
+ const {set: set$1, get: get$5, setTemp: setTemp, toTempAB: toTempAB} = FourNumberHelper;
322
+
323
+ const {round: round$3, pow: pow$1, PI: PI$3} = Math;
324
+
325
+ const MathHelper = {
326
+ within(value, min, max) {
327
+ if (isObject(min)) max = min.max, min = min.min;
328
+ if (!isUndefined(min) && value < min) value = min;
329
+ if (!isUndefined(max) && value > max) value = max;
330
+ return value;
331
+ },
332
+ fourNumber: FourNumberHelper.get,
287
333
  formatRotation(rotation, unsign) {
288
334
  rotation %= 360;
289
335
  if (unsign) {
@@ -423,6 +469,15 @@ const MatrixHelper = {
423
469
  t.c *= scaleY;
424
470
  t.d *= scaleY;
425
471
  },
472
+ pixelScale(t, pixelRatio, to) {
473
+ to || (to = t);
474
+ to.a = t.a * pixelRatio;
475
+ to.b = t.b * pixelRatio;
476
+ to.c = t.c * pixelRatio;
477
+ to.d = t.d * pixelRatio;
478
+ to.e = t.e * pixelRatio;
479
+ to.f = t.f * pixelRatio;
480
+ },
426
481
  scaleOfOuter(t, origin, scaleX, scaleY) {
427
482
  M$6.toInnerPoint(t, origin, tempPoint$3);
428
483
  M$6.scaleOfInner(t, tempPoint$3, scaleX, scaleY);
@@ -922,6 +977,10 @@ class Matrix {
922
977
  this.scaleY *= y || x;
923
978
  return this;
924
979
  }
980
+ pixelScale(pixelRatio) {
981
+ MatrixHelper.pixelScale(this, pixelRatio);
982
+ return this;
983
+ }
925
984
  scaleOfOuter(origin, x, y) {
926
985
  MatrixHelper.scaleOfOuter(this, origin, x, y);
927
986
  return this;
@@ -1001,7 +1060,7 @@ class Matrix {
1001
1060
  }
1002
1061
  }
1003
1062
 
1004
- const tempMatrix$1 = new Matrix;
1063
+ const tempMatrix$2 = new Matrix;
1005
1064
 
1006
1065
  const TwoPointBoundsHelper = {
1007
1066
  tempPointBounds: {},
@@ -1151,10 +1210,10 @@ const point = {};
1151
1210
 
1152
1211
  const toPoint$4 = {};
1153
1212
 
1154
- const tempBounds$2 = {};
1213
+ const tempBounds$3 = {};
1155
1214
 
1156
1215
  const BoundsHelper = {
1157
- tempBounds: tempBounds$2,
1216
+ tempBounds: tempBounds$3,
1158
1217
  set(t, x = 0, y = 0, width = 0, height = 0) {
1159
1218
  t.x = x;
1160
1219
  t.y = y;
@@ -1205,19 +1264,11 @@ const BoundsHelper = {
1205
1264
  B.move(t, x, y);
1206
1265
  return t;
1207
1266
  },
1208
- toOffsetOutBounds(t, to, parent) {
1209
- if (!to) {
1210
- to = t;
1211
- } else {
1212
- copy$9(to, t);
1213
- }
1214
- if (parent) {
1215
- to.offsetX = -(B.maxX(parent) - t.x);
1216
- to.offsetY = -(B.maxY(parent) - t.y);
1217
- } else {
1218
- to.offsetX = t.x + t.width;
1219
- to.offsetY = t.y + t.height;
1220
- }
1267
+ toOffsetOutBounds(t, to, offsetBounds) {
1268
+ if (!to) to = t; else copy$9(to, t);
1269
+ if (!offsetBounds) offsetBounds = t;
1270
+ to.offsetX = B.maxX(offsetBounds);
1271
+ to.offsetY = B.maxY(offsetBounds);
1221
1272
  B.move(to, -to.offsetX, -to.offsetY);
1222
1273
  },
1223
1274
  scale(t, scaleX, scaleY = scaleX, onlySize) {
@@ -1231,9 +1282,9 @@ const BoundsHelper = {
1231
1282
  t.height *= scaleY;
1232
1283
  },
1233
1284
  tempToOuterOf(t, matrix) {
1234
- B.copy(tempBounds$2, t);
1235
- B.toOuterOf(tempBounds$2, matrix);
1236
- return tempBounds$2;
1285
+ B.copy(tempBounds$3, t);
1286
+ B.toOuterOf(tempBounds$3, matrix);
1287
+ return tempBounds$3;
1237
1288
  },
1238
1289
  getOuterOf(t, matrix) {
1239
1290
  t = Object.assign({}, t);
@@ -1291,9 +1342,9 @@ const BoundsHelper = {
1291
1342
  put(t, put, align = "center", putScale = 1, changeSize = true, to) {
1292
1343
  to || (to = put);
1293
1344
  if (isString(putScale)) putScale = B.getFitScale(t, put, putScale === "cover");
1294
- tempBounds$2.width = changeSize ? put.width *= putScale : put.width * putScale;
1295
- tempBounds$2.height = changeSize ? put.height *= putScale : put.height * putScale;
1296
- AlignHelper.toPoint(align, tempBounds$2, t, to, true, true);
1345
+ tempBounds$3.width = changeSize ? put.width *= putScale : put.width * putScale;
1346
+ tempBounds$3.height = changeSize ? put.height *= putScale : put.height * putScale;
1347
+ AlignHelper.toPoint(align, tempBounds$3, t, to, true, true);
1297
1348
  },
1298
1349
  getSpread(t, spread, side) {
1299
1350
  const n = {};
@@ -1363,7 +1414,7 @@ const BoundsHelper = {
1363
1414
  first = false;
1364
1415
  if (!addMode) copy$9(t, bounds);
1365
1416
  } else {
1366
- add$1(t, bounds);
1417
+ add$2(t, bounds);
1367
1418
  }
1368
1419
  }
1369
1420
  }
@@ -1377,7 +1428,7 @@ const BoundsHelper = {
1377
1428
  B.set(t, point.x, point.y);
1378
1429
  },
1379
1430
  addPoint(t, point) {
1380
- add$1(t, point, true);
1431
+ add$2(t, point, true);
1381
1432
  },
1382
1433
  getPoints(t) {
1383
1434
  const {x: x, y: y, width: width, height: height} = t;
@@ -1448,7 +1499,7 @@ const BoundsHelper = {
1448
1499
 
1449
1500
  const B = BoundsHelper;
1450
1501
 
1451
- const {add: add$1, copy: copy$9} = B;
1502
+ const {add: add$2, copy: copy$9} = B;
1452
1503
 
1453
1504
  class Bounds {
1454
1505
  get minX() {
@@ -1593,7 +1644,7 @@ class Bounds {
1593
1644
  }
1594
1645
  }
1595
1646
 
1596
- const tempBounds$1 = new Bounds;
1647
+ const tempBounds$2 = new Bounds;
1597
1648
 
1598
1649
  class AutoBounds {
1599
1650
  constructor(top, right, bottom, left, width, height) {
@@ -2146,7 +2197,7 @@ __decorate([ contextMethod() ], Canvas$1.prototype, "measureText", null);
2146
2197
 
2147
2198
  __decorate([ contextMethod() ], Canvas$1.prototype, "strokeText", null);
2148
2199
 
2149
- const {copy: copy$8, multiplyParent: multiplyParent$4} = MatrixHelper, {round: round$1} = Math, tempPixelBounds = new Bounds, tempPixelBounds2 = new Bounds;
2200
+ const {copy: copy$8, multiplyParent: multiplyParent$4, pixelScale: pixelScale} = MatrixHelper, {round: round$1} = Math, tempPixelBounds = new Bounds, tempPixelBounds2 = new Bounds;
2150
2201
 
2151
2202
  const minSize = {
2152
2203
  width: 1,
@@ -2247,13 +2298,8 @@ class LeaferCanvasBase extends Canvas$1 {
2247
2298
  setWorld(matrix, parentMatrix) {
2248
2299
  const {pixelRatio: pixelRatio, pixelSnap: pixelSnap} = this, w = this.worldTransform;
2249
2300
  if (parentMatrix) multiplyParent$4(matrix, parentMatrix, w);
2250
- w.a = matrix.a * pixelRatio;
2251
- w.b = matrix.b * pixelRatio;
2252
- w.c = matrix.c * pixelRatio;
2253
- w.d = matrix.d * pixelRatio;
2254
- w.e = matrix.e * pixelRatio;
2255
- w.f = matrix.f * pixelRatio;
2256
- if (pixelSnap) {
2301
+ pixelScale(matrix, pixelRatio, w);
2302
+ if (pixelSnap && !matrix.ignorePixelSnap) {
2257
2303
  if (matrix.half && matrix.half * pixelRatio % 2) w.e = round$1(w.e - .5) + .5, w.f = round$1(w.f - .5) + .5; else w.e = round$1(w.e),
2258
2304
  w.f = round$1(w.f);
2259
2305
  }
@@ -3977,7 +4023,7 @@ const I$1 = ImageManager;
3977
4023
 
3978
4024
  const {IMAGE: IMAGE, create: create$1} = IncrementId;
3979
4025
 
3980
- const {floor: floor$1, max: max$1} = Math;
4026
+ const {floor: floor$1, max: max$3} = Math;
3981
4027
 
3982
4028
  class LeaferImage {
3983
4029
  get url() {
@@ -4066,7 +4112,7 @@ class LeaferImage {
4066
4112
  }
4067
4113
  if (data) return data;
4068
4114
  }
4069
- const canvas = Platform.origin.createCanvas(max$1(floor$1(width + (xGap || 0)), 1), max$1(floor$1(height + (yGap || 0)), 1));
4115
+ const canvas = Platform.origin.createCanvas(max$3(floor$1(width + (xGap || 0)), 1), max$3(floor$1(height + (yGap || 0)), 1));
4070
4116
  const ctx = canvas.getContext("2d");
4071
4117
  if (opacity) ctx.globalAlpha = opacity;
4072
4118
  ctx.imageSmoothingEnabled = smooth === false ? false : true;
@@ -4265,6 +4311,18 @@ function surfaceType(defaultValue) {
4265
4311
  }));
4266
4312
  }
4267
4313
 
4314
+ function dimType(defaultValue) {
4315
+ return decorateLeafAttr(defaultValue, key => attr({
4316
+ set(value) {
4317
+ if (this.__setAttr(key, value)) {
4318
+ const data = this.__;
4319
+ DataHelper.stintSet(data, "__useDim", data.dim || data.bright || data.dimskip);
4320
+ this.__layout.surfaceChange();
4321
+ }
4322
+ }
4323
+ }));
4324
+ }
4325
+
4268
4326
  function opacityType(defaultValue) {
4269
4327
  return decorateLeafAttr(defaultValue, key => attr({
4270
4328
  set(value) {
@@ -4309,7 +4367,7 @@ function sortType(defaultValue) {
4309
4367
  return decorateLeafAttr(defaultValue, key => attr({
4310
4368
  set(value) {
4311
4369
  if (this.__setAttr(key, value)) {
4312
- this.__layout.surfaceChanged || this.__layout.surfaceChange();
4370
+ this.__layout.surfaceChange();
4313
4371
  this.waitParent(() => {
4314
4372
  this.parent.__layout.childrenSortChange();
4315
4373
  });
@@ -4346,7 +4404,7 @@ function hitType(defaultValue) {
4346
4404
  set(value) {
4347
4405
  if (this.__setAttr(key, value)) {
4348
4406
  this.__layout.hitCanvasChanged = true;
4349
- if (Debug.showBounds === "hit") this.__layout.surfaceChanged || this.__layout.surfaceChange();
4407
+ if (Debug.showBounds === "hit") this.__layout.surfaceChange();
4350
4408
  if (this.leafer) this.leafer.updateCursor();
4351
4409
  }
4352
4410
  }
@@ -4848,7 +4906,7 @@ const WaitHelper = {
4848
4906
 
4849
4907
  const {getRelativeWorld: getRelativeWorld$1, updateBounds: updateBounds$2} = LeafHelper;
4850
4908
 
4851
- const {toOuterOf: toOuterOf$2, getPoints: getPoints, copy: copy$5} = BoundsHelper;
4909
+ const {toOuterOf: toOuterOf$3, getPoints: getPoints, copy: copy$5} = BoundsHelper;
4852
4910
 
4853
4911
  const localContent = "_localContentBounds";
4854
4912
 
@@ -4871,7 +4929,7 @@ class LeafLayout {
4871
4929
  this._renderBounds = bounds;
4872
4930
  }
4873
4931
  get localContentBounds() {
4874
- toOuterOf$2(this.contentBounds, this.leaf.__localMatrix, this[localContent] || (this[localContent] = {}));
4932
+ toOuterOf$3(this.contentBounds, this.leaf.__localMatrix, this[localContent] || (this[localContent] = {}));
4875
4933
  return this[localContent];
4876
4934
  }
4877
4935
  get localStrokeBounds() {
@@ -4881,15 +4939,15 @@ class LeafLayout {
4881
4939
  return this._localRenderBounds || this;
4882
4940
  }
4883
4941
  get worldContentBounds() {
4884
- toOuterOf$2(this.contentBounds, this.leaf.__world, this[worldContent] || (this[worldContent] = {}));
4942
+ toOuterOf$3(this.contentBounds, this.leaf.__world, this[worldContent] || (this[worldContent] = {}));
4885
4943
  return this[worldContent];
4886
4944
  }
4887
4945
  get worldBoxBounds() {
4888
- toOuterOf$2(this.boxBounds, this.leaf.__world, this[worldBox] || (this[worldBox] = {}));
4946
+ toOuterOf$3(this.boxBounds, this.leaf.__world, this[worldBox] || (this[worldBox] = {}));
4889
4947
  return this[worldBox];
4890
4948
  }
4891
4949
  get worldStrokeBounds() {
4892
- toOuterOf$2(this.strokeBounds, this.leaf.__world, this[worldStroke] || (this[worldStroke] = {}));
4950
+ toOuterOf$3(this.strokeBounds, this.leaf.__world, this[worldStroke] || (this[worldStroke] = {}));
4893
4951
  return this[worldStroke];
4894
4952
  }
4895
4953
  get a() {
@@ -5741,14 +5799,14 @@ const {updateMatrix: updateMatrix$1, updateAllMatrix: updateAllMatrix$2} = LeafH
5741
5799
 
5742
5800
  const {updateBounds: updateBounds$1} = BranchHelper;
5743
5801
 
5744
- const {toOuterOf: toOuterOf$1, copyAndSpread: copyAndSpread$1, copy: copy$4} = BoundsHelper;
5802
+ const {toOuterOf: toOuterOf$2, copyAndSpread: copyAndSpread$2, copy: copy$4} = BoundsHelper;
5745
5803
 
5746
5804
  const {toBounds: toBounds} = PathBounds;
5747
5805
 
5748
5806
  const LeafBounds = {
5749
5807
  __updateWorldBounds() {
5750
5808
  const layout = this.__layout;
5751
- toOuterOf$1(layout.renderBounds, this.__world, this.__world);
5809
+ toOuterOf$2(layout.renderBounds, this.__world, this.__world);
5752
5810
  if (layout.resized) {
5753
5811
  if (layout.resized === "inner") this.__onUpdateSize();
5754
5812
  if (this.__hasLocalEvent) BoundsEvent.emitLocal(this);
@@ -5804,13 +5862,13 @@ const LeafBounds = {
5804
5862
  __updateLocalBoxBounds() {
5805
5863
  if (this.__hasMotionPath) this.__updateMotionPath();
5806
5864
  if (this.__hasAutoLayout) this.__updateAutoLayout();
5807
- toOuterOf$1(this.__layout.boxBounds, this.__local, this.__local);
5865
+ toOuterOf$2(this.__layout.boxBounds, this.__local, this.__local);
5808
5866
  },
5809
5867
  __updateLocalStrokeBounds() {
5810
- toOuterOf$1(this.__layout.strokeBounds, this.__localMatrix, this.__layout.localStrokeBounds);
5868
+ toOuterOf$2(this.__layout.strokeBounds, this.__localMatrix, this.__layout.localStrokeBounds);
5811
5869
  },
5812
5870
  __updateLocalRenderBounds() {
5813
- toOuterOf$1(this.__layout.renderBounds, this.__localMatrix, this.__layout.localRenderBounds);
5871
+ toOuterOf$2(this.__layout.renderBounds, this.__localMatrix, this.__layout.localRenderBounds);
5814
5872
  },
5815
5873
  __updateBoxBounds(_secondLayout, _bounds) {
5816
5874
  const b = this.__layout.boxBounds;
@@ -5848,11 +5906,11 @@ const LeafBounds = {
5848
5906
  },
5849
5907
  __updateStrokeBounds(_bounds) {
5850
5908
  const layout = this.__layout;
5851
- copyAndSpread$1(layout.strokeBounds, layout.boxBounds, layout.strokeBoxSpread);
5909
+ copyAndSpread$2(layout.strokeBounds, layout.boxBounds, layout.strokeBoxSpread);
5852
5910
  },
5853
5911
  __updateRenderBounds(_bounds) {
5854
- const layout = this.__layout;
5855
- layout.renderSpread > 0 ? copyAndSpread$1(layout.renderBounds, layout.boxBounds, layout.renderSpread) : copy$4(layout.renderBounds, layout.strokeBounds);
5912
+ const layout = this.__layout, {renderSpread: renderSpread} = layout;
5913
+ isNumber(renderSpread) && renderSpread <= 0 ? copy$4(layout.renderBounds, layout.strokeBounds) : copyAndSpread$2(layout.renderBounds, layout.boxBounds, renderSpread);
5856
5914
  }
5857
5915
  };
5858
5916
 
@@ -5861,6 +5919,7 @@ const LeafRender = {
5861
5919
  if (options.shape) return this.__renderShape(canvas, options);
5862
5920
  if (this.__worldOpacity) {
5863
5921
  const data = this.__;
5922
+ if (data.bright && !options.topRendering) return options.topList.add(this);
5864
5923
  canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
5865
5924
  canvas.opacity = options.dimOpacity && !data.dimskip ? data.opacity * options.dimOpacity : data.opacity;
5866
5925
  if (this.__.__single) {
@@ -5909,7 +5968,9 @@ const BranchRender = {
5909
5968
  this.__nowWorld = this.__getNowWorld(options);
5910
5969
  if (this.__worldOpacity) {
5911
5970
  const data = this.__;
5912
- if (data.dim) options.dimOpacity = data.dim === true ? .2 : data.dim; else if (data.dimskip) options.dimOpacity && (options.dimOpacity = 0);
5971
+ if (data.__useDim) {
5972
+ if (data.dim) options.dimOpacity = data.dim === true ? .2 : data.dim; else if (data.bright && !options.topRendering) return options.topList.add(this); else if (data.dimskip) options.dimOpacity && (options.dimOpacity = 0);
5973
+ }
5913
5974
  if (data.__single && !this.isBranchLeaf) {
5914
5975
  if (data.eraser === "path") return this.__renderEraser(canvas, options);
5915
5976
  const tempCanvas = canvas.getSameCanvas(false, true);
@@ -5947,11 +6008,13 @@ const tempScaleData$1 = {};
5947
6008
 
5948
6009
  const {LEAF: LEAF, create: create} = IncrementId;
5949
6010
 
6011
+ const {stintSet: stintSet$3} = DataHelper;
6012
+
5950
6013
  const {toInnerPoint: toInnerPoint, toOuterPoint: toOuterPoint, multiplyParent: multiplyParent$1} = MatrixHelper;
5951
6014
 
5952
- const {toOuterOf: toOuterOf} = BoundsHelper;
6015
+ const {toOuterOf: toOuterOf$1} = BoundsHelper;
5953
6016
 
5954
- const {copy: copy$3, move: move} = PointHelper;
6017
+ const {copy: copy$3, move: move$2} = PointHelper;
5955
6018
 
5956
6019
  const {moveLocal: moveLocal, zoomOfLocal: zoomOfLocal, rotateOfLocal: rotateOfLocal, skewOfLocal: skewOfLocal, moveWorld: moveWorld, zoomOfWorld: zoomOfWorld, rotateOfWorld: rotateOfWorld, skewOfWorld: skewOfWorld, transform: transform, transformWorld: transformWorld, setTransform: setTransform, getFlipTransform: getFlipTransform, getLocalOrigin: getLocalOrigin, getRelativeWorld: getRelativeWorld, drop: drop} = LeafHelper;
5957
6020
 
@@ -6227,8 +6290,9 @@ let Leaf = class Leaf {
6227
6290
  if (!this.__cameraWorld) this.__cameraWorld = {};
6228
6291
  const cameraWorld = this.__cameraWorld, world = this.__world;
6229
6292
  multiplyParent$1(world, options.matrix, cameraWorld, undefined, world);
6230
- toOuterOf(this.__layout.renderBounds, cameraWorld, cameraWorld);
6231
- cameraWorld.half !== world.half && (cameraWorld.half = world.half);
6293
+ toOuterOf$1(this.__layout.renderBounds, cameraWorld, cameraWorld);
6294
+ stintSet$3(cameraWorld, "half", world.half);
6295
+ stintSet$3(cameraWorld, "ignorePixelSnap", world.ignorePixelSnap);
6232
6296
  return cameraWorld;
6233
6297
  } else {
6234
6298
  return this.__world;
@@ -6262,7 +6326,7 @@ let Leaf = class Leaf {
6262
6326
  getWorldBounds(inner, relative, change) {
6263
6327
  const matrix = relative ? getRelativeWorld(this, relative) : this.worldTransform;
6264
6328
  const to = change ? inner : {};
6265
- toOuterOf(inner, matrix, to);
6329
+ toOuterOf$1(inner, matrix, to);
6266
6330
  return to;
6267
6331
  }
6268
6332
  worldToLocal(world, to, distance, relative) {
@@ -6295,7 +6359,7 @@ let Leaf = class Leaf {
6295
6359
  }
6296
6360
  getBoxPointByInner(inner, _relative, _distance, change) {
6297
6361
  const point = change ? inner : Object.assign({}, inner), {x: x, y: y} = this.boxBounds;
6298
- move(point, -x, -y);
6362
+ move$2(point, -x, -y);
6299
6363
  return point;
6300
6364
  }
6301
6365
  getInnerPoint(world, relative, distance, change) {
@@ -6305,7 +6369,7 @@ let Leaf = class Leaf {
6305
6369
  }
6306
6370
  getInnerPointByBox(box, _relative, _distance, change) {
6307
6371
  const point = change ? box : Object.assign({}, box), {x: x, y: y} = this.boxBounds;
6308
- move(point, x, y);
6372
+ move$2(point, x, y);
6309
6373
  return point;
6310
6374
  }
6311
6375
  getInnerPointByLocal(local, _relative, distance, change) {
@@ -6751,7 +6815,7 @@ class LeafLevelList {
6751
6815
  }
6752
6816
  }
6753
6817
 
6754
- const version = "1.9.6";
6818
+ const version = "1.9.8";
6755
6819
 
6756
6820
  class LeaferCanvas extends LeaferCanvasBase {
6757
6821
  get allowBackgroundColor() {
@@ -7176,6 +7240,7 @@ class Renderer {
7176
7240
  usePartRender: true,
7177
7241
  maxFPS: 120
7178
7242
  };
7243
+ this.frames = [];
7179
7244
  this.target = target;
7180
7245
  this.canvas = canvas;
7181
7246
  if (userConfig) this.config = DataHelper.default(userConfig, this.config);
@@ -7305,7 +7370,7 @@ class Renderer {
7305
7370
  };
7306
7371
  if (this.needFill) canvas.fillWorld(bounds, this.config.fill);
7307
7372
  if (Debug.showRepaint) Debug.drawRepaint(canvas, bounds);
7308
- this.target.__render(canvas, options);
7373
+ Platform.render(this.target, canvas, options);
7309
7374
  this.renderBounds = realBounds = realBounds || bounds;
7310
7375
  this.renderOptions = options;
7311
7376
  this.totalBounds.isEmpty() ? this.totalBounds = realBounds : this.totalBounds.add(realBounds);
@@ -7328,12 +7393,15 @@ class Renderer {
7328
7393
  const target = this.target;
7329
7394
  if (this.requestTime || !target) return;
7330
7395
  if (target.parentApp) return target.parentApp.requestRender(false);
7331
- const requestTime = this.requestTime = Date.now();
7396
+ this.requestTime = this.frameTime || Date.now();
7332
7397
  const render = () => {
7333
- const nowFPS = 1e3 / (Date.now() - requestTime);
7398
+ const nowFPS = 1e3 / ((this.frameTime = Date.now()) - this.requestTime);
7334
7399
  const {maxFPS: maxFPS} = this.config;
7335
- if (maxFPS && nowFPS > maxFPS - .5) return Platform.requestRender(render);
7336
- this.FPS = Math.min(120, Math.ceil(nowFPS));
7400
+ if (maxFPS && nowFPS > maxFPS) return Platform.requestRender(render);
7401
+ const {frames: frames} = this;
7402
+ if (frames.length > 30) frames.shift();
7403
+ frames.push(nowFPS);
7404
+ this.FPS = Math.round(frames.reduce((a, b) => a + b, 0) / frames.length);
7337
7405
  this.requestTime = 0;
7338
7406
  this.checkRender();
7339
7407
  };
@@ -7581,6 +7649,15 @@ Object.assign(Creator, {
7581
7649
 
7582
7650
  Platform.layout = Layouter.fullLayout;
7583
7651
 
7652
+ Platform.render = function(target, canvas, options) {
7653
+ const topOptions = Object.assign(Object.assign({}, options), {
7654
+ topRendering: true
7655
+ });
7656
+ options.topList = new LeafList;
7657
+ target.__render(canvas, options);
7658
+ if (options.topList.length) options.topList.forEach(item => item.__render(canvas, topOptions));
7659
+ };
7660
+
7584
7661
  function effectType(defaultValue) {
7585
7662
  return decorateLeafAttr(defaultValue, key => attr({
7586
7663
  set(value) {
@@ -7980,39 +8057,41 @@ class CanvasData extends RectData {
7980
8057
  }
7981
8058
  }
7982
8059
 
8060
+ const {max: max$2, add: add$1} = FourNumberHelper;
8061
+
7983
8062
  const UIBounds = {
7984
8063
  __updateStrokeSpread() {
7985
- let width = 0, boxWidth = 0;
8064
+ let spread = 0, boxSpread = 0;
7986
8065
  const data = this.__, {strokeAlign: strokeAlign, __maxStrokeWidth: strokeWidth} = data, box = this.__box;
7987
8066
  if ((data.stroke || data.hitStroke === "all") && strokeWidth && strokeAlign !== "inside") {
7988
- boxWidth = width = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
8067
+ boxSpread = spread = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
7989
8068
  if (!data.__boxStroke) {
7990
- const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * width;
8069
+ const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * spread;
7991
8070
  const storkeCapAddWidth = data.strokeCap === "none" ? 0 : strokeWidth;
7992
- width += Math.max(miterLimitAddWidth, storkeCapAddWidth);
8071
+ spread += Math.max(miterLimitAddWidth, storkeCapAddWidth);
7993
8072
  }
7994
8073
  }
7995
- if (data.__useArrow) width += strokeWidth * 5;
8074
+ if (data.__useArrow) spread += strokeWidth * 5;
7996
8075
  if (box) {
7997
- width = Math.max(box.__layout.strokeSpread = box.__updateStrokeSpread(), width);
7998
- boxWidth = box.__layout.strokeBoxSpread;
8076
+ spread = max$2(spread, box.__layout.strokeSpread = box.__updateStrokeSpread());
8077
+ boxSpread = Math.max(boxSpread, box.__layout.strokeBoxSpread);
7999
8078
  }
8000
- this.__layout.strokeBoxSpread = boxWidth;
8001
- return width;
8079
+ this.__layout.strokeBoxSpread = boxSpread;
8080
+ return spread;
8002
8081
  },
8003
8082
  __updateRenderSpread() {
8004
- let width = 0;
8005
- const {shadow: shadow, innerShadow: innerShadow, blur: blur, backgroundBlur: backgroundBlur, filter: filter, renderSpread: renderSpread} = this.__;
8006
- if (shadow) width = Effect.getShadowSpread(this, shadow);
8007
- if (blur) width = Math.max(width, blur);
8008
- if (filter) width += Filter.getSpread(filter);
8009
- if (renderSpread) width += renderSpread;
8010
- let shapeWidth = width = Math.ceil(width);
8011
- if (innerShadow) innerShadow.forEach(item => shapeWidth = Math.max(shapeWidth, Math.max(Math.abs(item.y), Math.abs(item.x)) + (item.spread < 0 ? -item.spread : 0) + item.blur * 1.5));
8012
- if (backgroundBlur) shapeWidth = Math.max(shapeWidth, backgroundBlur);
8013
- this.__layout.renderShapeSpread = shapeWidth;
8014
- width += this.__layout.strokeSpread || 0;
8015
- return this.__box ? Math.max(this.__box.__updateRenderSpread(), width) : width;
8083
+ let spread = 0;
8084
+ const {shadow: shadow, innerShadow: innerShadow, blur: blur, backgroundBlur: backgroundBlur, filter: filter, renderSpread: renderSpread} = this.__, {strokeSpread: strokeSpread} = this.__layout, box = this.__box;
8085
+ if (shadow) spread = Effect.getShadowRenderSpread(this, shadow);
8086
+ if (blur) spread = max$2(spread, blur);
8087
+ if (filter) spread = add$1(spread, Filter.getSpread(filter));
8088
+ if (renderSpread) spread = add$1(spread, renderSpread);
8089
+ if (strokeSpread) spread = add$1(spread, strokeSpread);
8090
+ let shapeSpread = spread;
8091
+ if (innerShadow) shapeSpread = max$2(shapeSpread, Effect.getInnerShadowSpread(this, innerShadow));
8092
+ if (backgroundBlur) shapeSpread = max$2(shapeSpread, backgroundBlur);
8093
+ this.__layout.renderShapeSpread = shapeSpread;
8094
+ return box ? max$2(box.__updateRenderSpread(), spread) : spread;
8016
8095
  }
8017
8096
  };
8018
8097
 
@@ -8356,9 +8435,9 @@ __decorate([ visibleType(true) ], UI.prototype, "visible", void 0);
8356
8435
 
8357
8436
  __decorate([ surfaceType(false) ], UI.prototype, "locked", void 0);
8358
8437
 
8359
- __decorate([ surfaceType(false) ], UI.prototype, "dim", void 0);
8438
+ __decorate([ dimType(false) ], UI.prototype, "dim", void 0);
8360
8439
 
8361
- __decorate([ surfaceType(false) ], UI.prototype, "dimskip", void 0);
8440
+ __decorate([ dimType(false) ], UI.prototype, "dimskip", void 0);
8362
8441
 
8363
8442
  __decorate([ sortType(0) ], UI.prototype, "zIndex", void 0);
8364
8443
 
@@ -9323,7 +9402,7 @@ __decorate([ resizeType() ], Canvas.prototype, "contextSettings", void 0);
9323
9402
 
9324
9403
  Canvas = __decorate([ registerUI() ], Canvas);
9325
9404
 
9326
- const {copyAndSpread: copyAndSpread, includes: includes, spread: spread, setList: setList} = BoundsHelper;
9405
+ const {copyAndSpread: copyAndSpread$1, includes: includes, spread: spread, setList: setList} = BoundsHelper;
9327
9406
 
9328
9407
  let Text = class Text extends UI {
9329
9408
  get __tag() {
@@ -9370,13 +9449,13 @@ let Text = class Text extends UI {
9370
9449
  if (this.isOverflow) setList(data.__textBoxBounds = {}, [ b, contentBounds ]), layout.renderChanged = true; else data.__textBoxBounds = b;
9371
9450
  }
9372
9451
  __updateRenderSpread() {
9373
- let width = super.__updateRenderSpread();
9374
- if (!width) width = this.isOverflow ? 1 : 0;
9375
- return width;
9452
+ let spread = super.__updateRenderSpread();
9453
+ if (!spread) spread = this.isOverflow ? 1 : 0;
9454
+ return spread;
9376
9455
  }
9377
9456
  __updateRenderBounds() {
9378
9457
  const {renderBounds: renderBounds, renderSpread: renderSpread} = this.__layout;
9379
- copyAndSpread(renderBounds, this.__.__textBoxBounds, renderSpread);
9458
+ copyAndSpread$1(renderBounds, this.__.__textBoxBounds, renderSpread);
9380
9459
  if (this.__box) this.__box.__layout.renderBounds = renderBounds;
9381
9460
  }
9382
9461
  __updateChange() {
@@ -9802,9 +9881,9 @@ let DragEvent = class DragEvent extends PointerEvent {
9802
9881
  static setData(data) {
9803
9882
  this.data = data;
9804
9883
  }
9805
- static getValidMove(leaf, start, total, checkLimit = true) {
9806
- const move = leaf.getLocalPoint(total, null, true);
9807
- PointHelper.move(move, start.x - leaf.x, start.y - leaf.y);
9884
+ static getValidMove(leaf, localStart, worldTotal, checkLimit = true) {
9885
+ const move = leaf.getLocalPoint(worldTotal, null, true);
9886
+ PointHelper.move(move, localStart.x - leaf.x, localStart.y - leaf.y);
9808
9887
  if (checkLimit) this.limitMove(leaf, move);
9809
9888
  DragBoundsHelper.axisMove(leaf, move);
9810
9889
  return move;
@@ -10834,8 +10913,8 @@ ui$1.__updateHitCanvas = function() {
10834
10913
  if (isHitPixel) {
10835
10914
  const {renderBounds: renderBounds} = this.__layout;
10836
10915
  const size = Platform.image.hitCanvasSize;
10837
- const scale = h.hitScale = tempBounds$1.set(0, 0, size, size).getFitMatrix(renderBounds).a;
10838
- const {x: x, y: y, width: width, height: height} = tempBounds$1.set(renderBounds).scale(scale);
10916
+ const scale = h.hitScale = tempBounds$2.set(0, 0, size, size).getFitMatrix(renderBounds).a;
10917
+ const {x: x, y: y, width: width, height: height} = tempBounds$2.set(renderBounds).scale(scale);
10839
10918
  h.resize({
10840
10919
  width: width,
10841
10920
  height: height,
@@ -10932,8 +11011,8 @@ canvas.hitStroke = function(point, strokeWidth) {
10932
11011
  canvas.hitPixel = function(radiusPoint, offset, scale = 1) {
10933
11012
  let {x: x, y: y, radiusX: radiusX, radiusY: radiusY} = radiusPoint;
10934
11013
  if (offset) x -= offset.x, y -= offset.y;
10935
- tempBounds$1.set(x - radiusX, y - radiusY, radiusX * 2, radiusY * 2).scale(scale).ceil();
10936
- const {data: data} = this.context.getImageData(tempBounds$1.x, tempBounds$1.y, tempBounds$1.width || 1, tempBounds$1.height || 1);
11014
+ tempBounds$2.set(x - radiusX, y - radiusY, radiusX * 2, radiusY * 2).scale(scale).ceil();
11015
+ const {data: data} = this.context.getImageData(tempBounds$2.x, tempBounds$2.y, tempBounds$2.width || 1, tempBounds$2.height || 1);
10937
11016
  for (let i = 0, len = data.length; i < len; i += 4) {
10938
11017
  if (data[i + 3] > 0) return true;
10939
11018
  }
@@ -11133,24 +11212,29 @@ function drawOutside(stroke, ui, canvas) {
11133
11212
  }
11134
11213
  }
11135
11214
 
11136
- const {getSpread: getSpread, getOuterOf: getOuterOf, getByMove: getByMove, getIntersectData: getIntersectData} = BoundsHelper;
11215
+ const {getSpread: getSpread, copyAndSpread: copyAndSpread, toOuterOf: toOuterOf, getOuterOf: getOuterOf, getByMove: getByMove, move: move$1, getIntersectData: getIntersectData} = BoundsHelper;
11216
+
11217
+ const tempBounds$1 = {};
11137
11218
 
11138
11219
  function shape(ui, current, options) {
11139
11220
  const canvas = current.getSameCanvas();
11140
- const nowWorld = ui.__nowWorld, currentBounds = current.bounds;
11141
- let bounds, matrix, fitMatrix, shapeBounds, worldCanvas;
11221
+ const currentBounds = current.bounds, nowWorld = ui.__nowWorld, layout = ui.__layout;
11222
+ const nowWorldShapeBounds = ui.__nowWorldShapeBounds || (ui.__nowWorldShapeBounds = {});
11223
+ toOuterOf(layout.strokeSpread ? (copyAndSpread(tempBounds$1, layout.boxBounds, layout.strokeSpread),
11224
+ tempBounds$1) : layout.boxBounds, nowWorld, nowWorldShapeBounds);
11225
+ let bounds, renderBounds, matrix, fitMatrix, shapeBounds, worldCanvas;
11142
11226
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true);
11143
- if (currentBounds.includes(nowWorld)) {
11227
+ if (currentBounds.includes(nowWorldShapeBounds)) {
11144
11228
  worldCanvas = canvas;
11145
- bounds = shapeBounds = nowWorld;
11229
+ bounds = shapeBounds = nowWorldShapeBounds;
11230
+ renderBounds = nowWorld;
11146
11231
  } else {
11147
- const {renderShapeSpread: spread} = ui.__layout;
11148
11232
  let worldClipBounds;
11149
11233
  if (Platform.fullImageShadow) {
11150
- worldClipBounds = nowWorld;
11234
+ worldClipBounds = nowWorldShapeBounds;
11151
11235
  } else {
11152
- const spreadBounds = spread ? getSpread(currentBounds, scaleX === scaleY ? spread * scaleX : [ spread * scaleY, spread * scaleX ]) : currentBounds;
11153
- worldClipBounds = getIntersectData(spreadBounds, nowWorld);
11236
+ const spreadBounds = layout.renderShapeSpread ? getSpread(currentBounds, FourNumberHelper.swapAndScale(layout.renderShapeSpread, scaleX, scaleY)) : currentBounds;
11237
+ worldClipBounds = getIntersectData(spreadBounds, nowWorldShapeBounds);
11154
11238
  }
11155
11239
  fitMatrix = currentBounds.getFitMatrix(worldClipBounds);
11156
11240
  let {a: fitScaleX, d: fitScaleY} = fitMatrix;
@@ -11160,8 +11244,10 @@ function shape(ui, current, options) {
11160
11244
  scaleX *= fitScaleX;
11161
11245
  scaleY *= fitScaleY;
11162
11246
  }
11163
- shapeBounds = getOuterOf(nowWorld, fitMatrix);
11247
+ shapeBounds = getOuterOf(nowWorldShapeBounds, fitMatrix);
11164
11248
  bounds = getByMove(shapeBounds, -fitMatrix.e, -fitMatrix.f);
11249
+ renderBounds = getOuterOf(nowWorld, fitMatrix);
11250
+ move$1(renderBounds, -fitMatrix.e, -fitMatrix.f);
11165
11251
  const userMatrix = options.matrix;
11166
11252
  if (userMatrix) {
11167
11253
  matrix = new Matrix(fitMatrix);
@@ -11180,6 +11266,7 @@ function shape(ui, current, options) {
11180
11266
  matrix: matrix,
11181
11267
  fitMatrix: fitMatrix,
11182
11268
  bounds: bounds,
11269
+ renderBounds: renderBounds,
11183
11270
  worldCanvas: worldCanvas,
11184
11271
  shapeBounds: shapeBounds,
11185
11272
  scaleX: scaleX,
@@ -11283,7 +11370,7 @@ const PaintModule = {
11283
11370
  shape: shape
11284
11371
  };
11285
11372
 
11286
- let origin = {}, tempMatrix = getMatrixData();
11373
+ let origin = {}, tempMatrix$1 = getMatrixData();
11287
11374
 
11288
11375
  const {get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, multiplyParent: multiplyParent, scale: scaleHelper, rotate: rotate, skew: skewHelper} = MatrixHelper;
11289
11376
 
@@ -11298,12 +11385,12 @@ function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
11298
11385
  data.transform = transform;
11299
11386
  }
11300
11387
 
11301
- function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipSize) {
11388
+ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipScaleX, clipScaleY) {
11302
11389
  const transform = get$3();
11303
11390
  layout(transform, box, x, y, scaleX, scaleY, rotation, skew);
11304
- if (clipSize) {
11305
- tempMatrix.a = box.width / clipSize.width, tempMatrix.d = box.height / clipSize.height;
11306
- multiplyParent(transform, tempMatrix);
11391
+ if (clipScaleX) {
11392
+ tempMatrix$1.a = clipScaleX, tempMatrix$1.d = clipScaleY;
11393
+ multiplyParent(transform, tempMatrix$1);
11307
11394
  }
11308
11395
  data.transform = transform;
11309
11396
  }
@@ -11404,7 +11491,12 @@ function getPatternData(paint, box, image) {
11404
11491
 
11405
11492
  case "normal":
11406
11493
  case "clip":
11407
- if (tempImage.x || tempImage.y || scaleX || clipSize || rotation || skew) clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, paint.clipSize);
11494
+ if (tempImage.x || tempImage.y || scaleX || clipSize || rotation || skew) {
11495
+ let clipScaleX, clipScaleY;
11496
+ if (clipSize) clipScaleX = box.width / clipSize.width, clipScaleY = box.height / clipSize.height;
11497
+ clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, clipScaleX, clipScaleY);
11498
+ if (clipScaleX) scaleX = scaleX ? scaleX * clipScaleX : scaleX, scaleY = scaleY ? scaleY * clipScaleY : clipScaleY;
11499
+ }
11408
11500
  break;
11409
11501
 
11410
11502
  case "repeat":
@@ -11562,7 +11654,7 @@ function ignoreRender(ui, value) {
11562
11654
 
11563
11655
  const {get: get$1, scale: scale, copy: copy$1} = MatrixHelper;
11564
11656
 
11565
- const {floor: floor, ceil: ceil, max: max, abs: abs} = Math;
11657
+ const {floor: floor, ceil: ceil, max: max$1, abs: abs} = Math;
11566
11658
 
11567
11659
  function createPattern(ui, paint, pixelRatio) {
11568
11660
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true, paint.scaleFixed);
@@ -11611,8 +11703,8 @@ function createPattern(ui, paint, pixelRatio) {
11611
11703
  if (transform || scaleX !== 1 || scaleY !== 1) {
11612
11704
  const canvasWidth = width + (xGap || 0);
11613
11705
  const canvasHeight = height + (yGap || 0);
11614
- scaleX /= canvasWidth / max(floor(canvasWidth), 1);
11615
- scaleY /= canvasHeight / max(floor(canvasHeight), 1);
11706
+ scaleX /= canvasWidth / max$1(floor(canvasWidth), 1);
11707
+ scaleY /= canvasHeight / max$1(floor(canvasHeight), 1);
11616
11708
  if (!imageMatrix) {
11617
11709
  imageMatrix = get$1();
11618
11710
  if (transform) copy$1(imageMatrix, transform);
@@ -11638,17 +11730,15 @@ function checkImage(ui, canvas, paint, allowDraw) {
11638
11730
  if (allowDraw) {
11639
11731
  if (data.repeat) {
11640
11732
  allowDraw = false;
11641
- } else {
11642
- if (!(paint.changeful || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || Export.running)) {
11643
- let {width: width, height: height} = data;
11644
- width *= scaleX * pixelRatio;
11645
- height *= scaleY * pixelRatio;
11646
- if (data.scaleX) {
11647
- width *= data.scaleX;
11648
- height *= data.scaleY;
11649
- }
11650
- allowDraw = width * height > Platform.image.maxCacheSize;
11733
+ } else if (!(paint.changeful || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || Export.running)) {
11734
+ let {width: width, height: height} = data;
11735
+ width *= scaleX * pixelRatio;
11736
+ height *= scaleY * pixelRatio;
11737
+ if (data.scaleX) {
11738
+ width *= data.scaleX;
11739
+ height *= data.scaleY;
11651
11740
  }
11741
+ allowDraw = width * height > Platform.image.maxCacheSize;
11652
11742
  }
11653
11743
  }
11654
11744
  if (allowDraw) {
@@ -11828,20 +11918,20 @@ const PaintGradientModule = {
11828
11918
  getTransform: getTransform
11829
11919
  };
11830
11920
 
11831
- const {copy: copy, toOffsetOutBounds: toOffsetOutBounds$1} = BoundsHelper;
11921
+ const {copy: copy, move: move, toOffsetOutBounds: toOffsetOutBounds$1} = BoundsHelper, {max: max} = Math;
11832
11922
 
11833
- const tempBounds = {};
11923
+ const tempBounds = {}, tempMatrix = new Matrix;
11834
11924
 
11835
11925
  const offsetOutBounds$1 = {};
11836
11926
 
11837
11927
  function shadow(ui, current, shape) {
11838
- let copyBounds, spreadScale;
11839
- const {__nowWorld: nowWorld, __layout: __layout} = ui;
11928
+ let copyBounds, transform;
11929
+ const {__nowWorld: nowWorld} = ui;
11840
11930
  const {shadow: shadow} = ui.__;
11841
- const {worldCanvas: worldCanvas, bounds: bounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
11931
+ const {worldCanvas: worldCanvas, bounds: bounds, renderBounds: renderBounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
11842
11932
  const other = current.getSameCanvas();
11843
11933
  const end = shadow.length - 1;
11844
- toOffsetOutBounds$1(bounds, offsetOutBounds$1);
11934
+ toOffsetOutBounds$1(bounds, offsetOutBounds$1, renderBounds);
11845
11935
  shadow.forEach((item, index) => {
11846
11936
  let otherScale = 1;
11847
11937
  if (item.scaleFixed) {
@@ -11849,54 +11939,61 @@ function shadow(ui, current, shape) {
11849
11939
  if (sx > 1) otherScale = 1 / sx;
11850
11940
  }
11851
11941
  other.setWorldShadow(offsetOutBounds$1.offsetX + item.x * scaleX * otherScale, offsetOutBounds$1.offsetY + item.y * scaleY * otherScale, item.blur * scaleX * otherScale, ColorConvert.string(item.color));
11852
- spreadScale = item.spread ? 1 + item.spread * 2 / (__layout.boxBounds.width + (__layout.strokeBoxSpread || 0) * 2) * otherScale : 0;
11853
- drawWorldShadow(other, offsetOutBounds$1, spreadScale, shape);
11854
- copyBounds = bounds;
11942
+ transform = getShadowTransform(ui, other, shape, item, offsetOutBounds$1, otherScale);
11943
+ if (transform) other.setTransform(transform);
11944
+ drawWorldShadow(other, offsetOutBounds$1, shape);
11945
+ if (transform) other.resetTransform();
11946
+ copyBounds = renderBounds;
11855
11947
  if (item.box) {
11856
11948
  other.restore();
11857
11949
  other.save();
11858
11950
  if (worldCanvas) {
11859
- other.copyWorld(other, bounds, nowWorld, "copy");
11951
+ other.copyWorld(other, renderBounds, nowWorld, "copy");
11860
11952
  copyBounds = nowWorld;
11861
11953
  }
11862
11954
  worldCanvas ? other.copyWorld(worldCanvas, nowWorld, nowWorld, "destination-out") : other.copyWorld(shape.canvas, shapeBounds, bounds, "destination-out");
11863
11955
  }
11864
- if (Effect.isTransformShadow(item)) Effect.renderTransformShadow(ui, current, other, copyBounds, item); else LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
11956
+ LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
11865
11957
  if (end && index < end) other.clearWorld(copyBounds);
11866
11958
  });
11867
11959
  other.recycle(copyBounds);
11868
11960
  }
11869
11961
 
11870
- function getShadowSpread(_ui, shadow) {
11871
- let width = 0;
11872
- shadow.forEach(item => width = Math.max(width, Math.max(Math.abs(item.y), Math.abs(item.x)) + (item.spread > 0 ? item.spread : 0) + item.blur * 1.5));
11873
- return width;
11962
+ function getShadowRenderSpread(_ui, shadow) {
11963
+ let top = 0, right = 0, bottom = 0, left = 0, x, y, spread, blur;
11964
+ shadow.forEach(item => {
11965
+ x = item.x || 0, y = item.y || 0, spread = item.spread || 0, blur = (item.blur || 0) * 1.5;
11966
+ top = max(top, spread + blur - y);
11967
+ right = max(right, spread + blur + x);
11968
+ bottom = max(bottom, spread + blur + y);
11969
+ left = max(left, spread + blur - x);
11970
+ });
11971
+ return top === right && right === bottom && bottom === left ? top : [ top, right, bottom, left ];
11972
+ }
11973
+
11974
+ function getShadowTransform(ui, canvas, _shape, shadow, outBounds, otherScale, isInnerShaodw) {
11975
+ if (shadow.spread) {
11976
+ const spreadScale = 1 + shadow.spread * 2 / ui.__layout.strokeBounds.width * otherScale * (isInnerShaodw ? -1 : 1);
11977
+ tempMatrix.set().scaleOfOuter({
11978
+ x: (outBounds.x + outBounds.width / 2) * canvas.pixelRatio,
11979
+ y: (outBounds.y + outBounds.height / 2) * canvas.pixelRatio
11980
+ }, spreadScale);
11981
+ return tempMatrix;
11982
+ }
11983
+ return undefined;
11874
11984
  }
11875
11985
 
11876
- function drawWorldShadow(canvas, outBounds, spreadScale, shape) {
11877
- const {bounds: bounds, shapeBounds: shapeBounds} = shape;
11986
+ function drawWorldShadow(canvas, outBounds, shape) {
11987
+ const {shapeBounds: shapeBounds} = shape;
11988
+ let from, to;
11878
11989
  if (Platform.fullImageShadow) {
11879
11990
  copy(tempBounds, canvas.bounds);
11880
- tempBounds.x += outBounds.x - shapeBounds.x;
11881
- tempBounds.y += outBounds.y - shapeBounds.y;
11882
- if (spreadScale) {
11883
- const {fitMatrix: fitMatrix} = shape;
11884
- tempBounds.x -= (bounds.x + (fitMatrix ? fitMatrix.e : 0) + bounds.width / 2) * (spreadScale - 1);
11885
- tempBounds.y -= (bounds.y + (fitMatrix ? fitMatrix.f : 0) + bounds.height / 2) * (spreadScale - 1);
11886
- tempBounds.width *= spreadScale;
11887
- tempBounds.height *= spreadScale;
11888
- }
11889
- canvas.copyWorld(shape.canvas, canvas.bounds, tempBounds);
11991
+ move(tempBounds, outBounds.x - shapeBounds.x, outBounds.y - shapeBounds.y);
11992
+ from = canvas.bounds, to = tempBounds;
11890
11993
  } else {
11891
- if (spreadScale) {
11892
- copy(tempBounds, outBounds);
11893
- tempBounds.x -= outBounds.width / 2 * (spreadScale - 1);
11894
- tempBounds.y -= outBounds.height / 2 * (spreadScale - 1);
11895
- tempBounds.width *= spreadScale;
11896
- tempBounds.height *= spreadScale;
11897
- }
11898
- canvas.copyWorld(shape.canvas, shapeBounds, spreadScale ? tempBounds : outBounds);
11994
+ from = shapeBounds, to = outBounds;
11899
11995
  }
11996
+ canvas.copyWorld(shape.canvas, from, to);
11900
11997
  }
11901
11998
 
11902
11999
  const {toOffsetOutBounds: toOffsetOutBounds} = BoundsHelper;
@@ -11904,13 +12001,13 @@ const {toOffsetOutBounds: toOffsetOutBounds} = BoundsHelper;
11904
12001
  const offsetOutBounds = {};
11905
12002
 
11906
12003
  function innerShadow(ui, current, shape) {
11907
- let copyBounds, spreadScale;
11908
- const {__nowWorld: nowWorld, __layout: __layout} = ui;
12004
+ let copyBounds, transform;
12005
+ const {__nowWorld: nowWorld} = ui;
11909
12006
  const {innerShadow: innerShadow} = ui.__;
11910
- const {worldCanvas: worldCanvas, bounds: bounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
12007
+ const {worldCanvas: worldCanvas, bounds: bounds, renderBounds: renderBounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
11911
12008
  const other = current.getSameCanvas();
11912
12009
  const end = innerShadow.length - 1;
11913
- toOffsetOutBounds(bounds, offsetOutBounds);
12010
+ toOffsetOutBounds(bounds, offsetOutBounds, renderBounds);
11914
12011
  innerShadow.forEach((item, index) => {
11915
12012
  let otherScale = 1;
11916
12013
  if (item.scaleFixed) {
@@ -11919,16 +12016,17 @@ function innerShadow(ui, current, shape) {
11919
12016
  }
11920
12017
  other.save();
11921
12018
  other.setWorldShadow(offsetOutBounds.offsetX + item.x * scaleX * otherScale, offsetOutBounds.offsetY + item.y * scaleY * otherScale, item.blur * scaleX * otherScale);
11922
- spreadScale = item.spread ? 1 - item.spread * 2 / (__layout.boxBounds.width + (__layout.strokeBoxSpread || 0) * 2) * otherScale : 0;
11923
- drawWorldShadow(other, offsetOutBounds, spreadScale, shape);
12019
+ transform = getShadowTransform(ui, other, shape, item, offsetOutBounds, otherScale, true);
12020
+ if (transform) other.setTransform(transform);
12021
+ drawWorldShadow(other, offsetOutBounds, shape);
11924
12022
  other.restore();
11925
12023
  if (worldCanvas) {
11926
- other.copyWorld(other, bounds, nowWorld, "copy");
12024
+ other.copyWorld(other, renderBounds, nowWorld, "copy");
11927
12025
  other.copyWorld(worldCanvas, nowWorld, nowWorld, "source-out");
11928
12026
  copyBounds = nowWorld;
11929
12027
  } else {
11930
12028
  other.copyWorld(shape.canvas, shapeBounds, bounds, "source-out");
11931
- copyBounds = bounds;
12029
+ copyBounds = renderBounds;
11932
12030
  }
11933
12031
  other.fillWorld(copyBounds, ColorConvert.string(item.color), "source-in");
11934
12032
  LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
@@ -11937,6 +12035,8 @@ function innerShadow(ui, current, shape) {
11937
12035
  other.recycle(copyBounds);
11938
12036
  }
11939
12037
 
12038
+ const getInnerShadowSpread = getShadowRenderSpread;
12039
+
11940
12040
  function blur(ui, current, origin) {
11941
12041
  const {blur: blur} = ui.__;
11942
12042
  origin.setWorldBlur(blur * ui.__nowWorld.a);
@@ -11951,10 +12051,12 @@ const EffectModule = {
11951
12051
  innerShadow: innerShadow,
11952
12052
  blur: blur,
11953
12053
  backgroundBlur: backgroundBlur,
11954
- getShadowSpread: getShadowSpread,
12054
+ getShadowRenderSpread: getShadowRenderSpread,
12055
+ getShadowTransform: getShadowTransform,
11955
12056
  isTransformShadow(_shadow) {
11956
12057
  return undefined;
11957
- }
12058
+ },
12059
+ getInnerShadowSpread: getInnerShadowSpread
11958
12060
  };
11959
12061
 
11960
12062
  const {excludeRenderBounds: excludeRenderBounds} = LeafBoundsHelper;
@@ -11971,6 +12073,7 @@ Group.prototype.__renderMask = function(canvas, options) {
11971
12073
  maskEnd(this, currentMask, canvas, contentCanvas, maskCanvas, maskOpacity, undefined, true);
11972
12074
  maskCanvas = contentCanvas = null;
11973
12075
  }
12076
+ if (mask === "clipping" || mask === "clipping-path") excludeRenderBounds(child, options) || child.__render(canvas, options);
11974
12077
  maskOpacity = child.__.opacity;
11975
12078
  usedGrayscaleAlpha = false;
11976
12079
  if (mask === "path" || mask === "clipping-path") {
@@ -11988,7 +12091,6 @@ Group.prototype.__renderMask = function(canvas, options) {
11988
12091
  if (!contentCanvas) contentCanvas = getCanvas(canvas);
11989
12092
  child.__render(maskCanvas, options);
11990
12093
  }
11991
- if (mask === "clipping" || mask === "clipping-path") excludeRenderBounds(child, options) || child.__render(canvas, options);
11992
12094
  continue;
11993
12095
  }
11994
12096
  const childBlendMode = maskOpacity === 1 && child.__.__blendMode;
@@ -12584,4 +12686,4 @@ Object.assign(Creator, {
12584
12686
 
12585
12687
  useCanvas();
12586
12688
 
12587
- export { AlignHelper, Answer, App, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragBoundsHelper, DragEvent, Dragger, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, Frame, FrameData, Group, GroupData, HitCanvasManager, Image, ImageData, ImageEvent, ImageManager, IncrementId, InteractionBase, InteractionHelper, KeyEvent, Keyboard, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, Line, LineData, MathHelper, Matrix, MatrixHelper, MoveEvent, MyDragEvent, MyImage, MyPointerEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Picker, Platform, Plugin, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, RotateEvent, Run, Selector, Star, StarData, State, StringNumberMap, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, ZoomEvent, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, createAttr, createDescriptor, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, doBoundsType, doStrokeType, effectType, emptyData, eraserType, extraPropertyEventMap, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isArray, isData, isEmptyData, isFinite, isNull, isNumber, isObject, isString, isUndefined, layoutProcessor, leaferTransformAttrMap, maskType, naturalBoundsType, opacityType, path, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, scrollType, sortType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix$1 as tempMatrix, tempPoint$2 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };
12689
+ export { AlignHelper, Answer, App, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragBoundsHelper, DragEvent, Dragger, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, FourNumberHelper, Frame, FrameData, Group, GroupData, HitCanvasManager, Image, ImageData, ImageEvent, ImageManager, IncrementId, InteractionBase, InteractionHelper, KeyEvent, Keyboard, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, Line, LineData, MathHelper, Matrix, MatrixHelper, MoveEvent, MyDragEvent, MyImage, MyPointerEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Picker, Platform, Plugin, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, RotateEvent, Run, Selector, Star, StarData, State, StringNumberMap, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, ZoomEvent, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, createAttr, createDescriptor, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, dimType, doBoundsType, doStrokeType, effectType, emptyData, eraserType, extraPropertyEventMap, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isArray, isData, isEmptyData, isFinite, isNull, isNumber, isObject, isString, isUndefined, layoutProcessor, leaferTransformAttrMap, maskType, naturalBoundsType, opacityType, path, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, scrollType, sortType, strokeType, surfaceType, tempBounds$2 as tempBounds, tempMatrix$2 as tempMatrix, tempPoint$2 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };