leafer-ui 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$9, multiplyParent: multiplyParent$3 } = MatrixHelper, { round: round$1 } = Math;
2079
+ const { copy: copy$9, 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$7, toInnerPoint: toInnerPoint$1, toOuterPoint: toOuterPoint$1, scaleOfOuter: scaleOfOuter$2, rotateOfOuter: rotateOfOuter$2, skewOfOuter, multiplyParent: multiplyParent$2, divideParent, getLayout } = MatrixHelper;
4289
+ const { copy: copy$7, toInnerPoint: toInnerPoint$1, toOuterPoint: toOuterPoint$1, scaleOfOuter: scaleOfOuter$2, rotateOfOuter: rotateOfOuter$2, skewOfOuter, multiplyParent: multiplyParent$3, divideParent, getLayout } = MatrixHelper;
4269
4290
  const matrix$1 = {}, { 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$7(matrix$1, t.worldTransform);
4399
- multiplyParent$2(matrix$1, transform);
4428
+ multiplyParent$3(matrix$1, transform);
4400
4429
  if (t.parent)
4401
4430
  divideParent(matrix$1, t.parent.worldTransform);
4402
4431
  L.setTransform(t, matrix$1, resize, transition);
4403
4432
  },
4404
4433
  transform(t, transform, resize, transition) {
4405
4434
  copy$7(matrix$1, t.localTransform);
4406
- multiplyParent$2(matrix$1, transform);
4435
+ multiplyParent$3(matrix$1, transform);
4407
4436
  L.setTransform(t, matrix$1, 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$4, 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$5 = Debug.get('LeaferCanvas');
6254
6294
  class LeaferCanvas extends LeaferCanvasBase {
@@ -7277,6 +7317,11 @@ function zoomLayerType() {
7277
7317
  });
7278
7318
  };
7279
7319
  }
7320
+ function createAttr(defaultValue) {
7321
+ return (target, key) => {
7322
+ defineKey(target, key, createDescriptor(key, defaultValue));
7323
+ };
7324
+ }
7280
7325
 
7281
7326
  function hasTransparent$3(color) {
7282
7327
  if (!color || color.length === 7 || color.length === 4)
@@ -7334,22 +7379,9 @@ const emptyPaint = {};
7334
7379
  const debug$2 = Debug.get('UIData');
7335
7380
  class UIData extends LeafData {
7336
7381
  get scale() { const { scaleX, scaleY } = this; return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX; }
7337
- get __strokeWidth() {
7338
- const { strokeWidth, strokeWidthFixed } = this;
7339
- if (strokeWidthFixed) {
7340
- const ui = this.__leaf;
7341
- let { scaleX } = ui.__nowWorld || ui.__world;
7342
- if (scaleX < 0)
7343
- scaleX = -scaleX;
7344
- return scaleX > 1 ? strokeWidth / scaleX : strokeWidth;
7345
- }
7346
- else
7347
- return strokeWidth;
7348
- }
7349
- get __hasMultiPaint() {
7350
- const t = this;
7351
- return (t.fill && this.__useStroke) || (t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect;
7352
- }
7382
+ get __strokeWidth() { return this.__getRealStrokeWidth(); }
7383
+ get __maxStrokeWidth() { const t = this; return t.__hasMultiStrokeStyle ? Math.max(t.__hasMultiStrokeStyle, t.strokeWidth) : t.strokeWidth; }
7384
+ get __hasMultiPaint() { const t = this; return (t.fill && this.__useStroke) || (t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect; }
7353
7385
  get __clipAfterFill() { const t = this; return (t.cornerRadius || t.innerShadow || t.__pathInputed); }
7354
7386
  get __hasSurface() { const t = this; return (t.fill || t.stroke); }
7355
7387
  get __autoWidth() { return !this._width; }
@@ -7431,6 +7463,21 @@ class UIData extends LeafData {
7431
7463
  Paint.compute('stroke', this.__leaf);
7432
7464
  this.__needComputePaint = undefined;
7433
7465
  }
7466
+ __getRealStrokeWidth(childStyle) {
7467
+ let { strokeWidth, strokeWidthFixed } = this;
7468
+ if (childStyle) {
7469
+ if (childStyle.strokeWidth)
7470
+ strokeWidth = childStyle.strokeWidth;
7471
+ if (childStyle.strokeWidthFixed !== undefined)
7472
+ strokeWidthFixed = childStyle.strokeWidthFixed;
7473
+ }
7474
+ if (strokeWidthFixed) {
7475
+ const scale = this.__leaf.getClampRenderScale();
7476
+ return scale > 1 ? strokeWidth / scale : strokeWidth;
7477
+ }
7478
+ else
7479
+ return strokeWidth;
7480
+ }
7434
7481
  __setPaint(attrName, value) {
7435
7482
  this.__setInput(attrName, value);
7436
7483
  const layout = this.__leaf.__layout;
@@ -7455,6 +7502,7 @@ class UIData extends LeafData {
7455
7502
  }
7456
7503
  else {
7457
7504
  stintSet$2(this, '__isAlphaPixelStroke', undefined);
7505
+ stintSet$2(this, '__hasMultiStrokeStyle', undefined);
7458
7506
  this._stroke = this.__isStrokes = undefined;
7459
7507
  }
7460
7508
  }
@@ -7476,8 +7524,8 @@ class GroupData extends UIData {
7476
7524
 
7477
7525
  class BoxData extends GroupData {
7478
7526
  get __boxStroke() { return !this.__pathInputed; }
7479
- get __drawAfterFill() { const t = this; return (t.overflow === 'hide' && (t.__clipAfterFill || t.innerShadow) && t.__leaf.children.length); }
7480
- get __clipAfterFill() { return this.__leaf.isOverflow || super.__clipAfterFill; }
7527
+ get __drawAfterFill() { const t = this; return t.__single || t.__clipAfterFill; }
7528
+ get __clipAfterFill() { const t = this; return t.overflow === 'hide' && t.__leaf.children.length && (t.__leaf.isOverflow || super.__clipAfterFill); }
7481
7529
  }
7482
7530
 
7483
7531
  class LeaferData extends GroupData {
@@ -7597,7 +7645,7 @@ class CanvasData extends RectData {
7597
7645
  const UIBounds = {
7598
7646
  __updateStrokeSpread() {
7599
7647
  let width = 0, boxWidth = 0;
7600
- const data = this.__, { strokeAlign, strokeWidth } = data, box = this.__box;
7648
+ const data = this.__, { strokeAlign, __maxStrokeWidth: strokeWidth } = data, box = this.__box;
7601
7649
  if ((data.stroke || data.hitStroke === 'all') && strokeWidth && strokeAlign !== 'inside') {
7602
7650
  boxWidth = width = strokeAlign === 'center' ? strokeWidth / 2 : strokeWidth;
7603
7651
  if (!data.__boxStroke) {
@@ -7617,13 +7665,15 @@ const UIBounds = {
7617
7665
  },
7618
7666
  __updateRenderSpread() {
7619
7667
  let width = 0;
7620
- const { shadow, innerShadow, blur, backgroundBlur, filter } = this.__;
7668
+ const { shadow, innerShadow, blur, backgroundBlur, filter, renderSpread } = this.__;
7621
7669
  if (shadow)
7622
7670
  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));
7623
7671
  if (blur)
7624
7672
  width = Math.max(width, blur);
7625
7673
  if (filter)
7626
7674
  width += Filter.getSpread(filter);
7675
+ if (renderSpread)
7676
+ width += renderSpread;
7627
7677
  let shapeWidth = width = Math.ceil(width);
7628
7678
  if (innerShadow)
7629
7679
  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));
@@ -7646,7 +7696,7 @@ const UIRender = {
7646
7696
  }
7647
7697
  if (data.__useEffect) {
7648
7698
  const { shadow, fill, stroke } = data, otherEffect = data.innerShadow || data.blur || data.backgroundBlur || data.filter;
7649
- 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')));
7699
+ 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')));
7650
7700
  data.__useEffect = !!(shadow || otherEffect);
7651
7701
  }
7652
7702
  data.__checkSingle();
@@ -7753,17 +7803,17 @@ const RectRender = {
7753
7803
  if (__drawAfterFill)
7754
7804
  this.__drawAfterFill(canvas, options);
7755
7805
  if (stroke) {
7756
- const { strokeAlign, __strokeWidth } = this.__;
7757
- if (!__strokeWidth)
7806
+ const { strokeAlign, __strokeWidth: strokeWidth } = this.__;
7807
+ if (!strokeWidth)
7758
7808
  return;
7759
- canvas.setStroke(stroke, __strokeWidth, this.__);
7760
- const half = __strokeWidth / 2;
7809
+ canvas.setStroke(stroke, strokeWidth, this.__);
7810
+ const half = strokeWidth / 2;
7761
7811
  switch (strokeAlign) {
7762
7812
  case 'center':
7763
7813
  canvas.strokeRect(0, 0, width, height);
7764
7814
  break;
7765
7815
  case 'inside':
7766
- width -= __strokeWidth, height -= __strokeWidth;
7816
+ width -= strokeWidth, height -= strokeWidth;
7767
7817
  if (width < 0 || height < 0) {
7768
7818
  canvas.save();
7769
7819
  this.__clip(canvas, options);
@@ -7774,7 +7824,7 @@ const RectRender = {
7774
7824
  canvas.strokeRect(x + half, y + half, width, height);
7775
7825
  break;
7776
7826
  case 'outside':
7777
- canvas.strokeRect(x - half, y - half, width + __strokeWidth, height + __strokeWidth);
7827
+ canvas.strokeRect(x - half, y - half, width + strokeWidth, height + strokeWidth);
7778
7828
  break;
7779
7829
  }
7780
7830
  }
@@ -7787,6 +7837,8 @@ let UI = UI_1 = class UI extends Leaf {
7787
7837
  get isFrame() { return false; }
7788
7838
  set scale(value) { MathHelper.assignScale(this, value); }
7789
7839
  get scale() { return this.__.scale; }
7840
+ get isAutoWidth() { const t = this.__; return t.__autoWidth || t.autoWidth; }
7841
+ get isAutoHeight() { const t = this.__; return t.__autoHeight || t.autoHeight; }
7790
7842
  get pen() {
7791
7843
  const { path } = this.__;
7792
7844
  pen.set(this.path = path || []);
@@ -8001,6 +8053,9 @@ __decorate([
8001
8053
  __decorate([
8002
8054
  naturalBoundsType(1)
8003
8055
  ], UI.prototype, "pixelRatio", void 0);
8056
+ __decorate([
8057
+ affectRenderBoundsType(0)
8058
+ ], UI.prototype, "renderSpread", void 0);
8004
8059
  __decorate([
8005
8060
  pathInputType()
8006
8061
  ], UI.prototype, "path", void 0);
@@ -8157,7 +8212,8 @@ let Group = class Group extends UI {
8157
8212
  }
8158
8213
  toJSON(options) {
8159
8214
  const data = super.toJSON(options);
8160
- data.children = this.children.map(child => child.toJSON(options));
8215
+ if (!this.childlessJSON)
8216
+ data.children = this.children.map(child => child.toJSON(options));
8161
8217
  return data;
8162
8218
  }
8163
8219
  pick(_hitPoint, _options) { return undefined; }
@@ -8604,8 +8660,8 @@ let Box = class Box extends Group {
8604
8660
  __updateRenderSpread() { return this.__updateRectRenderSpread() || -1; }
8605
8661
  __updateRectBoxBounds() { }
8606
8662
  __updateBoxBounds(_secondLayout) {
8607
- const data = this.__;
8608
8663
  if (this.children.length && !this.pathInputed) {
8664
+ const data = this.__;
8609
8665
  if (data.__autoSide) {
8610
8666
  if (data.__hasSurface)
8611
8667
  this.__extraUpdate();
@@ -8632,20 +8688,26 @@ let Box = class Box extends Group {
8632
8688
  __updateStrokeBounds() { }
8633
8689
  __updateRenderBounds() {
8634
8690
  let isOverflow;
8635
- const { renderBounds } = this.__layout;
8636
8691
  if (this.children.length) {
8692
+ const data = this.__, { renderBounds, boxBounds } = this.__layout;
8637
8693
  super.__updateRenderBounds();
8638
8694
  copy$3(childrenRenderBounds, renderBounds);
8639
8695
  this.__updateRectRenderBounds();
8640
- isOverflow = !includes$1(renderBounds, childrenRenderBounds);
8641
- if (isOverflow && this.__.overflow !== 'hide')
8696
+ if (data.scrollY || data.scrollX) {
8697
+ childrenRenderBounds.x += data.scrollX;
8698
+ childrenRenderBounds.y += data.scrollY;
8699
+ }
8700
+ isOverflow = !includes$1(boxBounds, childrenRenderBounds);
8701
+ if (isOverflow && data.overflow !== 'hide')
8642
8702
  add(renderBounds, childrenRenderBounds);
8643
8703
  }
8644
8704
  else
8645
8705
  this.__updateRectRenderBounds();
8646
8706
  DataHelper.stintSet(this, 'isOverflow', isOverflow);
8707
+ this.__updateScrollBar();
8647
8708
  }
8648
8709
  __updateRectRenderBounds() { }
8710
+ __updateScrollBar() { }
8649
8711
  __updateRectChange() { }
8650
8712
  __updateChange() {
8651
8713
  super.__updateChange();
@@ -8662,10 +8724,12 @@ let Box = class Box extends Group {
8662
8724
  if (this.children.length)
8663
8725
  this.__renderGroup(canvas, options);
8664
8726
  }
8727
+ if (this.scrollBar)
8728
+ this.scrollBar.__render(canvas, options);
8665
8729
  }
8666
8730
  __drawContent(canvas, options) {
8667
8731
  this.__renderGroup(canvas, options);
8668
- if (this.__.__useStroke) {
8732
+ if (this.__.__useStroke || this.__.__useEffect) {
8669
8733
  canvas.setWorld(this.__nowWorld);
8670
8734
  this.__drawRenderPath(canvas);
8671
8735
  }
@@ -10468,18 +10532,20 @@ leaf.__hitWorld = function (point) {
10468
10532
  }
10469
10533
  return this.__hit(inner);
10470
10534
  };
10471
- leaf.__hitFill = function (inner) { var _a; return (_a = this.__hitCanvas) === null || _a === void 0 ? void 0 : _a.hitFill(inner, this.__.windingRule); };
10472
- leaf.__hitStroke = function (inner, strokeWidth) { var _a; return (_a = this.__hitCanvas) === null || _a === void 0 ? void 0 : _a.hitStroke(inner, strokeWidth); };
10473
- leaf.__hitPixel = function (inner) { var _a; return (_a = this.__hitCanvas) === null || _a === void 0 ? void 0 : _a.hitPixel(inner, this.__layout.renderBounds, this.__hitCanvas.hitScale); };
10474
- leaf.__drawHitPath = function (canvas) { if (canvas)
10475
- this.__drawRenderPath(canvas); };
10535
+ leaf.__hitFill = function (inner) { const h = this.__hitCanvas; return h && h.hitFill(inner, this.__.windingRule); };
10536
+ leaf.__hitStroke = function (inner, strokeWidth) { const h = this.__hitCanvas; return h && h.hitStroke(inner, strokeWidth); };
10537
+ leaf.__hitPixel = function (inner) { const h = this.__hitCanvas; return h && h.hitPixel(inner, this.__layout.renderBounds, h.hitScale); };
10538
+ leaf.__drawHitPath = function (canvas) { canvas && this.__drawRenderPath(canvas); };
10476
10539
 
10477
10540
  const matrix = new Matrix();
10478
10541
  const ui$1 = UI.prototype;
10479
10542
  ui$1.__updateHitCanvas = function () {
10480
10543
  if (this.__box)
10481
10544
  this.__box.__updateHitCanvas();
10482
- const data = this.__, { hitCanvasManager } = this.leafer || this.parent.leafer;
10545
+ const leafer = this.leafer || (this.parent && this.parent.leafer);
10546
+ if (!leafer)
10547
+ return;
10548
+ const data = this.__, { hitCanvasManager } = leafer;
10483
10549
  const isHitPixelFill = (data.__isAlphaPixelFill || data.__isCanvas) && data.hitFill === 'pixel';
10484
10550
  const isHitPixelStroke = data.__isAlphaPixelStroke && data.hitStroke === 'pixel';
10485
10551
  const isHitPixel = isHitPixelFill || isHitPixelStroke;
@@ -10515,7 +10581,7 @@ ui$1.__hit = function (inner) {
10515
10581
  const needHitFillPath = ((data.fill || data.__isCanvas) && (hitFill === 'path' || (hitFill === 'pixel' && !(data.__isAlphaPixelFill || data.__isCanvas)))) || hitFill === 'all';
10516
10582
  if (needHitFillPath && this.__hitFill(inner))
10517
10583
  return true;
10518
- const { hitStroke, __strokeWidth } = data;
10584
+ const { hitStroke, __maxStrokeWidth: strokeWidth } = data;
10519
10585
  const needHitStrokePath = (data.stroke && (hitStroke === 'path' || (hitStroke === 'pixel' && !data.__isAlphaPixelStroke))) || hitStroke === 'all';
10520
10586
  if (!needHitFillPath && !needHitStrokePath)
10521
10587
  return false;
@@ -10524,16 +10590,16 @@ ui$1.__hit = function (inner) {
10524
10590
  if (needHitStrokePath) {
10525
10591
  switch (data.strokeAlign) {
10526
10592
  case 'inside':
10527
- hitWidth += __strokeWidth * 2;
10593
+ hitWidth += strokeWidth * 2;
10528
10594
  if (!needHitFillPath && this.__hitFill(inner) && this.__hitStroke(inner, hitWidth))
10529
10595
  return true;
10530
10596
  hitWidth = radiusWidth;
10531
10597
  break;
10532
10598
  case 'center':
10533
- hitWidth += __strokeWidth;
10599
+ hitWidth += strokeWidth;
10534
10600
  break;
10535
10601
  case 'outside':
10536
- hitWidth += __strokeWidth * 2;
10602
+ hitWidth += strokeWidth * 2;
10537
10603
  if (!needHitFillPath) {
10538
10604
  if (!this.__hitFill(inner) && this.__hitStroke(inner, hitWidth))
10539
10605
  return true;
@@ -10945,9 +11011,14 @@ function fills(fills, ui, canvas) {
10945
11011
  }
10946
11012
  }
10947
11013
  canvas.fillStyle = item.style;
10948
- if (item.transform) {
11014
+ if (item.transform || item.scaleFixed) {
10949
11015
  canvas.save();
10950
- canvas.transform(item.transform);
11016
+ if (item.transform)
11017
+ canvas.transform(item.transform);
11018
+ if (item.scaleFixed) {
11019
+ const { scaleX, scaleY } = ui.getRenderScaleData(true);
11020
+ canvas.scale(1 / scaleX, 1 / scaleY);
11021
+ }
10951
11022
  if (item.blendMode)
10952
11023
  canvas.blendMode = item.blendMode;
10953
11024
  fillPathOrText(ui, canvas);
@@ -10983,8 +11054,13 @@ function strokeText(stroke, ui, canvas) {
10983
11054
  }
10984
11055
  function drawCenter$1(stroke, strokeWidthScale, ui, canvas) {
10985
11056
  const data = ui.__;
10986
- canvas.setStroke(!data.__isStrokes && stroke, data.strokeWidth * strokeWidthScale, data);
10987
- data.__isStrokes ? drawStrokesStyle(stroke, true, ui, canvas) : drawTextStroke(ui, canvas);
11057
+ if (typeof stroke === 'object') {
11058
+ drawStrokesStyle(stroke, strokeWidthScale, true, ui, canvas);
11059
+ }
11060
+ else {
11061
+ canvas.setStroke(stroke, data.__strokeWidth * strokeWidthScale, data);
11062
+ drawTextStroke(ui, canvas);
11063
+ }
10988
11064
  }
10989
11065
  function drawAlign(stroke, align, ui, canvas) {
10990
11066
  const out = canvas.getSameCanvas(true, true);
@@ -10993,15 +11069,9 @@ function drawAlign(stroke, align, ui, canvas) {
10993
11069
  out.blendMode = align === 'outside' ? 'destination-out' : 'destination-in';
10994
11070
  fillText(ui, out);
10995
11071
  out.blendMode = 'normal';
10996
- copyWorld(canvas, out, ui);
11072
+ LeafHelper.copyCanvasByWorld(ui, canvas, out);
10997
11073
  out.recycle(ui.__nowWorld);
10998
11074
  }
10999
- function copyWorld(canvas, out, ui) {
11000
- if (ui.__worldFlipped || Platform.fullImageShadow)
11001
- canvas.copyWorldByReset(out, ui.__nowWorld);
11002
- else
11003
- canvas.copyWorldToInner(out, ui.__nowWorld, ui.__layout.renderBounds);
11004
- }
11005
11075
  function drawTextStroke(ui, canvas) {
11006
11076
  let row, data = ui.__.__textDrawData;
11007
11077
  const { rows, decorationY } = data;
@@ -11017,14 +11087,21 @@ function drawTextStroke(ui, canvas) {
11017
11087
  rows.forEach(row => decorationY.forEach(value => canvas.strokeRect(row.x, row.y + value, row.width, decorationHeight)));
11018
11088
  }
11019
11089
  }
11020
- function drawStrokesStyle(strokes, isText, ui, canvas) {
11090
+ function drawStrokesStyle(strokes, strokeWidthScale, isText, ui, canvas) {
11021
11091
  let item;
11092
+ const data = ui.__, { __hasMultiStrokeStyle } = data;
11093
+ __hasMultiStrokeStyle || canvas.setStroke(undefined, data.__strokeWidth * strokeWidthScale, data);
11022
11094
  for (let i = 0, len = strokes.length; i < len; i++) {
11023
11095
  item = strokes[i];
11024
11096
  if (item.image && PaintImage.checkImage(ui, canvas, item, false))
11025
11097
  continue;
11026
11098
  if (item.style) {
11027
- canvas.strokeStyle = item.style;
11099
+ if (__hasMultiStrokeStyle) {
11100
+ const { strokeStyle } = item;
11101
+ strokeStyle ? canvas.setStroke(item.style, data.__getRealStrokeWidth(strokeStyle) * strokeWidthScale, data, strokeStyle) : canvas.setStroke(item.style, data.__strokeWidth * strokeWidthScale, data);
11102
+ }
11103
+ else
11104
+ canvas.strokeStyle = item.style;
11028
11105
  if (item.blendMode) {
11029
11106
  canvas.saveBlendMode(item.blendMode);
11030
11107
  isText ? drawTextStroke(ui, canvas) : canvas.stroke();
@@ -11063,8 +11140,13 @@ function strokes(strokes, ui, canvas) {
11063
11140
  }
11064
11141
  function drawCenter(stroke, strokeWidthScale, ui, canvas) {
11065
11142
  const data = ui.__;
11066
- canvas.setStroke(!data.__isStrokes && stroke, data.__strokeWidth * strokeWidthScale, data);
11067
- data.__isStrokes ? drawStrokesStyle(stroke, false, ui, canvas) : canvas.stroke();
11143
+ if (typeof stroke === 'object') {
11144
+ drawStrokesStyle(stroke, strokeWidthScale, false, ui, canvas);
11145
+ }
11146
+ else {
11147
+ canvas.setStroke(stroke, data.__strokeWidth * strokeWidthScale, data);
11148
+ canvas.stroke();
11149
+ }
11068
11150
  if (data.__useArrow)
11069
11151
  Paint.strokeArrow(stroke, ui, canvas);
11070
11152
  }
@@ -11086,7 +11168,7 @@ function drawOutside(stroke, ui, canvas) {
11086
11168
  drawCenter(stroke, 2, ui, out);
11087
11169
  out.clipUI(data);
11088
11170
  out.clearWorld(renderBounds);
11089
- copyWorld(canvas, out, ui);
11171
+ LeafHelper.copyCanvasByWorld(ui, canvas, out);
11090
11172
  out.recycle(ui.__nowWorld);
11091
11173
  }
11092
11174
  }
@@ -11141,8 +11223,16 @@ function compute(attrName, ui) {
11141
11223
  if (!(paints instanceof Array))
11142
11224
  paints = [paints];
11143
11225
  recycleMap = PaintImage.recycleImage(attrName, data);
11226
+ let maxChildStrokeWidth;
11144
11227
  for (let i = 0, len = paints.length, item; i < len; i++) {
11145
- (item = getLeafPaint(attrName, paints[i], ui)) && leafPaints.push(item);
11228
+ if (item = getLeafPaint(attrName, paints[i], ui)) {
11229
+ leafPaints.push(item);
11230
+ if (item.strokeStyle) {
11231
+ maxChildStrokeWidth || (maxChildStrokeWidth = 1);
11232
+ if (item.strokeStyle.strokeWidth)
11233
+ maxChildStrokeWidth = Math.max(maxChildStrokeWidth, item.strokeStyle.strokeWidth);
11234
+ }
11235
+ }
11146
11236
  }
11147
11237
  data['_' + attrName] = leafPaints.length ? leafPaints : undefined;
11148
11238
  if (leafPaints.length) {
@@ -11159,6 +11249,7 @@ function compute(attrName, ui) {
11159
11249
  else {
11160
11250
  stintSet(data, '__isAlphaPixelStroke', isAlphaPixel);
11161
11251
  stintSet(data, '__isTransparentStroke', isTransparent);
11252
+ stintSet(data, '__hasMultiStrokeStyle', maxChildStrokeWidth);
11162
11253
  }
11163
11254
  }
11164
11255
  function getLeafPaint(attrName, paint, ui) {
@@ -11190,6 +11281,11 @@ function getLeafPaint(attrName, paint, ui) {
11190
11281
  if (data) {
11191
11282
  if (typeof data.style === 'string' && hasTransparent$1(data.style))
11192
11283
  data.isTransparent = true;
11284
+ if (paint.style) {
11285
+ if (paint.style.strokeWidth === 0)
11286
+ return undefined;
11287
+ data.strokeStyle = paint.style;
11288
+ }
11193
11289
  if (paint.blendMode)
11194
11290
  data.blendMode = paint.blendMode;
11195
11291
  }
@@ -11209,8 +11305,8 @@ const PaintModule = {
11209
11305
  shape
11210
11306
  };
11211
11307
 
11212
- let origin = {};
11213
- const { get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, scale: scaleHelper, rotate, skew: skewHelper } = MatrixHelper;
11308
+ let origin = {}, tempMatrix = getMatrixData();
11309
+ const { get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, multiplyParent, scale: scaleHelper, rotate, skew: skewHelper } = MatrixHelper;
11214
11310
  function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
11215
11311
  const transform = get$3();
11216
11312
  translate$1(transform, box.x + x, box.y + y);
@@ -11219,7 +11315,7 @@ function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
11219
11315
  rotateOfOuter$1(transform, { x: box.x + box.width / 2, y: box.y + box.height / 2 }, rotation);
11220
11316
  data.transform = transform;
11221
11317
  }
11222
- function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew) {
11318
+ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipSize) {
11223
11319
  const transform = get$3();
11224
11320
  if (rotation)
11225
11321
  rotate(transform, rotation);
@@ -11228,6 +11324,10 @@ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew) {
11228
11324
  if (scaleX)
11229
11325
  scaleHelper(transform, scaleX, scaleY);
11230
11326
  translate$1(transform, box.x + x, box.y + y);
11327
+ if (clipSize) {
11328
+ tempMatrix.a = box.width / clipSize.width, tempMatrix.d = box.height / clipSize.height;
11329
+ multiplyParent(transform, tempMatrix);
11330
+ }
11231
11331
  data.transform = transform;
11232
11332
  }
11233
11333
  function repeatMode(data, box, width, height, x, y, scaleX, scaleY, rotation, align) {
@@ -11264,13 +11364,15 @@ const tempBox = new Bounds();
11264
11364
  const tempScaleData = {};
11265
11365
  const tempImage = {};
11266
11366
  function createData(leafPaint, image, paint, box) {
11267
- const { changeful, sync, editing } = paint;
11367
+ const { changeful, sync, editing, scaleFixed } = paint;
11268
11368
  if (changeful)
11269
11369
  leafPaint.changeful = changeful;
11270
11370
  if (sync)
11271
11371
  leafPaint.sync = sync;
11272
11372
  if (editing)
11273
11373
  leafPaint.editing = editing;
11374
+ if (scaleFixed)
11375
+ leafPaint.scaleFixed = scaleFixed;
11274
11376
  leafPaint.data = getPatternData(paint, box, image);
11275
11377
  }
11276
11378
  function getPatternData(paint, box, image) {
@@ -11279,7 +11381,7 @@ function getPatternData(paint, box, image) {
11279
11381
  if (paint.mode === 'strench')
11280
11382
  paint.mode = 'stretch';
11281
11383
  let { width, height } = image;
11282
- const { opacity, mode, align, offset, scale, size, rotation, skew, repeat, filters } = paint;
11384
+ const { opacity, mode, align, offset, scale, size, rotation, skew, clipSize, repeat, filters } = paint;
11283
11385
  const sameBox = box.width === width && box.height === height;
11284
11386
  const data = { mode };
11285
11387
  const swapSize = align !== 'center' && (rotation || 0) % 180 === 90;
@@ -11313,8 +11415,8 @@ function getPatternData(paint, box, image) {
11313
11415
  break;
11314
11416
  case 'normal':
11315
11417
  case 'clip':
11316
- if (tempImage.x || tempImage.y || scaleX || rotation || skew)
11317
- clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew);
11418
+ if (tempImage.x || tempImage.y || scaleX || clipSize || rotation || skew)
11419
+ clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, paint.clipSize);
11318
11420
  break;
11319
11421
  case 'repeat':
11320
11422
  if (!sameBox || scaleX || rotation)
@@ -11451,18 +11553,16 @@ function ignoreRender(ui, value) {
11451
11553
  }
11452
11554
 
11453
11555
  const { get: get$1, scale, copy: copy$1 } = MatrixHelper;
11454
- const { ceil, abs: abs$1 } = Math;
11556
+ const { ceil, abs } = Math;
11455
11557
  function createPattern(ui, paint, pixelRatio) {
11456
- let { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
11558
+ let { scaleX, scaleY } = ui.getRenderScaleData(true, paint.scaleFixed);
11457
11559
  const id = scaleX + '-' + scaleY + '-' + pixelRatio;
11458
11560
  if (paint.patternId !== id && !ui.destroyed) {
11459
- scaleX = abs$1(scaleX);
11460
- scaleY = abs$1(scaleY);
11461
11561
  const { image, data } = paint;
11462
11562
  let imageScale, imageMatrix, { width, height, scaleX: sx, scaleY: sy, transform, repeat } = data;
11463
11563
  if (sx) {
11464
- sx = abs$1(sx);
11465
- sy = abs$1(sy);
11564
+ sx = abs(sx);
11565
+ sy = abs(sy);
11466
11566
  imageMatrix = get$1();
11467
11567
  copy$1(imageMatrix, transform);
11468
11568
  scale(imageMatrix, 1 / sx, 1 / sy);
@@ -11515,9 +11615,8 @@ function createPattern(ui, paint, pixelRatio) {
11515
11615
  }
11516
11616
  }
11517
11617
 
11518
- const { abs } = Math;
11519
11618
  function checkImage(ui, canvas, paint, allowDraw) {
11520
- const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
11619
+ const { scaleX, scaleY } = ui.getRenderScaleData(true, paint.scaleFixed);
11521
11620
  const { pixelRatio } = canvas, { data } = paint;
11522
11621
  if (!data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
11523
11622
  return false;
@@ -11530,8 +11629,8 @@ function checkImage(ui, canvas, paint, allowDraw) {
11530
11629
  else {
11531
11630
  if (!(paint.changeful || ResizeEvent.isResizing(ui) || Export.running)) {
11532
11631
  let { width, height } = data;
11533
- width *= abs(scaleX) * pixelRatio;
11534
- height *= abs(scaleY) * pixelRatio;
11632
+ width *= scaleX * pixelRatio;
11633
+ height *= scaleY * pixelRatio;
11535
11634
  if (data.scaleX) {
11536
11635
  width *= data.scaleX;
11537
11636
  height *= data.scaleY;
@@ -11541,6 +11640,10 @@ function checkImage(ui, canvas, paint, allowDraw) {
11541
11640
  }
11542
11641
  }
11543
11642
  if (allowDraw) {
11643
+ if (ui.__.__isFastShadow) {
11644
+ canvas.fillStyle = paint.style || '#000';
11645
+ canvas.fill();
11646
+ }
11544
11647
  drawImage(ui, canvas, paint, data);
11545
11648
  return true;
11546
11649
  }
@@ -11729,10 +11832,7 @@ function shadow(ui, current, shape) {
11729
11832
  }
11730
11833
  worldCanvas ? other.copyWorld(worldCanvas, nowWorld, nowWorld, 'destination-out') : other.copyWorld(shape.canvas, shapeBounds, bounds, 'destination-out');
11731
11834
  }
11732
- if (ui.__worldFlipped)
11733
- current.copyWorldByReset(other, copyBounds, nowWorld, item.blendMode);
11734
- else
11735
- current.copyWorldToInner(other, copyBounds, __layout.renderBounds, item.blendMode);
11835
+ LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
11736
11836
  if (end && index < end)
11737
11837
  other.clearWorld(copyBounds, true);
11738
11838
  });
@@ -11791,10 +11891,7 @@ function innerShadow(ui, current, shape) {
11791
11891
  copyBounds = bounds;
11792
11892
  }
11793
11893
  other.fillWorld(copyBounds, ColorConvert.string(item.color), 'source-in');
11794
- if (ui.__worldFlipped)
11795
- current.copyWorldByReset(other, copyBounds, nowWorld, item.blendMode);
11796
- else
11797
- current.copyWorldToInner(other, copyBounds, __layout.renderBounds, item.blendMode);
11894
+ LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
11798
11895
  if (end && index < end)
11799
11896
  other.clearWorld(copyBounds, true);
11800
11897
  });
@@ -11850,12 +11947,11 @@ Group.prototype.__renderMask = function (canvas, options) {
11850
11947
  contentCanvas = getCanvas(canvas);
11851
11948
  child.__render(maskCanvas, options);
11852
11949
  }
11853
- if (!(mask === 'clipping' || mask === 'clipping-path'))
11854
- continue;
11855
- }
11856
- if (excludeRenderBounds(child, options))
11950
+ if (mask === 'clipping' || mask === 'clipping-path')
11951
+ excludeRenderBounds(child, options) || child.__render(canvas, options);
11857
11952
  continue;
11858
- child.__render(contentCanvas || canvas, options);
11953
+ }
11954
+ excludeRenderBounds(child, options) || child.__render(contentCanvas || canvas, options);
11859
11955
  }
11860
11956
  maskEnd(this, currentMask, canvas, contentCanvas, maskCanvas, maskOpacity);
11861
11957
  };
@@ -12442,4 +12538,4 @@ Object.assign(Creator, {
12442
12538
  });
12443
12539
  useCanvas();
12444
12540
 
12445
- 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, DragEvent$1 as DragEvent, Dragger, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, 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, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, 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, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, ZoomEvent, 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 };
12541
+ 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, DragEvent$1 as DragEvent, Dragger, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Filter, 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, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, 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, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, ZoomEvent, 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 };