zrender
Version:
A lightweight graphic library providing 2d draw for Apache ECharts
123 lines (96 loc) • 3.22 kB
text/typescript
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;