@nasser-sw/fabric 7.0.1-beta3 → 7.0.1-beta4

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.
Files changed (105) hide show
  1. package/0 +0 -0
  2. package/dist/index.js +323 -155
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.min.js +1 -1
  5. package/dist/index.min.js.map +1 -1
  6. package/dist/index.min.mjs +1 -1
  7. package/dist/index.min.mjs.map +1 -1
  8. package/dist/index.mjs +323 -155
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/index.node.cjs +323 -155
  11. package/dist/index.node.cjs.map +1 -1
  12. package/dist/index.node.mjs +323 -155
  13. package/dist/index.node.mjs.map +1 -1
  14. package/dist/package.json.min.mjs +1 -1
  15. package/dist/package.json.mjs +1 -1
  16. package/dist/src/shapes/Line.d.ts +31 -86
  17. package/dist/src/shapes/Line.d.ts.map +1 -1
  18. package/dist/src/shapes/Line.min.mjs +1 -1
  19. package/dist/src/shapes/Line.min.mjs.map +1 -1
  20. package/dist/src/shapes/Line.mjs +323 -154
  21. package/dist/src/shapes/Line.mjs.map +1 -1
  22. package/dist-extensions/src/shapes/CustomLine.d.ts +10 -0
  23. package/dist-extensions/src/shapes/CustomLine.d.ts.map +1 -0
  24. package/dist-extensions/src/shapes/Line.d.ts +31 -86
  25. package/dist-extensions/src/shapes/Line.d.ts.map +1 -1
  26. package/fabric-test-editor.html +157 -8
  27. package/fabric-test2.html +513 -0
  28. package/fabric.ts +182 -182
  29. package/package.json +1 -1
  30. package/src/shapes/Line.ts +372 -158
  31. package/debug/konva/CHANGELOG.md +0 -1474
  32. package/debug/konva/LICENSE +0 -22
  33. package/debug/konva/README.md +0 -205
  34. package/debug/konva/gulpfile.mjs +0 -110
  35. package/debug/konva/package.json +0 -139
  36. package/debug/konva/release.sh +0 -65
  37. package/debug/konva/resources/doc-includes/ContainerParams.txt +0 -6
  38. package/debug/konva/resources/doc-includes/NodeParams.txt +0 -20
  39. package/debug/konva/resources/doc-includes/ShapeParams.txt +0 -53
  40. package/debug/konva/resources/jsdoc.conf.json +0 -28
  41. package/debug/konva/rollup.config.mjs +0 -32
  42. package/debug/konva/src/Animation.ts +0 -237
  43. package/debug/konva/src/BezierFunctions.ts +0 -826
  44. package/debug/konva/src/Canvas.ts +0 -193
  45. package/debug/konva/src/Container.ts +0 -649
  46. package/debug/konva/src/Context.ts +0 -1017
  47. package/debug/konva/src/Core.ts +0 -5
  48. package/debug/konva/src/DragAndDrop.ts +0 -173
  49. package/debug/konva/src/Factory.ts +0 -246
  50. package/debug/konva/src/FastLayer.ts +0 -29
  51. package/debug/konva/src/Global.ts +0 -210
  52. package/debug/konva/src/Group.ts +0 -31
  53. package/debug/konva/src/Layer.ts +0 -546
  54. package/debug/konva/src/Node.ts +0 -3477
  55. package/debug/konva/src/PointerEvents.ts +0 -67
  56. package/debug/konva/src/Shape.ts +0 -2081
  57. package/debug/konva/src/Stage.ts +0 -1000
  58. package/debug/konva/src/Tween.ts +0 -811
  59. package/debug/konva/src/Util.ts +0 -1123
  60. package/debug/konva/src/Validators.ts +0 -210
  61. package/debug/konva/src/_CoreInternals.ts +0 -85
  62. package/debug/konva/src/_FullInternals.ts +0 -171
  63. package/debug/konva/src/canvas-backend.ts +0 -36
  64. package/debug/konva/src/filters/Blur.ts +0 -388
  65. package/debug/konva/src/filters/Brighten.ts +0 -48
  66. package/debug/konva/src/filters/Brightness.ts +0 -30
  67. package/debug/konva/src/filters/Contrast.ts +0 -75
  68. package/debug/konva/src/filters/Emboss.ts +0 -207
  69. package/debug/konva/src/filters/Enhance.ts +0 -154
  70. package/debug/konva/src/filters/Grayscale.ts +0 -25
  71. package/debug/konva/src/filters/HSL.ts +0 -108
  72. package/debug/konva/src/filters/HSV.ts +0 -106
  73. package/debug/konva/src/filters/Invert.ts +0 -23
  74. package/debug/konva/src/filters/Kaleidoscope.ts +0 -274
  75. package/debug/konva/src/filters/Mask.ts +0 -220
  76. package/debug/konva/src/filters/Noise.ts +0 -44
  77. package/debug/konva/src/filters/Pixelate.ts +0 -107
  78. package/debug/konva/src/filters/Posterize.ts +0 -46
  79. package/debug/konva/src/filters/RGB.ts +0 -82
  80. package/debug/konva/src/filters/RGBA.ts +0 -103
  81. package/debug/konva/src/filters/Sepia.ts +0 -27
  82. package/debug/konva/src/filters/Solarize.ts +0 -29
  83. package/debug/konva/src/filters/Threshold.ts +0 -44
  84. package/debug/konva/src/index.ts +0 -3
  85. package/debug/konva/src/shapes/Arc.ts +0 -176
  86. package/debug/konva/src/shapes/Arrow.ts +0 -231
  87. package/debug/konva/src/shapes/Circle.ts +0 -76
  88. package/debug/konva/src/shapes/Ellipse.ts +0 -121
  89. package/debug/konva/src/shapes/Image.ts +0 -319
  90. package/debug/konva/src/shapes/Label.ts +0 -386
  91. package/debug/konva/src/shapes/Line.ts +0 -364
  92. package/debug/konva/src/shapes/Path.ts +0 -1013
  93. package/debug/konva/src/shapes/Rect.ts +0 -79
  94. package/debug/konva/src/shapes/RegularPolygon.ts +0 -167
  95. package/debug/konva/src/shapes/Ring.ts +0 -94
  96. package/debug/konva/src/shapes/Sprite.ts +0 -370
  97. package/debug/konva/src/shapes/Star.ts +0 -125
  98. package/debug/konva/src/shapes/Text.ts +0 -1065
  99. package/debug/konva/src/shapes/TextPath.ts +0 -583
  100. package/debug/konva/src/shapes/Transformer.ts +0 -1889
  101. package/debug/konva/src/shapes/Wedge.ts +0 -129
  102. package/debug/konva/src/skia-backend.ts +0 -35
  103. package/debug/konva/src/types.ts +0 -84
  104. package/debug/konva/tsconfig.json +0 -31
  105. package/debug/konva/tsconfig.test.json +0 -7
@@ -1,1123 +0,0 @@
1
- import { Konva } from './Global.ts';
2
- import type { Context } from './Context.ts';
3
- import type { IRect, RGB, Vector2d } from './types.ts';
4
-
5
- const NODE_ERROR = `Konva.js unsupported environment.
6
-
7
- Looks like you are trying to use Konva.js in Node.js environment. because "document" object is undefined.
8
-
9
- To use Konva.js in Node.js environment, you need to use the "canvas-backend" or "skia-backend" module.
10
-
11
- bash: npm install canvas
12
- js: import "konva/canvas-backend";
13
-
14
- or
15
-
16
- bash: npm install skia-canvas
17
- js: import "konva/skia-backend";
18
- `;
19
- const ensureBrowser = () => {
20
- if (typeof document === 'undefined') {
21
- throw new Error(NODE_ERROR);
22
- }
23
- };
24
-
25
- /*
26
- * Last updated November 2011
27
- * By Simon Sarris
28
- * www.simonsarris.com
29
- * sarris@acm.org
30
- *
31
- * Free to use and distribute at will
32
- * So long as you are nice to people, etc
33
- */
34
- /*
35
- * The usage of this class was inspired by some of the work done by a forked
36
- * project, KineticJS-Ext by Wappworks, which is based on Simon's Transform
37
- * class. Modified by Eric Rowell
38
- */
39
-
40
- /**
41
- * Transform constructor.
42
- * In most of the cases you don't need to use it in your app. Because it is for internal usage in Konva core.
43
- * But there is a documentation for that class in case you still want
44
- * to make some manual calculations.
45
- * @constructor
46
- * @param {Array} [m] Optional six-element matrix
47
- * @memberof Konva
48
- */
49
- export class Transform {
50
- m: Array<number>;
51
- dirty = false;
52
- constructor(m = [1, 0, 0, 1, 0, 0]) {
53
- this.m = (m && m.slice()) || [1, 0, 0, 1, 0, 0];
54
- }
55
- reset() {
56
- this.m[0] = 1;
57
- this.m[1] = 0;
58
- this.m[2] = 0;
59
- this.m[3] = 1;
60
- this.m[4] = 0;
61
- this.m[5] = 0;
62
- }
63
- /**
64
- * Copy Konva.Transform object
65
- * @method
66
- * @name Konva.Transform#copy
67
- * @returns {Konva.Transform}
68
- * @example
69
- * const tr = shape.getTransform().copy()
70
- */
71
- copy() {
72
- return new Transform(this.m);
73
- }
74
- copyInto(tr: Transform) {
75
- tr.m[0] = this.m[0];
76
- tr.m[1] = this.m[1];
77
- tr.m[2] = this.m[2];
78
- tr.m[3] = this.m[3];
79
- tr.m[4] = this.m[4];
80
- tr.m[5] = this.m[5];
81
- }
82
- /**
83
- * Transform point
84
- * @method
85
- * @name Konva.Transform#point
86
- * @param {Object} point 2D point(x, y)
87
- * @returns {Object} 2D point(x, y)
88
- */
89
- point(point: Vector2d) {
90
- const m = this.m;
91
- return {
92
- x: m[0] * point.x + m[2] * point.y + m[4],
93
- y: m[1] * point.x + m[3] * point.y + m[5],
94
- };
95
- }
96
- /**
97
- * Apply translation
98
- * @method
99
- * @name Konva.Transform#translate
100
- * @param {Number} x
101
- * @param {Number} y
102
- * @returns {Konva.Transform}
103
- */
104
- translate(x: number, y: number) {
105
- this.m[4] += this.m[0] * x + this.m[2] * y;
106
- this.m[5] += this.m[1] * x + this.m[3] * y;
107
- return this;
108
- }
109
- /**
110
- * Apply scale
111
- * @method
112
- * @name Konva.Transform#scale
113
- * @param {Number} sx
114
- * @param {Number} sy
115
- * @returns {Konva.Transform}
116
- */
117
- scale(sx: number, sy: number) {
118
- this.m[0] *= sx;
119
- this.m[1] *= sx;
120
- this.m[2] *= sy;
121
- this.m[3] *= sy;
122
- return this;
123
- }
124
- /**
125
- * Apply rotation
126
- * @method
127
- * @name Konva.Transform#rotate
128
- * @param {Number} rad Angle in radians
129
- * @returns {Konva.Transform}
130
- */
131
- rotate(rad: number) {
132
- const c = Math.cos(rad);
133
- const s = Math.sin(rad);
134
- const m11 = this.m[0] * c + this.m[2] * s;
135
- const m12 = this.m[1] * c + this.m[3] * s;
136
- const m21 = this.m[0] * -s + this.m[2] * c;
137
- const m22 = this.m[1] * -s + this.m[3] * c;
138
- this.m[0] = m11;
139
- this.m[1] = m12;
140
- this.m[2] = m21;
141
- this.m[3] = m22;
142
- return this;
143
- }
144
- /**
145
- * Returns the translation
146
- * @method
147
- * @name Konva.Transform#getTranslation
148
- * @returns {Object} 2D point(x, y)
149
- */
150
- getTranslation() {
151
- return {
152
- x: this.m[4],
153
- y: this.m[5],
154
- };
155
- }
156
- /**
157
- * Apply skew
158
- * @method
159
- * @name Konva.Transform#skew
160
- * @param {Number} sx
161
- * @param {Number} sy
162
- * @returns {Konva.Transform}
163
- */
164
- skew(sx: number, sy: number) {
165
- const m11 = this.m[0] + this.m[2] * sy;
166
- const m12 = this.m[1] + this.m[3] * sy;
167
- const m21 = this.m[2] + this.m[0] * sx;
168
- const m22 = this.m[3] + this.m[1] * sx;
169
- this.m[0] = m11;
170
- this.m[1] = m12;
171
- this.m[2] = m21;
172
- this.m[3] = m22;
173
- return this;
174
- }
175
- /**
176
- * Transform multiplication
177
- * @method
178
- * @name Konva.Transform#multiply
179
- * @param {Konva.Transform} matrix
180
- * @returns {Konva.Transform}
181
- */
182
- multiply(matrix: Transform) {
183
- const m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1];
184
- const m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1];
185
-
186
- const m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3];
187
- const m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3];
188
-
189
- const dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4];
190
- const dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5];
191
-
192
- this.m[0] = m11;
193
- this.m[1] = m12;
194
- this.m[2] = m21;
195
- this.m[3] = m22;
196
- this.m[4] = dx;
197
- this.m[5] = dy;
198
- return this;
199
- }
200
- /**
201
- * Invert the matrix
202
- * @method
203
- * @name Konva.Transform#invert
204
- * @returns {Konva.Transform}
205
- */
206
- invert() {
207
- const d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);
208
- const m0 = this.m[3] * d;
209
- const m1 = -this.m[1] * d;
210
- const m2 = -this.m[2] * d;
211
- const m3 = this.m[0] * d;
212
- const m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);
213
- const m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);
214
- this.m[0] = m0;
215
- this.m[1] = m1;
216
- this.m[2] = m2;
217
- this.m[3] = m3;
218
- this.m[4] = m4;
219
- this.m[5] = m5;
220
- return this;
221
- }
222
- /**
223
- * return matrix
224
- * @method
225
- * @name Konva.Transform#getMatrix
226
- */
227
- getMatrix() {
228
- return this.m;
229
- }
230
- /**
231
- * convert transformation matrix back into node's attributes
232
- * @method
233
- * @name Konva.Transform#decompose
234
- * @returns {Konva.Transform}
235
- */
236
- decompose() {
237
- const a = this.m[0];
238
- const b = this.m[1];
239
- const c = this.m[2];
240
- const d = this.m[3];
241
- const e = this.m[4];
242
- const f = this.m[5];
243
-
244
- const delta = a * d - b * c;
245
-
246
- const result = {
247
- x: e,
248
- y: f,
249
- rotation: 0,
250
- scaleX: 0,
251
- scaleY: 0,
252
- skewX: 0,
253
- skewY: 0,
254
- };
255
-
256
- // Apply the QR-like decomposition.
257
- if (a != 0 || b != 0) {
258
- const r = Math.sqrt(a * a + b * b);
259
- result.rotation = b > 0 ? Math.acos(a / r) : -Math.acos(a / r);
260
- result.scaleX = r;
261
- result.scaleY = delta / r;
262
- result.skewX = (a * c + b * d) / delta;
263
- result.skewY = 0;
264
- } else if (c != 0 || d != 0) {
265
- const s = Math.sqrt(c * c + d * d);
266
- result.rotation =
267
- Math.PI / 2 - (d > 0 ? Math.acos(-c / s) : -Math.acos(c / s));
268
- result.scaleX = delta / s;
269
- result.scaleY = s;
270
- result.skewX = 0;
271
- result.skewY = (a * c + b * d) / delta;
272
- } else {
273
- // a = b = c = d = 0
274
- }
275
-
276
- result.rotation = Util._getRotation(result.rotation);
277
-
278
- return result;
279
- }
280
- }
281
-
282
- // CONSTANTS
283
- const OBJECT_ARRAY = '[object Array]',
284
- OBJECT_NUMBER = '[object Number]',
285
- OBJECT_STRING = '[object String]',
286
- OBJECT_BOOLEAN = '[object Boolean]',
287
- PI_OVER_DEG180 = Math.PI / 180,
288
- DEG180_OVER_PI = 180 / Math.PI,
289
- HASH = '#',
290
- EMPTY_STRING = '',
291
- ZERO = '0',
292
- KONVA_WARNING = 'Konva warning: ',
293
- KONVA_ERROR = 'Konva error: ',
294
- RGB_PAREN = 'rgb(',
295
- COLORS = {
296
- aliceblue: [240, 248, 255],
297
- antiquewhite: [250, 235, 215],
298
- aqua: [0, 255, 255],
299
- aquamarine: [127, 255, 212],
300
- azure: [240, 255, 255],
301
- beige: [245, 245, 220],
302
- bisque: [255, 228, 196],
303
- black: [0, 0, 0],
304
- blanchedalmond: [255, 235, 205],
305
- blue: [0, 0, 255],
306
- blueviolet: [138, 43, 226],
307
- brown: [165, 42, 42],
308
- burlywood: [222, 184, 135],
309
- cadetblue: [95, 158, 160],
310
- chartreuse: [127, 255, 0],
311
- chocolate: [210, 105, 30],
312
- coral: [255, 127, 80],
313
- cornflowerblue: [100, 149, 237],
314
- cornsilk: [255, 248, 220],
315
- crimson: [220, 20, 60],
316
- cyan: [0, 255, 255],
317
- darkblue: [0, 0, 139],
318
- darkcyan: [0, 139, 139],
319
- darkgoldenrod: [184, 132, 11],
320
- darkgray: [169, 169, 169],
321
- darkgreen: [0, 100, 0],
322
- darkgrey: [169, 169, 169],
323
- darkkhaki: [189, 183, 107],
324
- darkmagenta: [139, 0, 139],
325
- darkolivegreen: [85, 107, 47],
326
- darkorange: [255, 140, 0],
327
- darkorchid: [153, 50, 204],
328
- darkred: [139, 0, 0],
329
- darksalmon: [233, 150, 122],
330
- darkseagreen: [143, 188, 143],
331
- darkslateblue: [72, 61, 139],
332
- darkslategray: [47, 79, 79],
333
- darkslategrey: [47, 79, 79],
334
- darkturquoise: [0, 206, 209],
335
- darkviolet: [148, 0, 211],
336
- deeppink: [255, 20, 147],
337
- deepskyblue: [0, 191, 255],
338
- dimgray: [105, 105, 105],
339
- dimgrey: [105, 105, 105],
340
- dodgerblue: [30, 144, 255],
341
- firebrick: [178, 34, 34],
342
- floralwhite: [255, 255, 240],
343
- forestgreen: [34, 139, 34],
344
- fuchsia: [255, 0, 255],
345
- gainsboro: [220, 220, 220],
346
- ghostwhite: [248, 248, 255],
347
- gold: [255, 215, 0],
348
- goldenrod: [218, 165, 32],
349
- gray: [128, 128, 128],
350
- green: [0, 128, 0],
351
- greenyellow: [173, 255, 47],
352
- grey: [128, 128, 128],
353
- honeydew: [240, 255, 240],
354
- hotpink: [255, 105, 180],
355
- indianred: [205, 92, 92],
356
- indigo: [75, 0, 130],
357
- ivory: [255, 255, 240],
358
- khaki: [240, 230, 140],
359
- lavender: [230, 230, 250],
360
- lavenderblush: [255, 240, 245],
361
- lawngreen: [124, 252, 0],
362
- lemonchiffon: [255, 250, 205],
363
- lightblue: [173, 216, 230],
364
- lightcoral: [240, 128, 128],
365
- lightcyan: [224, 255, 255],
366
- lightgoldenrodyellow: [250, 250, 210],
367
- lightgray: [211, 211, 211],
368
- lightgreen: [144, 238, 144],
369
- lightgrey: [211, 211, 211],
370
- lightpink: [255, 182, 193],
371
- lightsalmon: [255, 160, 122],
372
- lightseagreen: [32, 178, 170],
373
- lightskyblue: [135, 206, 250],
374
- lightslategray: [119, 136, 153],
375
- lightslategrey: [119, 136, 153],
376
- lightsteelblue: [176, 196, 222],
377
- lightyellow: [255, 255, 224],
378
- lime: [0, 255, 0],
379
- limegreen: [50, 205, 50],
380
- linen: [250, 240, 230],
381
- magenta: [255, 0, 255],
382
- maroon: [128, 0, 0],
383
- mediumaquamarine: [102, 205, 170],
384
- mediumblue: [0, 0, 205],
385
- mediumorchid: [186, 85, 211],
386
- mediumpurple: [147, 112, 219],
387
- mediumseagreen: [60, 179, 113],
388
- mediumslateblue: [123, 104, 238],
389
- mediumspringgreen: [0, 250, 154],
390
- mediumturquoise: [72, 209, 204],
391
- mediumvioletred: [199, 21, 133],
392
- midnightblue: [25, 25, 112],
393
- mintcream: [245, 255, 250],
394
- mistyrose: [255, 228, 225],
395
- moccasin: [255, 228, 181],
396
- navajowhite: [255, 222, 173],
397
- navy: [0, 0, 128],
398
- oldlace: [253, 245, 230],
399
- olive: [128, 128, 0],
400
- olivedrab: [107, 142, 35],
401
- orange: [255, 165, 0],
402
- orangered: [255, 69, 0],
403
- orchid: [218, 112, 214],
404
- palegoldenrod: [238, 232, 170],
405
- palegreen: [152, 251, 152],
406
- paleturquoise: [175, 238, 238],
407
- palevioletred: [219, 112, 147],
408
- papayawhip: [255, 239, 213],
409
- peachpuff: [255, 218, 185],
410
- peru: [205, 133, 63],
411
- pink: [255, 192, 203],
412
- plum: [221, 160, 203],
413
- powderblue: [176, 224, 230],
414
- purple: [128, 0, 128],
415
- rebeccapurple: [102, 51, 153],
416
- red: [255, 0, 0],
417
- rosybrown: [188, 143, 143],
418
- royalblue: [65, 105, 225],
419
- saddlebrown: [139, 69, 19],
420
- salmon: [250, 128, 114],
421
- sandybrown: [244, 164, 96],
422
- seagreen: [46, 139, 87],
423
- seashell: [255, 245, 238],
424
- sienna: [160, 82, 45],
425
- silver: [192, 192, 192],
426
- skyblue: [135, 206, 235],
427
- slateblue: [106, 90, 205],
428
- slategray: [119, 128, 144],
429
- slategrey: [119, 128, 144],
430
- snow: [255, 255, 250],
431
- springgreen: [0, 255, 127],
432
- steelblue: [70, 130, 180],
433
- tan: [210, 180, 140],
434
- teal: [0, 128, 128],
435
- thistle: [216, 191, 216],
436
- transparent: [255, 255, 255, 0],
437
- tomato: [255, 99, 71],
438
- turquoise: [64, 224, 208],
439
- violet: [238, 130, 238],
440
- wheat: [245, 222, 179],
441
- white: [255, 255, 255],
442
- whitesmoke: [245, 245, 245],
443
- yellow: [255, 255, 0],
444
- yellowgreen: [154, 205, 5],
445
- },
446
- RGB_REGEX = /rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/;
447
- let animQueue: Array<Function> = [];
448
-
449
- const req =
450
- (typeof requestAnimationFrame !== 'undefined' && requestAnimationFrame) ||
451
- function (f) {
452
- setTimeout(f, 60);
453
- };
454
- /**
455
- * @namespace Util
456
- * @memberof Konva
457
- */
458
- export const Util = {
459
- /*
460
- * cherry-picked utilities from underscore.js
461
- */
462
- _isElement(obj: any): obj is Element {
463
- return !!(obj && obj.nodeType == 1);
464
- },
465
- _isFunction(obj: any) {
466
- return !!(obj && obj.constructor && obj.call && obj.apply);
467
- },
468
- _isPlainObject(obj: any) {
469
- return !!obj && obj.constructor === Object;
470
- },
471
- _isArray(obj: any): obj is Array<any> {
472
- return Object.prototype.toString.call(obj) === OBJECT_ARRAY;
473
- },
474
- _isNumber(obj: any): obj is number {
475
- return (
476
- Object.prototype.toString.call(obj) === OBJECT_NUMBER &&
477
- !isNaN(obj) &&
478
- isFinite(obj)
479
- );
480
- },
481
- _isString(obj: any): obj is string {
482
- return Object.prototype.toString.call(obj) === OBJECT_STRING;
483
- },
484
- _isBoolean(obj: any): obj is boolean {
485
- return Object.prototype.toString.call(obj) === OBJECT_BOOLEAN;
486
- },
487
- // arrays are objects too
488
- isObject(val: any): val is object {
489
- return val instanceof Object;
490
- },
491
- isValidSelector(selector: any) {
492
- if (typeof selector !== 'string') {
493
- return false;
494
- }
495
- const firstChar = selector[0];
496
- return (
497
- firstChar === '#' ||
498
- firstChar === '.' ||
499
- firstChar === firstChar.toUpperCase()
500
- );
501
- },
502
- _sign(number: number) {
503
- if (number === 0) {
504
- // that is not what sign usually returns
505
- // but that is what we need
506
- return 1;
507
- }
508
- if (number > 0) {
509
- return 1;
510
- } else {
511
- return -1;
512
- }
513
- },
514
-
515
- requestAnimFrame(callback: Function) {
516
- animQueue.push(callback);
517
- if (animQueue.length === 1) {
518
- req(function () {
519
- const queue = animQueue;
520
- animQueue = [];
521
- queue.forEach(function (cb) {
522
- cb();
523
- });
524
- });
525
- }
526
- },
527
- createCanvasElement() {
528
- ensureBrowser();
529
- const canvas = document.createElement('canvas');
530
- // on some environments canvas.style is readonly
531
- try {
532
- (canvas as any).style = canvas.style || {};
533
- } catch (e) {}
534
- return canvas;
535
- },
536
- createImageElement() {
537
- ensureBrowser();
538
- return document.createElement('img');
539
- },
540
- _isInDocument(el: any) {
541
- while ((el = el.parentNode)) {
542
- if (el == document) {
543
- return true;
544
- }
545
- }
546
- return false;
547
- },
548
-
549
- /*
550
- * arg can be an image object or image data
551
- */
552
- _urlToImage(url: string, callback: Function) {
553
- // if arg is a string, then it's a data url
554
- const imageObj = Util.createImageElement();
555
- imageObj.onload = function () {
556
- callback(imageObj);
557
- };
558
- imageObj.src = url;
559
- },
560
- _rgbToHex(r: number, g: number, b: number) {
561
- return ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
562
- },
563
- _hexToRgb(hex: string): RGB {
564
- hex = hex.replace(HASH, EMPTY_STRING);
565
- const bigint = parseInt(hex, 16);
566
- return {
567
- r: (bigint >> 16) & 255,
568
- g: (bigint >> 8) & 255,
569
- b: bigint & 255,
570
- };
571
- },
572
- /**
573
- * return random hex color
574
- * @method
575
- * @memberof Konva.Util
576
- * @example
577
- * shape.fill(Konva.Util.getRandomColor());
578
- */
579
- getRandomColor() {
580
- let randColor = ((Math.random() * 0xffffff) << 0).toString(16);
581
- while (randColor.length < 6) {
582
- randColor = ZERO + randColor;
583
- }
584
- return HASH + randColor;
585
- },
586
-
587
- /**
588
- * get RGB components of a color
589
- * @method
590
- * @memberof Konva.Util
591
- * @param {String} color
592
- * @example
593
- * // each of the following examples return {r:0, g:0, b:255}
594
- * var rgb = Konva.Util.getRGB('blue');
595
- * var rgb = Konva.Util.getRGB('#0000ff');
596
- * var rgb = Konva.Util.getRGB('rgb(0,0,255)');
597
- */
598
- getRGB(color: string): RGB {
599
- let rgb;
600
- // color string
601
- if (color in COLORS) {
602
- rgb = COLORS[color as keyof typeof COLORS];
603
- return {
604
- r: rgb[0],
605
- g: rgb[1],
606
- b: rgb[2],
607
- };
608
- } else if (color[0] === HASH) {
609
- // hex
610
- return this._hexToRgb(color.substring(1));
611
- } else if (color.substr(0, 4) === RGB_PAREN) {
612
- // rgb string
613
- rgb = RGB_REGEX.exec(color.replace(/ /g, '')) as RegExpExecArray;
614
- return {
615
- r: parseInt(rgb[1], 10),
616
- g: parseInt(rgb[2], 10),
617
- b: parseInt(rgb[3], 10),
618
- };
619
- } else {
620
- // default
621
- return {
622
- r: 0,
623
- g: 0,
624
- b: 0,
625
- };
626
- }
627
- },
628
- // convert any color string to RGBA object
629
- // from https://github.com/component/color-parser
630
- colorToRGBA(str: string) {
631
- str = str || 'black';
632
- return (
633
- Util._namedColorToRBA(str) ||
634
- Util._hex3ColorToRGBA(str) ||
635
- Util._hex4ColorToRGBA(str) ||
636
- Util._hex6ColorToRGBA(str) ||
637
- Util._hex8ColorToRGBA(str) ||
638
- Util._rgbColorToRGBA(str) ||
639
- Util._rgbaColorToRGBA(str) ||
640
- Util._hslColorToRGBA(str)
641
- );
642
- },
643
- // Parse named css color. Like "green"
644
- _namedColorToRBA(str: string) {
645
- const c = COLORS[str.toLowerCase() as keyof typeof COLORS];
646
- if (!c) {
647
- return null;
648
- }
649
- return {
650
- r: c[0],
651
- g: c[1],
652
- b: c[2],
653
- a: 1,
654
- };
655
- },
656
- // Parse rgb(n, n, n)
657
- _rgbColorToRGBA(str: string) {
658
- if (str.indexOf('rgb(') === 0) {
659
- str = str.match(/rgb\(([^)]+)\)/)![1];
660
- const parts = str.split(/ *, */).map(Number);
661
- return {
662
- r: parts[0],
663
- g: parts[1],
664
- b: parts[2],
665
- a: 1,
666
- };
667
- }
668
- },
669
- // Parse rgba(n, n, n, n)
670
- _rgbaColorToRGBA(str: string) {
671
- if (str.indexOf('rgba(') === 0) {
672
- str = str.match(/rgba\(([^)]+)\)/)![1]!;
673
- const parts = str.split(/ *, */).map((n, index) => {
674
- if (n.slice(-1) === '%') {
675
- return index === 3 ? parseInt(n) / 100 : (parseInt(n) / 100) * 255;
676
- }
677
- return Number(n);
678
- });
679
- return {
680
- r: parts[0],
681
- g: parts[1],
682
- b: parts[2],
683
- a: parts[3],
684
- };
685
- }
686
- },
687
- // Parse #nnnnnnnn
688
- _hex8ColorToRGBA(str: string) {
689
- if (str[0] === '#' && str.length === 9) {
690
- return {
691
- r: parseInt(str.slice(1, 3), 16),
692
- g: parseInt(str.slice(3, 5), 16),
693
- b: parseInt(str.slice(5, 7), 16),
694
- a: parseInt(str.slice(7, 9), 16) / 0xff,
695
- };
696
- }
697
- },
698
- // Parse #nnnnnn
699
- _hex6ColorToRGBA(str: string) {
700
- if (str[0] === '#' && str.length === 7) {
701
- return {
702
- r: parseInt(str.slice(1, 3), 16),
703
- g: parseInt(str.slice(3, 5), 16),
704
- b: parseInt(str.slice(5, 7), 16),
705
- a: 1,
706
- };
707
- }
708
- },
709
- // Parse #nnnn
710
- _hex4ColorToRGBA(str: string) {
711
- if (str[0] === '#' && str.length === 5) {
712
- return {
713
- r: parseInt(str[1] + str[1], 16),
714
- g: parseInt(str[2] + str[2], 16),
715
- b: parseInt(str[3] + str[3], 16),
716
- a: parseInt(str[4] + str[4], 16) / 0xff,
717
- };
718
- }
719
- },
720
- // Parse #nnn
721
- _hex3ColorToRGBA(str: string) {
722
- if (str[0] === '#' && str.length === 4) {
723
- return {
724
- r: parseInt(str[1] + str[1], 16),
725
- g: parseInt(str[2] + str[2], 16),
726
- b: parseInt(str[3] + str[3], 16),
727
- a: 1,
728
- };
729
- }
730
- },
731
- // Code adapted from https://github.com/Qix-/color-convert/blob/master/conversions.js#L244
732
- _hslColorToRGBA(str: string) {
733
- // Check hsl() format
734
- if (/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.test(str)) {
735
- // Extract h, s, l
736
- const [_, ...hsl] = /hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(str)!;
737
-
738
- const h = Number(hsl[0]) / 360;
739
- const s = Number(hsl[1]) / 100;
740
- const l = Number(hsl[2]) / 100;
741
-
742
- let t2;
743
- let t3;
744
- let val;
745
-
746
- if (s === 0) {
747
- val = l * 255;
748
- return {
749
- r: Math.round(val),
750
- g: Math.round(val),
751
- b: Math.round(val),
752
- a: 1,
753
- };
754
- }
755
-
756
- if (l < 0.5) {
757
- t2 = l * (1 + s);
758
- } else {
759
- t2 = l + s - l * s;
760
- }
761
-
762
- const t1 = 2 * l - t2;
763
-
764
- const rgb = [0, 0, 0];
765
- for (let i = 0; i < 3; i++) {
766
- t3 = h + (1 / 3) * -(i - 1);
767
- if (t3 < 0) {
768
- t3++;
769
- }
770
-
771
- if (t3 > 1) {
772
- t3--;
773
- }
774
-
775
- if (6 * t3 < 1) {
776
- val = t1 + (t2 - t1) * 6 * t3;
777
- } else if (2 * t3 < 1) {
778
- val = t2;
779
- } else if (3 * t3 < 2) {
780
- val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
781
- } else {
782
- val = t1;
783
- }
784
-
785
- rgb[i] = val * 255;
786
- }
787
-
788
- return {
789
- r: Math.round(rgb[0]),
790
- g: Math.round(rgb[1]),
791
- b: Math.round(rgb[2]),
792
- a: 1,
793
- };
794
- }
795
- },
796
- /**
797
- * check intersection of two client rectangles
798
- * @method
799
- * @memberof Konva.Util
800
- * @param {Object} r1 - { x, y, width, height } client rectangle
801
- * @param {Object} r2 - { x, y, width, height } client rectangle
802
- * @example
803
- * const overlapping = Konva.Util.haveIntersection(shape1.getClientRect(), shape2.getClientRect());
804
- */
805
- haveIntersection(r1: IRect, r2: IRect) {
806
- return !(
807
- r2.x > r1.x + r1.width ||
808
- r2.x + r2.width < r1.x ||
809
- r2.y > r1.y + r1.height ||
810
- r2.y + r2.height < r1.y
811
- );
812
- },
813
- cloneObject<Any>(obj: Any): Any {
814
- const retObj: any = {};
815
- for (const key in obj) {
816
- if (this._isPlainObject(obj[key])) {
817
- retObj[key] = this.cloneObject(obj[key]);
818
- } else if (this._isArray(obj[key])) {
819
- retObj[key] = this.cloneArray(obj[key] as Array<any>);
820
- } else {
821
- retObj[key] = obj[key];
822
- }
823
- }
824
- return retObj;
825
- },
826
- cloneArray(arr: Array<any>) {
827
- return arr.slice(0);
828
- },
829
- degToRad(deg: number) {
830
- return deg * PI_OVER_DEG180;
831
- },
832
- radToDeg(rad: number) {
833
- return rad * DEG180_OVER_PI;
834
- },
835
- _degToRad(deg: number) {
836
- Util.warn(
837
- 'Util._degToRad is removed. Please use public Util.degToRad instead.'
838
- );
839
- return Util.degToRad(deg);
840
- },
841
- _radToDeg(rad: number) {
842
- Util.warn(
843
- 'Util._radToDeg is removed. Please use public Util.radToDeg instead.'
844
- );
845
- return Util.radToDeg(rad);
846
- },
847
- _getRotation(radians: number) {
848
- return Konva.angleDeg ? Util.radToDeg(radians) : radians;
849
- },
850
- _capitalize(str: string) {
851
- return str.charAt(0).toUpperCase() + str.slice(1);
852
- },
853
- throw(str: string) {
854
- throw new Error(KONVA_ERROR + str);
855
- },
856
- error(str: string) {
857
- console.error(KONVA_ERROR + str);
858
- },
859
- warn(str: string) {
860
- if (!Konva.showWarnings) {
861
- return;
862
- }
863
- console.warn(KONVA_WARNING + str);
864
- },
865
- each(obj: object, func: Function) {
866
- for (const key in obj) {
867
- func(key, obj[key as keyof typeof obj]);
868
- }
869
- },
870
- _inRange(val: number, left: number, right: number) {
871
- return left <= val && val < right;
872
- },
873
- _getProjectionToSegment(x1, y1, x2, y2, x3, y3) {
874
- let x, y, dist;
875
-
876
- const pd2 = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
877
- if (pd2 == 0) {
878
- x = x1;
879
- y = y1;
880
- dist = (x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2);
881
- } else {
882
- const u = ((x3 - x1) * (x2 - x1) + (y3 - y1) * (y2 - y1)) / pd2;
883
- if (u < 0) {
884
- x = x1;
885
- y = y1;
886
- dist = (x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3);
887
- } else if (u > 1.0) {
888
- x = x2;
889
- y = y2;
890
- dist = (x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3);
891
- } else {
892
- x = x1 + u * (x2 - x1);
893
- y = y1 + u * (y2 - y1);
894
- dist = (x - x3) * (x - x3) + (y - y3) * (y - y3);
895
- }
896
- }
897
- return [x, y, dist];
898
- },
899
- // line as array of points.
900
- // line might be closed
901
- _getProjectionToLine(pt: Vector2d, line: Array<Vector2d>, isClosed: boolean) {
902
- const pc = Util.cloneObject(pt);
903
- let dist = Number.MAX_VALUE;
904
- line.forEach(function (p1, i) {
905
- if (!isClosed && i === line.length - 1) {
906
- return;
907
- }
908
- const p2 = line[(i + 1) % line.length];
909
- const proj = Util._getProjectionToSegment(
910
- p1.x,
911
- p1.y,
912
- p2.x,
913
- p2.y,
914
- pt.x,
915
- pt.y
916
- );
917
- const px = proj[0],
918
- py = proj[1],
919
- pdist = proj[2];
920
- if (pdist < dist) {
921
- pc.x = px;
922
- pc.y = py;
923
- dist = pdist;
924
- }
925
- });
926
- return pc;
927
- },
928
- _prepareArrayForTween(startArray, endArray, isClosed) {
929
- const start: Vector2d[] = [],
930
- end: Vector2d[] = [];
931
- if (startArray.length > endArray.length) {
932
- const temp = endArray;
933
- endArray = startArray;
934
- startArray = temp;
935
- }
936
- for (let n = 0; n < startArray.length; n += 2) {
937
- start.push({
938
- x: startArray[n],
939
- y: startArray[n + 1],
940
- });
941
- }
942
- for (let n = 0; n < endArray.length; n += 2) {
943
- end.push({
944
- x: endArray[n],
945
- y: endArray[n + 1],
946
- });
947
- }
948
-
949
- const newStart: number[] = [];
950
- end.forEach(function (point) {
951
- const pr = Util._getProjectionToLine(point, start, isClosed);
952
- newStart.push(pr.x);
953
- newStart.push(pr.y);
954
- });
955
- return newStart;
956
- },
957
- _prepareToStringify<T>(obj: any): T | null {
958
- let desc;
959
-
960
- obj.visitedByCircularReferenceRemoval = true;
961
-
962
- for (const key in obj) {
963
- if (
964
- !(obj.hasOwnProperty(key) && obj[key] && typeof obj[key] == 'object')
965
- ) {
966
- continue;
967
- }
968
- desc = Object.getOwnPropertyDescriptor(obj, key);
969
- if (
970
- obj[key].visitedByCircularReferenceRemoval ||
971
- Util._isElement(obj[key])
972
- ) {
973
- if (desc.configurable) {
974
- delete obj[key];
975
- } else {
976
- return null;
977
- }
978
- } else if (Util._prepareToStringify(obj[key]) === null) {
979
- if (desc.configurable) {
980
- delete obj[key];
981
- } else {
982
- return null;
983
- }
984
- }
985
- }
986
-
987
- delete obj.visitedByCircularReferenceRemoval;
988
-
989
- return obj;
990
- },
991
- // very simplified version of Object.assign
992
- _assign<T, U>(target: T, source: U) {
993
- for (const key in source) {
994
- (target as any)[key] = source[key];
995
- }
996
- return target as T & U;
997
- },
998
- _getFirstPointerId(evt) {
999
- if (!evt.touches) {
1000
- // try to use pointer id or fake id
1001
- return evt.pointerId || 999;
1002
- } else {
1003
- return evt.changedTouches[0].identifier;
1004
- }
1005
- },
1006
- releaseCanvas(...canvases: HTMLCanvasElement[]) {
1007
- if (!Konva.releaseCanvasOnDestroy) return;
1008
-
1009
- canvases.forEach((c) => {
1010
- c.width = 0;
1011
- c.height = 0;
1012
- });
1013
- },
1014
- drawRoundedRectPath(
1015
- context: Context,
1016
- width: number,
1017
- height: number,
1018
- cornerRadius: number | number[]
1019
- ) {
1020
- // if negative dimensions, abs width/height and move rectangle
1021
- let xOrigin = width < 0 ? width : 0;
1022
- let yOrigin = height < 0 ? height : 0;
1023
- width = Math.abs(width);
1024
- height = Math.abs(height);
1025
- let topLeft = 0;
1026
- let topRight = 0;
1027
- let bottomLeft = 0;
1028
- let bottomRight = 0;
1029
- if (typeof cornerRadius === 'number') {
1030
- topLeft =
1031
- topRight =
1032
- bottomLeft =
1033
- bottomRight =
1034
- Math.min(cornerRadius, width / 2, height / 2);
1035
- } else {
1036
- topLeft = Math.min(cornerRadius[0] || 0, width / 2, height / 2);
1037
- topRight = Math.min(cornerRadius[1] || 0, width / 2, height / 2);
1038
- bottomRight = Math.min(cornerRadius[2] || 0, width / 2, height / 2);
1039
- bottomLeft = Math.min(cornerRadius[3] || 0, width / 2, height / 2);
1040
- }
1041
- context.moveTo(xOrigin + topLeft, yOrigin);
1042
- context.lineTo(xOrigin + width - topRight, yOrigin);
1043
- context.arc(
1044
- xOrigin + width - topRight,
1045
- yOrigin + topRight,
1046
- topRight,
1047
- (Math.PI * 3) / 2,
1048
- 0,
1049
- false
1050
- );
1051
- context.lineTo(xOrigin + width, yOrigin + height - bottomRight);
1052
- context.arc(
1053
- xOrigin + width - bottomRight,
1054
- yOrigin + height - bottomRight,
1055
- bottomRight,
1056
- 0,
1057
- Math.PI / 2,
1058
- false
1059
- );
1060
- context.lineTo(xOrigin + bottomLeft, yOrigin + height);
1061
- context.arc(
1062
- xOrigin + bottomLeft,
1063
- yOrigin + height - bottomLeft,
1064
- bottomLeft,
1065
- Math.PI / 2,
1066
- Math.PI,
1067
- false
1068
- );
1069
- context.lineTo(xOrigin, yOrigin + topLeft);
1070
- context.arc(
1071
- xOrigin + topLeft,
1072
- yOrigin + topLeft,
1073
- topLeft,
1074
- Math.PI,
1075
- (Math.PI * 3) / 2,
1076
- false
1077
- );
1078
- },
1079
- drawRoundedPolygonPath(
1080
- context: Context,
1081
- points: Vector2d[],
1082
- sides: number,
1083
- radius: number,
1084
- cornerRadius: number | number[]
1085
- ) {
1086
- radius = Math.abs(radius);
1087
- for (let i = 0; i < sides; i++) {
1088
- const prev = points[(i - 1 + sides) % sides];
1089
- const curr = points[i];
1090
- const next = points[(i + 1) % sides];
1091
- const vec1 = { x: curr.x - prev.x, y: curr.y - prev.y };
1092
- const vec2 = { x: next.x - curr.x, y: next.y - curr.y };
1093
- const len1 = Math.hypot(vec1.x, vec1.y);
1094
- const len2 = Math.hypot(vec2.x, vec2.y);
1095
- let currCornerRadius;
1096
- if (typeof cornerRadius === 'number') {
1097
- currCornerRadius = cornerRadius;
1098
- } else {
1099
- currCornerRadius = i < cornerRadius.length ? cornerRadius[i] : 0;
1100
- }
1101
- const maxCornerRadius = radius * Math.cos(Math.PI / sides);
1102
- // cornerRadius creates perfect circle at 1/2 radius
1103
- currCornerRadius =
1104
- maxCornerRadius * Math.min(1, (currCornerRadius / radius) * 2);
1105
- const normalVec1 = { x: vec1.x / len1, y: vec1.y / len1 };
1106
- const normalVec2 = { x: vec2.x / len2, y: vec2.y / len2 };
1107
- const p1 = {
1108
- x: curr.x - normalVec1.x * currCornerRadius,
1109
- y: curr.y - normalVec1.y * currCornerRadius,
1110
- };
1111
- const p2 = {
1112
- x: curr.x + normalVec2.x * currCornerRadius,
1113
- y: curr.y + normalVec2.y * currCornerRadius,
1114
- };
1115
- if (i === 0) {
1116
- context.moveTo(p1.x, p1.y);
1117
- } else {
1118
- context.lineTo(p1.x, p1.y);
1119
- }
1120
- context.arcTo(curr.x, curr.y, p2.x, p2.y, currCornerRadius);
1121
- }
1122
- },
1123
- };