@leafer-draw/miniapp 2.0.1 → 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
  }
@@ -1897,7 +1924,10 @@ const UICreator = {
1897
1924
  list$1[tag] = UI;
1898
1925
  },
1899
1926
  get(tag, data, x, y, width, height) {
1900
- if (!list$1[tag]) debug$d.error("not register " + tag);
1927
+ if (!list$1[tag]) {
1928
+ debug$d.warn("not register " + tag);
1929
+ return undefined;
1930
+ }
1901
1931
  const ui = new list$1[tag](data);
1902
1932
  if (!isUndefined(x)) {
1903
1933
  ui.x = x;
@@ -3754,10 +3784,10 @@ function canvasPatch(drawer) {
3754
3784
  const FileHelper = {
3755
3785
  alphaPixelTypes: [ "png", "webp", "svg" ],
3756
3786
  upperCaseTypeMap: {},
3757
- mineType(type) {
3758
- if (!type || type.startsWith("image")) return type;
3787
+ mimeType(type, base = "image") {
3788
+ if (!type || type.startsWith(base)) return type;
3759
3789
  if (type === "jpg") type = "jpeg";
3760
- return "image/" + type;
3790
+ return base + "/" + type;
3761
3791
  },
3762
3792
  fileType(filename) {
3763
3793
  const l = filename.split(".");
@@ -3790,6 +3820,8 @@ const FileHelper = {
3790
3820
 
3791
3821
  const F = FileHelper;
3792
3822
 
3823
+ F.mineType = F.mimeType;
3824
+
3793
3825
  F.alphaPixelTypes.forEach(type => F.upperCaseTypeMap[type] = type.toUpperCase());
3794
3826
 
3795
3827
  const debug$8 = Debug.get("TaskProcessor");
@@ -4034,6 +4066,9 @@ const debug$7 = Debug.get("Resource");
4034
4066
 
4035
4067
  const Resource = {
4036
4068
  tasker: new TaskProcessor,
4069
+ queue: new TaskProcessor({
4070
+ parallel: 1
4071
+ }),
4037
4072
  map: {},
4038
4073
  get isComplete() {
4039
4074
  return R.tasker.isComplete;
@@ -4070,6 +4105,12 @@ const Resource = {
4070
4105
  R.set(key, value);
4071
4106
  return value;
4072
4107
  },
4108
+ loadFilm(_key, _format) {
4109
+ return undefined;
4110
+ },
4111
+ loadVideo(_key, _format) {
4112
+ return undefined;
4113
+ },
4073
4114
  destroy() {
4074
4115
  R.map = {};
4075
4116
  }
@@ -4080,16 +4121,15 @@ const R = Resource;
4080
4121
  const ImageManager = {
4081
4122
  maxRecycled: 10,
4082
4123
  recycledList: [],
4083
- patternTasker: new TaskProcessor({
4084
- parallel: 1
4085
- }),
4086
- get(config) {
4124
+ patternTasker: Resource.queue,
4125
+ get(config, type) {
4087
4126
  let image = Resource.get(config.url);
4088
- if (!image) Resource.set(config.url, image = Creator.image(config));
4127
+ if (!image) Resource.set(config.url, image = type === "film" ? Creator.film(config) : Creator.image(config));
4089
4128
  image.use++;
4090
4129
  return image;
4091
4130
  },
4092
4131
  recycle(image) {
4132
+ if (image.parent) image = image.parent;
4093
4133
  image.use--;
4094
4134
  setTimeout(() => {
4095
4135
  if (!image.use) {
@@ -4120,7 +4160,7 @@ const ImageManager = {
4120
4160
  if (config.format) return config.format === format;
4121
4161
  const {url: url} = config;
4122
4162
  if (url.startsWith("data:")) {
4123
- if (url.startsWith("data:" + FileHelper.mineType(format))) return true;
4163
+ if (url.startsWith("data:" + FileHelper.mimeType(format))) return true;
4124
4164
  } else {
4125
4165
  if (url.includes("." + format) || url.includes("." + FileHelper.upperCaseTypeMap[format])) return true; else if (format === "png" && !url.includes(".")) return true;
4126
4166
  }
@@ -4136,6 +4176,9 @@ const I = ImageManager;
4136
4176
  const {IMAGE: IMAGE, create: create$1} = IncrementId;
4137
4177
 
4138
4178
  class LeaferImage {
4179
+ get tag() {
4180
+ return "Image";
4181
+ }
4139
4182
  get url() {
4140
4183
  return this.config.url;
4141
4184
  }
@@ -4164,7 +4207,7 @@ class LeaferImage {
4164
4207
  if (!this.loading) {
4165
4208
  this.loading = true;
4166
4209
  Resource.tasker.add(() => __awaiter(this, void 0, void 0, function*() {
4167
- return yield Platform.origin.loadImage(this.getLoadUrl(thumbSize), this.crossOrigin, this).then(img => {
4210
+ return yield Platform.origin["load" + this.tag](this.getLoadUrl(thumbSize), this.crossOrigin, this).then(img => {
4168
4211
  if (thumbSize) this.setThumbView(img);
4169
4212
  this.setView(img);
4170
4213
  }).catch(e => {
@@ -4238,6 +4281,9 @@ class LeaferImage {
4238
4281
  Platform.image.setPatternTransform(pattern, transform, paint);
4239
4282
  return pattern;
4240
4283
  }
4284
+ render(canvas, x, y, width, height, _leaf, _paint, _imageScaleX, _imageScaleY) {
4285
+ canvas.drawImage(this.view, x, y, width, height);
4286
+ }
4241
4287
  getLoadUrl(_thumbSize) {
4242
4288
  return this.url;
4243
4289
  }
@@ -4252,8 +4298,10 @@ class LeaferImage {
4252
4298
  return undefined;
4253
4299
  }
4254
4300
  clearLevels(_checkUse) {}
4301
+ destroyFilter() {}
4255
4302
  destroy() {
4256
4303
  this.clearLevels();
4304
+ this.destroyFilter();
4257
4305
  const {view: view} = this;
4258
4306
  if (view && view.close) view.close();
4259
4307
  this.config = {
@@ -4264,6 +4312,18 @@ class LeaferImage {
4264
4312
  }
4265
4313
  }
4266
4314
 
4315
+ class LeaferFilm extends LeaferImage {
4316
+ get tag() {
4317
+ return "Film";
4318
+ }
4319
+ }
4320
+
4321
+ class LeaferVideo extends LeaferImage {
4322
+ get tag() {
4323
+ return "Video";
4324
+ }
4325
+ }
4326
+
4267
4327
  function defineKey(target, key, descriptor, noConfigurable) {
4268
4328
  if (!noConfigurable) descriptor.configurable = descriptor.enumerable = true;
4269
4329
  Object.defineProperty(target, key, descriptor);
@@ -4438,7 +4498,6 @@ function dimType(defaultValue) {
4438
4498
  if (this.__setAttr(key, value)) {
4439
4499
  const data = this.__;
4440
4500
  DataHelper.stintSet(data, "__useDim", data.dim || data.bright || data.dimskip);
4441
- this.__layout.surfaceChange();
4442
4501
  }
4443
4502
  }
4444
4503
  }));
@@ -4488,7 +4547,6 @@ function sortType(defaultValue) {
4488
4547
  return decorateLeafAttr(defaultValue, key => attr({
4489
4548
  set(value) {
4490
4549
  if (this.__setAttr(key, value)) {
4491
- this.__layout.surfaceChange();
4492
4550
  this.waitParent(() => {
4493
4551
  this.parent.__layout.childrenSortChange();
4494
4552
  });
@@ -4525,7 +4583,6 @@ function hitType(defaultValue) {
4525
4583
  set(value) {
4526
4584
  if (this.__setAttr(key, value)) {
4527
4585
  this.__layout.hitCanvasChanged = true;
4528
- if (Debug.showBounds === "hit") this.__layout.surfaceChange();
4529
4586
  if (this.leafer) this.leafer.updateCursor();
4530
4587
  }
4531
4588
  }
@@ -4731,6 +4788,10 @@ const LeafHelper = {
4731
4788
  if (layout.stateStyleChanged) leaf.updateState();
4732
4789
  if (layout.opacityChanged) updateAllWorldOpacity(leaf);
4733
4790
  leaf.__updateChange();
4791
+ if (layout.surfaceChanged) {
4792
+ if (leaf.__hasComplex) L.updateComplex(leaf);
4793
+ layout.surfaceChanged = false;
4794
+ }
4734
4795
  },
4735
4796
  updateAllChange(leaf) {
4736
4797
  updateChange$1(leaf);
@@ -4755,6 +4816,9 @@ const LeafHelper = {
4755
4816
  if (!fromWorld) fromWorld = leaf.__nowWorld;
4756
4817
  if (leaf.__worldFlipped || Platform.fullImageShadow) currentCanvas.copyWorldByReset(fromCanvas, fromWorld, leaf.__nowWorld, blendMode, onlyResetTransform); else currentCanvas.copyWorldToInner(fromCanvas, fromWorld, leaf.__layout.renderBounds, blendMode);
4757
4818
  },
4819
+ renderComplex(_leaf, _canvas, _options) {},
4820
+ updateComplex(_leaf) {},
4821
+ checkComplex(_leaf) {},
4758
4822
  moveWorld(t, x, y = 0, isInnerPoint, transition) {
4759
4823
  const local = isObject(x) ? Object.assign({}, x) : {
4760
4824
  x: x,
@@ -4866,6 +4930,9 @@ const LeafHelper = {
4866
4930
  divideParent(matrix, relative.scrollWorldTransform);
4867
4931
  return temp ? matrix : Object.assign({}, matrix);
4868
4932
  },
4933
+ updateScaleFixedWorld(_t) {},
4934
+ updateOuterBounds(_t) {},
4935
+ cacheId(_t) {},
4869
4936
  drop(t, parent, index, resize) {
4870
4937
  t.setTransform(L.getRelativeWorld(t, parent, true), resize);
4871
4938
  parent.add(t, index);
@@ -4916,7 +4983,8 @@ const LeafBoundsHelper = {
4916
4983
  return target.__.eraser || target.__.visible === 0 ? null : target.__layout.localStrokeBounds;
4917
4984
  },
4918
4985
  localRenderBounds(target) {
4919
- 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;
4920
4988
  },
4921
4989
  maskLocalBoxBounds(target, index) {
4922
4990
  return checkMask(target, index) && target.__localBoxBounds;
@@ -4925,7 +4993,8 @@ const LeafBoundsHelper = {
4925
4993
  return checkMask(target, index) && target.__layout.localStrokeBounds;
4926
4994
  },
4927
4995
  maskLocalRenderBounds(target, index) {
4928
- return checkMask(target, index) && target.__layout.localRenderBounds;
4996
+ const {__layout: __layout} = target;
4997
+ return checkMask(target, index) && (__layout.localOuterBounds || __layout.localRenderBounds);
4929
4998
  },
4930
4999
  excludeRenderBounds(child, options) {
4931
5000
  if (options.bounds && !options.bounds.hit(child.__world, options.matrix)) return true;
@@ -5445,7 +5514,6 @@ class LeafLayout {
5445
5514
  }
5446
5515
  opacityChange() {
5447
5516
  this.opacityChanged = true;
5448
- this.surfaceChanged || this.surfaceChange();
5449
5517
  }
5450
5518
  childrenSortChange() {
5451
5519
  if (!this.childrenSortChanged) {
@@ -5938,6 +6006,7 @@ const LeafMatrix = {
5938
6006
  const {parent: parent, __layout: __layout, __world: __world, __scrollWorld: __scrollWorld, __: __} = this;
5939
6007
  multiplyParent$2(this.__local || __layout, parent ? parent.__scrollWorld || parent.__world : defaultWorld, __world, !!__layout.affectScaleOrRotation, __);
5940
6008
  if (__scrollWorld) translateInner(Object.assign(__scrollWorld, __world), __.scrollX, __.scrollY);
6009
+ if (__layout.scaleFixed) LeafHelper.updateScaleFixedWorld(this);
5941
6010
  },
5942
6011
  __updateLocalMatrix() {
5943
6012
  if (this.__local) {
@@ -5971,6 +6040,7 @@ const LeafBounds = {
5971
6040
  __updateWorldBounds() {
5972
6041
  const {__layout: __layout, __world: __world} = this;
5973
6042
  toOuterOf$2(__layout.renderBounds, __world, __world);
6043
+ if (this.__hasComplex) LeafHelper.checkComplex(this);
5974
6044
  if (__layout.resized) {
5975
6045
  if (__layout.resized === "inner") this.__onUpdateSize();
5976
6046
  if (this.__hasLocalEvent) BoundsEvent.emitLocal(this);
@@ -6020,6 +6090,7 @@ const LeafBounds = {
6020
6090
  layout.renderChanged = undefined;
6021
6091
  if (this.parent) this.parent.__layout.renderChange();
6022
6092
  }
6093
+ if (layout.outerScale) LeafHelper.updateOuterBounds(this);
6023
6094
  layout.resized || (layout.resized = "local");
6024
6095
  layout.boundsChanged = undefined;
6025
6096
  },
@@ -6086,7 +6157,7 @@ const LeafRender = {
6086
6157
  const data = this.__;
6087
6158
  if (data.bright && !options.topRendering) return options.topList.add(this);
6088
6159
  canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
6089
- 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;
6090
6161
  if (this.__.__single) {
6091
6162
  if (data.eraser === "path") return this.__renderEraser(canvas, options);
6092
6163
  const tempCanvas = canvas.getSameCanvas(true, true);
@@ -6140,7 +6211,7 @@ const BranchRender = {
6140
6211
  if (data.eraser === "path") return this.__renderEraser(canvas, options);
6141
6212
  const tempCanvas = canvas.getSameCanvas(false, true);
6142
6213
  this.__renderBranch(tempCanvas, options);
6143
- canvas.opacity = options.dimOpacity ? data.opacity * options.dimOpacity : data.opacity;
6214
+ canvas.opacity = options.ignoreOpacity ? 1 : options.dimOpacity ? data.opacity * options.dimOpacity : data.opacity;
6144
6215
  canvas.copyWorldByReset(tempCanvas, nowWorld, nowWorld, data.__blendMode, true);
6145
6216
  tempCanvas.recycle(nowWorld);
6146
6217
  } else {
@@ -6152,9 +6223,11 @@ const BranchRender = {
6152
6223
  if (this.__hasMask) {
6153
6224
  this.__renderMask(canvas, options);
6154
6225
  } else {
6226
+ let child;
6155
6227
  const {children: children} = this;
6156
6228
  for (let i = 0, len = children.length; i < len; i++) {
6157
- excludeRenderBounds$1(children[i], options) || children[i].__render(canvas, options);
6229
+ child = children[i];
6230
+ excludeRenderBounds$1(child, options) || (child.__hasComplex ? LeafHelper.renderComplex(child, canvas, options) : child.__render(canvas, options));
6158
6231
  }
6159
6232
  }
6160
6233
  },
@@ -6168,8 +6241,6 @@ const BranchRender = {
6168
6241
  }
6169
6242
  };
6170
6243
 
6171
- const tempScaleData$1 = {};
6172
-
6173
6244
  const {LEAF: LEAF, create: create} = IncrementId;
6174
6245
 
6175
6246
  const {stintSet: stintSet$4} = DataHelper;
@@ -6180,6 +6251,8 @@ const {toOuterOf: toOuterOf$1} = BoundsHelper;
6180
6251
 
6181
6252
  const {copy: copy$2, move: move$2} = PointHelper;
6182
6253
 
6254
+ const {getScaleFixedData: getScaleFixedData} = MathHelper;
6255
+
6183
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;
6184
6257
 
6185
6258
  let Leaf = class Leaf {
@@ -6338,6 +6411,7 @@ let Leaf = class Leaf {
6338
6411
  this.__level = this.parent ? this.parent.__level + 1 : 1;
6339
6412
  if (this.animation) this.__runAnimation("in");
6340
6413
  if (this.__bubbleMap) this.__emitLifeEvent(ChildEvent.MOUNTED);
6414
+ if (leafer.cacheId) LeafHelper.cacheId(this);
6341
6415
  } else {
6342
6416
  this.__emitLifeEvent(ChildEvent.UNMOUNTED);
6343
6417
  }
@@ -6467,13 +6541,8 @@ let Leaf = class Leaf {
6467
6541
  if (scaleX < 0) scaleX = -scaleX;
6468
6542
  return scaleX > 1 ? scaleX : 1;
6469
6543
  }
6470
- getRenderScaleData(abs, scaleFixed) {
6471
- let {scaleX: scaleX, scaleY: scaleY} = ImageManager.patternLocked ? this.__world : this.__nowWorld;
6472
- if (abs) scaleX < 0 && (scaleX = -scaleX), scaleY < 0 && (scaleY = -scaleY);
6473
- if (scaleFixed === true || scaleFixed === "zoom-in" && scaleX > 1 && scaleY > 1) scaleX = scaleY = 1;
6474
- tempScaleData$1.scaleX = scaleX;
6475
- tempScaleData$1.scaleY = scaleY;
6476
- return tempScaleData$1;
6544
+ getRenderScaleData(abs, scaleFixed, unscale = true) {
6545
+ return getScaleFixedData(ImageManager.patternLocked ? this.__world : this.__nowWorld || this.__world, scaleFixed, unscale, abs);
6477
6546
  }
6478
6547
  getTransform(relative) {
6479
6548
  return this.__layout.getTransform(relative || "local");
@@ -6645,7 +6714,7 @@ let Leaf = class Leaf {
6645
6714
  __drawPath(_canvas) {}
6646
6715
  __drawRenderPath(_canvas) {}
6647
6716
  __updatePath() {}
6648
- __updateRenderPath() {}
6717
+ __updateRenderPath(_updateCache) {}
6649
6718
  getMotionPathData() {
6650
6719
  return Plugin.need("path");
6651
6720
  }
@@ -6719,9 +6788,11 @@ let Branch = class Branch extends Leaf {
6719
6788
  return 0;
6720
6789
  }
6721
6790
  __updateRenderSpread() {
6791
+ let layout;
6722
6792
  const {children: children} = this;
6723
6793
  for (let i = 0, len = children.length; i < len; i++) {
6724
- if (children[i].__layout.renderSpread) return 1;
6794
+ layout = children[i].__layout;
6795
+ if (layout.renderSpread || layout.localOuterBounds) return 1;
6725
6796
  }
6726
6797
  return 0;
6727
6798
  }
@@ -6754,6 +6825,7 @@ let Branch = class Branch extends Leaf {
6754
6825
  this.add(item, index);
6755
6826
  noIndex || index++;
6756
6827
  }); else child = UICreator.get(child.tag, child);
6828
+ if (!child) return;
6757
6829
  }
6758
6830
  if (child.parent) child.parent.remove(child);
6759
6831
  child.parent = this;
@@ -6979,7 +7051,7 @@ class LeafLevelList {
6979
7051
  }
6980
7052
  }
6981
7053
 
6982
- const version = "2.0.1";
7054
+ const version = "2.0.3";
6983
7055
 
6984
7056
  class LeaferCanvas extends LeaferCanvasBase {
6985
7057
  get allowBackgroundColor() {
@@ -7084,8 +7156,6 @@ class LeaferCanvas extends LeaferCanvasBase {
7084
7156
  }
7085
7157
  }
7086
7158
 
7087
- const {mineType: mineType, fileType: fileType} = FileHelper;
7088
-
7089
7159
  Object.assign(Creator, {
7090
7160
  canvas: (options, manager) => new LeaferCanvas(options, manager),
7091
7161
  image: options => new LeaferImage(options)
@@ -7101,12 +7171,12 @@ function useCanvas(_canvasType, app) {
7101
7171
  };
7102
7172
  return app.createOffscreenCanvas ? app.createOffscreenCanvas(data) : app.createOffScreenCanvas(data);
7103
7173
  },
7104
- canvasToDataURL: (canvas, type, quality) => canvas.toDataURL(mineType(type), quality),
7174
+ canvasToDataURL: (canvas, type, quality) => canvas.toDataURL(FileHelper.mimeType(type), quality),
7105
7175
  canvasToBolb: (canvas, type, quality) => canvas.toBuffer(type, {
7106
7176
  quality: quality
7107
7177
  }),
7108
7178
  canvasSaveAs: (canvas, filePath, quality) => {
7109
- let data = canvas.toDataURL(mineType(fileType(filePath)), quality);
7179
+ let data = canvas.toDataURL(FileHelper.mimeType(FileHelper.fileType(filePath)), quality);
7110
7180
  data = data.substring(data.indexOf("64,") + 3);
7111
7181
  return Platform.origin.download(data, filePath);
7112
7182
  },
@@ -7140,7 +7210,7 @@ function useCanvas(_canvasType, app) {
7140
7210
  });
7141
7211
  });
7142
7212
  },
7143
- loadImage(src) {
7213
+ loadImage(src, _crossOrigin, _leaferImage) {
7144
7214
  return new Promise((resolve, reject) => {
7145
7215
  const img = Platform.canvas.view.createImage();
7146
7216
  img.onload = () => {
@@ -7152,6 +7222,14 @@ function useCanvas(_canvasType, app) {
7152
7222
  img.src = Platform.image.getRealURL(src);
7153
7223
  });
7154
7224
  },
7225
+ loadContent(url, responseType = "text") {
7226
+ return new Promise((resolve, reject) => app.request({
7227
+ url: url,
7228
+ responseType: responseType === "arrayBuffer" ? "arraybuffer" : "text",
7229
+ success: res => resolve(responseType === "json" && typeof res.data === "string" ? JSON.parse(res.data) : res.data),
7230
+ fail: reject
7231
+ }));
7232
+ },
7155
7233
  noRepeat: "repeat-x"
7156
7234
  };
7157
7235
  Platform.miniapp = {
@@ -7703,7 +7781,7 @@ class Renderer {
7703
7781
  getCellList() {
7704
7782
  return undefined;
7705
7783
  }
7706
- addBlock(block) {
7784
+ addBlock(block, _leafList) {
7707
7785
  if (!this.updateBlocks) this.updateBlocks = [];
7708
7786
  this.updateBlocks.push(block);
7709
7787
  }
@@ -7751,7 +7829,8 @@ class Renderer {
7751
7829
  __onLayoutEnd(event) {
7752
7830
  if (event.data) event.data.map(item => {
7753
7831
  let empty;
7754
- if (item.updatedList) item.updatedList.list.some(leaf => {
7832
+ const {updatedList: updatedList} = item;
7833
+ if (updatedList) updatedList.list.some(leaf => {
7755
7834
  empty = !leaf.__world.width || !leaf.__world.height;
7756
7835
  if (empty) {
7757
7836
  if (!leaf.isLeafer) debug$2.tip(leaf.innerName, ": empty");
@@ -7759,7 +7838,7 @@ class Renderer {
7759
7838
  }
7760
7839
  return empty;
7761
7840
  });
7762
- this.addBlock(empty ? this.canvas.bounds : item.updatedBounds);
7841
+ this.addBlock(empty ? this.canvas.bounds : item.updatedBounds, updatedList);
7763
7842
  });
7764
7843
  }
7765
7844
  emitRender(type, bounds, options) {
@@ -7807,7 +7886,9 @@ function effectType(defaultValue) {
7807
7886
  set(value) {
7808
7887
  this.__setAttr(key, value);
7809
7888
  if (value) this.__.__useEffect = true;
7810
- this.__layout.renderChanged || this.__layout.renderChange();
7889
+ const layout = this.__layout;
7890
+ layout.renderChanged || layout.renderChange();
7891
+ layout.surfaceChange();
7811
7892
  }
7812
7893
  }));
7813
7894
  }
@@ -8021,15 +8102,16 @@ class UIData extends LeafData {
8021
8102
  this.__needComputePaint = undefined;
8022
8103
  }
8023
8104
  __getRealStrokeWidth(childStyle) {
8024
- let {strokeWidth: strokeWidth, strokeWidthFixed: strokeWidthFixed} = this;
8105
+ let {strokeWidth: strokeWidth, strokeScaleFixed: strokeScaleFixed} = this;
8025
8106
  if (childStyle) {
8026
8107
  if (childStyle.strokeWidth) strokeWidth = childStyle.strokeWidth;
8027
- if (!isUndefined(childStyle.strokeWidthFixed)) strokeWidthFixed = childStyle.strokeWidthFixed;
8108
+ if (!isUndefined(childStyle.strokeScaleFixed)) strokeScaleFixed = childStyle.strokeScaleFixed;
8028
8109
  }
8029
- if (strokeWidthFixed) {
8030
- const scale = this.__leaf.getClampRenderScale();
8031
- return scale > 1 ? strokeWidth / scale : strokeWidth;
8032
- } else return strokeWidth;
8110
+ if (strokeScaleFixed) {
8111
+ const {scaleX: scaleX} = this.__leaf.getRenderScaleData(true, strokeScaleFixed, false);
8112
+ if (scaleX !== 1) return strokeWidth * scaleX;
8113
+ }
8114
+ return strokeWidth;
8033
8115
  }
8034
8116
  __setPaint(attrName, value) {
8035
8117
  this.__setInput(attrName, value);
@@ -8167,13 +8249,16 @@ class TextData extends UIData {
8167
8249
  }
8168
8250
 
8169
8251
  class ImageData extends RectData {
8252
+ get __urlType() {
8253
+ return "image";
8254
+ }
8170
8255
  setUrl(value) {
8171
8256
  this.__setImageFill(value);
8172
8257
  this._url = value;
8173
8258
  }
8174
8259
  __setImageFill(value) {
8175
8260
  this.fill = value ? {
8176
- type: "image",
8261
+ type: this.__urlType,
8177
8262
  mode: "stretch",
8178
8263
  url: value
8179
8264
  } : undefined;
@@ -8212,7 +8297,7 @@ const UIBounds = {
8212
8297
  const data = this.__, {strokeAlign: strokeAlign, __maxStrokeWidth: strokeWidth} = data, box = this.__box;
8213
8298
  if ((data.stroke || data.hitStroke === "all") && strokeWidth && strokeAlign !== "inside") {
8214
8299
  boxSpread = spread = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
8215
- if (!data.__boxStroke) {
8300
+ if (!data.__boxStroke || data.__useArrow) {
8216
8301
  const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * spread;
8217
8302
  const storkeCapAddWidth = data.strokeCap === "none" ? 0 : strokeWidth;
8218
8303
  spread += Math.max(miterLimitAddWidth, storkeCapAddWidth);
@@ -8369,6 +8454,12 @@ let UI = UI_1 = class UI extends Leaf {
8369
8454
  get isFrame() {
8370
8455
  return false;
8371
8456
  }
8457
+ set strokeWidthFixed(value) {
8458
+ this.strokeScaleFixed = value;
8459
+ }
8460
+ get strokeWidthFixed() {
8461
+ return this.strokeScaleFixed;
8462
+ }
8372
8463
  set scale(value) {
8373
8464
  MathHelper.assignScale(this, value);
8374
8465
  }
@@ -8424,6 +8515,9 @@ let UI = UI_1 = class UI extends Leaf {
8424
8515
  getPathString(curve, pathForRender, floatLength) {
8425
8516
  return PathConvert.stringify(this.getPath(curve, pathForRender), floatLength);
8426
8517
  }
8518
+ asPath(curve, pathForRender) {
8519
+ this.path = this.getPath(curve, pathForRender);
8520
+ }
8427
8521
  load() {
8428
8522
  this.__.__computePaint();
8429
8523
  }
@@ -8433,16 +8527,18 @@ let UI = UI_1 = class UI extends Leaf {
8433
8527
  data.lazy && !this.__inLazyBounds && !Export.running ? data.__needComputePaint = true : data.__computePaint();
8434
8528
  }
8435
8529
  }
8436
- __updateRenderPath() {
8530
+ __updateRenderPath(updateCache) {
8437
8531
  const data = this.__;
8438
8532
  if (data.path) {
8439
8533
  data.__pathForRender = data.cornerRadius ? PathCorner.smooth(data.path, data.cornerRadius, data.cornerSmoothing) : data.path;
8440
- if (data.__useArrow) PathArrow.addArrows(this);
8534
+ if (data.__useArrow) PathArrow.addArrows(this, updateCache);
8441
8535
  } else data.__pathForRender && (data.__pathForRender = undefined);
8442
8536
  }
8443
8537
  __drawRenderPath(canvas) {
8538
+ const data = this.__;
8444
8539
  canvas.beginPath();
8445
- this.__drawPathByData(canvas, this.__.__pathForRender);
8540
+ if (data.__useArrow) PathArrow.updateArrow(this);
8541
+ this.__drawPathByData(canvas, data.__pathForRender);
8446
8542
  }
8447
8543
  __drawPath(canvas) {
8448
8544
  canvas.beginPath();
@@ -8491,6 +8587,7 @@ let UI = UI_1 = class UI extends Leaf {
8491
8587
  static setEditOuter(_toolName) {}
8492
8588
  static setEditInner(_editorName) {}
8493
8589
  destroy() {
8590
+ this.__.__willDestroy = true;
8494
8591
  this.fill = this.stroke = null;
8495
8592
  if (this.__animate) this.killAnimate();
8496
8593
  super.destroy();
@@ -8607,7 +8704,7 @@ __decorate([ strokeType("inside") ], UI.prototype, "strokeAlign", void 0);
8607
8704
 
8608
8705
  __decorate([ strokeType(1, true) ], UI.prototype, "strokeWidth", void 0);
8609
8706
 
8610
- __decorate([ strokeType(false) ], UI.prototype, "strokeWidthFixed", void 0);
8707
+ __decorate([ strokeType(false) ], UI.prototype, "strokeScaleFixed", void 0);
8611
8708
 
8612
8709
  __decorate([ strokeType("none") ], UI.prototype, "strokeCap", void 0);
8613
8710
 
@@ -8673,7 +8770,10 @@ let Group = class Group extends UI {
8673
8770
  }
8674
8771
  toJSON(options) {
8675
8772
  const data = super.toJSON(options);
8676
- if (!this.childlessJSON) data.children = this.children.map(child => child.toJSON(options));
8773
+ if (!this.childlessJSON) {
8774
+ const children = data.children = [];
8775
+ this.children.forEach(child => child.skipJSON || children.push(child.toJSON(options)));
8776
+ }
8677
8777
  return data;
8678
8778
  }
8679
8779
  pick(_hitPoint, _options) {
@@ -8822,12 +8922,12 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8822
8922
  this.emitLeafer(LeaferEvent.STOP);
8823
8923
  }
8824
8924
  }
8825
- unlockLayout() {
8925
+ unlockLayout(updateLayout = true) {
8826
8926
  this.layouter.start();
8827
- this.updateLayout();
8927
+ if (updateLayout) this.updateLayout();
8828
8928
  }
8829
- lockLayout() {
8830
- this.updateLayout();
8929
+ lockLayout(updateLayout = true) {
8930
+ if (updateLayout) this.updateLayout();
8831
8931
  this.layouter.stop();
8832
8932
  }
8833
8933
  resize(size) {
@@ -9236,9 +9336,9 @@ let Ellipse = class Ellipse extends UI {
9236
9336
  return "Ellipse";
9237
9337
  }
9238
9338
  __updatePath() {
9239
- 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;
9240
9340
  const rx = width / 2, ry = height / 2;
9241
- const path = this.__.path = [];
9341
+ const path = data.path = [];
9242
9342
  let open;
9243
9343
  if (innerRadius) {
9244
9344
  if (startAngle || endAngle) {
@@ -9260,7 +9360,7 @@ let Ellipse = class Ellipse extends UI {
9260
9360
  }
9261
9361
  }
9262
9362
  if (!open) closePath$2(path);
9263
- if (Platform.ellipseToCurve) this.__.path = this.getPath(true);
9363
+ if (Platform.ellipseToCurve || data.__useArrow) data.path = this.getPath(true);
9264
9364
  }
9265
9365
  };
9266
9366
 
@@ -9735,8 +9835,8 @@ function fills(fills, ui, canvas, renderOptions) {
9735
9835
  canvas.save();
9736
9836
  if (item.transform) canvas.transform(item.transform);
9737
9837
  if (originPaint.scaleFixed) {
9738
- const {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true);
9739
- 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);
9740
9840
  }
9741
9841
  if (originPaint.blendMode) canvas.blendMode = originPaint.blendMode;
9742
9842
  fillPathOrText(ui, canvas, renderOptions);
@@ -10010,11 +10110,14 @@ function compute(attrName, ui) {
10010
10110
  function getLeafPaint(attrName, paint, ui) {
10011
10111
  if (!isObject(paint) || paint.visible === false || paint.opacity === 0) return undefined;
10012
10112
  let leafPaint;
10013
- const {boxBounds: boxBounds} = ui.__layout;
10014
- switch (paint.type) {
10113
+ const {boxBounds: boxBounds} = ui.__layout, {type: type} = paint;
10114
+ switch (type) {
10015
10115
  case "image":
10116
+ case "film":
10117
+ case "video":
10016
10118
  if (!paint.url) return undefined;
10017
10119
  leafPaint = PaintImage.image(ui, attrName, paint, boxBounds, !recycleMap || !recycleMap[paint.url]);
10120
+ if (type !== "image") PaintImage[type](leafPaint);
10018
10121
  break;
10019
10122
 
10020
10123
  case "linear":
@@ -10030,7 +10133,7 @@ function getLeafPaint(attrName, paint, ui) {
10030
10133
  break;
10031
10134
 
10032
10135
  case "solid":
10033
- const {type: type, color: color, opacity: opacity} = paint;
10136
+ const {color: color, opacity: opacity} = paint;
10034
10137
  leafPaint = {
10035
10138
  type: type,
10036
10139
  style: ColorConvert.string(color, opacity)
@@ -10074,7 +10177,7 @@ const {isSame: isSame} = BoundsHelper;
10074
10177
 
10075
10178
  function image(ui, attrName, paint, boxBounds, firstUse) {
10076
10179
  let leafPaint, event;
10077
- const image = ImageManager.get(paint);
10180
+ const image = ImageManager.get(paint, paint.type);
10078
10181
  if (cache && paint === cache.paint && isSame(boxBounds, cache.boxBounds)) {
10079
10182
  leafPaint = cache.leafPaint;
10080
10183
  } else {
@@ -10135,8 +10238,8 @@ function image(ui, attrName, paint, boxBounds, firstUse) {
10135
10238
  }
10136
10239
 
10137
10240
  function checkSizeAndCreateData(ui, attrName, paint, image, leafPaint, boxBounds) {
10138
- if (attrName === "fill" && !ui.__.__naturalWidth) {
10139
- const data = ui.__;
10241
+ const data = ui.__;
10242
+ if (attrName === "fill" && !data.__naturalWidth) {
10140
10243
  data.__naturalWidth = image.width / data.pixelRatio;
10141
10244
  data.__naturalHeight = image.height / data.pixelRatio;
10142
10245
  if (data.__autoSide) {
@@ -10148,7 +10251,13 @@ function checkSizeAndCreateData(ui, attrName, paint, image, leafPaint, boxBounds
10148
10251
  return false;
10149
10252
  }
10150
10253
  }
10151
- if (!leafPaint.data) PaintImage.createData(leafPaint, image, paint, boxBounds);
10254
+ if (!leafPaint.data) {
10255
+ PaintImage.createData(leafPaint, image, paint, boxBounds);
10256
+ const {transform: transform} = leafPaint.data, {opacity: opacity, blendMode: blendMode} = paint;
10257
+ const clip = transform && !transform.onlyScale || data.path || data.cornerRadius;
10258
+ if (clip || opacity && opacity < 1 || blendMode) leafPaint.complex = clip ? 2 : true;
10259
+ }
10260
+ if (paint.filter) PaintImage.applyFilter(leafPaint, image, paint.filter, ui);
10152
10261
  return true;
10153
10262
  }
10154
10263
 
@@ -10191,7 +10300,7 @@ function getPatternData(paint, box, image) {
10191
10300
  if (paint.padding) box = tempBox.set(box).shrink(paint.padding);
10192
10301
  if (paint.mode === "strench") paint.mode = "stretch";
10193
10302
  const {width: width, height: height} = image;
10194
- const {opacity: opacity, mode: mode, align: align, offset: offset, scale: scale, size: size, rotation: rotation, skew: skew, clipSize: clipSize, repeat: repeat, gap: gap, filters: filters, interlace: interlace} = paint;
10303
+ const {mode: mode, align: align, offset: offset, scale: scale, size: size, rotation: rotation, skew: skew, clipSize: clipSize, repeat: repeat, gap: gap, interlace: interlace} = paint;
10195
10304
  const sameBox = box.width === width && box.height === height;
10196
10305
  const data = {
10197
10306
  mode: mode
@@ -10254,8 +10363,6 @@ function getPatternData(paint, box, image) {
10254
10363
  data.scaleX = scaleX;
10255
10364
  data.scaleY = scaleY;
10256
10365
  }
10257
- if (opacity && opacity < 1) data.opacity = opacity;
10258
- if (filters) data.filters = filters;
10259
10366
  if (repeat) data.repeat = isString(repeat) ? repeat === "x" ? "repeat-x" : "repeat-y" : "repeat";
10260
10367
  if (interlace) data.interlace = isNumber(interlace) || interlace.type === "percent" ? {
10261
10368
  type: "x",
@@ -10286,7 +10393,7 @@ const {get: get$2, set: set, rotateOfOuter: rotateOfOuter$1, translate: translat
10286
10393
 
10287
10394
  function stretchMode(data, box, scaleX, scaleY) {
10288
10395
  const transform = get$2(), {x: x, y: y} = box;
10289
- if (x || y) translate(transform, x, y); else transform.onlyScale = true;
10396
+ if (x || y) translate(transform, x, y); else if (scaleX > 0 && scaleY > 0) transform.onlyScale = true;
10290
10397
  scaleHelper(transform, scaleX, scaleY);
10291
10398
  data.transform = transform;
10292
10399
  }
@@ -10375,10 +10482,10 @@ function createPatternTask(paint, ui, canvas, renderOptions) {
10375
10482
  }
10376
10483
 
10377
10484
  function createPattern(paint, ui, canvas, renderOptions) {
10378
- let {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions), id = scaleX + "-" + scaleY;
10485
+ let {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions), id = paint.film ? paint.nowIndex : scaleX + "-" + scaleY;
10379
10486
  if (paint.patternId !== id && !ui.destroyed) {
10380
10487
  if (!(Platform.image.isLarge(paint.image, scaleX, scaleY) && !paint.data.repeat)) {
10381
- const {image: image, data: data} = paint, {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);
10382
10489
  let imageMatrix, xGap, yGap, {width: width, height: height} = image;
10383
10490
  if (fixScale) scaleX *= fixScale, scaleY *= fixScale;
10384
10491
  width *= scaleX;
@@ -10394,7 +10501,7 @@ function createPattern(paint, ui, canvas, renderOptions) {
10394
10501
  if (transform) copy$1(imageMatrix, transform);
10395
10502
  scale(imageMatrix, 1 / scaleX, 1 / scaleY);
10396
10503
  }
10397
- const imageCanvas = image.getCanvas(width, height, data.opacity, data.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);
10398
10505
  const pattern = image.getPattern(imageCanvas, data.repeat || (Platform.origin.noRepeat || "no-repeat"), imageMatrix, paint);
10399
10506
  paint.style = pattern;
10400
10507
  paint.patternId = id;
@@ -10415,15 +10522,15 @@ function getPatternFixScale(paint, imageScaleX, imageScaleY) {
10415
10522
  }
10416
10523
 
10417
10524
  function checkImage(paint, drawImage, ui, canvas, renderOptions) {
10418
- const {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions);
10525
+ const {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions), id = paint.film ? paint.nowIndex : scaleX + "-" + scaleY;
10419
10526
  const {image: image, data: data, originPaint: originPaint} = paint, {exporting: exporting, snapshot: snapshot} = renderOptions;
10420
- if (!data || paint.patternId === scaleX + "-" + scaleY && !exporting || snapshot) {
10527
+ if (!data || paint.patternId === id && !exporting || snapshot) {
10421
10528
  return false;
10422
10529
  } else {
10423
10530
  if (drawImage) {
10424
10531
  if (data.repeat) {
10425
10532
  drawImage = false;
10426
- } else if (!(originPaint.changeful || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || exporting)) {
10533
+ } else if (!(originPaint.changeful || paint.film || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || exporting)) {
10427
10534
  drawImage = Platform.image.isLarge(image, scaleX, scaleY) || image.width * scaleX > 8096 || image.height * scaleY > 8096;
10428
10535
  }
10429
10536
  }
@@ -10441,20 +10548,21 @@ function checkImage(paint, drawImage, ui, canvas, renderOptions) {
10441
10548
  }
10442
10549
  }
10443
10550
 
10444
- function drawImage(paint, _imageScaleX, _imageScaleY, ui, canvas, _renderOptions) {
10445
- const {data: data, image: image} = paint, {blendMode: blendMode} = paint.originPaint, {opacity: opacity, transform: transform} = data, view = image.getFull(data.filters), u = ui.__;
10446
- let {width: width, height: height} = image, clipUI;
10447
- if ((clipUI = transform && !transform.onlyScale || u.path || u.cornerRadius) || opacity || blendMode) {
10551
+ function drawImage(paint, imageScaleX, imageScaleY, ui, canvas, _renderOptions) {
10552
+ const {data: data, image: image, complex: complex} = paint;
10553
+ let {width: width, height: height} = image;
10554
+ if (complex) {
10555
+ const {blendMode: blendMode, opacity: opacity} = paint.originPaint, {transform: transform} = data;
10448
10556
  canvas.save();
10449
- clipUI && canvas.clipUI(ui);
10557
+ complex === 2 && canvas.clipUI(ui);
10450
10558
  blendMode && (canvas.blendMode = blendMode);
10451
10559
  opacity && (canvas.opacity *= opacity);
10452
10560
  transform && canvas.transform(transform);
10453
- canvas.drawImage(view, 0, 0, width, height);
10561
+ image.render(canvas, 0, 0, width, height, ui, paint, imageScaleX, imageScaleY);
10454
10562
  canvas.restore();
10455
10563
  } else {
10456
10564
  if (data.scaleX) width *= data.scaleX, height *= data.scaleY;
10457
- canvas.drawImage(view, 0, 0, width, height);
10565
+ image.render(canvas, 0, 0, width, height, ui, paint, imageScaleX, imageScaleY);
10458
10566
  }
10459
10567
  }
10460
10568
 
@@ -10484,6 +10592,7 @@ function recycleImage(attrName, data) {
10484
10592
  if (!recycleMap) recycleMap = {};
10485
10593
  recycleMap[url] = true;
10486
10594
  ImageManager.recyclePaint(paint);
10595
+ if (data.__willDestroy && image.parent) PaintImage.recycleFilter(image, data.__leaf);
10487
10596
  if (image.loading) {
10488
10597
  if (!input) {
10489
10598
  input = data.__input && data.__input[attrName] || [];
@@ -11395,4 +11504,4 @@ try {
11395
11504
  if (wx) useCanvas("miniapp", wx);
11396
11505
  } catch (_a) {}
11397
11506
 
11398
- export { AlignHelper, Answer, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, DataHelper, Debug, Direction4, Direction9, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, FourNumberHelper, Frame, FrameData, Group, GroupData, 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, PathCommandNodeHelper, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNodeHandleType, 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, UnitConvertHelper, WaitHelper, WatchEvent, Watcher, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, createAttr, createDescriptor, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, dimType, doBoundsType, doStrokeType, effectType, emptyData, eraserType, extraPropertyEventMap, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isArray, isData, isEmptyData, isFinite, isNull, isNumber, isObject, isString, isUndefined, layoutProcessor, leaferTransformAttrMap, maskType, naturalBoundsType, opacityType, path, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, scrollType, sortType, strokeType, surfaceType, tempBounds$2 as tempBounds, tempMatrix$2 as tempMatrix, tempPoint$2 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };
11507
+ export { AlignHelper, Answer, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, DataHelper, Debug, Direction4, Direction9, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, FourNumberHelper, Frame, FrameData, Group, GroupData, Image, ImageData, ImageEvent, ImageManager, IncrementId, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferFilm, LeaferImage, LeaferVideo, Line, LineData, MathHelper, Matrix, MatrixHelper, MyImage, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathCommandNodeHelper, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNodeHandleType, 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, UnitConvertHelper, WaitHelper, WatchEvent, Watcher, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, createAttr, createDescriptor, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, dimType, doBoundsType, doStrokeType, effectType, emptyData, eraserType, extraPropertyEventMap, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isArray, isData, isEmptyData, isFinite, isNull, isNumber, isObject, isString, isUndefined, layoutProcessor, leaferTransformAttrMap, maskType, naturalBoundsType, opacityType, path, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, scrollType, sortType, strokeType, surfaceType, tempBounds$2 as tempBounds, tempMatrix$2 as tempMatrix, tempPoint$2 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };