@leafer-draw/worker 1.6.7 → 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.
@@ -43,7 +43,7 @@ const IncrementId = {
43
43
  };
44
44
  const I$1 = IncrementId;
45
45
 
46
- const { round: round$3, pow: pow$1, PI: PI$4 } = Math;
46
+ const { round: round$3, pow: pow$1, PI: PI$3 } = Math;
47
47
  const MathHelper = {
48
48
  within(value, min, max) {
49
49
  if (typeof min === 'object')
@@ -139,9 +139,9 @@ const MathHelper = {
139
139
  function randInt(num) {
140
140
  return Math.round(Math.random() * num);
141
141
  }
142
- const OneRadian = PI$4 / 180;
143
- const PI2 = PI$4 * 2;
144
- const PI_2 = PI$4 / 2;
142
+ const OneRadian = PI$3 / 180;
143
+ const PI2 = PI$3 * 2;
144
+ const PI_2 = PI$3 / 2;
145
145
  function getPointData() { return { x: 0, y: 0 }; }
146
146
  function getBoundsData() { return { x: 0, y: 0, width: 0, height: 0 }; }
147
147
  function getMatrixData() { return { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }; }
@@ -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, PI: PI$3 } = 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) {
@@ -549,10 +549,11 @@ const PointHelper = {
549
549
  getRadianFrom(fromX, fromY, originX, originY, toX, toY, toOriginX, toOriginY) {
550
550
  if (toOriginX === undefined)
551
551
  toOriginX = originX, toOriginY = originY;
552
- let fromAngle = atan2$2(fromY - originY, fromX - originX);
553
- let toAngle = atan2$2(toY - toOriginY, toX - toOriginX);
554
- const radian = toAngle - fromAngle;
555
- return radian < -PI$3 ? radian + PI2 : radian;
552
+ const a = fromX - originX;
553
+ const b = fromY - originY;
554
+ const c = toX - toOriginX;
555
+ const d = toY - toOriginY;
556
+ return Math.atan2(a * d - b * c, a * c + b * d);
556
557
  },
557
558
  getAtan2(t, to) {
558
559
  return atan2$2(to.y - t.y, to.x - t.x);
@@ -762,7 +763,7 @@ class Matrix {
762
763
  MatrixHelper.reset(this);
763
764
  }
764
765
  }
765
- const tempMatrix = new Matrix();
766
+ const tempMatrix$1 = new Matrix();
766
767
 
767
768
  const TwoPointBoundsHelper = {
768
769
  tempPointBounds: {},
@@ -859,6 +860,12 @@ const AroundHelper = {
859
860
  }
860
861
  if (!onlyBoxSize)
861
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;
862
869
  }
863
870
  };
864
871
  function get$4(around) {
@@ -1787,10 +1794,13 @@ function contextAttr(realName) {
1787
1794
  return (target, key) => {
1788
1795
  if (!realName)
1789
1796
  realName = key;
1790
- Object.defineProperty(target, key, {
1797
+ const property = {
1791
1798
  get() { return this.context[realName]; },
1792
1799
  set(value) { this.context[realName] = value; }
1793
- });
1800
+ };
1801
+ if (key === 'strokeCap')
1802
+ property.set = function (value) { this.context[realName] = value === 'none' ? 'butt' : value; };
1803
+ Object.defineProperty(target, key, property);
1794
1804
  };
1795
1805
  }
1796
1806
  const contextMethodNameList = [];
@@ -2066,15 +2076,15 @@ __decorate([
2066
2076
  contextMethod()
2067
2077
  ], Canvas$1.prototype, "strokeText", null);
2068
2078
 
2069
- 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;
2070
2080
  const minSize = { width: 1, height: 1, pixelRatio: 1 };
2071
2081
  const canvasSizeAttrs = ['width', 'height', 'pixelRatio'];
2072
2082
  class LeaferCanvasBase extends Canvas$1 {
2073
2083
  get width() { return this.size.width; }
2074
2084
  get height() { return this.size.height; }
2075
2085
  get pixelRatio() { return this.size.pixelRatio; }
2076
- get pixelWidth() { return this.width * this.pixelRatio; }
2077
- 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; }
2078
2088
  get pixelSnap() { return this.config.pixelSnap; }
2079
2089
  set pixelSnap(value) { this.config.pixelSnap = value; }
2080
2090
  get allowBackgroundColor() { return this.view && this.parentView; }
@@ -2139,7 +2149,7 @@ class LeaferCanvasBase extends Canvas$1 {
2139
2149
  setWorld(matrix, parentMatrix) {
2140
2150
  const { pixelRatio, pixelSnap } = this, w = this.worldTransform;
2141
2151
  if (parentMatrix)
2142
- multiplyParent$3(matrix, parentMatrix, w);
2152
+ multiplyParent$4(matrix, parentMatrix, w);
2143
2153
  w.a = matrix.a * pixelRatio;
2144
2154
  w.b = matrix.b * pixelRatio;
2145
2155
  w.c = matrix.c * pixelRatio;
@@ -2161,20 +2171,33 @@ class LeaferCanvasBase extends Canvas$1 {
2161
2171
  if (w)
2162
2172
  this.setTransform(w.a, w.b, w.c, w.d, w.e, w.f);
2163
2173
  }
2164
- setStroke(color, strokeWidth, options) {
2174
+ setStroke(color, strokeWidth, options, childOptions) {
2165
2175
  if (strokeWidth)
2166
2176
  this.strokeWidth = strokeWidth;
2167
2177
  if (color)
2168
2178
  this.strokeStyle = color;
2169
2179
  if (options)
2170
- this.setStrokeOptions(options);
2171
- }
2172
- setStrokeOptions(options) {
2173
- this.strokeCap = options.strokeCap === 'none' ? 'butt' : options.strokeCap;
2174
- this.strokeJoin = options.strokeJoin;
2175
- this.dashPattern = options.dashPattern;
2176
- this.dashOffset = options.dashOffset;
2177
- 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;
2178
2201
  }
2179
2202
  saveBlendMode(blendMode) {
2180
2203
  this.savedBlendMode = this.blendMode;
@@ -2408,7 +2431,7 @@ const RectHelper = {
2408
2431
  }
2409
2432
  };
2410
2433
 
2411
- 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;
2412
2435
  const { setPoint: setPoint$1, addPoint: addPoint$1 } = TwoPointBoundsHelper;
2413
2436
  const { set, toNumberPoints } = PointHelper;
2414
2437
  const { M: M$5, L: L$6, C: C$4, Q: Q$4, Z: Z$5 } = PathCommandMap;
@@ -2483,7 +2506,7 @@ const BezierHelper = {
2483
2506
  let totalRadian = endRadian - startRadian;
2484
2507
  if (totalRadian < 0)
2485
2508
  totalRadian += PI2;
2486
- 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)) {
2487
2510
  if (data)
2488
2511
  data.push(L$6, x1, y1);
2489
2512
  if (setPointBounds) {
@@ -2525,7 +2548,7 @@ const BezierHelper = {
2525
2548
  totalRadian -= PI2;
2526
2549
  if (anticlockwise)
2527
2550
  totalRadian -= PI2;
2528
- const parts = ceil$1(abs$3(totalRadian / PI_2));
2551
+ const parts = ceil$1(abs$2(totalRadian / PI_2));
2529
2552
  const partRadian = totalRadian / parts;
2530
2553
  const partRadian4Sin = sin$3(partRadian / 4);
2531
2554
  const control = 8 / 3 * partRadian4Sin * partRadian4Sin / sin$3(partRadian / 2);
@@ -2970,7 +2993,7 @@ const { current, pushData, copyData } = PathConvert;
2970
2993
 
2971
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;
2972
2995
  const { getMinDistanceFrom, getRadianFrom } = PointHelper;
2973
- const { tan, min, abs: abs$2 } = Math;
2996
+ const { tan, min, abs: abs$1 } = Math;
2974
2997
  const startPoint = {};
2975
2998
  const PathCommandDataHelper = {
2976
2999
  beginPath(data) {
@@ -3033,7 +3056,7 @@ const PathCommandDataHelper = {
3033
3056
  arcTo(data, x1, y1, x2, y2, radius, lastX, lastY) {
3034
3057
  if (lastX !== undefined) {
3035
3058
  const d = getMinDistanceFrom(lastX, lastY, x1, y1, x2, y2);
3036
- 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))));
3037
3060
  }
3038
3061
  data.push(U$2, x1, y1, x2, y2, radius);
3039
3062
  },
@@ -3339,7 +3362,7 @@ const { getCenterX, getCenterY } = PointHelper;
3339
3362
  const { arcTo } = PathCommandDataHelper;
3340
3363
  const PathCorner = {
3341
3364
  smooth(data, cornerRadius, _cornerSmoothing) {
3342
- let command, commandLen;
3365
+ let command, lastCommand, commandLen;
3343
3366
  let i = 0, x = 0, y = 0, startX = 0, startY = 0, secondX = 0, secondY = 0, lastX = 0, lastY = 0;
3344
3367
  const len = data.length;
3345
3368
  const smooth = [];
@@ -3377,8 +3400,10 @@ const PathCorner = {
3377
3400
  lastY = y;
3378
3401
  break;
3379
3402
  case Z:
3380
- arcTo(smooth, startX, startY, secondX, secondY, cornerRadius, lastX, lastY);
3381
- smooth.push(Z);
3403
+ if (lastCommand !== Z) {
3404
+ arcTo(smooth, startX, startY, secondX, secondY, cornerRadius, lastX, lastY);
3405
+ smooth.push(Z);
3406
+ }
3382
3407
  i += 1;
3383
3408
  break;
3384
3409
  default:
@@ -3387,6 +3412,7 @@ const PathCorner = {
3387
3412
  smooth.push(data[i + j]);
3388
3413
  i += commandLen;
3389
3414
  }
3415
+ lastCommand = command;
3390
3416
  }
3391
3417
  if (command !== Z) {
3392
3418
  smooth[1] = startX;
@@ -3883,12 +3909,12 @@ class LeaferImage {
3883
3909
  try {
3884
3910
  if (transform && pattern.setTransform) {
3885
3911
  pattern.setTransform(transform);
3886
- transform = null;
3912
+ transform = undefined;
3887
3913
  }
3888
3914
  }
3889
3915
  catch (_a) { }
3890
3916
  if (paint)
3891
- paint.transform = transform;
3917
+ DataHelper.stintSet(paint, 'transform', transform);
3892
3918
  return pattern;
3893
3919
  }
3894
3920
  destroy() {
@@ -3906,6 +3932,13 @@ function defineKey(target, key, descriptor, noConfigurable) {
3906
3932
  function getDescriptor(object, name) {
3907
3933
  return Object.getOwnPropertyDescriptor(object, name);
3908
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
+ }
3909
3942
  function getNames(object) {
3910
3943
  return Object.getOwnPropertyNames(object);
3911
3944
  }
@@ -3993,10 +4026,14 @@ function pathInputType(defaultValue) {
3993
4026
  }));
3994
4027
  }
3995
4028
  const pathType = boundsType;
3996
- function affectStrokeBoundsType(defaultValue) {
4029
+ function affectStrokeBoundsType(defaultValue, useStroke) {
3997
4030
  return decorateLeafAttr(defaultValue, (key) => attr({
3998
4031
  set(value) {
3999
- this.__setAttr(key, value) && doStrokeType(this);
4032
+ if (this.__setAttr(key, value)) {
4033
+ doStrokeType(this);
4034
+ if (useStroke)
4035
+ this.__.__useStroke = true;
4036
+ }
4000
4037
  }
4001
4038
  }));
4002
4039
  }
@@ -4134,15 +4171,7 @@ function defineDataProcessor(target, key, defaultValue) {
4134
4171
  const data = target.__DataProcessor.prototype;
4135
4172
  const computedKey = '_' + key;
4136
4173
  const setMethodName = getSetMethodName(key);
4137
- const property = {
4138
- get() {
4139
- const v = this[computedKey];
4140
- return v === undefined ? defaultValue : v;
4141
- },
4142
- set(value) {
4143
- this[computedKey] = value;
4144
- }
4145
- };
4174
+ const property = createDescriptor(key, defaultValue);
4146
4175
  if (defaultValue === undefined) {
4147
4176
  property.get = function () { return this[computedKey]; };
4148
4177
  }
@@ -4257,7 +4286,7 @@ function registerUIEvent() {
4257
4286
  };
4258
4287
  }
4259
4288
 
4260
- 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;
4261
4290
  const matrix = {}, { round } = Math;
4262
4291
  const LeafHelper = {
4263
4292
  updateAllMatrix(leaf, checkAutoLayout, waitAutoLayout) {
@@ -4329,6 +4358,14 @@ const LeafHelper = {
4329
4358
  }
4330
4359
  return true;
4331
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
+ },
4332
4369
  moveWorld(t, x, y = 0, isInnerPoint, transition) {
4333
4370
  const local = typeof x === 'object' ? Object.assign({}, x) : { x, y };
4334
4371
  isInnerPoint ? toOuterPoint$1(t.localTransform, local, local, true) : (t.parent && toInnerPoint$1(t.parent.worldTransform, local, local, true));
@@ -4388,14 +4425,14 @@ const LeafHelper = {
4388
4425
  },
4389
4426
  transformWorld(t, transform, resize, transition) {
4390
4427
  copy$6(matrix, t.worldTransform);
4391
- multiplyParent$2(matrix, transform);
4428
+ multiplyParent$3(matrix, transform);
4392
4429
  if (t.parent)
4393
4430
  divideParent(matrix, t.parent.worldTransform);
4394
4431
  L.setTransform(t, matrix, resize, transition);
4395
4432
  },
4396
4433
  transform(t, transform, resize, transition) {
4397
4434
  copy$6(matrix, t.localTransform);
4398
- multiplyParent$2(matrix, transform);
4435
+ multiplyParent$3(matrix, transform);
4399
4436
  L.setTransform(t, matrix, resize, transition);
4400
4437
  },
4401
4438
  setTransform(t, transform, resize, transition) {
@@ -5257,17 +5294,18 @@ const LeafDataProxy = {
5257
5294
  }
5258
5295
  };
5259
5296
 
5260
- const { setLayout, multiplyParent: multiplyParent$1, translateInner, defaultWorld } = MatrixHelper;
5297
+ const { setLayout, multiplyParent: multiplyParent$2, translateInner, defaultWorld } = MatrixHelper;
5261
5298
  const { toPoint: toPoint$3, tempPoint } = AroundHelper;
5262
5299
  const LeafMatrix = {
5263
5300
  __updateWorldMatrix() {
5264
- 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.__);
5265
5303
  },
5266
5304
  __updateLocalMatrix() {
5267
5305
  if (this.__local) {
5268
5306
  const layout = this.__layout, local = this.__local, data = this.__;
5269
5307
  if (layout.affectScaleOrRotation) {
5270
- if ((layout.scaleChanged && (layout.resized = 'scale')) || layout.rotationChanged) {
5308
+ if ((layout.scaleChanged && (layout.resized || (layout.resized = 'scale'))) || layout.rotationChanged) {
5271
5309
  setLayout(local, data, null, null, layout.affectRotation);
5272
5310
  layout.scaleChanged = layout.rotationChanged = undefined;
5273
5311
  }
@@ -5422,6 +5460,8 @@ const LeafBounds = {
5422
5460
 
5423
5461
  const LeafRender = {
5424
5462
  __render(canvas, options) {
5463
+ if (options.shape)
5464
+ return this.__renderShape(canvas, options);
5425
5465
  if (this.__worldOpacity) {
5426
5466
  const data = this.__;
5427
5467
  canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
@@ -5431,12 +5471,7 @@ const LeafRender = {
5431
5471
  return this.__renderEraser(canvas, options);
5432
5472
  const tempCanvas = canvas.getSameCanvas(true, true);
5433
5473
  this.__draw(tempCanvas, options, canvas);
5434
- if (this.__worldFlipped) {
5435
- canvas.copyWorldByReset(tempCanvas, this.__nowWorld, null, data.__blendMode, true);
5436
- }
5437
- else {
5438
- canvas.copyWorldToInner(tempCanvas, this.__nowWorld, this.__layout.renderBounds, data.__blendMode);
5439
- }
5474
+ LeafHelper.copyCanvasByWorld(this, canvas, tempCanvas, this.__nowWorld, data.__blendMode, true);
5440
5475
  tempCanvas.recycle(this.__nowWorld);
5441
5476
  }
5442
5477
  else {
@@ -5446,6 +5481,12 @@ const LeafRender = {
5446
5481
  Debug.drawBounds(this, canvas, options);
5447
5482
  }
5448
5483
  },
5484
+ __renderShape(canvas, options) {
5485
+ if (this.__worldOpacity) {
5486
+ canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
5487
+ this.__drawShape(canvas, options);
5488
+ }
5489
+ },
5449
5490
  __clip(canvas, options) {
5450
5491
  if (this.__worldOpacity) {
5451
5492
  canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
@@ -5478,7 +5519,7 @@ const BranchRender = {
5478
5519
  options.dimOpacity = data.dim === true ? 0.2 : data.dim;
5479
5520
  else if (data.dimskip)
5480
5521
  options.dimOpacity && (options.dimOpacity = 0);
5481
- if (data.__single) {
5522
+ if (data.__single && !this.isBranchLeaf) {
5482
5523
  if (data.eraser === 'path')
5483
5524
  return this.__renderEraser(canvas, options);
5484
5525
  const tempCanvas = canvas.getSameCanvas(false, true);
@@ -5500,9 +5541,7 @@ const BranchRender = {
5500
5541
  else {
5501
5542
  const { children } = this;
5502
5543
  for (let i = 0, len = children.length; i < len; i++) {
5503
- if (excludeRenderBounds$1(children[i], options))
5504
- continue;
5505
- children[i].__render(canvas, options);
5544
+ excludeRenderBounds$1(children[i], options) || children[i].__render(canvas, options);
5506
5545
  }
5507
5546
  }
5508
5547
  },
@@ -5510,16 +5549,15 @@ const BranchRender = {
5510
5549
  if (this.__worldOpacity) {
5511
5550
  const { children } = this;
5512
5551
  for (let i = 0, len = children.length; i < len; i++) {
5513
- if (excludeRenderBounds$1(children[i], options))
5514
- continue;
5515
- children[i].__clip(canvas, options);
5552
+ excludeRenderBounds$1(children[i], options) || children[i].__clip(canvas, options);
5516
5553
  }
5517
5554
  }
5518
5555
  }
5519
5556
  };
5520
5557
 
5558
+ const tempScaleData$1 = {};
5521
5559
  const { LEAF, create } = IncrementId;
5522
- const { toInnerPoint, toOuterPoint, multiplyParent } = MatrixHelper;
5560
+ const { toInnerPoint, toOuterPoint, multiplyParent: multiplyParent$1 } = MatrixHelper;
5523
5561
  const { toOuterOf } = BoundsHelper;
5524
5562
  const { copy: copy$3, move } = PointHelper;
5525
5563
  const { moveLocal, zoomOfLocal, rotateOfLocal, skewOfLocal, moveWorld, zoomOfWorld, rotateOfWorld, skewOfWorld, transform, transformWorld, setTransform, getFlipTransform, getLocalOrigin, getRelativeWorld, drop } = LeafHelper;
@@ -5701,7 +5739,7 @@ let Leaf = class Leaf {
5701
5739
  if (!this.__cameraWorld)
5702
5740
  this.__cameraWorld = {};
5703
5741
  const cameraWorld = this.__cameraWorld, world = this.__world;
5704
- multiplyParent(world, options.matrix, cameraWorld, undefined, world);
5742
+ multiplyParent$1(world, options.matrix, cameraWorld, undefined, world);
5705
5743
  toOuterOf(this.__layout.renderBounds, cameraWorld, cameraWorld);
5706
5744
  cameraWorld.half !== world.half && (cameraWorld.half = world.half);
5707
5745
  return cameraWorld;
@@ -5710,6 +5748,22 @@ let Leaf = class Leaf {
5710
5748
  return this.__world;
5711
5749
  }
5712
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
+ }
5713
5767
  getTransform(relative) {
5714
5768
  return this.__layout.getTransform(relative || 'local');
5715
5769
  }
@@ -5865,7 +5919,8 @@ let Leaf = class Leaf {
5865
5919
  __drawFast(_canvas, _options) { }
5866
5920
  __draw(_canvas, _options, _originCanvas) { }
5867
5921
  __clip(_canvas, _options) { }
5868
- __renderShape(_canvas, _options, _ignoreFill, _ignoreStroke) { }
5922
+ __renderShape(_canvas, _options) { }
5923
+ __drawShape(_canvas, _options) { }
5869
5924
  __updateWorldOpacity() { }
5870
5925
  __updateChange() { }
5871
5926
  __drawPath(_canvas) { }
@@ -6233,7 +6288,7 @@ class LeafLevelList {
6233
6288
  }
6234
6289
  }
6235
6290
 
6236
- const version = "1.6.7";
6291
+ const version = "1.8.0";
6237
6292
 
6238
6293
  class LeaferCanvas extends LeaferCanvasBase {
6239
6294
  get allowBackgroundColor() { return true; }
@@ -6924,6 +6979,11 @@ function zoomLayerType() {
6924
6979
  });
6925
6980
  };
6926
6981
  }
6982
+ function createAttr(defaultValue) {
6983
+ return (target, key) => {
6984
+ defineKey(target, key, createDescriptor(key, defaultValue));
6985
+ };
6986
+ }
6927
6987
 
6928
6988
  function hasTransparent$3(color) {
6929
6989
  if (!color || color.length === 7 || color.length === 4)
@@ -6981,26 +7041,9 @@ const emptyPaint = {};
6981
7041
  const debug$1 = Debug.get('UIData');
6982
7042
  class UIData extends LeafData {
6983
7043
  get scale() { const { scaleX, scaleY } = this; return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX; }
6984
- get __strokeWidth() {
6985
- const { strokeWidth, strokeWidthFixed } = this;
6986
- if (strokeWidthFixed) {
6987
- const ui = this.__leaf;
6988
- let { scaleX } = ui.__nowWorld || ui.__world;
6989
- if (scaleX < 0)
6990
- scaleX = -scaleX;
6991
- return scaleX > 1 ? strokeWidth / scaleX : strokeWidth;
6992
- }
6993
- else
6994
- return strokeWidth;
6995
- }
6996
- get __hasStroke() { return this.stroke && this.strokeWidth; }
6997
- get __hasHalf() { const t = this; return (t.stroke && t.strokeAlign === 'center' && t.strokeWidth % 2) || undefined; }
6998
- get __hasMultiPaint() {
6999
- const t = this;
7000
- if ((t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect)
7001
- return true;
7002
- return t.fill && this.__hasStroke;
7003
- }
7044
+ get __strokeWidth() { return this.__getRealStrokeWidth(); }
7045
+ get __maxStrokeWidth() { const t = this; return t.__hasMultiStrokeStyle ? Math.max(t.__hasMultiStrokeStyle, t.strokeWidth) : t.strokeWidth; }
7046
+ get __hasMultiPaint() { const t = this; return (t.fill && this.__useStroke) || (t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect; }
7004
7047
  get __clipAfterFill() { const t = this; return (t.cornerRadius || t.innerShadow || t.__pathInputed); }
7005
7048
  get __hasSurface() { const t = this; return (t.fill || t.stroke); }
7006
7049
  get __autoWidth() { return !this._width; }
@@ -7082,6 +7125,21 @@ class UIData extends LeafData {
7082
7125
  Paint.compute('stroke', this.__leaf);
7083
7126
  this.__needComputePaint = undefined;
7084
7127
  }
7128
+ __getRealStrokeWidth(childStyle) {
7129
+ let { strokeWidth, strokeWidthFixed } = this;
7130
+ if (childStyle) {
7131
+ if (childStyle.strokeWidth)
7132
+ strokeWidth = childStyle.strokeWidth;
7133
+ if (childStyle.strokeWidthFixed !== undefined)
7134
+ strokeWidthFixed = childStyle.strokeWidthFixed;
7135
+ }
7136
+ if (strokeWidthFixed) {
7137
+ const scale = this.__leaf.getClampRenderScale();
7138
+ return scale > 1 ? strokeWidth / scale : strokeWidth;
7139
+ }
7140
+ else
7141
+ return strokeWidth;
7142
+ }
7085
7143
  __setPaint(attrName, value) {
7086
7144
  this.__setInput(attrName, value);
7087
7145
  const layout = this.__leaf.__layout;
@@ -7106,6 +7164,7 @@ class UIData extends LeafData {
7106
7164
  }
7107
7165
  else {
7108
7166
  stintSet$2(this, '__isAlphaPixelStroke', undefined);
7167
+ stintSet$2(this, '__hasMultiStrokeStyle', undefined);
7109
7168
  this._stroke = this.__isStrokes = undefined;
7110
7169
  }
7111
7170
  }
@@ -7127,8 +7186,8 @@ class GroupData extends UIData {
7127
7186
 
7128
7187
  class BoxData extends GroupData {
7129
7188
  get __boxStroke() { return !this.__pathInputed; }
7130
- get __drawAfterFill() { const t = this; return (t.overflow === 'hide' && (t.__clipAfterFill || t.innerShadow) && t.__leaf.children.length); }
7131
- get __clipAfterFill() { return this.__leaf.isOverflow || super.__clipAfterFill; }
7189
+ get __drawAfterFill() { const t = this; return t.__single || t.__clipAfterFill; }
7190
+ get __clipAfterFill() { const t = this; return t.overflow === 'hide' && t.__leaf.children.length && (t.__leaf.isOverflow || super.__clipAfterFill); }
7132
7191
  }
7133
7192
 
7134
7193
  class LeaferData extends GroupData {
@@ -7248,7 +7307,7 @@ class CanvasData extends RectData {
7248
7307
  const UIBounds = {
7249
7308
  __updateStrokeSpread() {
7250
7309
  let width = 0, boxWidth = 0;
7251
- const data = this.__, { strokeAlign, strokeWidth } = data, box = this.__box;
7310
+ const data = this.__, { strokeAlign, __maxStrokeWidth: strokeWidth } = data, box = this.__box;
7252
7311
  if ((data.stroke || data.hitStroke === 'all') && strokeWidth && strokeAlign !== 'inside') {
7253
7312
  boxWidth = width = strokeAlign === 'center' ? strokeWidth / 2 : strokeWidth;
7254
7313
  if (!data.__boxStroke) {
@@ -7268,13 +7327,15 @@ const UIBounds = {
7268
7327
  },
7269
7328
  __updateRenderSpread() {
7270
7329
  let width = 0;
7271
- const { shadow, innerShadow, blur, backgroundBlur, filter } = this.__;
7330
+ const { shadow, innerShadow, blur, backgroundBlur, filter, renderSpread } = this.__;
7272
7331
  if (shadow)
7273
7332
  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));
7274
7333
  if (blur)
7275
7334
  width = Math.max(width, blur);
7276
7335
  if (filter)
7277
7336
  width += Filter.getSpread(filter);
7337
+ if (renderSpread)
7338
+ width += renderSpread;
7278
7339
  let shapeWidth = width = Math.ceil(width);
7279
7340
  if (innerShadow)
7280
7341
  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));
@@ -7290,15 +7351,18 @@ const { stintSet: stintSet$1 } = DataHelper;
7290
7351
  const UIRender = {
7291
7352
  __updateChange() {
7292
7353
  const data = this.__;
7354
+ if (data.__useStroke) {
7355
+ const useStroke = data.__useStroke = !!(data.stroke && data.strokeWidth);
7356
+ stintSet$1(this.__world, 'half', useStroke && data.strokeAlign === 'center' && data.strokeWidth % 2);
7357
+ stintSet$1(data, '__fillAfterStroke', useStroke && data.strokeAlign === 'outside' && data.fill && !data.__isTransparentFill);
7358
+ }
7293
7359
  if (data.__useEffect) {
7294
7360
  const { shadow, fill, stroke } = data, otherEffect = data.innerShadow || data.blur || data.backgroundBlur || data.filter;
7295
- 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')));
7361
+ 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')));
7296
7362
  data.__useEffect = !!(shadow || otherEffect);
7297
7363
  }
7298
- stintSet$1(this.__world, 'half', data.__hasHalf);
7299
- stintSet$1(data, '__fillAfterStroke', data.stroke && data.strokeAlign === 'outside' && data.fill && !data.__isTransparentFill);
7300
7364
  data.__checkSingle();
7301
- stintSet$1(data, '__complex', data.__isFills || data.__isStrokes || data.cornerRadius || data.__useEffect);
7365
+ stintSet$1(data, '__complex', (data.__isFills || data.__isStrokes || data.cornerRadius || data.__useEffect));
7302
7366
  },
7303
7367
  __drawFast(canvas, options) {
7304
7368
  drawFast(this, canvas, options);
@@ -7356,18 +7420,15 @@ const UIRender = {
7356
7420
  this.__drawFast(canvas, options);
7357
7421
  }
7358
7422
  },
7359
- __renderShape(canvas, options, ignoreFill, ignoreStroke) {
7360
- if (this.__worldOpacity) {
7361
- canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
7362
- const { fill, stroke } = this.__;
7363
- this.__drawRenderPath(canvas);
7364
- if (fill && !ignoreFill)
7365
- this.__.__isAlphaPixelFill ? Paint.fills(fill, this, canvas) : Paint.fill('#000000', this, canvas);
7366
- if (this.__.__isCanvas)
7367
- this.__drawAfterFill(canvas, options);
7368
- if (stroke && !ignoreStroke)
7369
- this.__.__isAlphaPixelStroke ? Paint.strokes(stroke, this, canvas) : Paint.stroke('#000000', this, canvas);
7370
- }
7423
+ __drawShape(canvas, options) {
7424
+ this.__drawRenderPath(canvas);
7425
+ const data = this.__, { fill, stroke } = data;
7426
+ if (fill && !options.ignoreFill)
7427
+ data.__isAlphaPixelFill ? Paint.fills(fill, this, canvas) : Paint.fill('#000000', this, canvas);
7428
+ if (data.__isCanvas)
7429
+ this.__drawAfterFill(canvas, options);
7430
+ if (stroke && !options.ignoreStroke)
7431
+ data.__isAlphaPixelStroke ? Paint.strokes(stroke, this, canvas) : Paint.stroke('#000000', this, canvas);
7371
7432
  },
7372
7433
  __drawAfterFill(canvas, options) {
7373
7434
  if (this.__.__clipAfterFill) {
@@ -7404,17 +7465,17 @@ const RectRender = {
7404
7465
  if (__drawAfterFill)
7405
7466
  this.__drawAfterFill(canvas, options);
7406
7467
  if (stroke) {
7407
- const { strokeAlign, __strokeWidth } = this.__;
7408
- if (!__strokeWidth)
7468
+ const { strokeAlign, __strokeWidth: strokeWidth } = this.__;
7469
+ if (!strokeWidth)
7409
7470
  return;
7410
- canvas.setStroke(stroke, __strokeWidth, this.__);
7411
- const half = __strokeWidth / 2;
7471
+ canvas.setStroke(stroke, strokeWidth, this.__);
7472
+ const half = strokeWidth / 2;
7412
7473
  switch (strokeAlign) {
7413
7474
  case 'center':
7414
7475
  canvas.strokeRect(0, 0, width, height);
7415
7476
  break;
7416
7477
  case 'inside':
7417
- width -= __strokeWidth, height -= __strokeWidth;
7478
+ width -= strokeWidth, height -= strokeWidth;
7418
7479
  if (width < 0 || height < 0) {
7419
7480
  canvas.save();
7420
7481
  this.__clip(canvas, options);
@@ -7425,7 +7486,7 @@ const RectRender = {
7425
7486
  canvas.strokeRect(x + half, y + half, width, height);
7426
7487
  break;
7427
7488
  case 'outside':
7428
- canvas.strokeRect(x - half, y - half, width + __strokeWidth, height + __strokeWidth);
7489
+ canvas.strokeRect(x - half, y - half, width + strokeWidth, height + strokeWidth);
7429
7490
  break;
7430
7491
  }
7431
7492
  }
@@ -7438,6 +7499,8 @@ let UI = UI_1 = class UI extends Leaf {
7438
7499
  get isFrame() { return false; }
7439
7500
  set scale(value) { MathHelper.assignScale(this, value); }
7440
7501
  get scale() { return this.__.scale; }
7502
+ get isAutoWidth() { const t = this.__; return t.__autoWidth || t.autoWidth; }
7503
+ get isAutoHeight() { const t = this.__; return t.__autoHeight || t.autoHeight; }
7441
7504
  get pen() {
7442
7505
  const { path } = this.__;
7443
7506
  pen.set(this.path = path || []);
@@ -7492,12 +7555,14 @@ let UI = UI_1 = class UI extends Leaf {
7492
7555
  }
7493
7556
  }
7494
7557
  __updateRenderPath() {
7495
- if (this.__.path) {
7496
- const data = this.__;
7558
+ const data = this.__;
7559
+ if (data.path) {
7497
7560
  data.__pathForRender = data.cornerRadius ? PathCorner.smooth(data.path, data.cornerRadius, data.cornerSmoothing) : data.path;
7498
7561
  if (data.__useArrow)
7499
7562
  PathArrow.addArrows(this, !data.cornerRadius);
7500
7563
  }
7564
+ else
7565
+ data.__pathForRender && (data.__pathForRender = undefined);
7501
7566
  }
7502
7567
  __drawRenderPath(canvas) {
7503
7568
  canvas.beginPath();
@@ -7650,6 +7715,9 @@ __decorate([
7650
7715
  __decorate([
7651
7716
  naturalBoundsType(1)
7652
7717
  ], UI.prototype, "pixelRatio", void 0);
7718
+ __decorate([
7719
+ affectRenderBoundsType(0)
7720
+ ], UI.prototype, "renderSpread", void 0);
7653
7721
  __decorate([
7654
7722
  pathInputType()
7655
7723
  ], UI.prototype, "path", void 0);
@@ -7708,13 +7776,13 @@ __decorate([
7708
7776
  surfaceType()
7709
7777
  ], UI.prototype, "fill", void 0);
7710
7778
  __decorate([
7711
- strokeType()
7779
+ strokeType(undefined, true)
7712
7780
  ], UI.prototype, "stroke", void 0);
7713
7781
  __decorate([
7714
7782
  strokeType('inside')
7715
7783
  ], UI.prototype, "strokeAlign", void 0);
7716
7784
  __decorate([
7717
- strokeType(1)
7785
+ strokeType(1, true)
7718
7786
  ], UI.prototype, "strokeWidth", void 0);
7719
7787
  __decorate([
7720
7788
  strokeType(false)
@@ -7806,7 +7874,8 @@ let Group = class Group extends UI {
7806
7874
  }
7807
7875
  toJSON(options) {
7808
7876
  const data = super.toJSON(options);
7809
- data.children = this.children.map(child => child.toJSON(options));
7877
+ if (!this.childlessJSON)
7878
+ data.children = this.children.map(child => child.toJSON(options));
7810
7879
  return data;
7811
7880
  }
7812
7881
  pick(_hitPoint, _options) { return undefined; }
@@ -8141,7 +8210,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8141
8210
  list.push(item);
8142
8211
  this.requestRender();
8143
8212
  }
8144
- zoom(_zoomType, _padding, _fixedScale, _transition) {
8213
+ zoom(_zoomType, _optionsOrPadding, _scroll, _transition) {
8145
8214
  return Plugin.need('view');
8146
8215
  }
8147
8216
  getValidMove(moveX, moveY) { return { x: moveX, y: moveY }; }
@@ -8186,7 +8255,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8186
8255
  Leafer_1.list.remove(this);
8187
8256
  try {
8188
8257
  this.stop();
8189
- this.emitEvent(new LeaferEvent(LeaferEvent.END, this));
8258
+ this.emitLeafer(LeaferEvent.END);
8190
8259
  this.__removeListenEvents();
8191
8260
  this.__controllers.forEach(item => !(this.parent && item === this.interaction) && item.destroy());
8192
8261
  this.__controllers.length = 0;
@@ -8253,8 +8322,8 @@ let Box = class Box extends Group {
8253
8322
  __updateRenderSpread() { return this.__updateRectRenderSpread() || -1; }
8254
8323
  __updateRectBoxBounds() { }
8255
8324
  __updateBoxBounds(_secondLayout) {
8256
- const data = this.__;
8257
8325
  if (this.children.length && !this.pathInputed) {
8326
+ const data = this.__;
8258
8327
  if (data.__autoSide) {
8259
8328
  if (data.__hasSurface)
8260
8329
  this.__extraUpdate();
@@ -8281,20 +8350,26 @@ let Box = class Box extends Group {
8281
8350
  __updateStrokeBounds() { }
8282
8351
  __updateRenderBounds() {
8283
8352
  let isOverflow;
8284
- const { renderBounds } = this.__layout;
8285
8353
  if (this.children.length) {
8354
+ const data = this.__, { renderBounds, boxBounds } = this.__layout;
8286
8355
  super.__updateRenderBounds();
8287
8356
  copy$2(childrenRenderBounds, renderBounds);
8288
8357
  this.__updateRectRenderBounds();
8289
- isOverflow = !includes$1(renderBounds, childrenRenderBounds);
8290
- if (isOverflow && this.__.overflow !== 'hide')
8358
+ if (data.scrollY || data.scrollX) {
8359
+ childrenRenderBounds.x += data.scrollX;
8360
+ childrenRenderBounds.y += data.scrollY;
8361
+ }
8362
+ isOverflow = !includes$1(boxBounds, childrenRenderBounds);
8363
+ if (isOverflow && data.overflow !== 'hide')
8291
8364
  add(renderBounds, childrenRenderBounds);
8292
8365
  }
8293
8366
  else
8294
8367
  this.__updateRectRenderBounds();
8295
8368
  DataHelper.stintSet(this, 'isOverflow', isOverflow);
8369
+ this.__updateScrollBar();
8296
8370
  }
8297
8371
  __updateRectRenderBounds() { }
8372
+ __updateScrollBar() { }
8298
8373
  __updateRectChange() { }
8299
8374
  __updateChange() {
8300
8375
  super.__updateChange();
@@ -8311,10 +8386,12 @@ let Box = class Box extends Group {
8311
8386
  if (this.children.length)
8312
8387
  this.__renderGroup(canvas, options);
8313
8388
  }
8389
+ if (this.scrollBar)
8390
+ this.scrollBar.__render(canvas, options);
8314
8391
  }
8315
8392
  __drawContent(canvas, options) {
8316
8393
  this.__renderGroup(canvas, options);
8317
- if (this.__.__hasStroke) {
8394
+ if (this.__.__useStroke || this.__.__useEffect) {
8318
8395
  canvas.setWorld(this.__nowWorld);
8319
8396
  this.__drawRenderPath(canvas);
8320
8397
  }
@@ -8534,8 +8611,8 @@ let Polygon = class Polygon extends UI {
8534
8611
  for (let i = 1; i < sides; i++) {
8535
8612
  lineTo$1(path, rx + rx * sin$1((i * 2 * PI$1) / sides), ry - ry * cos$1((i * 2 * PI$1) / sides));
8536
8613
  }
8614
+ closePath$1(path);
8537
8615
  }
8538
- closePath$1(path);
8539
8616
  }
8540
8617
  __updateRenderPath() { }
8541
8618
  __updateBoxBounds() { }
@@ -8773,6 +8850,11 @@ let Text = class Text extends UI {
8773
8850
  return;
8774
8851
  super.__draw(canvas, options, originCanvas);
8775
8852
  }
8853
+ __drawShape(canvas, options) {
8854
+ if (options.shape)
8855
+ this.__box && this.__box.__drawShape(canvas, options);
8856
+ super.__drawShape(canvas, options);
8857
+ }
8776
8858
  destroy() {
8777
8859
  if (this.boxStyle)
8778
8860
  this.boxStyle = null;
@@ -8968,9 +9050,14 @@ function fills(fills, ui, canvas) {
8968
9050
  }
8969
9051
  }
8970
9052
  canvas.fillStyle = item.style;
8971
- if (item.transform) {
9053
+ if (item.transform || item.scaleFixed) {
8972
9054
  canvas.save();
8973
- canvas.transform(item.transform);
9055
+ if (item.transform)
9056
+ canvas.transform(item.transform);
9057
+ if (item.scaleFixed) {
9058
+ const { scaleX, scaleY } = ui.getRenderScaleData(true);
9059
+ canvas.scale(1 / scaleX, 1 / scaleY);
9060
+ }
8974
9061
  if (item.blendMode)
8975
9062
  canvas.blendMode = item.blendMode;
8976
9063
  fillPathOrText(ui, canvas);
@@ -9006,8 +9093,13 @@ function strokeText(stroke, ui, canvas) {
9006
9093
  }
9007
9094
  function drawCenter$1(stroke, strokeWidthScale, ui, canvas) {
9008
9095
  const data = ui.__;
9009
- canvas.setStroke(!data.__isStrokes && stroke, data.strokeWidth * strokeWidthScale, data);
9010
- data.__isStrokes ? drawStrokesStyle(stroke, true, ui, canvas) : drawTextStroke(ui, canvas);
9096
+ if (typeof stroke === 'object') {
9097
+ drawStrokesStyle(stroke, strokeWidthScale, true, ui, canvas);
9098
+ }
9099
+ else {
9100
+ canvas.setStroke(stroke, data.__strokeWidth * strokeWidthScale, data);
9101
+ drawTextStroke(ui, canvas);
9102
+ }
9011
9103
  }
9012
9104
  function drawAlign(stroke, align, ui, canvas) {
9013
9105
  const out = canvas.getSameCanvas(true, true);
@@ -9016,15 +9108,9 @@ function drawAlign(stroke, align, ui, canvas) {
9016
9108
  out.blendMode = align === 'outside' ? 'destination-out' : 'destination-in';
9017
9109
  fillText(ui, out);
9018
9110
  out.blendMode = 'normal';
9019
- copyWorld(canvas, out, ui);
9111
+ LeafHelper.copyCanvasByWorld(ui, canvas, out);
9020
9112
  out.recycle(ui.__nowWorld);
9021
9113
  }
9022
- function copyWorld(canvas, out, ui) {
9023
- if (ui.__worldFlipped || Platform.fullImageShadow)
9024
- canvas.copyWorldByReset(out, ui.__nowWorld);
9025
- else
9026
- canvas.copyWorldToInner(out, ui.__nowWorld, ui.__layout.renderBounds);
9027
- }
9028
9114
  function drawTextStroke(ui, canvas) {
9029
9115
  let row, data = ui.__.__textDrawData;
9030
9116
  const { rows, decorationY } = data;
@@ -9040,14 +9126,21 @@ function drawTextStroke(ui, canvas) {
9040
9126
  rows.forEach(row => decorationY.forEach(value => canvas.strokeRect(row.x, row.y + value, row.width, decorationHeight)));
9041
9127
  }
9042
9128
  }
9043
- function drawStrokesStyle(strokes, isText, ui, canvas) {
9129
+ function drawStrokesStyle(strokes, strokeWidthScale, isText, ui, canvas) {
9044
9130
  let item;
9131
+ const data = ui.__, { __hasMultiStrokeStyle } = data;
9132
+ __hasMultiStrokeStyle || canvas.setStroke(undefined, data.__strokeWidth * strokeWidthScale, data);
9045
9133
  for (let i = 0, len = strokes.length; i < len; i++) {
9046
9134
  item = strokes[i];
9047
9135
  if (item.image && PaintImage.checkImage(ui, canvas, item, false))
9048
9136
  continue;
9049
9137
  if (item.style) {
9050
- canvas.strokeStyle = item.style;
9138
+ if (__hasMultiStrokeStyle) {
9139
+ const { strokeStyle } = item;
9140
+ strokeStyle ? canvas.setStroke(item.style, data.__getRealStrokeWidth(strokeStyle) * strokeWidthScale, data, strokeStyle) : canvas.setStroke(item.style, data.__strokeWidth * strokeWidthScale, data);
9141
+ }
9142
+ else
9143
+ canvas.strokeStyle = item.style;
9051
9144
  if (item.blendMode) {
9052
9145
  canvas.saveBlendMode(item.blendMode);
9053
9146
  isText ? drawTextStroke(ui, canvas) : canvas.stroke();
@@ -9086,8 +9179,13 @@ function strokes(strokes, ui, canvas) {
9086
9179
  }
9087
9180
  function drawCenter(stroke, strokeWidthScale, ui, canvas) {
9088
9181
  const data = ui.__;
9089
- canvas.setStroke(!data.__isStrokes && stroke, data.__strokeWidth * strokeWidthScale, data);
9090
- data.__isStrokes ? drawStrokesStyle(stroke, false, ui, canvas) : canvas.stroke();
9182
+ if (typeof stroke === 'object') {
9183
+ drawStrokesStyle(stroke, strokeWidthScale, false, ui, canvas);
9184
+ }
9185
+ else {
9186
+ canvas.setStroke(stroke, data.__strokeWidth * strokeWidthScale, data);
9187
+ canvas.stroke();
9188
+ }
9091
9189
  if (data.__useArrow)
9092
9190
  Paint.strokeArrow(stroke, ui, canvas);
9093
9191
  }
@@ -9109,7 +9207,7 @@ function drawOutside(stroke, ui, canvas) {
9109
9207
  drawCenter(stroke, 2, ui, out);
9110
9208
  out.clipUI(data);
9111
9209
  out.clearWorld(renderBounds);
9112
- copyWorld(canvas, out, ui);
9210
+ LeafHelper.copyCanvasByWorld(ui, canvas, out);
9113
9211
  out.recycle(ui.__nowWorld);
9114
9212
  }
9115
9213
  }
@@ -9164,8 +9262,16 @@ function compute(attrName, ui) {
9164
9262
  if (!(paints instanceof Array))
9165
9263
  paints = [paints];
9166
9264
  recycleMap = PaintImage.recycleImage(attrName, data);
9265
+ let maxChildStrokeWidth;
9167
9266
  for (let i = 0, len = paints.length, item; i < len; i++) {
9168
- (item = getLeafPaint(attrName, paints[i], ui)) && leafPaints.push(item);
9267
+ if (item = getLeafPaint(attrName, paints[i], ui)) {
9268
+ leafPaints.push(item);
9269
+ if (item.strokeStyle) {
9270
+ maxChildStrokeWidth || (maxChildStrokeWidth = 1);
9271
+ if (item.strokeStyle.strokeWidth)
9272
+ maxChildStrokeWidth = Math.max(maxChildStrokeWidth, item.strokeStyle.strokeWidth);
9273
+ }
9274
+ }
9169
9275
  }
9170
9276
  data['_' + attrName] = leafPaints.length ? leafPaints : undefined;
9171
9277
  if (leafPaints.length) {
@@ -9182,6 +9288,7 @@ function compute(attrName, ui) {
9182
9288
  else {
9183
9289
  stintSet(data, '__isAlphaPixelStroke', isAlphaPixel);
9184
9290
  stintSet(data, '__isTransparentStroke', isTransparent);
9291
+ stintSet(data, '__hasMultiStrokeStyle', maxChildStrokeWidth);
9185
9292
  }
9186
9293
  }
9187
9294
  function getLeafPaint(attrName, paint, ui) {
@@ -9213,6 +9320,11 @@ function getLeafPaint(attrName, paint, ui) {
9213
9320
  if (data) {
9214
9321
  if (typeof data.style === 'string' && hasTransparent$1(data.style))
9215
9322
  data.isTransparent = true;
9323
+ if (paint.style) {
9324
+ if (paint.style.strokeWidth === 0)
9325
+ return undefined;
9326
+ data.strokeStyle = paint.style;
9327
+ }
9216
9328
  if (paint.blendMode)
9217
9329
  data.blendMode = paint.blendMode;
9218
9330
  }
@@ -9232,8 +9344,8 @@ const PaintModule = {
9232
9344
  shape
9233
9345
  };
9234
9346
 
9235
- let origin = {};
9236
- const { get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, scale: scaleHelper, rotate } = MatrixHelper;
9347
+ let origin = {}, tempMatrix = getMatrixData();
9348
+ const { get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, multiplyParent, scale: scaleHelper, rotate, skew: skewHelper } = MatrixHelper;
9237
9349
  function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
9238
9350
  const transform = get$3();
9239
9351
  translate$1(transform, box.x + x, box.y + y);
@@ -9242,13 +9354,19 @@ function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
9242
9354
  rotateOfOuter$1(transform, { x: box.x + box.width / 2, y: box.y + box.height / 2 }, rotation);
9243
9355
  data.transform = transform;
9244
9356
  }
9245
- function clipMode(data, box, x, y, scaleX, scaleY, rotation) {
9357
+ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipSize) {
9246
9358
  const transform = get$3();
9247
- translate$1(transform, box.x + x, box.y + y);
9248
- if (scaleX)
9249
- scaleHelper(transform, scaleX, scaleY);
9250
9359
  if (rotation)
9251
9360
  rotate(transform, rotation);
9361
+ if (skew)
9362
+ skewHelper(transform, skew.x, skew.y);
9363
+ if (scaleX)
9364
+ scaleHelper(transform, scaleX, scaleY);
9365
+ translate$1(transform, box.x + x, box.y + y);
9366
+ if (clipSize) {
9367
+ tempMatrix.a = box.width / clipSize.width, tempMatrix.d = box.height / clipSize.height;
9368
+ multiplyParent(transform, tempMatrix);
9369
+ }
9252
9370
  data.transform = transform;
9253
9371
  }
9254
9372
  function repeatMode(data, box, width, height, x, y, scaleX, scaleY, rotation, align) {
@@ -9285,11 +9403,15 @@ const tempBox = new Bounds();
9285
9403
  const tempScaleData = {};
9286
9404
  const tempImage = {};
9287
9405
  function createData(leafPaint, image, paint, box) {
9288
- const { changeful, sync } = paint;
9406
+ const { changeful, sync, editing, scaleFixed } = paint;
9289
9407
  if (changeful)
9290
9408
  leafPaint.changeful = changeful;
9291
9409
  if (sync)
9292
9410
  leafPaint.sync = sync;
9411
+ if (editing)
9412
+ leafPaint.editing = editing;
9413
+ if (scaleFixed)
9414
+ leafPaint.scaleFixed = scaleFixed;
9293
9415
  leafPaint.data = getPatternData(paint, box, image);
9294
9416
  }
9295
9417
  function getPatternData(paint, box, image) {
@@ -9298,7 +9420,7 @@ function getPatternData(paint, box, image) {
9298
9420
  if (paint.mode === 'strench')
9299
9421
  paint.mode = 'stretch';
9300
9422
  let { width, height } = image;
9301
- const { opacity, mode, align, offset, scale, size, rotation, repeat, filters } = paint;
9423
+ const { opacity, mode, align, offset, scale, size, rotation, skew, clipSize, repeat, filters } = paint;
9302
9424
  const sameBox = box.width === width && box.height === height;
9303
9425
  const data = { mode };
9304
9426
  const swapSize = align !== 'center' && (rotation || 0) % 180 === 90;
@@ -9332,8 +9454,8 @@ function getPatternData(paint, box, image) {
9332
9454
  break;
9333
9455
  case 'normal':
9334
9456
  case 'clip':
9335
- if (tempImage.x || tempImage.y || scaleX || rotation)
9336
- clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation);
9457
+ if (tempImage.x || tempImage.y || scaleX || clipSize || rotation || skew)
9458
+ clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, paint.clipSize);
9337
9459
  break;
9338
9460
  case 'repeat':
9339
9461
  if (!sameBox || scaleX || rotation)
@@ -9410,11 +9532,11 @@ function image(ui, attrName, paint, boxBounds, firstUse) {
9410
9532
  }
9411
9533
  onLoadSuccess(ui, event);
9412
9534
  }
9413
- leafPaint.loadId = null;
9535
+ leafPaint.loadId = undefined;
9414
9536
  }, (error) => {
9415
9537
  ignoreRender(ui, false);
9416
9538
  onLoadError(ui, event, error);
9417
- leafPaint.loadId = null;
9539
+ leafPaint.loadId = undefined;
9418
9540
  });
9419
9541
  if (ui.placeholderColor) {
9420
9542
  if (!ui.placeholderDelay)
@@ -9470,16 +9592,16 @@ function ignoreRender(ui, value) {
9470
9592
  }
9471
9593
 
9472
9594
  const { get: get$1, scale, copy: copy$1 } = MatrixHelper;
9473
- const { ceil, abs: abs$1 } = Math;
9595
+ const { ceil, abs } = Math;
9474
9596
  function createPattern(ui, paint, pixelRatio) {
9475
- let { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9597
+ let { scaleX, scaleY } = ui.getRenderScaleData(true, paint.scaleFixed);
9476
9598
  const id = scaleX + '-' + scaleY + '-' + pixelRatio;
9477
9599
  if (paint.patternId !== id && !ui.destroyed) {
9478
- scaleX = abs$1(scaleX);
9479
- scaleY = abs$1(scaleY);
9480
9600
  const { image, data } = paint;
9481
9601
  let imageScale, imageMatrix, { width, height, scaleX: sx, scaleY: sy, transform, repeat } = data;
9482
9602
  if (sx) {
9603
+ sx = abs(sx);
9604
+ sy = abs(sy);
9483
9605
  imageMatrix = get$1();
9484
9606
  copy$1(imageMatrix, transform);
9485
9607
  scale(imageMatrix, 1 / sx, 1 / sy);
@@ -9532,9 +9654,8 @@ function createPattern(ui, paint, pixelRatio) {
9532
9654
  }
9533
9655
  }
9534
9656
 
9535
- const { abs } = Math;
9536
9657
  function checkImage(ui, canvas, paint, allowDraw) {
9537
- const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9658
+ const { scaleX, scaleY } = ui.getRenderScaleData(true, paint.scaleFixed);
9538
9659
  const { pixelRatio } = canvas, { data } = paint;
9539
9660
  if (!data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
9540
9661
  return false;
@@ -9547,8 +9668,8 @@ function checkImage(ui, canvas, paint, allowDraw) {
9547
9668
  else {
9548
9669
  if (!(paint.changeful || ResizeEvent.isResizing(ui) || Export.running)) {
9549
9670
  let { width, height } = data;
9550
- width *= abs(scaleX) * pixelRatio;
9551
- height *= abs(scaleY) * pixelRatio;
9671
+ width *= scaleX * pixelRatio;
9672
+ height *= scaleY * pixelRatio;
9552
9673
  if (data.scaleX) {
9553
9674
  width *= data.scaleX;
9554
9675
  height *= data.scaleY;
@@ -9558,6 +9679,10 @@ function checkImage(ui, canvas, paint, allowDraw) {
9558
9679
  }
9559
9680
  }
9560
9681
  if (allowDraw) {
9682
+ if (ui.__.__isFastShadow) {
9683
+ canvas.fillStyle = paint.style || '#000';
9684
+ canvas.fill();
9685
+ }
9561
9686
  drawImage(ui, canvas, paint, data);
9562
9687
  return true;
9563
9688
  }
@@ -9746,10 +9871,7 @@ function shadow(ui, current, shape) {
9746
9871
  }
9747
9872
  worldCanvas ? other.copyWorld(worldCanvas, nowWorld, nowWorld, 'destination-out') : other.copyWorld(shape.canvas, shapeBounds, bounds, 'destination-out');
9748
9873
  }
9749
- if (ui.__worldFlipped)
9750
- current.copyWorldByReset(other, copyBounds, nowWorld, item.blendMode);
9751
- else
9752
- current.copyWorldToInner(other, copyBounds, __layout.renderBounds, item.blendMode);
9874
+ LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
9753
9875
  if (end && index < end)
9754
9876
  other.clearWorld(copyBounds, true);
9755
9877
  });
@@ -9808,10 +9930,7 @@ function innerShadow(ui, current, shape) {
9808
9930
  copyBounds = bounds;
9809
9931
  }
9810
9932
  other.fillWorld(copyBounds, ColorConvert.string(item.color), 'source-in');
9811
- if (ui.__worldFlipped)
9812
- current.copyWorldByReset(other, copyBounds, nowWorld, item.blendMode);
9813
- else
9814
- current.copyWorldToInner(other, copyBounds, __layout.renderBounds, item.blendMode);
9933
+ LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
9815
9934
  if (end && index < end)
9816
9935
  other.clearWorld(copyBounds, true);
9817
9936
  });
@@ -9867,12 +9986,11 @@ Group.prototype.__renderMask = function (canvas, options) {
9867
9986
  contentCanvas = getCanvas(canvas);
9868
9987
  child.__render(maskCanvas, options);
9869
9988
  }
9870
- if (!(mask === 'clipping' || mask === 'clipping-path'))
9871
- continue;
9872
- }
9873
- if (excludeRenderBounds(child, options))
9989
+ if (mask === 'clipping' || mask === 'clipping-path')
9990
+ excludeRenderBounds(child, options) || child.__render(canvas, options);
9874
9991
  continue;
9875
- child.__render(contentCanvas || canvas, options);
9992
+ }
9993
+ excludeRenderBounds(child, options) || child.__render(contentCanvas || canvas, options);
9876
9994
  }
9877
9995
  maskEnd(this, currentMask, canvas, contentCanvas, maskCanvas, maskOpacity);
9878
9996
  };
@@ -10454,4 +10572,4 @@ Object.assign(Effect, EffectModule);
10454
10572
 
10455
10573
  useCanvas();
10456
10574
 
10457
- 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, 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 };
10575
+ 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, 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 };