leafer-draw 1.6.6 → 1.7.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$4, sqrt: sqrt$2, atan2: atan2$2, min: min$1, round: round$2 } = Math;
440
440
  const PointHelper = {
441
441
  defaultPoint: getPointData(),
442
442
  tempPoint: {},
@@ -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);
@@ -3339,7 +3340,7 @@ const { getCenterX, getCenterY } = PointHelper;
3339
3340
  const { arcTo } = PathCommandDataHelper;
3340
3341
  const PathCorner = {
3341
3342
  smooth(data, cornerRadius, _cornerSmoothing) {
3342
- let command, commandLen;
3343
+ let command, lastCommand, commandLen;
3343
3344
  let i = 0, x = 0, y = 0, startX = 0, startY = 0, secondX = 0, secondY = 0, lastX = 0, lastY = 0;
3344
3345
  const len = data.length;
3345
3346
  const smooth = [];
@@ -3377,8 +3378,10 @@ const PathCorner = {
3377
3378
  lastY = y;
3378
3379
  break;
3379
3380
  case Z:
3380
- arcTo(smooth, startX, startY, secondX, secondY, cornerRadius, lastX, lastY);
3381
- smooth.push(Z);
3381
+ if (lastCommand !== Z) {
3382
+ arcTo(smooth, startX, startY, secondX, secondY, cornerRadius, lastX, lastY);
3383
+ smooth.push(Z);
3384
+ }
3382
3385
  i += 1;
3383
3386
  break;
3384
3387
  default:
@@ -3387,6 +3390,7 @@ const PathCorner = {
3387
3390
  smooth.push(data[i + j]);
3388
3391
  i += commandLen;
3389
3392
  }
3393
+ lastCommand = command;
3390
3394
  }
3391
3395
  if (command !== Z) {
3392
3396
  smooth[1] = startX;
@@ -3883,12 +3887,12 @@ class LeaferImage {
3883
3887
  try {
3884
3888
  if (transform && pattern.setTransform) {
3885
3889
  pattern.setTransform(transform);
3886
- transform = null;
3890
+ transform = undefined;
3887
3891
  }
3888
3892
  }
3889
3893
  catch (_a) { }
3890
3894
  if (paint)
3891
- paint.transform = transform;
3895
+ DataHelper.stintSet(paint, 'transform', transform);
3892
3896
  return pattern;
3893
3897
  }
3894
3898
  destroy() {
@@ -3993,10 +3997,14 @@ function pathInputType(defaultValue) {
3993
3997
  }));
3994
3998
  }
3995
3999
  const pathType = boundsType;
3996
- function affectStrokeBoundsType(defaultValue) {
4000
+ function affectStrokeBoundsType(defaultValue, useStroke) {
3997
4001
  return decorateLeafAttr(defaultValue, (key) => attr({
3998
4002
  set(value) {
3999
- this.__setAttr(key, value) && doStrokeType(this);
4003
+ if (this.__setAttr(key, value)) {
4004
+ doStrokeType(this);
4005
+ if (useStroke)
4006
+ this.__.__useStroke = true;
4007
+ }
4000
4008
  }
4001
4009
  }));
4002
4010
  }
@@ -5422,6 +5430,8 @@ const LeafBounds = {
5422
5430
 
5423
5431
  const LeafRender = {
5424
5432
  __render(canvas, options) {
5433
+ if (options.shape)
5434
+ return this.__renderShape(canvas, options);
5425
5435
  if (this.__worldOpacity) {
5426
5436
  const data = this.__;
5427
5437
  canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
@@ -5431,12 +5441,10 @@ const LeafRender = {
5431
5441
  return this.__renderEraser(canvas, options);
5432
5442
  const tempCanvas = canvas.getSameCanvas(true, true);
5433
5443
  this.__draw(tempCanvas, options, canvas);
5434
- if (this.__worldFlipped) {
5444
+ if (this.__worldFlipped)
5435
5445
  canvas.copyWorldByReset(tempCanvas, this.__nowWorld, null, data.__blendMode, true);
5436
- }
5437
- else {
5446
+ else
5438
5447
  canvas.copyWorldToInner(tempCanvas, this.__nowWorld, this.__layout.renderBounds, data.__blendMode);
5439
- }
5440
5448
  tempCanvas.recycle(this.__nowWorld);
5441
5449
  }
5442
5450
  else {
@@ -5446,6 +5454,12 @@ const LeafRender = {
5446
5454
  Debug.drawBounds(this, canvas, options);
5447
5455
  }
5448
5456
  },
5457
+ __renderShape(canvas, options) {
5458
+ if (this.__worldOpacity) {
5459
+ canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
5460
+ this.__drawShape(canvas, options);
5461
+ }
5462
+ },
5449
5463
  __clip(canvas, options) {
5450
5464
  if (this.__worldOpacity) {
5451
5465
  canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
@@ -5865,7 +5879,8 @@ let Leaf = class Leaf {
5865
5879
  __drawFast(_canvas, _options) { }
5866
5880
  __draw(_canvas, _options, _originCanvas) { }
5867
5881
  __clip(_canvas, _options) { }
5868
- __renderShape(_canvas, _options, _ignoreFill, _ignoreStroke) { }
5882
+ __renderShape(_canvas, _options) { }
5883
+ __drawShape(_canvas, _options) { }
5869
5884
  __updateWorldOpacity() { }
5870
5885
  __updateChange() { }
5871
5886
  __drawPath(_canvas) { }
@@ -6233,7 +6248,7 @@ class LeafLevelList {
6233
6248
  }
6234
6249
  }
6235
6250
 
6236
- const version = "1.6.6";
6251
+ const version = "1.7.0";
6237
6252
 
6238
6253
  const debug$4 = Debug.get('LeaferCanvas');
6239
6254
  class LeaferCanvas extends LeaferCanvasBase {
@@ -7174,13 +7189,9 @@ class UIData extends LeafData {
7174
7189
  else
7175
7190
  return strokeWidth;
7176
7191
  }
7177
- get __hasStroke() { return this.stroke && this.strokeWidth; }
7178
- get __hasHalf() { const t = this; return (t.stroke && t.strokeAlign === 'center' && t.strokeWidth % 2) || undefined; }
7179
7192
  get __hasMultiPaint() {
7180
7193
  const t = this;
7181
- if ((t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect)
7182
- return true;
7183
- return t.fill && this.__hasStroke;
7194
+ return (t.fill && this.__useStroke) || (t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect;
7184
7195
  }
7185
7196
  get __clipAfterFill() { const t = this; return (t.cornerRadius || t.innerShadow || t.__pathInputed); }
7186
7197
  get __hasSurface() { const t = this; return (t.fill || t.stroke); }
@@ -7471,15 +7482,18 @@ const { stintSet: stintSet$1 } = DataHelper;
7471
7482
  const UIRender = {
7472
7483
  __updateChange() {
7473
7484
  const data = this.__;
7485
+ if (data.__useStroke) {
7486
+ const useStroke = data.__useStroke = !!(data.stroke && data.strokeWidth);
7487
+ stintSet$1(this.__world, 'half', useStroke && data.strokeAlign === 'center' && data.strokeWidth % 2);
7488
+ stintSet$1(data, '__fillAfterStroke', useStroke && data.strokeAlign === 'outside' && data.fill && !data.__isTransparentFill);
7489
+ }
7474
7490
  if (data.__useEffect) {
7475
7491
  const { shadow, fill, stroke } = data, otherEffect = data.innerShadow || data.blur || data.backgroundBlur || data.filter;
7476
7492
  stintSet$1(data, '__isFastShadow', shadow && !otherEffect && shadow.length < 2 && !shadow[0].spread && !(shadow[0].box && data.__isTransparentFill) && fill && !(fill instanceof Array && fill.length > 1) && (this.useFastShadow || !stroke || (stroke && data.strokeAlign === 'inside')));
7477
7493
  data.__useEffect = !!(shadow || otherEffect);
7478
7494
  }
7479
- stintSet$1(this.__world, 'half', data.__hasHalf);
7480
- stintSet$1(data, '__fillAfterStroke', data.stroke && data.strokeAlign === 'outside' && data.fill && !data.__isTransparentFill);
7481
7495
  data.__checkSingle();
7482
- stintSet$1(data, '__complex', data.__isFills || data.__isStrokes || data.cornerRadius || data.__useEffect);
7496
+ stintSet$1(data, '__complex', (data.__isFills || data.__isStrokes || data.cornerRadius || data.__useEffect));
7483
7497
  },
7484
7498
  __drawFast(canvas, options) {
7485
7499
  drawFast(this, canvas, options);
@@ -7537,18 +7551,15 @@ const UIRender = {
7537
7551
  this.__drawFast(canvas, options);
7538
7552
  }
7539
7553
  },
7540
- __renderShape(canvas, options, ignoreFill, ignoreStroke) {
7541
- if (this.__worldOpacity) {
7542
- canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
7543
- const { fill, stroke } = this.__;
7544
- this.__drawRenderPath(canvas);
7545
- if (fill && !ignoreFill)
7546
- this.__.__isAlphaPixelFill ? Paint.fills(fill, this, canvas) : Paint.fill('#000000', this, canvas);
7547
- if (this.__.__isCanvas)
7548
- this.__drawAfterFill(canvas, options);
7549
- if (stroke && !ignoreStroke)
7550
- this.__.__isAlphaPixelStroke ? Paint.strokes(stroke, this, canvas) : Paint.stroke('#000000', this, canvas);
7551
- }
7554
+ __drawShape(canvas, options) {
7555
+ this.__drawRenderPath(canvas);
7556
+ const data = this.__, { fill, stroke } = data;
7557
+ if (fill && !options.ignoreFill)
7558
+ data.__isAlphaPixelFill ? Paint.fills(fill, this, canvas) : Paint.fill('#000000', this, canvas);
7559
+ if (data.__isCanvas)
7560
+ this.__drawAfterFill(canvas, options);
7561
+ if (stroke && !options.ignoreStroke)
7562
+ data.__isAlphaPixelStroke ? Paint.strokes(stroke, this, canvas) : Paint.stroke('#000000', this, canvas);
7552
7563
  },
7553
7564
  __drawAfterFill(canvas, options) {
7554
7565
  if (this.__.__clipAfterFill) {
@@ -7673,12 +7684,14 @@ let UI = UI_1 = class UI extends Leaf {
7673
7684
  }
7674
7685
  }
7675
7686
  __updateRenderPath() {
7676
- if (this.__.path) {
7677
- const data = this.__;
7687
+ const data = this.__;
7688
+ if (data.path) {
7678
7689
  data.__pathForRender = data.cornerRadius ? PathCorner.smooth(data.path, data.cornerRadius, data.cornerSmoothing) : data.path;
7679
7690
  if (data.__useArrow)
7680
7691
  PathArrow.addArrows(this, !data.cornerRadius);
7681
7692
  }
7693
+ else
7694
+ data.__pathForRender && (data.__pathForRender = undefined);
7682
7695
  }
7683
7696
  __drawRenderPath(canvas) {
7684
7697
  canvas.beginPath();
@@ -7889,13 +7902,13 @@ __decorate([
7889
7902
  surfaceType()
7890
7903
  ], UI.prototype, "fill", void 0);
7891
7904
  __decorate([
7892
- strokeType()
7905
+ strokeType(undefined, true)
7893
7906
  ], UI.prototype, "stroke", void 0);
7894
7907
  __decorate([
7895
7908
  strokeType('inside')
7896
7909
  ], UI.prototype, "strokeAlign", void 0);
7897
7910
  __decorate([
7898
- strokeType(1)
7911
+ strokeType(1, true)
7899
7912
  ], UI.prototype, "strokeWidth", void 0);
7900
7913
  __decorate([
7901
7914
  strokeType(false)
@@ -8322,7 +8335,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8322
8335
  list.push(item);
8323
8336
  this.requestRender();
8324
8337
  }
8325
- zoom(_zoomType, _padding, _fixedScale, _transition) {
8338
+ zoom(_zoomType, _optionsOrPadding, _scroll, _transition) {
8326
8339
  return Plugin.need('view');
8327
8340
  }
8328
8341
  getValidMove(moveX, moveY) { return { x: moveX, y: moveY }; }
@@ -8367,7 +8380,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8367
8380
  Leafer_1.list.remove(this);
8368
8381
  try {
8369
8382
  this.stop();
8370
- this.emitEvent(new LeaferEvent(LeaferEvent.END, this));
8383
+ this.emitLeafer(LeaferEvent.END);
8371
8384
  this.__removeListenEvents();
8372
8385
  this.__controllers.forEach(item => !(this.parent && item === this.interaction) && item.destroy());
8373
8386
  this.__controllers.length = 0;
@@ -8495,7 +8508,7 @@ let Box = class Box extends Group {
8495
8508
  }
8496
8509
  __drawContent(canvas, options) {
8497
8510
  this.__renderGroup(canvas, options);
8498
- if (this.__.__hasStroke) {
8511
+ if (this.__.__useStroke) {
8499
8512
  canvas.setWorld(this.__nowWorld);
8500
8513
  this.__drawRenderPath(canvas);
8501
8514
  }
@@ -8715,8 +8728,8 @@ let Polygon = class Polygon extends UI {
8715
8728
  for (let i = 1; i < sides; i++) {
8716
8729
  lineTo$1(path, rx + rx * sin$1((i * 2 * PI$1) / sides), ry - ry * cos$1((i * 2 * PI$1) / sides));
8717
8730
  }
8731
+ closePath$1(path);
8718
8732
  }
8719
- closePath$1(path);
8720
8733
  }
8721
8734
  __updateRenderPath() { }
8722
8735
  __updateBoxBounds() { }
@@ -8950,10 +8963,15 @@ let Text = class Text extends UI {
8950
8963
  const box = this.__box;
8951
8964
  if (box)
8952
8965
  box.__nowWorld = this.__nowWorld, box.__draw(canvas, options, originCanvas);
8953
- if (this.textEditing && !Export.running)
8966
+ if (this.textEditing && !options.exporting)
8954
8967
  return;
8955
8968
  super.__draw(canvas, options, originCanvas);
8956
8969
  }
8970
+ __drawShape(canvas, options) {
8971
+ if (options.shape)
8972
+ this.__box && this.__box.__drawShape(canvas, options);
8973
+ super.__drawShape(canvas, options);
8974
+ }
8957
8975
  destroy() {
8958
8976
  if (this.boxStyle)
8959
8977
  this.boxStyle = null;
@@ -9414,7 +9432,7 @@ const PaintModule = {
9414
9432
  };
9415
9433
 
9416
9434
  let origin = {};
9417
- const { get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, scale: scaleHelper, rotate } = MatrixHelper;
9435
+ const { get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, scale: scaleHelper, rotate, skew: skewHelper } = MatrixHelper;
9418
9436
  function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
9419
9437
  const transform = get$3();
9420
9438
  translate$1(transform, box.x + x, box.y + y);
@@ -9423,13 +9441,15 @@ function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
9423
9441
  rotateOfOuter$1(transform, { x: box.x + box.width / 2, y: box.y + box.height / 2 }, rotation);
9424
9442
  data.transform = transform;
9425
9443
  }
9426
- function clipMode(data, box, x, y, scaleX, scaleY, rotation) {
9444
+ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew) {
9427
9445
  const transform = get$3();
9428
- translate$1(transform, box.x + x, box.y + y);
9429
- if (scaleX)
9430
- scaleHelper(transform, scaleX, scaleY);
9431
9446
  if (rotation)
9432
9447
  rotate(transform, rotation);
9448
+ if (skew)
9449
+ skewHelper(transform, skew.x, skew.y);
9450
+ if (scaleX)
9451
+ scaleHelper(transform, scaleX, scaleY);
9452
+ translate$1(transform, box.x + x, box.y + y);
9433
9453
  data.transform = transform;
9434
9454
  }
9435
9455
  function repeatMode(data, box, width, height, x, y, scaleX, scaleY, rotation, align) {
@@ -9466,11 +9486,13 @@ const tempBox = new Bounds();
9466
9486
  const tempScaleData = {};
9467
9487
  const tempImage = {};
9468
9488
  function createData(leafPaint, image, paint, box) {
9469
- const { changeful, sync } = paint;
9489
+ const { changeful, sync, editing } = paint;
9470
9490
  if (changeful)
9471
9491
  leafPaint.changeful = changeful;
9472
9492
  if (sync)
9473
9493
  leafPaint.sync = sync;
9494
+ if (editing)
9495
+ leafPaint.editing = editing;
9474
9496
  leafPaint.data = getPatternData(paint, box, image);
9475
9497
  }
9476
9498
  function getPatternData(paint, box, image) {
@@ -9479,7 +9501,7 @@ function getPatternData(paint, box, image) {
9479
9501
  if (paint.mode === 'strench')
9480
9502
  paint.mode = 'stretch';
9481
9503
  let { width, height } = image;
9482
- const { opacity, mode, align, offset, scale, size, rotation, repeat, filters } = paint;
9504
+ const { opacity, mode, align, offset, scale, size, rotation, skew, repeat, filters } = paint;
9483
9505
  const sameBox = box.width === width && box.height === height;
9484
9506
  const data = { mode };
9485
9507
  const swapSize = align !== 'center' && (rotation || 0) % 180 === 90;
@@ -9513,8 +9535,8 @@ function getPatternData(paint, box, image) {
9513
9535
  break;
9514
9536
  case 'normal':
9515
9537
  case 'clip':
9516
- if (tempImage.x || tempImage.y || scaleX || rotation)
9517
- clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation);
9538
+ if (tempImage.x || tempImage.y || scaleX || rotation || skew)
9539
+ clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew);
9518
9540
  break;
9519
9541
  case 'repeat':
9520
9542
  if (!sameBox || scaleX || rotation)
@@ -9591,11 +9613,11 @@ function image(ui, attrName, paint, boxBounds, firstUse) {
9591
9613
  }
9592
9614
  onLoadSuccess(ui, event);
9593
9615
  }
9594
- leafPaint.loadId = null;
9616
+ leafPaint.loadId = undefined;
9595
9617
  }, (error) => {
9596
9618
  ignoreRender(ui, false);
9597
9619
  onLoadError(ui, event, error);
9598
- leafPaint.loadId = null;
9620
+ leafPaint.loadId = undefined;
9599
9621
  });
9600
9622
  if (ui.placeholderColor) {
9601
9623
  if (!ui.placeholderDelay)
@@ -9661,6 +9683,8 @@ function createPattern(ui, paint, pixelRatio) {
9661
9683
  const { image, data } = paint;
9662
9684
  let imageScale, imageMatrix, { width, height, scaleX: sx, scaleY: sy, transform, repeat } = data;
9663
9685
  if (sx) {
9686
+ sx = abs$1(sx);
9687
+ sy = abs$1(sy);
9664
9688
  imageMatrix = get$1();
9665
9689
  copy$1(imageMatrix, transform);
9666
9690
  scale(imageMatrix, 1 / sx, 1 / sy);