leafer-ui 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$4, 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$2(t.x) === float$2(point.x) && float$2(t.y) === float$2(point.y);
913
+ isSame(t, point, quick) {
914
+ return quick ? t.x === point.x && t.y === point.y : float$2(t.x) === float$2(point.x) && float$2(t.y) === float$2(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$f.error("not register " + tag);
1966
+ if (!list$1[tag]) {
1967
+ debug$f.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$a = Debug.get("TaskProcessor");
@@ -4034,6 +4066,9 @@ const debug$9 = 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$1 = 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$1, relative.scrollWorldTransform);
4867
4931
  return temp ? matrix$1 : Object.assign({}, matrix$1);
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
  const debug$5 = Debug.get("LeaferCanvas");
6985
7057
 
@@ -7184,8 +7256,6 @@ canvasPatch(CanvasRenderingContext2D.prototype);
7184
7256
 
7185
7257
  canvasPatch(Path2D.prototype);
7186
7258
 
7187
- const {mineType: mineType, fileType: fileType} = FileHelper;
7188
-
7189
7259
  Object.assign(Creator, {
7190
7260
  canvas: (options, manager) => new LeaferCanvas(options, manager),
7191
7261
  image: options => new LeaferImage(options)
@@ -7200,29 +7270,27 @@ function useCanvas(_canvasType, _power) {
7200
7270
  return canvas;
7201
7271
  },
7202
7272
  canvasToDataURL: (canvas, type, quality) => {
7203
- const imageType = mineType(type), url = canvas.toDataURL(imageType, quality);
7273
+ const imageType = FileHelper.mimeType(type), url = canvas.toDataURL(imageType, quality);
7204
7274
  return imageType === "image/bmp" ? url.replace("image/png;", "image/bmp;") : url;
7205
7275
  },
7206
- canvasToBolb: (canvas, type, quality) => new Promise(resolve => canvas.toBlob(resolve, mineType(type), quality)),
7276
+ canvasToBolb: (canvas, type, quality) => new Promise(resolve => canvas.toBlob(resolve, FileHelper.mimeType(type), quality)),
7207
7277
  canvasSaveAs: (canvas, filename, quality) => {
7208
- const url = canvas.toDataURL(mineType(fileType(filename)), quality);
7278
+ const url = canvas.toDataURL(FileHelper.mimeType(FileHelper.fileType(filename)), quality);
7209
7279
  return Platform.origin.download(url, filename);
7210
7280
  },
7211
7281
  download(url, filename) {
7212
- return new Promise(resolve => {
7282
+ return __awaiter(this, void 0, void 0, function*() {
7213
7283
  let el = document.createElement("a");
7214
7284
  el.href = url;
7215
7285
  el.download = filename;
7216
7286
  document.body.appendChild(el);
7217
7287
  el.click();
7218
7288
  document.body.removeChild(el);
7219
- resolve();
7220
7289
  });
7221
7290
  },
7222
- loadImage(src) {
7291
+ loadImage(src, crossOrigin, _leaferImage) {
7223
7292
  return new Promise((resolve, reject) => {
7224
7293
  const img = new Platform.origin.Image;
7225
- const {crossOrigin: crossOrigin} = Platform.image;
7226
7294
  if (crossOrigin) {
7227
7295
  img.setAttribute("crossOrigin", crossOrigin);
7228
7296
  img.crossOrigin = crossOrigin;
@@ -7236,6 +7304,13 @@ function useCanvas(_canvasType, _power) {
7236
7304
  img.src = Platform.image.getRealURL(src);
7237
7305
  });
7238
7306
  },
7307
+ loadContent(url_1) {
7308
+ return __awaiter(this, arguments, void 0, function*(url, responseType = "text") {
7309
+ const response = yield fetch(url);
7310
+ if (!response.ok) throw new Error(`${response.status}`);
7311
+ return yield response[responseType]();
7312
+ });
7313
+ },
7239
7314
  Image: Image,
7240
7315
  PointerEvent: PointerEvent,
7241
7316
  DragEvent: DragEvent
@@ -7747,7 +7822,7 @@ class Renderer {
7747
7822
  getCellList() {
7748
7823
  return undefined;
7749
7824
  }
7750
- addBlock(block) {
7825
+ addBlock(block, _leafList) {
7751
7826
  if (!this.updateBlocks) this.updateBlocks = [];
7752
7827
  this.updateBlocks.push(block);
7753
7828
  }
@@ -7795,7 +7870,8 @@ class Renderer {
7795
7870
  __onLayoutEnd(event) {
7796
7871
  if (event.data) event.data.map(item => {
7797
7872
  let empty;
7798
- if (item.updatedList) item.updatedList.list.some(leaf => {
7873
+ const {updatedList: updatedList} = item;
7874
+ if (updatedList) updatedList.list.some(leaf => {
7799
7875
  empty = !leaf.__world.width || !leaf.__world.height;
7800
7876
  if (empty) {
7801
7877
  if (!leaf.isLeafer) debug$3.tip(leaf.innerName, ": empty");
@@ -7803,7 +7879,7 @@ class Renderer {
7803
7879
  }
7804
7880
  return empty;
7805
7881
  });
7806
- this.addBlock(empty ? this.canvas.bounds : item.updatedBounds);
7882
+ this.addBlock(empty ? this.canvas.bounds : item.updatedBounds, updatedList);
7807
7883
  });
7808
7884
  }
7809
7885
  emitRender(type, bounds, options) {
@@ -8009,7 +8085,7 @@ class Selector {
8009
8085
  this.config = {};
8010
8086
  if (userConfig) this.config = DataHelper.default(userConfig, this.config);
8011
8087
  this.picker = new Picker(this.target = target, this);
8012
- this.finder = Creator.finder && Creator.finder();
8088
+ this.finder = Creator.finder && Creator.finder(target, this.config);
8013
8089
  }
8014
8090
  getByPoint(hitPoint, hitRadius, options) {
8015
8091
  const {target: target, picker: picker} = this;
@@ -8051,7 +8127,9 @@ function effectType(defaultValue) {
8051
8127
  set(value) {
8052
8128
  this.__setAttr(key, value);
8053
8129
  if (value) this.__.__useEffect = true;
8054
- this.__layout.renderChanged || this.__layout.renderChange();
8130
+ const layout = this.__layout;
8131
+ layout.renderChanged || layout.renderChange();
8132
+ layout.surfaceChange();
8055
8133
  }
8056
8134
  }));
8057
8135
  }
@@ -8265,15 +8343,16 @@ class UIData extends LeafData {
8265
8343
  this.__needComputePaint = undefined;
8266
8344
  }
8267
8345
  __getRealStrokeWidth(childStyle) {
8268
- let {strokeWidth: strokeWidth, strokeWidthFixed: strokeWidthFixed} = this;
8346
+ let {strokeWidth: strokeWidth, strokeScaleFixed: strokeScaleFixed} = this;
8269
8347
  if (childStyle) {
8270
8348
  if (childStyle.strokeWidth) strokeWidth = childStyle.strokeWidth;
8271
- if (!isUndefined(childStyle.strokeWidthFixed)) strokeWidthFixed = childStyle.strokeWidthFixed;
8349
+ if (!isUndefined(childStyle.strokeScaleFixed)) strokeScaleFixed = childStyle.strokeScaleFixed;
8350
+ }
8351
+ if (strokeScaleFixed) {
8352
+ const {scaleX: scaleX} = this.__leaf.getRenderScaleData(true, strokeScaleFixed, false);
8353
+ if (scaleX !== 1) return strokeWidth * scaleX;
8272
8354
  }
8273
- if (strokeWidthFixed) {
8274
- const scale = this.__leaf.getClampRenderScale();
8275
- return scale > 1 ? strokeWidth / scale : strokeWidth;
8276
- } else return strokeWidth;
8355
+ return strokeWidth;
8277
8356
  }
8278
8357
  __setPaint(attrName, value) {
8279
8358
  this.__setInput(attrName, value);
@@ -8411,13 +8490,16 @@ class TextData extends UIData {
8411
8490
  }
8412
8491
 
8413
8492
  class ImageData extends RectData {
8493
+ get __urlType() {
8494
+ return "image";
8495
+ }
8414
8496
  setUrl(value) {
8415
8497
  this.__setImageFill(value);
8416
8498
  this._url = value;
8417
8499
  }
8418
8500
  __setImageFill(value) {
8419
8501
  this.fill = value ? {
8420
- type: "image",
8502
+ type: this.__urlType,
8421
8503
  mode: "stretch",
8422
8504
  url: value
8423
8505
  } : undefined;
@@ -8456,7 +8538,7 @@ const UIBounds = {
8456
8538
  const data = this.__, {strokeAlign: strokeAlign, __maxStrokeWidth: strokeWidth} = data, box = this.__box;
8457
8539
  if ((data.stroke || data.hitStroke === "all") && strokeWidth && strokeAlign !== "inside") {
8458
8540
  boxSpread = spread = strokeAlign === "center" ? strokeWidth / 2 : strokeWidth;
8459
- if (!data.__boxStroke) {
8541
+ if (!data.__boxStroke || data.__useArrow) {
8460
8542
  const miterLimitAddWidth = data.__isLinePath ? 0 : 10 * spread;
8461
8543
  const storkeCapAddWidth = data.strokeCap === "none" ? 0 : strokeWidth;
8462
8544
  spread += Math.max(miterLimitAddWidth, storkeCapAddWidth);
@@ -8613,6 +8695,12 @@ let UI = UI_1 = class UI extends Leaf {
8613
8695
  get isFrame() {
8614
8696
  return false;
8615
8697
  }
8698
+ set strokeWidthFixed(value) {
8699
+ this.strokeScaleFixed = value;
8700
+ }
8701
+ get strokeWidthFixed() {
8702
+ return this.strokeScaleFixed;
8703
+ }
8616
8704
  set scale(value) {
8617
8705
  MathHelper.assignScale(this, value);
8618
8706
  }
@@ -8668,6 +8756,9 @@ let UI = UI_1 = class UI extends Leaf {
8668
8756
  getPathString(curve, pathForRender, floatLength) {
8669
8757
  return PathConvert.stringify(this.getPath(curve, pathForRender), floatLength);
8670
8758
  }
8759
+ asPath(curve, pathForRender) {
8760
+ this.path = this.getPath(curve, pathForRender);
8761
+ }
8671
8762
  load() {
8672
8763
  this.__.__computePaint();
8673
8764
  }
@@ -8677,16 +8768,18 @@ let UI = UI_1 = class UI extends Leaf {
8677
8768
  data.lazy && !this.__inLazyBounds && !Export.running ? data.__needComputePaint = true : data.__computePaint();
8678
8769
  }
8679
8770
  }
8680
- __updateRenderPath() {
8771
+ __updateRenderPath(updateCache) {
8681
8772
  const data = this.__;
8682
8773
  if (data.path) {
8683
8774
  data.__pathForRender = data.cornerRadius ? PathCorner.smooth(data.path, data.cornerRadius, data.cornerSmoothing) : data.path;
8684
- if (data.__useArrow) PathArrow.addArrows(this);
8775
+ if (data.__useArrow) PathArrow.addArrows(this, updateCache);
8685
8776
  } else data.__pathForRender && (data.__pathForRender = undefined);
8686
8777
  }
8687
8778
  __drawRenderPath(canvas) {
8779
+ const data = this.__;
8688
8780
  canvas.beginPath();
8689
- this.__drawPathByData(canvas, this.__.__pathForRender);
8781
+ if (data.__useArrow) PathArrow.updateArrow(this);
8782
+ this.__drawPathByData(canvas, data.__pathForRender);
8690
8783
  }
8691
8784
  __drawPath(canvas) {
8692
8785
  canvas.beginPath();
@@ -8735,6 +8828,7 @@ let UI = UI_1 = class UI extends Leaf {
8735
8828
  static setEditOuter(_toolName) {}
8736
8829
  static setEditInner(_editorName) {}
8737
8830
  destroy() {
8831
+ this.__.__willDestroy = true;
8738
8832
  this.fill = this.stroke = null;
8739
8833
  if (this.__animate) this.killAnimate();
8740
8834
  super.destroy();
@@ -8851,7 +8945,7 @@ __decorate([ strokeType("inside") ], UI.prototype, "strokeAlign", void 0);
8851
8945
 
8852
8946
  __decorate([ strokeType(1, true) ], UI.prototype, "strokeWidth", void 0);
8853
8947
 
8854
- __decorate([ strokeType(false) ], UI.prototype, "strokeWidthFixed", void 0);
8948
+ __decorate([ strokeType(false) ], UI.prototype, "strokeScaleFixed", void 0);
8855
8949
 
8856
8950
  __decorate([ strokeType("none") ], UI.prototype, "strokeCap", void 0);
8857
8951
 
@@ -8917,7 +9011,10 @@ let Group = class Group extends UI {
8917
9011
  }
8918
9012
  toJSON(options) {
8919
9013
  const data = super.toJSON(options);
8920
- if (!this.childlessJSON) data.children = this.children.map(child => child.toJSON(options));
9014
+ if (!this.childlessJSON) {
9015
+ const children = data.children = [];
9016
+ this.children.forEach(child => child.skipJSON || children.push(child.toJSON(options)));
9017
+ }
8921
9018
  return data;
8922
9019
  }
8923
9020
  pick(_hitPoint, _options) {
@@ -9066,12 +9163,12 @@ let Leafer = Leafer_1 = class Leafer extends Group {
9066
9163
  this.emitLeafer(LeaferEvent.STOP);
9067
9164
  }
9068
9165
  }
9069
- unlockLayout() {
9166
+ unlockLayout(updateLayout = true) {
9070
9167
  this.layouter.start();
9071
- this.updateLayout();
9168
+ if (updateLayout) this.updateLayout();
9072
9169
  }
9073
- lockLayout() {
9074
- this.updateLayout();
9170
+ lockLayout(updateLayout = true) {
9171
+ if (updateLayout) this.updateLayout();
9075
9172
  this.layouter.stop();
9076
9173
  }
9077
9174
  resize(size) {
@@ -9480,9 +9577,9 @@ let Ellipse = class Ellipse extends UI {
9480
9577
  return "Ellipse";
9481
9578
  }
9482
9579
  __updatePath() {
9483
- const {width: width, height: height, innerRadius: innerRadius, startAngle: startAngle, endAngle: endAngle} = this.__;
9580
+ const data = this.__, {width: width, height: height, innerRadius: innerRadius, startAngle: startAngle, endAngle: endAngle} = data;
9484
9581
  const rx = width / 2, ry = height / 2;
9485
- const path = this.__.path = [];
9582
+ const path = data.path = [];
9486
9583
  let open;
9487
9584
  if (innerRadius) {
9488
9585
  if (startAngle || endAngle) {
@@ -9504,7 +9601,7 @@ let Ellipse = class Ellipse extends UI {
9504
9601
  }
9505
9602
  }
9506
9603
  if (!open) closePath$2(path);
9507
- if (Platform.ellipseToCurve) this.__.path = this.getPath(true);
9604
+ if (Platform.ellipseToCurve || data.__useArrow) data.path = this.getPath(true);
9508
9605
  }
9509
9606
  };
9510
9607
 
@@ -10044,7 +10141,7 @@ let App = class App extends Leafer {
10044
10141
  if (this.viewReady) this.renderer.update();
10045
10142
  }
10046
10143
  __render(canvas, options) {
10047
- if (canvas.context) this.forEach(leafer => options.matrix ? leafer.__render(canvas, options) : canvas.copyWorld(leafer.canvas, options.bounds));
10144
+ if (canvas.context) this.forEach(leafer => options.matrix ? leafer.__render(canvas, options) : canvas.copyWorld(leafer.canvas, options.bounds, undefined, undefined, true));
10048
10145
  }
10049
10146
  __onResize(event) {
10050
10147
  this.forEach(leafer => leafer.resize(event));
@@ -10864,6 +10961,7 @@ class InteractionBase {
10864
10961
  this.checkPath(data, useDefaultPath);
10865
10962
  this.downTime = Date.now();
10866
10963
  this.emit(PointerEvent$1.BEFORE_DOWN, data);
10964
+ if (data.path.needUpdate) this.updateDownData(data);
10867
10965
  this.emit(PointerEvent$1.DOWN, data);
10868
10966
  if (PointerButton.left(data)) {
10869
10967
  this.tapWait();
@@ -11814,8 +11912,8 @@ function fills(fills, ui, canvas, renderOptions) {
11814
11912
  canvas.save();
11815
11913
  if (item.transform) canvas.transform(item.transform);
11816
11914
  if (originPaint.scaleFixed) {
11817
- const {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true);
11818
- if (originPaint.scaleFixed === true || originPaint.scaleFixed === "zoom-in" && scaleX > 1 && scaleY > 1) canvas.scale(1 / scaleX, 1 / scaleY);
11915
+ const {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true, originPaint.scaleFixed, false);
11916
+ if (scaleX !== 1) canvas.scale(scaleX, scaleY);
11819
11917
  }
11820
11918
  if (originPaint.blendMode) canvas.blendMode = originPaint.blendMode;
11821
11919
  fillPathOrText(ui, canvas, renderOptions);
@@ -12089,11 +12187,14 @@ function compute(attrName, ui) {
12089
12187
  function getLeafPaint(attrName, paint, ui) {
12090
12188
  if (!isObject(paint) || paint.visible === false || paint.opacity === 0) return undefined;
12091
12189
  let leafPaint;
12092
- const {boxBounds: boxBounds} = ui.__layout;
12093
- switch (paint.type) {
12190
+ const {boxBounds: boxBounds} = ui.__layout, {type: type} = paint;
12191
+ switch (type) {
12094
12192
  case "image":
12193
+ case "film":
12194
+ case "video":
12095
12195
  if (!paint.url) return undefined;
12096
12196
  leafPaint = PaintImage.image(ui, attrName, paint, boxBounds, !recycleMap || !recycleMap[paint.url]);
12197
+ if (type !== "image") PaintImage[type](leafPaint);
12097
12198
  break;
12098
12199
 
12099
12200
  case "linear":
@@ -12109,7 +12210,7 @@ function getLeafPaint(attrName, paint, ui) {
12109
12210
  break;
12110
12211
 
12111
12212
  case "solid":
12112
- const {type: type, color: color, opacity: opacity} = paint;
12213
+ const {color: color, opacity: opacity} = paint;
12113
12214
  leafPaint = {
12114
12215
  type: type,
12115
12216
  style: ColorConvert.string(color, opacity)
@@ -12153,7 +12254,7 @@ const {isSame: isSame} = BoundsHelper;
12153
12254
 
12154
12255
  function image(ui, attrName, paint, boxBounds, firstUse) {
12155
12256
  let leafPaint, event;
12156
- const image = ImageManager.get(paint);
12257
+ const image = ImageManager.get(paint, paint.type);
12157
12258
  if (cache && paint === cache.paint && isSame(boxBounds, cache.boxBounds)) {
12158
12259
  leafPaint = cache.leafPaint;
12159
12260
  } else {
@@ -12214,8 +12315,8 @@ function image(ui, attrName, paint, boxBounds, firstUse) {
12214
12315
  }
12215
12316
 
12216
12317
  function checkSizeAndCreateData(ui, attrName, paint, image, leafPaint, boxBounds) {
12217
- if (attrName === "fill" && !ui.__.__naturalWidth) {
12218
- const data = ui.__;
12318
+ const data = ui.__;
12319
+ if (attrName === "fill" && !data.__naturalWidth) {
12219
12320
  data.__naturalWidth = image.width / data.pixelRatio;
12220
12321
  data.__naturalHeight = image.height / data.pixelRatio;
12221
12322
  if (data.__autoSide) {
@@ -12227,7 +12328,13 @@ function checkSizeAndCreateData(ui, attrName, paint, image, leafPaint, boxBounds
12227
12328
  return false;
12228
12329
  }
12229
12330
  }
12230
- if (!leafPaint.data) PaintImage.createData(leafPaint, image, paint, boxBounds);
12331
+ if (!leafPaint.data) {
12332
+ PaintImage.createData(leafPaint, image, paint, boxBounds);
12333
+ const {transform: transform} = leafPaint.data, {opacity: opacity, blendMode: blendMode} = paint;
12334
+ const clip = transform && !transform.onlyScale || data.path || data.cornerRadius;
12335
+ if (clip || opacity && opacity < 1 || blendMode) leafPaint.complex = clip ? 2 : true;
12336
+ }
12337
+ if (paint.filter) PaintImage.applyFilter(leafPaint, image, paint.filter, ui);
12231
12338
  return true;
12232
12339
  }
12233
12340
 
@@ -12270,7 +12377,7 @@ function getPatternData(paint, box, image) {
12270
12377
  if (paint.padding) box = tempBox.set(box).shrink(paint.padding);
12271
12378
  if (paint.mode === "strench") paint.mode = "stretch";
12272
12379
  const {width: width, height: height} = image;
12273
- 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;
12380
+ const {mode: mode, align: align, offset: offset, scale: scale, size: size, rotation: rotation, skew: skew, clipSize: clipSize, repeat: repeat, gap: gap, interlace: interlace} = paint;
12274
12381
  const sameBox = box.width === width && box.height === height;
12275
12382
  const data = {
12276
12383
  mode: mode
@@ -12333,8 +12440,6 @@ function getPatternData(paint, box, image) {
12333
12440
  data.scaleX = scaleX;
12334
12441
  data.scaleY = scaleY;
12335
12442
  }
12336
- if (opacity && opacity < 1) data.opacity = opacity;
12337
- if (filters) data.filters = filters;
12338
12443
  if (repeat) data.repeat = isString(repeat) ? repeat === "x" ? "repeat-x" : "repeat-y" : "repeat";
12339
12444
  if (interlace) data.interlace = isNumber(interlace) || interlace.type === "percent" ? {
12340
12445
  type: "x",
@@ -12365,7 +12470,7 @@ const {get: get$2, set: set, rotateOfOuter: rotateOfOuter$1, translate: translat
12365
12470
 
12366
12471
  function stretchMode(data, box, scaleX, scaleY) {
12367
12472
  const transform = get$2(), {x: x, y: y} = box;
12368
- if (x || y) translate(transform, x, y); else transform.onlyScale = true;
12473
+ if (x || y) translate(transform, x, y); else if (scaleX > 0 && scaleY > 0) transform.onlyScale = true;
12369
12474
  scaleHelper(transform, scaleX, scaleY);
12370
12475
  data.transform = transform;
12371
12476
  }
@@ -12454,10 +12559,10 @@ function createPatternTask(paint, ui, canvas, renderOptions) {
12454
12559
  }
12455
12560
 
12456
12561
  function createPattern(paint, ui, canvas, renderOptions) {
12457
- let {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions), id = scaleX + "-" + scaleY;
12562
+ let {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions), id = paint.film ? paint.nowIndex : scaleX + "-" + scaleY;
12458
12563
  if (paint.patternId !== id && !ui.destroyed) {
12459
12564
  if (!(Platform.image.isLarge(paint.image, scaleX, scaleY) && !paint.data.repeat)) {
12460
- const {image: image, data: data} = paint, {transform: transform, gap: gap} = data, fixScale = PaintImage.getPatternFixScale(paint, scaleX, scaleY);
12565
+ const {image: image, data: data} = paint, {opacity: opacity} = paint.originPaint, {transform: transform, gap: gap} = data, fixScale = PaintImage.getPatternFixScale(paint, scaleX, scaleY);
12461
12566
  let imageMatrix, xGap, yGap, {width: width, height: height} = image;
12462
12567
  if (fixScale) scaleX *= fixScale, scaleY *= fixScale;
12463
12568
  width *= scaleX;
@@ -12473,7 +12578,7 @@ function createPattern(paint, ui, canvas, renderOptions) {
12473
12578
  if (transform) copy$1(imageMatrix, transform);
12474
12579
  scale(imageMatrix, 1 / scaleX, 1 / scaleY);
12475
12580
  }
12476
- const imageCanvas = image.getCanvas(width, height, data.opacity, data.filters, xGap, yGap, ui.leafer && ui.leafer.config.smooth, data.interlace);
12581
+ const imageCanvas = image.getCanvas(width, height, opacity, undefined, xGap, yGap, ui.leafer && ui.leafer.config.smooth, data.interlace);
12477
12582
  const pattern = image.getPattern(imageCanvas, data.repeat || (Platform.origin.noRepeat || "no-repeat"), imageMatrix, paint);
12478
12583
  paint.style = pattern;
12479
12584
  paint.patternId = id;
@@ -12494,15 +12599,15 @@ function getPatternFixScale(paint, imageScaleX, imageScaleY) {
12494
12599
  }
12495
12600
 
12496
12601
  function checkImage(paint, drawImage, ui, canvas, renderOptions) {
12497
- const {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions);
12602
+ const {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions), id = paint.film ? paint.nowIndex : scaleX + "-" + scaleY;
12498
12603
  const {image: image, data: data, originPaint: originPaint} = paint, {exporting: exporting, snapshot: snapshot} = renderOptions;
12499
- if (!data || paint.patternId === scaleX + "-" + scaleY && !exporting || snapshot) {
12604
+ if (!data || paint.patternId === id && !exporting || snapshot) {
12500
12605
  return false;
12501
12606
  } else {
12502
12607
  if (drawImage) {
12503
12608
  if (data.repeat) {
12504
12609
  drawImage = false;
12505
- } else if (!(originPaint.changeful || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || exporting)) {
12610
+ } else if (!(originPaint.changeful || paint.film || Platform.name === "miniapp" && ResizeEvent.isResizing(ui) || exporting)) {
12506
12611
  drawImage = Platform.image.isLarge(image, scaleX, scaleY) || image.width * scaleX > 8096 || image.height * scaleY > 8096;
12507
12612
  }
12508
12613
  }
@@ -12520,20 +12625,21 @@ function checkImage(paint, drawImage, ui, canvas, renderOptions) {
12520
12625
  }
12521
12626
  }
12522
12627
 
12523
- function drawImage(paint, _imageScaleX, _imageScaleY, ui, canvas, _renderOptions) {
12524
- const {data: data, image: image} = paint, {blendMode: blendMode} = paint.originPaint, {opacity: opacity, transform: transform} = data, view = image.getFull(data.filters), u = ui.__;
12525
- let {width: width, height: height} = image, clipUI;
12526
- if ((clipUI = transform && !transform.onlyScale || u.path || u.cornerRadius) || opacity || blendMode) {
12628
+ function drawImage(paint, imageScaleX, imageScaleY, ui, canvas, _renderOptions) {
12629
+ const {data: data, image: image, complex: complex} = paint;
12630
+ let {width: width, height: height} = image;
12631
+ if (complex) {
12632
+ const {blendMode: blendMode, opacity: opacity} = paint.originPaint, {transform: transform} = data;
12527
12633
  canvas.save();
12528
- clipUI && canvas.clipUI(ui);
12634
+ complex === 2 && canvas.clipUI(ui);
12529
12635
  blendMode && (canvas.blendMode = blendMode);
12530
12636
  opacity && (canvas.opacity *= opacity);
12531
12637
  transform && canvas.transform(transform);
12532
- canvas.drawImage(view, 0, 0, width, height);
12638
+ image.render(canvas, 0, 0, width, height, ui, paint, imageScaleX, imageScaleY);
12533
12639
  canvas.restore();
12534
12640
  } else {
12535
12641
  if (data.scaleX) width *= data.scaleX, height *= data.scaleY;
12536
- canvas.drawImage(view, 0, 0, width, height);
12642
+ image.render(canvas, 0, 0, width, height, ui, paint, imageScaleX, imageScaleY);
12537
12643
  }
12538
12644
  }
12539
12645
 
@@ -12563,6 +12669,7 @@ function recycleImage(attrName, data) {
12563
12669
  if (!recycleMap) recycleMap = {};
12564
12670
  recycleMap[url] = true;
12565
12671
  ImageManager.recyclePaint(paint);
12672
+ if (data.__willDestroy && image.parent) PaintImage.recycleFilter(image, data.__leaf);
12566
12673
  if (image.loading) {
12567
12674
  if (!input) {
12568
12675
  input = data.__input && data.__input[attrName] || [];
@@ -13478,4 +13585,4 @@ Object.assign(Creator, {
13478
13585
 
13479
13586
  useCanvas();
13480
13587
 
13481
- export { AlignHelper, Answer, App, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragBoundsHelper, DragEvent$1 as DragEvent, Dragger, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, FourNumberHelper, Frame, FrameData, Group, GroupData, HitCanvasManager, Image$1 as Image, ImageData, ImageEvent, ImageManager, IncrementId, Interaction, InteractionBase, InteractionHelper, KeyEvent, Keyboard, 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, MoveEvent, MyDragEvent, MyImage, MyPointerEvent, MyTouchEvent, 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, Picker, Platform, Plugin, Point, PointHelper, PointerButton, PointerEvent$1 as PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, RotateEvent, Run, Selector, Star, StarData, State, StringNumberMap, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, TouchEvent, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, UnitConvertHelper, WaitHelper, WatchEvent, Watcher, ZoomEvent, 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$3 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };
13588
+ export { AlignHelper, Answer, App, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragBoundsHelper, DragEvent$1 as DragEvent, Dragger, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, FourNumberHelper, Frame, FrameData, Group, GroupData, HitCanvasManager, Image$1 as Image, ImageData, ImageEvent, ImageManager, IncrementId, Interaction, InteractionBase, InteractionHelper, KeyEvent, Keyboard, 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, MoveEvent, MyDragEvent, MyImage, MyPointerEvent, MyTouchEvent, 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, Picker, Platform, Plugin, Point, PointHelper, PointerButton, PointerEvent$1 as PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, RotateEvent, Run, Selector, Star, StarData, State, StringNumberMap, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, TouchEvent, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, UnitConvertHelper, WaitHelper, WatchEvent, Watcher, ZoomEvent, 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$3 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };