leafer-draw 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$8(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$8(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$8(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$8} = B;
1502
+ const {add: add$2, copy: copy$8} = 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$7, multiplyParent: multiplyParent$4} = MatrixHelper, {round: round$1} = Math, tempPixelBounds = new Bounds, tempPixelBounds2 = new Bounds;
2200
+ const {copy: copy$7, 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 = 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$4} = BoundsHelper;
4909
+ const {toOuterOf: toOuterOf$3, getPoints: getPoints, copy: copy$4} = 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$3} = BoundsHelper;
5802
+ const {toOuterOf: toOuterOf$2, copyAndSpread: copyAndSpread$2, copy: copy$3} = 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$3(layout.renderBounds, layout.strokeBounds);
5912
+ const layout = this.__layout, {renderSpread: renderSpread} = layout;
5913
+ isNumber(renderSpread) && renderSpread <= 0 ? copy$3(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$2, move: move} = PointHelper;
6017
+ const {copy: copy$2, 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
  const debug$4 = Debug.get("LeaferCanvas");
6757
6821
 
@@ -6786,7 +6850,7 @@ class LeaferCanvas extends LeaferCanvasBase {
6786
6850
  }
6787
6851
  if (Platform.syncDomFont && !this.parentView) {
6788
6852
  style.display = "none";
6789
- document.body.appendChild(this.view);
6853
+ if (document.body) document.body.appendChild(this.view);
6790
6854
  }
6791
6855
  this.__createContext();
6792
6856
  if (!this.autoLayout) this.resize(config);
@@ -7382,6 +7446,7 @@ class Renderer {
7382
7446
  usePartRender: true,
7383
7447
  maxFPS: 120
7384
7448
  };
7449
+ this.frames = [];
7385
7450
  this.target = target;
7386
7451
  this.canvas = canvas;
7387
7452
  if (userConfig) this.config = DataHelper.default(userConfig, this.config);
@@ -7511,7 +7576,7 @@ class Renderer {
7511
7576
  };
7512
7577
  if (this.needFill) canvas.fillWorld(bounds, this.config.fill);
7513
7578
  if (Debug.showRepaint) Debug.drawRepaint(canvas, bounds);
7514
- this.target.__render(canvas, options);
7579
+ Platform.render(this.target, canvas, options);
7515
7580
  this.renderBounds = realBounds = realBounds || bounds;
7516
7581
  this.renderOptions = options;
7517
7582
  this.totalBounds.isEmpty() ? this.totalBounds = realBounds : this.totalBounds.add(realBounds);
@@ -7534,12 +7599,15 @@ class Renderer {
7534
7599
  const target = this.target;
7535
7600
  if (this.requestTime || !target) return;
7536
7601
  if (target.parentApp) return target.parentApp.requestRender(false);
7537
- const requestTime = this.requestTime = Date.now();
7602
+ this.requestTime = this.frameTime || Date.now();
7538
7603
  const render = () => {
7539
- const nowFPS = 1e3 / (Date.now() - requestTime);
7604
+ const nowFPS = 1e3 / ((this.frameTime = Date.now()) - this.requestTime);
7540
7605
  const {maxFPS: maxFPS} = this.config;
7541
- if (maxFPS && nowFPS > maxFPS - .5) return Platform.requestRender(render);
7542
- this.FPS = Math.min(120, Math.ceil(nowFPS));
7606
+ if (maxFPS && nowFPS > maxFPS) return Platform.requestRender(render);
7607
+ const {frames: frames} = this;
7608
+ if (frames.length > 30) frames.shift();
7609
+ frames.push(nowFPS);
7610
+ this.FPS = Math.round(frames.reduce((a, b) => a + b, 0) / frames.length);
7543
7611
  this.requestTime = 0;
7544
7612
  this.checkRender();
7545
7613
  };
@@ -7604,6 +7672,15 @@ Object.assign(Creator, {
7604
7672
 
7605
7673
  Platform.layout = Layouter.fullLayout;
7606
7674
 
7675
+ Platform.render = function(target, canvas, options) {
7676
+ const topOptions = Object.assign(Object.assign({}, options), {
7677
+ topRendering: true
7678
+ });
7679
+ options.topList = new LeafList;
7680
+ target.__render(canvas, options);
7681
+ if (options.topList.length) options.topList.forEach(item => item.__render(canvas, topOptions));
7682
+ };
7683
+
7607
7684
  function effectType(defaultValue) {
7608
7685
  return decorateLeafAttr(defaultValue, key => attr({
7609
7686
  set(value) {
@@ -8003,39 +8080,41 @@ class CanvasData extends RectData {
8003
8080
  }
8004
8081
  }
8005
8082
 
8083
+ const {max: max$2, add: add$1} = FourNumberHelper;
8084
+
8006
8085
  const UIBounds = {
8007
8086
  __updateStrokeSpread() {
8008
- let width = 0, boxWidth = 0;
8087
+ let spread = 0, boxSpread = 0;
8009
8088
  const data = this.__, {strokeAlign: strokeAlign, __maxStrokeWidth: strokeWidth} = data, box = this.__box;
8010
8089
  if ((data.stroke || data.hitStroke === "all") && strokeWidth && strokeAlign !== "inside") {
8011
- boxWidth = width = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
8090
+ boxSpread = spread = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
8012
8091
  if (!data.__boxStroke) {
8013
- const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * width;
8092
+ const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * spread;
8014
8093
  const storkeCapAddWidth = data.strokeCap === "none" ? 0 : strokeWidth;
8015
- width += Math.max(miterLimitAddWidth, storkeCapAddWidth);
8094
+ spread += Math.max(miterLimitAddWidth, storkeCapAddWidth);
8016
8095
  }
8017
8096
  }
8018
- if (data.__useArrow) width += strokeWidth * 5;
8097
+ if (data.__useArrow) spread += strokeWidth * 5;
8019
8098
  if (box) {
8020
- width = Math.max(box.__layout.strokeSpread = box.__updateStrokeSpread(), width);
8021
- boxWidth = box.__layout.strokeBoxSpread;
8099
+ spread = max$2(spread, box.__layout.strokeSpread = box.__updateStrokeSpread());
8100
+ boxSpread = Math.max(boxSpread, box.__layout.strokeBoxSpread);
8022
8101
  }
8023
- this.__layout.strokeBoxSpread = boxWidth;
8024
- return width;
8102
+ this.__layout.strokeBoxSpread = boxSpread;
8103
+ return spread;
8025
8104
  },
8026
8105
  __updateRenderSpread() {
8027
- let width = 0;
8028
- const {shadow: shadow, innerShadow: innerShadow, blur: blur, backgroundBlur: backgroundBlur, filter: filter, renderSpread: renderSpread} = this.__;
8029
- if (shadow) width = Effect.getShadowSpread(this, shadow);
8030
- if (blur) width = Math.max(width, blur);
8031
- if (filter) width += Filter.getSpread(filter);
8032
- if (renderSpread) width += renderSpread;
8033
- let shapeWidth = width = Math.ceil(width);
8034
- 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));
8035
- if (backgroundBlur) shapeWidth = Math.max(shapeWidth, backgroundBlur);
8036
- this.__layout.renderShapeSpread = shapeWidth;
8037
- width += this.__layout.strokeSpread || 0;
8038
- return this.__box ? Math.max(this.__box.__updateRenderSpread(), width) : width;
8106
+ let spread = 0;
8107
+ const {shadow: shadow, innerShadow: innerShadow, blur: blur, backgroundBlur: backgroundBlur, filter: filter, renderSpread: renderSpread} = this.__, {strokeSpread: strokeSpread} = this.__layout, box = this.__box;
8108
+ if (shadow) spread = Effect.getShadowRenderSpread(this, shadow);
8109
+ if (blur) spread = max$2(spread, blur);
8110
+ if (filter) spread = add$1(spread, Filter.getSpread(filter));
8111
+ if (renderSpread) spread = add$1(spread, renderSpread);
8112
+ if (strokeSpread) spread = add$1(spread, strokeSpread);
8113
+ let shapeSpread = spread;
8114
+ if (innerShadow) shapeSpread = max$2(shapeSpread, Effect.getInnerShadowSpread(this, innerShadow));
8115
+ if (backgroundBlur) shapeSpread = max$2(shapeSpread, backgroundBlur);
8116
+ this.__layout.renderShapeSpread = shapeSpread;
8117
+ return box ? max$2(box.__updateRenderSpread(), spread) : spread;
8039
8118
  }
8040
8119
  };
8041
8120
 
@@ -8379,9 +8458,9 @@ __decorate([ visibleType(true) ], UI.prototype, "visible", void 0);
8379
8458
 
8380
8459
  __decorate([ surfaceType(false) ], UI.prototype, "locked", void 0);
8381
8460
 
8382
- __decorate([ surfaceType(false) ], UI.prototype, "dim", void 0);
8461
+ __decorate([ dimType(false) ], UI.prototype, "dim", void 0);
8383
8462
 
8384
- __decorate([ surfaceType(false) ], UI.prototype, "dimskip", void 0);
8463
+ __decorate([ dimType(false) ], UI.prototype, "dimskip", void 0);
8385
8464
 
8386
8465
  __decorate([ sortType(0) ], UI.prototype, "zIndex", void 0);
8387
8466
 
@@ -9346,7 +9425,7 @@ __decorate([ resizeType() ], Canvas.prototype, "contextSettings", void 0);
9346
9425
 
9347
9426
  Canvas = __decorate([ registerUI() ], Canvas);
9348
9427
 
9349
- const {copyAndSpread: copyAndSpread, includes: includes, spread: spread, setList: setList} = BoundsHelper;
9428
+ const {copyAndSpread: copyAndSpread$1, includes: includes, spread: spread, setList: setList} = BoundsHelper;
9350
9429
 
9351
9430
  let Text = class Text extends UI {
9352
9431
  get __tag() {
@@ -9393,13 +9472,13 @@ let Text = class Text extends UI {
9393
9472
  if (this.isOverflow) setList(data.__textBoxBounds = {}, [ b, contentBounds ]), layout.renderChanged = true; else data.__textBoxBounds = b;
9394
9473
  }
9395
9474
  __updateRenderSpread() {
9396
- let width = super.__updateRenderSpread();
9397
- if (!width) width = this.isOverflow ? 1 : 0;
9398
- return width;
9475
+ let spread = super.__updateRenderSpread();
9476
+ if (!spread) spread = this.isOverflow ? 1 : 0;
9477
+ return spread;
9399
9478
  }
9400
9479
  __updateRenderBounds() {
9401
9480
  const {renderBounds: renderBounds, renderSpread: renderSpread} = this.__layout;
9402
- copyAndSpread(renderBounds, this.__.__textBoxBounds, renderSpread);
9481
+ copyAndSpread$1(renderBounds, this.__.__textBoxBounds, renderSpread);
9403
9482
  if (this.__box) this.__box.__layout.renderBounds = renderBounds;
9404
9483
  }
9405
9484
  __updateChange() {
@@ -9767,24 +9846,29 @@ function drawOutside(stroke, ui, canvas) {
9767
9846
  }
9768
9847
  }
9769
9848
 
9770
- const {getSpread: getSpread, getOuterOf: getOuterOf, getByMove: getByMove, getIntersectData: getIntersectData} = BoundsHelper;
9849
+ const {getSpread: getSpread, copyAndSpread: copyAndSpread, toOuterOf: toOuterOf, getOuterOf: getOuterOf, getByMove: getByMove, move: move$1, getIntersectData: getIntersectData} = BoundsHelper;
9850
+
9851
+ const tempBounds$1 = {};
9771
9852
 
9772
9853
  function shape(ui, current, options) {
9773
9854
  const canvas = current.getSameCanvas();
9774
- const nowWorld = ui.__nowWorld, currentBounds = current.bounds;
9775
- let bounds, matrix, fitMatrix, shapeBounds, worldCanvas;
9855
+ const currentBounds = current.bounds, nowWorld = ui.__nowWorld, layout = ui.__layout;
9856
+ const nowWorldShapeBounds = ui.__nowWorldShapeBounds || (ui.__nowWorldShapeBounds = {});
9857
+ toOuterOf(layout.strokeSpread ? (copyAndSpread(tempBounds$1, layout.boxBounds, layout.strokeSpread),
9858
+ tempBounds$1) : layout.boxBounds, nowWorld, nowWorldShapeBounds);
9859
+ let bounds, renderBounds, matrix, fitMatrix, shapeBounds, worldCanvas;
9776
9860
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true);
9777
- if (currentBounds.includes(nowWorld)) {
9861
+ if (currentBounds.includes(nowWorldShapeBounds)) {
9778
9862
  worldCanvas = canvas;
9779
- bounds = shapeBounds = nowWorld;
9863
+ bounds = shapeBounds = nowWorldShapeBounds;
9864
+ renderBounds = nowWorld;
9780
9865
  } else {
9781
- const {renderShapeSpread: spread} = ui.__layout;
9782
9866
  let worldClipBounds;
9783
9867
  if (Platform.fullImageShadow) {
9784
- worldClipBounds = nowWorld;
9868
+ worldClipBounds = nowWorldShapeBounds;
9785
9869
  } else {
9786
- const spreadBounds = spread ? getSpread(currentBounds, scaleX === scaleY ? spread * scaleX : [ spread * scaleY, spread * scaleX ]) : currentBounds;
9787
- worldClipBounds = getIntersectData(spreadBounds, nowWorld);
9870
+ const spreadBounds = layout.renderShapeSpread ? getSpread(currentBounds, FourNumberHelper.swapAndScale(layout.renderShapeSpread, scaleX, scaleY)) : currentBounds;
9871
+ worldClipBounds = getIntersectData(spreadBounds, nowWorldShapeBounds);
9788
9872
  }
9789
9873
  fitMatrix = currentBounds.getFitMatrix(worldClipBounds);
9790
9874
  let {a: fitScaleX, d: fitScaleY} = fitMatrix;
@@ -9794,8 +9878,10 @@ function shape(ui, current, options) {
9794
9878
  scaleX *= fitScaleX;
9795
9879
  scaleY *= fitScaleY;
9796
9880
  }
9797
- shapeBounds = getOuterOf(nowWorld, fitMatrix);
9881
+ shapeBounds = getOuterOf(nowWorldShapeBounds, fitMatrix);
9798
9882
  bounds = getByMove(shapeBounds, -fitMatrix.e, -fitMatrix.f);
9883
+ renderBounds = getOuterOf(nowWorld, fitMatrix);
9884
+ move$1(renderBounds, -fitMatrix.e, -fitMatrix.f);
9799
9885
  const userMatrix = options.matrix;
9800
9886
  if (userMatrix) {
9801
9887
  matrix = new Matrix(fitMatrix);
@@ -9814,6 +9900,7 @@ function shape(ui, current, options) {
9814
9900
  matrix: matrix,
9815
9901
  fitMatrix: fitMatrix,
9816
9902
  bounds: bounds,
9903
+ renderBounds: renderBounds,
9817
9904
  worldCanvas: worldCanvas,
9818
9905
  shapeBounds: shapeBounds,
9819
9906
  scaleX: scaleX,
@@ -9917,7 +10004,7 @@ const PaintModule = {
9917
10004
  shape: shape
9918
10005
  };
9919
10006
 
9920
- let origin = {}, tempMatrix = getMatrixData();
10007
+ let origin = {}, tempMatrix$1 = getMatrixData();
9921
10008
 
9922
10009
  const {get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, multiplyParent: multiplyParent, scale: scaleHelper, rotate: rotate, skew: skewHelper} = MatrixHelper;
9923
10010
 
@@ -9932,12 +10019,12 @@ function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
9932
10019
  data.transform = transform;
9933
10020
  }
9934
10021
 
9935
- function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipSize) {
10022
+ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipScaleX, clipScaleY) {
9936
10023
  const transform = get$3();
9937
10024
  layout(transform, box, x, y, scaleX, scaleY, rotation, skew);
9938
- if (clipSize) {
9939
- tempMatrix.a = box.width / clipSize.width, tempMatrix.d = box.height / clipSize.height;
9940
- multiplyParent(transform, tempMatrix);
10025
+ if (clipScaleX) {
10026
+ tempMatrix$1.a = clipScaleX, tempMatrix$1.d = clipScaleY;
10027
+ multiplyParent(transform, tempMatrix$1);
9941
10028
  }
9942
10029
  data.transform = transform;
9943
10030
  }
@@ -10038,7 +10125,12 @@ function getPatternData(paint, box, image) {
10038
10125
 
10039
10126
  case "normal":
10040
10127
  case "clip":
10041
- if (tempImage.x || tempImage.y || scaleX || clipSize || rotation || skew) clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, paint.clipSize);
10128
+ if (tempImage.x || tempImage.y || scaleX || clipSize || rotation || skew) {
10129
+ let clipScaleX, clipScaleY;
10130
+ if (clipSize) clipScaleX = box.width / clipSize.width, clipScaleY = box.height / clipSize.height;
10131
+ clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, clipScaleX, clipScaleY);
10132
+ if (clipScaleX) scaleX = scaleX ? scaleX * clipScaleX : scaleX, scaleY = scaleY ? scaleY * clipScaleY : clipScaleY;
10133
+ }
10042
10134
  break;
10043
10135
 
10044
10136
  case "repeat":
@@ -10196,7 +10288,7 @@ function ignoreRender(ui, value) {
10196
10288
 
10197
10289
  const {get: get$1, scale: scale, copy: copy$1} = MatrixHelper;
10198
10290
 
10199
- const {floor: floor, ceil: ceil, max: max, abs: abs} = Math;
10291
+ const {floor: floor, ceil: ceil, max: max$1, abs: abs} = Math;
10200
10292
 
10201
10293
  function createPattern(ui, paint, pixelRatio) {
10202
10294
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true, paint.scaleFixed);
@@ -10245,8 +10337,8 @@ function createPattern(ui, paint, pixelRatio) {
10245
10337
  if (transform || scaleX !== 1 || scaleY !== 1) {
10246
10338
  const canvasWidth = width + (xGap || 0);
10247
10339
  const canvasHeight = height + (yGap || 0);
10248
- scaleX /= canvasWidth / max(floor(canvasWidth), 1);
10249
- scaleY /= canvasHeight / max(floor(canvasHeight), 1);
10340
+ scaleX /= canvasWidth / max$1(floor(canvasWidth), 1);
10341
+ scaleY /= canvasHeight / max$1(floor(canvasHeight), 1);
10250
10342
  if (!imageMatrix) {
10251
10343
  imageMatrix = get$1();
10252
10344
  if (transform) copy$1(imageMatrix, transform);
@@ -10272,17 +10364,15 @@ function checkImage(ui, canvas, paint, allowDraw) {
10272
10364
  if (allowDraw) {
10273
10365
  if (data.repeat) {
10274
10366
  allowDraw = false;
10275
- } else {
10276
- if (!(paint.changeful || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || Export.running)) {
10277
- let {width: width, height: height} = data;
10278
- width *= scaleX * pixelRatio;
10279
- height *= scaleY * pixelRatio;
10280
- if (data.scaleX) {
10281
- width *= data.scaleX;
10282
- height *= data.scaleY;
10283
- }
10284
- allowDraw = width * height > Platform.image.maxCacheSize;
10367
+ } else if (!(paint.changeful || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || Export.running)) {
10368
+ let {width: width, height: height} = data;
10369
+ width *= scaleX * pixelRatio;
10370
+ height *= scaleY * pixelRatio;
10371
+ if (data.scaleX) {
10372
+ width *= data.scaleX;
10373
+ height *= data.scaleY;
10285
10374
  }
10375
+ allowDraw = width * height > Platform.image.maxCacheSize;
10286
10376
  }
10287
10377
  }
10288
10378
  if (allowDraw) {
@@ -10462,20 +10552,20 @@ const PaintGradientModule = {
10462
10552
  getTransform: getTransform
10463
10553
  };
10464
10554
 
10465
- const {copy: copy, toOffsetOutBounds: toOffsetOutBounds$1} = BoundsHelper;
10555
+ const {copy: copy, move: move, toOffsetOutBounds: toOffsetOutBounds$1} = BoundsHelper, {max: max} = Math;
10466
10556
 
10467
- const tempBounds = {};
10557
+ const tempBounds = {}, tempMatrix = new Matrix;
10468
10558
 
10469
10559
  const offsetOutBounds$1 = {};
10470
10560
 
10471
10561
  function shadow(ui, current, shape) {
10472
- let copyBounds, spreadScale;
10473
- const {__nowWorld: nowWorld, __layout: __layout} = ui;
10562
+ let copyBounds, transform;
10563
+ const {__nowWorld: nowWorld} = ui;
10474
10564
  const {shadow: shadow} = ui.__;
10475
- const {worldCanvas: worldCanvas, bounds: bounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
10565
+ const {worldCanvas: worldCanvas, bounds: bounds, renderBounds: renderBounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
10476
10566
  const other = current.getSameCanvas();
10477
10567
  const end = shadow.length - 1;
10478
- toOffsetOutBounds$1(bounds, offsetOutBounds$1);
10568
+ toOffsetOutBounds$1(bounds, offsetOutBounds$1, renderBounds);
10479
10569
  shadow.forEach((item, index) => {
10480
10570
  let otherScale = 1;
10481
10571
  if (item.scaleFixed) {
@@ -10483,54 +10573,61 @@ function shadow(ui, current, shape) {
10483
10573
  if (sx > 1) otherScale = 1 / sx;
10484
10574
  }
10485
10575
  other.setWorldShadow(offsetOutBounds$1.offsetX + item.x * scaleX * otherScale, offsetOutBounds$1.offsetY + item.y * scaleY * otherScale, item.blur * scaleX * otherScale, ColorConvert.string(item.color));
10486
- spreadScale = item.spread ? 1 + item.spread * 2 / (__layout.boxBounds.width + (__layout.strokeBoxSpread || 0) * 2) * otherScale : 0;
10487
- drawWorldShadow(other, offsetOutBounds$1, spreadScale, shape);
10488
- copyBounds = bounds;
10576
+ transform = getShadowTransform(ui, other, shape, item, offsetOutBounds$1, otherScale);
10577
+ if (transform) other.setTransform(transform);
10578
+ drawWorldShadow(other, offsetOutBounds$1, shape);
10579
+ if (transform) other.resetTransform();
10580
+ copyBounds = renderBounds;
10489
10581
  if (item.box) {
10490
10582
  other.restore();
10491
10583
  other.save();
10492
10584
  if (worldCanvas) {
10493
- other.copyWorld(other, bounds, nowWorld, "copy");
10585
+ other.copyWorld(other, renderBounds, nowWorld, "copy");
10494
10586
  copyBounds = nowWorld;
10495
10587
  }
10496
10588
  worldCanvas ? other.copyWorld(worldCanvas, nowWorld, nowWorld, "destination-out") : other.copyWorld(shape.canvas, shapeBounds, bounds, "destination-out");
10497
10589
  }
10498
- if (Effect.isTransformShadow(item)) Effect.renderTransformShadow(ui, current, other, copyBounds, item); else LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
10590
+ LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
10499
10591
  if (end && index < end) other.clearWorld(copyBounds);
10500
10592
  });
10501
10593
  other.recycle(copyBounds);
10502
10594
  }
10503
10595
 
10504
- function getShadowSpread(_ui, shadow) {
10505
- let width = 0;
10506
- 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));
10507
- return width;
10596
+ function getShadowRenderSpread(_ui, shadow) {
10597
+ let top = 0, right = 0, bottom = 0, left = 0, x, y, spread, blur;
10598
+ shadow.forEach(item => {
10599
+ x = item.x || 0, y = item.y || 0, spread = item.spread || 0, blur = (item.blur || 0) * 1.5;
10600
+ top = max(top, spread + blur - y);
10601
+ right = max(right, spread + blur + x);
10602
+ bottom = max(bottom, spread + blur + y);
10603
+ left = max(left, spread + blur - x);
10604
+ });
10605
+ return top === right && right === bottom && bottom === left ? top : [ top, right, bottom, left ];
10606
+ }
10607
+
10608
+ function getShadowTransform(ui, canvas, _shape, shadow, outBounds, otherScale, isInnerShaodw) {
10609
+ if (shadow.spread) {
10610
+ const spreadScale = 1 + shadow.spread * 2 / ui.__layout.strokeBounds.width * otherScale * (isInnerShaodw ? -1 : 1);
10611
+ tempMatrix.set().scaleOfOuter({
10612
+ x: (outBounds.x + outBounds.width / 2) * canvas.pixelRatio,
10613
+ y: (outBounds.y + outBounds.height / 2) * canvas.pixelRatio
10614
+ }, spreadScale);
10615
+ return tempMatrix;
10616
+ }
10617
+ return undefined;
10508
10618
  }
10509
10619
 
10510
- function drawWorldShadow(canvas, outBounds, spreadScale, shape) {
10511
- const {bounds: bounds, shapeBounds: shapeBounds} = shape;
10620
+ function drawWorldShadow(canvas, outBounds, shape) {
10621
+ const {shapeBounds: shapeBounds} = shape;
10622
+ let from, to;
10512
10623
  if (Platform.fullImageShadow) {
10513
10624
  copy(tempBounds, canvas.bounds);
10514
- tempBounds.x += outBounds.x - shapeBounds.x;
10515
- tempBounds.y += outBounds.y - shapeBounds.y;
10516
- if (spreadScale) {
10517
- const {fitMatrix: fitMatrix} = shape;
10518
- tempBounds.x -= (bounds.x + (fitMatrix ? fitMatrix.e : 0) + bounds.width / 2) * (spreadScale - 1);
10519
- tempBounds.y -= (bounds.y + (fitMatrix ? fitMatrix.f : 0) + bounds.height / 2) * (spreadScale - 1);
10520
- tempBounds.width *= spreadScale;
10521
- tempBounds.height *= spreadScale;
10522
- }
10523
- canvas.copyWorld(shape.canvas, canvas.bounds, tempBounds);
10625
+ move(tempBounds, outBounds.x - shapeBounds.x, outBounds.y - shapeBounds.y);
10626
+ from = canvas.bounds, to = tempBounds;
10524
10627
  } else {
10525
- if (spreadScale) {
10526
- copy(tempBounds, outBounds);
10527
- tempBounds.x -= outBounds.width / 2 * (spreadScale - 1);
10528
- tempBounds.y -= outBounds.height / 2 * (spreadScale - 1);
10529
- tempBounds.width *= spreadScale;
10530
- tempBounds.height *= spreadScale;
10531
- }
10532
- canvas.copyWorld(shape.canvas, shapeBounds, spreadScale ? tempBounds : outBounds);
10628
+ from = shapeBounds, to = outBounds;
10533
10629
  }
10630
+ canvas.copyWorld(shape.canvas, from, to);
10534
10631
  }
10535
10632
 
10536
10633
  const {toOffsetOutBounds: toOffsetOutBounds} = BoundsHelper;
@@ -10538,13 +10635,13 @@ const {toOffsetOutBounds: toOffsetOutBounds} = BoundsHelper;
10538
10635
  const offsetOutBounds = {};
10539
10636
 
10540
10637
  function innerShadow(ui, current, shape) {
10541
- let copyBounds, spreadScale;
10542
- const {__nowWorld: nowWorld, __layout: __layout} = ui;
10638
+ let copyBounds, transform;
10639
+ const {__nowWorld: nowWorld} = ui;
10543
10640
  const {innerShadow: innerShadow} = ui.__;
10544
- const {worldCanvas: worldCanvas, bounds: bounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
10641
+ const {worldCanvas: worldCanvas, bounds: bounds, renderBounds: renderBounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
10545
10642
  const other = current.getSameCanvas();
10546
10643
  const end = innerShadow.length - 1;
10547
- toOffsetOutBounds(bounds, offsetOutBounds);
10644
+ toOffsetOutBounds(bounds, offsetOutBounds, renderBounds);
10548
10645
  innerShadow.forEach((item, index) => {
10549
10646
  let otherScale = 1;
10550
10647
  if (item.scaleFixed) {
@@ -10553,16 +10650,17 @@ function innerShadow(ui, current, shape) {
10553
10650
  }
10554
10651
  other.save();
10555
10652
  other.setWorldShadow(offsetOutBounds.offsetX + item.x * scaleX * otherScale, offsetOutBounds.offsetY + item.y * scaleY * otherScale, item.blur * scaleX * otherScale);
10556
- spreadScale = item.spread ? 1 - item.spread * 2 / (__layout.boxBounds.width + (__layout.strokeBoxSpread || 0) * 2) * otherScale : 0;
10557
- drawWorldShadow(other, offsetOutBounds, spreadScale, shape);
10653
+ transform = getShadowTransform(ui, other, shape, item, offsetOutBounds, otherScale, true);
10654
+ if (transform) other.setTransform(transform);
10655
+ drawWorldShadow(other, offsetOutBounds, shape);
10558
10656
  other.restore();
10559
10657
  if (worldCanvas) {
10560
- other.copyWorld(other, bounds, nowWorld, "copy");
10658
+ other.copyWorld(other, renderBounds, nowWorld, "copy");
10561
10659
  other.copyWorld(worldCanvas, nowWorld, nowWorld, "source-out");
10562
10660
  copyBounds = nowWorld;
10563
10661
  } else {
10564
10662
  other.copyWorld(shape.canvas, shapeBounds, bounds, "source-out");
10565
- copyBounds = bounds;
10663
+ copyBounds = renderBounds;
10566
10664
  }
10567
10665
  other.fillWorld(copyBounds, ColorConvert.string(item.color), "source-in");
10568
10666
  LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
@@ -10571,6 +10669,8 @@ function innerShadow(ui, current, shape) {
10571
10669
  other.recycle(copyBounds);
10572
10670
  }
10573
10671
 
10672
+ const getInnerShadowSpread = getShadowRenderSpread;
10673
+
10574
10674
  function blur(ui, current, origin) {
10575
10675
  const {blur: blur} = ui.__;
10576
10676
  origin.setWorldBlur(blur * ui.__nowWorld.a);
@@ -10585,10 +10685,12 @@ const EffectModule = {
10585
10685
  innerShadow: innerShadow,
10586
10686
  blur: blur,
10587
10687
  backgroundBlur: backgroundBlur,
10588
- getShadowSpread: getShadowSpread,
10688
+ getShadowRenderSpread: getShadowRenderSpread,
10689
+ getShadowTransform: getShadowTransform,
10589
10690
  isTransformShadow(_shadow) {
10590
10691
  return undefined;
10591
- }
10692
+ },
10693
+ getInnerShadowSpread: getInnerShadowSpread
10592
10694
  };
10593
10695
 
10594
10696
  const {excludeRenderBounds: excludeRenderBounds} = LeafBoundsHelper;
@@ -10605,6 +10707,7 @@ Group.prototype.__renderMask = function(canvas, options) {
10605
10707
  maskEnd(this, currentMask, canvas, contentCanvas, maskCanvas, maskOpacity, undefined, true);
10606
10708
  maskCanvas = contentCanvas = null;
10607
10709
  }
10710
+ if (mask === "clipping" || mask === "clipping-path") excludeRenderBounds(child, options) || child.__render(canvas, options);
10608
10711
  maskOpacity = child.__.opacity;
10609
10712
  usedGrayscaleAlpha = false;
10610
10713
  if (mask === "path" || mask === "clipping-path") {
@@ -10622,7 +10725,6 @@ Group.prototype.__renderMask = function(canvas, options) {
10622
10725
  if (!contentCanvas) contentCanvas = getCanvas(canvas);
10623
10726
  child.__render(maskCanvas, options);
10624
10727
  }
10625
- if (mask === "clipping" || mask === "clipping-path") excludeRenderBounds(child, options) || child.__render(canvas, options);
10626
10728
  continue;
10627
10729
  }
10628
10730
  const childBlendMode = maskOpacity === 1 && child.__.__blendMode;
@@ -11212,4 +11314,4 @@ Object.assign(Effect, EffectModule);
11212
11314
 
11213
11315
  useCanvas();
11214
11316
 
11215
- export { AlignHelper, Answer, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, DataHelper, Debug, Direction4, Direction9, DragBoundsHelper, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, Frame, FrameData, Group, GroupData, Image$1 as Image, ImageData, ImageEvent, ImageManager, IncrementId, 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, MyImage, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Platform, Plugin, Point, PointHelper, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, Run, Star, StarData, State, StringNumberMap, TaskItem, TaskProcessor, Text, TextConvert, TextData, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, 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 };
11317
+ export { AlignHelper, Answer, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, DataHelper, Debug, Direction4, Direction9, DragBoundsHelper, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, FourNumberHelper, Frame, FrameData, Group, GroupData, Image$1 as Image, ImageData, ImageEvent, ImageManager, IncrementId, 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, MyImage, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Platform, Plugin, Point, PointHelper, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, Run, Star, StarData, State, StringNumberMap, TaskItem, TaskProcessor, Text, TextConvert, TextData, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, 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 };