@leafer-draw/miniapp 2.0.2 → 2.0.3

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.
@@ -213,6 +213,7 @@ class LeafData {
213
213
  }
214
214
  destroy() {
215
215
  this.__input = this.__middle = null;
216
+ if (this.__complexData) this.__complexData.destroy();
216
217
  }
217
218
  }
218
219
 
@@ -311,6 +312,8 @@ const {set: set$2, get: get$5, setTemp: setTemp, toTempAB: toTempAB} = FourNumbe
311
312
 
312
313
  const {round: round$3, pow: pow$1, max: max$3, floor: floor$2, PI: PI$3} = Math;
313
314
 
315
+ const tempScaleData$1 = {};
316
+
314
317
  const MathHelper = {
315
318
  within(value, min, max) {
316
319
  if (isObject(min)) max = min.max, min = min.min;
@@ -354,6 +357,24 @@ const MathHelper = {
354
357
  } else if (scale) MathHelper.assignScale(scaleData, scale);
355
358
  return scaleData;
356
359
  },
360
+ getScaleFixedData(worldScaleData, scaleFixed, unscale, abs, _localScaleData) {
361
+ let {scaleX: scaleX, scaleY: scaleY} = worldScaleData;
362
+ if (abs || scaleFixed) scaleX < 0 && (scaleX = -scaleX), scaleY < 0 && (scaleY = -scaleY);
363
+ if (scaleFixed) {
364
+ if (scaleFixed === true) {
365
+ scaleX = scaleY = unscale ? 1 : 1 / scaleX;
366
+ } else {
367
+ let minScale;
368
+ if (isNumber(scaleFixed)) minScale = scaleFixed; else if (scaleFixed === "zoom-in") minScale = 1;
369
+ if (minScale) {
370
+ if (scaleX > minScale || scaleY > minScale) scaleX = scaleY = unscale ? 1 : 1 / scaleX; else scaleX = scaleY = unscale ? 1 : 1 / minScale;
371
+ }
372
+ }
373
+ }
374
+ tempScaleData$1.scaleX = scaleX;
375
+ tempScaleData$1.scaleY = scaleY;
376
+ return tempScaleData$1;
377
+ },
357
378
  assignScale(scaleData, scale) {
358
379
  if (isNumber(scale)) {
359
380
  scaleData.scaleX = scaleData.scaleY = scale;
@@ -850,8 +871,8 @@ const PointHelper = {
850
871
  if (isObject(originPoints[0])) points = [], originPoints.forEach(p => points.push(p.x, p.y));
851
872
  return points;
852
873
  },
853
- isSame(t, point) {
854
- return float$1(t.x) === float$1(point.x) && float$1(t.y) === float$1(point.y);
874
+ isSame(t, point, quick) {
875
+ return quick ? t.x === point.x && t.y === point.y : float$1(t.x) === float$1(point.x) && float$1(t.y) === float$1(point.y);
855
876
  },
856
877
  reset(t) {
857
878
  P$5.reset(t);
@@ -926,8 +947,8 @@ class Point {
926
947
  getAtan2(to) {
927
948
  return PointHelper.getAtan2(this, to);
928
949
  }
929
- isSame(point) {
930
- return PointHelper.isSame(this, point);
950
+ isSame(point, quick) {
951
+ return PointHelper.isSame(this, point, quick);
931
952
  }
932
953
  reset() {
933
954
  PointHelper.reset(this);
@@ -1183,9 +1204,9 @@ const AroundHelper = {
1183
1204
  }
1184
1205
  if (!onlyBoxSize) to.x += box.x, to.y += box.y;
1185
1206
  },
1186
- getPoint(around, box, to) {
1207
+ getPoint(around, box, to, onlyBoxSize = true) {
1187
1208
  if (!to) to = {};
1188
- AroundHelper.toPoint(around, box, to, true);
1209
+ AroundHelper.toPoint(around, box, to, onlyBoxSize);
1189
1210
  return to;
1190
1211
  }
1191
1212
  };
@@ -1452,6 +1473,9 @@ const BoundsHelper = {
1452
1473
  y: y + height
1453
1474
  } ];
1454
1475
  },
1476
+ getPoint(t, around, onlyBoxSize = false, to) {
1477
+ return AroundHelper.getPoint(around, t, to, onlyBoxSize);
1478
+ },
1455
1479
  hitRadiusPoint(t, point, pointMatrix) {
1456
1480
  if (pointMatrix) point = PointHelper.tempToInnerRadiusPointOf(point, pointMatrix);
1457
1481
  return point.x >= t.x - point.radiusX && point.x <= t.x + t.width + point.radiusX && (point.y >= t.y - point.radiusY && point.y <= t.y + t.height + point.radiusY);
@@ -1623,6 +1647,9 @@ class Bounds {
1623
1647
  getPoints() {
1624
1648
  return BoundsHelper.getPoints(this);
1625
1649
  }
1650
+ getPoint(around, onlyBoxSize, to) {
1651
+ return BoundsHelper.getPoint(this, around, onlyBoxSize, to);
1652
+ }
1626
1653
  hitPoint(point, pointMatrix) {
1627
1654
  return BoundsHelper.hitPoint(this, point, pointMatrix);
1628
1655
  }
@@ -4102,6 +4129,7 @@ const ImageManager = {
4102
4129
  return image;
4103
4130
  },
4104
4131
  recycle(image) {
4132
+ if (image.parent) image = image.parent;
4105
4133
  image.use--;
4106
4134
  setTimeout(() => {
4107
4135
  if (!image.use) {
@@ -4270,8 +4298,10 @@ class LeaferImage {
4270
4298
  return undefined;
4271
4299
  }
4272
4300
  clearLevels(_checkUse) {}
4301
+ destroyFilter() {}
4273
4302
  destroy() {
4274
4303
  this.clearLevels();
4304
+ this.destroyFilter();
4275
4305
  const {view: view} = this;
4276
4306
  if (view && view.close) view.close();
4277
4307
  this.config = {
@@ -4468,7 +4498,6 @@ function dimType(defaultValue) {
4468
4498
  if (this.__setAttr(key, value)) {
4469
4499
  const data = this.__;
4470
4500
  DataHelper.stintSet(data, "__useDim", data.dim || data.bright || data.dimskip);
4471
- this.__layout.surfaceChange();
4472
4501
  }
4473
4502
  }
4474
4503
  }));
@@ -4518,7 +4547,6 @@ function sortType(defaultValue) {
4518
4547
  return decorateLeafAttr(defaultValue, key => attr({
4519
4548
  set(value) {
4520
4549
  if (this.__setAttr(key, value)) {
4521
- this.__layout.surfaceChange();
4522
4550
  this.waitParent(() => {
4523
4551
  this.parent.__layout.childrenSortChange();
4524
4552
  });
@@ -4555,7 +4583,6 @@ function hitType(defaultValue) {
4555
4583
  set(value) {
4556
4584
  if (this.__setAttr(key, value)) {
4557
4585
  this.__layout.hitCanvasChanged = true;
4558
- if (Debug.showBounds === "hit") this.__layout.surfaceChange();
4559
4586
  if (this.leafer) this.leafer.updateCursor();
4560
4587
  }
4561
4588
  }
@@ -4761,6 +4788,10 @@ const LeafHelper = {
4761
4788
  if (layout.stateStyleChanged) leaf.updateState();
4762
4789
  if (layout.opacityChanged) updateAllWorldOpacity(leaf);
4763
4790
  leaf.__updateChange();
4791
+ if (layout.surfaceChanged) {
4792
+ if (leaf.__hasComplex) L.updateComplex(leaf);
4793
+ layout.surfaceChanged = false;
4794
+ }
4764
4795
  },
4765
4796
  updateAllChange(leaf) {
4766
4797
  updateChange$1(leaf);
@@ -4785,6 +4816,9 @@ const LeafHelper = {
4785
4816
  if (!fromWorld) fromWorld = leaf.__nowWorld;
4786
4817
  if (leaf.__worldFlipped || Platform.fullImageShadow) currentCanvas.copyWorldByReset(fromCanvas, fromWorld, leaf.__nowWorld, blendMode, onlyResetTransform); else currentCanvas.copyWorldToInner(fromCanvas, fromWorld, leaf.__layout.renderBounds, blendMode);
4787
4818
  },
4819
+ renderComplex(_leaf, _canvas, _options) {},
4820
+ updateComplex(_leaf) {},
4821
+ checkComplex(_leaf) {},
4788
4822
  moveWorld(t, x, y = 0, isInnerPoint, transition) {
4789
4823
  const local = isObject(x) ? Object.assign({}, x) : {
4790
4824
  x: x,
@@ -4896,6 +4930,9 @@ const LeafHelper = {
4896
4930
  divideParent(matrix, relative.scrollWorldTransform);
4897
4931
  return temp ? matrix : Object.assign({}, matrix);
4898
4932
  },
4933
+ updateScaleFixedWorld(_t) {},
4934
+ updateOuterBounds(_t) {},
4935
+ cacheId(_t) {},
4899
4936
  drop(t, parent, index, resize) {
4900
4937
  t.setTransform(L.getRelativeWorld(t, parent, true), resize);
4901
4938
  parent.add(t, index);
@@ -4946,7 +4983,8 @@ const LeafBoundsHelper = {
4946
4983
  return target.__.eraser || target.__.visible === 0 ? null : target.__layout.localStrokeBounds;
4947
4984
  },
4948
4985
  localRenderBounds(target) {
4949
- return target.__.eraser || target.__.visible === 0 ? null : target.__layout.localRenderBounds;
4986
+ const {__: __, __layout: __layout} = target;
4987
+ return __.eraser || __.visible === 0 ? null : __layout.localOuterBounds || __layout.localRenderBounds;
4950
4988
  },
4951
4989
  maskLocalBoxBounds(target, index) {
4952
4990
  return checkMask(target, index) && target.__localBoxBounds;
@@ -4955,7 +4993,8 @@ const LeafBoundsHelper = {
4955
4993
  return checkMask(target, index) && target.__layout.localStrokeBounds;
4956
4994
  },
4957
4995
  maskLocalRenderBounds(target, index) {
4958
- return checkMask(target, index) && target.__layout.localRenderBounds;
4996
+ const {__layout: __layout} = target;
4997
+ return checkMask(target, index) && (__layout.localOuterBounds || __layout.localRenderBounds);
4959
4998
  },
4960
4999
  excludeRenderBounds(child, options) {
4961
5000
  if (options.bounds && !options.bounds.hit(child.__world, options.matrix)) return true;
@@ -5475,7 +5514,6 @@ class LeafLayout {
5475
5514
  }
5476
5515
  opacityChange() {
5477
5516
  this.opacityChanged = true;
5478
- this.surfaceChanged || this.surfaceChange();
5479
5517
  }
5480
5518
  childrenSortChange() {
5481
5519
  if (!this.childrenSortChanged) {
@@ -5968,6 +6006,7 @@ const LeafMatrix = {
5968
6006
  const {parent: parent, __layout: __layout, __world: __world, __scrollWorld: __scrollWorld, __: __} = this;
5969
6007
  multiplyParent$2(this.__local || __layout, parent ? parent.__scrollWorld || parent.__world : defaultWorld, __world, !!__layout.affectScaleOrRotation, __);
5970
6008
  if (__scrollWorld) translateInner(Object.assign(__scrollWorld, __world), __.scrollX, __.scrollY);
6009
+ if (__layout.scaleFixed) LeafHelper.updateScaleFixedWorld(this);
5971
6010
  },
5972
6011
  __updateLocalMatrix() {
5973
6012
  if (this.__local) {
@@ -6001,6 +6040,7 @@ const LeafBounds = {
6001
6040
  __updateWorldBounds() {
6002
6041
  const {__layout: __layout, __world: __world} = this;
6003
6042
  toOuterOf$2(__layout.renderBounds, __world, __world);
6043
+ if (this.__hasComplex) LeafHelper.checkComplex(this);
6004
6044
  if (__layout.resized) {
6005
6045
  if (__layout.resized === "inner") this.__onUpdateSize();
6006
6046
  if (this.__hasLocalEvent) BoundsEvent.emitLocal(this);
@@ -6050,6 +6090,7 @@ const LeafBounds = {
6050
6090
  layout.renderChanged = undefined;
6051
6091
  if (this.parent) this.parent.__layout.renderChange();
6052
6092
  }
6093
+ if (layout.outerScale) LeafHelper.updateOuterBounds(this);
6053
6094
  layout.resized || (layout.resized = "local");
6054
6095
  layout.boundsChanged = undefined;
6055
6096
  },
@@ -6116,7 +6157,7 @@ const LeafRender = {
6116
6157
  const data = this.__;
6117
6158
  if (data.bright && !options.topRendering) return options.topList.add(this);
6118
6159
  canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
6119
- canvas.opacity = options.dimOpacity && !data.dimskip ? data.opacity * options.dimOpacity : data.opacity;
6160
+ canvas.opacity = options.ignoreOpacity ? 1 : options.dimOpacity && !data.dimskip ? data.opacity * options.dimOpacity : data.opacity;
6120
6161
  if (this.__.__single) {
6121
6162
  if (data.eraser === "path") return this.__renderEraser(canvas, options);
6122
6163
  const tempCanvas = canvas.getSameCanvas(true, true);
@@ -6170,7 +6211,7 @@ const BranchRender = {
6170
6211
  if (data.eraser === "path") return this.__renderEraser(canvas, options);
6171
6212
  const tempCanvas = canvas.getSameCanvas(false, true);
6172
6213
  this.__renderBranch(tempCanvas, options);
6173
- canvas.opacity = options.dimOpacity ? data.opacity * options.dimOpacity : data.opacity;
6214
+ canvas.opacity = options.ignoreOpacity ? 1 : options.dimOpacity ? data.opacity * options.dimOpacity : data.opacity;
6174
6215
  canvas.copyWorldByReset(tempCanvas, nowWorld, nowWorld, data.__blendMode, true);
6175
6216
  tempCanvas.recycle(nowWorld);
6176
6217
  } else {
@@ -6186,7 +6227,7 @@ const BranchRender = {
6186
6227
  const {children: children} = this;
6187
6228
  for (let i = 0, len = children.length; i < len; i++) {
6188
6229
  child = children[i];
6189
- excludeRenderBounds$1(child, options) || (child.__.complex ? child.__renderComplex(canvas, options) : child.__render(canvas, options));
6230
+ excludeRenderBounds$1(child, options) || (child.__hasComplex ? LeafHelper.renderComplex(child, canvas, options) : child.__render(canvas, options));
6190
6231
  }
6191
6232
  }
6192
6233
  },
@@ -6200,8 +6241,6 @@ const BranchRender = {
6200
6241
  }
6201
6242
  };
6202
6243
 
6203
- const tempScaleData$1 = {};
6204
-
6205
6244
  const {LEAF: LEAF, create: create} = IncrementId;
6206
6245
 
6207
6246
  const {stintSet: stintSet$4} = DataHelper;
@@ -6212,6 +6251,8 @@ const {toOuterOf: toOuterOf$1} = BoundsHelper;
6212
6251
 
6213
6252
  const {copy: copy$2, move: move$2} = PointHelper;
6214
6253
 
6254
+ const {getScaleFixedData: getScaleFixedData} = MathHelper;
6255
+
6215
6256
  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;
6216
6257
 
6217
6258
  let Leaf = class Leaf {
@@ -6370,6 +6411,7 @@ let Leaf = class Leaf {
6370
6411
  this.__level = this.parent ? this.parent.__level + 1 : 1;
6371
6412
  if (this.animation) this.__runAnimation("in");
6372
6413
  if (this.__bubbleMap) this.__emitLifeEvent(ChildEvent.MOUNTED);
6414
+ if (leafer.cacheId) LeafHelper.cacheId(this);
6373
6415
  } else {
6374
6416
  this.__emitLifeEvent(ChildEvent.UNMOUNTED);
6375
6417
  }
@@ -6499,13 +6541,8 @@ let Leaf = class Leaf {
6499
6541
  if (scaleX < 0) scaleX = -scaleX;
6500
6542
  return scaleX > 1 ? scaleX : 1;
6501
6543
  }
6502
- getRenderScaleData(abs, scaleFixed) {
6503
- let {scaleX: scaleX, scaleY: scaleY} = ImageManager.patternLocked ? this.__world : this.__nowWorld;
6504
- if (abs) scaleX < 0 && (scaleX = -scaleX), scaleY < 0 && (scaleY = -scaleY);
6505
- if (scaleFixed === true || scaleFixed === "zoom-in" && scaleX > 1 && scaleY > 1) scaleX = scaleY = 1;
6506
- tempScaleData$1.scaleX = scaleX;
6507
- tempScaleData$1.scaleY = scaleY;
6508
- return tempScaleData$1;
6544
+ getRenderScaleData(abs, scaleFixed, unscale = true) {
6545
+ return getScaleFixedData(ImageManager.patternLocked ? this.__world : this.__nowWorld || this.__world, scaleFixed, unscale, abs);
6509
6546
  }
6510
6547
  getTransform(relative) {
6511
6548
  return this.__layout.getTransform(relative || "local");
@@ -6667,7 +6704,6 @@ let Leaf = class Leaf {
6667
6704
  __drawHitPath(_canvas) {}
6668
6705
  __updateHitCanvas() {}
6669
6706
  __render(_canvas, _options) {}
6670
- __renderComplex(_canvas, _options) {}
6671
6707
  __drawFast(_canvas, _options) {}
6672
6708
  __draw(_canvas, _options, _originCanvas) {}
6673
6709
  __clip(_canvas, _options) {}
@@ -6678,7 +6714,7 @@ let Leaf = class Leaf {
6678
6714
  __drawPath(_canvas) {}
6679
6715
  __drawRenderPath(_canvas) {}
6680
6716
  __updatePath() {}
6681
- __updateRenderPath() {}
6717
+ __updateRenderPath(_updateCache) {}
6682
6718
  getMotionPathData() {
6683
6719
  return Plugin.need("path");
6684
6720
  }
@@ -6752,9 +6788,11 @@ let Branch = class Branch extends Leaf {
6752
6788
  return 0;
6753
6789
  }
6754
6790
  __updateRenderSpread() {
6791
+ let layout;
6755
6792
  const {children: children} = this;
6756
6793
  for (let i = 0, len = children.length; i < len; i++) {
6757
- if (children[i].__layout.renderSpread) return 1;
6794
+ layout = children[i].__layout;
6795
+ if (layout.renderSpread || layout.localOuterBounds) return 1;
6758
6796
  }
6759
6797
  return 0;
6760
6798
  }
@@ -7013,7 +7051,7 @@ class LeafLevelList {
7013
7051
  }
7014
7052
  }
7015
7053
 
7016
- const version = "2.0.2";
7054
+ const version = "2.0.3";
7017
7055
 
7018
7056
  class LeaferCanvas extends LeaferCanvasBase {
7019
7057
  get allowBackgroundColor() {
@@ -7848,7 +7886,9 @@ function effectType(defaultValue) {
7848
7886
  set(value) {
7849
7887
  this.__setAttr(key, value);
7850
7888
  if (value) this.__.__useEffect = true;
7851
- this.__layout.renderChanged || this.__layout.renderChange();
7889
+ const layout = this.__layout;
7890
+ layout.renderChanged || layout.renderChange();
7891
+ layout.surfaceChange();
7852
7892
  }
7853
7893
  }));
7854
7894
  }
@@ -8062,15 +8102,16 @@ class UIData extends LeafData {
8062
8102
  this.__needComputePaint = undefined;
8063
8103
  }
8064
8104
  __getRealStrokeWidth(childStyle) {
8065
- let {strokeWidth: strokeWidth, strokeWidthFixed: strokeWidthFixed} = this;
8105
+ let {strokeWidth: strokeWidth, strokeScaleFixed: strokeScaleFixed} = this;
8066
8106
  if (childStyle) {
8067
8107
  if (childStyle.strokeWidth) strokeWidth = childStyle.strokeWidth;
8068
- if (!isUndefined(childStyle.strokeWidthFixed)) strokeWidthFixed = childStyle.strokeWidthFixed;
8108
+ if (!isUndefined(childStyle.strokeScaleFixed)) strokeScaleFixed = childStyle.strokeScaleFixed;
8109
+ }
8110
+ if (strokeScaleFixed) {
8111
+ const {scaleX: scaleX} = this.__leaf.getRenderScaleData(true, strokeScaleFixed, false);
8112
+ if (scaleX !== 1) return strokeWidth * scaleX;
8069
8113
  }
8070
- if (strokeWidthFixed) {
8071
- const scale = this.__leaf.getClampRenderScale();
8072
- return scale > 1 ? strokeWidth / scale : strokeWidth;
8073
- } else return strokeWidth;
8114
+ return strokeWidth;
8074
8115
  }
8075
8116
  __setPaint(attrName, value) {
8076
8117
  this.__setInput(attrName, value);
@@ -8256,7 +8297,7 @@ const UIBounds = {
8256
8297
  const data = this.__, {strokeAlign: strokeAlign, __maxStrokeWidth: strokeWidth} = data, box = this.__box;
8257
8298
  if ((data.stroke || data.hitStroke === "all") && strokeWidth && strokeAlign !== "inside") {
8258
8299
  boxSpread = spread = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
8259
- if (!data.__boxStroke) {
8300
+ if (!data.__boxStroke || data.__useArrow) {
8260
8301
  const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * spread;
8261
8302
  const storkeCapAddWidth = data.strokeCap === "none" ? 0 : strokeWidth;
8262
8303
  spread += Math.max(miterLimitAddWidth, storkeCapAddWidth);
@@ -8413,6 +8454,12 @@ let UI = UI_1 = class UI extends Leaf {
8413
8454
  get isFrame() {
8414
8455
  return false;
8415
8456
  }
8457
+ set strokeWidthFixed(value) {
8458
+ this.strokeScaleFixed = value;
8459
+ }
8460
+ get strokeWidthFixed() {
8461
+ return this.strokeScaleFixed;
8462
+ }
8416
8463
  set scale(value) {
8417
8464
  MathHelper.assignScale(this, value);
8418
8465
  }
@@ -8468,6 +8515,9 @@ let UI = UI_1 = class UI extends Leaf {
8468
8515
  getPathString(curve, pathForRender, floatLength) {
8469
8516
  return PathConvert.stringify(this.getPath(curve, pathForRender), floatLength);
8470
8517
  }
8518
+ asPath(curve, pathForRender) {
8519
+ this.path = this.getPath(curve, pathForRender);
8520
+ }
8471
8521
  load() {
8472
8522
  this.__.__computePaint();
8473
8523
  }
@@ -8477,16 +8527,18 @@ let UI = UI_1 = class UI extends Leaf {
8477
8527
  data.lazy && !this.__inLazyBounds && !Export.running ? data.__needComputePaint = true : data.__computePaint();
8478
8528
  }
8479
8529
  }
8480
- __updateRenderPath() {
8530
+ __updateRenderPath(updateCache) {
8481
8531
  const data = this.__;
8482
8532
  if (data.path) {
8483
8533
  data.__pathForRender = data.cornerRadius ? PathCorner.smooth(data.path, data.cornerRadius, data.cornerSmoothing) : data.path;
8484
- if (data.__useArrow) PathArrow.addArrows(this);
8534
+ if (data.__useArrow) PathArrow.addArrows(this, updateCache);
8485
8535
  } else data.__pathForRender && (data.__pathForRender = undefined);
8486
8536
  }
8487
8537
  __drawRenderPath(canvas) {
8538
+ const data = this.__;
8488
8539
  canvas.beginPath();
8489
- this.__drawPathByData(canvas, this.__.__pathForRender);
8540
+ if (data.__useArrow) PathArrow.updateArrow(this);
8541
+ this.__drawPathByData(canvas, data.__pathForRender);
8490
8542
  }
8491
8543
  __drawPath(canvas) {
8492
8544
  canvas.beginPath();
@@ -8535,6 +8587,7 @@ let UI = UI_1 = class UI extends Leaf {
8535
8587
  static setEditOuter(_toolName) {}
8536
8588
  static setEditInner(_editorName) {}
8537
8589
  destroy() {
8590
+ this.__.__willDestroy = true;
8538
8591
  this.fill = this.stroke = null;
8539
8592
  if (this.__animate) this.killAnimate();
8540
8593
  super.destroy();
@@ -8651,7 +8704,7 @@ __decorate([ strokeType("inside") ], UI.prototype, "strokeAlign", void 0);
8651
8704
 
8652
8705
  __decorate([ strokeType(1, true) ], UI.prototype, "strokeWidth", void 0);
8653
8706
 
8654
- __decorate([ strokeType(false) ], UI.prototype, "strokeWidthFixed", void 0);
8707
+ __decorate([ strokeType(false) ], UI.prototype, "strokeScaleFixed", void 0);
8655
8708
 
8656
8709
  __decorate([ strokeType("none") ], UI.prototype, "strokeCap", void 0);
8657
8710
 
@@ -9283,9 +9336,9 @@ let Ellipse = class Ellipse extends UI {
9283
9336
  return "Ellipse";
9284
9337
  }
9285
9338
  __updatePath() {
9286
- const {width: width, height: height, innerRadius: innerRadius, startAngle: startAngle, endAngle: endAngle} = this.__;
9339
+ const data = this.__, {width: width, height: height, innerRadius: innerRadius, startAngle: startAngle, endAngle: endAngle} = data;
9287
9340
  const rx = width / 2, ry = height / 2;
9288
- const path = this.__.path = [];
9341
+ const path = data.path = [];
9289
9342
  let open;
9290
9343
  if (innerRadius) {
9291
9344
  if (startAngle || endAngle) {
@@ -9307,7 +9360,7 @@ let Ellipse = class Ellipse extends UI {
9307
9360
  }
9308
9361
  }
9309
9362
  if (!open) closePath$2(path);
9310
- if (Platform.ellipseToCurve) this.__.path = this.getPath(true);
9363
+ if (Platform.ellipseToCurve || data.__useArrow) data.path = this.getPath(true);
9311
9364
  }
9312
9365
  };
9313
9366
 
@@ -9782,8 +9835,8 @@ function fills(fills, ui, canvas, renderOptions) {
9782
9835
  canvas.save();
9783
9836
  if (item.transform) canvas.transform(item.transform);
9784
9837
  if (originPaint.scaleFixed) {
9785
- const {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true);
9786
- if (originPaint.scaleFixed === true || originPaint.scaleFixed === "zoom-in" && scaleX > 1 && scaleY > 1) canvas.scale(1 / scaleX, 1 / scaleY);
9838
+ const {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true, originPaint.scaleFixed, false);
9839
+ if (scaleX !== 1) canvas.scale(scaleX, scaleY);
9787
9840
  }
9788
9841
  if (originPaint.blendMode) canvas.blendMode = originPaint.blendMode;
9789
9842
  fillPathOrText(ui, canvas, renderOptions);
@@ -10204,6 +10257,7 @@ function checkSizeAndCreateData(ui, attrName, paint, image, leafPaint, boxBounds
10204
10257
  const clip = transform && !transform.onlyScale || data.path || data.cornerRadius;
10205
10258
  if (clip || opacity && opacity < 1 || blendMode) leafPaint.complex = clip ? 2 : true;
10206
10259
  }
10260
+ if (paint.filter) PaintImage.applyFilter(leafPaint, image, paint.filter, ui);
10207
10261
  return true;
10208
10262
  }
10209
10263
 
@@ -10431,7 +10485,7 @@ function createPattern(paint, ui, canvas, renderOptions) {
10431
10485
  let {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions), id = paint.film ? paint.nowIndex : scaleX + "-" + scaleY;
10432
10486
  if (paint.patternId !== id && !ui.destroyed) {
10433
10487
  if (!(Platform.image.isLarge(paint.image, scaleX, scaleY) && !paint.data.repeat)) {
10434
- const {image: image, data: data} = paint, {opacity: opacity, filters: filters} = paint.originPaint, {transform: transform, gap: gap} = data, fixScale = PaintImage.getPatternFixScale(paint, scaleX, scaleY);
10488
+ const {image: image, data: data} = paint, {opacity: opacity} = paint.originPaint, {transform: transform, gap: gap} = data, fixScale = PaintImage.getPatternFixScale(paint, scaleX, scaleY);
10435
10489
  let imageMatrix, xGap, yGap, {width: width, height: height} = image;
10436
10490
  if (fixScale) scaleX *= fixScale, scaleY *= fixScale;
10437
10491
  width *= scaleX;
@@ -10447,7 +10501,7 @@ function createPattern(paint, ui, canvas, renderOptions) {
10447
10501
  if (transform) copy$1(imageMatrix, transform);
10448
10502
  scale(imageMatrix, 1 / scaleX, 1 / scaleY);
10449
10503
  }
10450
- const imageCanvas = image.getCanvas(width, height, opacity, filters, xGap, yGap, ui.leafer && ui.leafer.config.smooth, data.interlace);
10504
+ const imageCanvas = image.getCanvas(width, height, opacity, undefined, xGap, yGap, ui.leafer && ui.leafer.config.smooth, data.interlace);
10451
10505
  const pattern = image.getPattern(imageCanvas, data.repeat || (Platform.origin.noRepeat || "no-repeat"), imageMatrix, paint);
10452
10506
  paint.style = pattern;
10453
10507
  paint.patternId = id;
@@ -10538,6 +10592,7 @@ function recycleImage(attrName, data) {
10538
10592
  if (!recycleMap) recycleMap = {};
10539
10593
  recycleMap[url] = true;
10540
10594
  ImageManager.recyclePaint(paint);
10595
+ if (data.__willDestroy && image.parent) PaintImage.recycleFilter(image, data.__leaf);
10541
10596
  if (image.loading) {
10542
10597
  if (!input) {
10543
10598
  input = data.__input && data.__input[attrName] || [];