@leafer/miniapp 1.12.3 → 2.0.0

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.
@@ -216,57 +216,6 @@ class LeafData {
216
216
  }
217
217
  }
218
218
 
219
- const {floor: floor$3, max: max$7} = Math;
220
-
221
- const Platform = {
222
- toURL(text, fileType) {
223
- let url = encodeURIComponent(text);
224
- if (fileType === "text") url = "data:text/plain;charset=utf-8," + url; else if (fileType === "svg") url = "data:image/svg+xml," + url;
225
- return url;
226
- },
227
- image: {
228
- hitCanvasSize: 100,
229
- maxCacheSize: 2560 * 1600,
230
- maxPatternSize: 4096 * 2160,
231
- crossOrigin: "anonymous",
232
- isLarge(size, scaleX, scaleY, largeSize) {
233
- return size.width * size.height * (scaleX ? scaleX * scaleY : 1) > (largeSize || image$1.maxCacheSize);
234
- },
235
- isSuperLarge(size, scaleX, scaleY) {
236
- return image$1.isLarge(size, scaleX, scaleY, image$1.maxPatternSize);
237
- },
238
- getRealURL(url) {
239
- const {prefix: prefix, suffix: suffix} = Platform.image;
240
- if (suffix && !url.startsWith("data:") && !url.startsWith("blob:")) url += (url.includes("?") ? "&" : "?") + suffix;
241
- if (prefix && url[0] === "/") url = prefix + url;
242
- return url;
243
- },
244
- resize(image, width, height, xGap, yGap, clip, smooth, opacity, _filters) {
245
- const canvas = Platform.origin.createCanvas(max$7(floor$3(width + (xGap || 0)), 1), max$7(floor$3(height + (yGap || 0)), 1));
246
- const ctx = canvas.getContext("2d");
247
- if (opacity) ctx.globalAlpha = opacity;
248
- ctx.imageSmoothingEnabled = smooth === false ? false : true;
249
- if (clip) {
250
- const scaleX = width / clip.width, scaleY = height / clip.height;
251
- ctx.setTransform(scaleX, 0, 0, scaleY, -clip.x * scaleX, -clip.y * scaleY);
252
- ctx.drawImage(image, 0, 0, image.width, image.height);
253
- } else ctx.drawImage(image, 0, 0, width, height);
254
- return canvas;
255
- },
256
- setPatternTransform(pattern, transform, paint) {
257
- try {
258
- if (transform && pattern.setTransform) {
259
- pattern.setTransform(transform);
260
- transform = undefined;
261
- }
262
- } catch (_a) {}
263
- if (paint) DataHelper.stintSet(paint, "transform", transform);
264
- }
265
- }
266
- };
267
-
268
- const {image: image$1} = Platform;
269
-
270
219
  const IncrementId = {
271
220
  RUNTIME: "runtime",
272
221
  LEAF: "leaf",
@@ -289,7 +238,7 @@ const I$2 = IncrementId;
289
238
 
290
239
  let tempA, tempB, tempTo;
291
240
 
292
- const {max: max$6} = Math, tempFour = [ 0, 0, 0, 0 ];
241
+ const {max: max$7} = Math, tempFour = [ 0, 0, 0, 0 ];
293
242
 
294
243
  const FourNumberHelper = {
295
244
  zero: [ ...tempFour ],
@@ -341,9 +290,9 @@ const FourNumberHelper = {
341
290
  return data;
342
291
  },
343
292
  max(t, other, change) {
344
- if (isNumber(t) && isNumber(other)) return max$6(t, other);
293
+ if (isNumber(t) && isNumber(other)) return max$7(t, other);
345
294
  toTempAB(t, other, change);
346
- return set$2(tempTo, max$6(tempA[0], tempB[0]), max$6(tempA[1], tempB[1]), max$6(tempA[2], tempB[2]), max$6(tempA[3], tempB[3]));
295
+ return set$2(tempTo, max$7(tempA[0], tempB[0]), max$7(tempA[1], tempB[1]), max$7(tempA[2], tempB[2]), max$7(tempA[3], tempB[3]));
347
296
  },
348
297
  add(t, other, change) {
349
298
  if (isNumber(t) && isNumber(other)) return t + other;
@@ -360,7 +309,7 @@ const FourNumberHelper = {
360
309
 
361
310
  const {set: set$2, get: get$5, setTemp: setTemp, toTempAB: toTempAB} = FourNumberHelper;
362
311
 
363
- const {round: round$6, pow: pow$2, max: max$5, floor: floor$2, PI: PI$4} = Math;
312
+ const {round: round$6, pow: pow$2, max: max$6, floor: floor$3, PI: PI$4} = Math;
364
313
 
365
314
  const MathHelper = {
366
315
  within(value, min, max) {
@@ -414,7 +363,7 @@ const MathHelper = {
414
363
  }
415
364
  },
416
365
  getFloorScale(num, min = 1) {
417
- return max$5(floor$2(num), min) / num;
366
+ return max$6(floor$3(num), min) / num;
418
367
  },
419
368
  randInt: randInt,
420
369
  randColor(opacity) {
@@ -1259,7 +1208,7 @@ const {toOuterPoint: toOuterPoint$2} = MatrixHelper;
1259
1208
 
1260
1209
  const {float: float$3, fourNumber: fourNumber$1} = MathHelper;
1261
1210
 
1262
- const {floor: floor$1, ceil: ceil$2} = Math;
1211
+ const {floor: floor$2, ceil: ceil$2} = Math;
1263
1212
 
1264
1213
  let right$4, bottom$3, boundsRight, boundsBottom;
1265
1214
 
@@ -1416,8 +1365,8 @@ const BoundsHelper = {
1416
1365
  },
1417
1366
  ceil(t) {
1418
1367
  const {x: x, y: y} = t;
1419
- t.x = floor$1(t.x);
1420
- t.y = floor$1(t.y);
1368
+ t.x = floor$2(t.x);
1369
+ t.y = floor$2(t.y);
1421
1370
  t.width = x > t.x ? ceil$2(t.width + x - t.x) : ceil$2(t.width);
1422
1371
  t.height = y > t.y ? ceil$2(t.height + y - t.y) : ceil$2(t.height);
1423
1372
  },
@@ -1549,6 +1498,9 @@ const BoundsHelper = {
1549
1498
  isEmpty(t) {
1550
1499
  return t.x === 0 && t.y === 0 && t.width === 0 && t.height === 0;
1551
1500
  },
1501
+ hasSize(t) {
1502
+ return t.width && t.height;
1503
+ },
1552
1504
  reset(t) {
1553
1505
  B.set(t);
1554
1506
  }
@@ -1725,6 +1677,12 @@ class AutoBounds {
1725
1677
  }
1726
1678
  }
1727
1679
 
1680
+ const UnitConvertHelper = {
1681
+ number(value, percentRefer) {
1682
+ return isObject(value) ? value.type === "percent" ? value.value * percentRefer : value.value : value;
1683
+ }
1684
+ };
1685
+
1728
1686
  const StringNumberMap = {
1729
1687
  0: 1,
1730
1688
  1: 1,
@@ -1741,6 +1699,69 @@ const StringNumberMap = {
1741
1699
  E: 1
1742
1700
  };
1743
1701
 
1702
+ const {floor: floor$1, max: max$5} = Math;
1703
+
1704
+ const Platform = {
1705
+ toURL(text, fileType) {
1706
+ let url = encodeURIComponent(text);
1707
+ if (fileType === "text") url = "data:text/plain;charset=utf-8," + url; else if (fileType === "svg") url = "data:image/svg+xml," + url;
1708
+ return url;
1709
+ },
1710
+ image: {
1711
+ hitCanvasSize: 100,
1712
+ maxCacheSize: 2560 * 1600,
1713
+ maxPatternSize: 4096 * 2160,
1714
+ crossOrigin: "anonymous",
1715
+ isLarge(size, scaleX, scaleY, largeSize) {
1716
+ return size.width * size.height * (scaleX ? scaleX * scaleY : 1) > (largeSize || image$1.maxCacheSize);
1717
+ },
1718
+ isSuperLarge(size, scaleX, scaleY) {
1719
+ return image$1.isLarge(size, scaleX, scaleY, image$1.maxPatternSize);
1720
+ },
1721
+ getRealURL(url) {
1722
+ const {prefix: prefix, suffix: suffix} = image$1;
1723
+ if (suffix && !url.startsWith("data:") && !url.startsWith("blob:")) url += (url.includes("?") ? "&" : "?") + suffix;
1724
+ if (prefix && url[0] === "/") url = prefix + url;
1725
+ return url;
1726
+ },
1727
+ resize(view, width, height, xGap, yGap, clip, smooth, opacity, _filters, interlace) {
1728
+ const realWidth = max$5(floor$1(width + (xGap || 0)), 1), realHeight = max$5(floor$1(height + (yGap || 0)), 1);
1729
+ let interlaceX, interlaceY, interlaceOffset;
1730
+ if (interlace && (interlaceOffset = UnitConvertHelper.number(interlace.offset, (interlaceX = interlace.type === "x") ? width : height))) interlaceX || (interlaceY = true);
1731
+ const canvas = Platform.origin.createCanvas(interlaceY ? realWidth * 2 : realWidth, interlaceX ? realHeight * 2 : realHeight);
1732
+ const ctx = canvas.getContext("2d");
1733
+ if (opacity) ctx.globalAlpha = opacity;
1734
+ ctx.imageSmoothingEnabled = smooth === false ? false : true;
1735
+ if (image$1.canUse(view)) {
1736
+ if (clip) {
1737
+ const scaleX = width / clip.width, scaleY = height / clip.height;
1738
+ ctx.setTransform(scaleX, 0, 0, scaleY, -clip.x * scaleX, -clip.y * scaleY);
1739
+ ctx.drawImage(view, 0, 0, view.width, view.height);
1740
+ } else ctx.drawImage(view, 0, 0, width, height);
1741
+ if (interlaceOffset) {
1742
+ ctx.drawImage(canvas, 0, 0, realWidth, realHeight, interlaceX ? interlaceOffset - realWidth : realWidth, interlaceX ? realHeight : interlaceOffset - realHeight, realWidth, realHeight);
1743
+ ctx.drawImage(canvas, 0, 0, realWidth, realHeight, interlaceX ? interlaceOffset : realWidth, interlaceX ? realHeight : interlaceOffset, realWidth, realHeight);
1744
+ }
1745
+ }
1746
+ return canvas;
1747
+ },
1748
+ canUse(view) {
1749
+ return view && view.width && !view.__closed;
1750
+ },
1751
+ setPatternTransform(pattern, transform, paint) {
1752
+ try {
1753
+ if (transform && pattern.setTransform) {
1754
+ pattern.setTransform(transform);
1755
+ transform = undefined;
1756
+ }
1757
+ } catch (_a) {}
1758
+ if (paint) DataHelper.stintSet(paint, "transform", transform);
1759
+ }
1760
+ }
1761
+ };
1762
+
1763
+ const {image: image$1} = Platform;
1764
+
1744
1765
  const {randColor: randColor} = MathHelper;
1745
1766
 
1746
1767
  class Debug {
@@ -3783,9 +3804,10 @@ class TaskItem {
3783
3804
  run() {
3784
3805
  return __awaiter(this, void 0, void 0, function*() {
3785
3806
  try {
3786
- if (this.isComplete) return;
3807
+ if (this.isComplete || this.runing) return;
3808
+ this.runing = true;
3787
3809
  if (this.canUse && !this.canUse()) return this.cancel();
3788
- if (this.task && this.parent.running) yield this.task();
3810
+ if (this.task) yield this.task();
3789
3811
  } catch (error) {
3790
3812
  debug$c.error(error);
3791
3813
  }
@@ -3901,7 +3923,7 @@ class TaskProcessor {
3901
3923
  stop() {
3902
3924
  this.isComplete = true;
3903
3925
  this.list.forEach(task => {
3904
- if (!task.isComplete) task.cancel();
3926
+ if (!task.isComplete) task.run();
3905
3927
  });
3906
3928
  this.pause();
3907
3929
  this.empty();
@@ -4191,7 +4213,7 @@ class LeaferImage {
4191
4213
  getFull(_filters) {
4192
4214
  return this.view;
4193
4215
  }
4194
- getCanvas(width, height, opacity, filters, xGap, yGap, smooth) {
4216
+ getCanvas(width, height, opacity, filters, xGap, yGap, smooth, interlace) {
4195
4217
  width || (width = this.width);
4196
4218
  height || (height = this.height);
4197
4219
  if (this.cache) {
@@ -4204,7 +4226,7 @@ class LeaferImage {
4204
4226
  }
4205
4227
  if (data) return data;
4206
4228
  }
4207
- const canvas = Platform.image.resize(this.view, width, height, xGap, yGap, undefined, smooth, opacity, filters);
4229
+ const canvas = Platform.image.resize(this.view, width, height, xGap, yGap, undefined, smooth, opacity, filters, interlace);
4208
4230
  this.cache = this.use > 1 ? {
4209
4231
  data: canvas,
4210
4232
  params: arguments
@@ -4220,13 +4242,13 @@ class LeaferImage {
4220
4242
  return this.url;
4221
4243
  }
4222
4244
  setThumbView(_view) {}
4223
- getThumbSize() {
4245
+ getThumbSize(_lod) {
4224
4246
  return undefined;
4225
4247
  }
4226
4248
  getMinLevel() {
4227
4249
  return undefined;
4228
4250
  }
4229
- getLevelData(_level) {
4251
+ getLevelData(_level, _width, _height) {
4230
4252
  return undefined;
4231
4253
  }
4232
4254
  clearLevels(_checkUse) {}
@@ -6096,7 +6118,7 @@ const LeafRender = {
6096
6118
  }
6097
6119
  };
6098
6120
 
6099
- const {excludeRenderBounds: excludeRenderBounds$1} = LeafBoundsHelper;
6121
+ const {excludeRenderBounds: excludeRenderBounds$1} = LeafBoundsHelper, {hasSize: hasSize} = BoundsHelper;
6100
6122
 
6101
6123
  const BranchRender = {
6102
6124
  __updateChange() {
@@ -6108,8 +6130,8 @@ const BranchRender = {
6108
6130
  this.__.__checkSingle();
6109
6131
  },
6110
6132
  __render(canvas, options) {
6111
- this.__nowWorld = this.__getNowWorld(options);
6112
- if (this.__worldOpacity) {
6133
+ const nowWorld = this.__nowWorld = this.__getNowWorld(options);
6134
+ if (this.__worldOpacity && hasSize(nowWorld)) {
6113
6135
  const data = this.__;
6114
6136
  if (data.__useDim) {
6115
6137
  if (data.dim) options.dimOpacity = data.dim === true ? .2 : data.dim; else if (data.bright && !options.topRendering) return options.topList.add(this); else if (data.dimskip) options.dimOpacity && (options.dimOpacity = 0);
@@ -6118,7 +6140,6 @@ const BranchRender = {
6118
6140
  if (data.eraser === "path") return this.__renderEraser(canvas, options);
6119
6141
  const tempCanvas = canvas.getSameCanvas(false, true);
6120
6142
  this.__renderBranch(tempCanvas, options);
6121
- const nowWorld = this.__nowWorld;
6122
6143
  canvas.opacity = options.dimOpacity ? data.opacity * options.dimOpacity : data.opacity;
6123
6144
  canvas.copyWorldByReset(tempCanvas, nowWorld, nowWorld, data.__blendMode, true);
6124
6145
  tempCanvas.recycle(nowWorld);
@@ -6958,7 +6979,7 @@ class LeafLevelList {
6958
6979
  }
6959
6980
  }
6960
6981
 
6961
- const version = "1.12.3";
6982
+ const version = "2.0.0";
6962
6983
 
6963
6984
  class LeaferCanvas extends LeaferCanvasBase {
6964
6985
  get allowBackgroundColor() {
@@ -7538,6 +7559,7 @@ class Renderer {
7538
7559
  this.times = 0;
7539
7560
  this.config = {
7540
7561
  usePartRender: true,
7562
+ ceilPartPixel: true,
7541
7563
  maxFPS: 120
7542
7564
  };
7543
7565
  this.frames = [];
@@ -7646,8 +7668,9 @@ class Renderer {
7646
7668
  const {canvas: canvas} = this, bounds = block.getIntersect(canvas.bounds), realBounds = new Bounds(bounds);
7647
7669
  canvas.save();
7648
7670
  bounds.spread(Renderer.clipSpread).ceil();
7649
- canvas.clearWorld(bounds);
7650
- canvas.clipWorld(bounds);
7671
+ const {ceilPartPixel: ceilPartPixel} = this.config;
7672
+ canvas.clipWorld(bounds, ceilPartPixel);
7673
+ canvas.clearWorld(bounds, ceilPartPixel);
7651
7674
  this.__render(bounds, realBounds);
7652
7675
  canvas.restore();
7653
7676
  Run.end(t);
@@ -8046,11 +8069,7 @@ const ColorConvert = {
8046
8069
  hasTransparent: hasTransparent$3
8047
8070
  };
8048
8071
 
8049
- const UnitConvert = {
8050
- number(value, percentRefer) {
8051
- return isObject(value) ? value.type === "percent" ? value.value * percentRefer : value.value : value;
8052
- }
8053
- };
8072
+ const UnitConvert = UnitConvertHelper;
8054
8073
 
8055
8074
  const PathArrow = {};
8056
8075
 
@@ -9420,9 +9439,10 @@ let Ellipse = class Ellipse extends UI {
9420
9439
  const {width: width, height: height, innerRadius: innerRadius, startAngle: startAngle, endAngle: endAngle} = this.__;
9421
9440
  const rx = width / 2, ry = height / 2;
9422
9441
  const path = this.__.path = [];
9442
+ let open;
9423
9443
  if (innerRadius) {
9424
9444
  if (startAngle || endAngle) {
9425
- if (innerRadius < 1) ellipse(path, rx, ry, rx * innerRadius, ry * innerRadius, 0, startAngle, endAngle, false);
9445
+ if (innerRadius < 1) ellipse(path, rx, ry, rx * innerRadius, ry * innerRadius, 0, startAngle, endAngle, false); else open = true;
9426
9446
  ellipse(path, rx, ry, rx, ry, 0, endAngle, startAngle, true);
9427
9447
  } else {
9428
9448
  if (innerRadius < 1) {
@@ -9439,7 +9459,7 @@ let Ellipse = class Ellipse extends UI {
9439
9459
  ellipse(path, rx, ry, rx, ry);
9440
9460
  }
9441
9461
  }
9442
- closePath$2(path);
9462
+ if (!open) closePath$2(path);
9443
9463
  if (Platform.ellipseToCurve) this.__.path = this.getPath(true);
9444
9464
  }
9445
9465
  };
@@ -11304,6 +11324,7 @@ ui$5.__updateHitCanvas = function() {
11304
11324
  ImageManager.patternLocked = true;
11305
11325
  this.__renderShape(h, {
11306
11326
  matrix: matrix$2.setWith(this.__world).scaleWith(1 / scale).invertWith().translate(-x, -y),
11327
+ snapshot: true,
11307
11328
  ignoreFill: !isHitPixelFill,
11308
11329
  ignoreStroke: !isHitPixelStroke
11309
11330
  });
@@ -11919,7 +11940,7 @@ function image(ui, attrName, paint, boxBounds, firstUse) {
11919
11940
  ignoreRender(ui, false);
11920
11941
  onLoadError(ui, event, error);
11921
11942
  leafPaint.loadId = undefined;
11922
- }, paint.lod && image.getThumbSize());
11943
+ }, paint.lod && image.getThumbSize(paint.lod));
11923
11944
  if (ui.placeholderColor) {
11924
11945
  if (!ui.placeholderDelay) image.isPlacehold = true; else setTimeout(() => {
11925
11946
  if (!image.ready) {
@@ -11989,7 +12010,7 @@ function getPatternData(paint, box, image) {
11989
12010
  if (paint.padding) box = tempBox.set(box).shrink(paint.padding);
11990
12011
  if (paint.mode === "strench") paint.mode = "stretch";
11991
12012
  const {width: width, height: height} = image;
11992
- 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} = paint;
12013
+ 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;
11993
12014
  const sameBox = box.width === width && box.height === height;
11994
12015
  const data = {
11995
12016
  mode: mode
@@ -12055,6 +12076,10 @@ function getPatternData(paint, box, image) {
12055
12076
  if (opacity && opacity < 1) data.opacity = opacity;
12056
12077
  if (filters) data.filters = filters;
12057
12078
  if (repeat) data.repeat = isString(repeat) ? repeat === "x" ? "repeat-x" : "repeat-y" : "repeat";
12079
+ if (interlace) data.interlace = isNumber(interlace) || interlace.type === "percent" ? {
12080
+ type: "x",
12081
+ offset: interlace
12082
+ } : interlace;
12058
12083
  return data;
12059
12084
  }
12060
12085
 
@@ -12188,7 +12213,7 @@ function createPattern(paint, ui, canvas, renderOptions) {
12188
12213
  if (transform) copy$4(imageMatrix, transform);
12189
12214
  scale$1(imageMatrix, 1 / scaleX, 1 / scaleY);
12190
12215
  }
12191
- const imageCanvas = image.getCanvas(width, height, data.opacity, data.filters, xGap, yGap, ui.leafer && ui.leafer.config.smooth);
12216
+ const imageCanvas = image.getCanvas(width, height, data.opacity, data.filters, xGap, yGap, ui.leafer && ui.leafer.config.smooth, data.interlace);
12192
12217
  const pattern = image.getPattern(imageCanvas, data.repeat || (Platform.origin.noRepeat || "no-repeat"), imageMatrix, paint);
12193
12218
  paint.style = pattern;
12194
12219
  paint.patternId = id;
@@ -12210,8 +12235,8 @@ function getPatternFixScale(paint, imageScaleX, imageScaleY) {
12210
12235
 
12211
12236
  function checkImage(paint, drawImage, ui, canvas, renderOptions) {
12212
12237
  const {scaleX: scaleX, scaleY: scaleY} = PaintImage.getImageRenderScaleData(paint, ui, canvas, renderOptions);
12213
- const {image: image, data: data, originPaint: originPaint} = paint, {exporting: exporting} = renderOptions;
12214
- if (!data || paint.patternId === scaleX + "-" + scaleY && !exporting) {
12238
+ const {image: image, data: data, originPaint: originPaint} = paint, {exporting: exporting, snapshot: snapshot} = renderOptions;
12239
+ if (!data || paint.patternId === scaleX + "-" + scaleY && !exporting || snapshot) {
12215
12240
  return false;
12216
12241
  } else {
12217
12242
  if (drawImage) {
@@ -12885,7 +12910,7 @@ const TextMode = 2;
12885
12910
 
12886
12911
  function layoutChar(drawData, style, width, _height) {
12887
12912
  const {rows: rows} = drawData;
12888
- const {textAlign: textAlign, paraIndent: paraIndent, letterSpacing: letterSpacing} = style;
12913
+ const {textAlign: textAlign, paraIndent: paraIndent, __letterSpacing: __letterSpacing} = style;
12889
12914
  const justifyLast = width && textAlign.includes("both");
12890
12915
  const justify = justifyLast || width && textAlign.includes("justify");
12891
12916
  const justifyLetter = justify && textAlign.includes("letter");
@@ -12898,8 +12923,8 @@ function layoutChar(drawData, style, width, _height) {
12898
12923
  remainingWidth = width - row.width - indentWidth;
12899
12924
  if (justifyLetter) addLetterWidth = remainingWidth / (row.words.reduce((total, item) => total + item.data.length, 0) - 1); else addWordWidth = wordsLength > 1 ? remainingWidth / (wordsLength - 1) : 0;
12900
12925
  }
12901
- mode = letterSpacing || row.isOverflow || justifyLetter ? CharMode : addWordWidth ? WordMode : TextMode;
12902
- if (row.isOverflow && !letterSpacing) row.textMode = true;
12926
+ mode = __letterSpacing || row.isOverflow || justifyLetter ? CharMode : addWordWidth ? WordMode : TextMode;
12927
+ if (row.isOverflow && !__letterSpacing) row.textMode = true;
12903
12928
  if (mode === TextMode) {
12904
12929
  row.x += indentWidth;
12905
12930
  toTextChar$1(row);
@@ -16253,13 +16278,14 @@ leafer.initType = function(type) {
16253
16278
  };
16254
16279
 
16255
16280
  leafer.getValidMove = function(moveX, moveY, checkLimit = true) {
16256
- const {disabled: disabled} = this.app.config.move;
16281
+ const {disabled: disabled, scrollSpread: scrollSpread} = this.app.config.move;
16257
16282
  move$4.set(moveX, moveY);
16258
16283
  const scrollType = getScrollType(this);
16259
16284
  if (scrollType) {
16260
16285
  if (scrollType.includes("x")) move$4.y = 0; else if (scrollType.includes("y")) move$4.x = 0; else Math.abs(move$4.x) > Math.abs(move$4.y) ? move$4.y = 0 : move$4.x = 0;
16261
16286
  if (checkLimit && scrollType.includes("limit")) {
16262
16287
  bounds.set(this.__world).addPoint(this.zoomLayer);
16288
+ if (scrollSpread) bounds.spread(scrollSpread);
16263
16289
  DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, "auto", move$4, true);
16264
16290
  if (scrollType.includes("x")) move$4.y = 0; else if (scrollType.includes("y")) move$4.x = 0;
16265
16291
  }
@@ -19824,7 +19850,13 @@ const ExportModule = {
19824
19850
  MathHelper.getScaleData(options.scale, options.size, renderBounds, scaleData);
19825
19851
  let pixelRatio = options.pixelRatio || 1;
19826
19852
  let {x: x, y: y, width: width, height: height} = new Bounds(renderBounds).scale(scaleData.scaleX, scaleData.scaleY);
19827
- if (clip) x += clip.x, y += clip.y, width = clip.width, height = clip.height;
19853
+ if (clip) {
19854
+ x += clip.x, y += clip.y, width = clip.width, height = clip.height;
19855
+ if (clip.rotation) matrix.rotateOfInner({
19856
+ x: x,
19857
+ y: y
19858
+ }, -clip.rotation);
19859
+ }
19828
19860
  const renderOptions = {
19829
19861
  exporting: true,
19830
19862
  matrix: matrix.scale(1 / scaleData.scaleX, 1 / scaleData.scaleY).invert().translate(-x, -y).withScale(1 / scaleX * scaleData.scaleX, 1 / scaleY * scaleData.scaleY)
@@ -20013,4 +20045,4 @@ Plugin.add("bright");
20013
20045
 
20014
20046
  UI.addAttr("bright", false, dimType);
20015
20047
 
20016
- export { AlignHelper, Animate, AnimateEasing, AnimateEvent, AnimateList, Answer, App, AroundHelper, Arrow, ArrowData, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragBoundsHelper, DragEvent, Dragger, DropEvent, EditBox, EditDataHelper, EditPoint, EditSelect, EditSelectHelper, EditTool, EditToolCreator, Editor, EditorEvent, EditorGroupEvent, EditorHelper, EditorMoveEvent, EditorRotateEvent, EditorScaleEvent, EditorSkewEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, Finder, Flow, FourNumberHelper, Frame, FrameData, Group, GroupData, HighBezierHelper, HighCurveHelper, HitCanvasManager, Image, ImageData, ImageEvent, ImageManager, IncrementId, InnerEditor, InnerEditorEvent, 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, LeaferTypeCreator, Line, LineData, LineEditTool, MathHelper, Matrix, MatrixHelper, MoveEvent, MultiTouchHelper, MyDragEvent, MyImage, MyPointerEvent, MyTouchEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathArrowModule, PathBounds, PathCommandDataHelper, PathCommandMap, PathCommandNodeHelper, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathMatrixHelper, PathNodeHandleType, PathNumberCommandLengthMap, PathNumberCommandMap, PathScaler, Pen, PenData, Picker, Platform, Plugin, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, Robot, RobotData, RotateEvent, Run, ScrollBar, SelectArea, Selector, Star, StarData, State, StringNumberMap, Stroker, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, TouchEvent, TransformTool, Transformer, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, WheelEventHelper, ZoomEvent, addViewport, addViewportConfig, affectRenderBoundsType, affectStrokeBoundsType, arrowType, 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$1 as isFinite, isNull, isNumber, isObject, isString, isUndefined, layoutProcessor, leaferTransformAttrMap, maskType, motionPathType, naturalBoundsType, opacityType, path, pathInputType, pathType, pen, positionType, registerEditTool, registerInnerEditor, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleResize, scaleResizeFontSize, scaleResizeGroup, scaleResizePath, scaleResizePoints, scaleType, scrollType, sortType, stateStyleType, stateType, strokeType, surfaceType, tempBounds$2 as tempBounds, tempMatrix$2 as tempMatrix, tempPoint$4 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };
20048
+ export { AlignHelper, Animate, AnimateEasing, AnimateEvent, AnimateList, Answer, App, AroundHelper, Arrow, ArrowData, AutoBounds, BezierHelper, Bounds, BoundsEvent, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragBoundsHelper, DragEvent, Dragger, DropEvent, EditBox, EditDataHelper, EditPoint, EditSelect, EditSelectHelper, EditTool, EditToolCreator, Editor, EditorEvent, EditorGroupEvent, EditorHelper, EditorMoveEvent, EditorRotateEvent, EditorScaleEvent, EditorSkewEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, Finder, Flow, FourNumberHelper, Frame, FrameData, Group, GroupData, HighBezierHelper, HighCurveHelper, HitCanvasManager, Image, ImageData, ImageEvent, ImageManager, IncrementId, InnerEditor, InnerEditorEvent, 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, LeaferTypeCreator, Line, LineData, LineEditTool, MathHelper, Matrix, MatrixHelper, MoveEvent, MultiTouchHelper, MyDragEvent, MyImage, MyPointerEvent, MyTouchEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathArrowModule, PathBounds, PathCommandDataHelper, PathCommandMap, PathCommandNodeHelper, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathMatrixHelper, PathNodeHandleType, PathNumberCommandLengthMap, PathNumberCommandMap, PathScaler, Pen, PenData, Picker, Platform, Plugin, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Resource, Robot, RobotData, RotateEvent, Run, ScrollBar, SelectArea, Selector, Star, StarData, State, StringNumberMap, Stroker, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, TouchEvent, TransformTool, Transformer, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, UnitConvertHelper, WaitHelper, WatchEvent, Watcher, WheelEventHelper, ZoomEvent, addViewport, addViewportConfig, affectRenderBoundsType, affectStrokeBoundsType, arrowType, 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$1 as isFinite, isNull, isNumber, isObject, isString, isUndefined, layoutProcessor, leaferTransformAttrMap, maskType, motionPathType, naturalBoundsType, opacityType, path, pathInputType, pathType, pen, positionType, registerEditTool, registerInnerEditor, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleResize, scaleResizeFontSize, scaleResizeGroup, scaleResizePath, scaleResizePoints, scaleType, scrollType, sortType, stateStyleType, stateType, strokeType, surfaceType, tempBounds$2 as tempBounds, tempMatrix$2 as tempMatrix, tempPoint$4 as tempPoint, tryToNumber, useCanvas, useModule, version, visibleType, zoomLayerType };