@leafer-ui/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$9(to, t);
1213
- }
1214
- if (parent) {
1215
- to.offsetX = -(B.maxX(parent) - t.x);
1216
- to.offsetY = -(B.maxY(parent) - t.y);
1217
- } else {
1218
- to.offsetX = t.x + t.width;
1219
- to.offsetY = t.y + t.height;
1220
- }
1267
+ toOffsetOutBounds(t, to, offsetBounds) {
1268
+ if (!to) to = t; else copy$9(to, t);
1269
+ if (!offsetBounds) offsetBounds = t;
1270
+ to.offsetX = B.maxX(offsetBounds);
1271
+ to.offsetY = B.maxY(offsetBounds);
1221
1272
  B.move(to, -to.offsetX, -to.offsetY);
1222
1273
  },
1223
1274
  scale(t, scaleX, scaleY = scaleX, onlySize) {
@@ -1231,9 +1282,9 @@ const BoundsHelper = {
1231
1282
  t.height *= scaleY;
1232
1283
  },
1233
1284
  tempToOuterOf(t, matrix) {
1234
- B.copy(tempBounds$2, t);
1235
- B.toOuterOf(tempBounds$2, matrix);
1236
- return tempBounds$2;
1285
+ B.copy(tempBounds$3, t);
1286
+ B.toOuterOf(tempBounds$3, matrix);
1287
+ return tempBounds$3;
1237
1288
  },
1238
1289
  getOuterOf(t, matrix) {
1239
1290
  t = Object.assign({}, t);
@@ -1291,9 +1342,9 @@ const BoundsHelper = {
1291
1342
  put(t, put, align = "center", putScale = 1, changeSize = true, to) {
1292
1343
  to || (to = put);
1293
1344
  if (isString(putScale)) putScale = B.getFitScale(t, put, putScale === "cover");
1294
- tempBounds$2.width = changeSize ? put.width *= putScale : put.width * putScale;
1295
- tempBounds$2.height = changeSize ? put.height *= putScale : put.height * putScale;
1296
- AlignHelper.toPoint(align, tempBounds$2, t, to, true, true);
1345
+ tempBounds$3.width = changeSize ? put.width *= putScale : put.width * putScale;
1346
+ tempBounds$3.height = changeSize ? put.height *= putScale : put.height * putScale;
1347
+ AlignHelper.toPoint(align, tempBounds$3, t, to, true, true);
1297
1348
  },
1298
1349
  getSpread(t, spread, side) {
1299
1350
  const n = {};
@@ -1363,7 +1414,7 @@ const BoundsHelper = {
1363
1414
  first = false;
1364
1415
  if (!addMode) copy$9(t, bounds);
1365
1416
  } else {
1366
- add$1(t, bounds);
1417
+ add$2(t, bounds);
1367
1418
  }
1368
1419
  }
1369
1420
  }
@@ -1377,7 +1428,7 @@ const BoundsHelper = {
1377
1428
  B.set(t, point.x, point.y);
1378
1429
  },
1379
1430
  addPoint(t, point) {
1380
- add$1(t, point, true);
1431
+ add$2(t, point, true);
1381
1432
  },
1382
1433
  getPoints(t) {
1383
1434
  const {x: x, y: y, width: width, height: height} = t;
@@ -1448,7 +1499,7 @@ const BoundsHelper = {
1448
1499
 
1449
1500
  const B = BoundsHelper;
1450
1501
 
1451
- const {add: add$1, copy: copy$9} = B;
1502
+ const {add: add$2, copy: copy$9} = B;
1452
1503
 
1453
1504
  class Bounds {
1454
1505
  get minX() {
@@ -1593,7 +1644,7 @@ class Bounds {
1593
1644
  }
1594
1645
  }
1595
1646
 
1596
- const tempBounds$1 = new Bounds;
1647
+ const tempBounds$2 = new Bounds;
1597
1648
 
1598
1649
  class AutoBounds {
1599
1650
  constructor(top, right, bottom, left, width, height) {
@@ -2146,7 +2197,7 @@ __decorate([ contextMethod() ], Canvas$1.prototype, "measureText", null);
2146
2197
 
2147
2198
  __decorate([ contextMethod() ], Canvas$1.prototype, "strokeText", null);
2148
2199
 
2149
- const {copy: copy$8, multiplyParent: multiplyParent$4} = MatrixHelper, {round: round$1} = Math, tempPixelBounds = new Bounds, tempPixelBounds2 = new Bounds;
2200
+ const {copy: copy$8, multiplyParent: multiplyParent$4, pixelScale: pixelScale} = MatrixHelper, {round: round$1} = Math, tempPixelBounds = new Bounds, tempPixelBounds2 = new Bounds;
2150
2201
 
2151
2202
  const minSize = {
2152
2203
  width: 1,
@@ -2247,13 +2298,8 @@ class LeaferCanvasBase extends Canvas$1 {
2247
2298
  setWorld(matrix, parentMatrix) {
2248
2299
  const {pixelRatio: pixelRatio, pixelSnap: pixelSnap} = this, w = this.worldTransform;
2249
2300
  if (parentMatrix) multiplyParent$4(matrix, parentMatrix, w);
2250
- w.a = matrix.a * pixelRatio;
2251
- w.b = matrix.b * pixelRatio;
2252
- w.c = matrix.c * pixelRatio;
2253
- w.d = matrix.d * pixelRatio;
2254
- w.e = matrix.e * pixelRatio;
2255
- w.f = matrix.f * pixelRatio;
2256
- if (pixelSnap) {
2301
+ pixelScale(matrix, pixelRatio, w);
2302
+ if (pixelSnap && !matrix.ignorePixelSnap) {
2257
2303
  if (matrix.half && matrix.half * pixelRatio % 2) w.e = round$1(w.e - .5) + .5, w.f = round$1(w.f - .5) + .5; else w.e = round$1(w.e),
2258
2304
  w.f = round$1(w.f);
2259
2305
  }
@@ -3977,7 +4023,7 @@ const I$1 = ImageManager;
3977
4023
 
3978
4024
  const {IMAGE: IMAGE, create: create$1} = IncrementId;
3979
4025
 
3980
- const {floor: floor$1, max: max$1} = Math;
4026
+ const {floor: floor$1, max: max$3} = Math;
3981
4027
 
3982
4028
  class LeaferImage {
3983
4029
  get url() {
@@ -4066,7 +4112,7 @@ class LeaferImage {
4066
4112
  }
4067
4113
  if (data) return data;
4068
4114
  }
4069
- const canvas = Platform.origin.createCanvas(max$1(floor$1(width + (xGap || 0)), 1), max$1(floor$1(height + (yGap || 0)), 1));
4115
+ const canvas = Platform.origin.createCanvas(max$3(floor$1(width + (xGap || 0)), 1), max$3(floor$1(height + (yGap || 0)), 1));
4070
4116
  const ctx = canvas.getContext("2d");
4071
4117
  if (opacity) ctx.globalAlpha = opacity;
4072
4118
  ctx.imageSmoothingEnabled = smooth === false ? false : true;
@@ -4265,6 +4311,18 @@ function surfaceType(defaultValue) {
4265
4311
  }));
4266
4312
  }
4267
4313
 
4314
+ function dimType(defaultValue) {
4315
+ return decorateLeafAttr(defaultValue, key => attr({
4316
+ set(value) {
4317
+ if (this.__setAttr(key, value)) {
4318
+ const data = this.__;
4319
+ DataHelper.stintSet(data, "__useDim", data.dim || data.bright || data.dimskip);
4320
+ this.__layout.surfaceChange();
4321
+ }
4322
+ }
4323
+ }));
4324
+ }
4325
+
4268
4326
  function opacityType(defaultValue) {
4269
4327
  return decorateLeafAttr(defaultValue, key => attr({
4270
4328
  set(value) {
@@ -4309,7 +4367,7 @@ function sortType(defaultValue) {
4309
4367
  return decorateLeafAttr(defaultValue, key => attr({
4310
4368
  set(value) {
4311
4369
  if (this.__setAttr(key, value)) {
4312
- this.__layout.surfaceChanged || this.__layout.surfaceChange();
4370
+ this.__layout.surfaceChange();
4313
4371
  this.waitParent(() => {
4314
4372
  this.parent.__layout.childrenSortChange();
4315
4373
  });
@@ -4346,7 +4404,7 @@ function hitType(defaultValue) {
4346
4404
  set(value) {
4347
4405
  if (this.__setAttr(key, value)) {
4348
4406
  this.__layout.hitCanvasChanged = true;
4349
- if (Debug.showBounds === "hit") this.__layout.surfaceChanged || this.__layout.surfaceChange();
4407
+ if (Debug.showBounds === "hit") this.__layout.surfaceChange();
4350
4408
  if (this.leafer) this.leafer.updateCursor();
4351
4409
  }
4352
4410
  }
@@ -4848,7 +4906,7 @@ const WaitHelper = {
4848
4906
 
4849
4907
  const {getRelativeWorld: getRelativeWorld$1, updateBounds: updateBounds$2} = LeafHelper;
4850
4908
 
4851
- const {toOuterOf: toOuterOf$2, getPoints: getPoints, copy: copy$5} = BoundsHelper;
4909
+ const {toOuterOf: toOuterOf$3, getPoints: getPoints, copy: copy$5} = BoundsHelper;
4852
4910
 
4853
4911
  const localContent = "_localContentBounds";
4854
4912
 
@@ -4871,7 +4929,7 @@ class LeafLayout {
4871
4929
  this._renderBounds = bounds;
4872
4930
  }
4873
4931
  get localContentBounds() {
4874
- toOuterOf$2(this.contentBounds, this.leaf.__localMatrix, this[localContent] || (this[localContent] = {}));
4932
+ toOuterOf$3(this.contentBounds, this.leaf.__localMatrix, this[localContent] || (this[localContent] = {}));
4875
4933
  return this[localContent];
4876
4934
  }
4877
4935
  get localStrokeBounds() {
@@ -4881,15 +4939,15 @@ class LeafLayout {
4881
4939
  return this._localRenderBounds || this;
4882
4940
  }
4883
4941
  get worldContentBounds() {
4884
- toOuterOf$2(this.contentBounds, this.leaf.__world, this[worldContent] || (this[worldContent] = {}));
4942
+ toOuterOf$3(this.contentBounds, this.leaf.__world, this[worldContent] || (this[worldContent] = {}));
4885
4943
  return this[worldContent];
4886
4944
  }
4887
4945
  get worldBoxBounds() {
4888
- toOuterOf$2(this.boxBounds, this.leaf.__world, this[worldBox] || (this[worldBox] = {}));
4946
+ toOuterOf$3(this.boxBounds, this.leaf.__world, this[worldBox] || (this[worldBox] = {}));
4889
4947
  return this[worldBox];
4890
4948
  }
4891
4949
  get worldStrokeBounds() {
4892
- toOuterOf$2(this.strokeBounds, this.leaf.__world, this[worldStroke] || (this[worldStroke] = {}));
4950
+ toOuterOf$3(this.strokeBounds, this.leaf.__world, this[worldStroke] || (this[worldStroke] = {}));
4893
4951
  return this[worldStroke];
4894
4952
  }
4895
4953
  get a() {
@@ -5741,14 +5799,14 @@ const {updateMatrix: updateMatrix$1, updateAllMatrix: updateAllMatrix$2} = LeafH
5741
5799
 
5742
5800
  const {updateBounds: updateBounds$1} = BranchHelper;
5743
5801
 
5744
- const {toOuterOf: toOuterOf$1, copyAndSpread: copyAndSpread$1, copy: copy$4} = BoundsHelper;
5802
+ const {toOuterOf: toOuterOf$2, copyAndSpread: copyAndSpread$2, copy: copy$4} = BoundsHelper;
5745
5803
 
5746
5804
  const {toBounds: toBounds} = PathBounds;
5747
5805
 
5748
5806
  const LeafBounds = {
5749
5807
  __updateWorldBounds() {
5750
5808
  const layout = this.__layout;
5751
- toOuterOf$1(layout.renderBounds, this.__world, this.__world);
5809
+ toOuterOf$2(layout.renderBounds, this.__world, this.__world);
5752
5810
  if (layout.resized) {
5753
5811
  if (layout.resized === "inner") this.__onUpdateSize();
5754
5812
  if (this.__hasLocalEvent) BoundsEvent.emitLocal(this);
@@ -5804,13 +5862,13 @@ const LeafBounds = {
5804
5862
  __updateLocalBoxBounds() {
5805
5863
  if (this.__hasMotionPath) this.__updateMotionPath();
5806
5864
  if (this.__hasAutoLayout) this.__updateAutoLayout();
5807
- toOuterOf$1(this.__layout.boxBounds, this.__local, this.__local);
5865
+ toOuterOf$2(this.__layout.boxBounds, this.__local, this.__local);
5808
5866
  },
5809
5867
  __updateLocalStrokeBounds() {
5810
- toOuterOf$1(this.__layout.strokeBounds, this.__localMatrix, this.__layout.localStrokeBounds);
5868
+ toOuterOf$2(this.__layout.strokeBounds, this.__localMatrix, this.__layout.localStrokeBounds);
5811
5869
  },
5812
5870
  __updateLocalRenderBounds() {
5813
- toOuterOf$1(this.__layout.renderBounds, this.__localMatrix, this.__layout.localRenderBounds);
5871
+ toOuterOf$2(this.__layout.renderBounds, this.__localMatrix, this.__layout.localRenderBounds);
5814
5872
  },
5815
5873
  __updateBoxBounds(_secondLayout, _bounds) {
5816
5874
  const b = this.__layout.boxBounds;
@@ -5848,11 +5906,11 @@ const LeafBounds = {
5848
5906
  },
5849
5907
  __updateStrokeBounds(_bounds) {
5850
5908
  const layout = this.__layout;
5851
- copyAndSpread$1(layout.strokeBounds, layout.boxBounds, layout.strokeBoxSpread);
5909
+ copyAndSpread$2(layout.strokeBounds, layout.boxBounds, layout.strokeBoxSpread);
5852
5910
  },
5853
5911
  __updateRenderBounds(_bounds) {
5854
- const layout = this.__layout;
5855
- layout.renderSpread > 0 ? copyAndSpread$1(layout.renderBounds, layout.boxBounds, layout.renderSpread) : copy$4(layout.renderBounds, layout.strokeBounds);
5912
+ const layout = this.__layout, {renderSpread: renderSpread} = layout;
5913
+ isNumber(renderSpread) && renderSpread <= 0 ? copy$4(layout.renderBounds, layout.strokeBounds) : copyAndSpread$2(layout.renderBounds, layout.boxBounds, renderSpread);
5856
5914
  }
5857
5915
  };
5858
5916
 
@@ -5861,6 +5919,7 @@ const LeafRender = {
5861
5919
  if (options.shape) return this.__renderShape(canvas, options);
5862
5920
  if (this.__worldOpacity) {
5863
5921
  const data = this.__;
5922
+ if (data.bright && !options.topRendering) return options.topList.add(this);
5864
5923
  canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
5865
5924
  canvas.opacity = options.dimOpacity && !data.dimskip ? data.opacity * options.dimOpacity : data.opacity;
5866
5925
  if (this.__.__single) {
@@ -5909,7 +5968,9 @@ const BranchRender = {
5909
5968
  this.__nowWorld = this.__getNowWorld(options);
5910
5969
  if (this.__worldOpacity) {
5911
5970
  const data = this.__;
5912
- if (data.dim) options.dimOpacity = data.dim === true ? .2 : data.dim; else if (data.dimskip) options.dimOpacity && (options.dimOpacity = 0);
5971
+ if (data.__useDim) {
5972
+ if (data.dim) options.dimOpacity = data.dim === true ? .2 : data.dim; else if (data.bright && !options.topRendering) return options.topList.add(this); else if (data.dimskip) options.dimOpacity && (options.dimOpacity = 0);
5973
+ }
5913
5974
  if (data.__single && !this.isBranchLeaf) {
5914
5975
  if (data.eraser === "path") return this.__renderEraser(canvas, options);
5915
5976
  const tempCanvas = canvas.getSameCanvas(false, true);
@@ -5947,11 +6008,13 @@ const tempScaleData$1 = {};
5947
6008
 
5948
6009
  const {LEAF: LEAF, create: create} = IncrementId;
5949
6010
 
6011
+ const {stintSet: stintSet$3} = DataHelper;
6012
+
5950
6013
  const {toInnerPoint: toInnerPoint, toOuterPoint: toOuterPoint, multiplyParent: multiplyParent$1} = MatrixHelper;
5951
6014
 
5952
- const {toOuterOf: toOuterOf} = BoundsHelper;
6015
+ const {toOuterOf: toOuterOf$1} = BoundsHelper;
5953
6016
 
5954
- const {copy: copy$3, move: move} = PointHelper;
6017
+ const {copy: copy$3, move: move$2} = PointHelper;
5955
6018
 
5956
6019
  const {moveLocal: moveLocal, zoomOfLocal: zoomOfLocal, rotateOfLocal: rotateOfLocal, skewOfLocal: skewOfLocal, moveWorld: moveWorld, zoomOfWorld: zoomOfWorld, rotateOfWorld: rotateOfWorld, skewOfWorld: skewOfWorld, transform: transform, transformWorld: transformWorld, setTransform: setTransform, getFlipTransform: getFlipTransform, getLocalOrigin: getLocalOrigin, getRelativeWorld: getRelativeWorld, drop: drop} = LeafHelper;
5957
6020
 
@@ -6227,8 +6290,9 @@ let Leaf = class Leaf {
6227
6290
  if (!this.__cameraWorld) this.__cameraWorld = {};
6228
6291
  const cameraWorld = this.__cameraWorld, world = this.__world;
6229
6292
  multiplyParent$1(world, options.matrix, cameraWorld, undefined, world);
6230
- toOuterOf(this.__layout.renderBounds, cameraWorld, cameraWorld);
6231
- cameraWorld.half !== world.half && (cameraWorld.half = world.half);
6293
+ toOuterOf$1(this.__layout.renderBounds, cameraWorld, cameraWorld);
6294
+ stintSet$3(cameraWorld, "half", world.half);
6295
+ stintSet$3(cameraWorld, "ignorePixelSnap", world.ignorePixelSnap);
6232
6296
  return cameraWorld;
6233
6297
  } else {
6234
6298
  return this.__world;
@@ -6262,7 +6326,7 @@ let Leaf = class Leaf {
6262
6326
  getWorldBounds(inner, relative, change) {
6263
6327
  const matrix = relative ? getRelativeWorld(this, relative) : this.worldTransform;
6264
6328
  const to = change ? inner : {};
6265
- toOuterOf(inner, matrix, to);
6329
+ toOuterOf$1(inner, matrix, to);
6266
6330
  return to;
6267
6331
  }
6268
6332
  worldToLocal(world, to, distance, relative) {
@@ -6295,7 +6359,7 @@ let Leaf = class Leaf {
6295
6359
  }
6296
6360
  getBoxPointByInner(inner, _relative, _distance, change) {
6297
6361
  const point = change ? inner : Object.assign({}, inner), {x: x, y: y} = this.boxBounds;
6298
- move(point, -x, -y);
6362
+ move$2(point, -x, -y);
6299
6363
  return point;
6300
6364
  }
6301
6365
  getInnerPoint(world, relative, distance, change) {
@@ -6305,7 +6369,7 @@ let Leaf = class Leaf {
6305
6369
  }
6306
6370
  getInnerPointByBox(box, _relative, _distance, change) {
6307
6371
  const point = change ? box : Object.assign({}, box), {x: x, y: y} = this.boxBounds;
6308
- move(point, x, y);
6372
+ move$2(point, x, y);
6309
6373
  return point;
6310
6374
  }
6311
6375
  getInnerPointByLocal(local, _relative, distance, change) {
@@ -6751,7 +6815,7 @@ class LeafLevelList {
6751
6815
  }
6752
6816
  }
6753
6817
 
6754
- const version = "1.9.6";
6818
+ const version = "1.9.8";
6755
6819
 
6756
6820
  class LeaferCanvas extends LeaferCanvasBase {
6757
6821
  get allowBackgroundColor() {
@@ -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
  };
@@ -7734,6 +7802,15 @@ Object.assign(Creator, {
7734
7802
 
7735
7803
  Platform.layout = Layouter.fullLayout;
7736
7804
 
7805
+ Platform.render = function(target, canvas, options) {
7806
+ const topOptions = Object.assign(Object.assign({}, options), {
7807
+ topRendering: true
7808
+ });
7809
+ options.topList = new LeafList;
7810
+ target.__render(canvas, options);
7811
+ if (options.topList.length) options.topList.forEach(item => item.__render(canvas, topOptions));
7812
+ };
7813
+
7737
7814
  function effectType(defaultValue) {
7738
7815
  return decorateLeafAttr(defaultValue, key => attr({
7739
7816
  set(value) {
@@ -8133,39 +8210,41 @@ class CanvasData extends RectData {
8133
8210
  }
8134
8211
  }
8135
8212
 
8213
+ const {max: max$2, add: add$1} = FourNumberHelper;
8214
+
8136
8215
  const UIBounds = {
8137
8216
  __updateStrokeSpread() {
8138
- let width = 0, boxWidth = 0;
8217
+ let spread = 0, boxSpread = 0;
8139
8218
  const data = this.__, {strokeAlign: strokeAlign, __maxStrokeWidth: strokeWidth} = data, box = this.__box;
8140
8219
  if ((data.stroke || data.hitStroke === "all") && strokeWidth && strokeAlign !== "inside") {
8141
- boxWidth = width = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
8220
+ boxSpread = spread = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
8142
8221
  if (!data.__boxStroke) {
8143
- const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * width;
8222
+ const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * spread;
8144
8223
  const storkeCapAddWidth = data.strokeCap === "none" ? 0 : strokeWidth;
8145
- width += Math.max(miterLimitAddWidth, storkeCapAddWidth);
8224
+ spread += Math.max(miterLimitAddWidth, storkeCapAddWidth);
8146
8225
  }
8147
8226
  }
8148
- if (data.__useArrow) width += strokeWidth * 5;
8227
+ if (data.__useArrow) spread += strokeWidth * 5;
8149
8228
  if (box) {
8150
- width = Math.max(box.__layout.strokeSpread = box.__updateStrokeSpread(), width);
8151
- boxWidth = box.__layout.strokeBoxSpread;
8229
+ spread = max$2(spread, box.__layout.strokeSpread = box.__updateStrokeSpread());
8230
+ boxSpread = Math.max(boxSpread, box.__layout.strokeBoxSpread);
8152
8231
  }
8153
- this.__layout.strokeBoxSpread = boxWidth;
8154
- return width;
8232
+ this.__layout.strokeBoxSpread = boxSpread;
8233
+ return spread;
8155
8234
  },
8156
8235
  __updateRenderSpread() {
8157
- let width = 0;
8158
- const {shadow: shadow, innerShadow: innerShadow, blur: blur, backgroundBlur: backgroundBlur, filter: filter, renderSpread: renderSpread} = this.__;
8159
- if (shadow) width = Effect.getShadowSpread(this, shadow);
8160
- if (blur) width = Math.max(width, blur);
8161
- if (filter) width += Filter.getSpread(filter);
8162
- if (renderSpread) width += renderSpread;
8163
- let shapeWidth = width = Math.ceil(width);
8164
- 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));
8165
- if (backgroundBlur) shapeWidth = Math.max(shapeWidth, backgroundBlur);
8166
- this.__layout.renderShapeSpread = shapeWidth;
8167
- width += this.__layout.strokeSpread || 0;
8168
- return this.__box ? Math.max(this.__box.__updateRenderSpread(), width) : width;
8236
+ let spread = 0;
8237
+ const {shadow: shadow, innerShadow: innerShadow, blur: blur, backgroundBlur: backgroundBlur, filter: filter, renderSpread: renderSpread} = this.__, {strokeSpread: strokeSpread} = this.__layout, box = this.__box;
8238
+ if (shadow) spread = Effect.getShadowRenderSpread(this, shadow);
8239
+ if (blur) spread = max$2(spread, blur);
8240
+ if (filter) spread = add$1(spread, Filter.getSpread(filter));
8241
+ if (renderSpread) spread = add$1(spread, renderSpread);
8242
+ if (strokeSpread) spread = add$1(spread, strokeSpread);
8243
+ let shapeSpread = spread;
8244
+ if (innerShadow) shapeSpread = max$2(shapeSpread, Effect.getInnerShadowSpread(this, innerShadow));
8245
+ if (backgroundBlur) shapeSpread = max$2(shapeSpread, backgroundBlur);
8246
+ this.__layout.renderShapeSpread = shapeSpread;
8247
+ return box ? max$2(box.__updateRenderSpread(), spread) : spread;
8169
8248
  }
8170
8249
  };
8171
8250
 
@@ -8509,9 +8588,9 @@ __decorate([ visibleType(true) ], UI.prototype, "visible", void 0);
8509
8588
 
8510
8589
  __decorate([ surfaceType(false) ], UI.prototype, "locked", void 0);
8511
8590
 
8512
- __decorate([ surfaceType(false) ], UI.prototype, "dim", void 0);
8591
+ __decorate([ dimType(false) ], UI.prototype, "dim", void 0);
8513
8592
 
8514
- __decorate([ surfaceType(false) ], UI.prototype, "dimskip", void 0);
8593
+ __decorate([ dimType(false) ], UI.prototype, "dimskip", void 0);
8515
8594
 
8516
8595
  __decorate([ sortType(0) ], UI.prototype, "zIndex", void 0);
8517
8596
 
@@ -9476,7 +9555,7 @@ __decorate([ resizeType() ], Canvas.prototype, "contextSettings", void 0);
9476
9555
 
9477
9556
  Canvas = __decorate([ registerUI() ], Canvas);
9478
9557
 
9479
- const {copyAndSpread: copyAndSpread, includes: includes, spread: spread, setList: setList} = BoundsHelper;
9558
+ const {copyAndSpread: copyAndSpread$1, includes: includes, spread: spread, setList: setList} = BoundsHelper;
9480
9559
 
9481
9560
  let Text = class Text extends UI {
9482
9561
  get __tag() {
@@ -9523,13 +9602,13 @@ let Text = class Text extends UI {
9523
9602
  if (this.isOverflow) setList(data.__textBoxBounds = {}, [ b, contentBounds ]), layout.renderChanged = true; else data.__textBoxBounds = b;
9524
9603
  }
9525
9604
  __updateRenderSpread() {
9526
- let width = super.__updateRenderSpread();
9527
- if (!width) width = this.isOverflow ? 1 : 0;
9528
- return width;
9605
+ let spread = super.__updateRenderSpread();
9606
+ if (!spread) spread = this.isOverflow ? 1 : 0;
9607
+ return spread;
9529
9608
  }
9530
9609
  __updateRenderBounds() {
9531
9610
  const {renderBounds: renderBounds, renderSpread: renderSpread} = this.__layout;
9532
- copyAndSpread(renderBounds, this.__.__textBoxBounds, renderSpread);
9611
+ copyAndSpread$1(renderBounds, this.__.__textBoxBounds, renderSpread);
9533
9612
  if (this.__box) this.__box.__layout.renderBounds = renderBounds;
9534
9613
  }
9535
9614
  __updateChange() {
@@ -9955,9 +10034,9 @@ let DragEvent = class DragEvent extends PointerEvent {
9955
10034
  static setData(data) {
9956
10035
  this.data = data;
9957
10036
  }
9958
- static getValidMove(leaf, start, total, checkLimit = true) {
9959
- const move = leaf.getLocalPoint(total, null, true);
9960
- PointHelper.move(move, start.x - leaf.x, start.y - leaf.y);
10037
+ static getValidMove(leaf, localStart, worldTotal, checkLimit = true) {
10038
+ const move = leaf.getLocalPoint(worldTotal, null, true);
10039
+ PointHelper.move(move, localStart.x - leaf.x, localStart.y - leaf.y);
9961
10040
  if (checkLimit) this.limitMove(leaf, move);
9962
10041
  DragBoundsHelper.axisMove(leaf, move);
9963
10042
  return move;
@@ -10987,8 +11066,8 @@ ui$1.__updateHitCanvas = function() {
10987
11066
  if (isHitPixel) {
10988
11067
  const {renderBounds: renderBounds} = this.__layout;
10989
11068
  const size = Platform.image.hitCanvasSize;
10990
- const scale = h.hitScale = tempBounds$1.set(0, 0, size, size).getFitMatrix(renderBounds).a;
10991
- const {x: x, y: y, width: width, height: height} = tempBounds$1.set(renderBounds).scale(scale);
11069
+ const scale = h.hitScale = tempBounds$2.set(0, 0, size, size).getFitMatrix(renderBounds).a;
11070
+ const {x: x, y: y, width: width, height: height} = tempBounds$2.set(renderBounds).scale(scale);
10992
11071
  h.resize({
10993
11072
  width: width,
10994
11073
  height: height,
@@ -11085,8 +11164,8 @@ canvas.hitStroke = function(point, strokeWidth) {
11085
11164
  canvas.hitPixel = function(radiusPoint, offset, scale = 1) {
11086
11165
  let {x: x, y: y, radiusX: radiusX, radiusY: radiusY} = radiusPoint;
11087
11166
  if (offset) x -= offset.x, y -= offset.y;
11088
- tempBounds$1.set(x - radiusX, y - radiusY, radiusX * 2, radiusY * 2).scale(scale).ceil();
11089
- const {data: data} = this.context.getImageData(tempBounds$1.x, tempBounds$1.y, tempBounds$1.width || 1, tempBounds$1.height || 1);
11167
+ tempBounds$2.set(x - radiusX, y - radiusY, radiusX * 2, radiusY * 2).scale(scale).ceil();
11168
+ const {data: data} = this.context.getImageData(tempBounds$2.x, tempBounds$2.y, tempBounds$2.width || 1, tempBounds$2.height || 1);
11090
11169
  for (let i = 0, len = data.length; i < len; i += 4) {
11091
11170
  if (data[i + 3] > 0) return true;
11092
11171
  }
@@ -11398,24 +11477,29 @@ function drawOutside(stroke, ui, canvas) {
11398
11477
  }
11399
11478
  }
11400
11479
 
11401
- const {getSpread: getSpread, getOuterOf: getOuterOf, getByMove: getByMove, getIntersectData: getIntersectData} = BoundsHelper;
11480
+ const {getSpread: getSpread, copyAndSpread: copyAndSpread, toOuterOf: toOuterOf, getOuterOf: getOuterOf, getByMove: getByMove, move: move$1, getIntersectData: getIntersectData} = BoundsHelper;
11481
+
11482
+ const tempBounds$1 = {};
11402
11483
 
11403
11484
  function shape(ui, current, options) {
11404
11485
  const canvas = current.getSameCanvas();
11405
- const nowWorld = ui.__nowWorld, currentBounds = current.bounds;
11406
- let bounds, matrix, fitMatrix, shapeBounds, worldCanvas;
11486
+ const currentBounds = current.bounds, nowWorld = ui.__nowWorld, layout = ui.__layout;
11487
+ const nowWorldShapeBounds = ui.__nowWorldShapeBounds || (ui.__nowWorldShapeBounds = {});
11488
+ toOuterOf(layout.strokeSpread ? (copyAndSpread(tempBounds$1, layout.boxBounds, layout.strokeSpread),
11489
+ tempBounds$1) : layout.boxBounds, nowWorld, nowWorldShapeBounds);
11490
+ let bounds, renderBounds, matrix, fitMatrix, shapeBounds, worldCanvas;
11407
11491
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true);
11408
- if (currentBounds.includes(nowWorld)) {
11492
+ if (currentBounds.includes(nowWorldShapeBounds)) {
11409
11493
  worldCanvas = canvas;
11410
- bounds = shapeBounds = nowWorld;
11494
+ bounds = shapeBounds = nowWorldShapeBounds;
11495
+ renderBounds = nowWorld;
11411
11496
  } else {
11412
- const {renderShapeSpread: spread} = ui.__layout;
11413
11497
  let worldClipBounds;
11414
11498
  if (Platform.fullImageShadow) {
11415
- worldClipBounds = nowWorld;
11499
+ worldClipBounds = nowWorldShapeBounds;
11416
11500
  } else {
11417
- const spreadBounds = spread ? getSpread(currentBounds, scaleX === scaleY ? spread * scaleX : [ spread * scaleY, spread * scaleX ]) : currentBounds;
11418
- worldClipBounds = getIntersectData(spreadBounds, nowWorld);
11501
+ const spreadBounds = layout.renderShapeSpread ? getSpread(currentBounds, FourNumberHelper.swapAndScale(layout.renderShapeSpread, scaleX, scaleY)) : currentBounds;
11502
+ worldClipBounds = getIntersectData(spreadBounds, nowWorldShapeBounds);
11419
11503
  }
11420
11504
  fitMatrix = currentBounds.getFitMatrix(worldClipBounds);
11421
11505
  let {a: fitScaleX, d: fitScaleY} = fitMatrix;
@@ -11425,8 +11509,10 @@ function shape(ui, current, options) {
11425
11509
  scaleX *= fitScaleX;
11426
11510
  scaleY *= fitScaleY;
11427
11511
  }
11428
- shapeBounds = getOuterOf(nowWorld, fitMatrix);
11512
+ shapeBounds = getOuterOf(nowWorldShapeBounds, fitMatrix);
11429
11513
  bounds = getByMove(shapeBounds, -fitMatrix.e, -fitMatrix.f);
11514
+ renderBounds = getOuterOf(nowWorld, fitMatrix);
11515
+ move$1(renderBounds, -fitMatrix.e, -fitMatrix.f);
11430
11516
  const userMatrix = options.matrix;
11431
11517
  if (userMatrix) {
11432
11518
  matrix = new Matrix(fitMatrix);
@@ -11445,6 +11531,7 @@ function shape(ui, current, options) {
11445
11531
  matrix: matrix,
11446
11532
  fitMatrix: fitMatrix,
11447
11533
  bounds: bounds,
11534
+ renderBounds: renderBounds,
11448
11535
  worldCanvas: worldCanvas,
11449
11536
  shapeBounds: shapeBounds,
11450
11537
  scaleX: scaleX,
@@ -11548,7 +11635,7 @@ const PaintModule = {
11548
11635
  shape: shape
11549
11636
  };
11550
11637
 
11551
- let origin = {}, tempMatrix = getMatrixData();
11638
+ let origin = {}, tempMatrix$1 = getMatrixData();
11552
11639
 
11553
11640
  const {get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, multiplyParent: multiplyParent, scale: scaleHelper, rotate: rotate, skew: skewHelper} = MatrixHelper;
11554
11641
 
@@ -11563,12 +11650,12 @@ function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
11563
11650
  data.transform = transform;
11564
11651
  }
11565
11652
 
11566
- function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipSize) {
11653
+ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipScaleX, clipScaleY) {
11567
11654
  const transform = get$3();
11568
11655
  layout(transform, box, x, y, scaleX, scaleY, rotation, skew);
11569
- if (clipSize) {
11570
- tempMatrix.a = box.width / clipSize.width, tempMatrix.d = box.height / clipSize.height;
11571
- multiplyParent(transform, tempMatrix);
11656
+ if (clipScaleX) {
11657
+ tempMatrix$1.a = clipScaleX, tempMatrix$1.d = clipScaleY;
11658
+ multiplyParent(transform, tempMatrix$1);
11572
11659
  }
11573
11660
  data.transform = transform;
11574
11661
  }
@@ -11669,7 +11756,12 @@ function getPatternData(paint, box, image) {
11669
11756
 
11670
11757
  case "normal":
11671
11758
  case "clip":
11672
- if (tempImage.x || tempImage.y || scaleX || clipSize || rotation || skew) clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, paint.clipSize);
11759
+ if (tempImage.x || tempImage.y || scaleX || clipSize || rotation || skew) {
11760
+ let clipScaleX, clipScaleY;
11761
+ if (clipSize) clipScaleX = box.width / clipSize.width, clipScaleY = box.height / clipSize.height;
11762
+ clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, clipScaleX, clipScaleY);
11763
+ if (clipScaleX) scaleX = scaleX ? scaleX * clipScaleX : scaleX, scaleY = scaleY ? scaleY * clipScaleY : clipScaleY;
11764
+ }
11673
11765
  break;
11674
11766
 
11675
11767
  case "repeat":
@@ -11827,7 +11919,7 @@ function ignoreRender(ui, value) {
11827
11919
 
11828
11920
  const {get: get$1, scale: scale, copy: copy$1} = MatrixHelper;
11829
11921
 
11830
- const {floor: floor, ceil: ceil, max: max, abs: abs} = Math;
11922
+ const {floor: floor, ceil: ceil, max: max$1, abs: abs} = Math;
11831
11923
 
11832
11924
  function createPattern(ui, paint, pixelRatio) {
11833
11925
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true, paint.scaleFixed);
@@ -11876,8 +11968,8 @@ function createPattern(ui, paint, pixelRatio) {
11876
11968
  if (transform || scaleX !== 1 || scaleY !== 1) {
11877
11969
  const canvasWidth = width + (xGap || 0);
11878
11970
  const canvasHeight = height + (yGap || 0);
11879
- scaleX /= canvasWidth / max(floor(canvasWidth), 1);
11880
- scaleY /= canvasHeight / max(floor(canvasHeight), 1);
11971
+ scaleX /= canvasWidth / max$1(floor(canvasWidth), 1);
11972
+ scaleY /= canvasHeight / max$1(floor(canvasHeight), 1);
11881
11973
  if (!imageMatrix) {
11882
11974
  imageMatrix = get$1();
11883
11975
  if (transform) copy$1(imageMatrix, transform);
@@ -11903,17 +11995,15 @@ function checkImage(ui, canvas, paint, allowDraw) {
11903
11995
  if (allowDraw) {
11904
11996
  if (data.repeat) {
11905
11997
  allowDraw = false;
11906
- } else {
11907
- if (!(paint.changeful || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || Export.running)) {
11908
- let {width: width, height: height} = data;
11909
- width *= scaleX * pixelRatio;
11910
- height *= scaleY * pixelRatio;
11911
- if (data.scaleX) {
11912
- width *= data.scaleX;
11913
- height *= data.scaleY;
11914
- }
11915
- allowDraw = width * height > Platform.image.maxCacheSize;
11998
+ } else if (!(paint.changeful || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || Export.running)) {
11999
+ let {width: width, height: height} = data;
12000
+ width *= scaleX * pixelRatio;
12001
+ height *= scaleY * pixelRatio;
12002
+ if (data.scaleX) {
12003
+ width *= data.scaleX;
12004
+ height *= data.scaleY;
11916
12005
  }
12006
+ allowDraw = width * height > Platform.image.maxCacheSize;
11917
12007
  }
11918
12008
  }
11919
12009
  if (allowDraw) {
@@ -12093,20 +12183,20 @@ const PaintGradientModule = {
12093
12183
  getTransform: getTransform
12094
12184
  };
12095
12185
 
12096
- const {copy: copy, toOffsetOutBounds: toOffsetOutBounds$1} = BoundsHelper;
12186
+ const {copy: copy, move: move, toOffsetOutBounds: toOffsetOutBounds$1} = BoundsHelper, {max: max} = Math;
12097
12187
 
12098
- const tempBounds = {};
12188
+ const tempBounds = {}, tempMatrix = new Matrix;
12099
12189
 
12100
12190
  const offsetOutBounds$1 = {};
12101
12191
 
12102
12192
  function shadow(ui, current, shape) {
12103
- let copyBounds, spreadScale;
12104
- const {__nowWorld: nowWorld, __layout: __layout} = ui;
12193
+ let copyBounds, transform;
12194
+ const {__nowWorld: nowWorld} = ui;
12105
12195
  const {shadow: shadow} = ui.__;
12106
- const {worldCanvas: worldCanvas, bounds: bounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
12196
+ const {worldCanvas: worldCanvas, bounds: bounds, renderBounds: renderBounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
12107
12197
  const other = current.getSameCanvas();
12108
12198
  const end = shadow.length - 1;
12109
- toOffsetOutBounds$1(bounds, offsetOutBounds$1);
12199
+ toOffsetOutBounds$1(bounds, offsetOutBounds$1, renderBounds);
12110
12200
  shadow.forEach((item, index) => {
12111
12201
  let otherScale = 1;
12112
12202
  if (item.scaleFixed) {
@@ -12114,54 +12204,61 @@ function shadow(ui, current, shape) {
12114
12204
  if (sx > 1) otherScale = 1 / sx;
12115
12205
  }
12116
12206
  other.setWorldShadow(offsetOutBounds$1.offsetX + item.x * scaleX * otherScale, offsetOutBounds$1.offsetY + item.y * scaleY * otherScale, item.blur * scaleX * otherScale, ColorConvert.string(item.color));
12117
- spreadScale = item.spread ? 1 + item.spread * 2 / (__layout.boxBounds.width + (__layout.strokeBoxSpread || 0) * 2) * otherScale : 0;
12118
- drawWorldShadow(other, offsetOutBounds$1, spreadScale, shape);
12119
- copyBounds = bounds;
12207
+ transform = getShadowTransform(ui, other, shape, item, offsetOutBounds$1, otherScale);
12208
+ if (transform) other.setTransform(transform);
12209
+ drawWorldShadow(other, offsetOutBounds$1, shape);
12210
+ if (transform) other.resetTransform();
12211
+ copyBounds = renderBounds;
12120
12212
  if (item.box) {
12121
12213
  other.restore();
12122
12214
  other.save();
12123
12215
  if (worldCanvas) {
12124
- other.copyWorld(other, bounds, nowWorld, "copy");
12216
+ other.copyWorld(other, renderBounds, nowWorld, "copy");
12125
12217
  copyBounds = nowWorld;
12126
12218
  }
12127
12219
  worldCanvas ? other.copyWorld(worldCanvas, nowWorld, nowWorld, "destination-out") : other.copyWorld(shape.canvas, shapeBounds, bounds, "destination-out");
12128
12220
  }
12129
- if (Effect.isTransformShadow(item)) Effect.renderTransformShadow(ui, current, other, copyBounds, item); else LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
12221
+ LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
12130
12222
  if (end && index < end) other.clearWorld(copyBounds);
12131
12223
  });
12132
12224
  other.recycle(copyBounds);
12133
12225
  }
12134
12226
 
12135
- function getShadowSpread(_ui, shadow) {
12136
- let width = 0;
12137
- 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));
12138
- return width;
12227
+ function getShadowRenderSpread(_ui, shadow) {
12228
+ let top = 0, right = 0, bottom = 0, left = 0, x, y, spread, blur;
12229
+ shadow.forEach(item => {
12230
+ x = item.x || 0, y = item.y || 0, spread = item.spread || 0, blur = (item.blur || 0) * 1.5;
12231
+ top = max(top, spread + blur - y);
12232
+ right = max(right, spread + blur + x);
12233
+ bottom = max(bottom, spread + blur + y);
12234
+ left = max(left, spread + blur - x);
12235
+ });
12236
+ return top === right && right === bottom && bottom === left ? top : [ top, right, bottom, left ];
12237
+ }
12238
+
12239
+ function getShadowTransform(ui, canvas, _shape, shadow, outBounds, otherScale, isInnerShaodw) {
12240
+ if (shadow.spread) {
12241
+ const spreadScale = 1 + shadow.spread * 2 / ui.__layout.strokeBounds.width * otherScale * (isInnerShaodw ? -1 : 1);
12242
+ tempMatrix.set().scaleOfOuter({
12243
+ x: (outBounds.x + outBounds.width / 2) * canvas.pixelRatio,
12244
+ y: (outBounds.y + outBounds.height / 2) * canvas.pixelRatio
12245
+ }, spreadScale);
12246
+ return tempMatrix;
12247
+ }
12248
+ return undefined;
12139
12249
  }
12140
12250
 
12141
- function drawWorldShadow(canvas, outBounds, spreadScale, shape) {
12142
- const {bounds: bounds, shapeBounds: shapeBounds} = shape;
12251
+ function drawWorldShadow(canvas, outBounds, shape) {
12252
+ const {shapeBounds: shapeBounds} = shape;
12253
+ let from, to;
12143
12254
  if (Platform.fullImageShadow) {
12144
12255
  copy(tempBounds, canvas.bounds);
12145
- tempBounds.x += outBounds.x - shapeBounds.x;
12146
- tempBounds.y += outBounds.y - shapeBounds.y;
12147
- if (spreadScale) {
12148
- const {fitMatrix: fitMatrix} = shape;
12149
- tempBounds.x -= (bounds.x + (fitMatrix ? fitMatrix.e : 0) + bounds.width / 2) * (spreadScale - 1);
12150
- tempBounds.y -= (bounds.y + (fitMatrix ? fitMatrix.f : 0) + bounds.height / 2) * (spreadScale - 1);
12151
- tempBounds.width *= spreadScale;
12152
- tempBounds.height *= spreadScale;
12153
- }
12154
- canvas.copyWorld(shape.canvas, canvas.bounds, tempBounds);
12256
+ move(tempBounds, outBounds.x - shapeBounds.x, outBounds.y - shapeBounds.y);
12257
+ from = canvas.bounds, to = tempBounds;
12155
12258
  } else {
12156
- if (spreadScale) {
12157
- copy(tempBounds, outBounds);
12158
- tempBounds.x -= outBounds.width / 2 * (spreadScale - 1);
12159
- tempBounds.y -= outBounds.height / 2 * (spreadScale - 1);
12160
- tempBounds.width *= spreadScale;
12161
- tempBounds.height *= spreadScale;
12162
- }
12163
- canvas.copyWorld(shape.canvas, shapeBounds, spreadScale ? tempBounds : outBounds);
12259
+ from = shapeBounds, to = outBounds;
12164
12260
  }
12261
+ canvas.copyWorld(shape.canvas, from, to);
12165
12262
  }
12166
12263
 
12167
12264
  const {toOffsetOutBounds: toOffsetOutBounds} = BoundsHelper;
@@ -12169,13 +12266,13 @@ const {toOffsetOutBounds: toOffsetOutBounds} = BoundsHelper;
12169
12266
  const offsetOutBounds = {};
12170
12267
 
12171
12268
  function innerShadow(ui, current, shape) {
12172
- let copyBounds, spreadScale;
12173
- const {__nowWorld: nowWorld, __layout: __layout} = ui;
12269
+ let copyBounds, transform;
12270
+ const {__nowWorld: nowWorld} = ui;
12174
12271
  const {innerShadow: innerShadow} = ui.__;
12175
- const {worldCanvas: worldCanvas, bounds: bounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
12272
+ const {worldCanvas: worldCanvas, bounds: bounds, renderBounds: renderBounds, shapeBounds: shapeBounds, scaleX: scaleX, scaleY: scaleY} = shape;
12176
12273
  const other = current.getSameCanvas();
12177
12274
  const end = innerShadow.length - 1;
12178
- toOffsetOutBounds(bounds, offsetOutBounds);
12275
+ toOffsetOutBounds(bounds, offsetOutBounds, renderBounds);
12179
12276
  innerShadow.forEach((item, index) => {
12180
12277
  let otherScale = 1;
12181
12278
  if (item.scaleFixed) {
@@ -12184,16 +12281,17 @@ function innerShadow(ui, current, shape) {
12184
12281
  }
12185
12282
  other.save();
12186
12283
  other.setWorldShadow(offsetOutBounds.offsetX + item.x * scaleX * otherScale, offsetOutBounds.offsetY + item.y * scaleY * otherScale, item.blur * scaleX * otherScale);
12187
- spreadScale = item.spread ? 1 - item.spread * 2 / (__layout.boxBounds.width + (__layout.strokeBoxSpread || 0) * 2) * otherScale : 0;
12188
- drawWorldShadow(other, offsetOutBounds, spreadScale, shape);
12284
+ transform = getShadowTransform(ui, other, shape, item, offsetOutBounds, otherScale, true);
12285
+ if (transform) other.setTransform(transform);
12286
+ drawWorldShadow(other, offsetOutBounds, shape);
12189
12287
  other.restore();
12190
12288
  if (worldCanvas) {
12191
- other.copyWorld(other, bounds, nowWorld, "copy");
12289
+ other.copyWorld(other, renderBounds, nowWorld, "copy");
12192
12290
  other.copyWorld(worldCanvas, nowWorld, nowWorld, "source-out");
12193
12291
  copyBounds = nowWorld;
12194
12292
  } else {
12195
12293
  other.copyWorld(shape.canvas, shapeBounds, bounds, "source-out");
12196
- copyBounds = bounds;
12294
+ copyBounds = renderBounds;
12197
12295
  }
12198
12296
  other.fillWorld(copyBounds, ColorConvert.string(item.color), "source-in");
12199
12297
  LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
@@ -12202,6 +12300,8 @@ function innerShadow(ui, current, shape) {
12202
12300
  other.recycle(copyBounds);
12203
12301
  }
12204
12302
 
12303
+ const getInnerShadowSpread = getShadowRenderSpread;
12304
+
12205
12305
  function blur(ui, current, origin) {
12206
12306
  const {blur: blur} = ui.__;
12207
12307
  origin.setWorldBlur(blur * ui.__nowWorld.a);
@@ -12216,10 +12316,12 @@ const EffectModule = {
12216
12316
  innerShadow: innerShadow,
12217
12317
  blur: blur,
12218
12318
  backgroundBlur: backgroundBlur,
12219
- getShadowSpread: getShadowSpread,
12319
+ getShadowRenderSpread: getShadowRenderSpread,
12320
+ getShadowTransform: getShadowTransform,
12220
12321
  isTransformShadow(_shadow) {
12221
12322
  return undefined;
12222
- }
12323
+ },
12324
+ getInnerShadowSpread: getInnerShadowSpread
12223
12325
  };
12224
12326
 
12225
12327
  const {excludeRenderBounds: excludeRenderBounds} = LeafBoundsHelper;
@@ -12236,6 +12338,7 @@ Group.prototype.__renderMask = function(canvas, options) {
12236
12338
  maskEnd(this, currentMask, canvas, contentCanvas, maskCanvas, maskOpacity, undefined, true);
12237
12339
  maskCanvas = contentCanvas = null;
12238
12340
  }
12341
+ if (mask === "clipping" || mask === "clipping-path") excludeRenderBounds(child, options) || child.__render(canvas, options);
12239
12342
  maskOpacity = child.__.opacity;
12240
12343
  usedGrayscaleAlpha = false;
12241
12344
  if (mask === "path" || mask === "clipping-path") {
@@ -12253,7 +12356,6 @@ Group.prototype.__renderMask = function(canvas, options) {
12253
12356
  if (!contentCanvas) contentCanvas = getCanvas(canvas);
12254
12357
  child.__render(maskCanvas, options);
12255
12358
  }
12256
- if (mask === "clipping" || mask === "clipping-path") excludeRenderBounds(child, options) || child.__render(canvas, options);
12257
12359
  continue;
12258
12360
  }
12259
12361
  const childBlendMode = maskOpacity === 1 && child.__.__blendMode;
@@ -12855,4 +12957,4 @@ try {
12855
12957
  if (wx) useCanvas("miniapp", wx);
12856
12958
  } catch (_a) {}
12857
12959
 
12858
- export { AlignHelper, Answer, App, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragBoundsHelper, DragEvent, Dragger, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, Frame, FrameData, Group, GroupData, HitCanvasManager, Image, ImageData, ImageEvent, ImageManager, IncrementId, Interaction, InteractionBase, InteractionHelper, KeyEvent, Keyboard, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, Line, LineData, MathHelper, Matrix, MatrixHelper, MoveEvent, MyDragEvent, MyImage, MyPointerEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Picker, Platform, Plugin, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, RotateEvent, Run, Selector, Star, StarData, State, StringNumberMap, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, ZoomEvent, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, createAttr, createDescriptor, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, doBoundsType, doStrokeType, effectType, emptyData, eraserType, extraPropertyEventMap, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isArray, isData, isEmptyData, isFinite, isNull, isNumber, isObject, isString, isUndefined, layoutProcessor, leaferTransformAttrMap, maskType, naturalBoundsType, opacityType, path, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, scrollType, sortType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix$1 as tempMatrix, tempPoint$2 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };
12960
+ export { AlignHelper, Answer, App, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragBoundsHelper, DragEvent, Dragger, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, FourNumberHelper, Frame, FrameData, Group, GroupData, HitCanvasManager, Image, ImageData, ImageEvent, ImageManager, IncrementId, Interaction, InteractionBase, InteractionHelper, KeyEvent, Keyboard, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, Line, LineData, MathHelper, Matrix, MatrixHelper, MoveEvent, MyDragEvent, MyImage, MyPointerEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Picker, Platform, Plugin, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, RotateEvent, Run, Selector, Star, StarData, State, StringNumberMap, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, ZoomEvent, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, createAttr, createDescriptor, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, dimType, doBoundsType, doStrokeType, effectType, emptyData, eraserType, extraPropertyEventMap, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isArray, isData, isEmptyData, isFinite, isNull, isNumber, isObject, isString, isUndefined, layoutProcessor, leaferTransformAttrMap, maskType, naturalBoundsType, opacityType, path, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, scrollType, sortType, strokeType, surfaceType, tempBounds$2 as tempBounds, tempMatrix$2 as tempMatrix, tempPoint$2 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };