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.
package/dist/web.js CHANGED
@@ -49,7 +49,7 @@ var LeaferUI = function(exports) {
49
49
  return value === undefined;
50
50
  }
51
51
  function isNull(value) {
52
- return value === undefined || value === null;
52
+ return value == null;
53
53
  }
54
54
  function isString(value) {
55
55
  return typeof value === "string";
@@ -119,6 +119,9 @@ var LeaferUI = function(exports) {
119
119
  const {path: path} = this;
120
120
  return path && path.length === 6 && path[0] === 1;
121
121
  }
122
+ get __usePathBox() {
123
+ return this.__pathInputed;
124
+ }
122
125
  get __blendMode() {
123
126
  if (this.eraser && this.eraser !== "path") return "destination-out";
124
127
  const {blendMode: blendMode} = this;
@@ -285,6 +288,9 @@ var LeaferUI = function(exports) {
285
288
  num = round$3(num * a) / a;
286
289
  return num === -0 ? 0 : num;
287
290
  },
291
+ sign(num) {
292
+ return num < 0 ? -1 : 1;
293
+ },
288
294
  getScaleData(scale, size, originSize, scaleData) {
289
295
  if (!scaleData) scaleData = {};
290
296
  if (size) {
@@ -1077,10 +1083,10 @@ var LeaferUI = function(exports) {
1077
1083
  toPoint$5(align, box, to, onlyBoxSize, content, onlyContentSize);
1078
1084
  }
1079
1085
  };
1080
- const {tempPointBounds: tempPointBounds$1, setPoint: setPoint$2, addPoint: addPoint$2, toBounds: toBounds$3} = TwoPointBoundsHelper;
1086
+ const {tempPointBounds: tempPointBounds$1, setPoint: setPoint$2, addPoint: addPoint$2, toBounds: toBounds$2} = TwoPointBoundsHelper;
1081
1087
  const {toOuterPoint: toOuterPoint$2} = MatrixHelper;
1082
1088
  const {float: float, fourNumber: fourNumber} = MathHelper;
1083
- const {floor: floor$2, ceil: ceil$1} = Math;
1089
+ const {floor: floor$2, ceil: ceil$2} = Math;
1084
1090
  let right$1, bottom$1, boundsRight, boundsBottom;
1085
1091
  const point = {};
1086
1092
  const toPoint$4 = {};
@@ -1204,7 +1210,7 @@ var LeaferUI = function(exports) {
1204
1210
  point.x = t.x;
1205
1211
  toOuterPoint$2(matrix, point, toPoint$4);
1206
1212
  addPoint$2(tempPointBounds$1, toPoint$4.x, toPoint$4.y);
1207
- toBounds$3(tempPointBounds$1, to);
1213
+ toBounds$2(tempPointBounds$1, to);
1208
1214
  }
1209
1215
  },
1210
1216
  toInnerOf(t, matrix, to) {
@@ -1242,8 +1248,8 @@ var LeaferUI = function(exports) {
1242
1248
  const {x: x, y: y} = t;
1243
1249
  t.x = floor$2(t.x);
1244
1250
  t.y = floor$2(t.y);
1245
- t.width = x > t.x ? ceil$1(t.width + x - t.x) : ceil$1(t.width);
1246
- t.height = y > t.y ? ceil$1(t.height + y - t.y) : ceil$1(t.height);
1251
+ t.width = x > t.x ? ceil$2(t.width + x - t.x) : ceil$2(t.width);
1252
+ t.height = y > t.y ? ceil$2(t.height + y - t.y) : ceil$2(t.height);
1247
1253
  },
1248
1254
  unsign(t) {
1249
1255
  if (t.width < 0) {
@@ -1303,7 +1309,7 @@ var LeaferUI = function(exports) {
1303
1309
  },
1304
1310
  setPoints(t, points) {
1305
1311
  points.forEach((point, index) => index === 0 ? setPoint$2(tempPointBounds$1, point.x, point.y) : addPoint$2(tempPointBounds$1, point.x, point.y));
1306
- toBounds$3(tempPointBounds$1, t);
1312
+ toBounds$2(tempPointBounds$1, t);
1307
1313
  },
1308
1314
  setPoint(t, point) {
1309
1315
  B.set(t, point.x, point.y);
@@ -2060,15 +2066,15 @@ var LeaferUI = function(exports) {
2060
2066
  DataHelper.copyAttrs(s, size, canvasSizeAttrs);
2061
2067
  canvasSizeAttrs.forEach(key => s[key] || (s[key] = 1));
2062
2068
  this.bounds = new Bounds(0, 0, this.width, this.height);
2063
- if (this.context && !this.unreal) {
2064
- this.updateViewSize();
2065
- this.smooth = this.config.smooth;
2066
- }
2069
+ this.updateViewSize();
2067
2070
  this.updateClientBounds();
2068
- if (this.context && !this.unreal && takeCanvas) {
2069
- this.clearWorld(takeCanvas.bounds);
2070
- this.copyWorld(takeCanvas);
2071
- takeCanvas.recycle();
2071
+ if (this.context) {
2072
+ this.smooth = this.config.smooth;
2073
+ if (!this.unreal && takeCanvas) {
2074
+ this.clearWorld(takeCanvas.bounds);
2075
+ this.copyWorld(takeCanvas);
2076
+ takeCanvas.recycle();
2077
+ }
2072
2078
  }
2073
2079
  }
2074
2080
  updateViewSize() {}
@@ -2369,7 +2375,7 @@ var LeaferUI = function(exports) {
2369
2375
  data[0] ? drawer.arcTo(x, y, right, y, data[0]) : drawer.lineTo(x, y);
2370
2376
  }
2371
2377
  };
2372
- const {sin: sin$3, cos: cos$3, atan2: atan2$1, ceil: ceil, abs: abs$2, PI: PI$2, sqrt: sqrt$1, pow: pow} = Math;
2378
+ 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;
2373
2379
  const {setPoint: setPoint$1, addPoint: addPoint$1} = TwoPointBoundsHelper;
2374
2380
  const {set: set, toNumberPoints: toNumberPoints} = PointHelper;
2375
2381
  const {M: M$5, L: L$6, C: C$4, Q: Q$4, Z: Z$5} = PathCommandMap;
@@ -2435,9 +2441,11 @@ var LeaferUI = function(exports) {
2435
2441
  const CBy = toY - y1;
2436
2442
  let startRadian = atan2$1(BAy, BAx);
2437
2443
  let endRadian = atan2$1(CBy, CBx);
2444
+ const lenBA = hypot(BAx, BAy);
2445
+ const lenCB = hypot(CBx, CBy);
2438
2446
  let totalRadian = endRadian - startRadian;
2439
2447
  if (totalRadian < 0) totalRadian += PI2;
2440
- if (totalRadian === PI$2 || abs$2(BAx + BAy) < 1e-12 || abs$2(CBx + CBy) < 1e-12) {
2448
+ if (lenBA < 1e-12 || lenCB < 1e-12 || totalRadian < 1e-12 || abs$2(totalRadian - PI$2) < 1e-12) {
2441
2449
  if (data) data.push(L$6, x1, y1);
2442
2450
  if (setPointBounds) {
2443
2451
  setPoint$1(setPointBounds, fromX, fromY);
@@ -2470,7 +2478,7 @@ var LeaferUI = function(exports) {
2470
2478
  let totalRadian = endRadian - startRadian;
2471
2479
  if (totalRadian < 0) totalRadian += PI2; else if (totalRadian > PI2) totalRadian -= PI2;
2472
2480
  if (anticlockwise) totalRadian -= PI2;
2473
- const parts = ceil(abs$2(totalRadian / PI_2));
2481
+ const parts = ceil$1(abs$2(totalRadian / PI_2));
2474
2482
  const partRadian = totalRadian / parts;
2475
2483
  const partRadian4Sin = sin$3(partRadian / 4);
2476
2484
  const control = 8 / 3 * partRadian4Sin * partRadian4Sin / sin$3(partRadian / 2);
@@ -3010,11 +3018,7 @@ var LeaferUI = function(exports) {
3010
3018
  this.set(path);
3011
3019
  }
3012
3020
  set(path) {
3013
- if (path) {
3014
- this.__path = isString(path) ? PathHelper.parse(path) : path;
3015
- } else {
3016
- this.__path = [];
3017
- }
3021
+ this.__path = path ? isString(path) ? PathHelper.parse(path) : path : [];
3018
3022
  return this;
3019
3023
  }
3020
3024
  beginPath() {
@@ -3176,7 +3180,7 @@ var LeaferUI = function(exports) {
3176
3180
  };
3177
3181
  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: O, P: P, U: U} = PathCommandMap;
3178
3182
  const {toTwoPointBounds: toTwoPointBounds, toTwoPointBoundsByQuadraticCurve: toTwoPointBoundsByQuadraticCurve, arcTo: arcTo$1, arc: arc, ellipse: ellipse$1} = BezierHelper;
3179
- const {addPointBounds: addPointBounds, copy: copy$6, addPoint: addPoint, setPoint: setPoint, addBounds: addBounds, toBounds: toBounds$2} = TwoPointBoundsHelper;
3183
+ const {addPointBounds: addPointBounds, copy: copy$6, addPoint: addPoint, setPoint: setPoint, addBounds: addBounds, toBounds: toBounds$1} = TwoPointBoundsHelper;
3180
3184
  const debug$a = Debug.get("PathBounds");
3181
3185
  let radius, radiusX, radiusY;
3182
3186
  const tempPointBounds = {};
@@ -3185,7 +3189,7 @@ var LeaferUI = function(exports) {
3185
3189
  const PathBounds = {
3186
3190
  toBounds(data, setBounds) {
3187
3191
  PathBounds.toTwoPointBounds(data, setPointBounds);
3188
- toBounds$2(setPointBounds, setBounds);
3192
+ toBounds$1(setPointBounds, setBounds);
3189
3193
  },
3190
3194
  toTwoPointBounds(data, setPointBounds) {
3191
3195
  if (!data || !data.length) return setPoint(setPointBounds, 0, 0);
@@ -3367,10 +3371,13 @@ var LeaferUI = function(exports) {
3367
3371
  return smooth;
3368
3372
  }
3369
3373
  };
3370
- PathHelper.creator = new PathCreator;
3374
+ function path(path) {
3375
+ return new PathCreator(path);
3376
+ }
3377
+ const pen = path();
3378
+ PathHelper.creator = path();
3371
3379
  PathHelper.parse = PathConvert.parse;
3372
3380
  PathHelper.convertToCanvasData = PathConvert.toCanvasData;
3373
- const pen = new PathCreator;
3374
3381
  const {drawRoundRect: drawRoundRect} = RectHelper;
3375
3382
  function roundRect(drawer) {
3376
3383
  if (drawer && !drawer.roundRect) {
@@ -3723,7 +3730,7 @@ var LeaferUI = function(exports) {
3723
3730
  return FileHelper.alphaPixelTypes.some(item => I.isFormat(item, config));
3724
3731
  },
3725
3732
  isFormat(format, config) {
3726
- if (config.format === format) return true;
3733
+ if (config.format) return config.format === format;
3727
3734
  const {url: url} = config;
3728
3735
  if (url.startsWith("data:")) {
3729
3736
  if (url.startsWith("data:" + FileHelper.mineType(format))) return true;
@@ -3813,7 +3820,7 @@ var LeaferUI = function(exports) {
3813
3820
  getFull(_filters) {
3814
3821
  return this.view;
3815
3822
  }
3816
- getCanvas(width, height, opacity, _filters, xGap, yGap) {
3823
+ getCanvas(width, height, opacity, _filters, xGap, yGap, smooth) {
3817
3824
  width || (width = this.width);
3818
3825
  height || (height = this.height);
3819
3826
  if (this.cache) {
@@ -3829,6 +3836,7 @@ var LeaferUI = function(exports) {
3829
3836
  const canvas = Platform.origin.createCanvas(max$1(floor$1(width + (xGap || 0)), 1), max$1(floor$1(height + (yGap || 0)), 1));
3830
3837
  const ctx = canvas.getContext("2d");
3831
3838
  if (opacity) ctx.globalAlpha = opacity;
3839
+ ctx.imageSmoothingEnabled = smooth === false ? false : true;
3832
3840
  ctx.drawImage(this.view, 0, 0, width, height);
3833
3841
  this.cache = this.use > 1 ? {
3834
3842
  data: canvas,
@@ -3867,7 +3875,7 @@ var LeaferUI = function(exports) {
3867
3875
  return {
3868
3876
  get() {
3869
3877
  const v = this[privateKey];
3870
- return isUndefined(v) ? defaultValue : v;
3878
+ return v == null ? defaultValue : v;
3871
3879
  },
3872
3880
  set(value) {
3873
3881
  this[privateKey] = value;
@@ -4120,21 +4128,21 @@ var LeaferUI = function(exports) {
4120
4128
  };
4121
4129
  } else if (typeof defaultValue === "function") {
4122
4130
  property.get = function() {
4123
- let v = this[computedKey];
4124
- return v === undefined ? defaultValue(this.__leaf) : v;
4131
+ const v = this[computedKey];
4132
+ return v == null ? defaultValue(this.__leaf) : v;
4125
4133
  };
4126
4134
  } else if (isObject(defaultValue)) {
4127
4135
  const isEmpty = isEmptyData(defaultValue);
4128
4136
  property.get = function() {
4129
- let v = this[computedKey];
4130
- return v === undefined ? this[computedKey] = isEmpty ? {} : DataHelper.clone(defaultValue) : v;
4137
+ const v = this[computedKey];
4138
+ return v == null ? this[computedKey] = isEmpty ? {} : DataHelper.clone(defaultValue) : v;
4131
4139
  };
4132
4140
  }
4133
4141
  const isBox = target.isBranchLeaf;
4134
4142
  if (key === "width") {
4135
4143
  property.get = function() {
4136
4144
  const v = this[computedKey];
4137
- if (v === undefined) {
4145
+ if (v == null) {
4138
4146
  const t = this, naturalWidth = t.__naturalWidth, leaf = t.__leaf;
4139
4147
  if (!defaultValue || leaf.pathInputed) return leaf.boxBounds.width;
4140
4148
  if (naturalWidth) return t._height && t.__useNaturalRatio ? t._height * naturalWidth / t.__naturalHeight : naturalWidth;
@@ -4144,7 +4152,7 @@ var LeaferUI = function(exports) {
4144
4152
  } else if (key === "height") {
4145
4153
  property.get = function() {
4146
4154
  const v = this[computedKey];
4147
- if (v === undefined) {
4155
+ if (v == null) {
4148
4156
  const t = this, naturalHeight = t.__naturalHeight, leaf = t.__leaf;
4149
4157
  if (!defaultValue || leaf.pathInputed) return leaf.boxBounds.height;
4150
4158
  if (naturalHeight) return t._width && t.__useNaturalRatio ? t._width * naturalHeight / t.__naturalWidth : naturalHeight;
@@ -4428,8 +4436,9 @@ var LeaferUI = function(exports) {
4428
4436
  };
4429
4437
  const L = LeafHelper;
4430
4438
  const {updateAllMatrix: updateAllMatrix$3, updateMatrix: updateMatrix$2, updateAllWorldOpacity: updateAllWorldOpacity, updateAllChange: updateAllChange$1, updateChange: updateChange$1} = L;
4431
- function getTempLocal(t, world) {
4432
- return t.parent ? PointHelper.tempToInnerOf(world, t.parent.scrollWorldTransform) : world;
4439
+ function getTempLocal(t, worldPoint) {
4440
+ t.updateLayout();
4441
+ return t.parent ? PointHelper.tempToInnerOf(worldPoint, t.parent.scrollWorldTransform) : worldPoint;
4433
4442
  }
4434
4443
  const LeafBoundsHelper = {
4435
4444
  worldBounds(target) {
@@ -4876,7 +4885,7 @@ var LeaferUI = function(exports) {
4876
4885
  }
4877
4886
  boxChange() {
4878
4887
  this.boxChanged = true;
4879
- this.localBoxChanged || this.localBoxChange();
4888
+ this.localBoxChanged ? this.boundsChanged || (this.boundsChanged = true) : this.localBoxChange();
4880
4889
  this.hitCanvasChanged = true;
4881
4890
  }
4882
4891
  localBoxChange() {
@@ -4910,7 +4919,7 @@ var LeaferUI = function(exports) {
4910
4919
  }
4911
4920
  matrixChange() {
4912
4921
  this.matrixChanged = true;
4913
- this.localBoxChanged || this.localBoxChange();
4922
+ this.localBoxChanged ? this.boundsChanged || (this.boundsChanged = true) : this.localBoxChange();
4914
4923
  }
4915
4924
  surfaceChange() {
4916
4925
  this.surfaceChanged = true;
@@ -5354,7 +5363,7 @@ var LeaferUI = function(exports) {
5354
5363
  const {updateMatrix: updateMatrix$1, updateAllMatrix: updateAllMatrix$2} = LeafHelper;
5355
5364
  const {updateBounds: updateBounds$1} = BranchHelper;
5356
5365
  const {toOuterOf: toOuterOf$1, copyAndSpread: copyAndSpread$1, copy: copy$3} = BoundsHelper;
5357
- const {toBounds: toBounds$1} = PathBounds;
5366
+ const {toBounds: toBounds} = PathBounds;
5358
5367
  const LeafBounds = {
5359
5368
  __updateWorldBounds() {
5360
5369
  const layout = this.__layout;
@@ -5425,8 +5434,8 @@ var LeaferUI = function(exports) {
5425
5434
  __updateBoxBounds(_secondLayout, _bounds) {
5426
5435
  const b = this.__layout.boxBounds;
5427
5436
  const data = this.__;
5428
- if (data.__pathInputed) {
5429
- toBounds$1(data.path, b);
5437
+ if (data.__usePathBox) {
5438
+ toBounds(data.path, b);
5430
5439
  } else {
5431
5440
  b.x = 0;
5432
5441
  b.y = 0;
@@ -5884,10 +5893,10 @@ var LeaferUI = function(exports) {
5884
5893
  relative.innerToWorld(world, to, distance);
5885
5894
  world = to ? to : world;
5886
5895
  }
5887
- toInnerPoint(this.worldTransform, world, to, distance);
5896
+ toInnerPoint(this.scrollWorldTransform, world, to, distance);
5888
5897
  }
5889
5898
  innerToWorld(inner, to, distance, relative) {
5890
- toOuterPoint(this.worldTransform, inner, to, distance);
5899
+ toOuterPoint(this.scrollWorldTransform, inner, to, distance);
5891
5900
  if (relative) relative.worldToInner(to ? to : inner, null, distance);
5892
5901
  }
5893
5902
  getBoxPoint(world, relative, distance, change) {
@@ -6341,7 +6350,7 @@ var LeaferUI = function(exports) {
6341
6350
  this.levelMap = null;
6342
6351
  }
6343
6352
  }
6344
- const version = "1.9.3";
6353
+ const version = "1.9.5";
6345
6354
  const debug$4 = Debug.get("LeaferCanvas");
6346
6355
  class LeaferCanvas extends LeaferCanvasBase {
6347
6356
  set zIndex(zIndex) {
@@ -6430,10 +6439,22 @@ var LeaferUI = function(exports) {
6430
6439
  updateViewSize() {
6431
6440
  const {width: width, height: height, pixelRatio: pixelRatio} = this;
6432
6441
  const {style: style} = this.view;
6433
- style.width = width + "px";
6434
- style.height = height + "px";
6435
- this.view.width = Math.ceil(width * pixelRatio);
6436
- this.view.height = Math.ceil(height * pixelRatio);
6442
+ if (this.unreal) {
6443
+ const {config: config, autoWidthStr: autoWidthStr, autoHeightStr: autoHeightStr} = this;
6444
+ if (config.width) {
6445
+ if (isUndefined(autoWidthStr)) this.autoWidthStr = style.width || "";
6446
+ style.width = config.width + "px";
6447
+ } else if (!isUndefined(autoWidthStr)) style.width = autoWidthStr;
6448
+ if (config.height) {
6449
+ if (isUndefined(autoHeightStr)) this.autoHeightStr = style.height || "";
6450
+ style.height = config.height + "px";
6451
+ } else if (!isUndefined(autoHeightStr)) style.height = autoHeightStr;
6452
+ } else {
6453
+ style.width = width + "px";
6454
+ style.height = height + "px";
6455
+ this.view.width = Math.ceil(width * pixelRatio);
6456
+ this.view.height = Math.ceil(height * pixelRatio);
6457
+ }
6437
6458
  }
6438
6459
  updateClientBounds() {
6439
6460
  if (this.view.parentElement) this.clientBounds = this.view.getBoundingClientRect();
@@ -6442,6 +6463,7 @@ var LeaferUI = function(exports) {
6442
6463
  this.resizeListener = listener;
6443
6464
  if (autoBounds) {
6444
6465
  this.autoBounds = autoBounds;
6466
+ if (this.resizeObserver) return;
6445
6467
  try {
6446
6468
  this.resizeObserver = new ResizeObserver(entries => {
6447
6469
  this.updateClientBounds();
@@ -6458,18 +6480,10 @@ var LeaferUI = function(exports) {
6458
6480
  } catch (_a) {
6459
6481
  this.imitateResizeObserver();
6460
6482
  }
6483
+ this.stopListenPixelRatio();
6461
6484
  } else {
6462
- window.addEventListener("resize", this.windowListener = () => {
6463
- const pixelRatio = Platform.devicePixelRatio;
6464
- if (!this.config.pixelRatio && this.pixelRatio !== pixelRatio) {
6465
- const {width: width, height: height} = this;
6466
- this.emitResize({
6467
- width: width,
6468
- height: height,
6469
- pixelRatio: pixelRatio
6470
- });
6471
- }
6472
- });
6485
+ this.listenPixelRatio();
6486
+ if (this.unreal) this.updateViewSize();
6473
6487
  }
6474
6488
  }
6475
6489
  imitateResizeObserver() {
@@ -6478,6 +6492,25 @@ var LeaferUI = function(exports) {
6478
6492
  Platform.requestRender(this.imitateResizeObserver.bind(this));
6479
6493
  }
6480
6494
  }
6495
+ listenPixelRatio() {
6496
+ if (!this.windowListener) window.addEventListener("resize", this.windowListener = () => {
6497
+ const pixelRatio = Platform.devicePixelRatio;
6498
+ if (!this.config.pixelRatio && this.pixelRatio !== pixelRatio) {
6499
+ const {width: width, height: height} = this;
6500
+ this.emitResize({
6501
+ width: width,
6502
+ height: height,
6503
+ pixelRatio: pixelRatio
6504
+ });
6505
+ }
6506
+ });
6507
+ }
6508
+ stopListenPixelRatio() {
6509
+ if (this.windowListener) {
6510
+ window.removeEventListener("resize", this.windowListener);
6511
+ this.windowListener = null;
6512
+ }
6513
+ }
6481
6514
  checkAutoBounds(parentSize) {
6482
6515
  const view = this.view;
6483
6516
  const {x: x, y: y, width: width, height: height} = this.autoBounds.getBoundsFrom(parentSize);
@@ -6515,10 +6548,7 @@ var LeaferUI = function(exports) {
6515
6548
  destroy() {
6516
6549
  if (this.view) {
6517
6550
  this.stopAutoLayout();
6518
- if (this.windowListener) {
6519
- window.removeEventListener("resize", this.windowListener);
6520
- this.windowListener = null;
6521
- }
6551
+ this.stopListenPixelRatio();
6522
6552
  if (!this.unreal) {
6523
6553
  const view = this.view;
6524
6554
  if (view.parentElement) view.remove();
@@ -6922,7 +6952,7 @@ var LeaferUI = function(exports) {
6922
6952
  this.times = 0;
6923
6953
  this.config = {
6924
6954
  usePartRender: true,
6925
- maxFPS: 60
6955
+ maxFPS: 120
6926
6956
  };
6927
6957
  this.target = target;
6928
6958
  this.canvas = canvas;
@@ -7077,11 +7107,15 @@ var LeaferUI = function(exports) {
7077
7107
  if (this.requestTime || !target) return;
7078
7108
  if (target.parentApp) return target.parentApp.requestRender(false);
7079
7109
  const requestTime = this.requestTime = Date.now();
7080
- Platform.requestRender(() => {
7081
- this.FPS = Math.min(60, Math.ceil(1e3 / (Date.now() - requestTime)));
7110
+ const render = () => {
7111
+ const nowFPS = 1e3 / (Date.now() - requestTime);
7112
+ const {maxFPS: maxFPS} = this.config;
7113
+ if (maxFPS && nowFPS > maxFPS - .5) return Platform.requestRender(render);
7114
+ this.FPS = Math.min(120, Math.ceil(nowFPS));
7082
7115
  this.requestTime = 0;
7083
7116
  this.checkRender();
7084
- });
7117
+ };
7118
+ Platform.requestRender(render);
7085
7119
  }
7086
7120
  __onResize(e) {
7087
7121
  if (this.canvas.unreal) return;
@@ -7124,7 +7158,8 @@ var LeaferUI = function(exports) {
7124
7158
  if (this.target) {
7125
7159
  this.stop();
7126
7160
  this.__removeListenEvents();
7127
- this.target = this.canvas = this.config = null;
7161
+ this.config = {};
7162
+ this.target = this.canvas = null;
7128
7163
  }
7129
7164
  }
7130
7165
  }
@@ -7401,7 +7436,11 @@ var LeaferUI = function(exports) {
7401
7436
  }
7402
7437
  }
7403
7438
  class FrameData extends BoxData {}
7404
- class LineData extends UIData {}
7439
+ class LineData extends UIData {
7440
+ get __usePathBox() {
7441
+ return this.points || this.__pathInputed;
7442
+ }
7443
+ }
7405
7444
  class RectData extends UIData {
7406
7445
  get __boxStroke() {
7407
7446
  return !this.__pathInputed;
@@ -7412,7 +7451,7 @@ var LeaferUI = function(exports) {
7412
7451
  return !this.__pathInputed;
7413
7452
  }
7414
7453
  }
7415
- class PolygonData extends UIData {}
7454
+ class PolygonData extends LineData {}
7416
7455
  class StarData extends UIData {}
7417
7456
  class PathData extends UIData {
7418
7457
  get __pathInputed() {
@@ -7706,20 +7745,9 @@ var LeaferUI = function(exports) {
7706
7745
  if (!path) this.__drawPathByBox(pen);
7707
7746
  return pen;
7708
7747
  }
7709
- constructor(data) {
7710
- super(data);
7711
- }
7712
7748
  reset(_data) {}
7713
- set(data, transition) {
7714
- if (data) {
7715
- if (transition) {
7716
- if (transition === "temp") {
7717
- this.lockNormalStyle = true;
7718
- Object.assign(this, data);
7719
- this.lockNormalStyle = false;
7720
- } else this.animate(data, transition);
7721
- } else Object.assign(this, data);
7722
- }
7749
+ set(data, _transition) {
7750
+ if (data) Object.assign(this, data);
7723
7751
  }
7724
7752
  get(name) {
7725
7753
  return isString(name) ? this.__.__getInput(name) : this.__.__getInputData(name);
@@ -7765,7 +7793,7 @@ var LeaferUI = function(exports) {
7765
7793
  const data = this.__;
7766
7794
  if (data.path) {
7767
7795
  data.__pathForRender = data.cornerRadius ? PathCorner.smooth(data.path, data.cornerRadius, data.cornerSmoothing) : data.path;
7768
- if (data.__useArrow) PathArrow.addArrows(this, !data.cornerRadius);
7796
+ if (data.__useArrow) PathArrow.addArrows(this);
7769
7797
  } else data.__pathForRender && (data.__pathForRender = undefined);
7770
7798
  }
7771
7799
  __drawRenderPath(canvas) {
@@ -7789,7 +7817,8 @@ var LeaferUI = function(exports) {
7789
7817
  drawImagePlaceholder(canvas, _image) {
7790
7818
  Paint.fill(this.__.placeholderColor, this, canvas);
7791
7819
  }
7792
- animate(_keyframe, _options, _type, _isTemp) {
7820
+ animate(keyframe, _options, _type, _isTemp) {
7821
+ this.set(keyframe);
7793
7822
  return Plugin.need("animate");
7794
7823
  }
7795
7824
  killAnimate(_type, _nextStyle) {}
@@ -7903,9 +7932,6 @@ var LeaferUI = function(exports) {
7903
7932
  get isBranch() {
7904
7933
  return true;
7905
7934
  }
7906
- constructor(data) {
7907
- super(data);
7908
- }
7909
7935
  reset(data) {
7910
7936
  this.__setBranch();
7911
7937
  super.reset(data);
@@ -8023,7 +8049,7 @@ var LeaferUI = function(exports) {
8023
8049
  const canvas = this.canvas = Creator.canvas(config);
8024
8050
  this.__controllers.push(this.renderer = Creator.renderer(this, canvas, config), this.watcher = Creator.watcher(this, config), this.layouter = Creator.layouter(this, config));
8025
8051
  if (this.isApp) this.__setApp();
8026
- this.__checkAutoLayout(config, parentApp);
8052
+ this.__checkAutoLayout();
8027
8053
  this.view = canvas.view;
8028
8054
  if (!parentApp) {
8029
8055
  this.selector = Creator.selector(this);
@@ -8122,7 +8148,8 @@ var LeaferUI = function(exports) {
8122
8148
  this.leafer = leafer;
8123
8149
  this.__level = 1;
8124
8150
  }
8125
- __checkAutoLayout(config, parentApp) {
8151
+ __checkAutoLayout() {
8152
+ const {config: config, parentApp: parentApp} = this;
8126
8153
  if (!parentApp) {
8127
8154
  if (!config.width || !config.height) this.autoLayout = new AutoBounds(config);
8128
8155
  this.canvas.startAutoLayout(this.autoLayout, this.__onResize.bind(this));
@@ -8148,9 +8175,10 @@ var LeaferUI = function(exports) {
8148
8175
  return super.__getAttr(attrName);
8149
8176
  }
8150
8177
  __changeCanvasSize(attrName, newValue) {
8151
- const data = DataHelper.copyAttrs({}, this.canvas, canvasSizeAttrs);
8152
- data[attrName] = this.config[attrName] = newValue;
8153
- if (newValue) this.canvas.stopAutoLayout();
8178
+ const {config: config, canvas: canvas} = this;
8179
+ const data = DataHelper.copyAttrs({}, canvas, canvasSizeAttrs);
8180
+ data[attrName] = config[attrName] = newValue;
8181
+ config.width && config.height ? canvas.stopAutoLayout() : this.__checkAutoLayout();
8154
8182
  this.__doResize(data);
8155
8183
  }
8156
8184
  __changeFill(newValue) {
@@ -8297,9 +8325,9 @@ var LeaferUI = function(exports) {
8297
8325
  if (!this.parent) {
8298
8326
  if (this.selector) this.selector.destroy();
8299
8327
  if (this.hitCanvasManager) this.hitCanvasManager.destroy();
8300
- this.canvasManager.destroy();
8328
+ if (this.canvasManager) this.canvasManager.destroy();
8301
8329
  }
8302
- this.canvas.destroy();
8330
+ if (this.canvas) this.canvas.destroy();
8303
8331
  this.config.view = this.view = this.parentApp = null;
8304
8332
  if (this.userConfig) this.userConfig.view = null;
8305
8333
  super.destroy();
@@ -8322,9 +8350,6 @@ var LeaferUI = function(exports) {
8322
8350
  get __tag() {
8323
8351
  return "Rect";
8324
8352
  }
8325
- constructor(data) {
8326
- super(data);
8327
- }
8328
8353
  };
8329
8354
  __decorate([ dataProcessor(RectData) ], exports.Rect.prototype, "__", void 0);
8330
8355
  exports.Rect = __decorate([ useModule(RectRender), rewriteAble(), registerUI() ], exports.Rect);
@@ -8373,29 +8398,24 @@ var LeaferUI = function(exports) {
8373
8398
  }
8374
8399
  __updateStrokeBounds() {}
8375
8400
  __updateRenderBounds() {
8376
- let isOverflow;
8401
+ let isOverflow, isScrollMode;
8377
8402
  if (this.children.length) {
8378
- const data = this.__, layout = this.__layout, {renderBounds: renderBounds, boxBounds: boxBounds} = layout;
8403
+ const data = this.__, layout = this.__layout, {renderBounds: renderBounds, boxBounds: boxBounds} = layout, {overflow: overflow} = data;
8379
8404
  const childrenRenderBounds = layout.childrenRenderBounds || (layout.childrenRenderBounds = getBoundsData());
8380
8405
  super.__updateRenderBounds(childrenRenderBounds);
8381
- if (data.overflow.includes("scroll")) {
8406
+ if (isScrollMode = overflow.includes("scroll")) {
8382
8407
  add(childrenRenderBounds, boxBounds);
8383
8408
  scroll(childrenRenderBounds, data);
8384
8409
  }
8385
8410
  this.__updateRectRenderBounds();
8386
8411
  isOverflow = !includes$1(boxBounds, childrenRenderBounds);
8387
- if (isOverflow && data.overflow === "show") add(renderBounds, childrenRenderBounds);
8412
+ if (isOverflow && overflow === "show") add(renderBounds, childrenRenderBounds);
8388
8413
  } else this.__updateRectRenderBounds();
8389
8414
  DataHelper.stintSet(this, "isOverflow", isOverflow);
8390
- this.__checkScroll();
8415
+ this.__checkScroll(isScrollMode);
8391
8416
  }
8392
8417
  __updateRectRenderBounds() {}
8393
- __updateWorldBounds() {
8394
- if (this.hasScroller) this.__updateScroll();
8395
- super.__updateWorldBounds();
8396
- }
8397
- __checkScroll() {}
8398
- __updateScroll() {}
8418
+ __checkScroll(_isScrollMode) {}
8399
8419
  __updateRectChange() {}
8400
8420
  __updateChange() {
8401
8421
  super.__updateChange();
@@ -8441,9 +8461,6 @@ var LeaferUI = function(exports) {
8441
8461
  get isFrame() {
8442
8462
  return true;
8443
8463
  }
8444
- constructor(data) {
8445
- super(data);
8446
- }
8447
8464
  };
8448
8465
  __decorate([ dataProcessor(FrameData) ], exports.Frame.prototype, "__", void 0);
8449
8466
  __decorate([ surfaceType("#FFFFFF") ], exports.Frame.prototype, "fill", void 0);
@@ -8454,9 +8471,6 @@ var LeaferUI = function(exports) {
8454
8471
  get __tag() {
8455
8472
  return "Ellipse";
8456
8473
  }
8457
- constructor(data) {
8458
- super(data);
8459
- }
8460
8474
  __updatePath() {
8461
8475
  const {width: width, height: height, innerRadius: innerRadius, startAngle: startAngle, endAngle: endAngle} = this.__;
8462
8476
  const rx = width / 2, ry = height / 2;
@@ -8492,7 +8506,6 @@ var LeaferUI = function(exports) {
8492
8506
  exports.Ellipse = __decorate([ registerUI() ], exports.Ellipse);
8493
8507
  const {moveTo: moveTo$2, lineTo: lineTo$2, drawPoints: drawPoints$1} = PathCommandDataHelper;
8494
8508
  const {rotate: rotate$1, getAngle: getAngle$1, getDistance: getDistance$2, defaultPoint: defaultPoint} = PointHelper;
8495
- const {toBounds: toBounds} = PathBounds;
8496
8509
  exports.Line = class Line extends exports.UI {
8497
8510
  get __tag() {
8498
8511
  return "Line";
@@ -8509,31 +8522,16 @@ var LeaferUI = function(exports) {
8509
8522
  this.rotation = getAngle$1(defaultPoint, value);
8510
8523
  if (this.height) this.height = 0;
8511
8524
  }
8512
- constructor(data) {
8513
- super(data);
8514
- }
8515
8525
  __updatePath() {
8516
8526
  const data = this.__;
8517
8527
  const path = data.path = [];
8518
8528
  if (data.points) {
8519
- drawPoints$1(path, data.points, false, data.closed);
8529
+ drawPoints$1(path, data.points, data.curve, data.closed);
8520
8530
  } else {
8521
8531
  moveTo$2(path, 0, 0);
8522
8532
  lineTo$2(path, this.width, 0);
8523
8533
  }
8524
8534
  }
8525
- __updateRenderPath() {
8526
- const data = this.__;
8527
- if (!this.pathInputed && data.points && data.curve) {
8528
- drawPoints$1(data.__pathForRender = [], data.points, data.curve, data.closed);
8529
- if (data.__useArrow) PathArrow.addArrows(this, false);
8530
- } else super.__updateRenderPath();
8531
- }
8532
- __updateBoxBounds() {
8533
- if (this.points) {
8534
- toBounds(this.__.__pathForRender, this.__layout.boxBounds);
8535
- } else super.__updateBoxBounds();
8536
- }
8537
8535
  };
8538
8536
  __decorate([ dataProcessor(LineData) ], exports.Line.prototype, "__", void 0);
8539
8537
  __decorate([ affectStrokeBoundsType("center") ], exports.Line.prototype, "strokeAlign", void 0);
@@ -8549,15 +8547,13 @@ var LeaferUI = function(exports) {
8549
8547
  get __tag() {
8550
8548
  return "Polygon";
8551
8549
  }
8552
- constructor(data) {
8553
- super(data);
8554
- }
8555
8550
  __updatePath() {
8556
- const path = this.__.path = [];
8557
- if (this.__.points) {
8558
- drawPoints(path, this.__.points, false, true);
8551
+ const data = this.__;
8552
+ const path = data.path = [];
8553
+ if (data.points) {
8554
+ drawPoints(path, data.points, data.curve, true);
8559
8555
  } else {
8560
- const {width: width, height: height, sides: sides} = this.__;
8556
+ const {width: width, height: height, sides: sides} = data;
8561
8557
  const rx = width / 2, ry = height / 2;
8562
8558
  moveTo$1(path, rx, 0);
8563
8559
  for (let i = 1; i < sides; i++) {
@@ -8582,9 +8578,6 @@ var LeaferUI = function(exports) {
8582
8578
  get __tag() {
8583
8579
  return "Star";
8584
8580
  }
8585
- constructor(data) {
8586
- super(data);
8587
- }
8588
8581
  __updatePath() {
8589
8582
  const {width: width, height: height, corners: corners, innerRadius: innerRadius} = this.__;
8590
8583
  const rx = width / 2, ry = height / 2;
@@ -8612,9 +8605,6 @@ var LeaferUI = function(exports) {
8612
8605
  const {fill: fill} = this.__;
8613
8606
  return isArray(fill) && fill[0].image;
8614
8607
  }
8615
- constructor(data) {
8616
- super(data);
8617
- }
8618
8608
  };
8619
8609
  __decorate([ dataProcessor(ImageData) ], exports.Image.prototype, "__", void 0);
8620
8610
  __decorate([ boundsType("") ], exports.Image.prototype, "url", void 0);
@@ -8699,9 +8689,6 @@ var LeaferUI = function(exports) {
8699
8689
  this.updateLayout();
8700
8690
  return this.__.__textDrawData;
8701
8691
  }
8702
- constructor(data) {
8703
- super(data);
8704
- }
8705
8692
  __updateTextDrawData() {
8706
8693
  const data = this.__;
8707
8694
  const {lineHeight: lineHeight, letterSpacing: letterSpacing, fontFamily: fontFamily, fontSize: fontSize, fontWeight: fontWeight, italic: italic, textCase: textCase, textOverflow: textOverflow, padding: padding} = data;
@@ -8805,9 +8792,6 @@ var LeaferUI = function(exports) {
8805
8792
  get __tag() {
8806
8793
  return "Path";
8807
8794
  }
8808
- constructor(data) {
8809
- super(data);
8810
- }
8811
8795
  };
8812
8796
  __decorate([ dataProcessor(PathData) ], exports.Path.prototype, "__", void 0);
8813
8797
  __decorate([ affectStrokeBoundsType("center") ], exports.Path.prototype, "strokeAlign", void 0);
@@ -8816,9 +8800,6 @@ var LeaferUI = function(exports) {
8816
8800
  get __tag() {
8817
8801
  return "Pen";
8818
8802
  }
8819
- constructor(data) {
8820
- super(data);
8821
- }
8822
8803
  setStyle(data) {
8823
8804
  const path = this.pathElement = new exports.Path(data);
8824
8805
  this.pathStyle = data;
@@ -9464,7 +9445,7 @@ var LeaferUI = function(exports) {
9464
9445
  if (leafer && leafer.viewReady) leafer.renderer.ignore = value;
9465
9446
  }
9466
9447
  const {get: get$1, scale: scale, copy: copy$1} = MatrixHelper;
9467
- const {floor: floor, max: max, abs: abs} = Math;
9448
+ const {floor: floor, ceil: ceil, max: max, abs: abs} = Math;
9468
9449
  function createPattern(ui, paint, pixelRatio) {
9469
9450
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true, paint.scaleFixed);
9470
9451
  const id = scaleX + "-" + scaleY + "-" + pixelRatio;
@@ -9473,8 +9454,6 @@ var LeaferUI = function(exports) {
9473
9454
  let imageScale, imageMatrix, {width: width, height: height, scaleX: sx, scaleY: sy, transform: transform, repeat: repeat, gap: gap} = data;
9474
9455
  scaleX *= pixelRatio;
9475
9456
  scaleY *= pixelRatio;
9476
- const xGap = gap && gap.x * scaleX;
9477
- const yGap = gap && gap.y * scaleY;
9478
9457
  if (sx) {
9479
9458
  sx = abs(sx);
9480
9459
  sy = abs(sy);
@@ -9491,7 +9470,10 @@ var LeaferUI = function(exports) {
9491
9470
  if (size > Platform.image.maxCacheSize) return false;
9492
9471
  }
9493
9472
  let maxSize = Platform.image.maxPatternSize;
9494
- if (!image.isSVG) {
9473
+ if (image.isSVG) {
9474
+ const ws = width / image.width;
9475
+ if (ws > 1) imageScale = ws / ceil(ws);
9476
+ } else {
9495
9477
  const imageSize = image.width * image.height;
9496
9478
  if (maxSize > imageSize) maxSize = imageSize;
9497
9479
  }
@@ -9506,18 +9488,20 @@ var LeaferUI = function(exports) {
9506
9488
  scaleX /= sx;
9507
9489
  scaleY /= sy;
9508
9490
  }
9491
+ const xGap = gap && gap.x * scaleX;
9492
+ const yGap = gap && gap.y * scaleY;
9509
9493
  if (transform || scaleX !== 1 || scaleY !== 1) {
9494
+ const canvasWidth = width + (xGap || 0);
9495
+ const canvasHeight = height + (yGap || 0);
9496
+ scaleX /= canvasWidth / max(floor(canvasWidth), 1);
9497
+ scaleY /= canvasHeight / max(floor(canvasHeight), 1);
9510
9498
  if (!imageMatrix) {
9511
9499
  imageMatrix = get$1();
9512
9500
  if (transform) copy$1(imageMatrix, transform);
9513
9501
  }
9514
9502
  scale(imageMatrix, 1 / scaleX, 1 / scaleY);
9515
9503
  }
9516
- if (imageMatrix) {
9517
- const canvasWidth = width + (xGap || 0), canvasHeight = height + (yGap || 0);
9518
- scale(imageMatrix, canvasWidth / max(floor(canvasWidth), 1), canvasHeight / max(floor(canvasHeight), 1));
9519
- }
9520
- const canvas = image.getCanvas(width, height, data.opacity, data.filters, xGap, yGap);
9504
+ const canvas = image.getCanvas(width, height, data.opacity, data.filters, xGap, yGap, ui.leafer && ui.leafer.config.smooth);
9521
9505
  const pattern = image.getPattern(canvas, repeat || (Platform.origin.noRepeat || "no-repeat"), imageMatrix, paint);
9522
9506
  paint.style = pattern;
9523
9507
  paint.patternId = id;
@@ -10513,6 +10497,7 @@ var LeaferUI = function(exports) {
10513
10497
  exports.maskType = maskType;
10514
10498
  exports.naturalBoundsType = naturalBoundsType;
10515
10499
  exports.opacityType = opacityType;
10500
+ exports.path = path;
10516
10501
  exports.pathInputType = pathInputType;
10517
10502
  exports.pathType = pathType;
10518
10503
  exports.pen = pen;