@leafer-draw/worker 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.
@@ -7,6 +7,45 @@ var PathNodeHandleType;
7
7
  PathNodeHandleType[PathNodeHandleType["mirror"] = 4] = "mirror";
8
8
  })(PathNodeHandleType || (PathNodeHandleType = {}));
9
9
 
10
+ function __decorate(decorators, target, key, desc) {
11
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
12
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
13
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
14
+ }
15
+
16
+ function __awaiter(thisArg, _arguments, P, generator) {
17
+ function adopt(value) {
18
+ return value instanceof P ? value : new P(function(resolve) {
19
+ resolve(value);
20
+ });
21
+ }
22
+ return new (P || (P = Promise))(function(resolve, reject) {
23
+ function fulfilled(value) {
24
+ try {
25
+ step(generator.next(value));
26
+ } catch (e) {
27
+ reject(e);
28
+ }
29
+ }
30
+ function rejected(value) {
31
+ try {
32
+ step(generator["throw"](value));
33
+ } catch (e) {
34
+ reject(e);
35
+ }
36
+ }
37
+ function step(result) {
38
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
39
+ }
40
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
41
+ });
42
+ }
43
+
44
+ typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
45
+ var e = new Error(message);
46
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
47
+ };
48
+
10
49
  var Answer;
11
50
 
12
51
  (function(Answer) {
@@ -213,6 +252,7 @@ class LeafData {
213
252
  }
214
253
  destroy() {
215
254
  this.__input = this.__middle = null;
255
+ if (this.__complexData) this.__complexData.destroy();
216
256
  }
217
257
  }
218
258
 
@@ -311,6 +351,8 @@ const {set: set$2, get: get$5, setTemp: setTemp, toTempAB: toTempAB} = FourNumbe
311
351
 
312
352
  const {round: round$3, pow: pow$1, max: max$3, floor: floor$2, PI: PI$3} = Math;
313
353
 
354
+ const tempScaleData$1 = {};
355
+
314
356
  const MathHelper = {
315
357
  within(value, min, max) {
316
358
  if (isObject(min)) max = min.max, min = min.min;
@@ -354,6 +396,24 @@ const MathHelper = {
354
396
  } else if (scale) MathHelper.assignScale(scaleData, scale);
355
397
  return scaleData;
356
398
  },
399
+ getScaleFixedData(worldScaleData, scaleFixed, unscale, abs, _localScaleData) {
400
+ let {scaleX: scaleX, scaleY: scaleY} = worldScaleData;
401
+ if (abs || scaleFixed) scaleX < 0 && (scaleX = -scaleX), scaleY < 0 && (scaleY = -scaleY);
402
+ if (scaleFixed) {
403
+ if (scaleFixed === true) {
404
+ scaleX = scaleY = unscale ? 1 : 1 / scaleX;
405
+ } else {
406
+ let minScale;
407
+ if (isNumber(scaleFixed)) minScale = scaleFixed; else if (scaleFixed === "zoom-in") minScale = 1;
408
+ if (minScale) {
409
+ if (scaleX > minScale || scaleY > minScale) scaleX = scaleY = unscale ? 1 : 1 / scaleX; else scaleX = scaleY = unscale ? 1 : 1 / minScale;
410
+ }
411
+ }
412
+ }
413
+ tempScaleData$1.scaleX = scaleX;
414
+ tempScaleData$1.scaleY = scaleY;
415
+ return tempScaleData$1;
416
+ },
357
417
  assignScale(scaleData, scale) {
358
418
  if (isNumber(scale)) {
359
419
  scaleData.scaleX = scaleData.scaleY = scale;
@@ -850,8 +910,8 @@ const PointHelper = {
850
910
  if (isObject(originPoints[0])) points = [], originPoints.forEach(p => points.push(p.x, p.y));
851
911
  return points;
852
912
  },
853
- isSame(t, point) {
854
- return float$1(t.x) === float$1(point.x) && float$1(t.y) === float$1(point.y);
913
+ isSame(t, point, quick) {
914
+ 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
915
  },
856
916
  reset(t) {
857
917
  P$5.reset(t);
@@ -926,8 +986,8 @@ class Point {
926
986
  getAtan2(to) {
927
987
  return PointHelper.getAtan2(this, to);
928
988
  }
929
- isSame(point) {
930
- return PointHelper.isSame(this, point);
989
+ isSame(point, quick) {
990
+ return PointHelper.isSame(this, point, quick);
931
991
  }
932
992
  reset() {
933
993
  PointHelper.reset(this);
@@ -1183,9 +1243,9 @@ const AroundHelper = {
1183
1243
  }
1184
1244
  if (!onlyBoxSize) to.x += box.x, to.y += box.y;
1185
1245
  },
1186
- getPoint(around, box, to) {
1246
+ getPoint(around, box, to, onlyBoxSize = true) {
1187
1247
  if (!to) to = {};
1188
- AroundHelper.toPoint(around, box, to, true);
1248
+ AroundHelper.toPoint(around, box, to, onlyBoxSize);
1189
1249
  return to;
1190
1250
  }
1191
1251
  };
@@ -1452,6 +1512,9 @@ const BoundsHelper = {
1452
1512
  y: y + height
1453
1513
  } ];
1454
1514
  },
1515
+ getPoint(t, around, onlyBoxSize = false, to) {
1516
+ return AroundHelper.getPoint(around, t, to, onlyBoxSize);
1517
+ },
1455
1518
  hitRadiusPoint(t, point, pointMatrix) {
1456
1519
  if (pointMatrix) point = PointHelper.tempToInnerRadiusPointOf(point, pointMatrix);
1457
1520
  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 +1686,9 @@ class Bounds {
1623
1686
  getPoints() {
1624
1687
  return BoundsHelper.getPoints(this);
1625
1688
  }
1689
+ getPoint(around, onlyBoxSize, to) {
1690
+ return BoundsHelper.getPoint(this, around, onlyBoxSize, to);
1691
+ }
1626
1692
  hitPoint(point, pointMatrix) {
1627
1693
  return BoundsHelper.hitPoint(this, point, pointMatrix);
1628
1694
  }
@@ -1897,7 +1963,10 @@ const UICreator = {
1897
1963
  list$1[tag] = UI;
1898
1964
  },
1899
1965
  get(tag, data, x, y, width, height) {
1900
- if (!list$1[tag]) debug$d.error("not register " + tag);
1966
+ if (!list$1[tag]) {
1967
+ debug$d.warn("not register " + tag);
1968
+ return undefined;
1969
+ }
1901
1970
  const ui = new list$1[tag](data);
1902
1971
  if (!isUndefined(x)) {
1903
1972
  ui.x = x;
@@ -1988,45 +2057,6 @@ class CanvasManager {
1988
2057
  }
1989
2058
  }
1990
2059
 
1991
- function __decorate(decorators, target, key, desc) {
1992
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1993
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1994
- return c > 3 && r && Object.defineProperty(target, key, r), r;
1995
- }
1996
-
1997
- function __awaiter(thisArg, _arguments, P, generator) {
1998
- function adopt(value) {
1999
- return value instanceof P ? value : new P(function(resolve) {
2000
- resolve(value);
2001
- });
2002
- }
2003
- return new (P || (P = Promise))(function(resolve, reject) {
2004
- function fulfilled(value) {
2005
- try {
2006
- step(generator.next(value));
2007
- } catch (e) {
2008
- reject(e);
2009
- }
2010
- }
2011
- function rejected(value) {
2012
- try {
2013
- step(generator["throw"](value));
2014
- } catch (e) {
2015
- reject(e);
2016
- }
2017
- }
2018
- function step(result) {
2019
- result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
2020
- }
2021
- step((generator = generator.apply(thisArg, _arguments || [])).next());
2022
- });
2023
- }
2024
-
2025
- typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
2026
- var e = new Error(message);
2027
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
2028
- };
2029
-
2030
2060
  function contextAttr(realName) {
2031
2061
  return (target, key) => {
2032
2062
  if (!realName) realName = key;
@@ -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() {
@@ -7005,8 +7077,6 @@ canvasPatch(OffscreenCanvasRenderingContext2D.prototype);
7005
7077
 
7006
7078
  canvasPatch(Path2D.prototype);
7007
7079
 
7008
- const {mineType: mineType} = FileHelper;
7009
-
7010
7080
  Object.assign(Creator, {
7011
7081
  canvas: (options, manager) => new LeaferCanvas(options, manager),
7012
7082
  image: options => new LeaferImage(options)
@@ -7017,7 +7087,7 @@ function useCanvas(_canvasType, _power) {
7017
7087
  createCanvas: (width, height) => new OffscreenCanvas(width, height),
7018
7088
  canvasToDataURL: (canvas, type, quality) => new Promise((resolve, reject) => {
7019
7089
  canvas.convertToBlob({
7020
- type: mineType(type),
7090
+ type: FileHelper.mimeType(type),
7021
7091
  quality: quality
7022
7092
  }).then(blob => {
7023
7093
  var reader = new FileReader;
@@ -7029,14 +7099,14 @@ function useCanvas(_canvasType, _power) {
7029
7099
  });
7030
7100
  }),
7031
7101
  canvasToBolb: (canvas, type, quality) => canvas.convertToBlob({
7032
- type: mineType(type),
7102
+ type: FileHelper.mimeType(type),
7033
7103
  quality: quality
7034
7104
  }),
7035
7105
  canvasSaveAs: (_canvas, _filename, _quality) => new Promise(resolve => resolve()),
7036
7106
  download(_url, _filename) {
7037
7107
  return undefined;
7038
7108
  },
7039
- loadImage(src) {
7109
+ loadImage(src, _crossOrigin, _leaferImage) {
7040
7110
  return new Promise((resolve, reject) => {
7041
7111
  let req = new XMLHttpRequest;
7042
7112
  req.open("GET", Platform.image.getRealURL(src), true);
@@ -7051,6 +7121,13 @@ function useCanvas(_canvasType, _power) {
7051
7121
  req.onerror = e => reject(e);
7052
7122
  req.send();
7053
7123
  });
7124
+ },
7125
+ loadContent(url_1) {
7126
+ return __awaiter(this, arguments, void 0, function*(url, responseType = "text") {
7127
+ const response = yield fetch(url);
7128
+ if (!response.ok) throw new Error(`${response.status}`);
7129
+ return yield response[responseType]();
7130
+ });
7054
7131
  }
7055
7132
  };
7056
7133
  Platform.canvas = Creator.canvas();
@@ -7550,7 +7627,7 @@ class Renderer {
7550
7627
  getCellList() {
7551
7628
  return undefined;
7552
7629
  }
7553
- addBlock(block) {
7630
+ addBlock(block, _leafList) {
7554
7631
  if (!this.updateBlocks) this.updateBlocks = [];
7555
7632
  this.updateBlocks.push(block);
7556
7633
  }
@@ -7598,7 +7675,8 @@ class Renderer {
7598
7675
  __onLayoutEnd(event) {
7599
7676
  if (event.data) event.data.map(item => {
7600
7677
  let empty;
7601
- if (item.updatedList) item.updatedList.list.some(leaf => {
7678
+ const {updatedList: updatedList} = item;
7679
+ if (updatedList) updatedList.list.some(leaf => {
7602
7680
  empty = !leaf.__world.width || !leaf.__world.height;
7603
7681
  if (empty) {
7604
7682
  if (!leaf.isLeafer) debug$2.tip(leaf.innerName, ": empty");
@@ -7606,7 +7684,7 @@ class Renderer {
7606
7684
  }
7607
7685
  return empty;
7608
7686
  });
7609
- this.addBlock(empty ? this.canvas.bounds : item.updatedBounds);
7687
+ this.addBlock(empty ? this.canvas.bounds : item.updatedBounds, updatedList);
7610
7688
  });
7611
7689
  }
7612
7690
  emitRender(type, bounds, options) {
@@ -7654,7 +7732,9 @@ function effectType(defaultValue) {
7654
7732
  set(value) {
7655
7733
  this.__setAttr(key, value);
7656
7734
  if (value) this.__.__useEffect = true;
7657
- this.__layout.renderChanged || this.__layout.renderChange();
7735
+ const layout = this.__layout;
7736
+ layout.renderChanged || layout.renderChange();
7737
+ layout.surfaceChange();
7658
7738
  }
7659
7739
  }));
7660
7740
  }
@@ -7868,15 +7948,16 @@ class UIData extends LeafData {
7868
7948
  this.__needComputePaint = undefined;
7869
7949
  }
7870
7950
  __getRealStrokeWidth(childStyle) {
7871
- let {strokeWidth: strokeWidth, strokeWidthFixed: strokeWidthFixed} = this;
7951
+ let {strokeWidth: strokeWidth, strokeScaleFixed: strokeScaleFixed} = this;
7872
7952
  if (childStyle) {
7873
7953
  if (childStyle.strokeWidth) strokeWidth = childStyle.strokeWidth;
7874
- if (!isUndefined(childStyle.strokeWidthFixed)) strokeWidthFixed = childStyle.strokeWidthFixed;
7954
+ if (!isUndefined(childStyle.strokeScaleFixed)) strokeScaleFixed = childStyle.strokeScaleFixed;
7875
7955
  }
7876
- if (strokeWidthFixed) {
7877
- const scale = this.__leaf.getClampRenderScale();
7878
- return scale > 1 ? strokeWidth / scale : strokeWidth;
7879
- } else return strokeWidth;
7956
+ if (strokeScaleFixed) {
7957
+ const {scaleX: scaleX} = this.__leaf.getRenderScaleData(true, strokeScaleFixed, false);
7958
+ if (scaleX !== 1) return strokeWidth * scaleX;
7959
+ }
7960
+ return strokeWidth;
7880
7961
  }
7881
7962
  __setPaint(attrName, value) {
7882
7963
  this.__setInput(attrName, value);
@@ -8014,13 +8095,16 @@ class TextData extends UIData {
8014
8095
  }
8015
8096
 
8016
8097
  class ImageData extends RectData {
8098
+ get __urlType() {
8099
+ return "image";
8100
+ }
8017
8101
  setUrl(value) {
8018
8102
  this.__setImageFill(value);
8019
8103
  this._url = value;
8020
8104
  }
8021
8105
  __setImageFill(value) {
8022
8106
  this.fill = value ? {
8023
- type: "image",
8107
+ type: this.__urlType,
8024
8108
  mode: "stretch",
8025
8109
  url: value
8026
8110
  } : undefined;
@@ -8059,7 +8143,7 @@ const UIBounds = {
8059
8143
  const data = this.__, {strokeAlign: strokeAlign, __maxStrokeWidth: strokeWidth} = data, box = this.__box;
8060
8144
  if ((data.stroke || data.hitStroke === "all") && strokeWidth && strokeAlign !== "inside") {
8061
8145
  boxSpread = spread = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
8062
- if (!data.__boxStroke) {
8146
+ if (!data.__boxStroke || data.__useArrow) {
8063
8147
  const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * spread;
8064
8148
  const storkeCapAddWidth = data.strokeCap === "none" ? 0 : strokeWidth;
8065
8149
  spread += Math.max(miterLimitAddWidth, storkeCapAddWidth);
@@ -8216,6 +8300,12 @@ let UI = UI_1 = class UI extends Leaf {
8216
8300
  get isFrame() {
8217
8301
  return false;
8218
8302
  }
8303
+ set strokeWidthFixed(value) {
8304
+ this.strokeScaleFixed = value;
8305
+ }
8306
+ get strokeWidthFixed() {
8307
+ return this.strokeScaleFixed;
8308
+ }
8219
8309
  set scale(value) {
8220
8310
  MathHelper.assignScale(this, value);
8221
8311
  }
@@ -8271,6 +8361,9 @@ let UI = UI_1 = class UI extends Leaf {
8271
8361
  getPathString(curve, pathForRender, floatLength) {
8272
8362
  return PathConvert.stringify(this.getPath(curve, pathForRender), floatLength);
8273
8363
  }
8364
+ asPath(curve, pathForRender) {
8365
+ this.path = this.getPath(curve, pathForRender);
8366
+ }
8274
8367
  load() {
8275
8368
  this.__.__computePaint();
8276
8369
  }
@@ -8280,16 +8373,18 @@ let UI = UI_1 = class UI extends Leaf {
8280
8373
  data.lazy && !this.__inLazyBounds && !Export.running ? data.__needComputePaint = true : data.__computePaint();
8281
8374
  }
8282
8375
  }
8283
- __updateRenderPath() {
8376
+ __updateRenderPath(updateCache) {
8284
8377
  const data = this.__;
8285
8378
  if (data.path) {
8286
8379
  data.__pathForRender = data.cornerRadius ? PathCorner.smooth(data.path, data.cornerRadius, data.cornerSmoothing) : data.path;
8287
- if (data.__useArrow) PathArrow.addArrows(this);
8380
+ if (data.__useArrow) PathArrow.addArrows(this, updateCache);
8288
8381
  } else data.__pathForRender && (data.__pathForRender = undefined);
8289
8382
  }
8290
8383
  __drawRenderPath(canvas) {
8384
+ const data = this.__;
8291
8385
  canvas.beginPath();
8292
- this.__drawPathByData(canvas, this.__.__pathForRender);
8386
+ if (data.__useArrow) PathArrow.updateArrow(this);
8387
+ this.__drawPathByData(canvas, data.__pathForRender);
8293
8388
  }
8294
8389
  __drawPath(canvas) {
8295
8390
  canvas.beginPath();
@@ -8338,6 +8433,7 @@ let UI = UI_1 = class UI extends Leaf {
8338
8433
  static setEditOuter(_toolName) {}
8339
8434
  static setEditInner(_editorName) {}
8340
8435
  destroy() {
8436
+ this.__.__willDestroy = true;
8341
8437
  this.fill = this.stroke = null;
8342
8438
  if (this.__animate) this.killAnimate();
8343
8439
  super.destroy();
@@ -8454,7 +8550,7 @@ __decorate([ strokeType("inside") ], UI.prototype, "strokeAlign", void 0);
8454
8550
 
8455
8551
  __decorate([ strokeType(1, true) ], UI.prototype, "strokeWidth", void 0);
8456
8552
 
8457
- __decorate([ strokeType(false) ], UI.prototype, "strokeWidthFixed", void 0);
8553
+ __decorate([ strokeType(false) ], UI.prototype, "strokeScaleFixed", void 0);
8458
8554
 
8459
8555
  __decorate([ strokeType("none") ], UI.prototype, "strokeCap", void 0);
8460
8556
 
@@ -8520,7 +8616,10 @@ let Group = class Group extends UI {
8520
8616
  }
8521
8617
  toJSON(options) {
8522
8618
  const data = super.toJSON(options);
8523
- if (!this.childlessJSON) data.children = this.children.map(child => child.toJSON(options));
8619
+ if (!this.childlessJSON) {
8620
+ const children = data.children = [];
8621
+ this.children.forEach(child => child.skipJSON || children.push(child.toJSON(options)));
8622
+ }
8524
8623
  return data;
8525
8624
  }
8526
8625
  pick(_hitPoint, _options) {
@@ -8669,12 +8768,12 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8669
8768
  this.emitLeafer(LeaferEvent.STOP);
8670
8769
  }
8671
8770
  }
8672
- unlockLayout() {
8771
+ unlockLayout(updateLayout = true) {
8673
8772
  this.layouter.start();
8674
- this.updateLayout();
8773
+ if (updateLayout) this.updateLayout();
8675
8774
  }
8676
- lockLayout() {
8677
- this.updateLayout();
8775
+ lockLayout(updateLayout = true) {
8776
+ if (updateLayout) this.updateLayout();
8678
8777
  this.layouter.stop();
8679
8778
  }
8680
8779
  resize(size) {
@@ -9083,9 +9182,9 @@ let Ellipse = class Ellipse extends UI {
9083
9182
  return "Ellipse";
9084
9183
  }
9085
9184
  __updatePath() {
9086
- const {width: width, height: height, innerRadius: innerRadius, startAngle: startAngle, endAngle: endAngle} = this.__;
9185
+ const data = this.__, {width: width, height: height, innerRadius: innerRadius, startAngle: startAngle, endAngle: endAngle} = data;
9087
9186
  const rx = width / 2, ry = height / 2;
9088
- const path = this.__.path = [];
9187
+ const path = data.path = [];
9089
9188
  let open;
9090
9189
  if (innerRadius) {
9091
9190
  if (startAngle || endAngle) {
@@ -9107,7 +9206,7 @@ let Ellipse = class Ellipse extends UI {
9107
9206
  }
9108
9207
  }
9109
9208
  if (!open) closePath$2(path);
9110
- if (Platform.ellipseToCurve) this.__.path = this.getPath(true);
9209
+ if (Platform.ellipseToCurve || data.__useArrow) data.path = this.getPath(true);
9111
9210
  }
9112
9211
  };
9113
9212
 
@@ -9582,8 +9681,8 @@ function fills(fills, ui, canvas, renderOptions) {
9582
9681
  canvas.save();
9583
9682
  if (item.transform) canvas.transform(item.transform);
9584
9683
  if (originPaint.scaleFixed) {
9585
- const {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true);
9586
- if (originPaint.scaleFixed === true || originPaint.scaleFixed === "zoom-in" && scaleX > 1 && scaleY > 1) canvas.scale(1 / scaleX, 1 / scaleY);
9684
+ const {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true, originPaint.scaleFixed, false);
9685
+ if (scaleX !== 1) canvas.scale(scaleX, scaleY);
9587
9686
  }
9588
9687
  if (originPaint.blendMode) canvas.blendMode = originPaint.blendMode;
9589
9688
  fillPathOrText(ui, canvas, renderOptions);
@@ -9857,11 +9956,14 @@ function compute(attrName, ui) {
9857
9956
  function getLeafPaint(attrName, paint, ui) {
9858
9957
  if (!isObject(paint) || paint.visible === false || paint.opacity === 0) return undefined;
9859
9958
  let leafPaint;
9860
- const {boxBounds: boxBounds} = ui.__layout;
9861
- switch (paint.type) {
9959
+ const {boxBounds: boxBounds} = ui.__layout, {type: type} = paint;
9960
+ switch (type) {
9862
9961
  case "image":
9962
+ case "film":
9963
+ case "video":
9863
9964
  if (!paint.url) return undefined;
9864
9965
  leafPaint = PaintImage.image(ui, attrName, paint, boxBounds, !recycleMap || !recycleMap[paint.url]);
9966
+ if (type !== "image") PaintImage[type](leafPaint);
9865
9967
  break;
9866
9968
 
9867
9969
  case "linear":
@@ -9877,7 +9979,7 @@ function getLeafPaint(attrName, paint, ui) {
9877
9979
  break;
9878
9980
 
9879
9981
  case "solid":
9880
- const {type: type, color: color, opacity: opacity} = paint;
9982
+ const {color: color, opacity: opacity} = paint;
9881
9983
  leafPaint = {
9882
9984
  type: type,
9883
9985
  style: ColorConvert.string(color, opacity)
@@ -9921,7 +10023,7 @@ const {isSame: isSame} = BoundsHelper;
9921
10023
 
9922
10024
  function image(ui, attrName, paint, boxBounds, firstUse) {
9923
10025
  let leafPaint, event;
9924
- const image = ImageManager.get(paint);
10026
+ const image = ImageManager.get(paint, paint.type);
9925
10027
  if (cache && paint === cache.paint && isSame(boxBounds, cache.boxBounds)) {
9926
10028
  leafPaint = cache.leafPaint;
9927
10029
  } else {
@@ -9982,8 +10084,8 @@ function image(ui, attrName, paint, boxBounds, firstUse) {
9982
10084
  }
9983
10085
 
9984
10086
  function checkSizeAndCreateData(ui, attrName, paint, image, leafPaint, boxBounds) {
9985
- if (attrName === "fill" && !ui.__.__naturalWidth) {
9986
- const data = ui.__;
10087
+ const data = ui.__;
10088
+ if (attrName === "fill" && !data.__naturalWidth) {
9987
10089
  data.__naturalWidth = image.width / data.pixelRatio;
9988
10090
  data.__naturalHeight = image.height / data.pixelRatio;
9989
10091
  if (data.__autoSide) {
@@ -9995,7 +10097,13 @@ function checkSizeAndCreateData(ui, attrName, paint, image, leafPaint, boxBounds
9995
10097
  return false;
9996
10098
  }
9997
10099
  }
9998
- if (!leafPaint.data) PaintImage.createData(leafPaint, image, paint, boxBounds);
10100
+ if (!leafPaint.data) {
10101
+ PaintImage.createData(leafPaint, image, paint, boxBounds);
10102
+ const {transform: transform} = leafPaint.data, {opacity: opacity, blendMode: blendMode} = paint;
10103
+ const clip = transform && !transform.onlyScale || data.path || data.cornerRadius;
10104
+ if (clip || opacity && opacity < 1 || blendMode) leafPaint.complex = clip ? 2 : true;
10105
+ }
10106
+ if (paint.filter) PaintImage.applyFilter(leafPaint, image, paint.filter, ui);
9999
10107
  return true;
10000
10108
  }
10001
10109
 
@@ -10038,7 +10146,7 @@ function getPatternData(paint, box, image) {
10038
10146
  if (paint.padding) box = tempBox.set(box).shrink(paint.padding);
10039
10147
  if (paint.mode === "strench") paint.mode = "stretch";
10040
10148
  const {width: width, height: height} = image;
10041
- 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;
10149
+ const {mode: mode, align: align, offset: offset, scale: scale, size: size, rotation: rotation, skew: skew, clipSize: clipSize, repeat: repeat, gap: gap, interlace: interlace} = paint;
10042
10150
  const sameBox = box.width === width && box.height === height;
10043
10151
  const data = {
10044
10152
  mode: mode
@@ -10101,8 +10209,6 @@ function getPatternData(paint, box, image) {
10101
10209
  data.scaleX = scaleX;
10102
10210
  data.scaleY = scaleY;
10103
10211
  }
10104
- if (opacity && opacity < 1) data.opacity = opacity;
10105
- if (filters) data.filters = filters;
10106
10212
  if (repeat) data.repeat = isString(repeat) ? repeat === "x" ? "repeat-x" : "repeat-y" : "repeat";
10107
10213
  if (interlace) data.interlace = isNumber(interlace) || interlace.type === "percent" ? {
10108
10214
  type: "x",
@@ -10133,7 +10239,7 @@ const {get: get$2, set: set, rotateOfOuter: rotateOfOuter$1, translate: translat
10133
10239
 
10134
10240
  function stretchMode(data, box, scaleX, scaleY) {
10135
10241
  const transform = get$2(), {x: x, y: y} = box;
10136
- if (x || y) translate(transform, x, y); else transform.onlyScale = true;
10242
+ if (x || y) translate(transform, x, y); else if (scaleX > 0 && scaleY > 0) transform.onlyScale = true;
10137
10243
  scaleHelper(transform, scaleX, scaleY);
10138
10244
  data.transform = transform;
10139
10245
  }
@@ -10222,10 +10328,10 @@ function createPatternTask(paint, ui, canvas, renderOptions) {
10222
10328
  }
10223
10329
 
10224
10330
  function createPattern(paint, ui, canvas, renderOptions) {
10225
- let {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions), id = scaleX + "-" + scaleY;
10331
+ let {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions), id = paint.film ? paint.nowIndex : scaleX + "-" + scaleY;
10226
10332
  if (paint.patternId !== id && !ui.destroyed) {
10227
10333
  if (!(Platform.image.isLarge(paint.image, scaleX, scaleY) && !paint.data.repeat)) {
10228
- const {image: image, data: data} = paint, {transform: transform, gap: gap} = data, fixScale = PaintImage.getPatternFixScale(paint, scaleX, scaleY);
10334
+ const {image: image, data: data} = paint, {opacity: opacity} = paint.originPaint, {transform: transform, gap: gap} = data, fixScale = PaintImage.getPatternFixScale(paint, scaleX, scaleY);
10229
10335
  let imageMatrix, xGap, yGap, {width: width, height: height} = image;
10230
10336
  if (fixScale) scaleX *= fixScale, scaleY *= fixScale;
10231
10337
  width *= scaleX;
@@ -10241,7 +10347,7 @@ function createPattern(paint, ui, canvas, renderOptions) {
10241
10347
  if (transform) copy$1(imageMatrix, transform);
10242
10348
  scale(imageMatrix, 1 / scaleX, 1 / scaleY);
10243
10349
  }
10244
- const imageCanvas = image.getCanvas(width, height, data.opacity, data.filters, xGap, yGap, ui.leafer && ui.leafer.config.smooth, data.interlace);
10350
+ const imageCanvas = image.getCanvas(width, height, opacity, undefined, xGap, yGap, ui.leafer && ui.leafer.config.smooth, data.interlace);
10245
10351
  const pattern = image.getPattern(imageCanvas, data.repeat || (Platform.origin.noRepeat || "no-repeat"), imageMatrix, paint);
10246
10352
  paint.style = pattern;
10247
10353
  paint.patternId = id;
@@ -10262,15 +10368,15 @@ function getPatternFixScale(paint, imageScaleX, imageScaleY) {
10262
10368
  }
10263
10369
 
10264
10370
  function checkImage(paint, drawImage, ui, canvas, renderOptions) {
10265
- const {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions);
10371
+ const {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions), id = paint.film ? paint.nowIndex : scaleX + "-" + scaleY;
10266
10372
  const {image: image, data: data, originPaint: originPaint} = paint, {exporting: exporting, snapshot: snapshot} = renderOptions;
10267
- if (!data || paint.patternId === scaleX + "-" + scaleY && !exporting || snapshot) {
10373
+ if (!data || paint.patternId === id && !exporting || snapshot) {
10268
10374
  return false;
10269
10375
  } else {
10270
10376
  if (drawImage) {
10271
10377
  if (data.repeat) {
10272
10378
  drawImage = false;
10273
- } else if (!(originPaint.changeful || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || exporting)) {
10379
+ } else if (!(originPaint.changeful || paint.film || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || exporting)) {
10274
10380
  drawImage = Platform.image.isLarge(image, scaleX, scaleY) || image.width * scaleX > 8096 || image.height * scaleY > 8096;
10275
10381
  }
10276
10382
  }
@@ -10288,20 +10394,21 @@ function checkImage(paint, drawImage, ui, canvas, renderOptions) {
10288
10394
  }
10289
10395
  }
10290
10396
 
10291
- function drawImage(paint, _imageScaleX, _imageScaleY, ui, canvas, _renderOptions) {
10292
- const {data: data, image: image} = paint, {blendMode: blendMode} = paint.originPaint, {opacity: opacity, transform: transform} = data, view = image.getFull(data.filters), u = ui.__;
10293
- let {width: width, height: height} = image, clipUI;
10294
- if ((clipUI = transform && !transform.onlyScale || u.path || u.cornerRadius) || opacity || blendMode) {
10397
+ function drawImage(paint, imageScaleX, imageScaleY, ui, canvas, _renderOptions) {
10398
+ const {data: data, image: image, complex: complex} = paint;
10399
+ let {width: width, height: height} = image;
10400
+ if (complex) {
10401
+ const {blendMode: blendMode, opacity: opacity} = paint.originPaint, {transform: transform} = data;
10295
10402
  canvas.save();
10296
- clipUI && canvas.clipUI(ui);
10403
+ complex === 2 && canvas.clipUI(ui);
10297
10404
  blendMode && (canvas.blendMode = blendMode);
10298
10405
  opacity && (canvas.opacity *= opacity);
10299
10406
  transform && canvas.transform(transform);
10300
- canvas.drawImage(view, 0, 0, width, height);
10407
+ image.render(canvas, 0, 0, width, height, ui, paint, imageScaleX, imageScaleY);
10301
10408
  canvas.restore();
10302
10409
  } else {
10303
10410
  if (data.scaleX) width *= data.scaleX, height *= data.scaleY;
10304
- canvas.drawImage(view, 0, 0, width, height);
10411
+ image.render(canvas, 0, 0, width, height, ui, paint, imageScaleX, imageScaleY);
10305
10412
  }
10306
10413
  }
10307
10414
 
@@ -10331,6 +10438,7 @@ function recycleImage(attrName, data) {
10331
10438
  if (!recycleMap) recycleMap = {};
10332
10439
  recycleMap[url] = true;
10333
10440
  ImageManager.recyclePaint(paint);
10441
+ if (data.__willDestroy && image.parent) PaintImage.recycleFilter(image, data.__leaf);
10334
10442
  if (image.loading) {
10335
10443
  if (!input) {
10336
10444
  input = data.__input && data.__input[attrName] || [];
@@ -11240,4 +11348,4 @@ Object.assign(Effect, EffectModule);
11240
11348
 
11241
11349
  useCanvas();
11242
11350
 
11243
- 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 };
11351
+ 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 };