| import Displayable, { DisplayableProps, DisplayableStatePropNames } from './Displayable'; | 
| import { getBoundingRect } from '../contain/text'; | 
| import BoundingRect from '../core/BoundingRect'; | 
| import { PathStyleProps, DEFAULT_PATH_STYLE } from './Path'; | 
| import { createObject, defaults } from '../core/util'; | 
| import { FontStyle, FontWeight, TextAlign, TextVerticalAlign } from '../core/types'; | 
| import { DEFAULT_FONT } from '../core/platform'; | 
|   | 
| export interface TSpanStyleProps extends PathStyleProps { | 
|   | 
|     x?: number | 
|     y?: number | 
|   | 
|     // TODO Text is assigned inside zrender | 
|     text?: string | 
|   | 
|     // Final generated font string | 
|     // Used in canvas, and when developers specified it. | 
|     font?: string | 
|   | 
|     // Value for each part of font | 
|     // Used in svg. | 
|     // NOTE: font should always been sync with these 4 properties. | 
|     fontSize?: number | 
|     fontWeight?: FontWeight | 
|     fontStyle?: FontStyle | 
|     fontFamily?: string | 
|   | 
|     textAlign?: CanvasTextAlign | 
|   | 
|     textBaseline?: CanvasTextBaseline | 
| } | 
|   | 
| export const DEFAULT_TSPAN_STYLE: TSpanStyleProps = defaults({ | 
|     strokeFirst: true, | 
|     font: DEFAULT_FONT, | 
|     x: 0, | 
|     y: 0, | 
|     textAlign: 'left', | 
|     textBaseline: 'top', | 
|     miterLimit: 2 | 
| } as TSpanStyleProps, DEFAULT_PATH_STYLE); | 
|   | 
|   | 
| export interface TSpanProps extends DisplayableProps { | 
|     style?: TSpanStyleProps | 
| } | 
|   | 
| export type TSpanState = Pick<TSpanProps, DisplayableStatePropNames> | 
|   | 
| class TSpan extends Displayable<TSpanProps> { | 
|   | 
|     style: TSpanStyleProps | 
|   | 
|     hasStroke() { | 
|         const style = this.style; | 
|         const stroke = style.stroke; | 
|         return stroke != null && stroke !== 'none' && style.lineWidth > 0; | 
|     } | 
|   | 
|     hasFill() { | 
|         const style = this.style; | 
|         const fill = style.fill; | 
|         return fill != null && fill !== 'none'; | 
|     } | 
|   | 
|     /** | 
|      * Create an image style object with default values in it's prototype. | 
|      * @override | 
|      */ | 
|     createStyle(obj?: TSpanStyleProps) { | 
|         return createObject(DEFAULT_TSPAN_STYLE, obj); | 
|     } | 
|   | 
|     /** | 
|      * Set bounding rect calculated from Text | 
|      * For reducing time of calculating bounding rect. | 
|      */ | 
|     setBoundingRect(rect: BoundingRect) { | 
|         this._rect = rect; | 
|     } | 
|   | 
|     getBoundingRect(): BoundingRect { | 
|         const style = this.style; | 
|   | 
|         if (!this._rect) { | 
|             let text = style.text; | 
|             text != null ? (text += '') : (text = ''); | 
|   | 
|             const rect = getBoundingRect( | 
|                 text, | 
|                 style.font, | 
|                 style.textAlign as TextAlign, | 
|                 style.textBaseline as TextVerticalAlign | 
|             ); | 
|   | 
|             rect.x += style.x || 0; | 
|             rect.y += style.y || 0; | 
|   | 
|             if (this.hasStroke()) { | 
|                 const w = style.lineWidth; | 
|                 rect.x -= w / 2; | 
|                 rect.y -= w / 2; | 
|                 rect.width += w; | 
|                 rect.height += w; | 
|             } | 
|   | 
|             this._rect = rect; | 
|         } | 
|   | 
|         return this._rect; | 
|     } | 
|   | 
|     protected static initDefaultProps = (function () { | 
|         const tspanProto = TSpan.prototype; | 
|         // TODO Calculate tolerance smarter | 
|         tspanProto.dirtyRectTolerance = 10; | 
|     })() | 
| } | 
|   | 
| TSpan.prototype.type = 'tspan'; | 
|   | 
| export default TSpan; |