2021-05-05 22:54:03 +08:00
import { Util } from './Util' ;
import { Factory } from './Factory' ;
import { Node , NodeConfig } from './Node' ;
2019-02-25 01:06:04 +08:00
import {
getNumberValidator ,
2019-03-11 01:35:44 +08:00
getNumberOrAutoValidator ,
2019-02-25 01:06:04 +08:00
getStringValidator ,
2020-05-15 00:13:47 +08:00
getBooleanValidator ,
2020-08-26 22:54:03 +08:00
getStringOrGradientValidator ,
2021-05-05 22:54:03 +08:00
} from './Validators' ;
2019-01-02 04:59:27 +08:00
2021-05-05 22:54:03 +08:00
import { Context , SceneContext } from './Context' ;
import { _registerNode } from './Global' ;
import * as PointerEvents from './PointerEvents' ;
2019-01-02 04:59:27 +08:00
2019-03-10 23:31:13 +08:00
import { GetSet , Vector2d } from './types' ;
2021-05-05 22:54:03 +08:00
import { HitCanvas , SceneCanvas } from './Canvas' ;
2019-03-10 23:31:13 +08:00
2019-05-09 21:28:09 +08:00
// hack from here https://stackoverflow.com/questions/52667959/what-is-the-purpose-of-bivariancehack-in-typescript-types/52668133#52668133
2019-05-08 20:08:34 +08:00
export type ShapeConfigHandler < TTarget > = {
2019-05-09 21:28:09 +08:00
bivarianceHack ( ctx : Context , shape : TTarget ) : void ;
} [ 'bivarianceHack' ] ;
2019-05-08 20:08:34 +08:00
2020-10-25 19:15:34 +08:00
export type LineJoin = 'round' | 'bevel' | 'miter' ;
export type LineCap = 'butt' | 'round' | 'square' ;
2019-03-10 23:31:13 +08:00
export interface ShapeConfig extends NodeConfig {
fill? : string ;
fillPatternImage? : HTMLImageElement ;
fillPatternX? : number ;
fillPatternY? : number ;
fillPatternOffset? : Vector2d ;
fillPatternOffsetX? : number ;
fillPatternOffsetY? : number ;
fillPatternScale? : Vector2d ;
fillPatternScaleX? : number ;
fillPatternScaleY? : number ;
fillPatternRotation? : number ;
fillPatternRepeat? : string ;
fillLinearGradientStartPoint? : Vector2d ;
fillLinearGradientStartPointX? : number ;
fillLinearGradientStartPointY? : number ;
fillLinearGradientEndPoint? : Vector2d ;
fillLinearGradientEndPointX? : number ;
fillLinearGradientEndPointY? : number ;
fillLinearGradientColorStops? : Array < number | string > ;
fillRadialGradientStartPoint? : Vector2d ;
fillRadialGradientStartPointX? : number ;
fillRadialGradientStartPointY? : number ;
fillRadialGradientEndPoint? : Vector2d ;
fillRadialGradientEndPointX? : number ;
fillRadialGradientEndPointY? : number ;
fillRadialGradientStartRadius? : number ;
fillRadialGradientEndRadius? : number ;
fillRadialGradientColorStops? : Array < number | string > ;
fillEnabled? : boolean ;
fillPriority? : string ;
2021-04-30 22:24:27 +08:00
stroke? : string | CanvasGradient ;
2019-03-10 23:31:13 +08:00
strokeWidth? : number ;
2020-11-23 02:49:15 +08:00
fillAfterStrokeEnabled? : boolean ;
2019-12-23 23:52:49 +08:00
hitStrokeWidth? : number | string ;
2019-03-10 23:31:13 +08:00
strokeScaleEnabled? : boolean ;
strokeHitEnabled? : boolean ;
strokeEnabled? : boolean ;
2020-10-25 19:15:34 +08:00
lineJoin? : LineJoin ;
lineCap? : LineCap ;
2019-03-10 23:31:13 +08:00
sceneFunc ? : ( con : Context , shape : Shape ) = > void ;
hitFunc ? : ( con : Context , shape : Shape ) = > void ;
shadowColor? : string ;
shadowBlur? : number ;
shadowOffset? : Vector2d ;
shadowOffsetX? : number ;
shadowOffsetY? : number ;
shadowOpacity? : number ;
shadowEnabled? : boolean ;
shadowForStrokeEnabled? : boolean ;
dash? : number [ ] ;
2019-07-12 15:11:42 +08:00
dashOffset? : number ;
2019-03-10 23:31:13 +08:00
dashEnabled? : boolean ;
perfectDrawEnabled? : boolean ;
}
2020-11-23 02:49:15 +08:00
export interface ShapeGetClientRectConfig {
2020-10-10 15:39:26 +08:00
skipTransform? : boolean ;
skipShadow? : boolean ;
skipStroke? : boolean ;
relativeTo? : Node ;
}
2019-01-02 04:59:27 +08:00
var HAS_SHADOW = 'hasShadow' ;
var SHADOW_RGBA = 'shadowRGBA' ;
2019-02-14 11:04:54 +08:00
var patternImage = 'patternImage' ;
var linearGradient = 'linearGradient' ;
var radialGradient = 'radialGradient' ;
2020-10-10 15:39:26 +08:00
let dummyContext : CanvasRenderingContext2D ;
2019-09-01 05:40:39 +08:00
function getDummyContext ( ) : CanvasRenderingContext2D {
2019-02-14 11:04:54 +08:00
if ( dummyContext ) {
return dummyContext ;
}
dummyContext = Util . createCanvasElement ( ) . getContext ( '2d' ) ;
return dummyContext ;
}
2019-01-02 04:59:27 +08:00
2020-10-16 14:34:14 +08:00
export const shapes : { [ key : string ] : Shape } = { } ;
2019-02-24 09:54:20 +08:00
2019-02-06 05:43:43 +08:00
// TODO: idea - use only "remove" (or destroy method)
// how? on add, check that every inner shape has reference in konva store with color
// on remove - clear that reference
2019-02-07 01:03:53 +08:00
// the approach is good. But what if we want to cache the shape before we add it into the stage
// what color to use for hit test?
2019-01-11 21:51:46 +08:00
2019-01-02 04:59:27 +08:00
function _fillFunc ( context ) {
context . fill ( ) ;
}
function _strokeFunc ( context ) {
context . stroke ( ) ;
}
function _fillFuncHit ( context ) {
context . fill ( ) ;
}
function _strokeFuncHit ( context ) {
context . stroke ( ) ;
}
function _clearHasShadowCache() {
this . _clearCache ( HAS_SHADOW ) ;
}
function _clearGetShadowRGBACache() {
this . _clearCache ( SHADOW_RGBA ) ;
}
2019-02-14 11:04:54 +08:00
function _clearFillPatternCache() {
this . _clearCache ( patternImage ) ;
}
function _clearLinearGradientCache() {
this . _clearCache ( linearGradient ) ;
}
function _clearRadialGradientCache() {
this . _clearCache ( radialGradient ) ;
}
2019-01-02 04:59:27 +08:00
/ * *
* Shape constructor . Shapes are primitive objects such as rectangles ,
* circles , text , lines , etc .
* @constructor
* @memberof Konva
* @augments Konva . Node
* @param { Object } config
* @ @shapeParams
* @ @nodeParams
* @example
* var customShape = new Konva . Shape ( {
* x : 5 ,
* y : 10 ,
* fill : 'red' ,
* // a Konva.Canvas renderer is passed into the sceneFunc function
* sceneFunc ( context , shape ) {
* context . beginPath ( ) ;
* context . moveTo ( 200 , 50 ) ;
* context . lineTo ( 420 , 80 ) ;
* context . quadraticCurveTo ( 300 , 100 , 260 , 170 ) ;
* context . closePath ( ) ;
* // Konva specific method
* context . fillStrokeShape ( shape ) ;
* }
* } ) ;
* /
2021-04-30 22:24:27 +08:00
export class Shape <
Config extends ShapeConfig = ShapeConfig
> extends Node < Config > {
2019-01-02 04:59:27 +08:00
_centroid : boolean ;
colorKey : string ;
2019-01-06 16:01:20 +08:00
_fillFunc : ( ctx : Context ) = > void ;
_strokeFunc : ( ctx : Context ) = > void ;
_fillFuncHit : ( ctx : Context ) = > void ;
_strokeFuncHit : ( ctx : Context ) = > void ;
2019-03-10 23:31:13 +08:00
constructor ( config? : Config ) {
2019-01-02 04:59:27 +08:00
super ( config ) ;
// set colorKey
2020-10-16 14:34:14 +08:00
let key : string ;
2019-01-02 04:59:27 +08:00
while ( true ) {
key = Util . getRandomColor ( ) ;
if ( key && ! ( key in shapes ) ) {
break ;
}
}
this . colorKey = key ;
shapes [ key ] = this ;
}
/ * *
* get canvas context tied to the layer
* @method
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # getContext
2019-01-02 04:59:27 +08:00
* @returns { Konva . Context }
* /
2021-05-05 22:19:24 +08:00
// TODO: remove method
2019-01-02 04:59:27 +08:00
getContext() {
return this . getLayer ( ) . getContext ( ) ;
}
/ * *
* get canvas renderer tied to the layer . Note that this returns a canvas renderer , not a canvas element
* @method
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # getCanvas
2019-01-02 04:59:27 +08:00
* @returns { Konva . Canvas }
* /
2021-05-05 22:19:24 +08:00
// TODO: remove method
2019-01-02 04:59:27 +08:00
getCanvas() {
return this . getLayer ( ) . getCanvas ( ) ;
}
2019-01-06 16:01:20 +08:00
getSceneFunc() {
return this . attrs . sceneFunc || this [ '_sceneFunc' ] ;
}
2019-02-21 00:01:38 +08:00
getHitFunc() {
return this . attrs . hitFunc || this [ '_hitFunc' ] ;
}
2019-01-02 04:59:27 +08:00
/ * *
* returns whether or not a shadow will be rendered
* @method
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # hasShadow
2019-01-02 04:59:27 +08:00
* @returns { Boolean }
* /
hasShadow() {
return this . _getCache ( HAS_SHADOW , this . _hasShadow ) ;
}
_hasShadow() {
return (
this . shadowEnabled ( ) &&
2020-03-27 03:41:06 +08:00
this . shadowOpacity ( ) !== 0 &&
! ! (
this . shadowColor ( ) ||
this . shadowBlur ( ) ||
this . shadowOffsetX ( ) ||
this . shadowOffsetY ( )
)
2019-01-02 04:59:27 +08:00
) ;
}
2019-02-14 11:04:54 +08:00
_getFillPattern() {
return this . _getCache ( patternImage , this . __getFillPattern ) ;
}
__getFillPattern() {
if ( this . fillPatternImage ( ) ) {
var ctx = getDummyContext ( ) ;
2019-09-01 05:40:39 +08:00
const pattern = ctx . createPattern (
2019-02-14 11:04:54 +08:00
this . fillPatternImage ( ) ,
this . fillPatternRepeat ( ) || 'repeat'
) ;
2020-09-15 05:37:25 +08:00
if ( pattern && pattern . setTransform ) {
pattern . setTransform ( {
a : this.fillPatternScaleX ( ) , // Horizontal scaling. A value of 1 results in no scaling.
b : 0 , // Vertical skewing.
c : 0 , // Horizontal skewing.
d : this.fillPatternScaleY ( ) , // Vertical scaling. A value of 1 results in no scaling.
e : 0 , // Horizontal translation (moving).
f : 0 , // Vertical translation (moving).
} ) ;
}
2019-09-01 05:40:39 +08:00
return pattern ;
2019-02-14 11:04:54 +08:00
}
}
_getLinearGradient() {
return this . _getCache ( linearGradient , this . __getLinearGradient ) ;
}
__getLinearGradient() {
var colorStops = this . fillLinearGradientColorStops ( ) ;
if ( colorStops ) {
var ctx = getDummyContext ( ) ;
var start = this . fillLinearGradientStartPoint ( ) ;
var end = this . fillLinearGradientEndPoint ( ) ;
var grd = ctx . createLinearGradient ( start . x , start . y , end . x , end . y ) ;
// build color stops
for ( var n = 0 ; n < colorStops . length ; n += 2 ) {
2019-09-01 05:40:39 +08:00
grd . addColorStop ( colorStops [ n ] as number , colorStops [ n + 1 ] as string ) ;
2019-02-14 11:04:54 +08:00
}
return grd ;
}
}
_getRadialGradient() {
return this . _getCache ( radialGradient , this . __getRadialGradient ) ;
}
__getRadialGradient() {
var colorStops = this . fillRadialGradientColorStops ( ) ;
if ( colorStops ) {
var ctx = getDummyContext ( ) ;
var start = this . fillRadialGradientStartPoint ( ) ;
var end = this . fillRadialGradientEndPoint ( ) ;
var grd = ctx . createRadialGradient (
start . x ,
start . y ,
this . fillRadialGradientStartRadius ( ) ,
end . x ,
end . y ,
this . fillRadialGradientEndRadius ( )
) ;
// build color stops
for ( var n = 0 ; n < colorStops . length ; n += 2 ) {
2019-09-01 05:40:39 +08:00
grd . addColorStop ( colorStops [ n ] as number , colorStops [ n + 1 ] as string ) ;
2019-02-14 11:04:54 +08:00
}
return grd ;
}
}
2019-01-02 04:59:27 +08:00
getShadowRGBA() {
return this . _getCache ( SHADOW_RGBA , this . _getShadowRGBA ) ;
}
_getShadowRGBA() {
if ( this . hasShadow ( ) ) {
var rgba = Util . colorToRGBA ( this . shadowColor ( ) ) ;
return (
'rgba(' +
rgba . r +
',' +
rgba . g +
',' +
rgba . b +
',' +
rgba . a * ( this . shadowOpacity ( ) || 1 ) +
')'
) ;
}
}
/ * *
* returns whether or not the shape will be filled
* @method
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # hasFill
2019-01-02 04:59:27 +08:00
* @returns { Boolean }
* /
hasFill() {
2020-06-17 05:20:36 +08:00
return this . _calculate (
'hasFill' ,
[
'fillEnabled' ,
'fill' ,
'fillPatternImage' ,
'fillLinearGradientColorStops' ,
'fillRadialGradientColorStops' ,
] ,
( ) = > {
return (
this . fillEnabled ( ) &&
! ! (
this . fill ( ) ||
this . fillPatternImage ( ) ||
this . fillLinearGradientColorStops ( ) ||
this . fillRadialGradientColorStops ( )
)
) ;
}
2019-01-02 04:59:27 +08:00
) ;
}
/ * *
* returns whether or not the shape will be stroked
* @method
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # hasStroke
2019-01-02 04:59:27 +08:00
* @returns { Boolean }
* /
hasStroke() {
2020-06-17 05:20:36 +08:00
return this . _calculate (
'hasStroke' ,
[
'strokeEnabled' ,
'strokeWidth' ,
'stroke' ,
'strokeLinearGradientColorStops' ,
] ,
( ) = > {
return (
this . strokeEnabled ( ) &&
this . strokeWidth ( ) &&
! ! ( this . stroke ( ) || this . strokeLinearGradientColorStops ( ) )
// this.getStrokeRadialGradientColorStops()
) ;
}
2019-01-02 04:59:27 +08:00
) ;
2020-06-17 05:20:36 +08:00
// return (
// this.strokeEnabled() &&
// this.strokeWidth() &&
// !!(this.stroke() || this.strokeLinearGradientColorStops())
// // this.getStrokeRadialGradientColorStops()
// );
2019-01-02 04:59:27 +08:00
}
2019-11-09 00:37:10 +08:00
hasHitStroke() {
const width = this . hitStrokeWidth ( ) ;
2020-03-27 04:14:30 +08:00
// on auto just check by stroke
if ( width === 'auto' ) {
return this . hasStroke ( ) ;
}
// we should enable hit stroke if stroke is enabled
2019-11-09 00:37:10 +08:00
// and we have some value from width
2020-03-27 04:14:30 +08:00
return this . strokeEnabled ( ) && ! ! width ;
2019-11-09 00:37:10 +08:00
}
2019-01-02 04:59:27 +08:00
/ * *
* determines if point is in the shape , regardless if other shapes are on top of it . Note : because
* this method clears a temporary canvas and then redraws the shape , it performs very poorly if executed many times
* consecutively . Please use the { @link Konva . Stage # getIntersection } method if at all possible
* because it performs much better
* @method
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # intersects
2019-01-02 04:59:27 +08:00
* @param { Object } point
* @param { Number } point . x
* @param { Number } point . y
* @returns { Boolean }
* /
intersects ( point ) {
var stage = this . getStage ( ) ,
bufferHitCanvas = stage . bufferHitCanvas ,
p ;
bufferHitCanvas . getContext ( ) . clear ( ) ;
2020-12-12 00:12:40 +08:00
this . drawHit ( bufferHitCanvas , null , true ) ;
2019-01-02 04:59:27 +08:00
p = bufferHitCanvas . context . getImageData (
Math . round ( point . x ) ,
Math . round ( point . y ) ,
1 ,
1
) . data ;
return p [ 3 ] > 0 ;
}
2019-01-06 16:01:20 +08:00
2019-01-02 04:59:27 +08:00
destroy() {
Node . prototype . destroy . call ( this ) ;
delete shapes [ this . colorKey ] ;
2019-02-14 12:41:32 +08:00
delete this . colorKey ;
2019-01-02 04:59:27 +08:00
return this ;
}
2019-01-28 04:43:50 +08:00
// why do we need buffer canvas?
// it give better result when a shape has
// stroke with fill and with some opacity
2020-05-15 00:13:47 +08:00
_useBufferCanvas ( forceFill? : boolean ) : boolean {
// image and sprite still has "fill" as image
// so they use that method with forced fill
// it probably will be simpler, then copy/paste the code
// buffer canvas is available only inside the stage
if ( ! this . getStage ( ) ) {
return false ;
}
// force skip buffer canvas
2020-06-24 06:22:28 +08:00
const perfectDrawEnabled = this . attrs . perfectDrawEnabled ? ? true ;
if ( ! perfectDrawEnabled ) {
2020-05-15 00:13:47 +08:00
return false ;
}
const hasFill = forceFill || this . hasFill ( ) ;
const hasStroke = this . hasStroke ( ) ;
const isTransparent = this . getAbsoluteOpacity ( ) !== 1 ;
if ( hasFill && hasStroke && isTransparent ) {
return true ;
}
const hasShadow = this . hasShadow ( ) ;
const strokeForShadow = this . shadowForStrokeEnabled ( ) ;
if ( hasFill && hasStroke && hasShadow && strokeForShadow ) {
return true ;
}
return false ;
2019-01-02 04:59:27 +08:00
}
2019-03-11 01:35:44 +08:00
setStrokeHitEnabled ( val : number ) {
2020-03-27 03:41:06 +08:00
Util . warn (
'strokeHitEnabled property is deprecated. Please use hitStrokeWidth instead.'
) ;
2019-03-11 01:35:44 +08:00
if ( val ) {
this . hitStrokeWidth ( 'auto' ) ;
} else {
this . hitStrokeWidth ( 0 ) ;
}
}
getStrokeHitEnabled() {
if ( this . hitStrokeWidth ( ) === 0 ) {
return false ;
} else {
return true ;
}
}
2019-01-02 04:59:27 +08:00
/ * *
* return self rectangle ( x , y , width , height ) of shape .
* This method are not taken into account transformation and styles .
* @method
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # getSelfRect
2019-01-02 04:59:27 +08:00
* @returns { Object } rect with { x , y , width , height } properties
* @example
*
* rect . getSelfRect ( ) ; // return {x:0, y:0, width:rect.width(), height:rect.height()}
* circle . getSelfRect ( ) ; // return {x: - circle.width() / 2, y: - circle.height() / 2, width:circle.width(), height:circle.height()}
*
* /
getSelfRect() {
2019-01-28 04:43:50 +08:00
var size = this . size ( ) ;
2019-01-02 04:59:27 +08:00
return {
2020-03-27 03:41:06 +08:00
x : this._centroid ? - size . width / 2 : 0 ,
y : this._centroid ? - size . height / 2 : 0 ,
2019-01-02 04:59:27 +08:00
width : size.width ,
2020-05-15 00:13:47 +08:00
height : size.height ,
2019-01-02 04:59:27 +08:00
} ;
}
2020-11-23 02:49:15 +08:00
getClientRect ( config : ShapeGetClientRectConfig = { } ) {
2020-10-10 15:39:26 +08:00
const skipTransform = config . skipTransform ;
2019-01-02 04:59:27 +08:00
2020-10-10 15:39:26 +08:00
const relativeTo = config . relativeTo ;
2019-01-02 04:59:27 +08:00
2020-10-10 15:39:26 +08:00
const fillRect = this . getSelfRect ( ) ;
2019-01-02 04:59:27 +08:00
2020-10-10 15:39:26 +08:00
const applyStroke = ! config . skipStroke && this . hasStroke ( ) ;
const strokeWidth = ( applyStroke && this . strokeWidth ( ) ) || 0 ;
2019-01-02 04:59:27 +08:00
2020-10-10 15:39:26 +08:00
const fillAndStrokeWidth = fillRect . width + strokeWidth ;
const fillAndStrokeHeight = fillRect . height + strokeWidth ;
2019-01-02 04:59:27 +08:00
2020-10-10 15:39:26 +08:00
const applyShadow = ! config . skipShadow && this . hasShadow ( ) ;
const shadowOffsetX = applyShadow ? this . shadowOffsetX ( ) : 0 ;
const shadowOffsetY = applyShadow ? this . shadowOffsetY ( ) : 0 ;
2019-01-02 04:59:27 +08:00
2020-10-10 15:39:26 +08:00
const preWidth = fillAndStrokeWidth + Math . abs ( shadowOffsetX ) ;
const preHeight = fillAndStrokeHeight + Math . abs ( shadowOffsetY ) ;
2019-01-02 04:59:27 +08:00
2020-10-10 15:39:26 +08:00
const blurRadius = ( applyShadow && this . shadowBlur ( ) ) || 0 ;
2019-01-02 04:59:27 +08:00
2020-10-10 15:39:26 +08:00
const width = preWidth + blurRadius * 2 ;
const height = preHeight + blurRadius * 2 ;
2019-01-02 04:59:27 +08:00
// if stroke, for example = 3
// we need to set x to 1.5, but after Math.round it will be 2
// as we have additional offset we need to increase width and height by 1 pixel
2020-10-10 15:39:26 +08:00
let roundingOffset = 0 ;
2019-01-02 04:59:27 +08:00
if ( Math . round ( strokeWidth / 2 ) !== strokeWidth / 2 ) {
roundingOffset = 1 ;
}
2020-10-10 15:39:26 +08:00
const rect = {
2019-01-02 04:59:27 +08:00
width : width + roundingOffset ,
height : height + roundingOffset ,
x :
- Math . round ( strokeWidth / 2 + blurRadius ) +
Math . min ( shadowOffsetX , 0 ) +
fillRect . x ,
y :
- Math . round ( strokeWidth / 2 + blurRadius ) +
Math . min ( shadowOffsetY , 0 ) +
2020-05-15 00:13:47 +08:00
fillRect . y ,
2019-01-02 04:59:27 +08:00
} ;
if ( ! skipTransform ) {
return this . _transformedRect ( rect , relativeTo ) ;
}
return rect ;
}
2020-05-15 00:13:47 +08:00
drawScene ( can? : SceneCanvas , top? : Node ) {
2020-06-03 01:16:44 +08:00
// basically there are 3 drawing modes
2020-05-15 00:13:47 +08:00
// 1 - simple drawing when nothing is cached.
// 2 - when we are caching current
// 3 - when node is cached and we need to draw it into layer
2019-01-02 04:59:27 +08:00
var layer = this . getLayer ( ) ,
canvas = can || layer . getCanvas ( ) ,
2020-05-15 00:13:47 +08:00
context = canvas . getContext ( ) as SceneContext ,
2019-02-18 04:59:08 +08:00
cachedCanvas = this . _getCanvasCache ( ) ,
2020-06-24 06:22:28 +08:00
drawFunc = this . getSceneFunc ( ) ,
2019-01-02 04:59:27 +08:00
hasShadow = this . hasShadow ( ) ,
stage ,
bufferCanvas ,
bufferContext ;
2020-05-15 00:13:47 +08:00
var caching = canvas . isCache ;
var skipBuffer = canvas . isCache ;
var cachingSelf = top === this ;
2019-01-02 04:59:27 +08:00
if ( ! this . isVisible ( ) && ! caching ) {
return this ;
}
2020-05-15 00:13:47 +08:00
// if node is cached we just need to draw from cache
2019-01-02 04:59:27 +08:00
if ( cachedCanvas ) {
context . save ( ) ;
2020-06-11 00:57:48 +08:00
var m = this . getAbsoluteTransform ( top ) . getMatrix ( ) ;
context . transform ( m [ 0 ] , m [ 1 ] , m [ 2 ] , m [ 3 ] , m [ 4 ] , m [ 5 ] ) ;
2019-01-02 04:59:27 +08:00
this . _drawCachedSceneCanvas ( context ) ;
context . restore ( ) ;
return this ;
}
2020-05-15 00:13:47 +08:00
2019-01-02 04:59:27 +08:00
if ( ! drawFunc ) {
return this ;
}
2020-05-15 00:13:47 +08:00
2019-01-02 04:59:27 +08:00
context . save ( ) ;
// if buffer canvas is needed
2020-05-15 00:13:47 +08:00
if ( this . _useBufferCanvas ( ) && ! skipBuffer ) {
2019-01-02 04:59:27 +08:00
stage = this . getStage ( ) ;
bufferCanvas = stage . bufferCanvas ;
bufferContext = bufferCanvas . getContext ( ) ;
bufferContext . clear ( ) ;
bufferContext . save ( ) ;
bufferContext . _applyLineJoin ( this ) ;
// layer might be undefined if we are using cache before adding to layer
2020-05-15 00:13:47 +08:00
var o = this . getAbsoluteTransform ( top ) . getMatrix ( ) ;
bufferContext . transform ( o [ 0 ] , o [ 1 ] , o [ 2 ] , o [ 3 ] , o [ 4 ] , o [ 5 ] ) ;
2019-01-02 04:59:27 +08:00
drawFunc . call ( this , bufferContext , this ) ;
bufferContext . restore ( ) ;
var ratio = bufferCanvas . pixelRatio ;
2020-05-15 00:13:47 +08:00
if ( hasShadow ) {
2019-01-02 04:59:27 +08:00
context . _applyShadow ( this ) ;
}
2020-05-15 00:13:47 +08:00
context . _applyOpacity ( this ) ;
context . _applyGlobalCompositeOperation ( this ) ;
context . drawImage (
bufferCanvas . _canvas ,
0 ,
0 ,
bufferCanvas . width / ratio ,
bufferCanvas . height / ratio
) ;
2019-01-02 04:59:27 +08:00
} else {
context . _applyLineJoin ( this ) ;
2020-05-15 00:13:47 +08:00
if ( ! cachingSelf ) {
var o = this . getAbsoluteTransform ( top ) . getMatrix ( ) ;
context . transform ( o [ 0 ] , o [ 1 ] , o [ 2 ] , o [ 3 ] , o [ 4 ] , o [ 5 ] ) ;
context . _applyOpacity ( this ) ;
context . _applyGlobalCompositeOperation ( this ) ;
2019-01-02 04:59:27 +08:00
}
2020-05-15 00:13:47 +08:00
if ( hasShadow ) {
2019-01-02 04:59:27 +08:00
context . _applyShadow ( this ) ;
2020-05-15 00:13:47 +08:00
}
2019-01-02 04:59:27 +08:00
2020-05-15 00:13:47 +08:00
drawFunc . call ( this , context , this ) ;
2019-01-02 04:59:27 +08:00
}
context . restore ( ) ;
return this ;
}
2020-12-12 00:12:40 +08:00
drawHit ( can? : HitCanvas , top? : Node , skipDragCheck = false ) {
if ( ! this . shouldDrawHit ( top , skipDragCheck ) ) {
2020-05-15 00:13:47 +08:00
return this ;
}
2019-01-02 04:59:27 +08:00
var layer = this . getLayer ( ) ,
canvas = can || layer . hitCanvas ,
2019-02-23 01:46:46 +08:00
context = canvas && canvas . getContext ( ) ,
2019-01-02 04:59:27 +08:00
drawFunc = this . hitFunc ( ) || this . sceneFunc ( ) ,
2019-02-18 04:59:08 +08:00
cachedCanvas = this . _getCanvasCache ( ) ,
2019-01-02 04:59:27 +08:00
cachedHitCanvas = cachedCanvas && cachedCanvas . hit ;
2019-02-14 12:41:32 +08:00
if ( ! this . colorKey ) {
Util . warn (
2021-04-30 22:24:27 +08:00
'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()'
2019-02-14 12:41:32 +08:00
) ;
}
2019-01-02 04:59:27 +08:00
if ( cachedHitCanvas ) {
context . save ( ) ;
2020-06-11 00:57:48 +08:00
var m = this . getAbsoluteTransform ( top ) . getMatrix ( ) ;
context . transform ( m [ 0 ] , m [ 1 ] , m [ 2 ] , m [ 3 ] , m [ 4 ] , m [ 5 ] ) ;
2019-01-02 04:59:27 +08:00
this . _drawCachedHitCanvas ( context ) ;
context . restore ( ) ;
return this ;
}
if ( ! drawFunc ) {
return this ;
}
context . save ( ) ;
context . _applyLineJoin ( this ) ;
2020-05-15 00:13:47 +08:00
const selfCache = this === top ;
if ( ! selfCache ) {
var o = this . getAbsoluteTransform ( top ) . getMatrix ( ) ;
context . transform ( o [ 0 ] , o [ 1 ] , o [ 2 ] , o [ 3 ] , o [ 4 ] , o [ 5 ] ) ;
2019-01-02 04:59:27 +08:00
}
drawFunc . call ( this , context , this ) ;
context . restore ( ) ;
return this ;
}
/ * *
* draw hit graph using the cached scene canvas
* @method
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # drawHitFromCache
2019-01-02 04:59:27 +08:00
* @param { Integer } alphaThreshold alpha channel threshold that determines whether or not
* a pixel should be drawn onto the hit graph . Must be a value between 0 and 255 .
* The default is 0
* @returns { Konva . Shape }
* @example
* shape . cache ( ) ;
* shape . drawHitFromCache ( ) ;
* /
2019-05-28 01:54:11 +08:00
drawHitFromCache ( alphaThreshold = 0 ) {
var cachedCanvas = this . _getCanvasCache ( ) ,
2019-01-02 04:59:27 +08:00
sceneCanvas = this . _getCachedSceneCanvas ( ) ,
hitCanvas = cachedCanvas . hit ,
hitContext = hitCanvas . getContext ( ) ,
hitWidth = hitCanvas . getWidth ( ) ,
hitHeight = hitCanvas . getHeight ( ) ,
hitImageData ,
hitData ,
len ,
rgbColorKey ,
i ,
alpha ;
hitContext . clear ( ) ;
hitContext . drawImage ( sceneCanvas . _canvas , 0 , 0 , hitWidth , hitHeight ) ;
try {
hitImageData = hitContext . getImageData ( 0 , 0 , hitWidth , hitHeight ) ;
hitData = hitImageData . data ;
len = hitData . length ;
rgbColorKey = Util . _hexToRgb ( this . colorKey ) ;
// replace non transparent pixels with color key
for ( i = 0 ; i < len ; i += 4 ) {
alpha = hitData [ i + 3 ] ;
2019-05-28 01:54:11 +08:00
if ( alpha > alphaThreshold ) {
2019-01-02 04:59:27 +08:00
hitData [ i ] = rgbColorKey . r ;
hitData [ i + 1 ] = rgbColorKey . g ;
hitData [ i + 2 ] = rgbColorKey . b ;
hitData [ i + 3 ] = 255 ;
} else {
hitData [ i + 3 ] = 0 ;
}
}
hitContext . putImageData ( hitImageData , 0 , 0 ) ;
} catch ( e ) {
Util . error (
'Unable to draw hit graph from cached scene canvas. ' + e . message
) ;
}
return this ;
}
2019-04-10 22:28:42 +08:00
hasPointerCapture ( pointerId : number ) : boolean {
return PointerEvents . hasPointerCapture ( pointerId , this ) ;
2019-03-27 04:30:00 +08:00
}
setPointerCapture ( pointerId : number ) {
PointerEvents . setPointerCapture ( pointerId , this ) ;
}
releaseCapture ( pointerId : number ) {
PointerEvents . releaseCapture ( pointerId , this ) ;
}
2019-01-02 04:59:27 +08:00
draggable : GetSet < boolean , this > ;
embossBlend : GetSet < boolean , this > ;
dash : GetSet < number [ ] , this > ;
dashEnabled : GetSet < boolean , this > ;
2019-07-12 15:11:42 +08:00
dashOffset : GetSet < number , this > ;
2019-01-02 04:59:27 +08:00
fill : GetSet < string , this > ;
fillEnabled : GetSet < boolean , this > ;
fillLinearGradientColorStops : GetSet < Array < number | string > , this > ;
fillLinearGradientStartPoint : GetSet < Vector2d , this > ;
fillLinearGradientStartPointX : GetSet < number , this > ;
fillLinearGradientStartPointY : GetSet < number , this > ;
fillLinearGradientEndPoint : GetSet < Vector2d , this > ;
fillLinearGradientEndPointX : GetSet < number , this > ;
fillLinearGradientEndPointY : GetSet < number , this > ;
fillLinearRadialStartPoint : GetSet < Vector2d , this > ;
fillLinearRadialStartPointX : GetSet < number , this > ;
fillLinearRadialStartPointY : GetSet < number , this > ;
fillLinearRadialEndPoint : GetSet < Vector2d , this > ;
fillLinearRadialEndPointX : GetSet < number , this > ;
fillLinearRadialEndPointY : GetSet < number , this > ;
2021-04-30 22:24:27 +08:00
fillPatternImage : GetSet < HTMLImageElement | HTMLCanvasElement , this > ;
2019-01-02 04:59:27 +08:00
fillRadialGradientStartRadius : GetSet < number , this > ;
fillRadialGradientEndRadius : GetSet < number , this > ;
fillRadialGradientColorStops : GetSet < Array < number | string > , this > ;
2019-02-14 11:04:54 +08:00
fillRadialGradientStartPoint : GetSet < Vector2d , this > ;
fillRadialGradientStartPointX : GetSet < number , this > ;
fillRadialGradientStartPointY : GetSet < number , this > ;
fillRadialGradientEndPoint : GetSet < Vector2d , this > ;
fillRadialGradientEndPointX : GetSet < number , this > ;
fillRadialGradientEndPointY : GetSet < number , this > ;
2019-01-02 04:59:27 +08:00
fillPatternOffset : GetSet < Vector2d , this > ;
fillPatternOffsetX : GetSet < number , this > ;
fillPatternOffsetY : GetSet < number , this > ;
fillPatternRepeat : GetSet < string , this > ;
fillPatternRotation : GetSet < number , this > ;
fillPatternScale : GetSet < Vector2d , this > ;
fillPatternScaleX : GetSet < number , this > ;
fillPatternScaleY : GetSet < number , this > ;
fillPatternX : GetSet < number , this > ;
fillPatternY : GetSet < number , this > ;
fillPriority : GetSet < string , this > ;
2019-05-08 20:08:34 +08:00
hitFunc : GetSet < ShapeConfigHandler < this > , this > ;
2020-10-25 19:15:34 +08:00
lineCap : GetSet < LineCap , this > ;
lineJoin : GetSet < LineJoin , this > ;
2019-01-02 04:59:27 +08:00
perfectDrawEnabled : GetSet < boolean , this > ;
2019-05-08 20:08:34 +08:00
sceneFunc : GetSet < ShapeConfigHandler < this > , this > ;
2019-01-02 04:59:27 +08:00
shadowColor : GetSet < string , this > ;
shadowEnabled : GetSet < boolean , this > ;
shadowForStrokeEnabled : GetSet < boolean , this > ;
shadowOffset : GetSet < Vector2d , this > ;
shadowOffsetX : GetSet < number , this > ;
shadowOffsetY : GetSet < number , this > ;
shadowOpacity : GetSet < number , this > ;
shadowBlur : GetSet < number , this > ;
stroke : GetSet < string , this > ;
strokeEnabled : GetSet < boolean , this > ;
2020-11-23 02:49:15 +08:00
fillAfterStrokeEnabled : GetSet < boolean , this > ;
2019-01-02 04:59:27 +08:00
strokeScaleEnabled : GetSet < boolean , this > ;
strokeHitEnabled : GetSet < boolean , this > ;
strokeWidth : GetSet < number , this > ;
2019-03-11 01:35:44 +08:00
hitStrokeWidth : GetSet < number | ' auto ' , this > ;
2019-01-02 04:59:27 +08:00
strokeLinearGradientColorStops : GetSet < Array < number | string > , this > ;
}
2019-01-06 16:01:20 +08:00
Shape . prototype . _fillFunc = _fillFunc ;
Shape . prototype . _strokeFunc = _strokeFunc ;
Shape . prototype . _fillFuncHit = _fillFuncHit ;
Shape . prototype . _strokeFuncHit = _strokeFuncHit ;
Shape . prototype . _centroid = false ;
Shape . prototype . nodeType = 'Shape' ;
2019-02-27 21:06:04 +08:00
_registerNode ( Shape ) ;
2019-01-06 16:01:20 +08:00
2020-07-30 23:44:15 +08:00
Shape . prototype . eventListeners = { } ;
Shape . prototype . on . call (
Shape . prototype ,
'shadowColorChange.konva shadowBlurChange.konva shadowOffsetChange.konva shadowOpacityChange.konva shadowEnabledChange.konva' ,
_clearHasShadowCache
) ;
Shape . prototype . on . call (
Shape . prototype ,
'shadowColorChange.konva shadowOpacityChange.konva shadowEnabledChange.konva' ,
_clearGetShadowRGBACache
) ;
Shape . prototype . on . call (
Shape . prototype ,
'fillPriorityChange.konva fillPatternImageChange.konva fillPatternRepeatChange.konva fillPatternScaleXChange.konva fillPatternScaleYChange.konva' ,
_clearFillPatternCache
) ;
Shape . prototype . on . call (
Shape . prototype ,
'fillPriorityChange.konva fillLinearGradientColorStopsChange.konva fillLinearGradientStartPointXChange.konva fillLinearGradientStartPointYChange.konva fillLinearGradientEndPointXChange.konva fillLinearGradientEndPointYChange.konva' ,
_clearLinearGradientCache
) ;
Shape . prototype . on . call (
Shape . prototype ,
'fillPriorityChange.konva fillRadialGradientColorStopsChange.konva fillRadialGradientStartPointXChange.konva fillRadialGradientStartPointYChange.konva fillRadialGradientEndPointXChange.konva fillRadialGradientEndPointYChange.konva fillRadialGradientStartRadiusChange.konva fillRadialGradientEndRadiusChange.konva' ,
_clearRadialGradientCache
) ;
2019-01-02 04:59:27 +08:00
// add getters and setters
2020-08-26 22:54:03 +08:00
Factory . addGetterSetter (
Shape ,
'stroke' ,
undefined ,
getStringOrGradientValidator ( )
) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set stroke color
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # stroke
2019-01-02 04:59:27 +08:00
* @method
* @param { String } color
* @returns { String }
* @example
* // get stroke color
* var stroke = shape . stroke ( ) ;
*
* // set stroke color with color string
* shape . stroke ( 'green' ) ;
*
* // set stroke color with hex
* shape . stroke ( '#00ff00' ) ;
*
* // set stroke color with rgb
* shape . stroke ( 'rgb(0,255,0)' ) ;
*
* // set stroke color with rgba and make it 50% opaque
* shape . stroke ( 'rgba(0,255,0,0.5' ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'strokeWidth' , 2 , getNumberValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set stroke width
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # strokeWidth
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } strokeWidth
* @returns { Number }
* @example
* // get stroke width
* var strokeWidth = shape . strokeWidth ( ) ;
*
* // set stroke width
2019-03-11 01:35:44 +08:00
* shape . strokeWidth ( 10 ) ;
2019-01-02 04:59:27 +08:00
* /
2020-11-23 02:49:15 +08:00
Factory . addGetterSetter ( Shape , 'fillAfterStrokeEnabled' , false ) ;
/ * *
* get / set fillAfterStrokeEnabled property . By default Konva is drawing filling first , then stroke on top of the fill .
* In rare situations you may want a different behavior . When you have a stroke first then fill on top of it .
* Especially useful for Text objects .
* Default is false .
* @name Konva . Shape # fillAfterStrokeEnabled
* @method
* @param { Boolean } fillAfterStrokeEnabled
* @returns { Boolean }
* @example
* // get stroke width
* var fillAfterStrokeEnabled = shape . fillAfterStrokeEnabled ( ) ;
*
* // set stroke width
* shape . fillAfterStrokeEnabled ( true ) ;
* /
2019-03-11 01:35:44 +08:00
Factory . addGetterSetter (
Shape ,
'hitStrokeWidth' ,
'auto' ,
getNumberOrAutoValidator ( )
) ;
/ * *
* get / set stroke width for hit detection . Default value is "auto" , it means it will be equals to strokeWidth
* @name Konva . Shape # hitStrokeWidth
* @method
* @param { Number } hitStrokeWidth
* @returns { Number }
* @example
* // get stroke width
* var hitStrokeWidth = shape . hitStrokeWidth ( ) ;
*
* // set hit stroke width
* shape . hitStrokeWidth ( 20 ) ;
* // set hit stroke width always equals to scene stroke width
* shape . hitStrokeWidth ( 'auto' ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'strokeHitEnabled' , true , getBooleanValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
2020-03-27 03:41:06 +08:00
* * * deprecated , use hitStrokeWidth instead ! * * get / set strokeHitEnabled property . Useful for performance optimization .
2019-01-02 04:59:27 +08:00
* You may set ` shape.strokeHitEnabled(false) ` . In this case stroke will be no draw on hit canvas , so hit area
* of shape will be decreased ( by lineWidth / 2 ) . Remember that non closed line with ` strokeHitEnabled = false `
* will be not drawn on hit canvas , that is mean line will no trigger pointer events ( like mouseover )
2019-03-11 01:35:44 +08:00
* Default value is true .
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # strokeHitEnabled
2019-01-02 04:59:27 +08:00
* @method
* @param { Boolean } strokeHitEnabled
* @returns { Boolean }
* @example
* // get strokeHitEnabled
* var strokeHitEnabled = shape . strokeHitEnabled ( ) ;
*
* // set strokeHitEnabled
* shape . strokeHitEnabled ( ) ;
* /
Factory . addGetterSetter (
Shape ,
'perfectDrawEnabled' ,
true ,
2019-02-25 01:06:04 +08:00
getBooleanValidator ( )
2019-01-02 04:59:27 +08:00
) ;
/ * *
* get / set perfectDrawEnabled . If a shape has fill , stroke and opacity you may set ` perfectDrawEnabled ` to false to improve performance .
2019-02-24 09:54:20 +08:00
* See http : //konvajs.org/docs/performance/Disable_Perfect_Draw.html for more information.
2019-01-02 04:59:27 +08:00
* Default value is true
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # perfectDrawEnabled
2019-01-02 04:59:27 +08:00
* @method
* @param { Boolean } perfectDrawEnabled
* @returns { Boolean }
* @example
* // get perfectDrawEnabled
* var perfectDrawEnabled = shape . perfectDrawEnabled ( ) ;
*
* // set perfectDrawEnabled
* shape . perfectDrawEnabled ( ) ;
* /
Factory . addGetterSetter (
Shape ,
'shadowForStrokeEnabled' ,
true ,
2019-02-25 01:06:04 +08:00
getBooleanValidator ( )
2019-01-02 04:59:27 +08:00
) ;
/ * *
* get / set shadowForStrokeEnabled . Useful for performance optimization .
2019-01-22 06:42:02 +08:00
* You may set ` shape.shadowForStrokeEnabled(false) ` . In this case stroke will no effect shadow .
* Remember if you set ` shadowForStrokeEnabled = false ` for non closed line - that line will have no shadow ! .
2019-01-02 04:59:27 +08:00
* Default value is true
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # shadowForStrokeEnabled
2019-01-02 04:59:27 +08:00
* @method
* @param { Boolean } shadowForStrokeEnabled
* @returns { Boolean }
* @example
* // get shadowForStrokeEnabled
* var shadowForStrokeEnabled = shape . shadowForStrokeEnabled ( ) ;
*
* // set shadowForStrokeEnabled
* shape . shadowForStrokeEnabled ( ) ;
* /
Factory . addGetterSetter ( Shape , 'lineJoin' ) ;
/ * *
* get / set line join . Can be miter , round , or bevel . The
* default is miter
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # lineJoin
2019-01-02 04:59:27 +08:00
* @method
* @param { String } lineJoin
* @returns { String }
* @example
* // get line join
* var lineJoin = shape . lineJoin ( ) ;
*
* // set line join
* shape . lineJoin ( 'round' ) ;
* /
Factory . addGetterSetter ( Shape , 'lineCap' ) ;
/ * *
* get / set line cap . Can be butt , round , or square
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # lineCap
2019-01-02 04:59:27 +08:00
* @method
* @param { String } lineCap
* @returns { String }
* @example
* // get line cap
* var lineCap = shape . lineCap ( ) ;
*
* // set line cap
* shape . lineCap ( 'round' ) ;
* /
Factory . addGetterSetter ( Shape , 'sceneFunc' ) ;
/ * *
2019-02-19 01:12:03 +08:00
* get / set scene draw function . That function is used to draw the shape on a canvas .
* Also that function will be used to draw hit area of the shape , in case if hitFunc is not defined .
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # sceneFunc
2019-01-02 04:59:27 +08:00
* @method
* @param { Function } drawFunc drawing function
* @returns { Function }
* @example
* // get scene draw function
* var sceneFunc = shape . sceneFunc ( ) ;
*
* // set scene draw function
2019-01-06 16:01:20 +08:00
* shape . sceneFunc ( function ( context , shape ) {
2019-01-02 04:59:27 +08:00
* context . beginPath ( ) ;
2019-01-06 16:01:20 +08:00
* context . rect ( 0 , 0 , shape . width ( ) , shape . height ( ) ) ;
2019-01-02 04:59:27 +08:00
* context . closePath ( ) ;
2019-01-06 16:01:20 +08:00
* // important Konva method that fill and stroke shape from its properties
2019-02-19 01:12:03 +08:00
* // like stroke and fill
2019-01-06 16:01:20 +08:00
* context . fillStrokeShape ( shape ) ;
2019-01-02 04:59:27 +08:00
* } ) ;
* /
Factory . addGetterSetter ( Shape , 'hitFunc' ) ;
/ * *
2019-02-19 01:12:03 +08:00
* get / set hit draw function . That function is used to draw custom hit area of a shape .
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # hitFunc
2019-01-02 04:59:27 +08:00
* @method
* @param { Function } drawFunc drawing function
* @returns { Function }
* @example
* // get hit draw function
* var hitFunc = shape . hitFunc ( ) ;
*
* // set hit draw function
* shape . hitFunc ( function ( context ) {
* context . beginPath ( ) ;
2019-01-06 16:01:20 +08:00
* context . rect ( 0 , 0 , shape . width ( ) , shape . height ( ) ) ;
2019-01-02 04:59:27 +08:00
* context . closePath ( ) ;
2019-01-06 16:01:20 +08:00
* // important Konva method that fill and stroke shape from its properties
* context . fillStrokeShape ( shape ) ;
2019-01-02 04:59:27 +08:00
* } ) ;
* /
Factory . addGetterSetter ( Shape , 'dash' ) ;
/ * *
* get / set dash array for stroke .
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # dash
2019-01-02 04:59:27 +08:00
* @method
* @param { Array } dash
* @returns { Array }
* @example
* // apply dashed stroke that is 10px long and 5 pixels apart
* line . dash ( [ 10 , 5 ] ) ;
* // apply dashed stroke that is made up of alternating dashed
* // lines that are 10px long and 20px apart, and dots that have
* // a radius of 5px and are 20px apart
* line . dash ( [ 10 , 20 , 0.001 , 20 ] ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'dashOffset' , 0 , getNumberValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set dash offset for stroke .
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # dash
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } dash offset
* @returns { Number }
* @example
* // apply dashed stroke that is 10px long and 5 pixels apart with an offset of 5px
* line . dash ( [ 10 , 5 ] ) ;
* line . dashOffset ( 5 ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'shadowColor' , undefined , getStringValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set shadow color
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # shadowColor
2019-01-02 04:59:27 +08:00
* @method
* @param { String } color
* @returns { String }
* @example
* // get shadow color
* var shadow = shape . shadowColor ( ) ;
*
* // set shadow color with color string
* shape . shadowColor ( 'green' ) ;
*
* // set shadow color with hex
* shape . shadowColor ( '#00ff00' ) ;
*
* // set shadow color with rgb
* shape . shadowColor ( 'rgb(0,255,0)' ) ;
*
* // set shadow color with rgba and make it 50% opaque
* shape . shadowColor ( 'rgba(0,255,0,0.5' ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'shadowBlur' , 0 , getNumberValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set shadow blur
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # shadowBlur
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } blur
* @returns { Number }
* @example
* // get shadow blur
* var shadowBlur = shape . shadowBlur ( ) ;
*
* // set shadow blur
* shape . shadowBlur ( 10 ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'shadowOpacity' , 1 , getNumberValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set shadow opacity . must be a value between 0 and 1
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # shadowOpacity
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } opacity
* @returns { Number }
* @example
* // get shadow opacity
* var shadowOpacity = shape . shadowOpacity ( ) ;
*
* // set shadow opacity
* shape . shadowOpacity ( 0.5 ) ;
* /
Factory . addComponentsGetterSetter ( Shape , 'shadowOffset' , [ 'x' , 'y' ] ) ;
/ * *
* get / set shadow offset
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # shadowOffset
2019-01-02 04:59:27 +08:00
* @method
* @param { Object } offset
* @param { Number } offset . x
* @param { Number } offset . y
* @returns { Object }
* @example
* // get shadow offset
* var shadowOffset = shape . shadowOffset ( ) ;
*
* // set shadow offset
* shape . shadowOffset ( {
2019-03-26 01:00:51 +08:00
* x : 20 ,
2019-01-02 04:59:27 +08:00
* y : 10
* } ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'shadowOffsetX' , 0 , getNumberValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set shadow offset x
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # shadowOffsetX
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } x
* @returns { Number }
* @example
* // get shadow offset x
* var shadowOffsetX = shape . shadowOffsetX ( ) ;
*
* // set shadow offset x
* shape . shadowOffsetX ( 5 ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'shadowOffsetY' , 0 , getNumberValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set shadow offset y
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # shadowOffsetY
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } y
* @returns { Number }
* @example
* // get shadow offset y
* var shadowOffsetY = shape . shadowOffsetY ( ) ;
*
* // set shadow offset y
* shape . shadowOffsetY ( 5 ) ;
* /
Factory . addGetterSetter ( Shape , 'fillPatternImage' ) ;
/ * *
* get / set fill pattern image
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillPatternImage
2019-01-02 04:59:27 +08:00
* @method
* @param { Image } image object
* @returns { Image }
* @example
* // get fill pattern image
* var fillPatternImage = shape . fillPatternImage ( ) ;
*
* // set fill pattern image
* var imageObj = new Image ( ) ;
* imageObj . onload = function ( ) {
* shape . fillPatternImage ( imageObj ) ;
* } ;
* imageObj . src = 'path/to/image/jpg' ;
* /
2020-08-26 22:54:03 +08:00
Factory . addGetterSetter (
Shape ,
'fill' ,
undefined ,
getStringOrGradientValidator ( )
) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set fill color
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fill
2019-01-02 04:59:27 +08:00
* @method
* @param { String } color
* @returns { String }
* @example
* // get fill color
* var fill = shape . fill ( ) ;
*
* // set fill color with color string
* shape . fill ( 'green' ) ;
*
* // set fill color with hex
* shape . fill ( '#00ff00' ) ;
*
* // set fill color with rgb
* shape . fill ( 'rgb(0,255,0)' ) ;
*
* // set fill color with rgba and make it 50% opaque
* shape . fill ( 'rgba(0,255,0,0.5' ) ;
*
* // shape without fill
* shape . fill ( null ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'fillPatternX' , 0 , getNumberValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set fill pattern x
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillPatternX
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } x
* @returns { Number }
* @example
* // get fill pattern x
* var fillPatternX = shape . fillPatternX ( ) ;
* // set fill pattern x
* shape . fillPatternX ( 20 ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'fillPatternY' , 0 , getNumberValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set fill pattern y
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillPatternY
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } y
* @returns { Number }
* @example
* // get fill pattern y
* var fillPatternY = shape . fillPatternY ( ) ;
* // set fill pattern y
* shape . fillPatternY ( 20 ) ;
* /
Factory . addGetterSetter ( Shape , 'fillLinearGradientColorStops' ) ;
/ * *
* get / set fill linear gradient color stops
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillLinearGradientColorStops
2019-01-02 04:59:27 +08:00
* @method
* @param { Array } colorStops
* @returns { Array } colorStops
* @example
* // get fill linear gradient color stops
* var colorStops = shape . fillLinearGradientColorStops ( ) ;
*
* // create a linear gradient that starts with red, changes to blue
* // halfway through, and then changes to green
* shape . fillLinearGradientColorStops ( 0 , 'red' , 0.5 , 'blue' , 1 , 'green' ) ;
* /
Factory . addGetterSetter ( Shape , 'strokeLinearGradientColorStops' ) ;
/ * *
* get / set stroke linear gradient color stops
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # strokeLinearGradientColorStops
2019-01-02 04:59:27 +08:00
* @method
* @param { Array } colorStops
* @returns { Array } colorStops
* @example
* // get stroke linear gradient color stops
* var colorStops = shape . strokeLinearGradientColorStops ( ) ;
*
* // create a linear gradient that starts with red, changes to blue
* // halfway through, and then changes to green
* shape . strokeLinearGradientColorStops ( [ 0 , 'red' , 0.5 , 'blue' , 1 , 'green' ] ) ;
* /
Factory . addGetterSetter ( Shape , 'fillRadialGradientStartRadius' , 0 ) ;
/ * *
* get / set fill radial gradient start radius
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillRadialGradientStartRadius
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } radius
* @returns { Number }
* @example
* // get radial gradient start radius
* var startRadius = shape . fillRadialGradientStartRadius ( ) ;
*
* // set radial gradient start radius
* shape . fillRadialGradientStartRadius ( 0 ) ;
* /
Factory . addGetterSetter ( Shape , 'fillRadialGradientEndRadius' , 0 ) ;
/ * *
* get / set fill radial gradient end radius
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillRadialGradientEndRadius
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } radius
* @returns { Number }
* @example
* // get radial gradient end radius
* var endRadius = shape . fillRadialGradientEndRadius ( ) ;
*
* // set radial gradient end radius
* shape . fillRadialGradientEndRadius ( 100 ) ;
* /
Factory . addGetterSetter ( Shape , 'fillRadialGradientColorStops' ) ;
/ * *
* get / set fill radial gradient color stops
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillRadialGradientColorStops
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } colorStops
* @returns { Array }
* @example
* // get fill radial gradient color stops
* var colorStops = shape . fillRadialGradientColorStops ( ) ;
*
* // create a radial gradient that starts with red, changes to blue
* // halfway through, and then changes to green
* shape . fillRadialGradientColorStops ( 0 , 'red' , 0.5 , 'blue' , 1 , 'green' ) ;
* /
Factory . addGetterSetter ( Shape , 'fillPatternRepeat' , 'repeat' ) ;
/ * *
* get / set fill pattern repeat . Can be 'repeat' , 'repeat-x' , 'repeat-y' , or 'no-repeat' . The default is 'repeat'
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillPatternRepeat
2019-01-02 04:59:27 +08:00
* @method
* @param { String } repeat
* @returns { String }
* @example
* // get fill pattern repeat
* var repeat = shape . fillPatternRepeat ( ) ;
*
* // repeat pattern in x direction only
* shape . fillPatternRepeat ( 'repeat-x' ) ;
*
* // do not repeat the pattern
2019-07-11 05:59:39 +08:00
* shape . fillPatternRepeat ( 'no-repeat' ) ;
2019-01-02 04:59:27 +08:00
* /
Factory . addGetterSetter ( Shape , 'fillEnabled' , true ) ;
/ * *
* get / set fill enabled flag
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillEnabled
2019-01-02 04:59:27 +08:00
* @method
* @param { Boolean } enabled
* @returns { Boolean }
* @example
* // get fill enabled flag
* var fillEnabled = shape . fillEnabled ( ) ;
*
* // disable fill
* shape . fillEnabled ( false ) ;
*
* // enable fill
* shape . fillEnabled ( true ) ;
* /
Factory . addGetterSetter ( Shape , 'strokeEnabled' , true ) ;
/ * *
* get / set stroke enabled flag
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # strokeEnabled
2019-01-02 04:59:27 +08:00
* @method
* @param { Boolean } enabled
* @returns { Boolean }
* @example
* // get stroke enabled flag
* var strokeEnabled = shape . strokeEnabled ( ) ;
*
* // disable stroke
* shape . strokeEnabled ( false ) ;
*
* // enable stroke
* shape . strokeEnabled ( true ) ;
* /
Factory . addGetterSetter ( Shape , 'shadowEnabled' , true ) ;
/ * *
* get / set shadow enabled flag
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # shadowEnabled
2019-01-02 04:59:27 +08:00
* @method
* @param { Boolean } enabled
* @returns { Boolean }
* @example
* // get shadow enabled flag
* var shadowEnabled = shape . shadowEnabled ( ) ;
*
* // disable shadow
* shape . shadowEnabled ( false ) ;
*
* // enable shadow
* shape . shadowEnabled ( true ) ;
* /
Factory . addGetterSetter ( Shape , 'dashEnabled' , true ) ;
/ * *
* get / set dash enabled flag
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # dashEnabled
2019-01-02 04:59:27 +08:00
* @method
* @param { Boolean } enabled
* @returns { Boolean }
* @example
* // get dash enabled flag
* var dashEnabled = shape . dashEnabled ( ) ;
*
* // disable dash
* shape . dashEnabled ( false ) ;
*
* // enable dash
* shape . dashEnabled ( true ) ;
* /
Factory . addGetterSetter ( Shape , 'strokeScaleEnabled' , true ) ;
/ * *
* get / set strokeScale enabled flag
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # strokeScaleEnabled
2019-01-02 04:59:27 +08:00
* @method
* @param { Boolean } enabled
* @returns { Boolean }
* @example
* // get stroke scale enabled flag
* var strokeScaleEnabled = shape . strokeScaleEnabled ( ) ;
*
* // disable stroke scale
* shape . strokeScaleEnabled ( false ) ;
*
* // enable stroke scale
* shape . strokeScaleEnabled ( true ) ;
* /
Factory . addGetterSetter ( Shape , 'fillPriority' , 'color' ) ;
/ * *
* get / set fill priority . can be color , pattern , linear - gradient , or radial - gradient . The default is color .
* This is handy if you want to toggle between different fill types .
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillPriority
2019-01-02 04:59:27 +08:00
* @method
* @param { String } priority
* @returns { String }
* @example
* // get fill priority
* var fillPriority = shape . fillPriority ( ) ;
*
* // set fill priority
* shape . fillPriority ( 'linear-gradient' ) ;
* /
Factory . addComponentsGetterSetter ( Shape , 'fillPatternOffset' , [ 'x' , 'y' ] ) ;
/ * *
* get / set fill pattern offset
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillPatternOffset
2019-01-02 04:59:27 +08:00
* @method
* @param { Object } offset
* @param { Number } offset . x
* @param { Number } offset . y
* @returns { Object }
* @example
* // get fill pattern offset
* var patternOffset = shape . fillPatternOffset ( ) ;
*
* // set fill pattern offset
* shape . fillPatternOffset ( {
2019-03-26 01:00:51 +08:00
* x : 20 ,
2019-01-02 04:59:27 +08:00
* y : 10
* } ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'fillPatternOffsetX' , 0 , getNumberValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set fill pattern offset x
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillPatternOffsetX
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } x
* @returns { Number }
* @example
* // get fill pattern offset x
* var patternOffsetX = shape . fillPatternOffsetX ( ) ;
*
* // set fill pattern offset x
* shape . fillPatternOffsetX ( 20 ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'fillPatternOffsetY' , 0 , getNumberValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set fill pattern offset y
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillPatternOffsetY
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } y
* @returns { Number }
* @example
* // get fill pattern offset y
* var patternOffsetY = shape . fillPatternOffsetY ( ) ;
*
* // set fill pattern offset y
* shape . fillPatternOffsetY ( 10 ) ;
* /
Factory . addComponentsGetterSetter ( Shape , 'fillPatternScale' , [ 'x' , 'y' ] ) ;
/ * *
* get / set fill pattern scale
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillPatternScale
2019-01-02 04:59:27 +08:00
* @method
* @param { Object } scale
* @param { Number } scale . x
* @param { Number } scale . y
* @returns { Object }
* @example
* // get fill pattern scale
* var patternScale = shape . fillPatternScale ( ) ;
*
* // set fill pattern scale
* shape . fillPatternScale ( {
2019-03-26 01:00:51 +08:00
* x : 2 ,
2019-01-02 04:59:27 +08:00
* y : 2
* } ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'fillPatternScaleX' , 1 , getNumberValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set fill pattern scale x
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillPatternScaleX
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } x
* @returns { Number }
* @example
* // get fill pattern scale x
* var patternScaleX = shape . fillPatternScaleX ( ) ;
*
* // set fill pattern scale x
* shape . fillPatternScaleX ( 2 ) ;
* /
2019-02-25 01:06:04 +08:00
Factory . addGetterSetter ( Shape , 'fillPatternScaleY' , 1 , getNumberValidator ( ) ) ;
2019-01-02 04:59:27 +08:00
/ * *
* get / set fill pattern scale y
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillPatternScaleY
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } y
* @returns { Number }
* @example
* // get fill pattern scale y
* var patternScaleY = shape . fillPatternScaleY ( ) ;
*
* // set fill pattern scale y
* shape . fillPatternScaleY ( 2 ) ;
* /
Factory . addComponentsGetterSetter ( Shape , 'fillLinearGradientStartPoint' , [
'x' ,
2020-05-15 00:13:47 +08:00
'y' ,
2019-01-02 04:59:27 +08:00
] ) ;
/ * *
* get / set fill linear gradient start point
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillLinearGradientStartPoint
2019-01-02 04:59:27 +08:00
* @method
* @param { Object } startPoint
* @param { Number } startPoint . x
* @param { Number } startPoint . y
* @returns { Object }
* @example
* // get fill linear gradient start point
* var startPoint = shape . fillLinearGradientStartPoint ( ) ;
*
* // set fill linear gradient start point
* shape . fillLinearGradientStartPoint ( {
2019-03-26 01:00:51 +08:00
* x : 20 ,
2019-01-02 04:59:27 +08:00
* y : 10
* } ) ;
* /
Factory . addComponentsGetterSetter ( Shape , 'strokeLinearGradientStartPoint' , [
'x' ,
2020-05-15 00:13:47 +08:00
'y' ,
2019-01-02 04:59:27 +08:00
] ) ;
/ * *
* get / set stroke linear gradient start point
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # strokeLinearGradientStartPoint
2019-01-02 04:59:27 +08:00
* @method
* @param { Object } startPoint
* @param { Number } startPoint . x
* @param { Number } startPoint . y
* @returns { Object }
* @example
* // get stroke linear gradient start point
* var startPoint = shape . strokeLinearGradientStartPoint ( ) ;
*
* // set stroke linear gradient start point
* shape . strokeLinearGradientStartPoint ( {
2019-03-26 01:00:51 +08:00
* x : 20 ,
2019-01-02 04:59:27 +08:00
* y : 10
* } ) ;
* /
Factory . addGetterSetter ( Shape , 'fillLinearGradientStartPointX' , 0 ) ;
/ * *
* get / set fill linear gradient start point x
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillLinearGradientStartPointX
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } x
* @returns { Number }
* @example
* // get fill linear gradient start point x
* var startPointX = shape . fillLinearGradientStartPointX ( ) ;
*
* // set fill linear gradient start point x
* shape . fillLinearGradientStartPointX ( 20 ) ;
* /
Factory . addGetterSetter ( Shape , 'strokeLinearGradientStartPointX' , 0 ) ;
/ * *
* get / set stroke linear gradient start point x
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # linearLinearGradientStartPointX
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } x
* @returns { Number }
* @example
* // get stroke linear gradient start point x
* var startPointX = shape . strokeLinearGradientStartPointX ( ) ;
*
* // set stroke linear gradient start point x
* shape . strokeLinearGradientStartPointX ( 20 ) ;
* /
Factory . addGetterSetter ( Shape , 'fillLinearGradientStartPointY' , 0 ) ;
/ * *
* get / set fill linear gradient start point y
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillLinearGradientStartPointY
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } y
* @returns { Number }
* @example
* // get fill linear gradient start point y
* var startPointY = shape . fillLinearGradientStartPointY ( ) ;
*
* // set fill linear gradient start point y
* shape . fillLinearGradientStartPointY ( 20 ) ;
* /
Factory . addGetterSetter ( Shape , 'strokeLinearGradientStartPointY' , 0 ) ;
/ * *
* get / set stroke linear gradient start point y
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # strokeLinearGradientStartPointY
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } y
* @returns { Number }
* @example
* // get stroke linear gradient start point y
* var startPointY = shape . strokeLinearGradientStartPointY ( ) ;
*
* // set stroke linear gradient start point y
* shape . strokeLinearGradientStartPointY ( 20 ) ;
* /
Factory . addComponentsGetterSetter ( Shape , 'fillLinearGradientEndPoint' , [
'x' ,
2020-05-15 00:13:47 +08:00
'y' ,
2019-01-02 04:59:27 +08:00
] ) ;
/ * *
* get / set fill linear gradient end point
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillLinearGradientEndPoint
2019-01-02 04:59:27 +08:00
* @method
* @param { Object } endPoint
* @param { Number } endPoint . x
* @param { Number } endPoint . y
* @returns { Object }
* @example
* // get fill linear gradient end point
* var endPoint = shape . fillLinearGradientEndPoint ( ) ;
*
* // set fill linear gradient end point
* shape . fillLinearGradientEndPoint ( {
2019-03-26 01:00:51 +08:00
* x : 20 ,
2019-01-02 04:59:27 +08:00
* y : 10
* } ) ;
* /
Factory . addComponentsGetterSetter ( Shape , 'strokeLinearGradientEndPoint' , [
'x' ,
2020-05-15 00:13:47 +08:00
'y' ,
2019-01-02 04:59:27 +08:00
] ) ;
/ * *
* get / set stroke linear gradient end point
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # strokeLinearGradientEndPoint
2019-01-02 04:59:27 +08:00
* @method
* @param { Object } endPoint
* @param { Number } endPoint . x
* @param { Number } endPoint . y
* @returns { Object }
* @example
* // get stroke linear gradient end point
* var endPoint = shape . strokeLinearGradientEndPoint ( ) ;
*
* // set stroke linear gradient end point
* shape . strokeLinearGradientEndPoint ( {
2019-03-26 01:00:51 +08:00
* x : 20 ,
2019-01-02 04:59:27 +08:00
* y : 10
* } ) ;
* /
Factory . addGetterSetter ( Shape , 'fillLinearGradientEndPointX' , 0 ) ;
/ * *
* get / set fill linear gradient end point x
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillLinearGradientEndPointX
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } x
* @returns { Number }
* @example
* // get fill linear gradient end point x
* var endPointX = shape . fillLinearGradientEndPointX ( ) ;
*
* // set fill linear gradient end point x
* shape . fillLinearGradientEndPointX ( 20 ) ;
* /
Factory . addGetterSetter ( Shape , 'strokeLinearGradientEndPointX' , 0 ) ;
/ * *
* get / set fill linear gradient end point x
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # strokeLinearGradientEndPointX
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } x
* @returns { Number }
* @example
* // get stroke linear gradient end point x
* var endPointX = shape . strokeLinearGradientEndPointX ( ) ;
*
* // set stroke linear gradient end point x
* shape . strokeLinearGradientEndPointX ( 20 ) ;
* /
Factory . addGetterSetter ( Shape , 'fillLinearGradientEndPointY' , 0 ) ;
/ * *
* get / set fill linear gradient end point y
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillLinearGradientEndPointY
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } y
* @returns { Number }
* @example
* // get fill linear gradient end point y
* var endPointY = shape . fillLinearGradientEndPointY ( ) ;
*
* // set fill linear gradient end point y
* shape . fillLinearGradientEndPointY ( 20 ) ;
* /
Factory . addGetterSetter ( Shape , 'strokeLinearGradientEndPointY' , 0 ) ;
/ * *
* get / set stroke linear gradient end point y
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # strokeLinearGradientEndPointY
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } y
* @returns { Number }
* @example
* // get stroke linear gradient end point y
* var endPointY = shape . strokeLinearGradientEndPointY ( ) ;
*
* // set stroke linear gradient end point y
* shape . strokeLinearGradientEndPointY ( 20 ) ;
* /
Factory . addComponentsGetterSetter ( Shape , 'fillRadialGradientStartPoint' , [
'x' ,
2020-05-15 00:13:47 +08:00
'y' ,
2019-01-02 04:59:27 +08:00
] ) ;
/ * *
* get / set fill radial gradient start point
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillRadialGradientStartPoint
2019-01-02 04:59:27 +08:00
* @method
* @param { Object } startPoint
* @param { Number } startPoint . x
* @param { Number } startPoint . y
* @returns { Object }
* @example
* // get fill radial gradient start point
* var startPoint = shape . fillRadialGradientStartPoint ( ) ;
*
* // set fill radial gradient start point
* shape . fillRadialGradientStartPoint ( {
2019-03-26 01:00:51 +08:00
* x : 20 ,
2019-01-02 04:59:27 +08:00
* y : 10
* } ) ;
* /
Factory . addGetterSetter ( Shape , 'fillRadialGradientStartPointX' , 0 ) ;
/ * *
* get / set fill radial gradient start point x
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillRadialGradientStartPointX
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } x
* @returns { Number }
* @example
* // get fill radial gradient start point x
* var startPointX = shape . fillRadialGradientStartPointX ( ) ;
*
* // set fill radial gradient start point x
* shape . fillRadialGradientStartPointX ( 20 ) ;
* /
Factory . addGetterSetter ( Shape , 'fillRadialGradientStartPointY' , 0 ) ;
/ * *
* get / set fill radial gradient start point y
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillRadialGradientStartPointY
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } y
* @returns { Number }
* @example
* // get fill radial gradient start point y
* var startPointY = shape . fillRadialGradientStartPointY ( ) ;
*
* // set fill radial gradient start point y
* shape . fillRadialGradientStartPointY ( 20 ) ;
* /
Factory . addComponentsGetterSetter ( Shape , 'fillRadialGradientEndPoint' , [
'x' ,
2020-05-15 00:13:47 +08:00
'y' ,
2019-01-02 04:59:27 +08:00
] ) ;
/ * *
* get / set fill radial gradient end point
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillRadialGradientEndPoint
2019-01-02 04:59:27 +08:00
* @method
* @param { Object } endPoint
* @param { Number } endPoint . x
* @param { Number } endPoint . y
* @returns { Object }
* @example
* // get fill radial gradient end point
* var endPoint = shape . fillRadialGradientEndPoint ( ) ;
*
* // set fill radial gradient end point
* shape . fillRadialGradientEndPoint ( {
2019-03-26 01:00:51 +08:00
* x : 20 ,
2019-01-02 04:59:27 +08:00
* y : 10
* } ) ;
* /
Factory . addGetterSetter ( Shape , 'fillRadialGradientEndPointX' , 0 ) ;
/ * *
* get / set fill radial gradient end point x
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillRadialGradientEndPointX
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } x
* @returns { Number }
* @example
* // get fill radial gradient end point x
* var endPointX = shape . fillRadialGradientEndPointX ( ) ;
*
* // set fill radial gradient end point x
* shape . fillRadialGradientEndPointX ( 20 ) ;
* /
Factory . addGetterSetter ( Shape , 'fillRadialGradientEndPointY' , 0 ) ;
/ * *
* get / set fill radial gradient end point y
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillRadialGradientEndPointY
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } y
* @returns { Number }
* @example
* // get fill radial gradient end point y
* var endPointY = shape . fillRadialGradientEndPointY ( ) ;
*
* // set fill radial gradient end point y
* shape . fillRadialGradientEndPointY ( 20 ) ;
* /
Factory . addGetterSetter ( Shape , 'fillPatternRotation' , 0 ) ;
/ * *
* get / set fill pattern rotation in degrees
2019-01-06 16:01:20 +08:00
* @name Konva . Shape # fillPatternRotation
2019-01-02 04:59:27 +08:00
* @method
* @param { Number } rotation
* @returns { Konva . Shape }
* @example
* // get fill pattern rotation
* var patternRotation = shape . fillPatternRotation ( ) ;
*
* // set fill pattern rotation
* shape . fillPatternRotation ( 20 ) ;
* /
Factory . backCompat ( Shape , {
dashArray : 'dash' ,
getDashArray : 'getDash' ,
setDashArray : 'getDash' ,
drawFunc : 'sceneFunc' ,
getDrawFunc : 'getSceneFunc' ,
setDrawFunc : 'setSceneFunc' ,
drawHitFunc : 'hitFunc' ,
getDrawHitFunc : 'getHitFunc' ,
2020-05-15 00:13:47 +08:00
setDrawHitFunc : 'setHitFunc' ,
2019-01-02 04:59:27 +08:00
} ) ;