@leafer-draw/miniapp 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
  class LeaferCanvas extends LeaferCanvasBase {
6757
6821
  get allowBackgroundColor() {
@@ -7329,6 +7393,7 @@ class Renderer {
7329
7393
  usePartRender: true,
7330
7394
  maxFPS: 120
7331
7395
  };
7396
+ this.frames = [];
7332
7397
  this.target = target;
7333
7398
  this.canvas = canvas;
7334
7399
  if (userConfig) this.config = DataHelper.default(userConfig, this.config);
@@ -7458,7 +7523,7 @@ class Renderer {
7458
7523
  };
7459
7524
  if (this.needFill) canvas.fillWorld(bounds, this.config.fill);
7460
7525
  if (Debug.showRepaint) Debug.drawRepaint(canvas, bounds);
7461
- this.target.__render(canvas, options);
7526
+ Platform.render(this.target, canvas, options);
7462
7527
  this.renderBounds = realBounds = realBounds || bounds;
7463
7528
  this.renderOptions = options;
7464
7529
  this.totalBounds.isEmpty() ? this.totalBounds = realBounds : this.totalBounds.add(realBounds);
@@ -7481,12 +7546,15 @@ class Renderer {
7481
7546
  const target = this.target;
7482
7547
  if (this.requestTime || !target) return;
7483
7548
  if (target.parentApp) return target.parentApp.requestRender(false);
7484
- const requestTime = this.requestTime = Date.now();
7549
+ this.requestTime = this.frameTime || Date.now();
7485
7550
  const render = () => {
7486
- const nowFPS = 1e3 / (Date.now() - requestTime);
7551
+ const nowFPS = 1e3 / ((this.frameTime = Date.now()) - this.requestTime);
7487
7552
  const {maxFPS: maxFPS} = this.config;
7488
- if (maxFPS && nowFPS > maxFPS - .5) return Platform.requestRender(render);
7489
- this.FPS = Math.min(120, Math.ceil(nowFPS));
7553
+ if (maxFPS && nowFPS > maxFPS) return Platform.requestRender(render);
7554
+ const {frames: frames} = this;
7555
+ if (frames.length > 30) frames.shift();
7556
+ frames.push(nowFPS);
7557
+ this.FPS = Math.round(frames.reduce((a, b) => a + b, 0) / frames.length);
7490
7558
  this.requestTime = 0;
7491
7559
  this.checkRender();
7492
7560
  };
@@ -7551,6 +7619,15 @@ Object.assign(Creator, {
7551
7619
 
7552
7620
  Platform.layout = Layouter.fullLayout;
7553
7621
 
7622
+ Platform.render = function(target, canvas, options) {
7623
+ const topOptions = Object.assign(Object.assign({}, options), {
7624
+ topRendering: true
7625
+ });
7626
+ options.topList = new LeafList;
7627
+ target.__render(canvas, options);
7628
+ if (options.topList.length) options.topList.forEach(item => item.__render(canvas, topOptions));
7629
+ };
7630
+
7554
7631
  function effectType(defaultValue) {
7555
7632
  return decorateLeafAttr(defaultValue, key => attr({
7556
7633
  set(value) {
@@ -7950,39 +8027,41 @@ class CanvasData extends RectData {
7950
8027
  }
7951
8028
  }
7952
8029
 
8030
+ const {max: max$2, add: add$1} = FourNumberHelper;
8031
+
7953
8032
  const UIBounds = {
7954
8033
  __updateStrokeSpread() {
7955
- let width = 0, boxWidth = 0;
8034
+ let spread = 0, boxSpread = 0;
7956
8035
  const data = this.__, {strokeAlign: strokeAlign, __maxStrokeWidth: strokeWidth} = data, box = this.__box;
7957
8036
  if ((data.stroke || data.hitStroke === "all") && strokeWidth && strokeAlign !== "inside") {
7958
- boxWidth = width = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
8037
+ boxSpread = spread = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
7959
8038
  if (!data.__boxStroke) {
7960
- const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * width;
8039
+ const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * spread;
7961
8040
  const storkeCapAddWidth = data.strokeCap === "none" ? 0 : strokeWidth;
7962
- width += Math.max(miterLimitAddWidth, storkeCapAddWidth);
8041
+ spread += Math.max(miterLimitAddWidth, storkeCapAddWidth);
7963
8042
  }
7964
8043
  }
7965
- if (data.__useArrow) width += strokeWidth * 5;
8044
+ if (data.__useArrow) spread += strokeWidth * 5;
7966
8045
  if (box) {
7967
- width = Math.max(box.__layout.strokeSpread = box.__updateStrokeSpread(), width);
7968
- boxWidth = box.__layout.strokeBoxSpread;
8046
+ spread = max$2(spread, box.__layout.strokeSpread = box.__updateStrokeSpread());
8047
+ boxSpread = Math.max(boxSpread, box.__layout.strokeBoxSpread);
7969
8048
  }
7970
- this.__layout.strokeBoxSpread = boxWidth;
7971
- return width;
8049
+ this.__layout.strokeBoxSpread = boxSpread;
8050
+ return spread;
7972
8051
  },
7973
8052
  __updateRenderSpread() {
7974
- let width = 0;
7975
- const {shadow: shadow, innerShadow: innerShadow, blur: blur, backgroundBlur: backgroundBlur, filter: filter, renderSpread: renderSpread} = this.__;
7976
- if (shadow) width = Effect.getShadowSpread(this, shadow);
7977
- if (blur) width = Math.max(width, blur);
7978
- if (filter) width += Filter.getSpread(filter);
7979
- if (renderSpread) width += renderSpread;
7980
- let shapeWidth = width = Math.ceil(width);
7981
- 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));
7982
- if (backgroundBlur) shapeWidth = Math.max(shapeWidth, backgroundBlur);
7983
- this.__layout.renderShapeSpread = shapeWidth;
7984
- width += this.__layout.strokeSpread || 0;
7985
- return this.__box ? Math.max(this.__box.__updateRenderSpread(), width) : width;
8053
+ let spread = 0;
8054
+ const {shadow: shadow, innerShadow: innerShadow, blur: blur, backgroundBlur: backgroundBlur, filter: filter, renderSpread: renderSpread} = this.__, {strokeSpread: strokeSpread} = this.__layout, box = this.__box;
8055
+ if (shadow) spread = Effect.getShadowRenderSpread(this, shadow);
8056
+ if (blur) spread = max$2(spread, blur);
8057
+ if (filter) spread = add$1(spread, Filter.getSpread(filter));
8058
+ if (renderSpread) spread = add$1(spread, renderSpread);
8059
+ if (strokeSpread) spread = add$1(spread, strokeSpread);
8060
+ let shapeSpread = spread;
8061
+ if (innerShadow) shapeSpread = max$2(shapeSpread, Effect.getInnerShadowSpread(this, innerShadow));
8062
+ if (backgroundBlur) shapeSpread = max$2(shapeSpread, backgroundBlur);
8063
+ this.__layout.renderShapeSpread = shapeSpread;
8064
+ return box ? max$2(box.__updateRenderSpread(), spread) : spread;
7986
8065
  }
7987
8066
  };
7988
8067
 
@@ -8326,9 +8405,9 @@ __decorate([ visibleType(true) ], UI.prototype, "visible", void 0);
8326
8405
 
8327
8406
  __decorate([ surfaceType(false) ], UI.prototype, "locked", void 0);
8328
8407
 
8329
- __decorate([ surfaceType(false) ], UI.prototype, "dim", void 0);
8408
+ __decorate([ dimType(false) ], UI.prototype, "dim", void 0);
8330
8409
 
8331
- __decorate([ surfaceType(false) ], UI.prototype, "dimskip", void 0);
8410
+ __decorate([ dimType(false) ], UI.prototype, "dimskip", void 0);
8332
8411
 
8333
8412
  __decorate([ sortType(0) ], UI.prototype, "zIndex", void 0);
8334
8413
 
@@ -9293,7 +9372,7 @@ __decorate([ resizeType() ], Canvas.prototype, "contextSettings", void 0);
9293
9372
 
9294
9373
  Canvas = __decorate([ registerUI() ], Canvas);
9295
9374
 
9296
- const {copyAndSpread: copyAndSpread, includes: includes, spread: spread, setList: setList} = BoundsHelper;
9375
+ const {copyAndSpread: copyAndSpread$1, includes: includes, spread: spread, setList: setList} = BoundsHelper;
9297
9376
 
9298
9377
  let Text = class Text extends UI {
9299
9378
  get __tag() {
@@ -9340,13 +9419,13 @@ let Text = class Text extends UI {
9340
9419
  if (this.isOverflow) setList(data.__textBoxBounds = {}, [ b, contentBounds ]), layout.renderChanged = true; else data.__textBoxBounds = b;
9341
9420
  }
9342
9421
  __updateRenderSpread() {
9343
- let width = super.__updateRenderSpread();
9344
- if (!width) width = this.isOverflow ? 1 : 0;
9345
- return width;
9422
+ let spread = super.__updateRenderSpread();
9423
+ if (!spread) spread = this.isOverflow ? 1 : 0;
9424
+ return spread;
9346
9425
  }
9347
9426
  __updateRenderBounds() {
9348
9427
  const {renderBounds: renderBounds, renderSpread: renderSpread} = this.__layout;
9349
- copyAndSpread(renderBounds, this.__.__textBoxBounds, renderSpread);
9428
+ copyAndSpread$1(renderBounds, this.__.__textBoxBounds, renderSpread);
9350
9429
  if (this.__box) this.__box.__layout.renderBounds = renderBounds;
9351
9430
  }
9352
9431
  __updateChange() {
@@ -9714,24 +9793,29 @@ function drawOutside(stroke, ui, canvas) {
9714
9793
  }
9715
9794
  }
9716
9795
 
9717
- const {getSpread: getSpread, getOuterOf: getOuterOf, getByMove: getByMove, getIntersectData: getIntersectData} = BoundsHelper;
9796
+ const {getSpread: getSpread, copyAndSpread: copyAndSpread, toOuterOf: toOuterOf, getOuterOf: getOuterOf, getByMove: getByMove, move: move$1, getIntersectData: getIntersectData} = BoundsHelper;
9797
+
9798
+ const tempBounds$1 = {};
9718
9799
 
9719
9800
  function shape(ui, current, options) {
9720
9801
  const canvas = current.getSameCanvas();
9721
- const nowWorld = ui.__nowWorld, currentBounds = current.bounds;
9722
- let bounds, matrix, fitMatrix, shapeBounds, worldCanvas;
9802
+ const currentBounds = current.bounds, nowWorld = ui.__nowWorld, layout = ui.__layout;
9803
+ const nowWorldShapeBounds = ui.__nowWorldShapeBounds || (ui.__nowWorldShapeBounds = {});
9804
+ toOuterOf(layout.strokeSpread ? (copyAndSpread(tempBounds$1, layout.boxBounds, layout.strokeSpread),
9805
+ tempBounds$1) : layout.boxBounds, nowWorld, nowWorldShapeBounds);
9806
+ let bounds, renderBounds, matrix, fitMatrix, shapeBounds, worldCanvas;
9723
9807
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true);
9724
- if (currentBounds.includes(nowWorld)) {
9808
+ if (currentBounds.includes(nowWorldShapeBounds)) {
9725
9809
  worldCanvas = canvas;
9726
- bounds = shapeBounds = nowWorld;
9810
+ bounds = shapeBounds = nowWorldShapeBounds;
9811
+ renderBounds = nowWorld;
9727
9812
  } else {
9728
- const {renderShapeSpread: spread} = ui.__layout;
9729
9813
  let worldClipBounds;
9730
9814
  if (Platform.fullImageShadow) {
9731
- worldClipBounds = nowWorld;
9815
+ worldClipBounds = nowWorldShapeBounds;
9732
9816
  } else {
9733
- const spreadBounds = spread ? getSpread(currentBounds, scaleX === scaleY ? spread * scaleX : [ spread * scaleY, spread * scaleX ]) : currentBounds;
9734
- worldClipBounds = getIntersectData(spreadBounds, nowWorld);
9817
+ const spreadBounds = layout.renderShapeSpread ? getSpread(currentBounds, FourNumberHelper.swapAndScale(layout.renderShapeSpread, scaleX, scaleY)) : currentBounds;
9818
+ worldClipBounds = getIntersectData(spreadBounds, nowWorldShapeBounds);
9735
9819
  }
9736
9820
  fitMatrix = currentBounds.getFitMatrix(worldClipBounds);
9737
9821
  let {a: fitScaleX, d: fitScaleY} = fitMatrix;
@@ -9741,8 +9825,10 @@ function shape(ui, current, options) {
9741
9825
  scaleX *= fitScaleX;
9742
9826
  scaleY *= fitScaleY;
9743
9827
  }
9744
- shapeBounds = getOuterOf(nowWorld, fitMatrix);
9828
+ shapeBounds = getOuterOf(nowWorldShapeBounds, fitMatrix);
9745
9829
  bounds = getByMove(shapeBounds, -fitMatrix.e, -fitMatrix.f);
9830
+ renderBounds = getOuterOf(nowWorld, fitMatrix);
9831
+ move$1(renderBounds, -fitMatrix.e, -fitMatrix.f);
9746
9832
  const userMatrix = options.matrix;
9747
9833
  if (userMatrix) {
9748
9834
  matrix = new Matrix(fitMatrix);
@@ -9761,6 +9847,7 @@ function shape(ui, current, options) {
9761
9847
  matrix: matrix,
9762
9848
  fitMatrix: fitMatrix,
9763
9849
  bounds: bounds,
9850
+ renderBounds: renderBounds,
9764
9851
  worldCanvas: worldCanvas,
9765
9852
  shapeBounds: shapeBounds,
9766
9853
  scaleX: scaleX,
@@ -9864,7 +9951,7 @@ const PaintModule = {
9864
9951
  shape: shape
9865
9952
  };
9866
9953
 
9867
- let origin = {}, tempMatrix = getMatrixData();
9954
+ let origin = {}, tempMatrix$1 = getMatrixData();
9868
9955
 
9869
9956
  const {get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, multiplyParent: multiplyParent, scale: scaleHelper, rotate: rotate, skew: skewHelper} = MatrixHelper;
9870
9957
 
@@ -9879,12 +9966,12 @@ function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
9879
9966
  data.transform = transform;
9880
9967
  }
9881
9968
 
9882
- function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipSize) {
9969
+ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipScaleX, clipScaleY) {
9883
9970
  const transform = get$3();
9884
9971
  layout(transform, box, x, y, scaleX, scaleY, rotation, skew);
9885
- if (clipSize) {
9886
- tempMatrix.a = box.width / clipSize.width, tempMatrix.d = box.height / clipSize.height;
9887
- multiplyParent(transform, tempMatrix);
9972
+ if (clipScaleX) {
9973
+ tempMatrix$1.a = clipScaleX, tempMatrix$1.d = clipScaleY;
9974
+ multiplyParent(transform, tempMatrix$1);
9888
9975
  }
9889
9976
  data.transform = transform;
9890
9977
  }
@@ -9985,7 +10072,12 @@ function getPatternData(paint, box, image) {
9985
10072
 
9986
10073
  case "normal":
9987
10074
  case "clip":
9988
- if (tempImage.x || tempImage.y || scaleX || clipSize || rotation || skew) clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, paint.clipSize);
10075
+ if (tempImage.x || tempImage.y || scaleX || clipSize || rotation || skew) {
10076
+ let clipScaleX, clipScaleY;
10077
+ if (clipSize) clipScaleX = box.width / clipSize.width, clipScaleY = box.height / clipSize.height;
10078
+ clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, clipScaleX, clipScaleY);
10079
+ if (clipScaleX) scaleX = scaleX ? scaleX * clipScaleX : scaleX, scaleY = scaleY ? scaleY * clipScaleY : clipScaleY;
10080
+ }
9989
10081
  break;
9990
10082
 
9991
10083
  case "repeat":
@@ -10143,7 +10235,7 @@ function ignoreRender(ui, value) {
10143
10235
 
10144
10236
  const {get: get$1, scale: scale, copy: copy$1} = MatrixHelper;
10145
10237
 
10146
- const {floor: floor, ceil: ceil, max: max, abs: abs} = Math;
10238
+ const {floor: floor, ceil: ceil, max: max$1, abs: abs} = Math;
10147
10239
 
10148
10240
  function createPattern(ui, paint, pixelRatio) {
10149
10241
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true, paint.scaleFixed);
@@ -10192,8 +10284,8 @@ function createPattern(ui, paint, pixelRatio) {
10192
10284
  if (transform || scaleX !== 1 || scaleY !== 1) {
10193
10285
  const canvasWidth = width + (xGap || 0);
10194
10286
  const canvasHeight = height + (yGap || 0);
10195
- scaleX /= canvasWidth / max(floor(canvasWidth), 1);
10196
- scaleY /= canvasHeight / max(floor(canvasHeight), 1);
10287
+ scaleX /= canvasWidth / max$1(floor(canvasWidth), 1);
10288
+ scaleY /= canvasHeight / max$1(floor(canvasHeight), 1);
10197
10289
  if (!imageMatrix) {
10198
10290
  imageMatrix = get$1();
10199
10291
  if (transform) copy$1(imageMatrix, transform);
@@ -10219,17 +10311,15 @@ function checkImage(ui, canvas, paint, allowDraw) {
10219
10311
  if (allowDraw) {
10220
10312
  if (data.repeat) {
10221
10313
  allowDraw = false;
10222
- } else {
10223
- if (!(paint.changeful || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || Export.running)) {
10224
- let {width: width, height: height} = data;
10225
- width *= scaleX * pixelRatio;
10226
- height *= scaleY * pixelRatio;
10227
- if (data.scaleX) {
10228
- width *= data.scaleX;
10229
- height *= data.scaleY;
10230
- }
10231
- allowDraw = width * height > Platform.image.maxCacheSize;
10314
+ } else if (!(paint.changeful || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || Export.running)) {
10315
+ let {width: width, height: height} = data;
10316
+ width *= scaleX * pixelRatio;
10317
+ height *= scaleY * pixelRatio;
10318
+ if (data.scaleX) {
10319
+ width *= data.scaleX;
10320
+ height *= data.scaleY;
10232
10321
  }
10322
+ allowDraw = width * height > Platform.image.maxCacheSize;
10233
10323
  }
10234
10324
  }
10235
10325
  if (allowDraw) {
@@ -10409,20 +10499,20 @@ const PaintGradientModule = {
10409
10499
  getTransform: getTransform
10410
10500
  };
10411
10501
 
10412
- const {copy: copy, toOffsetOutBounds: toOffsetOutBounds$1} = BoundsHelper;
10502
+ const {copy: copy, move: move, toOffsetOutBounds: toOffsetOutBounds$1} = BoundsHelper, {max: max} = Math;
10413
10503
 
10414
- const tempBounds = {};
10504
+ const tempBounds = {}, tempMatrix = new Matrix;
10415
10505
 
10416
10506
  const offsetOutBounds$1 = {};
10417
10507
 
10418
10508
  function shadow(ui, current, shape) {
10419
- let copyBounds, spreadScale;
10420
- const {__nowWorld: nowWorld, __layout: __layout} = ui;
10509
+ let copyBounds, transform;
10510
+ const {__nowWorld: nowWorld} = ui;
10421
10511
  const {shadow: shadow} = ui.__;
10422
- const {worldCanvas: worldCanvas, bounds: bounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
10512
+ const {worldCanvas: worldCanvas, bounds: bounds, renderBounds: renderBounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
10423
10513
  const other = current.getSameCanvas();
10424
10514
  const end = shadow.length - 1;
10425
- toOffsetOutBounds$1(bounds, offsetOutBounds$1);
10515
+ toOffsetOutBounds$1(bounds, offsetOutBounds$1, renderBounds);
10426
10516
  shadow.forEach((item, index) => {
10427
10517
  let otherScale = 1;
10428
10518
  if (item.scaleFixed) {
@@ -10430,54 +10520,61 @@ function shadow(ui, current, shape) {
10430
10520
  if (sx > 1) otherScale = 1 / sx;
10431
10521
  }
10432
10522
  other.setWorldShadow(offsetOutBounds$1.offsetX + item.x * scaleX * otherScale, offsetOutBounds$1.offsetY + item.y * scaleY * otherScale, item.blur * scaleX * otherScale, ColorConvert.string(item.color));
10433
- spreadScale = item.spread ? 1 + item.spread * 2 / (__layout.boxBounds.width + (__layout.strokeBoxSpread || 0) * 2) * otherScale : 0;
10434
- drawWorldShadow(other, offsetOutBounds$1, spreadScale, shape);
10435
- copyBounds = bounds;
10523
+ transform = getShadowTransform(ui, other, shape, item, offsetOutBounds$1, otherScale);
10524
+ if (transform) other.setTransform(transform);
10525
+ drawWorldShadow(other, offsetOutBounds$1, shape);
10526
+ if (transform) other.resetTransform();
10527
+ copyBounds = renderBounds;
10436
10528
  if (item.box) {
10437
10529
  other.restore();
10438
10530
  other.save();
10439
10531
  if (worldCanvas) {
10440
- other.copyWorld(other, bounds, nowWorld, "copy");
10532
+ other.copyWorld(other, renderBounds, nowWorld, "copy");
10441
10533
  copyBounds = nowWorld;
10442
10534
  }
10443
10535
  worldCanvas ? other.copyWorld(worldCanvas, nowWorld, nowWorld, "destination-out") : other.copyWorld(shape.canvas, shapeBounds, bounds, "destination-out");
10444
10536
  }
10445
- if (Effect.isTransformShadow(item)) Effect.renderTransformShadow(ui, current, other, copyBounds, item); else LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
10537
+ LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
10446
10538
  if (end && index < end) other.clearWorld(copyBounds);
10447
10539
  });
10448
10540
  other.recycle(copyBounds);
10449
10541
  }
10450
10542
 
10451
- function getShadowSpread(_ui, shadow) {
10452
- let width = 0;
10453
- 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));
10454
- return width;
10543
+ function getShadowRenderSpread(_ui, shadow) {
10544
+ let top = 0, right = 0, bottom = 0, left = 0, x, y, spread, blur;
10545
+ shadow.forEach(item => {
10546
+ x = item.x || 0, y = item.y || 0, spread = item.spread || 0, blur = (item.blur || 0) * 1.5;
10547
+ top = max(top, spread + blur - y);
10548
+ right = max(right, spread + blur + x);
10549
+ bottom = max(bottom, spread + blur + y);
10550
+ left = max(left, spread + blur - x);
10551
+ });
10552
+ return top === right && right === bottom && bottom === left ? top : [ top, right, bottom, left ];
10553
+ }
10554
+
10555
+ function getShadowTransform(ui, canvas, _shape, shadow, outBounds, otherScale, isInnerShaodw) {
10556
+ if (shadow.spread) {
10557
+ const spreadScale = 1 + shadow.spread * 2 / ui.__layout.strokeBounds.width * otherScale * (isInnerShaodw ? -1 : 1);
10558
+ tempMatrix.set().scaleOfOuter({
10559
+ x: (outBounds.x + outBounds.width / 2) * canvas.pixelRatio,
10560
+ y: (outBounds.y + outBounds.height / 2) * canvas.pixelRatio
10561
+ }, spreadScale);
10562
+ return tempMatrix;
10563
+ }
10564
+ return undefined;
10455
10565
  }
10456
10566
 
10457
- function drawWorldShadow(canvas, outBounds, spreadScale, shape) {
10458
- const {bounds: bounds, shapeBounds: shapeBounds} = shape;
10567
+ function drawWorldShadow(canvas, outBounds, shape) {
10568
+ const {shapeBounds: shapeBounds} = shape;
10569
+ let from, to;
10459
10570
  if (Platform.fullImageShadow) {
10460
10571
  copy(tempBounds, canvas.bounds);
10461
- tempBounds.x += outBounds.x - shapeBounds.x;
10462
- tempBounds.y += outBounds.y - shapeBounds.y;
10463
- if (spreadScale) {
10464
- const {fitMatrix: fitMatrix} = shape;
10465
- tempBounds.x -= (bounds.x + (fitMatrix ? fitMatrix.e : 0) + bounds.width / 2) * (spreadScale - 1);
10466
- tempBounds.y -= (bounds.y + (fitMatrix ? fitMatrix.f : 0) + bounds.height / 2) * (spreadScale - 1);
10467
- tempBounds.width *= spreadScale;
10468
- tempBounds.height *= spreadScale;
10469
- }
10470
- canvas.copyWorld(shape.canvas, canvas.bounds, tempBounds);
10572
+ move(tempBounds, outBounds.x - shapeBounds.x, outBounds.y - shapeBounds.y);
10573
+ from = canvas.bounds, to = tempBounds;
10471
10574
  } else {
10472
- if (spreadScale) {
10473
- copy(tempBounds, outBounds);
10474
- tempBounds.x -= outBounds.width / 2 * (spreadScale - 1);
10475
- tempBounds.y -= outBounds.height / 2 * (spreadScale - 1);
10476
- tempBounds.width *= spreadScale;
10477
- tempBounds.height *= spreadScale;
10478
- }
10479
- canvas.copyWorld(shape.canvas, shapeBounds, spreadScale ? tempBounds : outBounds);
10575
+ from = shapeBounds, to = outBounds;
10480
10576
  }
10577
+ canvas.copyWorld(shape.canvas, from, to);
10481
10578
  }
10482
10579
 
10483
10580
  const {toOffsetOutBounds: toOffsetOutBounds} = BoundsHelper;
@@ -10485,13 +10582,13 @@ const {toOffsetOutBounds: toOffsetOutBounds} = BoundsHelper;
10485
10582
  const offsetOutBounds = {};
10486
10583
 
10487
10584
  function innerShadow(ui, current, shape) {
10488
- let copyBounds, spreadScale;
10489
- const {__nowWorld: nowWorld, __layout: __layout} = ui;
10585
+ let copyBounds, transform;
10586
+ const {__nowWorld: nowWorld} = ui;
10490
10587
  const {innerShadow: innerShadow} = ui.__;
10491
- const {worldCanvas: worldCanvas, bounds: bounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
10588
+ const {worldCanvas: worldCanvas, bounds: bounds, renderBounds: renderBounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
10492
10589
  const other = current.getSameCanvas();
10493
10590
  const end = innerShadow.length - 1;
10494
- toOffsetOutBounds(bounds, offsetOutBounds);
10591
+ toOffsetOutBounds(bounds, offsetOutBounds, renderBounds);
10495
10592
  innerShadow.forEach((item, index) => {
10496
10593
  let otherScale = 1;
10497
10594
  if (item.scaleFixed) {
@@ -10500,16 +10597,17 @@ function innerShadow(ui, current, shape) {
10500
10597
  }
10501
10598
  other.save();
10502
10599
  other.setWorldShadow(offsetOutBounds.offsetX + item.x * scaleX * otherScale, offsetOutBounds.offsetY + item.y * scaleY * otherScale, item.blur * scaleX * otherScale);
10503
- spreadScale = item.spread ? 1 - item.spread * 2 / (__layout.boxBounds.width + (__layout.strokeBoxSpread || 0) * 2) * otherScale : 0;
10504
- drawWorldShadow(other, offsetOutBounds, spreadScale, shape);
10600
+ transform = getShadowTransform(ui, other, shape, item, offsetOutBounds, otherScale, true);
10601
+ if (transform) other.setTransform(transform);
10602
+ drawWorldShadow(other, offsetOutBounds, shape);
10505
10603
  other.restore();
10506
10604
  if (worldCanvas) {
10507
- other.copyWorld(other, bounds, nowWorld, "copy");
10605
+ other.copyWorld(other, renderBounds, nowWorld, "copy");
10508
10606
  other.copyWorld(worldCanvas, nowWorld, nowWorld, "source-out");
10509
10607
  copyBounds = nowWorld;
10510
10608
  } else {
10511
10609
  other.copyWorld(shape.canvas, shapeBounds, bounds, "source-out");
10512
- copyBounds = bounds;
10610
+ copyBounds = renderBounds;
10513
10611
  }
10514
10612
  other.fillWorld(copyBounds, ColorConvert.string(item.color), "source-in");
10515
10613
  LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
@@ -10518,6 +10616,8 @@ function innerShadow(ui, current, shape) {
10518
10616
  other.recycle(copyBounds);
10519
10617
  }
10520
10618
 
10619
+ const getInnerShadowSpread = getShadowRenderSpread;
10620
+
10521
10621
  function blur(ui, current, origin) {
10522
10622
  const {blur: blur} = ui.__;
10523
10623
  origin.setWorldBlur(blur * ui.__nowWorld.a);
@@ -10532,10 +10632,12 @@ const EffectModule = {
10532
10632
  innerShadow: innerShadow,
10533
10633
  blur: blur,
10534
10634
  backgroundBlur: backgroundBlur,
10535
- getShadowSpread: getShadowSpread,
10635
+ getShadowRenderSpread: getShadowRenderSpread,
10636
+ getShadowTransform: getShadowTransform,
10536
10637
  isTransformShadow(_shadow) {
10537
10638
  return undefined;
10538
- }
10639
+ },
10640
+ getInnerShadowSpread: getInnerShadowSpread
10539
10641
  };
10540
10642
 
10541
10643
  const {excludeRenderBounds: excludeRenderBounds} = LeafBoundsHelper;
@@ -10552,6 +10654,7 @@ Group.prototype.__renderMask = function(canvas, options) {
10552
10654
  maskEnd(this, currentMask, canvas, contentCanvas, maskCanvas, maskOpacity, undefined, true);
10553
10655
  maskCanvas = contentCanvas = null;
10554
10656
  }
10657
+ if (mask === "clipping" || mask === "clipping-path") excludeRenderBounds(child, options) || child.__render(canvas, options);
10555
10658
  maskOpacity = child.__.opacity;
10556
10659
  usedGrayscaleAlpha = false;
10557
10660
  if (mask === "path" || mask === "clipping-path") {
@@ -10569,7 +10672,6 @@ Group.prototype.__renderMask = function(canvas, options) {
10569
10672
  if (!contentCanvas) contentCanvas = getCanvas(canvas);
10570
10673
  child.__render(maskCanvas, options);
10571
10674
  }
10572
- if (mask === "clipping" || mask === "clipping-path") excludeRenderBounds(child, options) || child.__render(canvas, options);
10573
10675
  continue;
10574
10676
  }
10575
10677
  const childBlendMode = maskOpacity === 1 && child.__.__blendMode;
@@ -11161,4 +11263,4 @@ try {
11161
11263
  if (wx) useCanvas("miniapp", wx);
11162
11264
  } catch (_a) {}
11163
11265
 
11164
- 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, 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 };
11266
+ 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, 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 };