UNPKG

zrender

Version:

A lightweight graphic library providing 2d draw for Apache ECharts

123 lines (96 loc) 3.22 kB
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;