@leafer/miniapp 1.9.7 → 1.9.9

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$6, pow: pow$2, PI: PI$4} = 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$5} = 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$5(t, other);
305
+ toTempAB(t, other, change);
306
+ return set$1(tempTo, max$5(tempA[0], tempB[0]), max$5(tempA[1], tempB[1]), max$5(tempA[2], tempB[2]), max$5(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$6, pow: pow$2, PI: PI$4} = 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) {
@@ -433,13 +479,13 @@ const MatrixHelper = {
433
479
  to.f = t.f * pixelRatio;
434
480
  },
435
481
  scaleOfOuter(t, origin, scaleX, scaleY) {
436
- M$a.toInnerPoint(t, origin, tempPoint$4);
437
- M$a.scaleOfInner(t, tempPoint$4, scaleX, scaleY);
482
+ M$b.toInnerPoint(t, origin, tempPoint$4);
483
+ M$b.scaleOfInner(t, tempPoint$4, scaleX, scaleY);
438
484
  },
439
485
  scaleOfInner(t, origin, scaleX, scaleY = scaleX) {
440
- M$a.translateInner(t, origin.x, origin.y);
441
- M$a.scale(t, scaleX, scaleY);
442
- M$a.translateInner(t, -origin.x, -origin.y);
486
+ M$b.translateInner(t, origin.x, origin.y);
487
+ M$b.scale(t, scaleX, scaleY);
488
+ M$b.translateInner(t, -origin.x, -origin.y);
443
489
  },
444
490
  rotate(t, rotation) {
445
491
  const {a: a, b: b, c: c, d: d} = t;
@@ -452,13 +498,13 @@ const MatrixHelper = {
452
498
  t.d = c * sinR + d * cosR;
453
499
  },
454
500
  rotateOfOuter(t, origin, rotation) {
455
- M$a.toInnerPoint(t, origin, tempPoint$4);
456
- M$a.rotateOfInner(t, tempPoint$4, rotation);
501
+ M$b.toInnerPoint(t, origin, tempPoint$4);
502
+ M$b.rotateOfInner(t, tempPoint$4, rotation);
457
503
  },
458
504
  rotateOfInner(t, origin, rotation) {
459
- M$a.translateInner(t, origin.x, origin.y);
460
- M$a.rotate(t, rotation);
461
- M$a.translateInner(t, -origin.x, -origin.y);
505
+ M$b.translateInner(t, origin.x, origin.y);
506
+ M$b.rotate(t, rotation);
507
+ M$b.translateInner(t, -origin.x, -origin.y);
462
508
  },
463
509
  skew(t, skewX, skewY) {
464
510
  const {a: a, b: b, c: c, d: d} = t;
@@ -474,13 +520,13 @@ const MatrixHelper = {
474
520
  }
475
521
  },
476
522
  skewOfOuter(t, origin, skewX, skewY) {
477
- M$a.toInnerPoint(t, origin, tempPoint$4);
478
- M$a.skewOfInner(t, tempPoint$4, skewX, skewY);
523
+ M$b.toInnerPoint(t, origin, tempPoint$4);
524
+ M$b.skewOfInner(t, tempPoint$4, skewX, skewY);
479
525
  },
480
526
  skewOfInner(t, origin, skewX, skewY = 0) {
481
- M$a.translateInner(t, origin.x, origin.y);
482
- M$a.skew(t, skewX, skewY);
483
- M$a.translateInner(t, -origin.x, -origin.y);
527
+ M$b.translateInner(t, origin.x, origin.y);
528
+ M$b.skew(t, skewX, skewY);
529
+ M$b.translateInner(t, -origin.x, -origin.y);
484
530
  },
485
531
  multiply(t, child) {
486
532
  const {a: a, b: b, c: c, d: d, e: e, f: f} = t;
@@ -519,15 +565,15 @@ const MatrixHelper = {
519
565
  to.f = e * parent.b + f * parent.d + parent.f;
520
566
  },
521
567
  divide(t, child) {
522
- M$a.multiply(t, M$a.tempInvert(child));
568
+ M$b.multiply(t, M$b.tempInvert(child));
523
569
  },
524
570
  divideParent(t, parent) {
525
- M$a.multiplyParent(t, M$a.tempInvert(parent));
571
+ M$b.multiplyParent(t, M$b.tempInvert(parent));
526
572
  },
527
573
  tempInvert(t) {
528
- const {tempMatrix: tempMatrix} = M$a;
529
- M$a.copy(tempMatrix, t);
530
- M$a.invert(tempMatrix);
574
+ const {tempMatrix: tempMatrix} = M$b;
575
+ M$b.copy(tempMatrix, t);
576
+ M$b.invert(tempMatrix);
531
577
  return tempMatrix;
532
578
  },
533
579
  invert(t) {
@@ -605,7 +651,7 @@ const MatrixHelper = {
605
651
  }
606
652
  t.e = x;
607
653
  t.f = y;
608
- if (origin = origin || around) M$a.translateInner(t, -origin.x, -origin.y, !around);
654
+ if (origin = origin || around) M$b.translateInner(t, -origin.x, -origin.y, !around);
609
655
  },
610
656
  getLayout(t, origin, around, firstSkewY) {
611
657
  const {a: a, b: b, c: c, d: d, e: e, f: f} = t;
@@ -666,11 +712,11 @@ const MatrixHelper = {
666
712
  return world;
667
713
  },
668
714
  reset(t) {
669
- M$a.set(t);
715
+ M$b.set(t);
670
716
  }
671
717
  };
672
718
 
673
- const M$a = MatrixHelper;
719
+ const M$b = MatrixHelper;
674
720
 
675
721
  const {toInnerPoint: toInnerPoint$2, toOuterPoint: toOuterPoint$3} = MatrixHelper;
676
722
 
@@ -1014,7 +1060,7 @@ class Matrix {
1014
1060
  }
1015
1061
  }
1016
1062
 
1017
- const tempMatrix$1 = new Matrix;
1063
+ const tempMatrix$2 = new Matrix;
1018
1064
 
1019
1065
  const TwoPointBoundsHelper = {
1020
1066
  tempPointBounds: {},
@@ -1164,10 +1210,10 @@ const point$2 = {};
1164
1210
 
1165
1211
  const toPoint$5 = {};
1166
1212
 
1167
- const tempBounds$2 = {};
1213
+ const tempBounds$3 = {};
1168
1214
 
1169
1215
  const BoundsHelper = {
1170
- tempBounds: tempBounds$2,
1216
+ tempBounds: tempBounds$3,
1171
1217
  set(t, x = 0, y = 0, width = 0, height = 0) {
1172
1218
  t.x = x;
1173
1219
  t.y = y;
@@ -1218,19 +1264,11 @@ const BoundsHelper = {
1218
1264
  B.move(t, x, y);
1219
1265
  return t;
1220
1266
  },
1221
- toOffsetOutBounds(t, to, parent) {
1222
- if (!to) {
1223
- to = t;
1224
- } else {
1225
- copy$c(to, t);
1226
- }
1227
- if (parent) {
1228
- to.offsetX = -(B.maxX(parent) - t.x);
1229
- to.offsetY = -(B.maxY(parent) - t.y);
1230
- } else {
1231
- to.offsetX = t.x + t.width;
1232
- to.offsetY = t.y + t.height;
1233
- }
1267
+ toOffsetOutBounds(t, to, offsetBounds) {
1268
+ if (!to) to = t; else copy$c(to, t);
1269
+ if (!offsetBounds) offsetBounds = t;
1270
+ to.offsetX = B.maxX(offsetBounds);
1271
+ to.offsetY = B.maxY(offsetBounds);
1234
1272
  B.move(to, -to.offsetX, -to.offsetY);
1235
1273
  },
1236
1274
  scale(t, scaleX, scaleY = scaleX, onlySize) {
@@ -1244,9 +1282,9 @@ const BoundsHelper = {
1244
1282
  t.height *= scaleY;
1245
1283
  },
1246
1284
  tempToOuterOf(t, matrix) {
1247
- B.copy(tempBounds$2, t);
1248
- B.toOuterOf(tempBounds$2, matrix);
1249
- return tempBounds$2;
1285
+ B.copy(tempBounds$3, t);
1286
+ B.toOuterOf(tempBounds$3, matrix);
1287
+ return tempBounds$3;
1250
1288
  },
1251
1289
  getOuterOf(t, matrix) {
1252
1290
  t = Object.assign({}, t);
@@ -1304,9 +1342,9 @@ const BoundsHelper = {
1304
1342
  put(t, put, align = "center", putScale = 1, changeSize = true, to) {
1305
1343
  to || (to = put);
1306
1344
  if (isString(putScale)) putScale = B.getFitScale(t, put, putScale === "cover");
1307
- tempBounds$2.width = changeSize ? put.width *= putScale : put.width * putScale;
1308
- tempBounds$2.height = changeSize ? put.height *= putScale : put.height * putScale;
1309
- 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);
1310
1348
  },
1311
1349
  getSpread(t, spread, side) {
1312
1350
  const n = {};
@@ -1376,7 +1414,7 @@ const BoundsHelper = {
1376
1414
  first = false;
1377
1415
  if (!addMode) copy$c(t, bounds);
1378
1416
  } else {
1379
- add$1(t, bounds);
1417
+ add$2(t, bounds);
1380
1418
  }
1381
1419
  }
1382
1420
  }
@@ -1390,7 +1428,7 @@ const BoundsHelper = {
1390
1428
  B.set(t, point.x, point.y);
1391
1429
  },
1392
1430
  addPoint(t, point) {
1393
- add$1(t, point, true);
1431
+ add$2(t, point, true);
1394
1432
  },
1395
1433
  getPoints(t) {
1396
1434
  const {x: x, y: y, width: width, height: height} = t;
@@ -1461,7 +1499,7 @@ const BoundsHelper = {
1461
1499
 
1462
1500
  const B = BoundsHelper;
1463
1501
 
1464
- const {add: add$1, copy: copy$c} = B;
1502
+ const {add: add$2, copy: copy$c} = B;
1465
1503
 
1466
1504
  class Bounds {
1467
1505
  get minX() {
@@ -1606,7 +1644,7 @@ class Bounds {
1606
1644
  }
1607
1645
  }
1608
1646
 
1609
- const tempBounds$1 = new Bounds;
1647
+ const tempBounds$2 = new Bounds;
1610
1648
 
1611
1649
  class AutoBounds {
1612
1650
  constructor(top, right, bottom, left, width, height) {
@@ -2261,7 +2299,7 @@ class LeaferCanvasBase extends Canvas$1 {
2261
2299
  const {pixelRatio: pixelRatio, pixelSnap: pixelSnap} = this, w = this.worldTransform;
2262
2300
  if (parentMatrix) multiplyParent$4(matrix, parentMatrix, w);
2263
2301
  pixelScale(matrix, pixelRatio, w);
2264
- if (pixelSnap) {
2302
+ if (pixelSnap && !matrix.ignorePixelSnap) {
2265
2303
  if (matrix.half && matrix.half * pixelRatio % 2) w.e = round$4(w.e - .5) + .5, w.f = round$4(w.f - .5) + .5; else w.e = round$4(w.e),
2266
2304
  w.f = round$4(w.f);
2267
2305
  }
@@ -2560,14 +2598,14 @@ const {setPoint: setPoint$4, addPoint: addPoint$2} = TwoPointBoundsHelper;
2560
2598
 
2561
2599
  const {set: set, toNumberPoints: toNumberPoints$1} = PointHelper;
2562
2600
 
2563
- const {M: M$9, L: L$a, C: C$8, Q: Q$7, Z: Z$8} = PathCommandMap;
2601
+ const {M: M$a, L: L$a, C: C$8, Q: Q$7, Z: Z$8} = PathCommandMap;
2564
2602
 
2565
2603
  const tempPoint$2 = {};
2566
2604
 
2567
2605
  const BezierHelper = {
2568
2606
  points(data, originPoints, curve, close) {
2569
2607
  let points = toNumberPoints$1(originPoints);
2570
- data.push(M$9, points[0], points[1]);
2608
+ data.push(M$a, points[0], points[1]);
2571
2609
  if (curve && points.length > 5) {
2572
2610
  let aX, aY, bX, bY, cX, cY, c1X, c1Y, c2X, c2Y;
2573
2611
  let ba, cb, d, len = points.length;
@@ -2674,7 +2712,7 @@ const BezierHelper = {
2674
2712
  let startX = x = rotationCos * radiusX * startCos - rotationSin * radiusY * startSin;
2675
2713
  let startY = y = rotationSin * radiusX * startCos + rotationCos * radiusY * startSin;
2676
2714
  let fromX = cx + x, fromY = cy + y;
2677
- if (data) data.push(data.length ? L$a : M$9, fromX, fromY);
2715
+ if (data) data.push(data.length ? L$a : M$a, fromX, fromY);
2678
2716
  if (setPointBounds) setPoint$4(setPointBounds, fromX, fromY);
2679
2717
  if (setStartPoint) set(setStartPoint, fromX, fromY);
2680
2718
  for (let i = 0; i < parts; i++) {
@@ -2804,7 +2842,7 @@ const EllipseHelper = {
2804
2842
  }
2805
2843
  };
2806
2844
 
2807
- const {M: M$8, m: m, L: L$9, l: l, H: H, h: h, V: V, v: v, C: C$7, c: c, S: S, s: s, Q: Q$6, q: q, T: T, t: t, A: A, a: a, Z: Z$7, z: z, N: N$5, D: D$6, X: X$5, G: G$5, F: F$6, O: O$6, P: P$5, U: U$5} = PathCommandMap;
2845
+ const {M: M$9, m: m, L: L$9, l: l, H: H, h: h, V: V, v: v, C: C$7, c: c, S: S, s: s, Q: Q$6, q: q, T: T, t: t, A: A, a: a, Z: Z$7, z: z, N: N$5, D: D$6, X: X$5, G: G$5, F: F$6, O: O$6, P: P$5, U: U$5} = PathCommandMap;
2808
2846
 
2809
2847
  const {rect: rect$3, roundRect: roundRect$2, arcTo: arcTo$3, arc: arc$3, ellipse: ellipse$4, quadraticCurveTo: quadraticCurveTo$1} = BezierHelper;
2810
2848
 
@@ -2896,10 +2934,10 @@ const PathConvert = {
2896
2934
  old[i + 1] += x;
2897
2935
  old[i + 2] += y;
2898
2936
 
2899
- case M$8:
2937
+ case M$9:
2900
2938
  x = old[i + 1];
2901
2939
  y = old[i + 2];
2902
- data.push(M$8, x, y);
2940
+ data.push(M$9, x, y);
2903
2941
  i += 3;
2904
2942
  break;
2905
2943
 
@@ -3086,7 +3124,7 @@ const PathConvert = {
3086
3124
  list.forEach(item => {
3087
3125
  switch (item.name) {
3088
3126
  case "M":
3089
- data.push(M$8, item.x, item.y);
3127
+ data.push(M$9, item.x, item.y);
3090
3128
  break;
3091
3129
 
3092
3130
  case "L":
@@ -3125,7 +3163,7 @@ const PathConvert = {
3125
3163
 
3126
3164
  const {current: current, pushData: pushData, copyData: copyData} = PathConvert;
3127
3165
 
3128
- const {M: M$7, L: L$8, C: C$6, Q: Q$5, Z: Z$6, N: N$4, D: D$5, X: X$4, G: G$4, F: F$5, O: O$5, P: P$4, U: U$4} = PathCommandMap;
3166
+ const {M: M$8, L: L$8, C: C$6, Q: Q$5, Z: Z$6, N: N$4, D: D$5, X: X$4, G: G$4, F: F$5, O: O$5, P: P$4, U: U$4} = PathCommandMap;
3129
3167
 
3130
3168
  const {getMinDistanceFrom: getMinDistanceFrom, getRadianFrom: getRadianFrom} = PointHelper;
3131
3169
 
@@ -3138,7 +3176,7 @@ const PathCommandDataHelper = {
3138
3176
  data.length = 0;
3139
3177
  },
3140
3178
  moveTo(data, x, y) {
3141
- data.push(M$7, x, y);
3179
+ data.push(M$8, x, y);
3142
3180
  },
3143
3181
  lineTo(data, x, y) {
3144
3182
  data.push(L$8, x, y);
@@ -3193,12 +3231,12 @@ const PathCommandDataHelper = {
3193
3231
  },
3194
3232
  drawEllipse(data, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) {
3195
3233
  BezierHelper.ellipse(null, x, y, radiusX, radiusY, isNull(rotation) ? 0 : rotation, isNull(startAngle) ? 0 : startAngle, isNull(endAngle) ? 360 : endAngle, anticlockwise, null, null, startPoint);
3196
- data.push(M$7, startPoint.x, startPoint.y);
3234
+ data.push(M$8, startPoint.x, startPoint.y);
3197
3235
  ellipse$3(data, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
3198
3236
  },
3199
3237
  drawArc(data, x, y, radius, startAngle, endAngle, anticlockwise) {
3200
3238
  BezierHelper.arc(null, x, y, radius, isNull(startAngle) ? 0 : startAngle, isNull(endAngle) ? 360 : endAngle, anticlockwise, null, null, startPoint);
3201
- data.push(M$7, startPoint.x, startPoint.y);
3239
+ data.push(M$8, startPoint.x, startPoint.y);
3202
3240
  arc$2(data, x, y, radius, startAngle, endAngle, anticlockwise);
3203
3241
  },
3204
3242
  drawPoints(data, points, curve, close) {
@@ -3300,7 +3338,7 @@ class PathCreator {
3300
3338
  paint() {}
3301
3339
  }
3302
3340
 
3303
- const {M: M$6, L: L$7, C: C$5, Q: Q$4, Z: Z$5, N: N$3, D: D$4, X: X$3, G: G$3, F: F$4, O: O$4, P: P$3, U: U$3} = PathCommandMap;
3341
+ const {M: M$7, L: L$7, C: C$5, Q: Q$4, Z: Z$5, N: N$3, D: D$4, X: X$3, G: G$3, F: F$4, O: O$4, P: P$3, U: U$3} = PathCommandMap;
3304
3342
 
3305
3343
  const debug$e = Debug.get("PathDrawer");
3306
3344
 
@@ -3312,7 +3350,7 @@ const PathDrawer = {
3312
3350
  while (i < len) {
3313
3351
  command = data[i];
3314
3352
  switch (command) {
3315
- case M$6:
3353
+ case M$7:
3316
3354
  drawer.moveTo(data[i + 1], data[i + 2]);
3317
3355
  i += 3;
3318
3356
  break;
@@ -3385,7 +3423,7 @@ const PathDrawer = {
3385
3423
  }
3386
3424
  };
3387
3425
 
3388
- const {M: M$5, L: L$6, C: C$4, Q: Q$3, Z: Z$4, N: N$2, D: D$3, X: X$2, G: G$2, F: F$3, O: O$3, P: P$2, U: U$2} = PathCommandMap;
3426
+ const {M: M$6, L: L$6, C: C$4, Q: Q$3, Z: Z$4, N: N$2, D: D$3, X: X$2, G: G$2, F: F$3, O: O$3, P: P$2, U: U$2} = PathCommandMap;
3389
3427
 
3390
3428
  const {toTwoPointBounds: toTwoPointBounds, toTwoPointBoundsByQuadraticCurve: toTwoPointBoundsByQuadraticCurve, arcTo: arcTo$1, arc: arc, ellipse: ellipse$1} = BezierHelper;
3391
3429
 
@@ -3420,7 +3458,7 @@ const PathBounds = {
3420
3458
  }
3421
3459
  }
3422
3460
  switch (command) {
3423
- case M$5:
3461
+ case M$6:
3424
3462
  case L$6:
3425
3463
  x = data[i + 1];
3426
3464
  y = data[i + 2];
@@ -3520,7 +3558,7 @@ const PathBounds = {
3520
3558
  }
3521
3559
  };
3522
3560
 
3523
- const {M: M$4, L: L$5, Z: Z$3} = PathCommandMap;
3561
+ const {M: M$5, L: L$5, Z: Z$3} = PathCommandMap;
3524
3562
 
3525
3563
  const {getCenterX: getCenterX, getCenterY: getCenterY} = PointHelper;
3526
3564
 
@@ -3535,16 +3573,16 @@ const PathCorner = {
3535
3573
  while (i < len) {
3536
3574
  command = data[i];
3537
3575
  switch (command) {
3538
- case M$4:
3576
+ case M$5:
3539
3577
  startX = lastX = data[i + 1];
3540
3578
  startY = lastY = data[i + 2];
3541
3579
  i += 3;
3542
3580
  if (data[i] === L$5) {
3543
3581
  secondX = data[i + 1];
3544
3582
  secondY = data[i + 2];
3545
- smooth.push(M$4, getCenterX(startX, secondX), getCenterY(startY, secondY));
3583
+ smooth.push(M$5, getCenterX(startX, secondX), getCenterY(startY, secondY));
3546
3584
  } else {
3547
- smooth.push(M$4, startX, startY);
3585
+ smooth.push(M$5, startX, startY);
3548
3586
  }
3549
3587
  break;
3550
3588
 
@@ -3985,7 +4023,7 @@ const I$1 = ImageManager;
3985
4023
 
3986
4024
  const {IMAGE: IMAGE, create: create$1} = IncrementId;
3987
4025
 
3988
- const {floor: floor$2, max: max$2} = Math;
4026
+ const {floor: floor$2, max: max$4} = Math;
3989
4027
 
3990
4028
  class LeaferImage {
3991
4029
  get url() {
@@ -4074,7 +4112,7 @@ class LeaferImage {
4074
4112
  }
4075
4113
  if (data) return data;
4076
4114
  }
4077
- const canvas = Platform.origin.createCanvas(max$2(floor$2(width + (xGap || 0)), 1), max$2(floor$2(height + (yGap || 0)), 1));
4115
+ const canvas = Platform.origin.createCanvas(max$4(floor$2(width + (xGap || 0)), 1), max$4(floor$2(height + (yGap || 0)), 1));
4078
4116
  const ctx = canvas.getContext("2d");
4079
4117
  if (opacity) ctx.globalAlpha = opacity;
4080
4118
  ctx.imageSmoothingEnabled = smooth === false ? false : true;
@@ -4868,7 +4906,7 @@ const WaitHelper = {
4868
4906
 
4869
4907
  const {getRelativeWorld: getRelativeWorld$1, updateBounds: updateBounds$3} = LeafHelper;
4870
4908
 
4871
- const {toOuterOf: toOuterOf$2, getPoints: getPoints, copy: copy$8} = BoundsHelper;
4909
+ const {toOuterOf: toOuterOf$3, getPoints: getPoints, copy: copy$8} = BoundsHelper;
4872
4910
 
4873
4911
  const localContent = "_localContentBounds";
4874
4912
 
@@ -4891,7 +4929,7 @@ class LeafLayout {
4891
4929
  this._renderBounds = bounds;
4892
4930
  }
4893
4931
  get localContentBounds() {
4894
- toOuterOf$2(this.contentBounds, this.leaf.__localMatrix, this[localContent] || (this[localContent] = {}));
4932
+ toOuterOf$3(this.contentBounds, this.leaf.__localMatrix, this[localContent] || (this[localContent] = {}));
4895
4933
  return this[localContent];
4896
4934
  }
4897
4935
  get localStrokeBounds() {
@@ -4901,15 +4939,15 @@ class LeafLayout {
4901
4939
  return this._localRenderBounds || this;
4902
4940
  }
4903
4941
  get worldContentBounds() {
4904
- toOuterOf$2(this.contentBounds, this.leaf.__world, this[worldContent] || (this[worldContent] = {}));
4942
+ toOuterOf$3(this.contentBounds, this.leaf.__world, this[worldContent] || (this[worldContent] = {}));
4905
4943
  return this[worldContent];
4906
4944
  }
4907
4945
  get worldBoxBounds() {
4908
- toOuterOf$2(this.boxBounds, this.leaf.__world, this[worldBox] || (this[worldBox] = {}));
4946
+ toOuterOf$3(this.boxBounds, this.leaf.__world, this[worldBox] || (this[worldBox] = {}));
4909
4947
  return this[worldBox];
4910
4948
  }
4911
4949
  get worldStrokeBounds() {
4912
- toOuterOf$2(this.strokeBounds, this.leaf.__world, this[worldStroke] || (this[worldStroke] = {}));
4950
+ toOuterOf$3(this.strokeBounds, this.leaf.__world, this[worldStroke] || (this[worldStroke] = {}));
4913
4951
  return this[worldStroke];
4914
4952
  }
4915
4953
  get a() {
@@ -5761,14 +5799,14 @@ const {updateMatrix: updateMatrix$3, updateAllMatrix: updateAllMatrix$3} = LeafH
5761
5799
 
5762
5800
  const {updateBounds: updateBounds$2} = BranchHelper;
5763
5801
 
5764
- const {toOuterOf: toOuterOf$1, copyAndSpread: copyAndSpread$2, copy: copy$7} = BoundsHelper;
5802
+ const {toOuterOf: toOuterOf$2, copyAndSpread: copyAndSpread$3, copy: copy$7} = BoundsHelper;
5765
5803
 
5766
5804
  const {toBounds: toBounds$1} = PathBounds;
5767
5805
 
5768
5806
  const LeafBounds = {
5769
5807
  __updateWorldBounds() {
5770
5808
  const layout = this.__layout;
5771
- toOuterOf$1(layout.renderBounds, this.__world, this.__world);
5809
+ toOuterOf$2(layout.renderBounds, this.__world, this.__world);
5772
5810
  if (layout.resized) {
5773
5811
  if (layout.resized === "inner") this.__onUpdateSize();
5774
5812
  if (this.__hasLocalEvent) BoundsEvent.emitLocal(this);
@@ -5824,13 +5862,13 @@ const LeafBounds = {
5824
5862
  __updateLocalBoxBounds() {
5825
5863
  if (this.__hasMotionPath) this.__updateMotionPath();
5826
5864
  if (this.__hasAutoLayout) this.__updateAutoLayout();
5827
- toOuterOf$1(this.__layout.boxBounds, this.__local, this.__local);
5865
+ toOuterOf$2(this.__layout.boxBounds, this.__local, this.__local);
5828
5866
  },
5829
5867
  __updateLocalStrokeBounds() {
5830
- toOuterOf$1(this.__layout.strokeBounds, this.__localMatrix, this.__layout.localStrokeBounds);
5868
+ toOuterOf$2(this.__layout.strokeBounds, this.__localMatrix, this.__layout.localStrokeBounds);
5831
5869
  },
5832
5870
  __updateLocalRenderBounds() {
5833
- toOuterOf$1(this.__layout.renderBounds, this.__localMatrix, this.__layout.localRenderBounds);
5871
+ toOuterOf$2(this.__layout.renderBounds, this.__localMatrix, this.__layout.localRenderBounds);
5834
5872
  },
5835
5873
  __updateBoxBounds(_secondLayout, _bounds) {
5836
5874
  const b = this.__layout.boxBounds;
@@ -5868,11 +5906,11 @@ const LeafBounds = {
5868
5906
  },
5869
5907
  __updateStrokeBounds(_bounds) {
5870
5908
  const layout = this.__layout;
5871
- copyAndSpread$2(layout.strokeBounds, layout.boxBounds, layout.strokeBoxSpread);
5909
+ copyAndSpread$3(layout.strokeBounds, layout.boxBounds, layout.strokeBoxSpread);
5872
5910
  },
5873
5911
  __updateRenderBounds(_bounds) {
5874
- const layout = this.__layout;
5875
- layout.renderSpread > 0 ? copyAndSpread$2(layout.renderBounds, layout.boxBounds, layout.renderSpread) : copy$7(layout.renderBounds, layout.strokeBounds);
5912
+ const layout = this.__layout, {renderSpread: renderSpread} = layout;
5913
+ isNumber(renderSpread) && renderSpread <= 0 ? copy$7(layout.renderBounds, layout.strokeBounds) : copyAndSpread$3(layout.renderBounds, layout.boxBounds, renderSpread);
5876
5914
  }
5877
5915
  };
5878
5916
 
@@ -5970,11 +6008,13 @@ const tempScaleData$1 = {};
5970
6008
 
5971
6009
  const {LEAF: LEAF, create: create} = IncrementId;
5972
6010
 
6011
+ const {stintSet: stintSet$3} = DataHelper;
6012
+
5973
6013
  const {toInnerPoint: toInnerPoint, toOuterPoint: toOuterPoint, multiplyParent: multiplyParent$1} = MatrixHelper;
5974
6014
 
5975
- const {toOuterOf: toOuterOf} = BoundsHelper;
6015
+ const {toOuterOf: toOuterOf$1} = BoundsHelper;
5976
6016
 
5977
- const {copy: copy$6, move: move$6} = PointHelper;
6017
+ const {copy: copy$6, move: move$8} = PointHelper;
5978
6018
 
5979
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;
5980
6020
 
@@ -6250,8 +6290,9 @@ let Leaf = class Leaf {
6250
6290
  if (!this.__cameraWorld) this.__cameraWorld = {};
6251
6291
  const cameraWorld = this.__cameraWorld, world = this.__world;
6252
6292
  multiplyParent$1(world, options.matrix, cameraWorld, undefined, world);
6253
- toOuterOf(this.__layout.renderBounds, cameraWorld, cameraWorld);
6254
- 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);
6255
6296
  return cameraWorld;
6256
6297
  } else {
6257
6298
  return this.__world;
@@ -6285,7 +6326,7 @@ let Leaf = class Leaf {
6285
6326
  getWorldBounds(inner, relative, change) {
6286
6327
  const matrix = relative ? getRelativeWorld(this, relative) : this.worldTransform;
6287
6328
  const to = change ? inner : {};
6288
- toOuterOf(inner, matrix, to);
6329
+ toOuterOf$1(inner, matrix, to);
6289
6330
  return to;
6290
6331
  }
6291
6332
  worldToLocal(world, to, distance, relative) {
@@ -6318,7 +6359,7 @@ let Leaf = class Leaf {
6318
6359
  }
6319
6360
  getBoxPointByInner(inner, _relative, _distance, change) {
6320
6361
  const point = change ? inner : Object.assign({}, inner), {x: x, y: y} = this.boxBounds;
6321
- move$6(point, -x, -y);
6362
+ move$8(point, -x, -y);
6322
6363
  return point;
6323
6364
  }
6324
6365
  getInnerPoint(world, relative, distance, change) {
@@ -6328,7 +6369,7 @@ let Leaf = class Leaf {
6328
6369
  }
6329
6370
  getInnerPointByBox(box, _relative, _distance, change) {
6330
6371
  const point = change ? box : Object.assign({}, box), {x: x, y: y} = this.boxBounds;
6331
- move$6(point, x, y);
6372
+ move$8(point, x, y);
6332
6373
  return point;
6333
6374
  }
6334
6375
  getInnerPointByLocal(local, _relative, distance, change) {
@@ -6774,7 +6815,7 @@ class LeafLevelList {
6774
6815
  }
6775
6816
  }
6776
6817
 
6777
- const version = "1.9.7";
6818
+ const version = "1.9.9";
6778
6819
 
6779
6820
  class LeaferCanvas extends LeaferCanvasBase {
6780
6821
  get allowBackgroundColor() {
@@ -7352,6 +7393,7 @@ class Renderer {
7352
7393
  usePartRender: true,
7353
7394
  maxFPS: 120
7354
7395
  };
7396
+ this.frames = [];
7355
7397
  this.target = target;
7356
7398
  this.canvas = canvas;
7357
7399
  if (userConfig) this.config = DataHelper.default(userConfig, this.config);
@@ -7504,12 +7546,15 @@ class Renderer {
7504
7546
  const target = this.target;
7505
7547
  if (this.requestTime || !target) return;
7506
7548
  if (target.parentApp) return target.parentApp.requestRender(false);
7507
- const requestTime = this.requestTime = Date.now();
7549
+ this.requestTime = this.frameTime || Date.now();
7508
7550
  const render = () => {
7509
- const nowFPS = 1e3 / (Date.now() - requestTime);
7551
+ const nowFPS = 1e3 / ((this.frameTime = Date.now()) - this.requestTime);
7510
7552
  const {maxFPS: maxFPS} = this.config;
7511
- if (maxFPS && nowFPS > maxFPS - .5) return Platform.requestRender(render);
7512
- 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);
7513
7558
  this.requestTime = 0;
7514
7559
  this.checkRender();
7515
7560
  };
@@ -8165,39 +8210,41 @@ class CanvasData extends RectData {
8165
8210
  }
8166
8211
  }
8167
8212
 
8213
+ const {max: max$3, add: add$1} = FourNumberHelper;
8214
+
8168
8215
  const UIBounds = {
8169
8216
  __updateStrokeSpread() {
8170
- let width = 0, boxWidth = 0;
8217
+ let spread = 0, boxSpread = 0;
8171
8218
  const data = this.__, {strokeAlign: strokeAlign, __maxStrokeWidth: strokeWidth} = data, box = this.__box;
8172
8219
  if ((data.stroke || data.hitStroke === "all") && strokeWidth && strokeAlign !== "inside") {
8173
- boxWidth = width = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
8220
+ boxSpread = spread = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
8174
8221
  if (!data.__boxStroke) {
8175
- const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * width;
8222
+ const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * spread;
8176
8223
  const storkeCapAddWidth = data.strokeCap === "none" ? 0 : strokeWidth;
8177
- width += Math.max(miterLimitAddWidth, storkeCapAddWidth);
8224
+ spread += Math.max(miterLimitAddWidth, storkeCapAddWidth);
8178
8225
  }
8179
8226
  }
8180
- if (data.__useArrow) width += strokeWidth * 5;
8227
+ if (data.__useArrow) spread += strokeWidth * 5;
8181
8228
  if (box) {
8182
- width = Math.max(box.__layout.strokeSpread = box.__updateStrokeSpread(), width);
8183
- boxWidth = box.__layout.strokeBoxSpread;
8229
+ spread = max$3(spread, box.__layout.strokeSpread = box.__updateStrokeSpread());
8230
+ boxSpread = Math.max(boxSpread, box.__layout.strokeBoxSpread);
8184
8231
  }
8185
- this.__layout.strokeBoxSpread = boxWidth;
8186
- return width;
8232
+ this.__layout.strokeBoxSpread = boxSpread;
8233
+ return spread;
8187
8234
  },
8188
8235
  __updateRenderSpread() {
8189
- let width = 0;
8190
- const {shadow: shadow, innerShadow: innerShadow, blur: blur, backgroundBlur: backgroundBlur, filter: filter, renderSpread: renderSpread} = this.__;
8191
- if (shadow) width = Effect.getShadowSpread(this, shadow);
8192
- if (blur) width = Math.max(width, blur);
8193
- if (filter) width += Filter.getSpread(filter);
8194
- if (renderSpread) width += renderSpread;
8195
- let shapeWidth = width = Math.ceil(width);
8196
- 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));
8197
- if (backgroundBlur) shapeWidth = Math.max(shapeWidth, backgroundBlur);
8198
- this.__layout.renderShapeSpread = shapeWidth;
8199
- width += this.__layout.strokeSpread || 0;
8200
- 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$3(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$3(shapeSpread, Effect.getInnerShadowSpread(this, innerShadow));
8245
+ if (backgroundBlur) shapeSpread = max$3(shapeSpread, backgroundBlur);
8246
+ this.__layout.renderShapeSpread = shapeSpread;
8247
+ return box ? max$3(box.__updateRenderSpread(), spread) : spread;
8201
8248
  }
8202
8249
  };
8203
8250
 
@@ -9508,7 +9555,7 @@ __decorate([ resizeType() ], Canvas.prototype, "contextSettings", void 0);
9508
9555
 
9509
9556
  Canvas = __decorate([ registerUI() ], Canvas);
9510
9557
 
9511
- const {copyAndSpread: copyAndSpread$1, includes: includes, spread: spread, setList: setList} = BoundsHelper;
9558
+ const {copyAndSpread: copyAndSpread$2, includes: includes, spread: spread, setList: setList} = BoundsHelper;
9512
9559
 
9513
9560
  let Text = class Text extends UI {
9514
9561
  get __tag() {
@@ -9555,13 +9602,13 @@ let Text = class Text extends UI {
9555
9602
  if (this.isOverflow) setList(data.__textBoxBounds = {}, [ b, contentBounds ]), layout.renderChanged = true; else data.__textBoxBounds = b;
9556
9603
  }
9557
9604
  __updateRenderSpread() {
9558
- let width = super.__updateRenderSpread();
9559
- if (!width) width = this.isOverflow ? 1 : 0;
9560
- return width;
9605
+ let spread = super.__updateRenderSpread();
9606
+ if (!spread) spread = this.isOverflow ? 1 : 0;
9607
+ return spread;
9561
9608
  }
9562
9609
  __updateRenderBounds() {
9563
9610
  const {renderBounds: renderBounds, renderSpread: renderSpread} = this.__layout;
9564
- copyAndSpread$1(renderBounds, this.__.__textBoxBounds, renderSpread);
9611
+ copyAndSpread$2(renderBounds, this.__.__textBoxBounds, renderSpread);
9565
9612
  if (this.__box) this.__box.__layout.renderBounds = renderBounds;
9566
9613
  }
9567
9614
  __updateChange() {
@@ -9987,9 +10034,9 @@ let DragEvent = class DragEvent extends PointerEvent {
9987
10034
  static setData(data) {
9988
10035
  this.data = data;
9989
10036
  }
9990
- static getValidMove(leaf, start, total, checkLimit = true) {
9991
- const move = leaf.getLocalPoint(total, null, true);
9992
- 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);
9993
10040
  if (checkLimit) this.limitMove(leaf, move);
9994
10041
  DragBoundsHelper.axisMove(leaf, move);
9995
10042
  return move;
@@ -11019,8 +11066,8 @@ ui$5.__updateHitCanvas = function() {
11019
11066
  if (isHitPixel) {
11020
11067
  const {renderBounds: renderBounds} = this.__layout;
11021
11068
  const size = Platform.image.hitCanvasSize;
11022
- const scale = h.hitScale = tempBounds$1.set(0, 0, size, size).getFitMatrix(renderBounds).a;
11023
- 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);
11024
11071
  h.resize({
11025
11072
  width: width,
11026
11073
  height: height,
@@ -11117,8 +11164,8 @@ canvas$1.hitStroke = function(point, strokeWidth) {
11117
11164
  canvas$1.hitPixel = function(radiusPoint, offset, scale = 1) {
11118
11165
  let {x: x, y: y, radiusX: radiusX, radiusY: radiusY} = radiusPoint;
11119
11166
  if (offset) x -= offset.x, y -= offset.y;
11120
- tempBounds$1.set(x - radiusX, y - radiusY, radiusX * 2, radiusY * 2).scale(scale).ceil();
11121
- 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);
11122
11169
  for (let i = 0, len = data.length; i < len; i += 4) {
11123
11170
  if (data[i + 3] > 0) return true;
11124
11171
  }
@@ -11430,24 +11477,29 @@ function drawOutside(stroke, ui, canvas) {
11430
11477
  }
11431
11478
  }
11432
11479
 
11433
- const {getSpread: getSpread, getOuterOf: getOuterOf, getByMove: getByMove, getIntersectData: getIntersectData} = BoundsHelper;
11480
+ const {getSpread: getSpread, copyAndSpread: copyAndSpread$1, toOuterOf: toOuterOf, getOuterOf: getOuterOf, getByMove: getByMove, move: move$7, getIntersectData: getIntersectData} = BoundsHelper;
11481
+
11482
+ const tempBounds$1 = {};
11434
11483
 
11435
11484
  function shape(ui, current, options) {
11436
11485
  const canvas = current.getSameCanvas();
11437
- const nowWorld = ui.__nowWorld, currentBounds = current.bounds;
11438
- 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$1(tempBounds$1, layout.boxBounds, layout.strokeSpread),
11489
+ tempBounds$1) : layout.boxBounds, nowWorld, nowWorldShapeBounds);
11490
+ let bounds, renderBounds, matrix, fitMatrix, shapeBounds, worldCanvas;
11439
11491
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true);
11440
- if (currentBounds.includes(nowWorld)) {
11492
+ if (currentBounds.includes(nowWorldShapeBounds)) {
11441
11493
  worldCanvas = canvas;
11442
- bounds = shapeBounds = nowWorld;
11494
+ bounds = shapeBounds = nowWorldShapeBounds;
11495
+ renderBounds = nowWorld;
11443
11496
  } else {
11444
- const {renderShapeSpread: spread} = ui.__layout;
11445
11497
  let worldClipBounds;
11446
11498
  if (Platform.fullImageShadow) {
11447
- worldClipBounds = nowWorld;
11499
+ worldClipBounds = nowWorldShapeBounds;
11448
11500
  } else {
11449
- const spreadBounds = spread ? getSpread(currentBounds, scaleX === scaleY ? spread * scaleX : [ spread * scaleY, spread * scaleX ]) : currentBounds;
11450
- worldClipBounds = getIntersectData(spreadBounds, nowWorld);
11501
+ const spreadBounds = layout.renderShapeSpread ? getSpread(currentBounds, FourNumberHelper.swapAndScale(layout.renderShapeSpread, scaleX, scaleY)) : currentBounds;
11502
+ worldClipBounds = getIntersectData(spreadBounds, nowWorldShapeBounds);
11451
11503
  }
11452
11504
  fitMatrix = currentBounds.getFitMatrix(worldClipBounds);
11453
11505
  let {a: fitScaleX, d: fitScaleY} = fitMatrix;
@@ -11457,8 +11509,10 @@ function shape(ui, current, options) {
11457
11509
  scaleX *= fitScaleX;
11458
11510
  scaleY *= fitScaleY;
11459
11511
  }
11460
- shapeBounds = getOuterOf(nowWorld, fitMatrix);
11512
+ shapeBounds = getOuterOf(nowWorldShapeBounds, fitMatrix);
11461
11513
  bounds = getByMove(shapeBounds, -fitMatrix.e, -fitMatrix.f);
11514
+ renderBounds = getOuterOf(nowWorld, fitMatrix);
11515
+ move$7(renderBounds, -fitMatrix.e, -fitMatrix.f);
11462
11516
  const userMatrix = options.matrix;
11463
11517
  if (userMatrix) {
11464
11518
  matrix = new Matrix(fitMatrix);
@@ -11477,6 +11531,7 @@ function shape(ui, current, options) {
11477
11531
  matrix: matrix,
11478
11532
  fitMatrix: fitMatrix,
11479
11533
  bounds: bounds,
11534
+ renderBounds: renderBounds,
11480
11535
  worldCanvas: worldCanvas,
11481
11536
  shapeBounds: shapeBounds,
11482
11537
  scaleX: scaleX,
@@ -11580,7 +11635,7 @@ const PaintModule = {
11580
11635
  shape: shape
11581
11636
  };
11582
11637
 
11583
- let origin$1 = {}, tempMatrix = getMatrixData();
11638
+ let origin$1 = {}, tempMatrix$1 = getMatrixData();
11584
11639
 
11585
11640
  const {get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, multiplyParent: multiplyParent, scale: scaleHelper, rotate: rotate$2, skew: skewHelper} = MatrixHelper;
11586
11641
 
@@ -11595,12 +11650,12 @@ function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
11595
11650
  data.transform = transform;
11596
11651
  }
11597
11652
 
11598
- function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipSize) {
11653
+ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipScaleX, clipScaleY) {
11599
11654
  const transform = get$3();
11600
11655
  layout$3(transform, box, x, y, scaleX, scaleY, rotation, skew);
11601
- if (clipSize) {
11602
- tempMatrix.a = box.width / clipSize.width, tempMatrix.d = box.height / clipSize.height;
11603
- multiplyParent(transform, tempMatrix);
11656
+ if (clipScaleX) {
11657
+ tempMatrix$1.a = clipScaleX, tempMatrix$1.d = clipScaleY;
11658
+ multiplyParent(transform, tempMatrix$1);
11604
11659
  }
11605
11660
  data.transform = transform;
11606
11661
  }
@@ -11701,7 +11756,12 @@ function getPatternData(paint, box, image) {
11701
11756
 
11702
11757
  case "normal":
11703
11758
  case "clip":
11704
- 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
+ }
11705
11765
  break;
11706
11766
 
11707
11767
  case "repeat":
@@ -11859,7 +11919,7 @@ function ignoreRender(ui, value) {
11859
11919
 
11860
11920
  const {get: get$1, scale: scale$2, copy: copy$4} = MatrixHelper;
11861
11921
 
11862
- const {floor: floor$1, ceil: ceil$1, max: max$1, abs: abs$4} = Math;
11922
+ const {floor: floor$1, ceil: ceil$1, max: max$2, abs: abs$4} = Math;
11863
11923
 
11864
11924
  function createPattern(ui, paint, pixelRatio) {
11865
11925
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true, paint.scaleFixed);
@@ -11908,8 +11968,8 @@ function createPattern(ui, paint, pixelRatio) {
11908
11968
  if (transform || scaleX !== 1 || scaleY !== 1) {
11909
11969
  const canvasWidth = width + (xGap || 0);
11910
11970
  const canvasHeight = height + (yGap || 0);
11911
- scaleX /= canvasWidth / max$1(floor$1(canvasWidth), 1);
11912
- scaleY /= canvasHeight / max$1(floor$1(canvasHeight), 1);
11971
+ scaleX /= canvasWidth / max$2(floor$1(canvasWidth), 1);
11972
+ scaleY /= canvasHeight / max$2(floor$1(canvasHeight), 1);
11913
11973
  if (!imageMatrix) {
11914
11974
  imageMatrix = get$1();
11915
11975
  if (transform) copy$4(imageMatrix, transform);
@@ -11935,17 +11995,15 @@ function checkImage(ui, canvas, paint, allowDraw) {
11935
11995
  if (allowDraw) {
11936
11996
  if (data.repeat) {
11937
11997
  allowDraw = false;
11938
- } else {
11939
- if (!(paint.changeful || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || Export.running)) {
11940
- let {width: width, height: height} = data;
11941
- width *= scaleX * pixelRatio;
11942
- height *= scaleY * pixelRatio;
11943
- if (data.scaleX) {
11944
- width *= data.scaleX;
11945
- height *= data.scaleY;
11946
- }
11947
- 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;
11948
12005
  }
12006
+ allowDraw = width * height > Platform.image.maxCacheSize;
11949
12007
  }
11950
12008
  }
11951
12009
  if (allowDraw) {
@@ -12125,75 +12183,82 @@ const PaintGradientModule = {
12125
12183
  getTransform: getTransform
12126
12184
  };
12127
12185
 
12128
- const {copy: copy$3, toOffsetOutBounds: toOffsetOutBounds$1} = BoundsHelper;
12186
+ const {copy: copy$3, move: move$6, toOffsetOutBounds: toOffsetOutBounds$1} = BoundsHelper, {max: max$1} = Math;
12129
12187
 
12130
- const tempBounds = {};
12188
+ const tempBounds = {}, tempMatrix = new Matrix;
12131
12189
 
12132
12190
  const offsetOutBounds$1 = {};
12133
12191
 
12134
12192
  function shadow$1(ui, current, shape) {
12135
- let copyBounds, spreadScale;
12136
- const {__nowWorld: nowWorld, __layout: __layout} = ui;
12193
+ let copyBounds, transform;
12194
+ const {__nowWorld: nowWorld} = ui;
12137
12195
  const {shadow: shadow} = ui.__;
12138
- 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;
12139
12197
  const other = current.getSameCanvas();
12140
12198
  const end = shadow.length - 1;
12141
- toOffsetOutBounds$1(bounds, offsetOutBounds$1);
12199
+ toOffsetOutBounds$1(bounds, offsetOutBounds$1, renderBounds);
12142
12200
  shadow.forEach((item, index) => {
12143
12201
  let otherScale = 1;
12144
12202
  if (item.scaleFixed) {
12145
12203
  const sx = Math.abs(nowWorld.scaleX);
12146
12204
  if (sx > 1) otherScale = 1 / sx;
12147
12205
  }
12148
- other.setWorldShadow(offsetOutBounds$1.offsetX + item.x * scaleX * otherScale, offsetOutBounds$1.offsetY + item.y * scaleY * otherScale, item.blur * scaleX * otherScale, ColorConvert.string(item.color));
12149
- spreadScale = item.spread ? 1 + item.spread * 2 / (__layout.boxBounds.width + (__layout.strokeBoxSpread || 0) * 2) * otherScale : 0;
12150
- drawWorldShadow(other, offsetOutBounds$1, spreadScale, shape);
12151
- copyBounds = bounds;
12206
+ other.setWorldShadow(offsetOutBounds$1.offsetX + (item.x || 0) * scaleX * otherScale, offsetOutBounds$1.offsetY + (item.y || 0) * scaleY * otherScale, (item.blur || 0) * scaleX * otherScale, ColorConvert.string(item.color));
12207
+ transform = Effect.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;
12152
12212
  if (item.box) {
12153
12213
  other.restore();
12154
12214
  other.save();
12155
12215
  if (worldCanvas) {
12156
- other.copyWorld(other, bounds, nowWorld, "copy");
12216
+ other.copyWorld(other, renderBounds, nowWorld, "copy");
12157
12217
  copyBounds = nowWorld;
12158
12218
  }
12159
12219
  worldCanvas ? other.copyWorld(worldCanvas, nowWorld, nowWorld, "destination-out") : other.copyWorld(shape.canvas, shapeBounds, bounds, "destination-out");
12160
12220
  }
12161
- 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);
12162
12222
  if (end && index < end) other.clearWorld(copyBounds);
12163
12223
  });
12164
12224
  other.recycle(copyBounds);
12165
12225
  }
12166
12226
 
12167
- function getShadowSpread(_ui, shadow) {
12168
- let width = 0;
12169
- 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));
12170
- 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$1(top, spread + blur - y);
12232
+ right = max$1(right, spread + blur + x);
12233
+ bottom = max$1(bottom, spread + blur + y);
12234
+ left = max$1(left, spread + blur - x);
12235
+ });
12236
+ return top === right && right === bottom && bottom === left ? top : [ top, right, bottom, left ];
12171
12237
  }
12172
12238
 
12173
- function drawWorldShadow(canvas, outBounds, spreadScale, shape) {
12174
- const {bounds: bounds, shapeBounds: shapeBounds} = shape;
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;
12249
+ }
12250
+
12251
+ function drawWorldShadow(canvas, outBounds, shape) {
12252
+ const {shapeBounds: shapeBounds} = shape;
12253
+ let from, to;
12175
12254
  if (Platform.fullImageShadow) {
12176
12255
  copy$3(tempBounds, canvas.bounds);
12177
- tempBounds.x += outBounds.x - shapeBounds.x;
12178
- tempBounds.y += outBounds.y - shapeBounds.y;
12179
- if (spreadScale) {
12180
- const {fitMatrix: fitMatrix} = shape;
12181
- tempBounds.x -= (bounds.x + (fitMatrix ? fitMatrix.e : 0) + bounds.width / 2) * (spreadScale - 1);
12182
- tempBounds.y -= (bounds.y + (fitMatrix ? fitMatrix.f : 0) + bounds.height / 2) * (spreadScale - 1);
12183
- tempBounds.width *= spreadScale;
12184
- tempBounds.height *= spreadScale;
12185
- }
12186
- canvas.copyWorld(shape.canvas, canvas.bounds, tempBounds);
12256
+ move$6(tempBounds, outBounds.x - shapeBounds.x, outBounds.y - shapeBounds.y);
12257
+ from = canvas.bounds, to = tempBounds;
12187
12258
  } else {
12188
- if (spreadScale) {
12189
- copy$3(tempBounds, outBounds);
12190
- tempBounds.x -= outBounds.width / 2 * (spreadScale - 1);
12191
- tempBounds.y -= outBounds.height / 2 * (spreadScale - 1);
12192
- tempBounds.width *= spreadScale;
12193
- tempBounds.height *= spreadScale;
12194
- }
12195
- canvas.copyWorld(shape.canvas, shapeBounds, spreadScale ? tempBounds : outBounds);
12259
+ from = shapeBounds, to = outBounds;
12196
12260
  }
12261
+ canvas.copyWorld(shape.canvas, from, to);
12197
12262
  }
12198
12263
 
12199
12264
  const {toOffsetOutBounds: toOffsetOutBounds} = BoundsHelper;
@@ -12201,13 +12266,13 @@ const {toOffsetOutBounds: toOffsetOutBounds} = BoundsHelper;
12201
12266
  const offsetOutBounds = {};
12202
12267
 
12203
12268
  function innerShadow(ui, current, shape) {
12204
- let copyBounds, spreadScale;
12205
- const {__nowWorld: nowWorld, __layout: __layout} = ui;
12269
+ let copyBounds, transform;
12270
+ const {__nowWorld: nowWorld} = ui;
12206
12271
  const {innerShadow: innerShadow} = ui.__;
12207
- 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;
12208
12273
  const other = current.getSameCanvas();
12209
12274
  const end = innerShadow.length - 1;
12210
- toOffsetOutBounds(bounds, offsetOutBounds);
12275
+ toOffsetOutBounds(bounds, offsetOutBounds, renderBounds);
12211
12276
  innerShadow.forEach((item, index) => {
12212
12277
  let otherScale = 1;
12213
12278
  if (item.scaleFixed) {
@@ -12215,17 +12280,18 @@ function innerShadow(ui, current, shape) {
12215
12280
  if (sx > 1) otherScale = 1 / sx;
12216
12281
  }
12217
12282
  other.save();
12218
- other.setWorldShadow(offsetOutBounds.offsetX + item.x * scaleX * otherScale, offsetOutBounds.offsetY + item.y * scaleY * otherScale, item.blur * scaleX * otherScale);
12219
- spreadScale = item.spread ? 1 - item.spread * 2 / (__layout.boxBounds.width + (__layout.strokeBoxSpread || 0) * 2) * otherScale : 0;
12220
- drawWorldShadow(other, offsetOutBounds, spreadScale, shape);
12283
+ other.setWorldShadow(offsetOutBounds.offsetX + (item.x || 0) * scaleX * otherScale, offsetOutBounds.offsetY + (item.y || 0) * scaleY * otherScale, (item.blur || 0) * scaleX * otherScale);
12284
+ transform = Effect.getShadowTransform(ui, other, shape, item, offsetOutBounds, otherScale, true);
12285
+ if (transform) other.setTransform(transform);
12286
+ drawWorldShadow(other, offsetOutBounds, shape);
12221
12287
  other.restore();
12222
12288
  if (worldCanvas) {
12223
- other.copyWorld(other, bounds, nowWorld, "copy");
12289
+ other.copyWorld(other, renderBounds, nowWorld, "copy");
12224
12290
  other.copyWorld(worldCanvas, nowWorld, nowWorld, "source-out");
12225
12291
  copyBounds = nowWorld;
12226
12292
  } else {
12227
12293
  other.copyWorld(shape.canvas, shapeBounds, bounds, "source-out");
12228
- copyBounds = bounds;
12294
+ copyBounds = renderBounds;
12229
12295
  }
12230
12296
  other.fillWorld(copyBounds, ColorConvert.string(item.color), "source-in");
12231
12297
  LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
@@ -12234,6 +12300,8 @@ function innerShadow(ui, current, shape) {
12234
12300
  other.recycle(copyBounds);
12235
12301
  }
12236
12302
 
12303
+ const getInnerShadowSpread = getShadowRenderSpread;
12304
+
12237
12305
  function blur(ui, current, origin) {
12238
12306
  const {blur: blur} = ui.__;
12239
12307
  origin.setWorldBlur(blur * ui.__nowWorld.a);
@@ -12248,10 +12316,12 @@ const EffectModule = {
12248
12316
  innerShadow: innerShadow,
12249
12317
  blur: blur,
12250
12318
  backgroundBlur: backgroundBlur,
12251
- getShadowSpread: getShadowSpread,
12319
+ getShadowRenderSpread: getShadowRenderSpread,
12320
+ getShadowTransform: getShadowTransform,
12252
12321
  isTransformShadow(_shadow) {
12253
12322
  return undefined;
12254
- }
12323
+ },
12324
+ getInnerShadowSpread: getInnerShadowSpread
12255
12325
  };
12256
12326
 
12257
12327
  const {excludeRenderBounds: excludeRenderBounds} = LeafBoundsHelper;
@@ -12268,6 +12338,7 @@ Group.prototype.__renderMask = function(canvas, options) {
12268
12338
  maskEnd(this, currentMask, canvas, contentCanvas, maskCanvas, maskOpacity, undefined, true);
12269
12339
  maskCanvas = contentCanvas = null;
12270
12340
  }
12341
+ if (mask === "clipping" || mask === "clipping-path") excludeRenderBounds(child, options) || child.__render(canvas, options);
12271
12342
  maskOpacity = child.__.opacity;
12272
12343
  usedGrayscaleAlpha = false;
12273
12344
  if (mask === "path" || mask === "clipping-path") {
@@ -12285,7 +12356,6 @@ Group.prototype.__renderMask = function(canvas, options) {
12285
12356
  if (!contentCanvas) contentCanvas = getCanvas(canvas);
12286
12357
  child.__render(maskCanvas, options);
12287
12358
  }
12288
- if (mask === "clipping" || mask === "clipping-path") excludeRenderBounds(child, options) || child.__render(canvas, options);
12289
12359
  continue;
12290
12360
  }
12291
12361
  const childBlendMode = maskOpacity === 1 && child.__.__blendMode;
@@ -12847,6 +12917,7 @@ const TextConvertModule = {
12847
12917
  };
12848
12918
 
12849
12919
  function string(color, opacity) {
12920
+ if (!color) return "#000";
12850
12921
  const doOpacity = isNumber(opacity) && opacity < 1;
12851
12922
  if (isString(color)) {
12852
12923
  if (doOpacity && ColorConvert.object) color = ColorConvert.object(color); else return color;
@@ -12928,10 +12999,6 @@ function targetAttr(fn) {
12928
12999
  if (t.config) {
12929
13000
  const isSelect = key === "target";
12930
13001
  if (isSelect) {
12931
- t.setDimOthers(false);
12932
- t.setBright(false);
12933
- if (isArray(value) && value.length > 1 && value[0].locked) value.splice(0, 1);
12934
- if (t.single) t.element.syncEventer = null;
12935
13002
  const {beforeSelect: beforeSelect} = t.config;
12936
13003
  if (beforeSelect) {
12937
13004
  const check = beforeSelect({
@@ -12939,6 +13006,10 @@ function targetAttr(fn) {
12939
13006
  });
12940
13007
  if (isObject(check)) value = check; else if (check === false) return;
12941
13008
  }
13009
+ t.setDimOthers(false);
13010
+ t.setBright(false);
13011
+ if (isArray(value) && value.length > 1 && value[0].locked) value.splice(0, 1);
13012
+ if (t.single) t.element.syncEventer = null;
12942
13013
  }
12943
13014
  const type = isSelect ? EditorEvent.BEFORE_SELECT : EditorEvent.BEFORE_HOVER;
12944
13015
  if (this.hasEvent(type)) this.emitEvent(new EditorEvent(type, {
@@ -13124,11 +13195,12 @@ class EditSelect extends Group {
13124
13195
  return !!this.originList;
13125
13196
  }
13126
13197
  get running() {
13127
- const {editor: editor} = this;
13128
- return this.hittable && editor.visible && editor.hittable && editor.mergeConfig.selector && this.app.mode === "normal";
13198
+ const {editor: editor, app: app} = this;
13199
+ return this.hittable && editor.visible && editor.hittable && editor.mergeConfig.selector && (app && app.mode === "normal");
13129
13200
  }
13130
13201
  get isMoveMode() {
13131
- return this.app && this.app.interaction.moveMode;
13202
+ const {app: app} = this;
13203
+ return app && app.interaction.moveMode;
13132
13204
  }
13133
13205
  constructor(editor) {
13134
13206
  super();
@@ -13191,12 +13263,12 @@ class EditSelect extends Group {
13191
13263
  onTap(e) {
13192
13264
  if (e.multiTouch) return;
13193
13265
  const {editor: editor} = this;
13194
- const {select: select} = editor.mergeConfig;
13266
+ const {select: select, selectKeep: selectKeep} = editor.mergeConfig;
13195
13267
  if (select === "tap") this.checkAndSelect(e); else if (this.waitSelect) this.waitSelect();
13196
13268
  if (this.needRemoveItem) {
13197
13269
  editor.removeItem(this.needRemoveItem);
13198
13270
  } else if (this.isMoveMode) {
13199
- editor.target = null;
13271
+ if (!selectKeep) editor.target = null;
13200
13272
  }
13201
13273
  }
13202
13274
  checkAndSelect(e) {
@@ -13211,7 +13283,7 @@ class EditSelect extends Group {
13211
13283
  editor.target = find;
13212
13284
  }
13213
13285
  } else if (this.allow(e.target)) {
13214
- if (!this.isHoldMultipleSelectKey(e)) editor.target = null;
13286
+ if (!this.isHoldMultipleSelectKey(e) && !this.editor.mergedConfig.selectKeep) editor.target = null;
13215
13287
  }
13216
13288
  }
13217
13289
  }
@@ -13330,91 +13402,95 @@ const {toPoint: toPoint} = AroundHelper;
13330
13402
  const {within: within$3, sign: sign$1} = MathHelper;
13331
13403
 
13332
13404
  const EditDataHelper = {
13333
- getScaleData(target, startBounds, direction, totalMove, lockRatio, around, flipable, scaleMode) {
13405
+ getScaleData(target, startBounds, direction, totalMoveOrScale, lockRatio, around, flipable, scaleMode) {
13334
13406
  let align, origin = {}, scaleX = 1, scaleY = 1;
13335
13407
  const {boxBounds: boxBounds, widthRange: widthRange, heightRange: heightRange, dragBounds: dragBounds, worldBoxBounds: worldBoxBounds} = target;
13336
13408
  const {width: width, height: height} = startBounds;
13337
- if (around) {
13338
- totalMove.x *= 2;
13339
- totalMove.y *= 2;
13340
- }
13341
13409
  const originChangedScaleX = target.scaleX / startBounds.scaleX;
13342
13410
  const originChangedScaleY = target.scaleY / startBounds.scaleY;
13343
13411
  const signX = sign$1(originChangedScaleX);
13344
13412
  const signY = sign$1(originChangedScaleY);
13345
13413
  const changedScaleX = scaleMode ? originChangedScaleX : signX * boxBounds.width / width;
13346
13414
  const changedScaleY = scaleMode ? originChangedScaleY : signY * boxBounds.height / height;
13347
- totalMove.x *= scaleMode ? originChangedScaleX : signX;
13348
- totalMove.y *= scaleMode ? originChangedScaleY : signY;
13349
- const topScale = (-totalMove.y + height) / height;
13350
- const rightScale = (totalMove.x + width) / width;
13351
- const bottomScale = (totalMove.y + height) / height;
13352
- const leftScale = (-totalMove.x + width) / width;
13353
- switch (direction) {
13354
- case top$1:
13355
- scaleY = topScale;
13356
- align = "bottom";
13357
- break;
13415
+ if (isNumber(totalMoveOrScale)) {
13416
+ scaleX = scaleY = Math.sqrt(totalMoveOrScale);
13417
+ } else {
13418
+ if (around) {
13419
+ totalMoveOrScale.x *= 2;
13420
+ totalMoveOrScale.y *= 2;
13421
+ }
13422
+ totalMoveOrScale.x *= scaleMode ? originChangedScaleX : signX;
13423
+ totalMoveOrScale.y *= scaleMode ? originChangedScaleY : signY;
13424
+ const topScale = (-totalMoveOrScale.y + height) / height;
13425
+ const rightScale = (totalMoveOrScale.x + width) / width;
13426
+ const bottomScale = (totalMoveOrScale.y + height) / height;
13427
+ const leftScale = (-totalMoveOrScale.x + width) / width;
13428
+ switch (direction) {
13429
+ case top$1:
13430
+ scaleY = topScale;
13431
+ align = "bottom";
13432
+ break;
13358
13433
 
13359
- case right$2:
13360
- scaleX = rightScale;
13361
- align = "left";
13362
- break;
13434
+ case right$2:
13435
+ scaleX = rightScale;
13436
+ align = "left";
13437
+ break;
13363
13438
 
13364
- case bottom$1:
13365
- scaleY = bottomScale;
13366
- align = "top";
13367
- break;
13439
+ case bottom$1:
13440
+ scaleY = bottomScale;
13441
+ align = "top";
13442
+ break;
13368
13443
 
13369
- case left$2:
13370
- scaleX = leftScale;
13371
- align = "right";
13372
- break;
13444
+ case left$2:
13445
+ scaleX = leftScale;
13446
+ align = "right";
13447
+ break;
13373
13448
 
13374
- case topLeft$1:
13375
- scaleY = topScale;
13376
- scaleX = leftScale;
13377
- align = "bottom-right";
13378
- break;
13449
+ case topLeft$1:
13450
+ scaleY = topScale;
13451
+ scaleX = leftScale;
13452
+ align = "bottom-right";
13453
+ break;
13379
13454
 
13380
- case topRight$1:
13381
- scaleY = topScale;
13382
- scaleX = rightScale;
13383
- align = "bottom-left";
13384
- break;
13455
+ case topRight$1:
13456
+ scaleY = topScale;
13457
+ scaleX = rightScale;
13458
+ align = "bottom-left";
13459
+ break;
13385
13460
 
13386
- case bottomRight:
13387
- scaleY = bottomScale;
13388
- scaleX = rightScale;
13389
- align = "top-left";
13390
- break;
13461
+ case bottomRight:
13462
+ scaleY = bottomScale;
13463
+ scaleX = rightScale;
13464
+ align = "top-left";
13465
+ break;
13391
13466
 
13392
- case bottomLeft:
13393
- scaleY = bottomScale;
13394
- scaleX = leftScale;
13395
- align = "top-right";
13396
- }
13397
- if (lockRatio) {
13398
- if (lockRatio === "corner" && direction % 2) {
13399
- lockRatio = false;
13400
- } else {
13401
- let scale;
13402
- switch (direction) {
13403
- case top$1:
13404
- case bottom$1:
13405
- scale = scaleY;
13406
- break;
13467
+ case bottomLeft:
13468
+ scaleY = bottomScale;
13469
+ scaleX = leftScale;
13470
+ align = "top-right";
13471
+ }
13472
+ if (lockRatio) {
13473
+ if (lockRatio === "corner" && direction % 2) {
13474
+ lockRatio = false;
13475
+ } else {
13476
+ let scale;
13477
+ switch (direction) {
13478
+ case top$1:
13479
+ case bottom$1:
13480
+ scale = scaleY;
13481
+ break;
13407
13482
 
13408
- case left$2:
13409
- case right$2:
13410
- scale = scaleX;
13411
- break;
13483
+ case left$2:
13484
+ case right$2:
13485
+ scale = scaleX;
13486
+ break;
13412
13487
 
13413
- default:
13414
- scale = Math.sqrt(Math.abs(scaleX * scaleY));
13488
+ default:
13489
+ scale = Math.sqrt(Math.abs(scaleX * scaleY));
13490
+ }
13491
+ scaleX = scaleX < 0 ? -scale : scale;
13492
+ scaleY = scaleY < 0 ? -scale : scale;
13415
13493
  }
13416
- scaleX = scaleX < 0 ? -scale : scale;
13417
- scaleY = scaleY < 0 ? -scale : scale;
13418
13494
  }
13419
13495
  }
13420
13496
  const useScaleX = scaleX !== 1, useScaleY = scaleY !== 1;
@@ -13702,6 +13778,9 @@ class EditBox extends Group {
13702
13778
  const {moveable: moveable, resizeable: resizeable, rotateable: rotateable} = this.mergeConfig;
13703
13779
  return isString(moveable) || isString(resizeable) || isString(rotateable);
13704
13780
  }
13781
+ get canDragLimitAnimate() {
13782
+ return this.moving && this.mergeConfig.dragLimitAnimate && this.target.dragBounds;
13783
+ }
13705
13784
  constructor(editor) {
13706
13785
  super();
13707
13786
  this.view = new Group;
@@ -13935,10 +14014,9 @@ class EditBox extends Group {
13935
14014
  onDragStart(e) {
13936
14015
  this.dragging = true;
13937
14016
  const point = this.dragPoint = e.current, {pointType: pointType} = point;
13938
- const {editor: editor, dragStartData: dragStartData} = this, {target: target} = this, {moveable: moveable, resizeable: resizeable, rotateable: rotateable, skewable: skewable, hideOnMove: hideOnMove} = this.mergeConfig;
14017
+ const {moveable: moveable, resizeable: resizeable, rotateable: rotateable, skewable: skewable} = this.mergeConfig;
13939
14018
  if (pointType === "move") {
13940
14019
  moveable && (this.moving = true);
13941
- editor.opacity = hideOnMove ? 0 : 1;
13942
14020
  } else {
13943
14021
  if (pointType.includes("rotate") || this.isHoldRotateKey(e) || !resizeable) {
13944
14022
  rotateable && (this.rotating = true);
@@ -13947,23 +14025,7 @@ class EditBox extends Group {
13947
14025
  } else if (pointType === "resize") resizeable && (this.resizing = true);
13948
14026
  if (pointType === "skew") skewable && (this.skewing = true);
13949
14027
  }
13950
- dragStartData.x = e.x;
13951
- dragStartData.y = e.y;
13952
- dragStartData.point = {
13953
- x: target.x,
13954
- y: target.y
13955
- };
13956
- dragStartData.bounds = Object.assign({}, target.getLayoutBounds("box", "local"));
13957
- dragStartData.rotation = target.rotation;
13958
- if (pointType && pointType.includes("resize")) ResizeEvent.resizingKeys = editor.leafList.keys;
13959
- }
13960
- onDragEnd(e) {
13961
- if (this.moving && this.mergeConfig.dragLimitAnimate && this.target.dragBounds) this.transformTool.onMove(e);
13962
- this.dragPoint = null;
13963
- this.resetDoing();
13964
- const {pointType: pointType} = e.current;
13965
- if (pointType === "move") this.editor.opacity = 1;
13966
- if (pointType && pointType.includes("resize")) ResizeEvent.resizingKeys = null;
14028
+ this.onTransformStart(e);
13967
14029
  }
13968
14030
  onDrag(e) {
13969
14031
  const {transformTool: transformTool, moving: moving, resizing: resizing, rotating: rotating, skewing: skewing} = this;
@@ -13978,37 +14040,59 @@ class EditBox extends Group {
13978
14040
  }
13979
14041
  updatePointCursor(this, e);
13980
14042
  }
13981
- resetDoing() {
13982
- if (this.canUse) this.dragging = this.gesturing = this.moving = this.resizing = this.rotating = this.skewing = false;
14043
+ onDragEnd(e) {
14044
+ this.onTransformEnd(e);
14045
+ this.dragPoint = null;
14046
+ }
14047
+ onTransformStart(e) {
14048
+ if (this.canUse) {
14049
+ if (this.moving) this.editor.opacity = this.mergedConfig.hideOnMove ? 0 : 1;
14050
+ if (this.resizing) ResizeEvent.resizingKeys = this.editor.leafList.keys;
14051
+ const {dragStartData: dragStartData, target: target} = this;
14052
+ dragStartData.x = e.x;
14053
+ dragStartData.y = e.y;
14054
+ dragStartData.totalOffset = getPointData();
14055
+ dragStartData.point = {
14056
+ x: target.x,
14057
+ y: target.y
14058
+ };
14059
+ dragStartData.bounds = Object.assign({}, target.getLayoutBounds("box", "local"));
14060
+ dragStartData.rotation = target.rotation;
14061
+ }
14062
+ }
14063
+ onTransformEnd(e) {
14064
+ if (this.canUse) {
14065
+ if (this.canDragLimitAnimate && (e instanceof DragEvent || e instanceof MoveEvent)) this.transformTool.onMove(e);
14066
+ if (this.resizing) ResizeEvent.resizingKeys = null;
14067
+ this.dragging = this.gesturing = this.moving = this.resizing = this.rotating = this.skewing = false;
14068
+ this.editor.opacity = 1;
14069
+ this.update();
14070
+ }
13983
14071
  }
13984
14072
  onMove(e) {
13985
14073
  if (this.canGesture && e.moveType !== "drag") {
13986
14074
  e.stop();
13987
- if (isString(this.mergeConfig.moveable)) {
14075
+ if (isString(this.mergedConfig.moveable)) {
13988
14076
  this.gesturing = this.moving = true;
13989
- this.transformTool.onMove(e);
14077
+ e.type === MoveEvent.START ? this.onTransformStart(e) : this.transformTool.onMove(e);
13990
14078
  }
13991
14079
  }
13992
14080
  }
13993
- onMoveEnd(e) {
13994
- if (this.moving) this.transformTool.onMove(e);
13995
- this.resetDoing();
13996
- }
13997
14081
  onScale(e) {
13998
14082
  if (this.canGesture) {
13999
14083
  e.stop();
14000
- if (isString(this.mergeConfig.resizeable)) {
14084
+ if (isString(this.mergedConfig.resizeable)) {
14001
14085
  this.gesturing = this.resizing = true;
14002
- this.transformTool.onScale(e);
14086
+ e.type === ZoomEvent.START ? this.onTransformStart(e) : this.transformTool.onScale(e);
14003
14087
  }
14004
14088
  }
14005
14089
  }
14006
14090
  onRotate(e) {
14007
14091
  if (this.canGesture) {
14008
14092
  e.stop();
14009
- if (isString(this.mergeConfig.rotateable)) {
14093
+ if (isString(this.mergedConfig.rotateable)) {
14010
14094
  this.gesturing = this.rotating = true;
14011
- this.transformTool.onRotate(e);
14095
+ e.type === RotateEvent.START ? this.onTransformStart(e) : this.transformTool.onRotate(e);
14012
14096
  }
14013
14097
  }
14014
14098
  }
@@ -14021,8 +14105,7 @@ class EditBox extends Group {
14021
14105
  updatePointCursor(this, e);
14022
14106
  }
14023
14107
  onArrow(e) {
14024
- const {editor: editor, transformTool: transformTool} = this;
14025
- if (this.canUse && editor.editing && this.mergeConfig.keyEvent) {
14108
+ if (this.canUse && this.mergeConfig.keyEvent) {
14026
14109
  let x = 0, y = 0;
14027
14110
  const distance = e.shiftKey ? 10 : 1;
14028
14111
  switch (e.code) {
@@ -14041,7 +14124,7 @@ class EditBox extends Group {
14041
14124
  case "ArrowRight":
14042
14125
  x = distance;
14043
14126
  }
14044
- if (x || y) transformTool.move(x, y);
14127
+ if (x || y) this.transformTool.move(x, y);
14045
14128
  }
14046
14129
  }
14047
14130
  onDoubleTap(e) {
@@ -14082,7 +14165,7 @@ class EditBox extends Group {
14082
14165
  const {rect: rect, editor: editor, __eventIds: events} = this;
14083
14166
  events.push(rect.on_([ [ PointerEvent.DOUBLE_TAP, this.onDoubleTap, this ], [ PointerEvent.LONG_PRESS, this.onLongPress, this ] ]));
14084
14167
  this.waitLeafer(() => {
14085
- events.push(editor.app.on_([ [ [ KeyEvent.HOLD, KeyEvent.UP ], this.onKey, this ], [ KeyEvent.DOWN, this.onArrow, this ], [ MoveEvent.BEFORE_MOVE, this.onMove, this, true ], [ ZoomEvent.BEFORE_ZOOM, this.onScale, this, true ], [ RotateEvent.BEFORE_ROTATE, this.onRotate, this, true ], [ MoveEvent.END, this.onMoveEnd, this ], [ ZoomEvent.END, this.resetDoing, this ], [ RotateEvent.END, this.resetDoing, this ] ]));
14168
+ events.push(editor.app.on_([ [ [ KeyEvent.HOLD, KeyEvent.UP ], this.onKey, this ], [ KeyEvent.DOWN, this.onArrow, this ], [ [ MoveEvent.START, MoveEvent.BEFORE_MOVE ], this.onMove, this, true ], [ [ ZoomEvent.START, ZoomEvent.BEFORE_ZOOM ], this.onScale, this, true ], [ [ RotateEvent.START, RotateEvent.BEFORE_ROTATE ], this.onRotate, this, true ], [ [ MoveEvent.END, ZoomEvent.END, RotateEvent.END ], this.onTransformEnd, this ] ]));
14086
14169
  });
14087
14170
  }
14088
14171
  __removeListenEvents() {
@@ -14480,56 +14563,61 @@ class TransformTool {
14480
14563
  const isMoveEnd = e.type === MoveEvent.END || e.type === DragEvent.END;
14481
14564
  const axisDrag = isString(target.draggable);
14482
14565
  const checkLimitMove = !dragLimitAnimate || isMoveEnd || axisDrag;
14566
+ const total = {
14567
+ x: e.totalX,
14568
+ y: e.totalY
14569
+ };
14483
14570
  if (e instanceof MoveEvent) {
14484
- move = e.getLocalMove(target);
14485
- if (checkLimitMove) DragEvent.limitMove(target, move);
14486
- } else {
14487
- const total = {
14488
- x: e.totalX,
14489
- y: e.totalY
14490
- };
14491
- if (e.shiftKey) {
14492
- if (Math.abs(total.x) > Math.abs(total.y)) total.y = 0; else total.x = 0;
14493
- }
14494
- move = DragEvent.getValidMove(target, dragStartData.point, total, checkLimitMove);
14571
+ PointHelper.move(total, target.getWorldPointByLocal(dragStartData.totalOffset, null, true));
14495
14572
  }
14573
+ if (e.shiftKey) {
14574
+ if (Math.abs(total.x) > Math.abs(total.y)) total.y = 0; else total.x = 0;
14575
+ }
14576
+ move = DragEvent.getValidMove(target, dragStartData.point, total, checkLimitMove);
14496
14577
  if (move.x || move.y) {
14497
14578
  if (dragLimitAnimate && !axisDrag && isMoveEnd) LeafHelper.animateMove(this, move, isNumber(dragLimitAnimate) ? dragLimitAnimate : .3); else this.move(move);
14498
14579
  }
14499
14580
  }
14500
14581
  onScale(e) {
14501
14582
  const {target: target, mergeConfig: mergeConfig, single: single, dragStartData: dragStartData} = this.editBox;
14502
- let {around: around, lockRatio: lockRatio, flipable: flipable, editSize: editSize} = mergeConfig;
14583
+ let {around: around, lockRatio: lockRatio, flipable: flipable, editSize: editSize} = mergeConfig, totalMove;
14503
14584
  if (e instanceof ZoomEvent) {
14504
- this.scaleOf(target.getBoxPoint(e), e.scale, e.scale);
14585
+ around = target.getBoxPoint(e);
14586
+ totalMove = e.totalScale;
14505
14587
  } else {
14506
- const {direction: direction} = e.current;
14507
- if (e.shiftKey || target.lockRatio) lockRatio = true;
14508
- const data = EditDataHelper.getScaleData(target, dragStartData.bounds, direction, e.getInnerTotal(target), lockRatio, EditDataHelper.getAround(around, e.altKey), flipable, !single || editSize === "scale");
14509
- if (this.editTool && this.editTool.onScaleWithDrag) {
14510
- data.drag = e;
14511
- this.scaleWithDrag(data);
14512
- } else {
14513
- this.scaleOf(data.origin, data.scaleX, data.scaleY);
14514
- }
14588
+ totalMove = e.getInnerTotal(target);
14589
+ }
14590
+ const {direction: direction} = e.current;
14591
+ if (e.shiftKey || target.lockRatio) lockRatio = true;
14592
+ const data = EditDataHelper.getScaleData(target, dragStartData.bounds, direction, totalMove, lockRatio, EditDataHelper.getAround(around, e.altKey), flipable, !single || editSize === "scale");
14593
+ const targetX = target.x, targetY = target.y;
14594
+ if (e instanceof DragEvent && this.editTool && this.editTool.onScaleWithDrag) {
14595
+ data.drag = e;
14596
+ this.scaleWithDrag(data);
14597
+ } else {
14598
+ this.scaleOf(data.origin, data.scaleX, data.scaleY);
14515
14599
  }
14600
+ PointHelper.move(dragStartData.totalOffset, target.x - targetX, target.y - targetY);
14516
14601
  }
14517
14602
  onRotate(e) {
14518
14603
  const {target: target, mergeConfig: mergeConfig, dragStartData: dragStartData} = this.editBox;
14519
- const {around: around, rotateAround: rotateAround, rotateGap: rotateGap} = mergeConfig;
14604
+ const {around: around, rotateAround: rotateAround, rotateGap: rotateGap, diagonalRotateKey: diagonalRotateKey} = mergeConfig;
14520
14605
  const {direction: direction} = e.current;
14521
14606
  let origin, rotation;
14522
14607
  if (e instanceof RotateEvent) {
14523
14608
  rotation = e.rotation;
14524
14609
  origin = rotateAround ? AroundHelper.getPoint(rotateAround, target.boxBounds) : target.getBoxPoint(e);
14525
14610
  } else {
14526
- const data = EditDataHelper.getRotateData(target, direction, e, dragStartData, e.shiftKey ? null : rotateAround || target.around || target.origin || around || "center");
14611
+ const isDiagonalRotate = diagonalRotateKey ? e.isHoldKeys(diagonalRotateKey) : e.shiftKey;
14612
+ const data = EditDataHelper.getRotateData(target, direction, e, dragStartData, isDiagonalRotate ? null : rotateAround || target.around || target.origin || around || "center");
14527
14613
  rotation = dragStartData.rotation + data.rotation - target.rotation;
14528
14614
  origin = data.origin;
14529
14615
  }
14530
14616
  rotation = MathHelper.float(MathHelper.getGapRotation(rotation, rotateGap, target.rotation), 2);
14531
14617
  if (!rotation) return;
14618
+ const targetX = target.x, targetY = target.y;
14532
14619
  this.rotateOf(origin, rotation);
14620
+ PointHelper.move(dragStartData.totalOffset, target.x - targetX, target.y - targetY);
14533
14621
  }
14534
14622
  onSkew(e) {
14535
14623
  const {target: target, mergeConfig: mergeConfig} = this.editBox;
@@ -15272,7 +15360,7 @@ let LineEditTool = class LineEditTool extends EditTool {
15272
15360
 
15273
15361
  LineEditTool = __decorate([ registerEditTool() ], LineEditTool);
15274
15362
 
15275
- const {M: M$3, L: L$3, C: C$3, Q: Q$2, Z: Z$2, N: N$1, D: D$1, X: X$1, G: G$1, F: F$1, O: O$2, P: P$1, U: U$1} = PathCommandMap;
15363
+ const {M: M$4, L: L$3, C: C$3, Q: Q$2, Z: Z$2, N: N$1, D: D$1, X: X$1, G: G$1, F: F$1, O: O$2, P: P$1, U: U$1} = PathCommandMap;
15276
15364
 
15277
15365
  const PathScaler = {
15278
15366
  scale(data, scaleX, scaleY) {
@@ -15282,7 +15370,7 @@ const PathScaler = {
15282
15370
  while (i < len) {
15283
15371
  command = data[i];
15284
15372
  switch (command) {
15285
- case M$3:
15373
+ case M$4:
15286
15374
  case L$3:
15287
15375
  scalePoints(data, scaleX, scaleY, i, 1);
15288
15376
  i += 3;
@@ -15621,6 +15709,13 @@ register("design", design);
15621
15709
  register("document", document);
15622
15710
 
15623
15711
  const MultiTouchHelper = {
15712
+ state: {
15713
+ type: "none",
15714
+ typeCount: 0,
15715
+ startTime: 0,
15716
+ totalData: null,
15717
+ center: {}
15718
+ },
15624
15719
  getData(list) {
15625
15720
  const a = list[0], b = list[1];
15626
15721
  const lastCenter = PointHelper.getCenter(a.from, b.from);
@@ -15639,9 +15734,53 @@ const MultiTouchHelper = {
15639
15734
  rotation: rotation,
15640
15735
  center: center
15641
15736
  };
15737
+ },
15738
+ getType(data, config) {
15739
+ const moveScore = Math.hypot(data.move.x, data.move.y) / (config.move || 5);
15740
+ const scaleScore = Math.abs(data.scale - 1) / (config.scale || .03);
15741
+ const rotateScore = Math.abs(data.rotation) / (config.rotation || 2);
15742
+ if (moveScore < 1 && scaleScore < 1 && rotateScore < 1) return "none";
15743
+ if (moveScore >= scaleScore && moveScore >= rotateScore) return "move";
15744
+ if (scaleScore >= rotateScore) return "zoom";
15745
+ return "rotate";
15746
+ },
15747
+ detect(data, config) {
15748
+ const {state: state} = M$3;
15749
+ const type = M$3.getType(data, config);
15750
+ if (!state.totalData) {
15751
+ state.startTime = Date.now();
15752
+ state.center = data.center;
15753
+ }
15754
+ M$3.add(data, state.totalData);
15755
+ state.totalData = data;
15756
+ if (type === state.type) {
15757
+ state.typeCount++;
15758
+ if (state.typeCount >= (config.count || 3) && type !== "none") return type;
15759
+ } else {
15760
+ state.type = type;
15761
+ state.typeCount = 1;
15762
+ }
15763
+ if (Date.now() - state.startTime >= (config.time || 160)) return M$3.getType(state.totalData, config);
15764
+ return "none";
15765
+ },
15766
+ add(data, add) {
15767
+ if (!add) return;
15768
+ PointHelper.move(data.move, add.move);
15769
+ data.scale *= add.scale;
15770
+ data.rotation += add.rotation;
15771
+ data.center = add.center;
15772
+ },
15773
+ reset() {
15774
+ const {state: state} = M$3;
15775
+ state.type = "none";
15776
+ state.typeCount = 0;
15777
+ state.startTime = 0;
15778
+ state.totalData = null;
15642
15779
  }
15643
15780
  };
15644
15781
 
15782
+ const M$3 = MultiTouchHelper;
15783
+
15645
15784
  const {abs: abs$2, max: max} = Math, {sign: sign, within: within$2} = MathHelper;
15646
15785
 
15647
15786
  const WheelEventHelper = {
@@ -15681,9 +15820,20 @@ const WheelEventHelper = {
15681
15820
  }
15682
15821
  };
15683
15822
 
15823
+ let totalX, totalY, totalScale, totalRotation;
15824
+
15684
15825
  class Transformer {
15685
15826
  get transforming() {
15686
- return !!(this.moveData || this.zoomData || this.rotateData);
15827
+ return this.moving || this.zooming || this.rotating;
15828
+ }
15829
+ get moving() {
15830
+ return !!this.moveData;
15831
+ }
15832
+ get zooming() {
15833
+ return !!this.zoomData;
15834
+ }
15835
+ get rotating() {
15836
+ return !!this.rotateData;
15687
15837
  }
15688
15838
  constructor(interaction) {
15689
15839
  this.interaction = interaction;
@@ -15693,13 +15843,18 @@ class Transformer {
15693
15843
  if (!data.moveType) data.moveType = "move";
15694
15844
  if (!this.moveData) {
15695
15845
  this.setPath(data);
15846
+ totalX = 0, totalY = 0;
15696
15847
  this.moveData = Object.assign(Object.assign({}, data), {
15697
15848
  moveX: 0,
15698
- moveY: 0
15849
+ moveY: 0,
15850
+ totalX: totalX,
15851
+ totalY: totalY
15699
15852
  });
15700
15853
  interaction.emit(MoveEvent.START, this.moveData);
15701
15854
  }
15702
15855
  data.path = this.moveData.path;
15856
+ data.totalX = totalX = totalX + data.moveX;
15857
+ data.totalY = totalY = totalY + data.moveY;
15703
15858
  interaction.emit(MoveEvent.BEFORE_MOVE, data);
15704
15859
  interaction.emit(MoveEvent.MOVE, data);
15705
15860
  this.transformEndWait();
@@ -15708,12 +15863,15 @@ class Transformer {
15708
15863
  const {interaction: interaction} = this;
15709
15864
  if (!this.zoomData) {
15710
15865
  this.setPath(data);
15866
+ totalScale = 1;
15711
15867
  this.zoomData = Object.assign(Object.assign({}, data), {
15712
- scale: 1
15868
+ scale: 1,
15869
+ totalScale: totalScale
15713
15870
  });
15714
15871
  interaction.emit(ZoomEvent.START, this.zoomData);
15715
15872
  }
15716
15873
  data.path = this.zoomData.path;
15874
+ data.totalScale = totalScale = totalScale * data.scale;
15717
15875
  interaction.emit(ZoomEvent.BEFORE_ZOOM, data);
15718
15876
  interaction.emit(ZoomEvent.ZOOM, data);
15719
15877
  this.transformEndWait();
@@ -15722,12 +15880,15 @@ class Transformer {
15722
15880
  const {interaction: interaction} = this;
15723
15881
  if (!this.rotateData) {
15724
15882
  this.setPath(data);
15883
+ totalRotation = 0;
15725
15884
  this.rotateData = Object.assign(Object.assign({}, data), {
15726
- rotation: 0
15885
+ rotation: 0,
15886
+ totalRotation: totalRotation
15727
15887
  });
15728
15888
  interaction.emit(RotateEvent.START, this.rotateData);
15729
15889
  }
15730
15890
  data.path = this.rotateData.path;
15891
+ data.totalRotation = totalRotation = totalRotation + data.rotation;
15731
15892
  interaction.emit(RotateEvent.BEFORE_ROTATE, data);
15732
15893
  interaction.emit(RotateEvent.ROTATE, data);
15733
15894
  this.transformEndWait();
@@ -15746,9 +15907,16 @@ class Transformer {
15746
15907
  }
15747
15908
  transformEnd() {
15748
15909
  const {interaction: interaction, moveData: moveData, zoomData: zoomData, rotateData: rotateData} = this;
15749
- if (moveData) interaction.emit(MoveEvent.END, moveData);
15750
- if (zoomData) interaction.emit(ZoomEvent.END, zoomData);
15751
- if (rotateData) interaction.emit(RotateEvent.END, rotateData);
15910
+ if (moveData) interaction.emit(MoveEvent.END, Object.assign(Object.assign({}, moveData), {
15911
+ totalX: totalX,
15912
+ totalY: totalY
15913
+ }));
15914
+ if (zoomData) interaction.emit(ZoomEvent.END, Object.assign(Object.assign({}, zoomData), {
15915
+ totalScale: totalScale
15916
+ }));
15917
+ if (rotateData) interaction.emit(RotateEvent.END, Object.assign(Object.assign({}, rotateData), {
15918
+ totalRotation: totalRotation
15919
+ }));
15752
15920
  this.reset();
15753
15921
  }
15754
15922
  reset() {
@@ -15846,14 +16014,39 @@ interaction.wheel = function(data) {
15846
16014
  };
15847
16015
 
15848
16016
  interaction.multiTouch = function(data, list) {
15849
- if (this.config.multiTouch.disabled) return;
15850
- const {move: move, rotation: rotation, scale: scale, center: center} = MultiTouchHelper.getData(list);
15851
- Object.assign(data, center);
15852
- data.multiTouch = true;
16017
+ const {disabled: disabled, singleGesture: singleGesture} = this.config.multiTouch;
16018
+ if (disabled) return;
15853
16019
  this.pointerWaitCancel();
15854
- this.rotate(getRotateEventData(rotation, data));
15855
- this.zoom(getZoomEventData(scale, data));
15856
- this.move(getMoveEventData(move, data));
16020
+ let gestureData = MultiTouchHelper.getData(list);
16021
+ let {moving: moving, zooming: zooming, rotating: rotating} = this.transformer;
16022
+ if (singleGesture) {
16023
+ if (!this.transformer.transforming) {
16024
+ const type = MultiTouchHelper.detect(gestureData, isObject(singleGesture) ? singleGesture : {});
16025
+ switch (type) {
16026
+ case "move":
16027
+ moving = true;
16028
+ break;
16029
+
16030
+ case "zoom":
16031
+ zooming = true;
16032
+ break;
16033
+
16034
+ case "rotate":
16035
+ rotating = true;
16036
+ break;
16037
+
16038
+ default:
16039
+ return;
16040
+ }
16041
+ MultiTouchHelper.reset();
16042
+ }
16043
+ if (!moving) gestureData.center = MultiTouchHelper.state.center;
16044
+ } else moving = zooming = rotating = true;
16045
+ Object.assign(data, gestureData.center);
16046
+ data.multiTouch = true;
16047
+ if (rotating) this.rotate(getRotateEventData(gestureData.rotation, data));
16048
+ if (zooming) this.zoom(getZoomEventData(gestureData.scale, data));
16049
+ if (moving) this.move(getMoveEventData(gestureData.move, data));
15857
16050
  };
15858
16051
 
15859
16052
  const dragger = Dragger.prototype;
@@ -18818,6 +19011,18 @@ UI.addAttr("placeholderStyle", undefined, stateStyleType);
18818
19011
 
18819
19012
  UI.addAttr("button", false, dataType);
18820
19013
 
19014
+ ui$1.set = function(data, transition) {
19015
+ if (data) {
19016
+ if (transition) {
19017
+ if (transition === "temp") {
19018
+ this.lockNormalStyle = true;
19019
+ Object.assign(this, data);
19020
+ this.lockNormalStyle = false;
19021
+ } else this.animate(data, transition);
19022
+ } else Object.assign(this, data);
19023
+ }
19024
+ };
19025
+
18821
19026
  ui$1.focus = function(value = true) {
18822
19027
  this.waitLeafer(() => {
18823
19028
  let {focusData: focusData} = this.app.interaction;
@@ -19414,4 +19619,4 @@ Plugin.add("bright");
19414
19619
 
19415
19620
  UI.addAttr("bright", false, dimType);
19416
19621
 
19417
- export { AlignHelper, Animate, AnimateEasing, AnimateEvent, AnimateList, Answer, App, AroundHelper, Arrow, ArrowData, 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, EditBox, EditDataHelper, EditPoint, EditSelect, EditSelectHelper, EditTool, EditToolCreator, Editor, EditorEvent, EditorGroupEvent, EditorHelper, EditorMoveEvent, EditorRotateEvent, EditorScaleEvent, EditorSkewEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, Finder, Flow, Frame, FrameData, Group, GroupData, HighBezierHelper, HighCurveHelper, HitCanvasManager, Image, ImageData, ImageEvent, ImageManager, IncrementId, InnerEditor, InnerEditorEvent, 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, LeaferTypeCreator, Line, LineData, LineEditTool, MathHelper, Matrix, MatrixHelper, MoveEvent, MultiTouchHelper, MyDragEvent, MyImage, MyPointerEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathArrowModule, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathMatrixHelper, PathNumberCommandLengthMap, PathNumberCommandMap, PathScaler, Pen, PenData, Picker, Platform, Plugin, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, Robot, RobotData, RotateEvent, Run, ScrollBar, SelectArea, Selector, Star, StarData, State, StringNumberMap, Stroker, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, TransformTool, Transformer, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, WheelEventHelper, ZoomEvent, addViewport, addViewportConfig, affectRenderBoundsType, affectStrokeBoundsType, arrowType, 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, motionPathType, naturalBoundsType, opacityType, path, pathInputType, pathType, pen, positionType, registerEditTool, registerInnerEditor, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleResize, scaleResizeFontSize, scaleResizeGroup, scaleResizePath, scaleResizePoints, scaleType, scrollType, sortType, stateStyleType, stateType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix$1 as tempMatrix, tempPoint$3 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };
19622
+ export { AlignHelper, Animate, AnimateEasing, AnimateEvent, AnimateList, Answer, App, AroundHelper, Arrow, ArrowData, 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, EditBox, EditDataHelper, EditPoint, EditSelect, EditSelectHelper, EditTool, EditToolCreator, Editor, EditorEvent, EditorGroupEvent, EditorHelper, EditorMoveEvent, EditorRotateEvent, EditorScaleEvent, EditorSkewEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, Finder, Flow, FourNumberHelper, Frame, FrameData, Group, GroupData, HighBezierHelper, HighCurveHelper, HitCanvasManager, Image, ImageData, ImageEvent, ImageManager, IncrementId, InnerEditor, InnerEditorEvent, 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, LeaferTypeCreator, Line, LineData, LineEditTool, MathHelper, Matrix, MatrixHelper, MoveEvent, MultiTouchHelper, MyDragEvent, MyImage, MyPointerEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathArrowModule, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathMatrixHelper, PathNumberCommandLengthMap, PathNumberCommandMap, PathScaler, Pen, PenData, Picker, Platform, Plugin, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, Robot, RobotData, RotateEvent, Run, ScrollBar, SelectArea, Selector, Star, StarData, State, StringNumberMap, Stroker, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, TransformTool, Transformer, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, WheelEventHelper, ZoomEvent, addViewport, addViewportConfig, affectRenderBoundsType, affectStrokeBoundsType, arrowType, 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, motionPathType, naturalBoundsType, opacityType, path, pathInputType, pathType, pen, positionType, registerEditTool, registerInnerEditor, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleResize, scaleResizeFontSize, scaleResizeGroup, scaleResizePath, scaleResizePoints, scaleType, scrollType, sortType, stateStyleType, stateType, strokeType, surfaceType, tempBounds$2 as tempBounds, tempMatrix$2 as tempMatrix, tempPoint$3 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };