| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- 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;
|