@leafer-draw/miniapp 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 false; }
@@ -7063,6 +7118,11 @@ function zoomLayerType() {
7063
7118
  });
7064
7119
  };
7065
7120
  }
7121
+ function createAttr(defaultValue) {
7122
+ return (target, key) => {
7123
+ defineKey(target, key, createDescriptor(key, defaultValue));
7124
+ };
7125
+ }
7066
7126
 
7067
7127
  function hasTransparent$3(color) {
7068
7128
  if (!color || color.length === 7 || color.length === 4)
@@ -7120,26 +7180,9 @@ const emptyPaint = {};
7120
7180
  const debug$1 = Debug.get('UIData');
7121
7181
  class UIData extends LeafData {
7122
7182
  get scale() { const { scaleX, scaleY } = this; return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX; }
7123
- get __strokeWidth() {
7124
- const { strokeWidth, strokeWidthFixed } = this;
7125
- if (strokeWidthFixed) {
7126
- const ui = this.__leaf;
7127
- let { scaleX } = ui.__nowWorld || ui.__world;
7128
- if (scaleX < 0)
7129
- scaleX = -scaleX;
7130
- return scaleX > 1 ? strokeWidth / scaleX : strokeWidth;
7131
- }
7132
- else
7133
- return strokeWidth;
7134
- }
7135
- get __hasStroke() { return this.stroke && this.strokeWidth; }
7136
- get __hasHalf() { const t = this; return (t.stroke && t.strokeAlign === 'center' && t.strokeWidth % 2) || undefined; }
7137
- get __hasMultiPaint() {
7138
- const t = this;
7139
- if ((t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect)
7140
- return true;
7141
- return t.fill && this.__hasStroke;
7142
- }
7183
+ get __strokeWidth() { return this.__getRealStrokeWidth(); }
7184
+ get __maxStrokeWidth() { const t = this; return t.__hasMultiStrokeStyle ? Math.max(t.__hasMultiStrokeStyle, t.strokeWidth) : t.strokeWidth; }
7185
+ get __hasMultiPaint() { const t = this; return (t.fill && this.__useStroke) || (t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect; }
7143
7186
  get __clipAfterFill() { const t = this; return (t.cornerRadius || t.innerShadow || t.__pathInputed); }
7144
7187
  get __hasSurface() { const t = this; return (t.fill || t.stroke); }
7145
7188
  get __autoWidth() { return !this._width; }
@@ -7221,6 +7264,21 @@ class UIData extends LeafData {
7221
7264
  Paint.compute('stroke', this.__leaf);
7222
7265
  this.__needComputePaint = undefined;
7223
7266
  }
7267
+ __getRealStrokeWidth(childStyle) {
7268
+ let { strokeWidth, strokeWidthFixed } = this;
7269
+ if (childStyle) {
7270
+ if (childStyle.strokeWidth)
7271
+ strokeWidth = childStyle.strokeWidth;
7272
+ if (childStyle.strokeWidthFixed !== undefined)
7273
+ strokeWidthFixed = childStyle.strokeWidthFixed;
7274
+ }
7275
+ if (strokeWidthFixed) {
7276
+ const scale = this.__leaf.getClampRenderScale();
7277
+ return scale > 1 ? strokeWidth / scale : strokeWidth;
7278
+ }
7279
+ else
7280
+ return strokeWidth;
7281
+ }
7224
7282
  __setPaint(attrName, value) {
7225
7283
  this.__setInput(attrName, value);
7226
7284
  const layout = this.__leaf.__layout;
@@ -7245,6 +7303,7 @@ class UIData extends LeafData {
7245
7303
  }
7246
7304
  else {
7247
7305
  stintSet$2(this, '__isAlphaPixelStroke', undefined);
7306
+ stintSet$2(this, '__hasMultiStrokeStyle', undefined);
7248
7307
  this._stroke = this.__isStrokes = undefined;
7249
7308
  }
7250
7309
  }
@@ -7266,8 +7325,8 @@ class GroupData extends UIData {
7266
7325
 
7267
7326
  class BoxData extends GroupData {
7268
7327
  get __boxStroke() { return !this.__pathInputed; }
7269
- get __drawAfterFill() { const t = this; return (t.overflow === 'hide' && (t.__clipAfterFill || t.innerShadow) && t.__leaf.children.length); }
7270
- get __clipAfterFill() { return this.__leaf.isOverflow || super.__clipAfterFill; }
7328
+ get __drawAfterFill() { const t = this; return t.__single || t.__clipAfterFill; }
7329
+ get __clipAfterFill() { const t = this; return t.overflow === 'hide' && t.__leaf.children.length && (t.__leaf.isOverflow || super.__clipAfterFill); }
7271
7330
  }
7272
7331
 
7273
7332
  class LeaferData extends GroupData {
@@ -7387,7 +7446,7 @@ class CanvasData extends RectData {
7387
7446
  const UIBounds = {
7388
7447
  __updateStrokeSpread() {
7389
7448
  let width = 0, boxWidth = 0;
7390
- const data = this.__, { strokeAlign, strokeWidth } = data, box = this.__box;
7449
+ const data = this.__, { strokeAlign, __maxStrokeWidth: strokeWidth } = data, box = this.__box;
7391
7450
  if ((data.stroke || data.hitStroke === 'all') && strokeWidth && strokeAlign !== 'inside') {
7392
7451
  boxWidth = width = strokeAlign === 'center' ? strokeWidth / 2 : strokeWidth;
7393
7452
  if (!data.__boxStroke) {
@@ -7407,13 +7466,15 @@ const UIBounds = {
7407
7466
  },
7408
7467
  __updateRenderSpread() {
7409
7468
  let width = 0;
7410
- const { shadow, innerShadow, blur, backgroundBlur, filter } = this.__;
7469
+ const { shadow, innerShadow, blur, backgroundBlur, filter, renderSpread } = this.__;
7411
7470
  if (shadow)
7412
7471
  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));
7413
7472
  if (blur)
7414
7473
  width = Math.max(width, blur);
7415
7474
  if (filter)
7416
7475
  width += Filter.getSpread(filter);
7476
+ if (renderSpread)
7477
+ width += renderSpread;
7417
7478
  let shapeWidth = width = Math.ceil(width);
7418
7479
  if (innerShadow)
7419
7480
  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));
@@ -7429,15 +7490,18 @@ const { stintSet: stintSet$1 } = DataHelper;
7429
7490
  const UIRender = {
7430
7491
  __updateChange() {
7431
7492
  const data = this.__;
7493
+ if (data.__useStroke) {
7494
+ const useStroke = data.__useStroke = !!(data.stroke && data.strokeWidth);
7495
+ stintSet$1(this.__world, 'half', useStroke && data.strokeAlign === 'center' && data.strokeWidth % 2);
7496
+ stintSet$1(data, '__fillAfterStroke', useStroke && data.strokeAlign === 'outside' && data.fill && !data.__isTransparentFill);
7497
+ }
7432
7498
  if (data.__useEffect) {
7433
7499
  const { shadow, fill, stroke } = data, otherEffect = data.innerShadow || data.blur || data.backgroundBlur || data.filter;
7434
- 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')));
7500
+ 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')));
7435
7501
  data.__useEffect = !!(shadow || otherEffect);
7436
7502
  }
7437
- stintSet$1(this.__world, 'half', data.__hasHalf);
7438
- stintSet$1(data, '__fillAfterStroke', data.stroke && data.strokeAlign === 'outside' && data.fill && !data.__isTransparentFill);
7439
7503
  data.__checkSingle();
7440
- stintSet$1(data, '__complex', data.__isFills || data.__isStrokes || data.cornerRadius || data.__useEffect);
7504
+ stintSet$1(data, '__complex', (data.__isFills || data.__isStrokes || data.cornerRadius || data.__useEffect));
7441
7505
  },
7442
7506
  __drawFast(canvas, options) {
7443
7507
  drawFast(this, canvas, options);
@@ -7495,18 +7559,15 @@ const UIRender = {
7495
7559
  this.__drawFast(canvas, options);
7496
7560
  }
7497
7561
  },
7498
- __renderShape(canvas, options, ignoreFill, ignoreStroke) {
7499
- if (this.__worldOpacity) {
7500
- canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
7501
- const { fill, stroke } = this.__;
7502
- this.__drawRenderPath(canvas);
7503
- if (fill && !ignoreFill)
7504
- this.__.__isAlphaPixelFill ? Paint.fills(fill, this, canvas) : Paint.fill('#000000', this, canvas);
7505
- if (this.__.__isCanvas)
7506
- this.__drawAfterFill(canvas, options);
7507
- if (stroke && !ignoreStroke)
7508
- this.__.__isAlphaPixelStroke ? Paint.strokes(stroke, this, canvas) : Paint.stroke('#000000', this, canvas);
7509
- }
7562
+ __drawShape(canvas, options) {
7563
+ this.__drawRenderPath(canvas);
7564
+ const data = this.__, { fill, stroke } = data;
7565
+ if (fill && !options.ignoreFill)
7566
+ data.__isAlphaPixelFill ? Paint.fills(fill, this, canvas) : Paint.fill('#000000', this, canvas);
7567
+ if (data.__isCanvas)
7568
+ this.__drawAfterFill(canvas, options);
7569
+ if (stroke && !options.ignoreStroke)
7570
+ data.__isAlphaPixelStroke ? Paint.strokes(stroke, this, canvas) : Paint.stroke('#000000', this, canvas);
7510
7571
  },
7511
7572
  __drawAfterFill(canvas, options) {
7512
7573
  if (this.__.__clipAfterFill) {
@@ -7543,17 +7604,17 @@ const RectRender = {
7543
7604
  if (__drawAfterFill)
7544
7605
  this.__drawAfterFill(canvas, options);
7545
7606
  if (stroke) {
7546
- const { strokeAlign, __strokeWidth } = this.__;
7547
- if (!__strokeWidth)
7607
+ const { strokeAlign, __strokeWidth: strokeWidth } = this.__;
7608
+ if (!strokeWidth)
7548
7609
  return;
7549
- canvas.setStroke(stroke, __strokeWidth, this.__);
7550
- const half = __strokeWidth / 2;
7610
+ canvas.setStroke(stroke, strokeWidth, this.__);
7611
+ const half = strokeWidth / 2;
7551
7612
  switch (strokeAlign) {
7552
7613
  case 'center':
7553
7614
  canvas.strokeRect(0, 0, width, height);
7554
7615
  break;
7555
7616
  case 'inside':
7556
- width -= __strokeWidth, height -= __strokeWidth;
7617
+ width -= strokeWidth, height -= strokeWidth;
7557
7618
  if (width < 0 || height < 0) {
7558
7619
  canvas.save();
7559
7620
  this.__clip(canvas, options);
@@ -7564,7 +7625,7 @@ const RectRender = {
7564
7625
  canvas.strokeRect(x + half, y + half, width, height);
7565
7626
  break;
7566
7627
  case 'outside':
7567
- canvas.strokeRect(x - half, y - half, width + __strokeWidth, height + __strokeWidth);
7628
+ canvas.strokeRect(x - half, y - half, width + strokeWidth, height + strokeWidth);
7568
7629
  break;
7569
7630
  }
7570
7631
  }
@@ -7577,6 +7638,8 @@ let UI = UI_1 = class UI extends Leaf {
7577
7638
  get isFrame() { return false; }
7578
7639
  set scale(value) { MathHelper.assignScale(this, value); }
7579
7640
  get scale() { return this.__.scale; }
7641
+ get isAutoWidth() { const t = this.__; return t.__autoWidth || t.autoWidth; }
7642
+ get isAutoHeight() { const t = this.__; return t.__autoHeight || t.autoHeight; }
7580
7643
  get pen() {
7581
7644
  const { path } = this.__;
7582
7645
  pen.set(this.path = path || []);
@@ -7631,12 +7694,14 @@ let UI = UI_1 = class UI extends Leaf {
7631
7694
  }
7632
7695
  }
7633
7696
  __updateRenderPath() {
7634
- if (this.__.path) {
7635
- const data = this.__;
7697
+ const data = this.__;
7698
+ if (data.path) {
7636
7699
  data.__pathForRender = data.cornerRadius ? PathCorner.smooth(data.path, data.cornerRadius, data.cornerSmoothing) : data.path;
7637
7700
  if (data.__useArrow)
7638
7701
  PathArrow.addArrows(this, !data.cornerRadius);
7639
7702
  }
7703
+ else
7704
+ data.__pathForRender && (data.__pathForRender = undefined);
7640
7705
  }
7641
7706
  __drawRenderPath(canvas) {
7642
7707
  canvas.beginPath();
@@ -7789,6 +7854,9 @@ __decorate([
7789
7854
  __decorate([
7790
7855
  naturalBoundsType(1)
7791
7856
  ], UI.prototype, "pixelRatio", void 0);
7857
+ __decorate([
7858
+ affectRenderBoundsType(0)
7859
+ ], UI.prototype, "renderSpread", void 0);
7792
7860
  __decorate([
7793
7861
  pathInputType()
7794
7862
  ], UI.prototype, "path", void 0);
@@ -7847,13 +7915,13 @@ __decorate([
7847
7915
  surfaceType()
7848
7916
  ], UI.prototype, "fill", void 0);
7849
7917
  __decorate([
7850
- strokeType()
7918
+ strokeType(undefined, true)
7851
7919
  ], UI.prototype, "stroke", void 0);
7852
7920
  __decorate([
7853
7921
  strokeType('inside')
7854
7922
  ], UI.prototype, "strokeAlign", void 0);
7855
7923
  __decorate([
7856
- strokeType(1)
7924
+ strokeType(1, true)
7857
7925
  ], UI.prototype, "strokeWidth", void 0);
7858
7926
  __decorate([
7859
7927
  strokeType(false)
@@ -7945,7 +8013,8 @@ let Group = class Group extends UI {
7945
8013
  }
7946
8014
  toJSON(options) {
7947
8015
  const data = super.toJSON(options);
7948
- data.children = this.children.map(child => child.toJSON(options));
8016
+ if (!this.childlessJSON)
8017
+ data.children = this.children.map(child => child.toJSON(options));
7949
8018
  return data;
7950
8019
  }
7951
8020
  pick(_hitPoint, _options) { return undefined; }
@@ -8280,7 +8349,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8280
8349
  list.push(item);
8281
8350
  this.requestRender();
8282
8351
  }
8283
- zoom(_zoomType, _padding, _fixedScale, _transition) {
8352
+ zoom(_zoomType, _optionsOrPadding, _scroll, _transition) {
8284
8353
  return Plugin.need('view');
8285
8354
  }
8286
8355
  getValidMove(moveX, moveY) { return { x: moveX, y: moveY }; }
@@ -8325,7 +8394,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8325
8394
  Leafer_1.list.remove(this);
8326
8395
  try {
8327
8396
  this.stop();
8328
- this.emitEvent(new LeaferEvent(LeaferEvent.END, this));
8397
+ this.emitLeafer(LeaferEvent.END);
8329
8398
  this.__removeListenEvents();
8330
8399
  this.__controllers.forEach(item => !(this.parent && item === this.interaction) && item.destroy());
8331
8400
  this.__controllers.length = 0;
@@ -8392,8 +8461,8 @@ let Box = class Box extends Group {
8392
8461
  __updateRenderSpread() { return this.__updateRectRenderSpread() || -1; }
8393
8462
  __updateRectBoxBounds() { }
8394
8463
  __updateBoxBounds(_secondLayout) {
8395
- const data = this.__;
8396
8464
  if (this.children.length && !this.pathInputed) {
8465
+ const data = this.__;
8397
8466
  if (data.__autoSide) {
8398
8467
  if (data.__hasSurface)
8399
8468
  this.__extraUpdate();
@@ -8420,20 +8489,26 @@ let Box = class Box extends Group {
8420
8489
  __updateStrokeBounds() { }
8421
8490
  __updateRenderBounds() {
8422
8491
  let isOverflow;
8423
- const { renderBounds } = this.__layout;
8424
8492
  if (this.children.length) {
8493
+ const data = this.__, { renderBounds, boxBounds } = this.__layout;
8425
8494
  super.__updateRenderBounds();
8426
8495
  copy$2(childrenRenderBounds, renderBounds);
8427
8496
  this.__updateRectRenderBounds();
8428
- isOverflow = !includes$1(renderBounds, childrenRenderBounds);
8429
- if (isOverflow && this.__.overflow !== 'hide')
8497
+ if (data.scrollY || data.scrollX) {
8498
+ childrenRenderBounds.x += data.scrollX;
8499
+ childrenRenderBounds.y += data.scrollY;
8500
+ }
8501
+ isOverflow = !includes$1(boxBounds, childrenRenderBounds);
8502
+ if (isOverflow && data.overflow !== 'hide')
8430
8503
  add(renderBounds, childrenRenderBounds);
8431
8504
  }
8432
8505
  else
8433
8506
  this.__updateRectRenderBounds();
8434
8507
  DataHelper.stintSet(this, 'isOverflow', isOverflow);
8508
+ this.__updateScrollBar();
8435
8509
  }
8436
8510
  __updateRectRenderBounds() { }
8511
+ __updateScrollBar() { }
8437
8512
  __updateRectChange() { }
8438
8513
  __updateChange() {
8439
8514
  super.__updateChange();
@@ -8450,10 +8525,12 @@ let Box = class Box extends Group {
8450
8525
  if (this.children.length)
8451
8526
  this.__renderGroup(canvas, options);
8452
8527
  }
8528
+ if (this.scrollBar)
8529
+ this.scrollBar.__render(canvas, options);
8453
8530
  }
8454
8531
  __drawContent(canvas, options) {
8455
8532
  this.__renderGroup(canvas, options);
8456
- if (this.__.__hasStroke) {
8533
+ if (this.__.__useStroke || this.__.__useEffect) {
8457
8534
  canvas.setWorld(this.__nowWorld);
8458
8535
  this.__drawRenderPath(canvas);
8459
8536
  }
@@ -8673,8 +8750,8 @@ let Polygon = class Polygon extends UI {
8673
8750
  for (let i = 1; i < sides; i++) {
8674
8751
  lineTo$1(path, rx + rx * sin$1((i * 2 * PI$1) / sides), ry - ry * cos$1((i * 2 * PI$1) / sides));
8675
8752
  }
8753
+ closePath$1(path);
8676
8754
  }
8677
- closePath$1(path);
8678
8755
  }
8679
8756
  __updateRenderPath() { }
8680
8757
  __updateBoxBounds() { }
@@ -8912,6 +8989,11 @@ let Text = class Text extends UI {
8912
8989
  return;
8913
8990
  super.__draw(canvas, options, originCanvas);
8914
8991
  }
8992
+ __drawShape(canvas, options) {
8993
+ if (options.shape)
8994
+ this.__box && this.__box.__drawShape(canvas, options);
8995
+ super.__drawShape(canvas, options);
8996
+ }
8915
8997
  destroy() {
8916
8998
  if (this.boxStyle)
8917
8999
  this.boxStyle = null;
@@ -9107,9 +9189,14 @@ function fills(fills, ui, canvas) {
9107
9189
  }
9108
9190
  }
9109
9191
  canvas.fillStyle = item.style;
9110
- if (item.transform) {
9192
+ if (item.transform || item.scaleFixed) {
9111
9193
  canvas.save();
9112
- canvas.transform(item.transform);
9194
+ if (item.transform)
9195
+ canvas.transform(item.transform);
9196
+ if (item.scaleFixed) {
9197
+ const { scaleX, scaleY } = ui.getRenderScaleData(true);
9198
+ canvas.scale(1 / scaleX, 1 / scaleY);
9199
+ }
9113
9200
  if (item.blendMode)
9114
9201
  canvas.blendMode = item.blendMode;
9115
9202
  fillPathOrText(ui, canvas);
@@ -9145,8 +9232,13 @@ function strokeText(stroke, ui, canvas) {
9145
9232
  }
9146
9233
  function drawCenter$1(stroke, strokeWidthScale, ui, canvas) {
9147
9234
  const data = ui.__;
9148
- canvas.setStroke(!data.__isStrokes && stroke, data.strokeWidth * strokeWidthScale, data);
9149
- data.__isStrokes ? drawStrokesStyle(stroke, true, ui, canvas) : drawTextStroke(ui, canvas);
9235
+ if (typeof stroke === 'object') {
9236
+ drawStrokesStyle(stroke, strokeWidthScale, true, ui, canvas);
9237
+ }
9238
+ else {
9239
+ canvas.setStroke(stroke, data.__strokeWidth * strokeWidthScale, data);
9240
+ drawTextStroke(ui, canvas);
9241
+ }
9150
9242
  }
9151
9243
  function drawAlign(stroke, align, ui, canvas) {
9152
9244
  const out = canvas.getSameCanvas(true, true);
@@ -9155,15 +9247,9 @@ function drawAlign(stroke, align, ui, canvas) {
9155
9247
  out.blendMode = align === 'outside' ? 'destination-out' : 'destination-in';
9156
9248
  fillText(ui, out);
9157
9249
  out.blendMode = 'normal';
9158
- copyWorld(canvas, out, ui);
9250
+ LeafHelper.copyCanvasByWorld(ui, canvas, out);
9159
9251
  out.recycle(ui.__nowWorld);
9160
9252
  }
9161
- function copyWorld(canvas, out, ui) {
9162
- if (ui.__worldFlipped || Platform.fullImageShadow)
9163
- canvas.copyWorldByReset(out, ui.__nowWorld);
9164
- else
9165
- canvas.copyWorldToInner(out, ui.__nowWorld, ui.__layout.renderBounds);
9166
- }
9167
9253
  function drawTextStroke(ui, canvas) {
9168
9254
  let row, data = ui.__.__textDrawData;
9169
9255
  const { rows, decorationY } = data;
@@ -9179,14 +9265,21 @@ function drawTextStroke(ui, canvas) {
9179
9265
  rows.forEach(row => decorationY.forEach(value => canvas.strokeRect(row.x, row.y + value, row.width, decorationHeight)));
9180
9266
  }
9181
9267
  }
9182
- function drawStrokesStyle(strokes, isText, ui, canvas) {
9268
+ function drawStrokesStyle(strokes, strokeWidthScale, isText, ui, canvas) {
9183
9269
  let item;
9270
+ const data = ui.__, { __hasMultiStrokeStyle } = data;
9271
+ __hasMultiStrokeStyle || canvas.setStroke(undefined, data.__strokeWidth * strokeWidthScale, data);
9184
9272
  for (let i = 0, len = strokes.length; i < len; i++) {
9185
9273
  item = strokes[i];
9186
9274
  if (item.image && PaintImage.checkImage(ui, canvas, item, false))
9187
9275
  continue;
9188
9276
  if (item.style) {
9189
- canvas.strokeStyle = item.style;
9277
+ if (__hasMultiStrokeStyle) {
9278
+ const { strokeStyle } = item;
9279
+ strokeStyle ? canvas.setStroke(item.style, data.__getRealStrokeWidth(strokeStyle) * strokeWidthScale, data, strokeStyle) : canvas.setStroke(item.style, data.__strokeWidth * strokeWidthScale, data);
9280
+ }
9281
+ else
9282
+ canvas.strokeStyle = item.style;
9190
9283
  if (item.blendMode) {
9191
9284
  canvas.saveBlendMode(item.blendMode);
9192
9285
  isText ? drawTextStroke(ui, canvas) : canvas.stroke();
@@ -9225,8 +9318,13 @@ function strokes(strokes, ui, canvas) {
9225
9318
  }
9226
9319
  function drawCenter(stroke, strokeWidthScale, ui, canvas) {
9227
9320
  const data = ui.__;
9228
- canvas.setStroke(!data.__isStrokes && stroke, data.__strokeWidth * strokeWidthScale, data);
9229
- data.__isStrokes ? drawStrokesStyle(stroke, false, ui, canvas) : canvas.stroke();
9321
+ if (typeof stroke === 'object') {
9322
+ drawStrokesStyle(stroke, strokeWidthScale, false, ui, canvas);
9323
+ }
9324
+ else {
9325
+ canvas.setStroke(stroke, data.__strokeWidth * strokeWidthScale, data);
9326
+ canvas.stroke();
9327
+ }
9230
9328
  if (data.__useArrow)
9231
9329
  Paint.strokeArrow(stroke, ui, canvas);
9232
9330
  }
@@ -9248,7 +9346,7 @@ function drawOutside(stroke, ui, canvas) {
9248
9346
  drawCenter(stroke, 2, ui, out);
9249
9347
  out.clipUI(data);
9250
9348
  out.clearWorld(renderBounds);
9251
- copyWorld(canvas, out, ui);
9349
+ LeafHelper.copyCanvasByWorld(ui, canvas, out);
9252
9350
  out.recycle(ui.__nowWorld);
9253
9351
  }
9254
9352
  }
@@ -9303,8 +9401,16 @@ function compute(attrName, ui) {
9303
9401
  if (!(paints instanceof Array))
9304
9402
  paints = [paints];
9305
9403
  recycleMap = PaintImage.recycleImage(attrName, data);
9404
+ let maxChildStrokeWidth;
9306
9405
  for (let i = 0, len = paints.length, item; i < len; i++) {
9307
- (item = getLeafPaint(attrName, paints[i], ui)) && leafPaints.push(item);
9406
+ if (item = getLeafPaint(attrName, paints[i], ui)) {
9407
+ leafPaints.push(item);
9408
+ if (item.strokeStyle) {
9409
+ maxChildStrokeWidth || (maxChildStrokeWidth = 1);
9410
+ if (item.strokeStyle.strokeWidth)
9411
+ maxChildStrokeWidth = Math.max(maxChildStrokeWidth, item.strokeStyle.strokeWidth);
9412
+ }
9413
+ }
9308
9414
  }
9309
9415
  data['_' + attrName] = leafPaints.length ? leafPaints : undefined;
9310
9416
  if (leafPaints.length) {
@@ -9321,6 +9427,7 @@ function compute(attrName, ui) {
9321
9427
  else {
9322
9428
  stintSet(data, '__isAlphaPixelStroke', isAlphaPixel);
9323
9429
  stintSet(data, '__isTransparentStroke', isTransparent);
9430
+ stintSet(data, '__hasMultiStrokeStyle', maxChildStrokeWidth);
9324
9431
  }
9325
9432
  }
9326
9433
  function getLeafPaint(attrName, paint, ui) {
@@ -9352,6 +9459,11 @@ function getLeafPaint(attrName, paint, ui) {
9352
9459
  if (data) {
9353
9460
  if (typeof data.style === 'string' && hasTransparent$1(data.style))
9354
9461
  data.isTransparent = true;
9462
+ if (paint.style) {
9463
+ if (paint.style.strokeWidth === 0)
9464
+ return undefined;
9465
+ data.strokeStyle = paint.style;
9466
+ }
9355
9467
  if (paint.blendMode)
9356
9468
  data.blendMode = paint.blendMode;
9357
9469
  }
@@ -9371,8 +9483,8 @@ const PaintModule = {
9371
9483
  shape
9372
9484
  };
9373
9485
 
9374
- let origin = {};
9375
- const { get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, scale: scaleHelper, rotate } = MatrixHelper;
9486
+ let origin = {}, tempMatrix = getMatrixData();
9487
+ const { get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, multiplyParent, scale: scaleHelper, rotate, skew: skewHelper } = MatrixHelper;
9376
9488
  function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
9377
9489
  const transform = get$3();
9378
9490
  translate$1(transform, box.x + x, box.y + y);
@@ -9381,13 +9493,19 @@ function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
9381
9493
  rotateOfOuter$1(transform, { x: box.x + box.width / 2, y: box.y + box.height / 2 }, rotation);
9382
9494
  data.transform = transform;
9383
9495
  }
9384
- function clipMode(data, box, x, y, scaleX, scaleY, rotation) {
9496
+ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipSize) {
9385
9497
  const transform = get$3();
9386
- translate$1(transform, box.x + x, box.y + y);
9387
- if (scaleX)
9388
- scaleHelper(transform, scaleX, scaleY);
9389
9498
  if (rotation)
9390
9499
  rotate(transform, rotation);
9500
+ if (skew)
9501
+ skewHelper(transform, skew.x, skew.y);
9502
+ if (scaleX)
9503
+ scaleHelper(transform, scaleX, scaleY);
9504
+ translate$1(transform, box.x + x, box.y + y);
9505
+ if (clipSize) {
9506
+ tempMatrix.a = box.width / clipSize.width, tempMatrix.d = box.height / clipSize.height;
9507
+ multiplyParent(transform, tempMatrix);
9508
+ }
9391
9509
  data.transform = transform;
9392
9510
  }
9393
9511
  function repeatMode(data, box, width, height, x, y, scaleX, scaleY, rotation, align) {
@@ -9424,11 +9542,15 @@ const tempBox = new Bounds();
9424
9542
  const tempScaleData = {};
9425
9543
  const tempImage = {};
9426
9544
  function createData(leafPaint, image, paint, box) {
9427
- const { changeful, sync } = paint;
9545
+ const { changeful, sync, editing, scaleFixed } = paint;
9428
9546
  if (changeful)
9429
9547
  leafPaint.changeful = changeful;
9430
9548
  if (sync)
9431
9549
  leafPaint.sync = sync;
9550
+ if (editing)
9551
+ leafPaint.editing = editing;
9552
+ if (scaleFixed)
9553
+ leafPaint.scaleFixed = scaleFixed;
9432
9554
  leafPaint.data = getPatternData(paint, box, image);
9433
9555
  }
9434
9556
  function getPatternData(paint, box, image) {
@@ -9437,7 +9559,7 @@ function getPatternData(paint, box, image) {
9437
9559
  if (paint.mode === 'strench')
9438
9560
  paint.mode = 'stretch';
9439
9561
  let { width, height } = image;
9440
- const { opacity, mode, align, offset, scale, size, rotation, repeat, filters } = paint;
9562
+ const { opacity, mode, align, offset, scale, size, rotation, skew, clipSize, repeat, filters } = paint;
9441
9563
  const sameBox = box.width === width && box.height === height;
9442
9564
  const data = { mode };
9443
9565
  const swapSize = align !== 'center' && (rotation || 0) % 180 === 90;
@@ -9471,8 +9593,8 @@ function getPatternData(paint, box, image) {
9471
9593
  break;
9472
9594
  case 'normal':
9473
9595
  case 'clip':
9474
- if (tempImage.x || tempImage.y || scaleX || rotation)
9475
- clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation);
9596
+ if (tempImage.x || tempImage.y || scaleX || clipSize || rotation || skew)
9597
+ clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, paint.clipSize);
9476
9598
  break;
9477
9599
  case 'repeat':
9478
9600
  if (!sameBox || scaleX || rotation)
@@ -9549,11 +9671,11 @@ function image(ui, attrName, paint, boxBounds, firstUse) {
9549
9671
  }
9550
9672
  onLoadSuccess(ui, event);
9551
9673
  }
9552
- leafPaint.loadId = null;
9674
+ leafPaint.loadId = undefined;
9553
9675
  }, (error) => {
9554
9676
  ignoreRender(ui, false);
9555
9677
  onLoadError(ui, event, error);
9556
- leafPaint.loadId = null;
9678
+ leafPaint.loadId = undefined;
9557
9679
  });
9558
9680
  if (ui.placeholderColor) {
9559
9681
  if (!ui.placeholderDelay)
@@ -9609,16 +9731,16 @@ function ignoreRender(ui, value) {
9609
9731
  }
9610
9732
 
9611
9733
  const { get: get$1, scale, copy: copy$1 } = MatrixHelper;
9612
- const { ceil, abs: abs$1 } = Math;
9734
+ const { ceil, abs } = Math;
9613
9735
  function createPattern(ui, paint, pixelRatio) {
9614
- let { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9736
+ let { scaleX, scaleY } = ui.getRenderScaleData(true, paint.scaleFixed);
9615
9737
  const id = scaleX + '-' + scaleY + '-' + pixelRatio;
9616
9738
  if (paint.patternId !== id && !ui.destroyed) {
9617
- scaleX = abs$1(scaleX);
9618
- scaleY = abs$1(scaleY);
9619
9739
  const { image, data } = paint;
9620
9740
  let imageScale, imageMatrix, { width, height, scaleX: sx, scaleY: sy, transform, repeat } = data;
9621
9741
  if (sx) {
9742
+ sx = abs(sx);
9743
+ sy = abs(sy);
9622
9744
  imageMatrix = get$1();
9623
9745
  copy$1(imageMatrix, transform);
9624
9746
  scale(imageMatrix, 1 / sx, 1 / sy);
@@ -9671,9 +9793,8 @@ function createPattern(ui, paint, pixelRatio) {
9671
9793
  }
9672
9794
  }
9673
9795
 
9674
- const { abs } = Math;
9675
9796
  function checkImage(ui, canvas, paint, allowDraw) {
9676
- const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9797
+ const { scaleX, scaleY } = ui.getRenderScaleData(true, paint.scaleFixed);
9677
9798
  const { pixelRatio } = canvas, { data } = paint;
9678
9799
  if (!data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
9679
9800
  return false;
@@ -9686,8 +9807,8 @@ function checkImage(ui, canvas, paint, allowDraw) {
9686
9807
  else {
9687
9808
  if (!(paint.changeful || ResizeEvent.isResizing(ui) || Export.running)) {
9688
9809
  let { width, height } = data;
9689
- width *= abs(scaleX) * pixelRatio;
9690
- height *= abs(scaleY) * pixelRatio;
9810
+ width *= scaleX * pixelRatio;
9811
+ height *= scaleY * pixelRatio;
9691
9812
  if (data.scaleX) {
9692
9813
  width *= data.scaleX;
9693
9814
  height *= data.scaleY;
@@ -9697,6 +9818,10 @@ function checkImage(ui, canvas, paint, allowDraw) {
9697
9818
  }
9698
9819
  }
9699
9820
  if (allowDraw) {
9821
+ if (ui.__.__isFastShadow) {
9822
+ canvas.fillStyle = paint.style || '#000';
9823
+ canvas.fill();
9824
+ }
9700
9825
  drawImage(ui, canvas, paint, data);
9701
9826
  return true;
9702
9827
  }
@@ -9885,10 +10010,7 @@ function shadow(ui, current, shape) {
9885
10010
  }
9886
10011
  worldCanvas ? other.copyWorld(worldCanvas, nowWorld, nowWorld, 'destination-out') : other.copyWorld(shape.canvas, shapeBounds, bounds, 'destination-out');
9887
10012
  }
9888
- if (ui.__worldFlipped)
9889
- current.copyWorldByReset(other, copyBounds, nowWorld, item.blendMode);
9890
- else
9891
- current.copyWorldToInner(other, copyBounds, __layout.renderBounds, item.blendMode);
10013
+ LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
9892
10014
  if (end && index < end)
9893
10015
  other.clearWorld(copyBounds, true);
9894
10016
  });
@@ -9947,10 +10069,7 @@ function innerShadow(ui, current, shape) {
9947
10069
  copyBounds = bounds;
9948
10070
  }
9949
10071
  other.fillWorld(copyBounds, ColorConvert.string(item.color), 'source-in');
9950
- if (ui.__worldFlipped)
9951
- current.copyWorldByReset(other, copyBounds, nowWorld, item.blendMode);
9952
- else
9953
- current.copyWorldToInner(other, copyBounds, __layout.renderBounds, item.blendMode);
10072
+ LeafHelper.copyCanvasByWorld(ui, current, other, copyBounds, item.blendMode);
9954
10073
  if (end && index < end)
9955
10074
  other.clearWorld(copyBounds, true);
9956
10075
  });
@@ -10006,12 +10125,11 @@ Group.prototype.__renderMask = function (canvas, options) {
10006
10125
  contentCanvas = getCanvas(canvas);
10007
10126
  child.__render(maskCanvas, options);
10008
10127
  }
10009
- if (!(mask === 'clipping' || mask === 'clipping-path'))
10010
- continue;
10011
- }
10012
- if (excludeRenderBounds(child, options))
10128
+ if (mask === 'clipping' || mask === 'clipping-path')
10129
+ excludeRenderBounds(child, options) || child.__render(canvas, options);
10013
10130
  continue;
10014
- child.__render(contentCanvas || canvas, options);
10131
+ }
10132
+ excludeRenderBounds(child, options) || child.__render(contentCanvas || canvas, options);
10015
10133
  }
10016
10134
  maskEnd(this, currentMask, canvas, contentCanvas, maskCanvas, maskOpacity);
10017
10135
  };
@@ -10597,4 +10715,4 @@ try {
10597
10715
  }
10598
10716
  catch (_a) { }
10599
10717
 
10600
- 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 };
10718
+ 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 };