leafer-draw 1.7.0 → 1.8.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.
@@ -436,7 +436,7 @@ const MatrixHelper = {
436
436
  const M$6 = MatrixHelper;
437
437
 
438
438
  const { toInnerPoint: toInnerPoint$2, toOuterPoint: toOuterPoint$3 } = MatrixHelper;
439
- const { sin: sin$4, cos: cos$4, abs: abs$4, sqrt: sqrt$2, atan2: atan2$2, min: min$1, round: round$2 } = Math;
439
+ const { sin: sin$4, cos: cos$4, abs: abs$3, sqrt: sqrt$2, atan2: atan2$2, min: min$1, round: round$2 } = Math;
440
440
  const PointHelper = {
441
441
  defaultPoint: getPointData(),
442
442
  tempPoint: {},
@@ -531,8 +531,8 @@ const PointHelper = {
531
531
  return getDistanceFrom(t.x, t.y, point.x, point.y);
532
532
  },
533
533
  getDistanceFrom(x1, y1, x2, y2) {
534
- const x = abs$4(x2 - x1);
535
- const y = abs$4(y2 - y1);
534
+ const x = abs$3(x2 - x1);
535
+ const y = abs$3(y2 - y1);
536
536
  return sqrt$2(x * x + y * y);
537
537
  },
538
538
  getMinDistanceFrom(x1, y1, x2, y2, x3, y3) {
@@ -763,7 +763,7 @@ class Matrix {
763
763
  MatrixHelper.reset(this);
764
764
  }
765
765
  }
766
- const tempMatrix = new Matrix();
766
+ const tempMatrix$1 = new Matrix();
767
767
 
768
768
  const TwoPointBoundsHelper = {
769
769
  tempPointBounds: {},
@@ -860,6 +860,12 @@ const AroundHelper = {
860
860
  }
861
861
  if (!onlyBoxSize)
862
862
  to.x += box.x, to.y += box.y;
863
+ },
864
+ getPoint(around, box, to) {
865
+ if (!to)
866
+ to = {};
867
+ AroundHelper.toPoint(around, box, to, true);
868
+ return to;
863
869
  }
864
870
  };
865
871
  function get$4(around) {
@@ -1788,10 +1794,13 @@ function contextAttr(realName) {
1788
1794
  return (target, key) => {
1789
1795
  if (!realName)
1790
1796
  realName = key;
1791
- Object.defineProperty(target, key, {
1797
+ const property = {
1792
1798
  get() { return this.context[realName]; },
1793
1799
  set(value) { this.context[realName] = value; }
1794
- });
1800
+ };
1801
+ if (key === 'strokeCap')
1802
+ property.set = function (value) { this.context[realName] = value === 'none' ? 'butt' : value; };
1803
+ Object.defineProperty(target, key, property);
1795
1804
  };
1796
1805
  }
1797
1806
  const contextMethodNameList = [];
@@ -2067,15 +2076,15 @@ __decorate([
2067
2076
  contextMethod()
2068
2077
  ], Canvas$1.prototype, "strokeText", null);
2069
2078
 
2070
- const { copy: copy$8, multiplyParent: multiplyParent$3 } = MatrixHelper, { round: round$1 } = Math;
2079
+ const { copy: copy$8, multiplyParent: multiplyParent$4 } = MatrixHelper, { round: round$1 } = Math;
2071
2080
  const minSize = { width: 1, height: 1, pixelRatio: 1 };
2072
2081
  const canvasSizeAttrs = ['width', 'height', 'pixelRatio'];
2073
2082
  class LeaferCanvasBase extends Canvas$1 {
2074
2083
  get width() { return this.size.width; }
2075
2084
  get height() { return this.size.height; }
2076
2085
  get pixelRatio() { return this.size.pixelRatio; }
2077
- get pixelWidth() { return this.width * this.pixelRatio; }
2078
- get pixelHeight() { return this.height * this.pixelRatio; }
2086
+ get pixelWidth() { return this.width * this.pixelRatio || 0; }
2087
+ get pixelHeight() { return this.height * this.pixelRatio || 0; }
2079
2088
  get pixelSnap() { return this.config.pixelSnap; }
2080
2089
  set pixelSnap(value) { this.config.pixelSnap = value; }
2081
2090
  get allowBackgroundColor() { return this.view && this.parentView; }
@@ -2140,7 +2149,7 @@ class LeaferCanvasBase extends Canvas$1 {
2140
2149
  setWorld(matrix, parentMatrix) {
2141
2150
  const { pixelRatio, pixelSnap } = this, w = this.worldTransform;
2142
2151
  if (parentMatrix)
2143
- multiplyParent$3(matrix, parentMatrix, w);
2152
+ multiplyParent$4(matrix, parentMatrix, w);
2144
2153
  w.a = matrix.a * pixelRatio;
2145
2154
  w.b = matrix.b * pixelRatio;
2146
2155
  w.c = matrix.c * pixelRatio;
@@ -2162,20 +2171,33 @@ class LeaferCanvasBase extends Canvas$1 {
2162
2171
  if (w)
2163
2172
  this.setTransform(w.a, w.b, w.c, w.d, w.e, w.f);
2164
2173
  }
2165
- setStroke(color, strokeWidth, options) {
2174
+ setStroke(color, strokeWidth, options, childOptions) {
2166
2175
  if (strokeWidth)
2167
2176
  this.strokeWidth = strokeWidth;
2168
2177
  if (color)
2169
2178
  this.strokeStyle = color;
2170
2179
  if (options)
2171
- this.setStrokeOptions(options);
2172
- }
2173
- setStrokeOptions(options) {
2174
- this.strokeCap = options.strokeCap === 'none' ? 'butt' : options.strokeCap;
2175
- this.strokeJoin = options.strokeJoin;
2176
- this.dashPattern = options.dashPattern;
2177
- this.dashOffset = options.dashOffset;
2178
- this.miterLimit = options.miterLimit;
2180
+ this.setStrokeOptions(options, childOptions);
2181
+ }
2182
+ setStrokeOptions(options, childOptions) {
2183
+ let { strokeCap, strokeJoin, dashPattern, dashOffset, miterLimit } = options;
2184
+ if (childOptions) {
2185
+ if (childOptions.strokeCap)
2186
+ strokeCap = childOptions.strokeCap;
2187
+ if (childOptions.strokeJoin)
2188
+ strokeJoin = childOptions.strokeJoin;
2189
+ if (childOptions.dashPattern !== undefined)
2190
+ dashPattern = childOptions.dashPattern;
2191
+ if (childOptions.dashOffset !== undefined)
2192
+ dashOffset = childOptions.dashOffset;
2193
+ if (childOptions.miterLimit)
2194
+ miterLimit = childOptions.miterLimit;
2195
+ }
2196
+ this.strokeCap = strokeCap;
2197
+ this.strokeJoin = strokeJoin;
2198
+ this.dashPattern = dashPattern;
2199
+ this.dashOffset = dashOffset;
2200
+ this.miterLimit = miterLimit;
2179
2201
  }
2180
2202
  saveBlendMode(blendMode) {
2181
2203
  this.savedBlendMode = this.blendMode;
@@ -2409,7 +2431,7 @@ const RectHelper = {
2409
2431
  }
2410
2432
  };
2411
2433
 
2412
- const { sin: sin$3, cos: cos$3, atan2: atan2$1, ceil: ceil$1, abs: abs$3, PI: PI$2, sqrt: sqrt$1, pow } = Math;
2434
+ const { sin: sin$3, cos: cos$3, atan2: atan2$1, ceil: ceil$1, abs: abs$2, PI: PI$2, sqrt: sqrt$1, pow } = Math;
2413
2435
  const { setPoint: setPoint$1, addPoint: addPoint$1 } = TwoPointBoundsHelper;
2414
2436
  const { set, toNumberPoints } = PointHelper;
2415
2437
  const { M: M$5, L: L$6, C: C$4, Q: Q$4, Z: Z$5 } = PathCommandMap;
@@ -2484,7 +2506,7 @@ const BezierHelper = {
2484
2506
  let totalRadian = endRadian - startRadian;
2485
2507
  if (totalRadian < 0)
2486
2508
  totalRadian += PI2;
2487
- if (totalRadian === PI$2 || (abs$3(BAx + BAy) < 1.e-12) || (abs$3(CBx + CBy) < 1.e-12)) {
2509
+ if (totalRadian === PI$2 || (abs$2(BAx + BAy) < 1.e-12) || (abs$2(CBx + CBy) < 1.e-12)) {
2488
2510
  if (data)
2489
2511
  data.push(L$6, x1, y1);
2490
2512
  if (setPointBounds) {
@@ -2526,7 +2548,7 @@ const BezierHelper = {
2526
2548
  totalRadian -= PI2;
2527
2549
  if (anticlockwise)
2528
2550
  totalRadian -= PI2;
2529
- const parts = ceil$1(abs$3(totalRadian / PI_2));
2551
+ const parts = ceil$1(abs$2(totalRadian / PI_2));
2530
2552
  const partRadian = totalRadian / parts;
2531
2553
  const partRadian4Sin = sin$3(partRadian / 4);
2532
2554
  const control = 8 / 3 * partRadian4Sin * partRadian4Sin / sin$3(partRadian / 2);
@@ -2971,7 +2993,7 @@ const { current, pushData, copyData } = PathConvert;
2971
2993
 
2972
2994
  const { M: M$3, L: L$4, C: C$2, Q: Q$2, Z: Z$3, N: N$2, D: D$2, X: X$2, G: G$2, F: F$3, O: O$2, P: P$2, U: U$2 } = PathCommandMap;
2973
2995
  const { getMinDistanceFrom, getRadianFrom } = PointHelper;
2974
- const { tan, min, abs: abs$2 } = Math;
2996
+ const { tan, min, abs: abs$1 } = Math;
2975
2997
  const startPoint = {};
2976
2998
  const PathCommandDataHelper = {
2977
2999
  beginPath(data) {
@@ -3034,7 +3056,7 @@ const PathCommandDataHelper = {
3034
3056
  arcTo(data, x1, y1, x2, y2, radius, lastX, lastY) {
3035
3057
  if (lastX !== undefined) {
3036
3058
  const d = getMinDistanceFrom(lastX, lastY, x1, y1, x2, y2);
3037
- radius = min(radius, min(d / 2, d / 2 * abs$2(tan(getRadianFrom(lastX, lastY, x1, y1, x2, y2) / 2))));
3059
+ radius = min(radius, min(d / 2, d / 2 * abs$1(tan(getRadianFrom(lastX, lastY, x1, y1, x2, y2) / 2))));
3038
3060
  }
3039
3061
  data.push(U$2, x1, y1, x2, y2, radius);
3040
3062
  },
@@ -3910,6 +3932,13 @@ function defineKey(target, key, descriptor, noConfigurable) {
3910
3932
  function getDescriptor(object, name) {
3911
3933
  return Object.getOwnPropertyDescriptor(object, name);
3912
3934
  }
3935
+ function createDescriptor(key, defaultValue) {
3936
+ const privateKey = '_' + key;
3937
+ return {
3938
+ get() { const v = this[privateKey]; return v === undefined ? defaultValue : v; },
3939
+ set(value) { this[privateKey] = value; }
3940
+ };
3941
+ }
3913
3942
  function getNames(object) {
3914
3943
  return Object.getOwnPropertyNames(object);
3915
3944
  }
@@ -4142,15 +4171,7 @@ function defineDataProcessor(target, key, defaultValue) {
4142
4171
  const data = target.__DataProcessor.prototype;
4143
4172
  const computedKey = '_' + key;
4144
4173
  const setMethodName = getSetMethodName(key);
4145
- const property = {
4146
- get() {
4147
- const v = this[computedKey];
4148
- return v === undefined ? defaultValue : v;
4149
- },
4150
- set(value) {
4151
- this[computedKey] = value;
4152
- }
4153
- };
4174
+ const property = createDescriptor(key, defaultValue);
4154
4175
  if (defaultValue === undefined) {
4155
4176
  property.get = function () { return this[computedKey]; };
4156
4177
  }
@@ -4265,7 +4286,7 @@ function registerUIEvent() {
4265
4286
  };
4266
4287
  }
4267
4288
 
4268
- const { copy: copy$6, toInnerPoint: toInnerPoint$1, toOuterPoint: toOuterPoint$1, scaleOfOuter: scaleOfOuter$2, rotateOfOuter: rotateOfOuter$2, skewOfOuter, multiplyParent: multiplyParent$2, divideParent, getLayout } = MatrixHelper;
4289
+ const { copy: copy$6, toInnerPoint: toInnerPoint$1, toOuterPoint: toOuterPoint$1, scaleOfOuter: scaleOfOuter$2, rotateOfOuter: rotateOfOuter$2, skewOfOuter, multiplyParent: multiplyParent$3, divideParent, getLayout } = MatrixHelper;
4269
4290
  const matrix = {}, { round } = Math;
4270
4291
  const LeafHelper = {
4271
4292
  updateAllMatrix(leaf, checkAutoLayout, waitAutoLayout) {
@@ -4337,6 +4358,14 @@ const LeafHelper = {
4337
4358
  }
4338
4359
  return true;
4339
4360
  },
4361
+ copyCanvasByWorld(leaf, currentCanvas, fromCanvas, fromWorld, blendMode, onlyResetTransform) {
4362
+ if (!fromWorld)
4363
+ fromWorld = leaf.__nowWorld;
4364
+ if (leaf.__worldFlipped || Platform.fullImageShadow)
4365
+ currentCanvas.copyWorldByReset(fromCanvas, fromWorld, leaf.__nowWorld, blendMode, onlyResetTransform);
4366
+ else
4367
+ currentCanvas.copyWorldToInner(fromCanvas, fromWorld, leaf.__layout.renderBounds, blendMode);
4368
+ },
4340
4369
  moveWorld(t, x, y = 0, isInnerPoint, transition) {
4341
4370
  const local = typeof x === 'object' ? Object.assign({}, x) : { x, y };
4342
4371
  isInnerPoint ? toOuterPoint$1(t.localTransform, local, local, true) : (t.parent && toInnerPoint$1(t.parent.worldTransform, local, local, true));
@@ -4396,14 +4425,14 @@ const LeafHelper = {
4396
4425
  },
4397
4426
  transformWorld(t, transform, resize, transition) {
4398
4427
  copy$6(matrix, t.worldTransform);
4399
- multiplyParent$2(matrix, transform);
4428
+ multiplyParent$3(matrix, transform);
4400
4429
  if (t.parent)
4401
4430
  divideParent(matrix, t.parent.worldTransform);
4402
4431
  L.setTransform(t, matrix, resize, transition);
4403
4432
  },
4404
4433
  transform(t, transform, resize, transition) {
4405
4434
  copy$6(matrix, t.localTransform);
4406
- multiplyParent$2(matrix, transform);
4435
+ multiplyParent$3(matrix, transform);
4407
4436
  L.setTransform(t, matrix, resize, transition);
4408
4437
  },
4409
4438
  setTransform(t, transform, resize, transition) {
@@ -5265,17 +5294,18 @@ const LeafDataProxy = {
5265
5294
  }
5266
5295
  };
5267
5296
 
5268
- const { setLayout, multiplyParent: multiplyParent$1, translateInner, defaultWorld } = MatrixHelper;
5297
+ const { setLayout, multiplyParent: multiplyParent$2, translateInner, defaultWorld } = MatrixHelper;
5269
5298
  const { toPoint: toPoint$3, tempPoint } = AroundHelper;
5270
5299
  const LeafMatrix = {
5271
5300
  __updateWorldMatrix() {
5272
- multiplyParent$1(this.__local || this.__layout, this.parent ? this.parent.__world : defaultWorld, this.__world, !!this.__layout.affectScaleOrRotation, this.__, this.parent && this.parent.__);
5301
+ const { parent, __layout } = this;
5302
+ multiplyParent$2(this.__local || __layout, parent ? parent.__world : defaultWorld, this.__world, !!__layout.affectScaleOrRotation, this.__, parent && (parent.scrollY || parent.scrollX) && parent.__);
5273
5303
  },
5274
5304
  __updateLocalMatrix() {
5275
5305
  if (this.__local) {
5276
5306
  const layout = this.__layout, local = this.__local, data = this.__;
5277
5307
  if (layout.affectScaleOrRotation) {
5278
- if ((layout.scaleChanged && (layout.resized = 'scale')) || layout.rotationChanged) {
5308
+ if ((layout.scaleChanged && (layout.resized || (layout.resized = 'scale'))) || layout.rotationChanged) {
5279
5309
  setLayout(local, data, null, null, layout.affectRotation);
5280
5310
  layout.scaleChanged = layout.rotationChanged = undefined;
5281
5311
  }
@@ -5441,10 +5471,7 @@ const LeafRender = {
5441
5471
  return this.__renderEraser(canvas, options);
5442
5472
  const tempCanvas = canvas.getSameCanvas(true, true);
5443
5473
  this.__draw(tempCanvas, options, canvas);
5444
- if (this.__worldFlipped)
5445
- canvas.copyWorldByReset(tempCanvas, this.__nowWorld, null, data.__blendMode, true);
5446
- else
5447
- canvas.copyWorldToInner(tempCanvas, this.__nowWorld, this.__layout.renderBounds, data.__blendMode);
5474
+ LeafHelper.copyCanvasByWorld(this, canvas, tempCanvas, this.__nowWorld, data.__blendMode, true);
5448
5475
  tempCanvas.recycle(this.__nowWorld);
5449
5476
  }
5450
5477
  else {
@@ -5492,7 +5519,7 @@ const BranchRender = {
5492
5519
  options.dimOpacity = data.dim === true ? 0.2 : data.dim;
5493
5520
  else if (data.dimskip)
5494
5521
  options.dimOpacity && (options.dimOpacity = 0);
5495
- if (data.__single) {
5522
+ if (data.__single && !this.isBranchLeaf) {
5496
5523
  if (data.eraser === 'path')
5497
5524
  return this.__renderEraser(canvas, options);
5498
5525
  const tempCanvas = canvas.getSameCanvas(false, true);
@@ -5514,9 +5541,7 @@ const BranchRender = {
5514
5541
  else {
5515
5542
  const { children } = this;
5516
5543
  for (let i = 0, len = children.length; i < len; i++) {
5517
- if (excludeRenderBounds$1(children[i], options))
5518
- continue;
5519
- children[i].__render(canvas, options);
5544
+ excludeRenderBounds$1(children[i], options) || children[i].__render(canvas, options);
5520
5545
  }
5521
5546
  }
5522
5547
  },
@@ -5524,16 +5549,15 @@ const BranchRender = {
5524
5549
  if (this.__worldOpacity) {
5525
5550
  const { children } = this;
5526
5551
  for (let i = 0, len = children.length; i < len; i++) {
5527
- if (excludeRenderBounds$1(children[i], options))
5528
- continue;
5529
- children[i].__clip(canvas, options);
5552
+ excludeRenderBounds$1(children[i], options) || children[i].__clip(canvas, options);
5530
5553
  }
5531
5554
  }
5532
5555
  }
5533
5556
  };
5534
5557
 
5558
+ const tempScaleData$1 = {};
5535
5559
  const { LEAF, create } = IncrementId;
5536
- const { toInnerPoint, toOuterPoint, multiplyParent } = MatrixHelper;
5560
+ const { toInnerPoint, toOuterPoint, multiplyParent: multiplyParent$1 } = MatrixHelper;
5537
5561
  const { toOuterOf } = BoundsHelper;
5538
5562
  const { copy: copy$3, move } = PointHelper;
5539
5563
  const { moveLocal, zoomOfLocal, rotateOfLocal, skewOfLocal, moveWorld, zoomOfWorld, rotateOfWorld, skewOfWorld, transform, transformWorld, setTransform, getFlipTransform, getLocalOrigin, getRelativeWorld, drop } = LeafHelper;
@@ -5715,7 +5739,7 @@ let Leaf = class Leaf {
5715
5739
  if (!this.__cameraWorld)
5716
5740
  this.__cameraWorld = {};
5717
5741
  const cameraWorld = this.__cameraWorld, world = this.__world;
5718
- multiplyParent(world, options.matrix, cameraWorld, undefined, world);
5742
+ multiplyParent$1(world, options.matrix, cameraWorld, undefined, world);
5719
5743
  toOuterOf(this.__layout.renderBounds, cameraWorld, cameraWorld);
5720
5744
  cameraWorld.half !== world.half && (cameraWorld.half = world.half);
5721
5745
  return cameraWorld;
@@ -5724,6 +5748,22 @@ let Leaf = class Leaf {
5724
5748
  return this.__world;
5725
5749
  }
5726
5750
  }
5751
+ getClampRenderScale() {
5752
+ let { scaleX } = this.__nowWorld || this.__world;
5753
+ if (scaleX < 0)
5754
+ scaleX = -scaleX;
5755
+ return scaleX > 1 ? scaleX : 1;
5756
+ }
5757
+ getRenderScaleData(abs, scaleFixed) {
5758
+ const { scaleX, scaleY } = ImageManager.patternLocked ? this.__world : this.__nowWorld;
5759
+ if (scaleFixed)
5760
+ tempScaleData$1.scaleX = tempScaleData$1.scaleY = 1;
5761
+ else if (abs)
5762
+ tempScaleData$1.scaleX = scaleX < 0 ? -scaleX : scaleX, tempScaleData$1.scaleY = scaleY < 0 ? -scaleY : scaleY;
5763
+ else
5764
+ tempScaleData$1.scaleX = scaleX, tempScaleData$1.scaleY = scaleY;
5765
+ return tempScaleData$1;
5766
+ }
5727
5767
  getTransform(relative) {
5728
5768
  return this.__layout.getTransform(relative || 'local');
5729
5769
  }
@@ -6248,7 +6288,7 @@ class LeafLevelList {
6248
6288
  }
6249
6289
  }
6250
6290
 
6251
- const version = "1.7.0";
6291
+ const version = "1.8.0";
6252
6292
 
6253
6293
  const debug$4 = Debug.get('LeaferCanvas');
6254
6294
  class LeaferCanvas extends LeaferCanvasBase {
@@ -7120,6 +7160,11 @@ function zoomLayerType() {
7120
7160
  });
7121
7161
  };
7122
7162
  }
7163
+ function createAttr(defaultValue) {
7164
+ return (target, key) => {
7165
+ defineKey(target, key, createDescriptor(key, defaultValue));
7166
+ };
7167
+ }
7123
7168
 
7124
7169
  function hasTransparent$3(color) {
7125
7170
  if (!color || color.length === 7 || color.length === 4)
@@ -7177,22 +7222,9 @@ const emptyPaint = {};
7177
7222
  const debug$1 = Debug.get('UIData');
7178
7223
  class UIData extends LeafData {
7179
7224
  get scale() { const { scaleX, scaleY } = this; return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX; }
7180
- get __strokeWidth() {
7181
- const { strokeWidth, strokeWidthFixed } = this;
7182
- if (strokeWidthFixed) {
7183
- const ui = this.__leaf;
7184
- let { scaleX } = ui.__nowWorld || ui.__world;
7185
- if (scaleX < 0)
7186
- scaleX = -scaleX;
7187
- return scaleX > 1 ? strokeWidth / scaleX : strokeWidth;
7188
- }
7189
- else
7190
- return strokeWidth;
7191
- }
7192
- get __hasMultiPaint() {
7193
- const t = this;
7194
- return (t.fill && this.__useStroke) || (t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect;
7195
- }
7225
+ get __strokeWidth() { return this.__getRealStrokeWidth(); }
7226
+ get __maxStrokeWidth() { const t = this; return t.__hasMultiStrokeStyle ? Math.max(t.__hasMultiStrokeStyle, t.strokeWidth) : t.strokeWidth; }
7227
+ get __hasMultiPaint() { const t = this; return (t.fill && this.__useStroke) || (t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect; }
7196
7228
  get __clipAfterFill() { const t = this; return (t.cornerRadius || t.innerShadow || t.__pathInputed); }
7197
7229
  get __hasSurface() { const t = this; return (t.fill || t.stroke); }
7198
7230
  get __autoWidth() { return !this._width; }
@@ -7274,6 +7306,21 @@ class UIData extends LeafData {
7274
7306
  Paint.compute('stroke', this.__leaf);
7275
7307
  this.__needComputePaint = undefined;
7276
7308
  }
7309
+ __getRealStrokeWidth(childStyle) {
7310
+ let { strokeWidth, strokeWidthFixed } = this;
7311
+ if (childStyle) {
7312
+ if (childStyle.strokeWidth)
7313
+ strokeWidth = childStyle.strokeWidth;
7314
+ if (childStyle.strokeWidthFixed !== undefined)
7315
+ strokeWidthFixed = childStyle.strokeWidthFixed;
7316
+ }
7317
+ if (strokeWidthFixed) {
7318
+ const scale = this.__leaf.getClampRenderScale();
7319
+ return scale > 1 ? strokeWidth / scale : strokeWidth;
7320
+ }
7321
+ else
7322
+ return strokeWidth;
7323
+ }
7277
7324
  __setPaint(attrName, value) {
7278
7325
  this.__setInput(attrName, value);
7279
7326
  const layout = this.__leaf.__layout;
@@ -7298,6 +7345,7 @@ class UIData extends LeafData {
7298
7345
  }
7299
7346
  else {
7300
7347
  stintSet$2(this, '__isAlphaPixelStroke', undefined);
7348
+ stintSet$2(this, '__hasMultiStrokeStyle', undefined);
7301
7349
  this._stroke = this.__isStrokes = undefined;
7302
7350
  }
7303
7351
  }
@@ -7319,8 +7367,8 @@ class GroupData extends UIData {
7319
7367
 
7320
7368
  class BoxData extends GroupData {
7321
7369
  get __boxStroke() { return !this.__pathInputed; }
7322
- get __drawAfterFill() { const t = this; return (t.overflow === 'hide' && (t.__clipAfterFill || t.innerShadow) && t.__leaf.children.length); }
7323
- get __clipAfterFill() { return this.__leaf.isOverflow || super.__clipAfterFill; }
7370
+ get __drawAfterFill() { const t = this; return t.__single || t.__clipAfterFill; }
7371
+ get __clipAfterFill() { const t = this; return t.overflow === 'hide' && t.__leaf.children.length && (t.__leaf.isOverflow || super.__clipAfterFill); }
7324
7372
  }
7325
7373
 
7326
7374
  class LeaferData extends GroupData {
@@ -7440,7 +7488,7 @@ class CanvasData extends RectData {
7440
7488
  const UIBounds = {
7441
7489
  __updateStrokeSpread() {
7442
7490
  let width = 0, boxWidth = 0;
7443
- const data = this.__, { strokeAlign, strokeWidth } = data, box = this.__box;
7491
+ const data = this.__, { strokeAlign, __maxStrokeWidth: strokeWidth } = data, box = this.__box;
7444
7492
  if ((data.stroke || data.hitStroke === 'all') && strokeWidth && strokeAlign !== 'inside') {
7445
7493
  boxWidth = width = strokeAlign === 'center' ? strokeWidth / 2 : strokeWidth;
7446
7494
  if (!data.__boxStroke) {
@@ -7460,13 +7508,15 @@ const UIBounds = {
7460
7508
  },
7461
7509
  __updateRenderSpread() {
7462
7510
  let width = 0;
7463
- const { shadow, innerShadow, blur, backgroundBlur, filter } = this.__;
7511
+ const { shadow, innerShadow, blur, backgroundBlur, filter, renderSpread } = this.__;
7464
7512
  if (shadow)
7465
7513
  shadow.forEach(item => width = Math.max(width, Math.max(Math.abs(item.y), Math.abs(item.x)) + (item.spread > 0 ? item.spread : 0) + item.blur * 1.5));
7466
7514
  if (blur)
7467
7515
  width = Math.max(width, blur);
7468
7516
  if (filter)
7469
7517
  width += Filter.getSpread(filter);
7518
+ if (renderSpread)
7519
+ width += renderSpread;
7470
7520
  let shapeWidth = width = Math.ceil(width);
7471
7521
  if (innerShadow)
7472
7522
  innerShadow.forEach(item => shapeWidth = Math.max(shapeWidth, Math.max(Math.abs(item.y), Math.abs(item.x)) + (item.spread < 0 ? -item.spread : 0) + item.blur * 1.5));
@@ -7489,7 +7539,7 @@ const UIRender = {
7489
7539
  }
7490
7540
  if (data.__useEffect) {
7491
7541
  const { shadow, fill, stroke } = data, otherEffect = data.innerShadow || data.blur || data.backgroundBlur || data.filter;
7492
- stintSet$1(data, '__isFastShadow', shadow && !otherEffect && shadow.length < 2 && !shadow[0].spread && !(shadow[0].box && data.__isTransparentFill) && fill && !(fill instanceof Array && fill.length > 1) && (this.useFastShadow || !stroke || (stroke && data.strokeAlign === 'inside')));
7542
+ stintSet$1(data, '__isFastShadow', shadow && !otherEffect && shadow.length < 2 && !shadow[0].spread && fill && !data.__isTransparentFill && !(fill instanceof Array && fill.length > 1) && (this.useFastShadow || !stroke || (stroke && data.strokeAlign === 'inside')));
7493
7543
  data.__useEffect = !!(shadow || otherEffect);
7494
7544
  }
7495
7545
  data.__checkSingle();
@@ -7596,17 +7646,17 @@ const RectRender = {
7596
7646
  if (__drawAfterFill)
7597
7647
  this.__drawAfterFill(canvas, options);
7598
7648
  if (stroke) {
7599
- const { strokeAlign, __strokeWidth } = this.__;
7600
- if (!__strokeWidth)
7649
+ const { strokeAlign, __strokeWidth: strokeWidth } = this.__;
7650
+ if (!strokeWidth)
7601
7651
  return;
7602
- canvas.setStroke(stroke, __strokeWidth, this.__);
7603
- const half = __strokeWidth / 2;
7652
+ canvas.setStroke(stroke, strokeWidth, this.__);
7653
+ const half = strokeWidth / 2;
7604
7654
  switch (strokeAlign) {
7605
7655
  case 'center':
7606
7656
  canvas.strokeRect(0, 0, width, height);
7607
7657
  break;
7608
7658
  case 'inside':
7609
- width -= __strokeWidth, height -= __strokeWidth;
7659
+ width -= strokeWidth, height -= strokeWidth;
7610
7660
  if (width < 0 || height < 0) {
7611
7661
  canvas.save();
7612
7662
  this.__clip(canvas, options);
@@ -7617,7 +7667,7 @@ const RectRender = {
7617
7667
  canvas.strokeRect(x + half, y + half, width, height);
7618
7668
  break;
7619
7669
  case 'outside':
7620
- canvas.strokeRect(x - half, y - half, width + __strokeWidth, height + __strokeWidth);
7670
+ canvas.strokeRect(x - half, y - half, width + strokeWidth, height + strokeWidth);
7621
7671
  break;
7622
7672
  }
7623
7673
  }
@@ -7630,6 +7680,8 @@ let UI = UI_1 = class UI extends Leaf {
7630
7680
  get isFrame() { return false; }
7631
7681
  set scale(value) { MathHelper.assignScale(this, value); }
7632
7682
  get scale() { return this.__.scale; }
7683
+ get isAutoWidth() { const t = this.__; return t.__autoWidth || t.autoWidth; }
7684
+ get isAutoHeight() { const t = this.__; return t.__autoHeight || t.autoHeight; }
7633
7685
  get pen() {
7634
7686
  const { path } = this.__;
7635
7687
  pen.set(this.path = path || []);
@@ -7844,6 +7896,9 @@ __decorate([
7844
7896
  __decorate([
7845
7897
  naturalBoundsType(1)
7846
7898
  ], UI.prototype, "pixelRatio", void 0);
7899
+ __decorate([
7900
+ affectRenderBoundsType(0)
7901
+ ], UI.prototype, "renderSpread", void 0);
7847
7902
  __decorate([
7848
7903
  pathInputType()
7849
7904
  ], UI.prototype, "path", void 0);
@@ -8000,7 +8055,8 @@ let Group = class Group extends UI {
8000
8055
  }
8001
8056
  toJSON(options) {
8002
8057
  const data = super.toJSON(options);
8003
- data.children = this.children.map(child => child.toJSON(options));
8058
+ if (!this.childlessJSON)
8059
+ data.children = this.children.map(child => child.toJSON(options));
8004
8060
  return data;
8005
8061
  }
8006
8062
  pick(_hitPoint, _options) { return undefined; }
@@ -8447,8 +8503,8 @@ let Box = class Box extends Group {
8447
8503
  __updateRenderSpread() { return this.__updateRectRenderSpread() || -1; }
8448
8504
  __updateRectBoxBounds() { }
8449
8505
  __updateBoxBounds(_secondLayout) {
8450
- const data = this.__;
8451
8506
  if (this.children.length && !this.pathInputed) {
8507
+ const data = this.__;
8452
8508
  if (data.__autoSide) {
8453
8509
  if (data.__hasSurface)
8454
8510
  this.__extraUpdate();
@@ -8475,20 +8531,26 @@ let Box = class Box extends Group {
8475
8531
  __updateStrokeBounds() { }
8476
8532
  __updateRenderBounds() {
8477
8533
  let isOverflow;
8478
- const { renderBounds } = this.__layout;
8479
8534
  if (this.children.length) {
8535
+ const data = this.__, { renderBounds, boxBounds } = this.__layout;
8480
8536
  super.__updateRenderBounds();
8481
8537
  copy$2(childrenRenderBounds, renderBounds);
8482
8538
  this.__updateRectRenderBounds();
8483
- isOverflow = !includes$1(renderBounds, childrenRenderBounds);
8484
- if (isOverflow && this.__.overflow !== 'hide')
8539
+ if (data.scrollY || data.scrollX) {
8540
+ childrenRenderBounds.x += data.scrollX;
8541
+ childrenRenderBounds.y += data.scrollY;
8542
+ }
8543
+ isOverflow = !includes$1(boxBounds, childrenRenderBounds);
8544
+ if (isOverflow && data.overflow !== 'hide')
8485
8545
  add(renderBounds, childrenRenderBounds);
8486
8546
  }
8487
8547
  else
8488
8548
  this.__updateRectRenderBounds();
8489
8549
  DataHelper.stintSet(this, 'isOverflow', isOverflow);
8550
+ this.__updateScrollBar();
8490
8551
  }
8491
8552
  __updateRectRenderBounds() { }
8553
+ __updateScrollBar() { }
8492
8554
  __updateRectChange() { }
8493
8555
  __updateChange() {
8494
8556
  super.__updateChange();
@@ -8505,10 +8567,12 @@ let Box = class Box extends Group {
8505
8567
  if (this.children.length)
8506
8568
  this.__renderGroup(canvas, options);
8507
8569
  }
8570
+ if (this.scrollBar)
8571
+ this.scrollBar.__render(canvas, options);
8508
8572
  }
8509
8573
  __drawContent(canvas, options) {
8510
8574
  this.__renderGroup(canvas, options);
8511
- if (this.__.__useStroke) {
8575
+ if (this.__.__useStroke || this.__.__useEffect) {
8512
8576
  canvas.setWorld(this.__nowWorld);
8513
8577
  this.__drawRenderPath(canvas);
8514
8578
  }
@@ -9167,9 +9231,14 @@ function fills(fills, ui, canvas) {
9167
9231
  }
9168
9232
  }
9169
9233
  canvas.fillStyle = item.style;
9170
- if (item.transform) {
9234
+ if (item.transform || item.scaleFixed) {
9171
9235
  canvas.save();
9172
- canvas.transform(item.transform);
9236
+ if (item.transform)
9237
+ canvas.transform(item.transform);
9238
+ if (item.scaleFixed) {
9239
+ const { scaleX, scaleY } = ui.getRenderScaleData(true);
9240
+ canvas.scale(1 / scaleX, 1 / scaleY);
9241
+ }
9173
9242
  if (item.blendMode)
9174
9243
  canvas.blendMode = item.blendMode;
9175
9244
  fillPathOrText(ui, canvas);
@@ -9205,8 +9274,13 @@ function strokeText(stroke, ui, canvas) {
9205
9274
  }
9206
9275
  function drawCenter$1(stroke, strokeWidthScale, ui, canvas) {
9207
9276
  const data = ui.__;
9208
- canvas.setStroke(!data.__isStrokes && stroke, data.strokeWidth * strokeWidthScale, data);
9209
- data.__isStrokes ? drawStrokesStyle(stroke, true, ui, canvas) : drawTextStroke(ui, canvas);
9277
+ if (typeof stroke === 'object') {
9278
+ drawStrokesStyle(stroke, strokeWidthScale, true, ui, canvas);
9279
+ }
9280
+ else {
9281
+ canvas.setStroke(stroke, data.__strokeWidth * strokeWidthScale, data);
9282
+ drawTextStroke(ui, canvas);
9283
+ }
9210
9284
  }
9211
9285
  function drawAlign(stroke, align, ui, canvas) {
9212
9286
  const out = canvas.getSameCanvas(true, true);
@@ -9215,15 +9289,9 @@ function drawAlign(stroke, align, ui, canvas) {
9215
9289
  out.blendMode = align === 'outside' ? 'destination-out' : 'destination-in';
9216
9290
  fillText(ui, out);
9217
9291
  out.blendMode = 'normal';
9218
- copyWorld(canvas, out, ui);
9292
+ LeafHelper.copyCanvasByWorld(ui, canvas, out);
9219
9293
  out.recycle(ui.__nowWorld);
9220
9294
  }
9221
- function copyWorld(canvas, out, ui) {
9222
- if (ui.__worldFlipped || Platform.fullImageShadow)
9223
- canvas.copyWorldByReset(out, ui.__nowWorld);
9224
- else
9225
- canvas.copyWorldToInner(out, ui.__nowWorld, ui.__layout.renderBounds);
9226
- }
9227
9295
  function drawTextStroke(ui, canvas) {
9228
9296
  let row, data = ui.__.__textDrawData;
9229
9297
  const { rows, decorationY } = data;
@@ -9239,14 +9307,21 @@ function drawTextStroke(ui, canvas) {
9239
9307
  rows.forEach(row => decorationY.forEach(value => canvas.strokeRect(row.x, row.y + value, row.width, decorationHeight)));
9240
9308
  }
9241
9309
  }
9242
- function drawStrokesStyle(strokes, isText, ui, canvas) {
9310
+ function drawStrokesStyle(strokes, strokeWidthScale, isText, ui, canvas) {
9243
9311
  let item;
9312
+ const data = ui.__, { __hasMultiStrokeStyle } = data;
9313
+ __hasMultiStrokeStyle || canvas.setStroke(undefined, data.__strokeWidth * strokeWidthScale, data);
9244
9314
  for (let i = 0, len = strokes.length; i < len; i++) {
9245
9315
  item = strokes[i];
9246
9316
  if (item.image && PaintImage.checkImage(ui, canvas, item, false))
9247
9317
  continue;
9248
9318
  if (item.style) {
9249
- canvas.strokeStyle = item.style;
9319
+ if (__hasMultiStrokeStyle) {
9320
+ const { strokeStyle } = item;
9321
+ strokeStyle ? canvas.setStroke(item.style, data.__getRealStrokeWidth(strokeStyle) * strokeWidthScale, data, strokeStyle) : canvas.setStroke(item.style, data.__strokeWidth * strokeWidthScale, data);
9322
+ }
9323
+ else
9324
+ canvas.strokeStyle = item.style;
9250
9325
  if (item.blendMode) {
9251
9326
  canvas.saveBlendMode(item.blendMode);
9252
9327
  isText ? drawTextStroke(ui, canvas) : canvas.stroke();
@@ -9285,8 +9360,13 @@ function strokes(strokes, ui, canvas) {
9285
9360
  }
9286
9361
  function drawCenter(stroke, strokeWidthScale, ui, canvas) {
9287
9362
  const data = ui.__;
9288
- canvas.setStroke(!data.__isStrokes && stroke, data.__strokeWidth * strokeWidthScale, data);
9289
- data.__isStrokes ? drawStrokesStyle(stroke, false, ui, canvas) : canvas.stroke();
9363
+ if (typeof stroke === 'object') {
9364
+ drawStrokesStyle(stroke, strokeWidthScale, false, ui, canvas);
9365
+ }
9366
+ else {
9367
+ canvas.setStroke(stroke, data.__strokeWidth * strokeWidthScale, data);
9368
+ canvas.stroke();
9369
+ }
9290
9370
  if (data.__useArrow)
9291
9371
  Paint.strokeArrow(stroke, ui, canvas);
9292
9372
  }
@@ -9308,7 +9388,7 @@ function drawOutside(stroke, ui, canvas) {
9308
9388
  drawCenter(stroke, 2, ui, out);
9309
9389
  out.clipUI(data);
9310
9390
  out.clearWorld(renderBounds);
9311
- copyWorld(canvas, out, ui);
9391
+ LeafHelper.copyCanvasByWorld(ui, canvas, out);
9312
9392
  out.recycle(ui.__nowWorld);
9313
9393
  }
9314
9394
  }
@@ -9363,8 +9443,16 @@ function compute(attrName, ui) {
9363
9443
  if (!(paints instanceof Array))
9364
9444
  paints = [paints];
9365
9445
  recycleMap = PaintImage.recycleImage(attrName, data);
9446
+ let maxChildStrokeWidth;
9366
9447
  for (let i = 0, len = paints.length, item; i < len; i++) {
9367
- (item = getLeafPaint(attrName, paints[i], ui)) && leafPaints.push(item);
9448
+ if (item = getLeafPaint(attrName, paints[i], ui)) {
9449
+ leafPaints.push(item);
9450
+ if (item.strokeStyle) {
9451
+ maxChildStrokeWidth || (maxChildStrokeWidth = 1);
9452
+ if (item.strokeStyle.strokeWidth)
9453
+ maxChildStrokeWidth = Math.max(maxChildStrokeWidth, item.strokeStyle.strokeWidth);
9454
+ }
9455
+ }
9368
9456
  }
9369
9457
  data['_' + attrName] = leafPaints.length ? leafPaints : undefined;
9370
9458
  if (leafPaints.length) {
@@ -9381,6 +9469,7 @@ function compute(attrName, ui) {
9381
9469
  else {
9382
9470
  stintSet(data, '__isAlphaPixelStroke', isAlphaPixel);
9383
9471
  stintSet(data, '__isTransparentStroke', isTransparent);
9472
+ stintSet(data, '__hasMultiStrokeStyle', maxChildStrokeWidth);
9384
9473
  }
9385
9474
  }
9386
9475
  function getLeafPaint(attrName, paint, ui) {
@@ -9412,6 +9501,11 @@ function getLeafPaint(attrName, paint, ui) {
9412
9501
  if (data) {
9413
9502
  if (typeof data.style === 'string' && hasTransparent$1(data.style))
9414
9503
  data.isTransparent = true;
9504
+ if (paint.style) {
9505
+ if (paint.style.strokeWidth === 0)
9506
+ return undefined;
9507
+ data.strokeStyle = paint.style;
9508
+ }
9415
9509
  if (paint.blendMode)
9416
9510
  data.blendMode = paint.blendMode;
9417
9511
  }
@@ -9431,8 +9525,8 @@ const PaintModule = {
9431
9525
  shape
9432
9526
  };
9433
9527
 
9434
- let origin = {};
9435
- const { get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, scale: scaleHelper, rotate, skew: skewHelper } = MatrixHelper;
9528
+ let origin = {}, tempMatrix = getMatrixData();
9529
+ const { get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, multiplyParent, scale: scaleHelper, rotate, skew: skewHelper } = MatrixHelper;
9436
9530
  function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
9437
9531
  const transform = get$3();
9438
9532
  translate$1(transform, box.x + x, box.y + y);
@@ -9441,7 +9535,7 @@ function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
9441
9535
  rotateOfOuter$1(transform, { x: box.x + box.width / 2, y: box.y + box.height / 2 }, rotation);
9442
9536
  data.transform = transform;
9443
9537
  }
9444
- function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew) {
9538
+ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipSize) {
9445
9539
  const transform = get$3();
9446
9540
  if (rotation)
9447
9541
  rotate(transform, rotation);
@@ -9450,6 +9544,10 @@ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew) {
9450
9544
  if (scaleX)
9451
9545
  scaleHelper(transform, scaleX, scaleY);
9452
9546
  translate$1(transform, box.x + x, box.y + y);
9547
+ if (clipSize) {
9548
+ tempMatrix.a = box.width / clipSize.width, tempMatrix.d = box.height / clipSize.height;
9549
+ multiplyParent(transform, tempMatrix);
9550
+ }
9453
9551
  data.transform = transform;
9454
9552
  }
9455
9553
  function repeatMode(data, box, width, height, x, y, scaleX, scaleY, rotation, align) {
@@ -9486,13 +9584,15 @@ const tempBox = new Bounds();
9486
9584
  const tempScaleData = {};
9487
9585
  const tempImage = {};
9488
9586
  function createData(leafPaint, image, paint, box) {
9489
- const { changeful, sync, editing } = paint;
9587
+ const { changeful, sync, editing, scaleFixed } = paint;
9490
9588
  if (changeful)
9491
9589
  leafPaint.changeful = changeful;
9492
9590
  if (sync)
9493
9591
  leafPaint.sync = sync;
9494
9592
  if (editing)
9495
9593
  leafPaint.editing = editing;
9594
+ if (scaleFixed)
9595
+ leafPaint.scaleFixed = scaleFixed;
9496
9596
  leafPaint.data = getPatternData(paint, box, image);
9497
9597
  }
9498
9598
  function getPatternData(paint, box, image) {
@@ -9501,7 +9601,7 @@ function getPatternData(paint, box, image) {
9501
9601
  if (paint.mode === 'strench')
9502
9602
  paint.mode = 'stretch';
9503
9603
  let { width, height } = image;
9504
- const { opacity, mode, align, offset, scale, size, rotation, skew, repeat, filters } = paint;
9604
+ const { opacity, mode, align, offset, scale, size, rotation, skew, clipSize, repeat, filters } = paint;
9505
9605
  const sameBox = box.width === width && box.height === height;
9506
9606
  const data = { mode };
9507
9607
  const swapSize = align !== 'center' && (rotation || 0) % 180 === 90;
@@ -9535,8 +9635,8 @@ function getPatternData(paint, box, image) {
9535
9635
  break;
9536
9636
  case 'normal':
9537
9637
  case 'clip':
9538
- if (tempImage.x || tempImage.y || scaleX || rotation || skew)
9539
- clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew);
9638
+ if (tempImage.x || tempImage.y || scaleX || clipSize || rotation || skew)
9639
+ clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, paint.clipSize);
9540
9640
  break;
9541
9641
  case 'repeat':
9542
9642
  if (!sameBox || scaleX || rotation)
@@ -9673,18 +9773,16 @@ function ignoreRender(ui, value) {
9673
9773
  }
9674
9774
 
9675
9775
  const { get: get$1, scale, copy: copy$1 } = MatrixHelper;
9676
- const { ceil, abs: abs$1 } = Math;
9776
+ const { ceil, abs } = Math;
9677
9777
  function createPattern(ui, paint, pixelRatio) {
9678
- let { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9778
+ let { scaleX, scaleY } = ui.getRenderScaleData(true, paint.scaleFixed);
9679
9779
  const id = scaleX + '-' + scaleY + '-' + pixelRatio;
9680
9780
  if (paint.patternId !== id && !ui.destroyed) {
9681
- scaleX = abs$1(scaleX);
9682
- scaleY = abs$1(scaleY);
9683
9781
  const { image, data } = paint;
9684
9782
  let imageScale, imageMatrix, { width, height, scaleX: sx, scaleY: sy, transform, repeat } = data;
9685
9783
  if (sx) {
9686
- sx = abs$1(sx);
9687
- sy = abs$1(sy);
9784
+ sx = abs(sx);
9785
+ sy = abs(sy);
9688
9786
  imageMatrix = get$1();
9689
9787
  copy$1(imageMatrix, transform);
9690
9788
  scale(imageMatrix, 1 / sx, 1 / sy);
@@ -9737,9 +9835,8 @@ function createPattern(ui, paint, pixelRatio) {
9737
9835
  }
9738
9836
  }
9739
9837
 
9740
- const { abs } = Math;
9741
9838
  function checkImage(ui, canvas, paint, allowDraw) {
9742
- const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9839
+ const { scaleX, scaleY } = ui.getRenderScaleData(true, paint.scaleFixed);
9743
9840
  const { pixelRatio } = canvas, { data } = paint;
9744
9841
  if (!data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
9745
9842
  return false;
@@ -9752,8 +9849,8 @@ function checkImage(ui, canvas, paint, allowDraw) {
9752
9849
  else {
9753
9850
  if (!(paint.changeful || ResizeEvent.isResizing(ui) || Export.running)) {
9754
9851
  let { width, height } = data;
9755
- width *= abs(scaleX) * pixelRatio;
9756
- height *= abs(scaleY) * pixelRatio;
9852
+ width *= scaleX * pixelRatio;
9853
+ height *= scaleY * pixelRatio;
9757
9854
  if (data.scaleX) {
9758
9855
  width *= data.scaleX;
9759
9856
  height *= data.scaleY;
@@ -9763,6 +9860,10 @@ function checkImage(ui, canvas, paint, allowDraw) {
9763
9860
  }
9764
9861
  }
9765
9862
  if (allowDraw) {
9863
+ if (ui.__.__isFastShadow) {
9864
+ canvas.fillStyle = paint.style || '#000';
9865
+ canvas.fill();
9866
+ }
9766
9867
  drawImage(ui, canvas, paint, data);
9767
9868
  return true;
9768
9869
  }
@@ -9951,10 +10052,7 @@ function shadow(ui, current, shape) {
9951
10052
  }
9952
10053
  worldCanvas ? other.copyWorld(worldCanvas, nowWorld, nowWorld, 'destination-out') : other.copyWorld(shape.canvas, shapeBounds, bounds, 'destination-out');
9953
10054
  }
9954
- if (ui.__worldFlipped)
9955
- current.copyWorldByReset(other, copyBounds, nowWorld, item.blendMode);
9956
- else
9957
- current.copyWorldToInner(other, copyBounds, __layout.renderBounds, item.blendMode);
10055
+ LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
9958
10056
  if (end && index < end)
9959
10057
  other.clearWorld(copyBounds, true);
9960
10058
  });
@@ -10013,10 +10111,7 @@ function innerShadow(ui, current, shape) {
10013
10111
  copyBounds = bounds;
10014
10112
  }
10015
10113
  other.fillWorld(copyBounds, ColorConvert.string(item.color), 'source-in');
10016
- if (ui.__worldFlipped)
10017
- current.copyWorldByReset(other, copyBounds, nowWorld, item.blendMode);
10018
- else
10019
- current.copyWorldToInner(other, copyBounds, __layout.renderBounds, item.blendMode);
10114
+ LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
10020
10115
  if (end && index < end)
10021
10116
  other.clearWorld(copyBounds, true);
10022
10117
  });
@@ -10072,12 +10167,11 @@ Group.prototype.__renderMask = function (canvas, options) {
10072
10167
  contentCanvas = getCanvas(canvas);
10073
10168
  child.__render(maskCanvas, options);
10074
10169
  }
10075
- if (!(mask === 'clipping' || mask === 'clipping-path'))
10076
- continue;
10077
- }
10078
- if (excludeRenderBounds(child, options))
10170
+ if (mask === 'clipping' || mask === 'clipping-path')
10171
+ excludeRenderBounds(child, options) || child.__render(canvas, options);
10079
10172
  continue;
10080
- child.__render(contentCanvas || canvas, options);
10173
+ }
10174
+ excludeRenderBounds(child, options) || child.__render(contentCanvas || canvas, options);
10081
10175
  }
10082
10176
  maskEnd(this, currentMask, canvas, contentCanvas, maskCanvas, maskOpacity);
10083
10177
  };
@@ -10659,4 +10753,4 @@ Object.assign(Effect, EffectModule);
10659
10753
 
10660
10754
  useCanvas();
10661
10755
 
10662
- 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, Frame, FrameData, Group, GroupData, Image$1 as 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, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, 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, WaitHelper, WatchEvent, Watcher, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, doBoundsType, doStrokeType, effectType, emptyData, eraserType, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isEmptyData, isNull, layoutProcessor, maskType, naturalBoundsType, opacityType, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, sortType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix, tempPoint$2 as tempPoint, useCanvas, useModule, version, visibleType, zoomLayerType };
10756
+ 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, Frame, FrameData, Group, GroupData, Image$1 as 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, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, 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, WaitHelper, WatchEvent, Watcher, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, createAttr, createDescriptor, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, doBoundsType, doStrokeType, effectType, emptyData, eraserType, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isEmptyData, isNull, layoutProcessor, maskType, naturalBoundsType, opacityType, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, sortType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix$1 as tempMatrix, tempPoint$2 as tempPoint, useCanvas, useModule, version, visibleType, zoomLayerType };