leafer-draw 1.9.3 → 1.9.5

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.
@@ -54,7 +54,7 @@ function isUndefined(value) {
54
54
  }
55
55
 
56
56
  function isNull(value) {
57
- return value === undefined || value === null;
57
+ return value == null;
58
58
  }
59
59
 
60
60
  function isString(value) {
@@ -136,6 +136,9 @@ class LeafData {
136
136
  const {path: path} = this;
137
137
  return path && path.length === 6 && path[0] === 1;
138
138
  }
139
+ get __usePathBox() {
140
+ return this.__pathInputed;
141
+ }
139
142
  get __blendMode() {
140
143
  if (this.eraser && this.eraser !== "path") return "destination-out";
141
144
  const {blendMode: blendMode} = this;
@@ -304,6 +307,9 @@ const MathHelper = {
304
307
  num = round$3(num * a) / a;
305
308
  return num === -0 ? 0 : num;
306
309
  },
310
+ sign(num) {
311
+ return num < 0 ? -1 : 1;
312
+ },
307
313
  getScaleData(scale, size, originSize, scaleData) {
308
314
  if (!scaleData) scaleData = {};
309
315
  if (size) {
@@ -1131,13 +1137,13 @@ const AlignHelper = {
1131
1137
  }
1132
1138
  };
1133
1139
 
1134
- const {tempPointBounds: tempPointBounds$1, setPoint: setPoint$2, addPoint: addPoint$2, toBounds: toBounds$3} = TwoPointBoundsHelper;
1140
+ const {tempPointBounds: tempPointBounds$1, setPoint: setPoint$2, addPoint: addPoint$2, toBounds: toBounds$2} = TwoPointBoundsHelper;
1135
1141
 
1136
1142
  const {toOuterPoint: toOuterPoint$2} = MatrixHelper;
1137
1143
 
1138
1144
  const {float: float, fourNumber: fourNumber} = MathHelper;
1139
1145
 
1140
- const {floor: floor$2, ceil: ceil$1} = Math;
1146
+ const {floor: floor$2, ceil: ceil$2} = Math;
1141
1147
 
1142
1148
  let right$1, bottom$1, boundsRight, boundsBottom;
1143
1149
 
@@ -1266,7 +1272,7 @@ const BoundsHelper = {
1266
1272
  point.x = t.x;
1267
1273
  toOuterPoint$2(matrix, point, toPoint$4);
1268
1274
  addPoint$2(tempPointBounds$1, toPoint$4.x, toPoint$4.y);
1269
- toBounds$3(tempPointBounds$1, to);
1275
+ toBounds$2(tempPointBounds$1, to);
1270
1276
  }
1271
1277
  },
1272
1278
  toInnerOf(t, matrix, to) {
@@ -1304,8 +1310,8 @@ const BoundsHelper = {
1304
1310
  const {x: x, y: y} = t;
1305
1311
  t.x = floor$2(t.x);
1306
1312
  t.y = floor$2(t.y);
1307
- t.width = x > t.x ? ceil$1(t.width + x - t.x) : ceil$1(t.width);
1308
- t.height = y > t.y ? ceil$1(t.height + y - t.y) : ceil$1(t.height);
1313
+ t.width = x > t.x ? ceil$2(t.width + x - t.x) : ceil$2(t.width);
1314
+ t.height = y > t.y ? ceil$2(t.height + y - t.y) : ceil$2(t.height);
1309
1315
  },
1310
1316
  unsign(t) {
1311
1317
  if (t.width < 0) {
@@ -1365,7 +1371,7 @@ const BoundsHelper = {
1365
1371
  },
1366
1372
  setPoints(t, points) {
1367
1373
  points.forEach((point, index) => index === 0 ? setPoint$2(tempPointBounds$1, point.x, point.y) : addPoint$2(tempPointBounds$1, point.x, point.y));
1368
- toBounds$3(tempPointBounds$1, t);
1374
+ toBounds$2(tempPointBounds$1, t);
1369
1375
  },
1370
1376
  setPoint(t, point) {
1371
1377
  B.set(t, point.x, point.y);
@@ -2218,15 +2224,15 @@ class LeaferCanvasBase extends Canvas$1 {
2218
2224
  DataHelper.copyAttrs(s, size, canvasSizeAttrs);
2219
2225
  canvasSizeAttrs.forEach(key => s[key] || (s[key] = 1));
2220
2226
  this.bounds = new Bounds(0, 0, this.width, this.height);
2221
- if (this.context && !this.unreal) {
2222
- this.updateViewSize();
2223
- this.smooth = this.config.smooth;
2224
- }
2227
+ this.updateViewSize();
2225
2228
  this.updateClientBounds();
2226
- if (this.context && !this.unreal && takeCanvas) {
2227
- this.clearWorld(takeCanvas.bounds);
2228
- this.copyWorld(takeCanvas);
2229
- takeCanvas.recycle();
2229
+ if (this.context) {
2230
+ this.smooth = this.config.smooth;
2231
+ if (!this.unreal && takeCanvas) {
2232
+ this.clearWorld(takeCanvas.bounds);
2233
+ this.copyWorld(takeCanvas);
2234
+ takeCanvas.recycle();
2235
+ }
2230
2236
  }
2231
2237
  }
2232
2238
  updateViewSize() {}
@@ -2540,7 +2546,7 @@ const RectHelper = {
2540
2546
  }
2541
2547
  };
2542
2548
 
2543
- const {sin: sin$3, cos: cos$3, atan2: atan2$1, ceil: ceil, abs: abs$2, PI: PI$2, sqrt: sqrt$1, pow: pow} = Math;
2549
+ const {sin: sin$3, cos: cos$3, hypot: hypot, atan2: atan2$1, ceil: ceil$1, abs: abs$2, PI: PI$2, sqrt: sqrt$1, pow: pow} = Math;
2544
2550
 
2545
2551
  const {setPoint: setPoint$1, addPoint: addPoint$1} = TwoPointBoundsHelper;
2546
2552
 
@@ -2611,9 +2617,11 @@ const BezierHelper = {
2611
2617
  const CBy = toY - y1;
2612
2618
  let startRadian = atan2$1(BAy, BAx);
2613
2619
  let endRadian = atan2$1(CBy, CBx);
2620
+ const lenBA = hypot(BAx, BAy);
2621
+ const lenCB = hypot(CBx, CBy);
2614
2622
  let totalRadian = endRadian - startRadian;
2615
2623
  if (totalRadian < 0) totalRadian += PI2;
2616
- if (totalRadian === PI$2 || abs$2(BAx + BAy) < 1e-12 || abs$2(CBx + CBy) < 1e-12) {
2624
+ if (lenBA < 1e-12 || lenCB < 1e-12 || totalRadian < 1e-12 || abs$2(totalRadian - PI$2) < 1e-12) {
2617
2625
  if (data) data.push(L$6, x1, y1);
2618
2626
  if (setPointBounds) {
2619
2627
  setPoint$1(setPointBounds, fromX, fromY);
@@ -2646,7 +2654,7 @@ const BezierHelper = {
2646
2654
  let totalRadian = endRadian - startRadian;
2647
2655
  if (totalRadian < 0) totalRadian += PI2; else if (totalRadian > PI2) totalRadian -= PI2;
2648
2656
  if (anticlockwise) totalRadian -= PI2;
2649
- const parts = ceil(abs$2(totalRadian / PI_2));
2657
+ const parts = ceil$1(abs$2(totalRadian / PI_2));
2650
2658
  const partRadian = totalRadian / parts;
2651
2659
  const partRadian4Sin = sin$3(partRadian / 4);
2652
2660
  const control = 8 / 3 * partRadian4Sin * partRadian4Sin / sin$3(partRadian / 2);
@@ -3205,11 +3213,7 @@ class PathCreator {
3205
3213
  this.set(path);
3206
3214
  }
3207
3215
  set(path) {
3208
- if (path) {
3209
- this.__path = isString(path) ? PathHelper.parse(path) : path;
3210
- } else {
3211
- this.__path = [];
3212
- }
3216
+ this.__path = path ? isString(path) ? PathHelper.parse(path) : path : [];
3213
3217
  return this;
3214
3218
  }
3215
3219
  beginPath() {
@@ -3377,7 +3381,7 @@ const {M: M$1, L: L$2, C: C, Q: Q, Z: Z$1, N: N, D: D$1, X: X, G: G, F: F$1, O:
3377
3381
 
3378
3382
  const {toTwoPointBounds: toTwoPointBounds, toTwoPointBoundsByQuadraticCurve: toTwoPointBoundsByQuadraticCurve, arcTo: arcTo$1, arc: arc, ellipse: ellipse$1} = BezierHelper;
3379
3383
 
3380
- const {addPointBounds: addPointBounds, copy: copy$6, addPoint: addPoint, setPoint: setPoint, addBounds: addBounds, toBounds: toBounds$2} = TwoPointBoundsHelper;
3384
+ const {addPointBounds: addPointBounds, copy: copy$6, addPoint: addPoint, setPoint: setPoint, addBounds: addBounds, toBounds: toBounds$1} = TwoPointBoundsHelper;
3381
3385
 
3382
3386
  const debug$a = Debug.get("PathBounds");
3383
3387
 
@@ -3392,7 +3396,7 @@ const setEndPoint = {};
3392
3396
  const PathBounds = {
3393
3397
  toBounds(data, setBounds) {
3394
3398
  PathBounds.toTwoPointBounds(data, setPointBounds);
3395
- toBounds$2(setPointBounds, setBounds);
3399
+ toBounds$1(setPointBounds, setBounds);
3396
3400
  },
3397
3401
  toTwoPointBounds(data, setPointBounds) {
3398
3402
  if (!data || !data.length) return setPoint(setPointBounds, 0, 0);
@@ -3579,14 +3583,18 @@ const PathCorner = {
3579
3583
  }
3580
3584
  };
3581
3585
 
3582
- PathHelper.creator = new PathCreator;
3586
+ function path(path) {
3587
+ return new PathCreator(path);
3588
+ }
3589
+
3590
+ const pen = path();
3591
+
3592
+ PathHelper.creator = path();
3583
3593
 
3584
3594
  PathHelper.parse = PathConvert.parse;
3585
3595
 
3586
3596
  PathHelper.convertToCanvasData = PathConvert.toCanvasData;
3587
3597
 
3588
- const pen = new PathCreator;
3589
-
3590
3598
  const {drawRoundRect: drawRoundRect} = RectHelper;
3591
3599
 
3592
3600
  function roundRect(drawer) {
@@ -3951,7 +3959,7 @@ const ImageManager = {
3951
3959
  return FileHelper.alphaPixelTypes.some(item => I.isFormat(item, config));
3952
3960
  },
3953
3961
  isFormat(format, config) {
3954
- if (config.format === format) return true;
3962
+ if (config.format) return config.format === format;
3955
3963
  const {url: url} = config;
3956
3964
  if (url.startsWith("data:")) {
3957
3965
  if (url.startsWith("data:" + FileHelper.mineType(format))) return true;
@@ -4045,7 +4053,7 @@ class LeaferImage {
4045
4053
  getFull(_filters) {
4046
4054
  return this.view;
4047
4055
  }
4048
- getCanvas(width, height, opacity, _filters, xGap, yGap) {
4056
+ getCanvas(width, height, opacity, _filters, xGap, yGap, smooth) {
4049
4057
  width || (width = this.width);
4050
4058
  height || (height = this.height);
4051
4059
  if (this.cache) {
@@ -4061,6 +4069,7 @@ class LeaferImage {
4061
4069
  const canvas = Platform.origin.createCanvas(max$1(floor$1(width + (xGap || 0)), 1), max$1(floor$1(height + (yGap || 0)), 1));
4062
4070
  const ctx = canvas.getContext("2d");
4063
4071
  if (opacity) ctx.globalAlpha = opacity;
4072
+ ctx.imageSmoothingEnabled = smooth === false ? false : true;
4064
4073
  ctx.drawImage(this.view, 0, 0, width, height);
4065
4074
  this.cache = this.use > 1 ? {
4066
4075
  data: canvas,
@@ -4102,7 +4111,7 @@ function createDescriptor(key, defaultValue) {
4102
4111
  return {
4103
4112
  get() {
4104
4113
  const v = this[privateKey];
4105
- return isUndefined(v) ? defaultValue : v;
4114
+ return v == null ? defaultValue : v;
4106
4115
  },
4107
4116
  set(value) {
4108
4117
  this[privateKey] = value;
@@ -4388,21 +4397,21 @@ function defineDataProcessor(target, key, defaultValue) {
4388
4397
  };
4389
4398
  } else if (typeof defaultValue === "function") {
4390
4399
  property.get = function() {
4391
- let v = this[computedKey];
4392
- return v === undefined ? defaultValue(this.__leaf) : v;
4400
+ const v = this[computedKey];
4401
+ return v == null ? defaultValue(this.__leaf) : v;
4393
4402
  };
4394
4403
  } else if (isObject(defaultValue)) {
4395
4404
  const isEmpty = isEmptyData(defaultValue);
4396
4405
  property.get = function() {
4397
- let v = this[computedKey];
4398
- return v === undefined ? this[computedKey] = isEmpty ? {} : DataHelper.clone(defaultValue) : v;
4406
+ const v = this[computedKey];
4407
+ return v == null ? this[computedKey] = isEmpty ? {} : DataHelper.clone(defaultValue) : v;
4399
4408
  };
4400
4409
  }
4401
4410
  const isBox = target.isBranchLeaf;
4402
4411
  if (key === "width") {
4403
4412
  property.get = function() {
4404
4413
  const v = this[computedKey];
4405
- if (v === undefined) {
4414
+ if (v == null) {
4406
4415
  const t = this, naturalWidth = t.__naturalWidth, leaf = t.__leaf;
4407
4416
  if (!defaultValue || leaf.pathInputed) return leaf.boxBounds.width;
4408
4417
  if (naturalWidth) return t._height && t.__useNaturalRatio ? t._height * naturalWidth / t.__naturalHeight : naturalWidth;
@@ -4412,7 +4421,7 @@ function defineDataProcessor(target, key, defaultValue) {
4412
4421
  } else if (key === "height") {
4413
4422
  property.get = function() {
4414
4423
  const v = this[computedKey];
4415
- if (v === undefined) {
4424
+ if (v == null) {
4416
4425
  const t = this, naturalHeight = t.__naturalHeight, leaf = t.__leaf;
4417
4426
  if (!defaultValue || leaf.pathInputed) return leaf.boxBounds.height;
4418
4427
  if (naturalHeight) return t._width && t.__useNaturalRatio ? t._width * naturalHeight / t.__naturalWidth : naturalHeight;
@@ -4712,8 +4721,9 @@ const L = LeafHelper;
4712
4721
 
4713
4722
  const {updateAllMatrix: updateAllMatrix$3, updateMatrix: updateMatrix$2, updateAllWorldOpacity: updateAllWorldOpacity, updateAllChange: updateAllChange$1, updateChange: updateChange$1} = L;
4714
4723
 
4715
- function getTempLocal(t, world) {
4716
- return t.parent ? PointHelper.tempToInnerOf(world, t.parent.scrollWorldTransform) : world;
4724
+ function getTempLocal(t, worldPoint) {
4725
+ t.updateLayout();
4726
+ return t.parent ? PointHelper.tempToInnerOf(worldPoint, t.parent.scrollWorldTransform) : worldPoint;
4717
4727
  }
4718
4728
 
4719
4729
  const LeafBoundsHelper = {
@@ -5172,7 +5182,7 @@ class LeafLayout {
5172
5182
  }
5173
5183
  boxChange() {
5174
5184
  this.boxChanged = true;
5175
- this.localBoxChanged || this.localBoxChange();
5185
+ this.localBoxChanged ? this.boundsChanged || (this.boundsChanged = true) : this.localBoxChange();
5176
5186
  this.hitCanvasChanged = true;
5177
5187
  }
5178
5188
  localBoxChange() {
@@ -5206,7 +5216,7 @@ class LeafLayout {
5206
5216
  }
5207
5217
  matrixChange() {
5208
5218
  this.matrixChanged = true;
5209
- this.localBoxChanged || this.localBoxChange();
5219
+ this.localBoxChanged ? this.boundsChanged || (this.boundsChanged = true) : this.localBoxChange();
5210
5220
  }
5211
5221
  surfaceChange() {
5212
5222
  this.surfaceChanged = true;
@@ -5731,7 +5741,7 @@ const {updateBounds: updateBounds$1} = BranchHelper;
5731
5741
 
5732
5742
  const {toOuterOf: toOuterOf$1, copyAndSpread: copyAndSpread$1, copy: copy$3} = BoundsHelper;
5733
5743
 
5734
- const {toBounds: toBounds$1} = PathBounds;
5744
+ const {toBounds: toBounds} = PathBounds;
5735
5745
 
5736
5746
  const LeafBounds = {
5737
5747
  __updateWorldBounds() {
@@ -5803,8 +5813,8 @@ const LeafBounds = {
5803
5813
  __updateBoxBounds(_secondLayout, _bounds) {
5804
5814
  const b = this.__layout.boxBounds;
5805
5815
  const data = this.__;
5806
- if (data.__pathInputed) {
5807
- toBounds$1(data.path, b);
5816
+ if (data.__usePathBox) {
5817
+ toBounds(data.path, b);
5808
5818
  } else {
5809
5819
  b.x = 0;
5810
5820
  b.y = 0;
@@ -6272,10 +6282,10 @@ let Leaf = class Leaf {
6272
6282
  relative.innerToWorld(world, to, distance);
6273
6283
  world = to ? to : world;
6274
6284
  }
6275
- toInnerPoint(this.worldTransform, world, to, distance);
6285
+ toInnerPoint(this.scrollWorldTransform, world, to, distance);
6276
6286
  }
6277
6287
  innerToWorld(inner, to, distance, relative) {
6278
- toOuterPoint(this.worldTransform, inner, to, distance);
6288
+ toOuterPoint(this.scrollWorldTransform, inner, to, distance);
6279
6289
  if (relative) relative.worldToInner(to ? to : inner, null, distance);
6280
6290
  }
6281
6291
  getBoxPoint(world, relative, distance, change) {
@@ -6739,7 +6749,7 @@ class LeafLevelList {
6739
6749
  }
6740
6750
  }
6741
6751
 
6742
- const version = "1.9.3";
6752
+ const version = "1.9.5";
6743
6753
 
6744
6754
  const debug$4 = Debug.get("LeaferCanvas");
6745
6755
 
@@ -6830,10 +6840,22 @@ class LeaferCanvas extends LeaferCanvasBase {
6830
6840
  updateViewSize() {
6831
6841
  const {width: width, height: height, pixelRatio: pixelRatio} = this;
6832
6842
  const {style: style} = this.view;
6833
- style.width = width + "px";
6834
- style.height = height + "px";
6835
- this.view.width = Math.ceil(width * pixelRatio);
6836
- this.view.height = Math.ceil(height * pixelRatio);
6843
+ if (this.unreal) {
6844
+ const {config: config, autoWidthStr: autoWidthStr, autoHeightStr: autoHeightStr} = this;
6845
+ if (config.width) {
6846
+ if (isUndefined(autoWidthStr)) this.autoWidthStr = style.width || "";
6847
+ style.width = config.width + "px";
6848
+ } else if (!isUndefined(autoWidthStr)) style.width = autoWidthStr;
6849
+ if (config.height) {
6850
+ if (isUndefined(autoHeightStr)) this.autoHeightStr = style.height || "";
6851
+ style.height = config.height + "px";
6852
+ } else if (!isUndefined(autoHeightStr)) style.height = autoHeightStr;
6853
+ } else {
6854
+ style.width = width + "px";
6855
+ style.height = height + "px";
6856
+ this.view.width = Math.ceil(width * pixelRatio);
6857
+ this.view.height = Math.ceil(height * pixelRatio);
6858
+ }
6837
6859
  }
6838
6860
  updateClientBounds() {
6839
6861
  if (this.view.parentElement) this.clientBounds = this.view.getBoundingClientRect();
@@ -6842,6 +6864,7 @@ class LeaferCanvas extends LeaferCanvasBase {
6842
6864
  this.resizeListener = listener;
6843
6865
  if (autoBounds) {
6844
6866
  this.autoBounds = autoBounds;
6867
+ if (this.resizeObserver) return;
6845
6868
  try {
6846
6869
  this.resizeObserver = new ResizeObserver(entries => {
6847
6870
  this.updateClientBounds();
@@ -6858,18 +6881,10 @@ class LeaferCanvas extends LeaferCanvasBase {
6858
6881
  } catch (_a) {
6859
6882
  this.imitateResizeObserver();
6860
6883
  }
6884
+ this.stopListenPixelRatio();
6861
6885
  } else {
6862
- window.addEventListener("resize", this.windowListener = () => {
6863
- const pixelRatio = Platform.devicePixelRatio;
6864
- if (!this.config.pixelRatio && this.pixelRatio !== pixelRatio) {
6865
- const {width: width, height: height} = this;
6866
- this.emitResize({
6867
- width: width,
6868
- height: height,
6869
- pixelRatio: pixelRatio
6870
- });
6871
- }
6872
- });
6886
+ this.listenPixelRatio();
6887
+ if (this.unreal) this.updateViewSize();
6873
6888
  }
6874
6889
  }
6875
6890
  imitateResizeObserver() {
@@ -6878,6 +6893,25 @@ class LeaferCanvas extends LeaferCanvasBase {
6878
6893
  Platform.requestRender(this.imitateResizeObserver.bind(this));
6879
6894
  }
6880
6895
  }
6896
+ listenPixelRatio() {
6897
+ if (!this.windowListener) window.addEventListener("resize", this.windowListener = () => {
6898
+ const pixelRatio = Platform.devicePixelRatio;
6899
+ if (!this.config.pixelRatio && this.pixelRatio !== pixelRatio) {
6900
+ const {width: width, height: height} = this;
6901
+ this.emitResize({
6902
+ width: width,
6903
+ height: height,
6904
+ pixelRatio: pixelRatio
6905
+ });
6906
+ }
6907
+ });
6908
+ }
6909
+ stopListenPixelRatio() {
6910
+ if (this.windowListener) {
6911
+ window.removeEventListener("resize", this.windowListener);
6912
+ this.windowListener = null;
6913
+ }
6914
+ }
6881
6915
  checkAutoBounds(parentSize) {
6882
6916
  const view = this.view;
6883
6917
  const {x: x, y: y, width: width, height: height} = this.autoBounds.getBoundsFrom(parentSize);
@@ -6915,10 +6949,7 @@ class LeaferCanvas extends LeaferCanvasBase {
6915
6949
  destroy() {
6916
6950
  if (this.view) {
6917
6951
  this.stopAutoLayout();
6918
- if (this.windowListener) {
6919
- window.removeEventListener("resize", this.windowListener);
6920
- this.windowListener = null;
6921
- }
6952
+ this.stopListenPixelRatio();
6922
6953
  if (!this.unreal) {
6923
6954
  const view = this.view;
6924
6955
  if (view.parentElement) view.remove();
@@ -7347,7 +7378,7 @@ class Renderer {
7347
7378
  this.times = 0;
7348
7379
  this.config = {
7349
7380
  usePartRender: true,
7350
- maxFPS: 60
7381
+ maxFPS: 120
7351
7382
  };
7352
7383
  this.target = target;
7353
7384
  this.canvas = canvas;
@@ -7502,11 +7533,15 @@ class Renderer {
7502
7533
  if (this.requestTime || !target) return;
7503
7534
  if (target.parentApp) return target.parentApp.requestRender(false);
7504
7535
  const requestTime = this.requestTime = Date.now();
7505
- Platform.requestRender(() => {
7506
- this.FPS = Math.min(60, Math.ceil(1e3 / (Date.now() - requestTime)));
7536
+ const render = () => {
7537
+ const nowFPS = 1e3 / (Date.now() - requestTime);
7538
+ const {maxFPS: maxFPS} = this.config;
7539
+ if (maxFPS && nowFPS > maxFPS - .5) return Platform.requestRender(render);
7540
+ this.FPS = Math.min(120, Math.ceil(nowFPS));
7507
7541
  this.requestTime = 0;
7508
7542
  this.checkRender();
7509
- });
7543
+ };
7544
+ Platform.requestRender(render);
7510
7545
  }
7511
7546
  __onResize(e) {
7512
7547
  if (this.canvas.unreal) return;
@@ -7549,7 +7584,8 @@ class Renderer {
7549
7584
  if (this.target) {
7550
7585
  this.stop();
7551
7586
  this.__removeListenEvents();
7552
- this.target = this.canvas = this.config = null;
7587
+ this.config = {};
7588
+ this.target = this.canvas = null;
7553
7589
  }
7554
7590
  }
7555
7591
  }
@@ -7857,7 +7893,11 @@ class LeaferData extends GroupData {
7857
7893
 
7858
7894
  class FrameData extends BoxData {}
7859
7895
 
7860
- class LineData extends UIData {}
7896
+ class LineData extends UIData {
7897
+ get __usePathBox() {
7898
+ return this.points || this.__pathInputed;
7899
+ }
7900
+ }
7861
7901
 
7862
7902
  class RectData extends UIData {
7863
7903
  get __boxStroke() {
@@ -7871,7 +7911,7 @@ class EllipseData extends UIData {
7871
7911
  }
7872
7912
  }
7873
7913
 
7874
- class PolygonData extends UIData {}
7914
+ class PolygonData extends LineData {}
7875
7915
 
7876
7916
  class StarData extends UIData {}
7877
7917
 
@@ -8181,20 +8221,9 @@ let UI = UI_1 = class UI extends Leaf {
8181
8221
  if (!path) this.__drawPathByBox(pen);
8182
8222
  return pen;
8183
8223
  }
8184
- constructor(data) {
8185
- super(data);
8186
- }
8187
8224
  reset(_data) {}
8188
- set(data, transition) {
8189
- if (data) {
8190
- if (transition) {
8191
- if (transition === "temp") {
8192
- this.lockNormalStyle = true;
8193
- Object.assign(this, data);
8194
- this.lockNormalStyle = false;
8195
- } else this.animate(data, transition);
8196
- } else Object.assign(this, data);
8197
- }
8225
+ set(data, _transition) {
8226
+ if (data) Object.assign(this, data);
8198
8227
  }
8199
8228
  get(name) {
8200
8229
  return isString(name) ? this.__.__getInput(name) : this.__.__getInputData(name);
@@ -8240,7 +8269,7 @@ let UI = UI_1 = class UI extends Leaf {
8240
8269
  const data = this.__;
8241
8270
  if (data.path) {
8242
8271
  data.__pathForRender = data.cornerRadius ? PathCorner.smooth(data.path, data.cornerRadius, data.cornerSmoothing) : data.path;
8243
- if (data.__useArrow) PathArrow.addArrows(this, !data.cornerRadius);
8272
+ if (data.__useArrow) PathArrow.addArrows(this);
8244
8273
  } else data.__pathForRender && (data.__pathForRender = undefined);
8245
8274
  }
8246
8275
  __drawRenderPath(canvas) {
@@ -8264,7 +8293,8 @@ let UI = UI_1 = class UI extends Leaf {
8264
8293
  drawImagePlaceholder(canvas, _image) {
8265
8294
  Paint.fill(this.__.placeholderColor, this, canvas);
8266
8295
  }
8267
- animate(_keyframe, _options, _type, _isTemp) {
8296
+ animate(keyframe, _options, _type, _isTemp) {
8297
+ this.set(keyframe);
8268
8298
  return Plugin.need("animate");
8269
8299
  }
8270
8300
  killAnimate(_type, _nextStyle) {}
@@ -8453,9 +8483,6 @@ let Group = class Group extends UI {
8453
8483
  get isBranch() {
8454
8484
  return true;
8455
8485
  }
8456
- constructor(data) {
8457
- super(data);
8458
- }
8459
8486
  reset(data) {
8460
8487
  this.__setBranch();
8461
8488
  super.reset(data);
@@ -8580,7 +8607,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8580
8607
  const canvas = this.canvas = Creator.canvas(config);
8581
8608
  this.__controllers.push(this.renderer = Creator.renderer(this, canvas, config), this.watcher = Creator.watcher(this, config), this.layouter = Creator.layouter(this, config));
8582
8609
  if (this.isApp) this.__setApp();
8583
- this.__checkAutoLayout(config, parentApp);
8610
+ this.__checkAutoLayout();
8584
8611
  this.view = canvas.view;
8585
8612
  if (!parentApp) {
8586
8613
  this.selector = Creator.selector(this);
@@ -8679,7 +8706,8 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8679
8706
  this.leafer = leafer;
8680
8707
  this.__level = 1;
8681
8708
  }
8682
- __checkAutoLayout(config, parentApp) {
8709
+ __checkAutoLayout() {
8710
+ const {config: config, parentApp: parentApp} = this;
8683
8711
  if (!parentApp) {
8684
8712
  if (!config.width || !config.height) this.autoLayout = new AutoBounds(config);
8685
8713
  this.canvas.startAutoLayout(this.autoLayout, this.__onResize.bind(this));
@@ -8705,9 +8733,10 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8705
8733
  return super.__getAttr(attrName);
8706
8734
  }
8707
8735
  __changeCanvasSize(attrName, newValue) {
8708
- const data = DataHelper.copyAttrs({}, this.canvas, canvasSizeAttrs);
8709
- data[attrName] = this.config[attrName] = newValue;
8710
- if (newValue) this.canvas.stopAutoLayout();
8736
+ const {config: config, canvas: canvas} = this;
8737
+ const data = DataHelper.copyAttrs({}, canvas, canvasSizeAttrs);
8738
+ data[attrName] = config[attrName] = newValue;
8739
+ config.width && config.height ? canvas.stopAutoLayout() : this.__checkAutoLayout();
8711
8740
  this.__doResize(data);
8712
8741
  }
8713
8742
  __changeFill(newValue) {
@@ -8854,9 +8883,9 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8854
8883
  if (!this.parent) {
8855
8884
  if (this.selector) this.selector.destroy();
8856
8885
  if (this.hitCanvasManager) this.hitCanvasManager.destroy();
8857
- this.canvasManager.destroy();
8886
+ if (this.canvasManager) this.canvasManager.destroy();
8858
8887
  }
8859
- this.canvas.destroy();
8888
+ if (this.canvas) this.canvas.destroy();
8860
8889
  this.config.view = this.view = this.parentApp = null;
8861
8890
  if (this.userConfig) this.userConfig.view = null;
8862
8891
  super.destroy();
@@ -8884,9 +8913,6 @@ let Rect = class Rect extends UI {
8884
8913
  get __tag() {
8885
8914
  return "Rect";
8886
8915
  }
8887
- constructor(data) {
8888
- super(data);
8889
- }
8890
8916
  };
8891
8917
 
8892
8918
  __decorate([ dataProcessor(RectData) ], Rect.prototype, "__", void 0);
@@ -8940,29 +8966,24 @@ let Box = class Box extends Group {
8940
8966
  }
8941
8967
  __updateStrokeBounds() {}
8942
8968
  __updateRenderBounds() {
8943
- let isOverflow;
8969
+ let isOverflow, isScrollMode;
8944
8970
  if (this.children.length) {
8945
- const data = this.__, layout = this.__layout, {renderBounds: renderBounds, boxBounds: boxBounds} = layout;
8971
+ const data = this.__, layout = this.__layout, {renderBounds: renderBounds, boxBounds: boxBounds} = layout, {overflow: overflow} = data;
8946
8972
  const childrenRenderBounds = layout.childrenRenderBounds || (layout.childrenRenderBounds = getBoundsData());
8947
8973
  super.__updateRenderBounds(childrenRenderBounds);
8948
- if (data.overflow.includes("scroll")) {
8974
+ if (isScrollMode = overflow.includes("scroll")) {
8949
8975
  add(childrenRenderBounds, boxBounds);
8950
8976
  scroll(childrenRenderBounds, data);
8951
8977
  }
8952
8978
  this.__updateRectRenderBounds();
8953
8979
  isOverflow = !includes$1(boxBounds, childrenRenderBounds);
8954
- if (isOverflow && data.overflow === "show") add(renderBounds, childrenRenderBounds);
8980
+ if (isOverflow && overflow === "show") add(renderBounds, childrenRenderBounds);
8955
8981
  } else this.__updateRectRenderBounds();
8956
8982
  DataHelper.stintSet(this, "isOverflow", isOverflow);
8957
- this.__checkScroll();
8983
+ this.__checkScroll(isScrollMode);
8958
8984
  }
8959
8985
  __updateRectRenderBounds() {}
8960
- __updateWorldBounds() {
8961
- if (this.hasScroller) this.__updateScroll();
8962
- super.__updateWorldBounds();
8963
- }
8964
- __checkScroll() {}
8965
- __updateScroll() {}
8986
+ __checkScroll(_isScrollMode) {}
8966
8987
  __updateRectChange() {}
8967
8988
  __updateChange() {
8968
8989
  super.__updateChange();
@@ -9023,9 +9044,6 @@ let Frame = class Frame extends Box {
9023
9044
  get isFrame() {
9024
9045
  return true;
9025
9046
  }
9026
- constructor(data) {
9027
- super(data);
9028
- }
9029
9047
  };
9030
9048
 
9031
9049
  __decorate([ dataProcessor(FrameData) ], Frame.prototype, "__", void 0);
@@ -9042,9 +9060,6 @@ let Ellipse = class Ellipse extends UI {
9042
9060
  get __tag() {
9043
9061
  return "Ellipse";
9044
9062
  }
9045
- constructor(data) {
9046
- super(data);
9047
- }
9048
9063
  __updatePath() {
9049
9064
  const {width: width, height: height, innerRadius: innerRadius, startAngle: startAngle, endAngle: endAngle} = this.__;
9050
9065
  const rx = width / 2, ry = height / 2;
@@ -9088,8 +9103,6 @@ const {moveTo: moveTo$2, lineTo: lineTo$2, drawPoints: drawPoints$1} = PathComma
9088
9103
 
9089
9104
  const {rotate: rotate$1, getAngle: getAngle$1, getDistance: getDistance$2, defaultPoint: defaultPoint} = PointHelper;
9090
9105
 
9091
- const {toBounds: toBounds} = PathBounds;
9092
-
9093
9106
  let Line = class Line extends UI {
9094
9107
  get __tag() {
9095
9108
  return "Line";
@@ -9106,31 +9119,16 @@ let Line = class Line extends UI {
9106
9119
  this.rotation = getAngle$1(defaultPoint, value);
9107
9120
  if (this.height) this.height = 0;
9108
9121
  }
9109
- constructor(data) {
9110
- super(data);
9111
- }
9112
9122
  __updatePath() {
9113
9123
  const data = this.__;
9114
9124
  const path = data.path = [];
9115
9125
  if (data.points) {
9116
- drawPoints$1(path, data.points, false, data.closed);
9126
+ drawPoints$1(path, data.points, data.curve, data.closed);
9117
9127
  } else {
9118
9128
  moveTo$2(path, 0, 0);
9119
9129
  lineTo$2(path, this.width, 0);
9120
9130
  }
9121
9131
  }
9122
- __updateRenderPath() {
9123
- const data = this.__;
9124
- if (!this.pathInputed && data.points && data.curve) {
9125
- drawPoints$1(data.__pathForRender = [], data.points, data.curve, data.closed);
9126
- if (data.__useArrow) PathArrow.addArrows(this, false);
9127
- } else super.__updateRenderPath();
9128
- }
9129
- __updateBoxBounds() {
9130
- if (this.points) {
9131
- toBounds(this.__.__pathForRender, this.__layout.boxBounds);
9132
- } else super.__updateBoxBounds();
9133
- }
9134
9132
  };
9135
9133
 
9136
9134
  __decorate([ dataProcessor(LineData) ], Line.prototype, "__", void 0);
@@ -9157,15 +9155,13 @@ let Polygon = class Polygon extends UI {
9157
9155
  get __tag() {
9158
9156
  return "Polygon";
9159
9157
  }
9160
- constructor(data) {
9161
- super(data);
9162
- }
9163
9158
  __updatePath() {
9164
- const path = this.__.path = [];
9165
- if (this.__.points) {
9166
- drawPoints(path, this.__.points, false, true);
9159
+ const data = this.__;
9160
+ const path = data.path = [];
9161
+ if (data.points) {
9162
+ drawPoints(path, data.points, data.curve, true);
9167
9163
  } else {
9168
- const {width: width, height: height, sides: sides} = this.__;
9164
+ const {width: width, height: height, sides: sides} = data;
9169
9165
  const rx = width / 2, ry = height / 2;
9170
9166
  moveTo$1(path, rx, 0);
9171
9167
  for (let i = 1; i < sides; i++) {
@@ -9200,9 +9196,6 @@ let Star = class Star extends UI {
9200
9196
  get __tag() {
9201
9197
  return "Star";
9202
9198
  }
9203
- constructor(data) {
9204
- super(data);
9205
- }
9206
9199
  __updatePath() {
9207
9200
  const {width: width, height: height, corners: corners, innerRadius: innerRadius} = this.__;
9208
9201
  const rx = width / 2, ry = height / 2;
@@ -9235,9 +9228,6 @@ let Image$1 = class Image extends Rect {
9235
9228
  const {fill: fill} = this.__;
9236
9229
  return isArray(fill) && fill[0].image;
9237
9230
  }
9238
- constructor(data) {
9239
- super(data);
9240
- }
9241
9231
  };
9242
9232
 
9243
9233
  __decorate([ dataProcessor(ImageData) ], Image$1.prototype, "__", void 0);
@@ -9337,9 +9327,6 @@ let Text = class Text extends UI {
9337
9327
  this.updateLayout();
9338
9328
  return this.__.__textDrawData;
9339
9329
  }
9340
- constructor(data) {
9341
- super(data);
9342
- }
9343
9330
  __updateTextDrawData() {
9344
9331
  const data = this.__;
9345
9332
  const {lineHeight: lineHeight, letterSpacing: letterSpacing, fontFamily: fontFamily, fontSize: fontSize, fontWeight: fontWeight, italic: italic, textCase: textCase, textOverflow: textOverflow, padding: padding} = data;
@@ -9472,9 +9459,6 @@ let Path = class Path extends UI {
9472
9459
  get __tag() {
9473
9460
  return "Path";
9474
9461
  }
9475
- constructor(data) {
9476
- super(data);
9477
- }
9478
9462
  };
9479
9463
 
9480
9464
  __decorate([ dataProcessor(PathData) ], Path.prototype, "__", void 0);
@@ -9487,9 +9471,6 @@ let Pen = class Pen extends Group {
9487
9471
  get __tag() {
9488
9472
  return "Pen";
9489
9473
  }
9490
- constructor(data) {
9491
- super(data);
9492
- }
9493
9474
  setStyle(data) {
9494
9475
  const path = this.pathElement = new Path(data);
9495
9476
  this.pathStyle = data;
@@ -10185,7 +10166,7 @@ function ignoreRender(ui, value) {
10185
10166
 
10186
10167
  const {get: get$1, scale: scale, copy: copy$1} = MatrixHelper;
10187
10168
 
10188
- const {floor: floor, max: max, abs: abs} = Math;
10169
+ const {floor: floor, ceil: ceil, max: max, abs: abs} = Math;
10189
10170
 
10190
10171
  function createPattern(ui, paint, pixelRatio) {
10191
10172
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true, paint.scaleFixed);
@@ -10195,8 +10176,6 @@ function createPattern(ui, paint, pixelRatio) {
10195
10176
  let imageScale, imageMatrix, {width: width, height: height, scaleX: sx, scaleY: sy, transform: transform, repeat: repeat, gap: gap} = data;
10196
10177
  scaleX *= pixelRatio;
10197
10178
  scaleY *= pixelRatio;
10198
- const xGap = gap && gap.x * scaleX;
10199
- const yGap = gap && gap.y * scaleY;
10200
10179
  if (sx) {
10201
10180
  sx = abs(sx);
10202
10181
  sy = abs(sy);
@@ -10213,7 +10192,10 @@ function createPattern(ui, paint, pixelRatio) {
10213
10192
  if (size > Platform.image.maxCacheSize) return false;
10214
10193
  }
10215
10194
  let maxSize = Platform.image.maxPatternSize;
10216
- if (!image.isSVG) {
10195
+ if (image.isSVG) {
10196
+ const ws = width / image.width;
10197
+ if (ws > 1) imageScale = ws / ceil(ws);
10198
+ } else {
10217
10199
  const imageSize = image.width * image.height;
10218
10200
  if (maxSize > imageSize) maxSize = imageSize;
10219
10201
  }
@@ -10228,18 +10210,20 @@ function createPattern(ui, paint, pixelRatio) {
10228
10210
  scaleX /= sx;
10229
10211
  scaleY /= sy;
10230
10212
  }
10213
+ const xGap = gap && gap.x * scaleX;
10214
+ const yGap = gap && gap.y * scaleY;
10231
10215
  if (transform || scaleX !== 1 || scaleY !== 1) {
10216
+ const canvasWidth = width + (xGap || 0);
10217
+ const canvasHeight = height + (yGap || 0);
10218
+ scaleX /= canvasWidth / max(floor(canvasWidth), 1);
10219
+ scaleY /= canvasHeight / max(floor(canvasHeight), 1);
10232
10220
  if (!imageMatrix) {
10233
10221
  imageMatrix = get$1();
10234
10222
  if (transform) copy$1(imageMatrix, transform);
10235
10223
  }
10236
10224
  scale(imageMatrix, 1 / scaleX, 1 / scaleY);
10237
10225
  }
10238
- if (imageMatrix) {
10239
- const canvasWidth = width + (xGap || 0), canvasHeight = height + (yGap || 0);
10240
- scale(imageMatrix, canvasWidth / max(floor(canvasWidth), 1), canvasHeight / max(floor(canvasHeight), 1));
10241
- }
10242
- const canvas = image.getCanvas(width, height, data.opacity, data.filters, xGap, yGap);
10226
+ const canvas = image.getCanvas(width, height, data.opacity, data.filters, xGap, yGap, ui.leafer && ui.leafer.config.smooth);
10243
10227
  const pattern = image.getPattern(canvas, repeat || (Platform.origin.noRepeat || "no-repeat"), imageMatrix, paint);
10244
10228
  paint.style = pattern;
10245
10229
  paint.patternId = id;
@@ -11187,4 +11171,4 @@ Object.assign(Effect, EffectModule);
11187
11171
 
11188
11172
  useCanvas();
11189
11173
 
11190
- export { AlignHelper, Answer, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, DataHelper, Debug, Direction4, Direction9, DragBoundsHelper, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, Frame, FrameData, Group, GroupData, Image$1 as Image, ImageData, ImageEvent, ImageManager, IncrementId, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, Line, LineData, MathHelper, Matrix, MatrixHelper, MyImage, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Platform, Plugin, Point, PointHelper, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, Run, Star, StarData, State, StringNumberMap, TaskItem, TaskProcessor, Text, TextConvert, TextData, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, createAttr, createDescriptor, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, doBoundsType, doStrokeType, effectType, emptyData, eraserType, extraPropertyEventMap, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isArray, isData, isEmptyData, isFinite, isNull, isNumber, isObject, isString, isUndefined, layoutProcessor, leaferTransformAttrMap, maskType, naturalBoundsType, opacityType, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, scrollType, sortType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix$1 as tempMatrix, tempPoint$2 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };
11174
+ export { AlignHelper, Answer, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, DataHelper, Debug, Direction4, Direction9, DragBoundsHelper, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, Frame, FrameData, Group, GroupData, Image$1 as Image, ImageData, ImageEvent, ImageManager, IncrementId, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, Line, LineData, MathHelper, Matrix, MatrixHelper, MyImage, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Platform, Plugin, Point, PointHelper, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, Run, Star, StarData, State, StringNumberMap, TaskItem, TaskProcessor, Text, TextConvert, TextData, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, createAttr, createDescriptor, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, doBoundsType, doStrokeType, effectType, emptyData, eraserType, extraPropertyEventMap, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isArray, isData, isEmptyData, isFinite, isNull, isNumber, isObject, isString, isUndefined, layoutProcessor, leaferTransformAttrMap, maskType, naturalBoundsType, opacityType, path, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, scrollType, sortType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix$1 as tempMatrix, tempPoint$2 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };