leafer-draw 1.0.8 → 1.0.10

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.
@@ -1411,14 +1411,13 @@ const UICreator = {
1411
1411
  list: {},
1412
1412
  register(UI) {
1413
1413
  const { __tag: tag } = UI.prototype;
1414
- if (list$1[tag]) {
1414
+ if (list$1[tag])
1415
1415
  debug$d.repeat(tag);
1416
- }
1417
- else {
1418
- list$1[tag] = UI;
1419
- }
1416
+ list$1[tag] = UI;
1420
1417
  },
1421
1418
  get(tag, data, x, y, width, height) {
1419
+ if (!list$1[tag])
1420
+ debug$d.error('not register ' + tag);
1422
1421
  const ui = new list$1[tag](data);
1423
1422
  if (x !== undefined) {
1424
1423
  ui.x = x;
@@ -1442,7 +1441,7 @@ const EventCreator = {
1442
1441
  Object.keys(Event).forEach(key => {
1443
1442
  name = Event[key];
1444
1443
  if (typeof name === 'string')
1445
- nameList[name] ? debug$c.repeat(name) : nameList[name] = Event;
1444
+ nameList[name] && debug$c.repeat(name), nameList[name] = Event;
1446
1445
  });
1447
1446
  },
1448
1447
  changeName(oldName, newName) {
@@ -1644,7 +1643,7 @@ class LeafData {
1644
1643
  const t = this;
1645
1644
  if (t.blendMode === 'pass-through') {
1646
1645
  const leaf = this.__leaf;
1647
- if ((t.opacity < 1 && leaf.isBranch) || leaf.__hasEraser || t.eraser) {
1646
+ if ((t.opacity < 1 && (leaf.isBranch || t.__hasMultiPaint)) || leaf.__hasEraser || t.eraser) {
1648
1647
  t.__single = true;
1649
1648
  }
1650
1649
  else if (t.__single) {
@@ -2042,8 +2041,9 @@ class LeaferCanvasBase extends Canvas$1 {
2042
2041
  takeCanvas = this.getSameCanvas();
2043
2042
  takeCanvas.copyWorld(this);
2044
2043
  }
2045
- DataHelper.copyAttrs(this.size, size, canvasSizeAttrs);
2046
- this.size.pixelRatio || (this.size.pixelRatio = 1);
2044
+ const s = this.size;
2045
+ DataHelper.copyAttrs(s, size, canvasSizeAttrs);
2046
+ canvasSizeAttrs.forEach(key => s[key] || (s[key] = 1));
2047
2047
  this.bounds = new Bounds(0, 0, this.width, this.height);
2048
2048
  if (this.context && !this.unreal) {
2049
2049
  this.updateViewSize();
@@ -2157,6 +2157,17 @@ class LeaferCanvasBase extends Canvas$1 {
2157
2157
  if (!onlyResetTransform)
2158
2158
  this.useWorldTransform();
2159
2159
  }
2160
+ useGrayscaleAlpha(bounds) {
2161
+ this.setTempBounds(bounds, true, true);
2162
+ let alpha, pixel;
2163
+ const { context } = this, imageData = context.getImageData(tempBounds$1.x, tempBounds$1.y, tempBounds$1.width, tempBounds$1.height), { data } = imageData;
2164
+ for (let i = 0, len = data.length; i < len; i += 4) {
2165
+ pixel = data[i] * 0.299 + data[i + 1] * 0.587 + data[i + 2] * 0.114;
2166
+ if (alpha = data[i + 3])
2167
+ data[i + 3] = alpha === 255 ? pixel : alpha * (pixel / 255);
2168
+ }
2169
+ context.putImageData(imageData, tempBounds$1.x, tempBounds$1.y);
2170
+ }
2160
2171
  useMask(maskCanvas, fromBounds, toBounds) {
2161
2172
  this.copyWorld(maskCanvas, fromBounds, toBounds, 'destination-in');
2162
2173
  }
@@ -2167,7 +2178,7 @@ class LeaferCanvasBase extends Canvas$1 {
2167
2178
  if (blendMode)
2168
2179
  this.blendMode = blendMode;
2169
2180
  this.fillStyle = color;
2170
- tempBounds$1.set(bounds).scale(this.pixelRatio);
2181
+ this.setTempBounds(bounds);
2171
2182
  this.fillRect(tempBounds$1.x, tempBounds$1.y, tempBounds$1.width, tempBounds$1.height);
2172
2183
  if (blendMode)
2173
2184
  this.blendMode = 'source-over';
@@ -2176,22 +2187,18 @@ class LeaferCanvasBase extends Canvas$1 {
2176
2187
  if (blendMode)
2177
2188
  this.blendMode = blendMode;
2178
2189
  this.strokeStyle = color;
2179
- tempBounds$1.set(bounds).scale(this.pixelRatio);
2190
+ this.setTempBounds(bounds);
2180
2191
  this.strokeRect(tempBounds$1.x, tempBounds$1.y, tempBounds$1.width, tempBounds$1.height);
2181
2192
  if (blendMode)
2182
2193
  this.blendMode = 'source-over';
2183
2194
  }
2184
2195
  clearWorld(bounds, ceilPixel) {
2185
- tempBounds$1.set(bounds).scale(this.pixelRatio);
2186
- if (ceilPixel)
2187
- tempBounds$1.ceil();
2196
+ this.setTempBounds(bounds, ceilPixel);
2188
2197
  this.clearRect(tempBounds$1.x, tempBounds$1.y, tempBounds$1.width, tempBounds$1.height);
2189
2198
  }
2190
2199
  clipWorld(bounds, ceilPixel) {
2191
2200
  this.beginPath();
2192
- tempBounds$1.set(bounds).scale(this.pixelRatio);
2193
- if (ceilPixel)
2194
- tempBounds$1.ceil();
2201
+ this.setTempBounds(bounds, ceilPixel);
2195
2202
  this.rect(tempBounds$1.x, tempBounds$1.y, tempBounds$1.width, tempBounds$1.height);
2196
2203
  this.clip();
2197
2204
  }
@@ -2199,6 +2206,14 @@ class LeaferCanvasBase extends Canvas$1 {
2199
2206
  const { pixelRatio } = this;
2200
2207
  this.clearRect(0, 0, this.width * pixelRatio + 2, this.height * pixelRatio + 2);
2201
2208
  }
2209
+ setTempBounds(bounds, ceil, intersect) {
2210
+ tempBounds$1.set(bounds);
2211
+ if (intersect)
2212
+ tempBounds$1.intersect(this.bounds);
2213
+ tempBounds$1.scale(this.pixelRatio);
2214
+ if (ceil)
2215
+ tempBounds$1.ceil();
2216
+ }
2202
2217
  isSameSize(size) {
2203
2218
  return this.width === size.width && this.height === size.height && this.pixelRatio === size.pixelRatio;
2204
2219
  }
@@ -5212,13 +5227,14 @@ const BranchRender = {
5212
5227
  this.__.__checkSingle();
5213
5228
  },
5214
5229
  __render(canvas, options) {
5230
+ this.__nowWorld = this.__getNowWorld(options);
5215
5231
  if (this.__worldOpacity) {
5216
5232
  if (this.__.__single) {
5217
5233
  if (this.__.eraser === 'path')
5218
5234
  return this.__renderEraser(canvas, options);
5219
5235
  const tempCanvas = canvas.getSameCanvas(false, true);
5220
5236
  this.__renderBranch(tempCanvas, options);
5221
- const nowWorld = this.__getNowWorld(options);
5237
+ const nowWorld = this.__nowWorld;
5222
5238
  canvas.opacity = this.__.opacity;
5223
5239
  canvas.copyWorldByReset(tempCanvas, nowWorld, nowWorld, this.__.__blendMode, true);
5224
5240
  tempCanvas.recycle(nowWorld);
@@ -5959,7 +5975,7 @@ class LeafLevelList {
5959
5975
  }
5960
5976
  }
5961
5977
 
5962
- const version = "1.0.8";
5978
+ const version = "1.0.10";
5963
5979
 
5964
5980
  const debug$5 = Debug.get('LeaferCanvas');
5965
5981
  class LeaferCanvas extends LeaferCanvasBase {
@@ -6601,7 +6617,8 @@ class Renderer {
6601
6617
  this.totalBounds = new Bounds();
6602
6618
  debug$3.log(target.innerName, '--->');
6603
6619
  try {
6604
- target.app.emit(RenderEvent.CHILD_START, target);
6620
+ if (!target.isApp)
6621
+ target.app.emit(RenderEvent.CHILD_START, target);
6605
6622
  this.emitRender(RenderEvent.START);
6606
6623
  this.renderOnce(callback);
6607
6624
  this.emitRender(RenderEvent.END, this.totalBounds);
@@ -6882,6 +6899,12 @@ class UIData extends LeafData {
6882
6899
  return strokeWidth;
6883
6900
  }
6884
6901
  get __hasStroke() { return this.stroke && this.strokeWidth; }
6902
+ get __hasMultiPaint() {
6903
+ const t = this;
6904
+ if ((t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect)
6905
+ return true;
6906
+ return t.fill && this.__hasStroke;
6907
+ }
6885
6908
  get __clipAfterFill() { return (this.cornerRadius || this.__pathInputed); }
6886
6909
  get __autoWidth() { return !this._width; }
6887
6910
  get __autoHeight() { return !this._height; }
@@ -7251,9 +7274,8 @@ const RectRender = {
7251
7274
  canvas.strokeRect(half, half, width, height);
7252
7275
  canvas.restore();
7253
7276
  }
7254
- else {
7277
+ else
7255
7278
  canvas.strokeRect(half, half, width, height);
7256
- }
7257
7279
  break;
7258
7280
  case 'outside':
7259
7281
  canvas.strokeRect(-half, -half, width + __strokeWidth, height + __strokeWidth);
@@ -7478,6 +7500,15 @@ __decorate([
7478
7500
  __decorate([
7479
7501
  boundsType(0)
7480
7502
  ], UI.prototype, "padding", void 0);
7503
+ __decorate([
7504
+ boundsType(false)
7505
+ ], UI.prototype, "lockRatio", void 0);
7506
+ __decorate([
7507
+ boundsType()
7508
+ ], UI.prototype, "widthRange", void 0);
7509
+ __decorate([
7510
+ boundsType()
7511
+ ], UI.prototype, "heightRange", void 0);
7481
7512
  __decorate([
7482
7513
  dataType(false)
7483
7514
  ], UI.prototype, "draggable", void 0);
@@ -7769,8 +7800,6 @@ let Leafer = Leafer_1 = class Leafer extends Group {
7769
7800
  __onResize(event) {
7770
7801
  this.emitEvent(event);
7771
7802
  DataHelper.copyAttrs(this.__, event, canvasSizeAttrs);
7772
- if (!event.width || !event.height)
7773
- debug$1.warn('w = 0 or h = 0');
7774
7803
  setTimeout(() => { if (this.canvasManager)
7775
7804
  this.canvasManager.clearRecycled(); }, 0);
7776
7805
  }
@@ -8095,9 +8124,6 @@ __decorate([
8095
8124
  __decorate([
8096
8125
  dataType(false)
8097
8126
  ], Box.prototype, "resizeChildren", void 0);
8098
- __decorate([
8099
- dataType(false)
8100
- ], Box.prototype, "textBox", void 0);
8101
8127
  __decorate([
8102
8128
  affectRenderBoundsType('show')
8103
8129
  ], Box.prototype, "overflow", void 0);
@@ -8508,7 +8534,6 @@ let Text = class Text extends UI {
8508
8534
  this.__updateTextDrawData();
8509
8535
  const { bounds } = data.__textDrawData;
8510
8536
  const b = layout.boxBounds;
8511
- console.log(bounds, autoWidth, autoHeight);
8512
8537
  if (data.__lineHeight < fontSize)
8513
8538
  spread(bounds, fontSize / 2);
8514
8539
  if (autoWidth || autoHeight) {
@@ -9560,16 +9585,16 @@ const EffectModule = {
9560
9585
 
9561
9586
  const { excludeRenderBounds } = LeafBoundsHelper;
9562
9587
  Group.prototype.__renderMask = function (canvas, options) {
9563
- let child, maskCanvas, contentCanvas, maskOpacity, currentMask;
9588
+ let child, maskCanvas, contentCanvas, maskOpacity, currentMask, mask;
9564
9589
  const { children } = this;
9565
9590
  for (let i = 0, len = children.length; i < len; i++) {
9566
- child = children[i];
9567
- if (child.__.mask) {
9591
+ child = children[i], mask = child.__.mask;
9592
+ if (mask) {
9568
9593
  if (currentMask) {
9569
9594
  maskEnd(this, currentMask, canvas, contentCanvas, maskCanvas, maskOpacity);
9570
9595
  maskCanvas = contentCanvas = null;
9571
9596
  }
9572
- if (child.__.mask === 'path') {
9597
+ if (mask === 'path' || mask === 'clipping-path') {
9573
9598
  if (child.opacity < 1) {
9574
9599
  currentMask = 'opacity-path';
9575
9600
  maskOpacity = child.opacity;
@@ -9583,14 +9608,14 @@ Group.prototype.__renderMask = function (canvas, options) {
9583
9608
  child.__clip(contentCanvas || canvas, options);
9584
9609
  }
9585
9610
  else {
9586
- currentMask = 'alpha';
9611
+ currentMask = mask === 'grayscale' ? 'grayscale' : 'alpha';
9587
9612
  if (!maskCanvas)
9588
9613
  maskCanvas = getCanvas(canvas);
9589
9614
  if (!contentCanvas)
9590
9615
  contentCanvas = getCanvas(canvas);
9591
9616
  child.__render(maskCanvas, options);
9592
9617
  }
9593
- if (child.__.mask !== 'clipping')
9618
+ if (!(mask === 'clipping' || mask === 'clipping-path'))
9594
9619
  continue;
9595
9620
  }
9596
9621
  if (excludeRenderBounds(child, options))
@@ -9601,6 +9626,8 @@ Group.prototype.__renderMask = function (canvas, options) {
9601
9626
  };
9602
9627
  function maskEnd(leaf, maskMode, canvas, contentCanvas, maskCanvas, maskOpacity) {
9603
9628
  switch (maskMode) {
9629
+ case 'grayscale':
9630
+ maskCanvas.useGrayscaleAlpha(leaf.__nowWorld);
9604
9631
  case 'alpha':
9605
9632
  usePixelMask(leaf, canvas, contentCanvas, maskCanvas);
9606
9633
  break;
@@ -10305,15 +10332,12 @@ const canvas = LeaferCanvasBase.prototype;
10305
10332
  const debug = Debug.get('@leafer-ui/export');
10306
10333
  canvas.export = function (filename, options) {
10307
10334
  const { quality, blob } = FileHelper.getExportOptions(options);
10308
- if (filename.includes('.')) {
10335
+ if (filename.includes('.'))
10309
10336
  return this.saveAs(filename, quality);
10310
- }
10311
- else if (blob) {
10337
+ else if (blob)
10312
10338
  return this.toBlob(filename, quality);
10313
- }
10314
- else {
10339
+ else
10315
10340
  return this.toDataURL(filename, quality);
10316
- }
10317
10341
  };
10318
10342
  canvas.toBlob = function (type, quality) {
10319
10343
  return new Promise((resolve) => {