@nasser-sw/fabric 7.0.1-beta8 → 7.0.1-beta9

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 (138) hide show
  1. package/debug/konva-master/CHANGELOG.md +1475 -0
  2. package/debug/konva-master/LICENSE +22 -0
  3. package/debug/konva-master/README.md +209 -0
  4. package/debug/konva-master/gulpfile.mjs +110 -0
  5. package/debug/konva-master/package.json +139 -0
  6. package/debug/konva-master/release.sh +62 -0
  7. package/debug/konva-master/resources/doc-includes/ContainerParams.txt +6 -0
  8. package/debug/konva-master/resources/doc-includes/NodeParams.txt +20 -0
  9. package/debug/konva-master/resources/doc-includes/ShapeParams.txt +53 -0
  10. package/debug/konva-master/resources/jsdoc.conf.json +28 -0
  11. package/debug/konva-master/rollup.config.mjs +32 -0
  12. package/debug/konva-master/src/Animation.ts +237 -0
  13. package/debug/konva-master/src/BezierFunctions.ts +826 -0
  14. package/debug/konva-master/src/Canvas.ts +230 -0
  15. package/debug/konva-master/src/Container.ts +649 -0
  16. package/debug/konva-master/src/Context.ts +1017 -0
  17. package/debug/konva-master/src/Core.ts +5 -0
  18. package/debug/konva-master/src/DragAndDrop.ts +173 -0
  19. package/debug/konva-master/src/Factory.ts +246 -0
  20. package/debug/konva-master/src/FastLayer.ts +29 -0
  21. package/debug/konva-master/src/Global.ts +210 -0
  22. package/debug/konva-master/src/Group.ts +31 -0
  23. package/debug/konva-master/src/Layer.ts +546 -0
  24. package/debug/konva-master/src/Node.ts +3477 -0
  25. package/debug/konva-master/src/PointerEvents.ts +67 -0
  26. package/debug/konva-master/src/Shape.ts +2081 -0
  27. package/debug/konva-master/src/Stage.ts +1000 -0
  28. package/debug/konva-master/src/Tween.ts +811 -0
  29. package/debug/konva-master/src/Util.ts +1123 -0
  30. package/debug/konva-master/src/Validators.ts +210 -0
  31. package/debug/konva-master/src/_CoreInternals.ts +85 -0
  32. package/debug/konva-master/src/_FullInternals.ts +171 -0
  33. package/debug/konva-master/src/canvas-backend.ts +36 -0
  34. package/debug/konva-master/src/filters/Blur.ts +388 -0
  35. package/debug/konva-master/src/filters/Brighten.ts +48 -0
  36. package/debug/konva-master/src/filters/Brightness.ts +30 -0
  37. package/debug/konva-master/src/filters/Contrast.ts +75 -0
  38. package/debug/konva-master/src/filters/Emboss.ts +207 -0
  39. package/debug/konva-master/src/filters/Enhance.ts +154 -0
  40. package/debug/konva-master/src/filters/Grayscale.ts +25 -0
  41. package/debug/konva-master/src/filters/HSL.ts +108 -0
  42. package/debug/konva-master/src/filters/HSV.ts +106 -0
  43. package/debug/konva-master/src/filters/Invert.ts +23 -0
  44. package/debug/konva-master/src/filters/Kaleidoscope.ts +274 -0
  45. package/debug/konva-master/src/filters/Mask.ts +220 -0
  46. package/debug/konva-master/src/filters/Noise.ts +44 -0
  47. package/debug/konva-master/src/filters/Pixelate.ts +107 -0
  48. package/debug/konva-master/src/filters/Posterize.ts +46 -0
  49. package/debug/konva-master/src/filters/RGB.ts +82 -0
  50. package/debug/konva-master/src/filters/RGBA.ts +103 -0
  51. package/debug/konva-master/src/filters/Sepia.ts +27 -0
  52. package/debug/konva-master/src/filters/Solarize.ts +29 -0
  53. package/debug/konva-master/src/filters/Threshold.ts +44 -0
  54. package/debug/konva-master/src/index.ts +3 -0
  55. package/debug/konva-master/src/shapes/Arc.ts +176 -0
  56. package/debug/konva-master/src/shapes/Arrow.ts +231 -0
  57. package/debug/konva-master/src/shapes/Circle.ts +76 -0
  58. package/debug/konva-master/src/shapes/Ellipse.ts +121 -0
  59. package/debug/konva-master/src/shapes/Image.ts +319 -0
  60. package/debug/konva-master/src/shapes/Label.ts +386 -0
  61. package/debug/konva-master/src/shapes/Line.ts +364 -0
  62. package/debug/konva-master/src/shapes/Path.ts +1013 -0
  63. package/debug/konva-master/src/shapes/Rect.ts +79 -0
  64. package/debug/konva-master/src/shapes/RegularPolygon.ts +167 -0
  65. package/debug/konva-master/src/shapes/Ring.ts +94 -0
  66. package/debug/konva-master/src/shapes/Sprite.ts +370 -0
  67. package/debug/konva-master/src/shapes/Star.ts +125 -0
  68. package/debug/konva-master/src/shapes/Text.ts +1065 -0
  69. package/debug/konva-master/src/shapes/TextPath.ts +583 -0
  70. package/debug/konva-master/src/shapes/Transformer.ts +1889 -0
  71. package/debug/konva-master/src/shapes/Wedge.ts +129 -0
  72. package/debug/konva-master/src/skia-backend.ts +35 -0
  73. package/debug/konva-master/src/types.ts +84 -0
  74. package/debug/konva-master/tsconfig.json +31 -0
  75. package/debug/konva-master/tsconfig.test.json +7 -0
  76. package/dist/index.js +915 -23
  77. package/dist/index.js.map +1 -1
  78. package/dist/index.min.js +1 -1
  79. package/dist/index.min.js.map +1 -1
  80. package/dist/index.min.mjs +1 -1
  81. package/dist/index.min.mjs.map +1 -1
  82. package/dist/index.mjs +915 -23
  83. package/dist/index.mjs.map +1 -1
  84. package/dist/index.node.cjs +915 -23
  85. package/dist/index.node.cjs.map +1 -1
  86. package/dist/index.node.mjs +915 -23
  87. package/dist/index.node.mjs.map +1 -1
  88. package/dist/package.json.min.mjs +1 -1
  89. package/dist/package.json.mjs +1 -1
  90. package/dist/src/shapes/Text/Text.d.ts +19 -0
  91. package/dist/src/shapes/Text/Text.d.ts.map +1 -1
  92. package/dist/src/shapes/Text/Text.min.mjs +1 -1
  93. package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
  94. package/dist/src/shapes/Text/Text.mjs +238 -4
  95. package/dist/src/shapes/Text/Text.mjs.map +1 -1
  96. package/dist/src/shapes/Textbox.d.ts +38 -1
  97. package/dist/src/shapes/Textbox.d.ts.map +1 -1
  98. package/dist/src/shapes/Textbox.min.mjs +1 -1
  99. package/dist/src/shapes/Textbox.min.mjs.map +1 -1
  100. package/dist/src/shapes/Textbox.mjs +497 -15
  101. package/dist/src/shapes/Textbox.mjs.map +1 -1
  102. package/dist/src/text/examples/arabicTextExample.d.ts +60 -0
  103. package/dist/src/text/examples/arabicTextExample.d.ts.map +1 -0
  104. package/dist/src/text/measure.d.ts +9 -0
  105. package/dist/src/text/measure.d.ts.map +1 -1
  106. package/dist/src/text/measure.min.mjs +1 -1
  107. package/dist/src/text/measure.min.mjs.map +1 -1
  108. package/dist/src/text/measure.mjs +175 -4
  109. package/dist/src/text/measure.mjs.map +1 -1
  110. package/dist/src/text/overlayEditor.d.ts.map +1 -1
  111. package/dist/src/text/overlayEditor.min.mjs +1 -1
  112. package/dist/src/text/overlayEditor.min.mjs.map +1 -1
  113. package/dist/src/text/overlayEditor.mjs +7 -0
  114. package/dist/src/text/overlayEditor.mjs.map +1 -1
  115. package/dist/src/text/scriptUtils.d.ts +142 -0
  116. package/dist/src/text/scriptUtils.d.ts.map +1 -0
  117. package/dist/src/text/scriptUtils.min.mjs +2 -0
  118. package/dist/src/text/scriptUtils.min.mjs.map +1 -0
  119. package/dist/src/text/scriptUtils.mjs +212 -0
  120. package/dist/src/text/scriptUtils.mjs.map +1 -0
  121. package/dist-extensions/src/shapes/Text/Text.d.ts +19 -0
  122. package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -1
  123. package/dist-extensions/src/shapes/Textbox.d.ts +38 -1
  124. package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -1
  125. package/dist-extensions/src/text/measure.d.ts +9 -0
  126. package/dist-extensions/src/text/measure.d.ts.map +1 -1
  127. package/dist-extensions/src/text/overlayEditor.d.ts.map +1 -1
  128. package/dist-extensions/src/text/scriptUtils.d.ts +142 -0
  129. package/dist-extensions/src/text/scriptUtils.d.ts.map +1 -0
  130. package/fabric-test-editor.html +2401 -46
  131. package/fonts/STV Bold.ttf +0 -0
  132. package/fonts/STV Light.ttf +0 -0
  133. package/fonts/STV Regular.ttf +0 -0
  134. package/package.json +1 -1
  135. package/src/shapes/Text/Text.ts +238 -5
  136. package/src/shapes/Textbox.ts +521 -11
  137. package/src/text/measure.ts +200 -50
  138. package/src/text/overlayEditor.ts +7 -0
@@ -0,0 +1,2081 @@
1
+ import { Konva } from './Global.ts';
2
+ import { Transform, Util } from './Util.ts';
3
+ import { Factory } from './Factory.ts';
4
+ import type { NodeConfig } from './Node.ts';
5
+ import { Node } from './Node.ts';
6
+ import {
7
+ getNumberValidator,
8
+ getNumberOrAutoValidator,
9
+ getStringValidator,
10
+ getBooleanValidator,
11
+ getStringOrGradientValidator,
12
+ } from './Validators.ts';
13
+
14
+ import type { Context, SceneContext } from './Context.ts';
15
+ import { _registerNode } from './Global.ts';
16
+ import * as PointerEvents from './PointerEvents.ts';
17
+
18
+ import type { GetSet, Vector2d } from './types.ts';
19
+ import type { HitCanvas, SceneCanvas } from './Canvas.ts';
20
+
21
+ // hack from here https://stackoverflow.com/questions/52667959/what-is-the-purpose-of-bivariancehack-in-typescript-types/52668133#52668133
22
+ export type ShapeConfigHandler<TTarget> = {
23
+ bivarianceHack(ctx: Context, shape: TTarget): void;
24
+ }['bivarianceHack'];
25
+
26
+ export type LineJoin = 'round' | 'bevel' | 'miter';
27
+ export type LineCap = 'butt' | 'round' | 'square';
28
+
29
+ export interface ShapeConfig extends NodeConfig {
30
+ fill?: string | CanvasGradient;
31
+ fillPatternImage?: HTMLImageElement;
32
+ fillPatternX?: number;
33
+ fillPatternY?: number;
34
+ fillPatternOffset?: Vector2d;
35
+ fillPatternOffsetX?: number;
36
+ fillPatternOffsetY?: number;
37
+ fillPatternScale?: Vector2d;
38
+ fillPatternScaleX?: number;
39
+ fillPatternScaleY?: number;
40
+ fillPatternRotation?: number;
41
+ fillPatternRepeat?: string;
42
+ fillLinearGradientStartPoint?: Vector2d;
43
+ fillLinearGradientStartPointX?: number;
44
+ fillLinearGradientStartPointY?: number;
45
+ fillLinearGradientEndPoint?: Vector2d;
46
+ fillLinearGradientEndPointX?: number;
47
+ fillLinearGradientEndPointY?: number;
48
+ fillLinearGradientColorStops?: Array<number | string>;
49
+ fillRadialGradientStartPoint?: Vector2d;
50
+ fillRadialGradientStartPointX?: number;
51
+ fillRadialGradientStartPointY?: number;
52
+ fillRadialGradientEndPoint?: Vector2d;
53
+ fillRadialGradientEndPointX?: number;
54
+ fillRadialGradientEndPointY?: number;
55
+ fillRadialGradientStartRadius?: number;
56
+ fillRadialGradientEndRadius?: number;
57
+ fillRadialGradientColorStops?: Array<number | string>;
58
+ fillEnabled?: boolean;
59
+ fillPriority?: string;
60
+ fillRule?: CanvasFillRule;
61
+ stroke?: string | CanvasGradient;
62
+ strokeWidth?: number;
63
+ fillAfterStrokeEnabled?: boolean;
64
+ hitStrokeWidth?: number | string;
65
+ strokeScaleEnabled?: boolean;
66
+ strokeHitEnabled?: boolean;
67
+ strokeEnabled?: boolean;
68
+ lineJoin?: LineJoin;
69
+ lineCap?: LineCap;
70
+ miterLimit?: number;
71
+ sceneFunc?: (con: Context, shape: Shape) => void;
72
+ hitFunc?: (con: Context, shape: Shape) => void;
73
+ shadowColor?: string;
74
+ shadowBlur?: number;
75
+ shadowOffset?: Vector2d;
76
+ shadowOffsetX?: number;
77
+ shadowOffsetY?: number;
78
+ shadowOpacity?: number;
79
+ shadowEnabled?: boolean;
80
+ shadowForStrokeEnabled?: boolean;
81
+ dash?: number[];
82
+ dashOffset?: number;
83
+ dashEnabled?: boolean;
84
+ perfectDrawEnabled?: boolean;
85
+ }
86
+
87
+ export interface ShapeGetClientRectConfig {
88
+ skipTransform?: boolean;
89
+ skipShadow?: boolean;
90
+ skipStroke?: boolean;
91
+ relativeTo?: Node;
92
+ }
93
+
94
+ export type FillFuncOutput =
95
+ | void
96
+ | [Path2D | CanvasFillRule]
97
+ | [Path2D, CanvasFillRule];
98
+
99
+ const HAS_SHADOW = 'hasShadow';
100
+ const SHADOW_RGBA = 'shadowRGBA';
101
+ const patternImage = 'patternImage';
102
+ const linearGradient = 'linearGradient';
103
+ const radialGradient = 'radialGradient';
104
+
105
+ let dummyContext: CanvasRenderingContext2D;
106
+ function getDummyContext(): CanvasRenderingContext2D {
107
+ if (dummyContext) {
108
+ return dummyContext;
109
+ }
110
+ dummyContext = Util.createCanvasElement().getContext('2d')!;
111
+ return dummyContext;
112
+ }
113
+
114
+ export const shapes: { [key: string]: Shape } = {};
115
+
116
+ // TODO: idea - use only "remove" (or destroy method)
117
+ // how? on add, check that every inner shape has reference in konva store with color
118
+ // on remove - clear that reference
119
+ // the approach is good. But what if we want to cache the shape before we add it into the stage
120
+ // what color to use for hit test?
121
+
122
+ function _fillFunc(this: Node, context) {
123
+ const fillRule = this.attrs.fillRule;
124
+ if (fillRule) {
125
+ context.fill(fillRule);
126
+ } else {
127
+ context.fill();
128
+ }
129
+ }
130
+ function _strokeFunc(context) {
131
+ context.stroke();
132
+ }
133
+ function _fillFuncHit(this: Node, context) {
134
+ const fillRule = this.attrs.fillRule;
135
+ if (fillRule) {
136
+ context.fill(fillRule);
137
+ } else {
138
+ context.fill();
139
+ }
140
+ }
141
+ function _strokeFuncHit(context) {
142
+ context.stroke();
143
+ }
144
+
145
+ function _clearHasShadowCache(this: Node) {
146
+ this._clearCache(HAS_SHADOW);
147
+ }
148
+
149
+ function _clearGetShadowRGBACache(this: Node) {
150
+ this._clearCache(SHADOW_RGBA);
151
+ }
152
+
153
+ function _clearFillPatternCache(this: Node) {
154
+ this._clearCache(patternImage);
155
+ }
156
+
157
+ function _clearLinearGradientCache(this: Node) {
158
+ this._clearCache(linearGradient);
159
+ }
160
+
161
+ function _clearRadialGradientCache(this: Node) {
162
+ this._clearCache(radialGradient);
163
+ }
164
+
165
+ /**
166
+ * Shape constructor. Shapes are primitive objects such as rectangles,
167
+ * circles, text, lines, etc.
168
+ * @constructor
169
+ * @memberof Konva
170
+ * @augments Konva.Node
171
+ * @param {Object} config
172
+ * @@shapeParams
173
+ * @@nodeParams
174
+ * @example
175
+ * var customShape = new Konva.Shape({
176
+ * x: 5,
177
+ * y: 10,
178
+ * fill: 'red',
179
+ * // a Konva.Canvas renderer is passed into the sceneFunc function
180
+ * sceneFunc (context, shape) {
181
+ * context.beginPath();
182
+ * context.moveTo(200, 50);
183
+ * context.lineTo(420, 80);
184
+ * context.quadraticCurveTo(300, 100, 260, 170);
185
+ * context.closePath();
186
+ * // Konva specific method
187
+ * context.fillStrokeShape(shape);
188
+ * }
189
+ *});
190
+ */
191
+ export class Shape<
192
+ Config extends ShapeConfig = ShapeConfig,
193
+ > extends Node<Config> {
194
+ _centroid: boolean;
195
+ colorKey: string;
196
+
197
+ _fillFunc: (ctx: Context) => FillFuncOutput;
198
+ _strokeFunc: (ctx: Context) => void;
199
+ _fillFuncHit: (ctx: Context) => void;
200
+ _strokeFuncHit: (ctx: Context) => void;
201
+
202
+ constructor(config?: Config) {
203
+ super(config);
204
+ // set colorKey
205
+ let key: string;
206
+
207
+ while (true) {
208
+ key = Util.getRandomColor();
209
+ if (key && !(key in shapes)) {
210
+ break;
211
+ }
212
+ }
213
+
214
+ this.colorKey = key;
215
+ shapes[key] = this;
216
+ }
217
+
218
+ /**
219
+ * @deprecated
220
+ */
221
+ getContext() {
222
+ Util.warn('shape.getContext() method is deprecated. Please do not use it.');
223
+ return this.getLayer()!.getContext();
224
+ }
225
+ /**
226
+ * @deprecated
227
+ */
228
+ getCanvas() {
229
+ Util.warn('shape.getCanvas() method is deprecated. Please do not use it.');
230
+ return this.getLayer()!.getCanvas();
231
+ }
232
+
233
+ getSceneFunc() {
234
+ return this.attrs.sceneFunc || this['_sceneFunc'];
235
+ }
236
+
237
+ getHitFunc() {
238
+ return this.attrs.hitFunc || this['_hitFunc'];
239
+ }
240
+ /**
241
+ * returns whether or not a shadow will be rendered
242
+ * @method
243
+ * @name Konva.Shape#hasShadow
244
+ * @returns {Boolean}
245
+ */
246
+ hasShadow() {
247
+ return this._getCache(HAS_SHADOW, this._hasShadow);
248
+ }
249
+ _hasShadow() {
250
+ return (
251
+ this.shadowEnabled() &&
252
+ this.shadowOpacity() !== 0 &&
253
+ !!(
254
+ this.shadowColor() ||
255
+ this.shadowBlur() ||
256
+ this.shadowOffsetX() ||
257
+ this.shadowOffsetY()
258
+ )
259
+ );
260
+ }
261
+ _getFillPattern() {
262
+ return this._getCache(patternImage, this.__getFillPattern);
263
+ }
264
+ __getFillPattern() {
265
+ if (this.fillPatternImage()) {
266
+ const ctx = getDummyContext();
267
+ const pattern = ctx.createPattern(
268
+ this.fillPatternImage(),
269
+ this.fillPatternRepeat() || 'repeat'
270
+ );
271
+ if (pattern && pattern.setTransform) {
272
+ const tr = new Transform();
273
+
274
+ tr.translate(this.fillPatternX(), this.fillPatternY());
275
+ tr.rotate(Konva.getAngle(this.fillPatternRotation()));
276
+ tr.scale(this.fillPatternScaleX(), this.fillPatternScaleY());
277
+ tr.translate(
278
+ -1 * this.fillPatternOffsetX(),
279
+ -1 * this.fillPatternOffsetY()
280
+ );
281
+
282
+ const m = tr.getMatrix();
283
+
284
+ const matrix =
285
+ typeof DOMMatrix === 'undefined'
286
+ ? {
287
+ a: m[0], // Horizontal scaling. A value of 1 results in no scaling.
288
+ b: m[1], // Vertical skewing.
289
+ c: m[2], // Horizontal skewing.
290
+ d: m[3],
291
+ e: m[4], // Horizontal translation (moving).
292
+ f: m[5], // Vertical translation (moving).
293
+ }
294
+ : new DOMMatrix(m);
295
+
296
+ pattern.setTransform(matrix);
297
+ }
298
+ return pattern;
299
+ }
300
+ }
301
+ _getLinearGradient() {
302
+ return this._getCache(linearGradient, this.__getLinearGradient);
303
+ }
304
+ __getLinearGradient() {
305
+ const colorStops = this.fillLinearGradientColorStops();
306
+ if (colorStops) {
307
+ const ctx = getDummyContext();
308
+
309
+ const start = this.fillLinearGradientStartPoint();
310
+ const end = this.fillLinearGradientEndPoint();
311
+ const grd = ctx.createLinearGradient(start.x, start.y, end.x, end.y);
312
+
313
+ // build color stops
314
+ for (let n = 0; n < colorStops.length; n += 2) {
315
+ grd.addColorStop(colorStops[n] as number, colorStops[n + 1] as string);
316
+ }
317
+ return grd;
318
+ }
319
+ }
320
+
321
+ _getRadialGradient() {
322
+ return this._getCache(radialGradient, this.__getRadialGradient);
323
+ }
324
+ __getRadialGradient() {
325
+ const colorStops = this.fillRadialGradientColorStops();
326
+ if (colorStops) {
327
+ const ctx = getDummyContext();
328
+
329
+ const start = this.fillRadialGradientStartPoint();
330
+ const end = this.fillRadialGradientEndPoint();
331
+ const grd = ctx.createRadialGradient(
332
+ start.x,
333
+ start.y,
334
+ this.fillRadialGradientStartRadius(),
335
+ end.x,
336
+ end.y,
337
+ this.fillRadialGradientEndRadius()
338
+ );
339
+
340
+ // build color stops
341
+ for (let n = 0; n < colorStops.length; n += 2) {
342
+ grd.addColorStop(colorStops[n] as number, colorStops[n + 1] as string);
343
+ }
344
+ return grd;
345
+ }
346
+ }
347
+ getShadowRGBA() {
348
+ return this._getCache(SHADOW_RGBA, this._getShadowRGBA);
349
+ }
350
+ _getShadowRGBA() {
351
+ if (!this.hasShadow()) {
352
+ return;
353
+ }
354
+ const rgba = Util.colorToRGBA(this.shadowColor());
355
+ if (rgba) {
356
+ return (
357
+ 'rgba(' +
358
+ rgba.r +
359
+ ',' +
360
+ rgba.g +
361
+ ',' +
362
+ rgba.b +
363
+ ',' +
364
+ rgba.a * (this.shadowOpacity() || 1) +
365
+ ')'
366
+ );
367
+ }
368
+ }
369
+ /**
370
+ * returns whether or not the shape will be filled
371
+ * @method
372
+ * @name Konva.Shape#hasFill
373
+ * @returns {Boolean}
374
+ */
375
+ hasFill() {
376
+ return this._calculate(
377
+ 'hasFill',
378
+ [
379
+ 'fillEnabled',
380
+ 'fill',
381
+ 'fillPatternImage',
382
+ 'fillLinearGradientColorStops',
383
+ 'fillRadialGradientColorStops',
384
+ ],
385
+ () => {
386
+ return (
387
+ this.fillEnabled() &&
388
+ !!(
389
+ this.fill() ||
390
+ this.fillPatternImage() ||
391
+ this.fillLinearGradientColorStops() ||
392
+ this.fillRadialGradientColorStops()
393
+ )
394
+ );
395
+ }
396
+ );
397
+ }
398
+ /**
399
+ * returns whether or not the shape will be stroked
400
+ * @method
401
+ * @name Konva.Shape#hasStroke
402
+ * @returns {Boolean}
403
+ */
404
+ hasStroke() {
405
+ return this._calculate(
406
+ 'hasStroke',
407
+ [
408
+ 'strokeEnabled',
409
+ 'strokeWidth',
410
+ 'stroke',
411
+ 'strokeLinearGradientColorStops',
412
+ ],
413
+ () => {
414
+ return (
415
+ this.strokeEnabled() &&
416
+ this.strokeWidth() &&
417
+ !!(this.stroke() || this.strokeLinearGradientColorStops())
418
+ // this.getStrokeRadialGradientColorStops()
419
+ );
420
+ }
421
+ );
422
+ // return (
423
+ // this.strokeEnabled() &&
424
+ // this.strokeWidth() &&
425
+ // !!(this.stroke() || this.strokeLinearGradientColorStops())
426
+ // // this.getStrokeRadialGradientColorStops()
427
+ // );
428
+ }
429
+ hasHitStroke() {
430
+ const width = this.hitStrokeWidth();
431
+
432
+ // on auto just check by stroke
433
+ if (width === 'auto') {
434
+ return this.hasStroke();
435
+ }
436
+
437
+ // we should enable hit stroke if stroke is enabled
438
+ // and we have some value from width
439
+ return this.strokeEnabled() && !!width;
440
+ }
441
+ /**
442
+ * determines if point is in the shape, regardless if other shapes are on top of it. Note: because
443
+ * this method clears a temporary canvas and then redraws the shape, it performs very poorly if executed many times
444
+ * consecutively. Please use the {@link Konva.Stage#getIntersection} method if at all possible
445
+ * because it performs much better
446
+ * @method
447
+ * @name Konva.Shape#intersects
448
+ * @param {Object} point
449
+ * @param {Number} point.x
450
+ * @param {Number} point.y
451
+ * @returns {Boolean}
452
+ */
453
+ intersects(point: Vector2d) {
454
+ const stage = this.getStage();
455
+ if (!stage) {
456
+ return false;
457
+ }
458
+ const bufferHitCanvas = stage.bufferHitCanvas;
459
+
460
+ bufferHitCanvas.getContext().clear();
461
+ this.drawHit(bufferHitCanvas, undefined, true);
462
+ const p = bufferHitCanvas.context.getImageData(
463
+ Math.round(point.x),
464
+ Math.round(point.y),
465
+ 1,
466
+ 1
467
+ ).data;
468
+ return p[3] > 0;
469
+ }
470
+
471
+ destroy() {
472
+ Node.prototype.destroy.call(this);
473
+ delete shapes[this.colorKey];
474
+ delete (this as any).colorKey;
475
+ return this;
476
+ }
477
+ // why do we need buffer canvas?
478
+ // it give better result when a shape has
479
+ // stroke with fill and with some opacity
480
+ _useBufferCanvas(forceFill?: boolean): boolean {
481
+ // image and sprite still has "fill" as image
482
+ // so they use that method with forced fill
483
+ // it probably will be simpler, then copy/paste the code
484
+
485
+ // force skip buffer canvas
486
+ const perfectDrawEnabled = this.attrs.perfectDrawEnabled ?? true;
487
+ if (!perfectDrawEnabled) {
488
+ return false;
489
+ }
490
+ const hasFill = forceFill || this.hasFill();
491
+ const hasStroke = this.hasStroke();
492
+ const isTransparent = this.getAbsoluteOpacity() !== 1;
493
+
494
+ if (hasFill && hasStroke && isTransparent) {
495
+ return true;
496
+ }
497
+
498
+ const hasShadow = this.hasShadow();
499
+ const strokeForShadow = this.shadowForStrokeEnabled();
500
+ if (hasFill && hasStroke && hasShadow && strokeForShadow) {
501
+ return true;
502
+ }
503
+ return false;
504
+ }
505
+ setStrokeHitEnabled(val: number) {
506
+ Util.warn(
507
+ 'strokeHitEnabled property is deprecated. Please use hitStrokeWidth instead.'
508
+ );
509
+ if (val) {
510
+ this.hitStrokeWidth('auto');
511
+ } else {
512
+ this.hitStrokeWidth(0);
513
+ }
514
+ }
515
+ getStrokeHitEnabled() {
516
+ if (this.hitStrokeWidth() === 0) {
517
+ return false;
518
+ } else {
519
+ return true;
520
+ }
521
+ }
522
+ /**
523
+ * return self rectangle (x, y, width, height) of shape.
524
+ * This method are not taken into account transformation and styles.
525
+ * @method
526
+ * @name Konva.Shape#getSelfRect
527
+ * @returns {Object} rect with {x, y, width, height} properties
528
+ * @example
529
+ *
530
+ * rect.getSelfRect(); // return {x:0, y:0, width:rect.width(), height:rect.height()}
531
+ * circle.getSelfRect(); // return {x: - circle.width() / 2, y: - circle.height() / 2, width:circle.width(), height:circle.height()}
532
+ *
533
+ */
534
+ getSelfRect() {
535
+ const size = this.size();
536
+ return {
537
+ x: this._centroid ? -size.width / 2 : 0,
538
+ y: this._centroid ? -size.height / 2 : 0,
539
+ width: size.width,
540
+ height: size.height,
541
+ };
542
+ }
543
+ getClientRect(config: ShapeGetClientRectConfig = {}) {
544
+ // if we have a cached parent, it will use cached transform matrix
545
+ // but we don't want to that
546
+ let hasCachedParent = false;
547
+ let parent = this.getParent();
548
+ while (parent) {
549
+ if (parent.isCached()) {
550
+ hasCachedParent = true;
551
+ break;
552
+ }
553
+ parent = parent.getParent();
554
+ }
555
+ const skipTransform = config.skipTransform;
556
+
557
+ // force relative to stage if we have a cached parent
558
+ const relativeTo =
559
+ config.relativeTo || (hasCachedParent && this.getStage()) || undefined;
560
+
561
+ const fillRect = this.getSelfRect();
562
+
563
+ const applyStroke = !config.skipStroke && this.hasStroke();
564
+ const strokeWidth: number = (applyStroke && this.strokeWidth()) || 0;
565
+
566
+ const fillAndStrokeWidth = fillRect.width + strokeWidth;
567
+ const fillAndStrokeHeight = fillRect.height + strokeWidth;
568
+
569
+ const applyShadow = !config.skipShadow && this.hasShadow();
570
+ const shadowOffsetX = applyShadow ? this.shadowOffsetX() : 0;
571
+ const shadowOffsetY = applyShadow ? this.shadowOffsetY() : 0;
572
+
573
+ const preWidth = fillAndStrokeWidth + Math.abs(shadowOffsetX);
574
+ const preHeight = fillAndStrokeHeight + Math.abs(shadowOffsetY);
575
+
576
+ const blurRadius = (applyShadow && this.shadowBlur()) || 0;
577
+
578
+ const width = preWidth + blurRadius * 2;
579
+ const height = preHeight + blurRadius * 2;
580
+
581
+ const rect = {
582
+ width: width,
583
+ height: height,
584
+ x:
585
+ -(strokeWidth / 2 + blurRadius) +
586
+ Math.min(shadowOffsetX, 0) +
587
+ fillRect.x,
588
+ y:
589
+ -(strokeWidth / 2 + blurRadius) +
590
+ Math.min(shadowOffsetY, 0) +
591
+ fillRect.y,
592
+ };
593
+ if (!skipTransform) {
594
+ return this._transformedRect(rect, relativeTo);
595
+ }
596
+ return rect;
597
+ }
598
+ drawScene(can?: SceneCanvas, top?: Node, bufferCanvas?: SceneCanvas) {
599
+ // basically there are 3 drawing modes
600
+ // 1 - simple drawing when nothing is cached.
601
+ // 2 - when we are caching current
602
+ // 3 - when node is cached and we need to draw it into layer
603
+
604
+ const layer = this.getLayer();
605
+ const canvas = can || layer!.getCanvas(),
606
+ context = canvas.getContext() as SceneContext,
607
+ cachedCanvas = this._getCanvasCache(),
608
+ drawFunc = this.getSceneFunc(),
609
+ hasShadow = this.hasShadow();
610
+ let stage;
611
+
612
+ const skipBuffer = false;
613
+ const cachingSelf = top === this;
614
+
615
+ if (!this.isVisible() && !cachingSelf) {
616
+ return this;
617
+ }
618
+ // if node is cached we just need to draw from cache
619
+ if (cachedCanvas) {
620
+ context.save();
621
+
622
+ const m = this.getAbsoluteTransform(top).getMatrix();
623
+ context.transform(m[0], m[1], m[2], m[3], m[4], m[5]);
624
+ this._drawCachedSceneCanvas(context);
625
+ context.restore();
626
+ return this;
627
+ }
628
+
629
+ if (!drawFunc) {
630
+ return this;
631
+ }
632
+
633
+ context.save();
634
+ // if buffer canvas is needed
635
+ if (this._useBufferCanvas() && !skipBuffer) {
636
+ stage = this.getStage();
637
+ const bc = bufferCanvas || stage.bufferCanvas;
638
+ const bufferContext = bc.getContext();
639
+ bufferContext.clear();
640
+ bufferContext.save();
641
+ bufferContext._applyLineJoin(this);
642
+ bufferContext._applyMiterLimit(this);
643
+ // layer might be undefined if we are using cache before adding to layer
644
+ const o = this.getAbsoluteTransform(top).getMatrix();
645
+ bufferContext.transform(o[0], o[1], o[2], o[3], o[4], o[5]);
646
+
647
+ // Apply CSS filters to buffer context if not cached
648
+ // we skip filters in non cache use cases for now
649
+ // if (!cachingSelf && filters?.length > 0) {
650
+ // bufferContext._applyCSSFilters(this);
651
+ // }
652
+
653
+ drawFunc.call(this, bufferContext, this);
654
+ bufferContext.restore();
655
+
656
+ const ratio = bc.pixelRatio;
657
+
658
+ if (hasShadow) {
659
+ context._applyShadow(this);
660
+ }
661
+ context._applyOpacity(this);
662
+ context._applyGlobalCompositeOperation(this);
663
+ context.drawImage(
664
+ bc._canvas,
665
+ bc.x || 0,
666
+ bc.y || 0,
667
+ bc.width / ratio,
668
+ bc.height / ratio
669
+ );
670
+ } else {
671
+ context._applyLineJoin(this);
672
+ context._applyMiterLimit(this);
673
+
674
+ if (!cachingSelf) {
675
+ const o = this.getAbsoluteTransform(top).getMatrix();
676
+ context.transform(o[0], o[1], o[2], o[3], o[4], o[5]);
677
+ context._applyOpacity(this);
678
+ context._applyGlobalCompositeOperation(this);
679
+
680
+ // Apply CSS filters to main context if not cached
681
+ // if (filters?.length) {
682
+ // context._applyCSSFilters(this);
683
+ // }
684
+ }
685
+
686
+ if (hasShadow) {
687
+ context._applyShadow(this);
688
+ }
689
+
690
+ drawFunc.call(this, context, this);
691
+ }
692
+ context.restore();
693
+ return this;
694
+ }
695
+ drawHit(can?: HitCanvas, top?: Node, skipDragCheck = false) {
696
+ if (!this.shouldDrawHit(top, skipDragCheck)) {
697
+ return this;
698
+ }
699
+
700
+ const layer = this.getLayer(),
701
+ canvas = can || layer!.hitCanvas,
702
+ context = canvas && canvas.getContext(),
703
+ drawFunc = this.hitFunc() || this.sceneFunc(),
704
+ cachedCanvas = this._getCanvasCache(),
705
+ cachedHitCanvas = cachedCanvas && cachedCanvas.hit;
706
+
707
+ if (!this.colorKey) {
708
+ Util.warn(
709
+ 'Looks like your canvas has a destroyed shape in it. Do not reuse shape after you destroyed it. If you want to reuse shape you should call remove() instead of destroy()'
710
+ );
711
+ }
712
+
713
+ if (cachedHitCanvas) {
714
+ context.save();
715
+
716
+ const m = this.getAbsoluteTransform(top).getMatrix();
717
+ context.transform(m[0], m[1], m[2], m[3], m[4], m[5]);
718
+
719
+ this._drawCachedHitCanvas(context);
720
+ context.restore();
721
+ return this;
722
+ }
723
+ if (!drawFunc) {
724
+ return this;
725
+ }
726
+ context.save();
727
+ context._applyLineJoin(this);
728
+ context._applyMiterLimit(this);
729
+
730
+ const selfCache = this === top;
731
+ if (!selfCache) {
732
+ const o = this.getAbsoluteTransform(top).getMatrix();
733
+ context.transform(o[0], o[1], o[2], o[3], o[4], o[5]);
734
+ }
735
+ drawFunc.call(this, context, this);
736
+ context.restore();
737
+ return this;
738
+ }
739
+ /**
740
+ * draw hit graph using the cached scene canvas
741
+ * @method
742
+ * @name Konva.Shape#drawHitFromCache
743
+ * @param {Integer} alphaThreshold alpha channel threshold that determines whether or not
744
+ * a pixel should be drawn onto the hit graph. Must be a value between 0 and 255.
745
+ * The default is 0
746
+ * @returns {Konva.Shape}
747
+ * @example
748
+ * shape.cache();
749
+ * shape.drawHitFromCache();
750
+ */
751
+ drawHitFromCache(alphaThreshold = 0) {
752
+ const cachedCanvas = this._getCanvasCache(),
753
+ sceneCanvas = this._getCachedSceneCanvas(),
754
+ hitCanvas = cachedCanvas.hit,
755
+ hitContext = hitCanvas.getContext(),
756
+ hitWidth = hitCanvas.getWidth(),
757
+ hitHeight = hitCanvas.getHeight();
758
+
759
+ hitContext.clear();
760
+ hitContext.drawImage(sceneCanvas._canvas, 0, 0, hitWidth, hitHeight);
761
+
762
+ try {
763
+ const hitImageData = hitContext.getImageData(0, 0, hitWidth, hitHeight);
764
+ const hitData = hitImageData.data;
765
+ const len = hitData.length;
766
+ const rgbColorKey = Util._hexToRgb(this.colorKey);
767
+
768
+ // replace non transparent pixels with color key
769
+ for (let i = 0; i < len; i += 4) {
770
+ const alpha = hitData[i + 3];
771
+ if (alpha > alphaThreshold) {
772
+ hitData[i] = rgbColorKey.r;
773
+ hitData[i + 1] = rgbColorKey.g;
774
+ hitData[i + 2] = rgbColorKey.b;
775
+ hitData[i + 3] = 255;
776
+ } else {
777
+ hitData[i + 3] = 0;
778
+ }
779
+ }
780
+ hitContext.putImageData(hitImageData, 0, 0);
781
+ } catch (e: any) {
782
+ Util.error(
783
+ 'Unable to draw hit graph from cached scene canvas. ' + e.message
784
+ );
785
+ }
786
+
787
+ return this;
788
+ }
789
+
790
+ hasPointerCapture(pointerId: number): boolean {
791
+ return PointerEvents.hasPointerCapture(pointerId, this);
792
+ }
793
+
794
+ setPointerCapture(pointerId: number) {
795
+ PointerEvents.setPointerCapture(pointerId, this);
796
+ }
797
+
798
+ releaseCapture(pointerId: number) {
799
+ PointerEvents.releaseCapture(pointerId, this);
800
+ }
801
+
802
+ draggable: GetSet<boolean, this>;
803
+ embossBlend: GetSet<boolean, this>;
804
+
805
+ dash: GetSet<number[], this>;
806
+ dashEnabled: GetSet<boolean, this>;
807
+ dashOffset: GetSet<number, this>;
808
+ fill: GetSet<string | CanvasGradient, this>;
809
+ fillEnabled: GetSet<boolean, this>;
810
+ fillLinearGradientColorStops: GetSet<Array<number | string>, this>;
811
+ fillLinearGradientStartPoint: GetSet<Vector2d, this>;
812
+ fillLinearGradientStartPointX: GetSet<number, this>;
813
+ fillLinearGradientStartPointY: GetSet<number, this>;
814
+ fillLinearGradientEndPoint: GetSet<Vector2d, this>;
815
+ fillLinearGradientEndPointX: GetSet<number, this>;
816
+ fillLinearGradientEndPointY: GetSet<number, this>;
817
+ fillLinearRadialStartPoint: GetSet<Vector2d, this>;
818
+ fillLinearRadialStartPointX: GetSet<number, this>;
819
+ fillLinearRadialStartPointY: GetSet<number, this>;
820
+ fillLinearRadialEndPoint: GetSet<Vector2d, this>;
821
+ fillLinearRadialEndPointX: GetSet<number, this>;
822
+ fillLinearRadialEndPointY: GetSet<number, this>;
823
+ fillPatternImage: GetSet<HTMLImageElement | HTMLCanvasElement, this>;
824
+ fillRadialGradientStartRadius: GetSet<number, this>;
825
+ fillRadialGradientEndRadius: GetSet<number, this>;
826
+ fillRadialGradientColorStops: GetSet<Array<number | string>, this>;
827
+ fillRadialGradientStartPoint: GetSet<Vector2d, this>;
828
+ fillRadialGradientStartPointX: GetSet<number, this>;
829
+ fillRadialGradientStartPointY: GetSet<number, this>;
830
+ fillRadialGradientEndPoint: GetSet<Vector2d, this>;
831
+ fillRadialGradientEndPointX: GetSet<number, this>;
832
+ fillRadialGradientEndPointY: GetSet<number, this>;
833
+ fillPatternOffset: GetSet<Vector2d, this>;
834
+ fillPatternOffsetX: GetSet<number, this>;
835
+ fillPatternOffsetY: GetSet<number, this>;
836
+ fillPatternRepeat: GetSet<string, this>;
837
+ fillPatternRotation: GetSet<number, this>;
838
+ fillPatternScale: GetSet<Vector2d, this>;
839
+ fillPatternScaleX: GetSet<number, this>;
840
+ fillPatternScaleY: GetSet<number, this>;
841
+ fillPatternX: GetSet<number, this>;
842
+ fillPatternY: GetSet<number, this>;
843
+ fillPriority: GetSet<string, this>;
844
+ hitFunc: GetSet<ShapeConfigHandler<this>, this>;
845
+ lineCap: GetSet<LineCap, this>;
846
+ lineJoin: GetSet<LineJoin, this>;
847
+ miterLimit: GetSet<number, this>;
848
+ perfectDrawEnabled: GetSet<boolean, this>;
849
+ sceneFunc: GetSet<ShapeConfigHandler<this>, this>;
850
+ shadowColor: GetSet<string, this>;
851
+ shadowEnabled: GetSet<boolean, this>;
852
+ shadowForStrokeEnabled: GetSet<boolean, this>;
853
+ shadowOffset: GetSet<Vector2d, this>;
854
+ shadowOffsetX: GetSet<number, this>;
855
+ shadowOffsetY: GetSet<number, this>;
856
+ shadowOpacity: GetSet<number, this>;
857
+ shadowBlur: GetSet<number, this>;
858
+ stroke: GetSet<string | CanvasGradient, this>;
859
+ strokeEnabled: GetSet<boolean, this>;
860
+ fillAfterStrokeEnabled: GetSet<boolean, this>;
861
+ strokeScaleEnabled: GetSet<boolean, this>;
862
+ strokeHitEnabled: GetSet<boolean, this>;
863
+ strokeWidth: GetSet<number, this>;
864
+ hitStrokeWidth: GetSet<number | 'auto', this>;
865
+ strokeLinearGradientStartPoint: GetSet<Vector2d, this>;
866
+ strokeLinearGradientEndPoint: GetSet<Vector2d, this>;
867
+ strokeLinearGradientColorStops: GetSet<Array<number | string>, this>;
868
+ strokeLinearGradientStartPointX: GetSet<number, this>;
869
+ strokeLinearGradientStartPointY: GetSet<number, this>;
870
+ strokeLinearGradientEndPointX: GetSet<number, this>;
871
+ strokeLinearGradientEndPointY: GetSet<number, this>;
872
+ fillRule: GetSet<CanvasFillRule, this>;
873
+ }
874
+
875
+ Shape.prototype._fillFunc = _fillFunc;
876
+ Shape.prototype._strokeFunc = _strokeFunc;
877
+ Shape.prototype._fillFuncHit = _fillFuncHit;
878
+ Shape.prototype._strokeFuncHit = _strokeFuncHit;
879
+
880
+ Shape.prototype._centroid = false;
881
+ Shape.prototype.nodeType = 'Shape';
882
+ _registerNode(Shape);
883
+
884
+ Shape.prototype.eventListeners = {};
885
+ Shape.prototype.on.call(
886
+ Shape.prototype,
887
+ 'shadowColorChange.konva shadowBlurChange.konva shadowOffsetChange.konva shadowOpacityChange.konva shadowEnabledChange.konva',
888
+ _clearHasShadowCache
889
+ );
890
+
891
+ Shape.prototype.on.call(
892
+ Shape.prototype,
893
+ 'shadowColorChange.konva shadowOpacityChange.konva shadowEnabledChange.konva',
894
+ _clearGetShadowRGBACache
895
+ );
896
+
897
+ Shape.prototype.on.call(
898
+ Shape.prototype,
899
+ 'fillPriorityChange.konva fillPatternImageChange.konva fillPatternRepeatChange.konva fillPatternScaleXChange.konva fillPatternScaleYChange.konva fillPatternOffsetXChange.konva fillPatternOffsetYChange.konva fillPatternXChange.konva fillPatternYChange.konva fillPatternRotationChange.konva',
900
+ _clearFillPatternCache
901
+ );
902
+
903
+ Shape.prototype.on.call(
904
+ Shape.prototype,
905
+ 'fillPriorityChange.konva fillLinearGradientColorStopsChange.konva fillLinearGradientStartPointXChange.konva fillLinearGradientStartPointYChange.konva fillLinearGradientEndPointXChange.konva fillLinearGradientEndPointYChange.konva',
906
+ _clearLinearGradientCache
907
+ );
908
+
909
+ Shape.prototype.on.call(
910
+ Shape.prototype,
911
+ 'fillPriorityChange.konva fillRadialGradientColorStopsChange.konva fillRadialGradientStartPointXChange.konva fillRadialGradientStartPointYChange.konva fillRadialGradientEndPointXChange.konva fillRadialGradientEndPointYChange.konva fillRadialGradientStartRadiusChange.konva fillRadialGradientEndRadiusChange.konva',
912
+ _clearRadialGradientCache
913
+ );
914
+
915
+ // add getters and setters
916
+ Factory.addGetterSetter(
917
+ Shape,
918
+ 'stroke',
919
+ undefined,
920
+ getStringOrGradientValidator()
921
+ );
922
+
923
+ /**
924
+ * get/set stroke color
925
+ * @name Konva.Shape#stroke
926
+ * @method
927
+ * @param {String} color
928
+ * @returns {String}
929
+ * @example
930
+ * // get stroke color
931
+ * var stroke = shape.stroke();
932
+ *
933
+ * // set stroke color with color string
934
+ * shape.stroke('green');
935
+ *
936
+ * // set stroke color with hex
937
+ * shape.stroke('#00ff00');
938
+ *
939
+ * // set stroke color with rgb
940
+ * shape.stroke('rgb(0,255,0)');
941
+ *
942
+ * // set stroke color with rgba and make it 50% opaque
943
+ * shape.stroke('rgba(0,255,0,0.5');
944
+ */
945
+
946
+ Factory.addGetterSetter(Shape, 'strokeWidth', 2, getNumberValidator());
947
+
948
+ /**
949
+ * get/set stroke width
950
+ * @name Konva.Shape#strokeWidth
951
+ * @method
952
+ * @param {Number} strokeWidth
953
+ * @returns {Number}
954
+ * @example
955
+ * // get stroke width
956
+ * var strokeWidth = shape.strokeWidth();
957
+ *
958
+ * // set stroke width
959
+ * shape.strokeWidth(10);
960
+ */
961
+
962
+ Factory.addGetterSetter(Shape, 'fillAfterStrokeEnabled', false);
963
+
964
+ /**
965
+ * get/set fillAfterStrokeEnabled property. By default Konva is drawing filling first, then stroke on top of the fill.
966
+ * In rare situations you may want a different behavior. When you have a stroke first then fill on top of it.
967
+ * Especially useful for Text objects.
968
+ * Default is false.
969
+ * @name Konva.Shape#fillAfterStrokeEnabled
970
+ * @method
971
+ * @param {Boolean} fillAfterStrokeEnabled
972
+ * @returns {Boolean}
973
+ * @example
974
+ * // get stroke width
975
+ * var fillAfterStrokeEnabled = shape.fillAfterStrokeEnabled();
976
+ *
977
+ * // set stroke width
978
+ * shape.fillAfterStrokeEnabled(true);
979
+ */
980
+
981
+ Factory.addGetterSetter(
982
+ Shape,
983
+ 'hitStrokeWidth',
984
+ 'auto',
985
+ getNumberOrAutoValidator()
986
+ );
987
+
988
+ /**
989
+ * get/set stroke width for hit detection. Default value is "auto", it means it will be equals to strokeWidth
990
+ * @name Konva.Shape#hitStrokeWidth
991
+ * @method
992
+ * @param {Number} hitStrokeWidth
993
+ * @returns {Number}
994
+ * @example
995
+ * // get stroke width
996
+ * var hitStrokeWidth = shape.hitStrokeWidth();
997
+ *
998
+ * // set hit stroke width
999
+ * shape.hitStrokeWidth(20);
1000
+ * // set hit stroke width always equals to scene stroke width
1001
+ * shape.hitStrokeWidth('auto');
1002
+ */
1003
+
1004
+ Factory.addGetterSetter(Shape, 'strokeHitEnabled', true, getBooleanValidator());
1005
+
1006
+ /**
1007
+ * **deprecated, use hitStrokeWidth instead!** get/set strokeHitEnabled property. Useful for performance optimization.
1008
+ * You may set `shape.strokeHitEnabled(false)`. In this case stroke will be no draw on hit canvas, so hit area
1009
+ * of shape will be decreased (by lineWidth / 2). Remember that non closed line with `strokeHitEnabled = false`
1010
+ * will be not drawn on hit canvas, that is mean line will no trigger pointer events (like mouseover)
1011
+ * Default value is true.
1012
+ * @name Konva.Shape#strokeHitEnabled
1013
+ * @method
1014
+ * @param {Boolean} strokeHitEnabled
1015
+ * @returns {Boolean}
1016
+ * @example
1017
+ * // get strokeHitEnabled
1018
+ * var strokeHitEnabled = shape.strokeHitEnabled();
1019
+ *
1020
+ * // set strokeHitEnabled
1021
+ * shape.strokeHitEnabled();
1022
+ */
1023
+
1024
+ Factory.addGetterSetter(
1025
+ Shape,
1026
+ 'perfectDrawEnabled',
1027
+ true,
1028
+ getBooleanValidator()
1029
+ );
1030
+
1031
+ /**
1032
+ * get/set perfectDrawEnabled. If a shape has fill, stroke and opacity you may set `perfectDrawEnabled` to false to improve performance.
1033
+ * See http://konvajs.org/docs/performance/Disable_Perfect_Draw.html for more information.
1034
+ * Default value is true
1035
+ * @name Konva.Shape#perfectDrawEnabled
1036
+ * @method
1037
+ * @param {Boolean} perfectDrawEnabled
1038
+ * @returns {Boolean}
1039
+ * @example
1040
+ * // get perfectDrawEnabled
1041
+ * var perfectDrawEnabled = shape.perfectDrawEnabled();
1042
+ *
1043
+ * // set perfectDrawEnabled
1044
+ * shape.perfectDrawEnabled();
1045
+ */
1046
+
1047
+ Factory.addGetterSetter(
1048
+ Shape,
1049
+ 'shadowForStrokeEnabled',
1050
+ true,
1051
+ getBooleanValidator()
1052
+ );
1053
+
1054
+ /**
1055
+ * get/set shadowForStrokeEnabled. Useful for performance optimization.
1056
+ * You may set `shape.shadowForStrokeEnabled(false)`. In this case stroke will no effect shadow.
1057
+ * Remember if you set `shadowForStrokeEnabled = false` for non closed line - that line will have no shadow!.
1058
+ * Default value is true
1059
+ * @name Konva.Shape#shadowForStrokeEnabled
1060
+ * @method
1061
+ * @param {Boolean} shadowForStrokeEnabled
1062
+ * @returns {Boolean}
1063
+ * @example
1064
+ * // get shadowForStrokeEnabled
1065
+ * var shadowForStrokeEnabled = shape.shadowForStrokeEnabled();
1066
+ *
1067
+ * // set shadowForStrokeEnabled
1068
+ * shape.shadowForStrokeEnabled();
1069
+ */
1070
+
1071
+ Factory.addGetterSetter(Shape, 'lineJoin');
1072
+
1073
+ /**
1074
+ * get/set line join. Can be miter, round, or bevel. The
1075
+ * default is miter
1076
+ * @name Konva.Shape#lineJoin
1077
+ * @method
1078
+ * @param {String} lineJoin
1079
+ * @returns {String}
1080
+ * @example
1081
+ * // get line join
1082
+ * var lineJoin = shape.lineJoin();
1083
+ *
1084
+ * // set line join
1085
+ * shape.lineJoin('round');
1086
+ */
1087
+
1088
+ Factory.addGetterSetter(Shape, 'lineCap');
1089
+
1090
+ /**
1091
+ * get/set line cap. Can be butt, round, or square
1092
+ * @name Konva.Shape#lineCap
1093
+ * @method
1094
+ * @param {String} lineCap
1095
+ * @returns {String}
1096
+ * @example
1097
+ * // get line cap
1098
+ * var lineCap = shape.lineCap();
1099
+ *
1100
+ * // set line cap
1101
+ * shape.lineCap('round');
1102
+ */
1103
+
1104
+ Factory.addGetterSetter(Shape, 'miterLimit');
1105
+
1106
+ /**
1107
+ * get/set miterLimit.
1108
+ * @name Konva.Shape#miterLimit
1109
+ * @method
1110
+ * @param {Number} miterLimit
1111
+ * @returns {Number}
1112
+ * @example
1113
+ * // get miter limit
1114
+ * var miterLimit = shape.miterLimit();
1115
+ *
1116
+ * // set miter limit
1117
+ * shape.miterLimit(10);
1118
+ */
1119
+
1120
+ Factory.addGetterSetter(Shape, 'sceneFunc');
1121
+
1122
+ /**
1123
+ * get/set scene draw function. That function is used to draw the shape on a canvas.
1124
+ * Also that function will be used to draw hit area of the shape, in case if hitFunc is not defined.
1125
+ * @name Konva.Shape#sceneFunc
1126
+ * @method
1127
+ * @param {Function} drawFunc drawing function
1128
+ * @returns {Function}
1129
+ * @example
1130
+ * // get scene draw function
1131
+ * var sceneFunc = shape.sceneFunc();
1132
+ *
1133
+ * // set scene draw function
1134
+ * shape.sceneFunc(function(context, shape) {
1135
+ * context.beginPath();
1136
+ * context.rect(0, 0, shape.width(), shape.height());
1137
+ * context.closePath();
1138
+ * // important Konva method that fill and stroke shape from its properties
1139
+ * // like stroke and fill
1140
+ * context.fillStrokeShape(shape);
1141
+ * });
1142
+ */
1143
+
1144
+ Factory.addGetterSetter(Shape, 'hitFunc');
1145
+
1146
+ /**
1147
+ * get/set hit draw function. That function is used to draw custom hit area of a shape.
1148
+ * @name Konva.Shape#hitFunc
1149
+ * @method
1150
+ * @param {Function} drawFunc drawing function
1151
+ * @returns {Function}
1152
+ * @example
1153
+ * // get hit draw function
1154
+ * var hitFunc = shape.hitFunc();
1155
+ *
1156
+ * // set hit draw function
1157
+ * shape.hitFunc(function(context) {
1158
+ * context.beginPath();
1159
+ * context.rect(0, 0, shape.width(), shape.height());
1160
+ * context.closePath();
1161
+ * // important Konva method that fill and stroke shape from its properties
1162
+ * context.fillStrokeShape(shape);
1163
+ * });
1164
+ */
1165
+
1166
+ Factory.addGetterSetter(Shape, 'dash');
1167
+
1168
+ /**
1169
+ * get/set dash array for stroke.
1170
+ * @name Konva.Shape#dash
1171
+ * @method
1172
+ * @param {Array} dash
1173
+ * @returns {Array}
1174
+ * @example
1175
+ * // apply dashed stroke that is 10px long and 5 pixels apart
1176
+ * line.dash([10, 5]);
1177
+ * // apply dashed stroke that is made up of alternating dashed
1178
+ * // lines that are 10px long and 20px apart, and dots that have
1179
+ * // a radius of 5px and are 20px apart
1180
+ * line.dash([10, 20, 0.001, 20]);
1181
+ */
1182
+
1183
+ Factory.addGetterSetter(Shape, 'dashOffset', 0, getNumberValidator());
1184
+
1185
+ /**
1186
+ * get/set dash offset for stroke.
1187
+ * @name Konva.Shape#dash
1188
+ * @method
1189
+ * @param {Number} dash offset
1190
+ * @returns {Number}
1191
+ * @example
1192
+ * // apply dashed stroke that is 10px long and 5 pixels apart with an offset of 5px
1193
+ * line.dash([10, 5]);
1194
+ * line.dashOffset(5);
1195
+ */
1196
+
1197
+ Factory.addGetterSetter(Shape, 'shadowColor', undefined, getStringValidator());
1198
+
1199
+ /**
1200
+ * get/set shadow color
1201
+ * @name Konva.Shape#shadowColor
1202
+ * @method
1203
+ * @param {String} color
1204
+ * @returns {String}
1205
+ * @example
1206
+ * // get shadow color
1207
+ * var shadow = shape.shadowColor();
1208
+ *
1209
+ * // set shadow color with color string
1210
+ * shape.shadowColor('green');
1211
+ *
1212
+ * // set shadow color with hex
1213
+ * shape.shadowColor('#00ff00');
1214
+ *
1215
+ * // set shadow color with rgb
1216
+ * shape.shadowColor('rgb(0,255,0)');
1217
+ *
1218
+ * // set shadow color with rgba and make it 50% opaque
1219
+ * shape.shadowColor('rgba(0,255,0,0.5');
1220
+ */
1221
+
1222
+ Factory.addGetterSetter(Shape, 'shadowBlur', 0, getNumberValidator());
1223
+
1224
+ /**
1225
+ * get/set shadow blur
1226
+ * @name Konva.Shape#shadowBlur
1227
+ * @method
1228
+ * @param {Number} blur
1229
+ * @returns {Number}
1230
+ * @example
1231
+ * // get shadow blur
1232
+ * var shadowBlur = shape.shadowBlur();
1233
+ *
1234
+ * // set shadow blur
1235
+ * shape.shadowBlur(10);
1236
+ */
1237
+
1238
+ Factory.addGetterSetter(Shape, 'shadowOpacity', 1, getNumberValidator());
1239
+
1240
+ /**
1241
+ * get/set shadow opacity. must be a value between 0 and 1
1242
+ * @name Konva.Shape#shadowOpacity
1243
+ * @method
1244
+ * @param {Number} opacity
1245
+ * @returns {Number}
1246
+ * @example
1247
+ * // get shadow opacity
1248
+ * var shadowOpacity = shape.shadowOpacity();
1249
+ *
1250
+ * // set shadow opacity
1251
+ * shape.shadowOpacity(0.5);
1252
+ */
1253
+
1254
+ Factory.addComponentsGetterSetter(Shape, 'shadowOffset', ['x', 'y']);
1255
+
1256
+ /**
1257
+ * get/set shadow offset
1258
+ * @name Konva.Shape#shadowOffset
1259
+ * @method
1260
+ * @param {Object} offset
1261
+ * @param {Number} offset.x
1262
+ * @param {Number} offset.y
1263
+ * @returns {Object}
1264
+ * @example
1265
+ * // get shadow offset
1266
+ * var shadowOffset = shape.shadowOffset();
1267
+ *
1268
+ * // set shadow offset
1269
+ * shape.shadowOffset({
1270
+ * x: 20,
1271
+ * y: 10
1272
+ * });
1273
+ */
1274
+
1275
+ Factory.addGetterSetter(Shape, 'shadowOffsetX', 0, getNumberValidator());
1276
+
1277
+ /**
1278
+ * get/set shadow offset x
1279
+ * @name Konva.Shape#shadowOffsetX
1280
+ * @method
1281
+ * @param {Number} x
1282
+ * @returns {Number}
1283
+ * @example
1284
+ * // get shadow offset x
1285
+ * var shadowOffsetX = shape.shadowOffsetX();
1286
+ *
1287
+ * // set shadow offset x
1288
+ * shape.shadowOffsetX(5);
1289
+ */
1290
+
1291
+ Factory.addGetterSetter(Shape, 'shadowOffsetY', 0, getNumberValidator());
1292
+
1293
+ /**
1294
+ * get/set shadow offset y
1295
+ * @name Konva.Shape#shadowOffsetY
1296
+ * @method
1297
+ * @param {Number} y
1298
+ * @returns {Number}
1299
+ * @example
1300
+ * // get shadow offset y
1301
+ * var shadowOffsetY = shape.shadowOffsetY();
1302
+ *
1303
+ * // set shadow offset y
1304
+ * shape.shadowOffsetY(5);
1305
+ */
1306
+
1307
+ Factory.addGetterSetter(Shape, 'fillPatternImage');
1308
+
1309
+ /**
1310
+ * get/set fill pattern image
1311
+ * @name Konva.Shape#fillPatternImage
1312
+ * @method
1313
+ * @param {Image} image object
1314
+ * @returns {Image}
1315
+ * @example
1316
+ * // get fill pattern image
1317
+ * var fillPatternImage = shape.fillPatternImage();
1318
+ *
1319
+ * // set fill pattern image
1320
+ * var imageObj = new Image();
1321
+ * imageObj.onload = function() {
1322
+ * shape.fillPatternImage(imageObj);
1323
+ * };
1324
+ * imageObj.src = 'path/to/image/jpg';
1325
+ */
1326
+
1327
+ Factory.addGetterSetter(
1328
+ Shape,
1329
+ 'fill',
1330
+ undefined,
1331
+ getStringOrGradientValidator()
1332
+ );
1333
+
1334
+ /**
1335
+ * get/set fill color
1336
+ * @name Konva.Shape#fill
1337
+ * @method
1338
+ * @param {String} color
1339
+ * @returns {String}
1340
+ * @example
1341
+ * // get fill color
1342
+ * var fill = shape.fill();
1343
+ *
1344
+ * // set fill color with color string
1345
+ * shape.fill('green');
1346
+ *
1347
+ * // set fill color with hex
1348
+ * shape.fill('#00ff00');
1349
+ *
1350
+ * // set fill color with rgb
1351
+ * shape.fill('rgb(0,255,0)');
1352
+ *
1353
+ * // set fill color with rgba and make it 50% opaque
1354
+ * shape.fill('rgba(0,255,0,0.5');
1355
+ *
1356
+ * // shape without fill
1357
+ * shape.fill(null);
1358
+ */
1359
+
1360
+ Factory.addGetterSetter(Shape, 'fillPatternX', 0, getNumberValidator());
1361
+
1362
+ /**
1363
+ * get/set fill pattern x
1364
+ * @name Konva.Shape#fillPatternX
1365
+ * @method
1366
+ * @param {Number} x
1367
+ * @returns {Number}
1368
+ * @example
1369
+ * // get fill pattern x
1370
+ * var fillPatternX = shape.fillPatternX();
1371
+ * // set fill pattern x
1372
+ * shape.fillPatternX(20);
1373
+ */
1374
+
1375
+ Factory.addGetterSetter(Shape, 'fillPatternY', 0, getNumberValidator());
1376
+
1377
+ /**
1378
+ * get/set fill pattern y
1379
+ * @name Konva.Shape#fillPatternY
1380
+ * @method
1381
+ * @param {Number} y
1382
+ * @returns {Number}
1383
+ * @example
1384
+ * // get fill pattern y
1385
+ * var fillPatternY = shape.fillPatternY();
1386
+ * // set fill pattern y
1387
+ * shape.fillPatternY(20);
1388
+ */
1389
+
1390
+ Factory.addGetterSetter(Shape, 'fillLinearGradientColorStops');
1391
+
1392
+ /**
1393
+ * get/set fill linear gradient color stops
1394
+ * @name Konva.Shape#fillLinearGradientColorStops
1395
+ * @method
1396
+ * @param {Array} colorStops
1397
+ * @returns {Array} colorStops
1398
+ * @example
1399
+ * // get fill linear gradient color stops
1400
+ * var colorStops = shape.fillLinearGradientColorStops();
1401
+ *
1402
+ * // create a linear gradient that starts with red, changes to blue
1403
+ * // halfway through, and then changes to green
1404
+ * shape.fillLinearGradientColorStops(0, 'red', 0.5, 'blue', 1, 'green');
1405
+ */
1406
+
1407
+ Factory.addGetterSetter(Shape, 'strokeLinearGradientColorStops');
1408
+
1409
+ /**
1410
+ * get/set stroke linear gradient color stops
1411
+ * @name Konva.Shape#strokeLinearGradientColorStops
1412
+ * @method
1413
+ * @param {Array} colorStops
1414
+ * @returns {Array} colorStops
1415
+ * @example
1416
+ * // get stroke linear gradient color stops
1417
+ * var colorStops = shape.strokeLinearGradientColorStops();
1418
+ *
1419
+ * // create a linear gradient that starts with red, changes to blue
1420
+ * // halfway through, and then changes to green
1421
+ * shape.strokeLinearGradientColorStops([0, 'red', 0.5, 'blue', 1, 'green']);
1422
+ */
1423
+
1424
+ Factory.addGetterSetter(Shape, 'fillRadialGradientStartRadius', 0);
1425
+
1426
+ /**
1427
+ * get/set fill radial gradient start radius
1428
+ * @name Konva.Shape#fillRadialGradientStartRadius
1429
+ * @method
1430
+ * @param {Number} radius
1431
+ * @returns {Number}
1432
+ * @example
1433
+ * // get radial gradient start radius
1434
+ * var startRadius = shape.fillRadialGradientStartRadius();
1435
+ *
1436
+ * // set radial gradient start radius
1437
+ * shape.fillRadialGradientStartRadius(0);
1438
+ */
1439
+
1440
+ Factory.addGetterSetter(Shape, 'fillRadialGradientEndRadius', 0);
1441
+
1442
+ /**
1443
+ * get/set fill radial gradient end radius
1444
+ * @name Konva.Shape#fillRadialGradientEndRadius
1445
+ * @method
1446
+ * @param {Number} radius
1447
+ * @returns {Number}
1448
+ * @example
1449
+ * // get radial gradient end radius
1450
+ * var endRadius = shape.fillRadialGradientEndRadius();
1451
+ *
1452
+ * // set radial gradient end radius
1453
+ * shape.fillRadialGradientEndRadius(100);
1454
+ */
1455
+
1456
+ Factory.addGetterSetter(Shape, 'fillRadialGradientColorStops');
1457
+
1458
+ /**
1459
+ * get/set fill radial gradient color stops
1460
+ * @name Konva.Shape#fillRadialGradientColorStops
1461
+ * @method
1462
+ * @param {Number} colorStops
1463
+ * @returns {Array}
1464
+ * @example
1465
+ * // get fill radial gradient color stops
1466
+ * var colorStops = shape.fillRadialGradientColorStops();
1467
+ *
1468
+ * // create a radial gradient that starts with red, changes to blue
1469
+ * // halfway through, and then changes to green
1470
+ * shape.fillRadialGradientColorStops(0, 'red', 0.5, 'blue', 1, 'green');
1471
+ */
1472
+
1473
+ Factory.addGetterSetter(Shape, 'fillPatternRepeat', 'repeat');
1474
+
1475
+ /**
1476
+ * get/set fill pattern repeat. Can be 'repeat', 'repeat-x', 'repeat-y', or 'no-repeat'. The default is 'repeat'
1477
+ * @name Konva.Shape#fillPatternRepeat
1478
+ * @method
1479
+ * @param {String} repeat
1480
+ * @returns {String}
1481
+ * @example
1482
+ * // get fill pattern repeat
1483
+ * var repeat = shape.fillPatternRepeat();
1484
+ *
1485
+ * // repeat pattern in x direction only
1486
+ * shape.fillPatternRepeat('repeat-x');
1487
+ *
1488
+ * // do not repeat the pattern
1489
+ * shape.fillPatternRepeat('no-repeat');
1490
+ */
1491
+
1492
+ Factory.addGetterSetter(Shape, 'fillEnabled', true);
1493
+
1494
+ /**
1495
+ * get/set fill enabled flag
1496
+ * @name Konva.Shape#fillEnabled
1497
+ * @method
1498
+ * @param {Boolean} enabled
1499
+ * @returns {Boolean}
1500
+ * @example
1501
+ * // get fill enabled flag
1502
+ * var fillEnabled = shape.fillEnabled();
1503
+ *
1504
+ * // disable fill
1505
+ * shape.fillEnabled(false);
1506
+ *
1507
+ * // enable fill
1508
+ * shape.fillEnabled(true);
1509
+ */
1510
+
1511
+ Factory.addGetterSetter(Shape, 'strokeEnabled', true);
1512
+
1513
+ /**
1514
+ * get/set stroke enabled flag
1515
+ * @name Konva.Shape#strokeEnabled
1516
+ * @method
1517
+ * @param {Boolean} enabled
1518
+ * @returns {Boolean}
1519
+ * @example
1520
+ * // get stroke enabled flag
1521
+ * var strokeEnabled = shape.strokeEnabled();
1522
+ *
1523
+ * // disable stroke
1524
+ * shape.strokeEnabled(false);
1525
+ *
1526
+ * // enable stroke
1527
+ * shape.strokeEnabled(true);
1528
+ */
1529
+
1530
+ Factory.addGetterSetter(Shape, 'shadowEnabled', true);
1531
+
1532
+ /**
1533
+ * get/set shadow enabled flag
1534
+ * @name Konva.Shape#shadowEnabled
1535
+ * @method
1536
+ * @param {Boolean} enabled
1537
+ * @returns {Boolean}
1538
+ * @example
1539
+ * // get shadow enabled flag
1540
+ * var shadowEnabled = shape.shadowEnabled();
1541
+ *
1542
+ * // disable shadow
1543
+ * shape.shadowEnabled(false);
1544
+ *
1545
+ * // enable shadow
1546
+ * shape.shadowEnabled(true);
1547
+ */
1548
+
1549
+ Factory.addGetterSetter(Shape, 'dashEnabled', true);
1550
+
1551
+ /**
1552
+ * get/set dash enabled flag
1553
+ * @name Konva.Shape#dashEnabled
1554
+ * @method
1555
+ * @param {Boolean} enabled
1556
+ * @returns {Boolean}
1557
+ * @example
1558
+ * // get dash enabled flag
1559
+ * var dashEnabled = shape.dashEnabled();
1560
+ *
1561
+ * // disable dash
1562
+ * shape.dashEnabled(false);
1563
+ *
1564
+ * // enable dash
1565
+ * shape.dashEnabled(true);
1566
+ */
1567
+
1568
+ Factory.addGetterSetter(Shape, 'strokeScaleEnabled', true);
1569
+
1570
+ /**
1571
+ * get/set strokeScale enabled flag
1572
+ * @name Konva.Shape#strokeScaleEnabled
1573
+ * @method
1574
+ * @param {Boolean} enabled
1575
+ * @returns {Boolean}
1576
+ * @example
1577
+ * // get stroke scale enabled flag
1578
+ * var strokeScaleEnabled = shape.strokeScaleEnabled();
1579
+ *
1580
+ * // disable stroke scale
1581
+ * shape.strokeScaleEnabled(false);
1582
+ *
1583
+ * // enable stroke scale
1584
+ * shape.strokeScaleEnabled(true);
1585
+ */
1586
+
1587
+ Factory.addGetterSetter(Shape, 'fillPriority', 'color');
1588
+
1589
+ /**
1590
+ * get/set fill priority. can be color, pattern, linear-gradient, or radial-gradient. The default is color.
1591
+ * This is handy if you want to toggle between different fill types.
1592
+ * @name Konva.Shape#fillPriority
1593
+ * @method
1594
+ * @param {String} priority
1595
+ * @returns {String}
1596
+ * @example
1597
+ * // get fill priority
1598
+ * var fillPriority = shape.fillPriority();
1599
+ *
1600
+ * // set fill priority
1601
+ * shape.fillPriority('linear-gradient');
1602
+ */
1603
+
1604
+ Factory.addComponentsGetterSetter(Shape, 'fillPatternOffset', ['x', 'y']);
1605
+
1606
+ /**
1607
+ * get/set fill pattern offset
1608
+ * @name Konva.Shape#fillPatternOffset
1609
+ * @method
1610
+ * @param {Object} offset
1611
+ * @param {Number} offset.x
1612
+ * @param {Number} offset.y
1613
+ * @returns {Object}
1614
+ * @example
1615
+ * // get fill pattern offset
1616
+ * var patternOffset = shape.fillPatternOffset();
1617
+ *
1618
+ * // set fill pattern offset
1619
+ * shape.fillPatternOffset({
1620
+ * x: 20,
1621
+ * y: 10
1622
+ * });
1623
+ */
1624
+
1625
+ Factory.addGetterSetter(Shape, 'fillPatternOffsetX', 0, getNumberValidator());
1626
+
1627
+ /**
1628
+ * get/set fill pattern offset x
1629
+ * @name Konva.Shape#fillPatternOffsetX
1630
+ * @method
1631
+ * @param {Number} x
1632
+ * @returns {Number}
1633
+ * @example
1634
+ * // get fill pattern offset x
1635
+ * var patternOffsetX = shape.fillPatternOffsetX();
1636
+ *
1637
+ * // set fill pattern offset x
1638
+ * shape.fillPatternOffsetX(20);
1639
+ */
1640
+
1641
+ Factory.addGetterSetter(Shape, 'fillPatternOffsetY', 0, getNumberValidator());
1642
+
1643
+ /**
1644
+ * get/set fill pattern offset y
1645
+ * @name Konva.Shape#fillPatternOffsetY
1646
+ * @method
1647
+ * @param {Number} y
1648
+ * @returns {Number}
1649
+ * @example
1650
+ * // get fill pattern offset y
1651
+ * var patternOffsetY = shape.fillPatternOffsetY();
1652
+ *
1653
+ * // set fill pattern offset y
1654
+ * shape.fillPatternOffsetY(10);
1655
+ */
1656
+
1657
+ Factory.addComponentsGetterSetter(Shape, 'fillPatternScale', ['x', 'y']);
1658
+
1659
+ /**
1660
+ * get/set fill pattern scale
1661
+ * @name Konva.Shape#fillPatternScale
1662
+ * @method
1663
+ * @param {Object} scale
1664
+ * @param {Number} scale.x
1665
+ * @param {Number} scale.y
1666
+ * @returns {Object}
1667
+ * @example
1668
+ * // get fill pattern scale
1669
+ * var patternScale = shape.fillPatternScale();
1670
+ *
1671
+ * // set fill pattern scale
1672
+ * shape.fillPatternScale({
1673
+ * x: 2,
1674
+ * y: 2
1675
+ * });
1676
+ */
1677
+
1678
+ Factory.addGetterSetter(Shape, 'fillPatternScaleX', 1, getNumberValidator());
1679
+
1680
+ /**
1681
+ * get/set fill pattern scale x
1682
+ * @name Konva.Shape#fillPatternScaleX
1683
+ * @method
1684
+ * @param {Number} x
1685
+ * @returns {Number}
1686
+ * @example
1687
+ * // get fill pattern scale x
1688
+ * var patternScaleX = shape.fillPatternScaleX();
1689
+ *
1690
+ * // set fill pattern scale x
1691
+ * shape.fillPatternScaleX(2);
1692
+ */
1693
+
1694
+ Factory.addGetterSetter(Shape, 'fillPatternScaleY', 1, getNumberValidator());
1695
+
1696
+ /**
1697
+ * get/set fill pattern scale y
1698
+ * @name Konva.Shape#fillPatternScaleY
1699
+ * @method
1700
+ * @param {Number} y
1701
+ * @returns {Number}
1702
+ * @example
1703
+ * // get fill pattern scale y
1704
+ * var patternScaleY = shape.fillPatternScaleY();
1705
+ *
1706
+ * // set fill pattern scale y
1707
+ * shape.fillPatternScaleY(2);
1708
+ */
1709
+
1710
+ Factory.addComponentsGetterSetter(Shape, 'fillLinearGradientStartPoint', [
1711
+ 'x',
1712
+ 'y',
1713
+ ]);
1714
+
1715
+ /**
1716
+ * get/set fill linear gradient start point
1717
+ * @name Konva.Shape#fillLinearGradientStartPoint
1718
+ * @method
1719
+ * @param {Object} startPoint
1720
+ * @param {Number} startPoint.x
1721
+ * @param {Number} startPoint.y
1722
+ * @returns {Object}
1723
+ * @example
1724
+ * // get fill linear gradient start point
1725
+ * var startPoint = shape.fillLinearGradientStartPoint();
1726
+ *
1727
+ * // set fill linear gradient start point
1728
+ * shape.fillLinearGradientStartPoint({
1729
+ * x: 20,
1730
+ * y: 10
1731
+ * });
1732
+ */
1733
+
1734
+ Factory.addComponentsGetterSetter(Shape, 'strokeLinearGradientStartPoint', [
1735
+ 'x',
1736
+ 'y',
1737
+ ]);
1738
+
1739
+ /**
1740
+ * get/set stroke linear gradient start point
1741
+ * @name Konva.Shape#strokeLinearGradientStartPoint
1742
+ * @method
1743
+ * @param {Object} startPoint
1744
+ * @param {Number} startPoint.x
1745
+ * @param {Number} startPoint.y
1746
+ * @returns {Object}
1747
+ * @example
1748
+ * // get stroke linear gradient start point
1749
+ * var startPoint = shape.strokeLinearGradientStartPoint();
1750
+ *
1751
+ * // set stroke linear gradient start point
1752
+ * shape.strokeLinearGradientStartPoint({
1753
+ * x: 20,
1754
+ * y: 10
1755
+ * });
1756
+ */
1757
+
1758
+ Factory.addGetterSetter(Shape, 'fillLinearGradientStartPointX', 0);
1759
+
1760
+ /**
1761
+ * get/set fill linear gradient start point x
1762
+ * @name Konva.Shape#fillLinearGradientStartPointX
1763
+ * @method
1764
+ * @param {Number} x
1765
+ * @returns {Number}
1766
+ * @example
1767
+ * // get fill linear gradient start point x
1768
+ * var startPointX = shape.fillLinearGradientStartPointX();
1769
+ *
1770
+ * // set fill linear gradient start point x
1771
+ * shape.fillLinearGradientStartPointX(20);
1772
+ */
1773
+
1774
+ Factory.addGetterSetter(Shape, 'strokeLinearGradientStartPointX', 0);
1775
+
1776
+ /**
1777
+ * get/set stroke linear gradient start point x
1778
+ * @name Konva.Shape#linearLinearGradientStartPointX
1779
+ * @method
1780
+ * @param {Number} x
1781
+ * @returns {Number}
1782
+ * @example
1783
+ * // get stroke linear gradient start point x
1784
+ * var startPointX = shape.strokeLinearGradientStartPointX();
1785
+ *
1786
+ * // set stroke linear gradient start point x
1787
+ * shape.strokeLinearGradientStartPointX(20);
1788
+ */
1789
+
1790
+ Factory.addGetterSetter(Shape, 'fillLinearGradientStartPointY', 0);
1791
+
1792
+ /**
1793
+ * get/set fill linear gradient start point y
1794
+ * @name Konva.Shape#fillLinearGradientStartPointY
1795
+ * @method
1796
+ * @param {Number} y
1797
+ * @returns {Number}
1798
+ * @example
1799
+ * // get fill linear gradient start point y
1800
+ * var startPointY = shape.fillLinearGradientStartPointY();
1801
+ *
1802
+ * // set fill linear gradient start point y
1803
+ * shape.fillLinearGradientStartPointY(20);
1804
+ */
1805
+
1806
+ Factory.addGetterSetter(Shape, 'strokeLinearGradientStartPointY', 0);
1807
+ /**
1808
+ * get/set stroke linear gradient start point y
1809
+ * @name Konva.Shape#strokeLinearGradientStartPointY
1810
+ * @method
1811
+ * @param {Number} y
1812
+ * @returns {Number}
1813
+ * @example
1814
+ * // get stroke linear gradient start point y
1815
+ * var startPointY = shape.strokeLinearGradientStartPointY();
1816
+ *
1817
+ * // set stroke linear gradient start point y
1818
+ * shape.strokeLinearGradientStartPointY(20);
1819
+ */
1820
+
1821
+ Factory.addComponentsGetterSetter(Shape, 'fillLinearGradientEndPoint', [
1822
+ 'x',
1823
+ 'y',
1824
+ ]);
1825
+
1826
+ /**
1827
+ * get/set fill linear gradient end point
1828
+ * @name Konva.Shape#fillLinearGradientEndPoint
1829
+ * @method
1830
+ * @param {Object} endPoint
1831
+ * @param {Number} endPoint.x
1832
+ * @param {Number} endPoint.y
1833
+ * @returns {Object}
1834
+ * @example
1835
+ * // get fill linear gradient end point
1836
+ * var endPoint = shape.fillLinearGradientEndPoint();
1837
+ *
1838
+ * // set fill linear gradient end point
1839
+ * shape.fillLinearGradientEndPoint({
1840
+ * x: 20,
1841
+ * y: 10
1842
+ * });
1843
+ */
1844
+
1845
+ Factory.addComponentsGetterSetter(Shape, 'strokeLinearGradientEndPoint', [
1846
+ 'x',
1847
+ 'y',
1848
+ ]);
1849
+
1850
+ /**
1851
+ * get/set stroke linear gradient end point
1852
+ * @name Konva.Shape#strokeLinearGradientEndPoint
1853
+ * @method
1854
+ * @param {Object} endPoint
1855
+ * @param {Number} endPoint.x
1856
+ * @param {Number} endPoint.y
1857
+ * @returns {Object}
1858
+ * @example
1859
+ * // get stroke linear gradient end point
1860
+ * var endPoint = shape.strokeLinearGradientEndPoint();
1861
+ *
1862
+ * // set stroke linear gradient end point
1863
+ * shape.strokeLinearGradientEndPoint({
1864
+ * x: 20,
1865
+ * y: 10
1866
+ * });
1867
+ */
1868
+
1869
+ Factory.addGetterSetter(Shape, 'fillLinearGradientEndPointX', 0);
1870
+ /**
1871
+ * get/set fill linear gradient end point x
1872
+ * @name Konva.Shape#fillLinearGradientEndPointX
1873
+ * @method
1874
+ * @param {Number} x
1875
+ * @returns {Number}
1876
+ * @example
1877
+ * // get fill linear gradient end point x
1878
+ * var endPointX = shape.fillLinearGradientEndPointX();
1879
+ *
1880
+ * // set fill linear gradient end point x
1881
+ * shape.fillLinearGradientEndPointX(20);
1882
+ */
1883
+
1884
+ Factory.addGetterSetter(Shape, 'strokeLinearGradientEndPointX', 0);
1885
+ /**
1886
+ * get/set fill linear gradient end point x
1887
+ * @name Konva.Shape#strokeLinearGradientEndPointX
1888
+ * @method
1889
+ * @param {Number} x
1890
+ * @returns {Number}
1891
+ * @example
1892
+ * // get stroke linear gradient end point x
1893
+ * var endPointX = shape.strokeLinearGradientEndPointX();
1894
+ *
1895
+ * // set stroke linear gradient end point x
1896
+ * shape.strokeLinearGradientEndPointX(20);
1897
+ */
1898
+
1899
+ Factory.addGetterSetter(Shape, 'fillLinearGradientEndPointY', 0);
1900
+ /**
1901
+ * get/set fill linear gradient end point y
1902
+ * @name Konva.Shape#fillLinearGradientEndPointY
1903
+ * @method
1904
+ * @param {Number} y
1905
+ * @returns {Number}
1906
+ * @example
1907
+ * // get fill linear gradient end point y
1908
+ * var endPointY = shape.fillLinearGradientEndPointY();
1909
+ *
1910
+ * // set fill linear gradient end point y
1911
+ * shape.fillLinearGradientEndPointY(20);
1912
+ */
1913
+
1914
+ Factory.addGetterSetter(Shape, 'strokeLinearGradientEndPointY', 0);
1915
+ /**
1916
+ * get/set stroke linear gradient end point y
1917
+ * @name Konva.Shape#strokeLinearGradientEndPointY
1918
+ * @method
1919
+ * @param {Number} y
1920
+ * @returns {Number}
1921
+ * @example
1922
+ * // get stroke linear gradient end point y
1923
+ * var endPointY = shape.strokeLinearGradientEndPointY();
1924
+ *
1925
+ * // set stroke linear gradient end point y
1926
+ * shape.strokeLinearGradientEndPointY(20);
1927
+ */
1928
+
1929
+ Factory.addComponentsGetterSetter(Shape, 'fillRadialGradientStartPoint', [
1930
+ 'x',
1931
+ 'y',
1932
+ ]);
1933
+
1934
+ /**
1935
+ * get/set fill radial gradient start point
1936
+ * @name Konva.Shape#fillRadialGradientStartPoint
1937
+ * @method
1938
+ * @param {Object} startPoint
1939
+ * @param {Number} startPoint.x
1940
+ * @param {Number} startPoint.y
1941
+ * @returns {Object}
1942
+ * @example
1943
+ * // get fill radial gradient start point
1944
+ * var startPoint = shape.fillRadialGradientStartPoint();
1945
+ *
1946
+ * // set fill radial gradient start point
1947
+ * shape.fillRadialGradientStartPoint({
1948
+ * x: 20,
1949
+ * y: 10
1950
+ * });
1951
+ */
1952
+
1953
+ Factory.addGetterSetter(Shape, 'fillRadialGradientStartPointX', 0);
1954
+ /**
1955
+ * get/set fill radial gradient start point x
1956
+ * @name Konva.Shape#fillRadialGradientStartPointX
1957
+ * @method
1958
+ * @param {Number} x
1959
+ * @returns {Number}
1960
+ * @example
1961
+ * // get fill radial gradient start point x
1962
+ * var startPointX = shape.fillRadialGradientStartPointX();
1963
+ *
1964
+ * // set fill radial gradient start point x
1965
+ * shape.fillRadialGradientStartPointX(20);
1966
+ */
1967
+
1968
+ Factory.addGetterSetter(Shape, 'fillRadialGradientStartPointY', 0);
1969
+ /**
1970
+ * get/set fill radial gradient start point y
1971
+ * @name Konva.Shape#fillRadialGradientStartPointY
1972
+ * @method
1973
+ * @param {Number} y
1974
+ * @returns {Number}
1975
+ * @example
1976
+ * // get fill radial gradient start point y
1977
+ * var startPointY = shape.fillRadialGradientStartPointY();
1978
+ *
1979
+ * // set fill radial gradient start point y
1980
+ * shape.fillRadialGradientStartPointY(20);
1981
+ */
1982
+
1983
+ Factory.addComponentsGetterSetter(Shape, 'fillRadialGradientEndPoint', [
1984
+ 'x',
1985
+ 'y',
1986
+ ]);
1987
+
1988
+ /**
1989
+ * get/set fill radial gradient end point
1990
+ * @name Konva.Shape#fillRadialGradientEndPoint
1991
+ * @method
1992
+ * @param {Object} endPoint
1993
+ * @param {Number} endPoint.x
1994
+ * @param {Number} endPoint.y
1995
+ * @returns {Object}
1996
+ * @example
1997
+ * // get fill radial gradient end point
1998
+ * var endPoint = shape.fillRadialGradientEndPoint();
1999
+ *
2000
+ * // set fill radial gradient end point
2001
+ * shape.fillRadialGradientEndPoint({
2002
+ * x: 20,
2003
+ * y: 10
2004
+ * });
2005
+ */
2006
+
2007
+ Factory.addGetterSetter(Shape, 'fillRadialGradientEndPointX', 0);
2008
+ /**
2009
+ * get/set fill radial gradient end point x
2010
+ * @name Konva.Shape#fillRadialGradientEndPointX
2011
+ * @method
2012
+ * @param {Number} x
2013
+ * @returns {Number}
2014
+ * @example
2015
+ * // get fill radial gradient end point x
2016
+ * var endPointX = shape.fillRadialGradientEndPointX();
2017
+ *
2018
+ * // set fill radial gradient end point x
2019
+ * shape.fillRadialGradientEndPointX(20);
2020
+ */
2021
+
2022
+ Factory.addGetterSetter(Shape, 'fillRadialGradientEndPointY', 0);
2023
+ /**
2024
+ * get/set fill radial gradient end point y
2025
+ * @name Konva.Shape#fillRadialGradientEndPointY
2026
+ * @method
2027
+ * @param {Number} y
2028
+ * @returns {Number}
2029
+ * @example
2030
+ * // get fill radial gradient end point y
2031
+ * var endPointY = shape.fillRadialGradientEndPointY();
2032
+ *
2033
+ * // set fill radial gradient end point y
2034
+ * shape.fillRadialGradientEndPointY(20);
2035
+ */
2036
+
2037
+ Factory.addGetterSetter(Shape, 'fillPatternRotation', 0);
2038
+
2039
+ /**
2040
+ * get/set fill pattern rotation in degrees
2041
+ * @name Konva.Shape#fillPatternRotation
2042
+ * @method
2043
+ * @param {Number} rotation
2044
+ * @returns {Konva.Shape}
2045
+ * @example
2046
+ * // get fill pattern rotation
2047
+ * var patternRotation = shape.fillPatternRotation();
2048
+ *
2049
+ * // set fill pattern rotation
2050
+ * shape.fillPatternRotation(20);
2051
+ */
2052
+
2053
+ Factory.addGetterSetter(Shape, 'fillRule', undefined, getStringValidator());
2054
+
2055
+ /**
2056
+ * get/set fill rule
2057
+ * @name Konva.Shape#fillRule
2058
+ * @method
2059
+ * @param {CanvasFillRule} rotation
2060
+ * @returns {Konva.Shape}
2061
+ * @example
2062
+ * // get fill rule
2063
+ * var fillRule = shape.fillRule();
2064
+ *
2065
+ * // set fill rule
2066
+ * shape.fillRule('evenodd');
2067
+ */
2068
+
2069
+ Factory.backCompat(Shape, {
2070
+ dashArray: 'dash',
2071
+ getDashArray: 'getDash',
2072
+ setDashArray: 'getDash',
2073
+
2074
+ drawFunc: 'sceneFunc',
2075
+ getDrawFunc: 'getSceneFunc',
2076
+ setDrawFunc: 'setSceneFunc',
2077
+
2078
+ drawHitFunc: 'hitFunc',
2079
+ getDrawHitFunc: 'getHitFunc',
2080
+ setDrawHitFunc: 'setHitFunc',
2081
+ });