/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import * as graphicUtil from '../../util/graphic'; import {getFont} from '../../label/labelStyle'; import Model from '../Model'; import { LabelOption, ColorString } from '../../util/types'; import ZRText, {TextStyleProps} from 'zrender/src/graphic/Text'; const PATH_COLOR = ['textStyle', 'color'] as const; export type LabelFontOption = Pick; type LabelRectRelatedOption = Pick & LabelFontOption; const textStyleParams = [ 'fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'padding', 'lineHeight', 'rich', 'width', 'height', 'overflow' ] as const; // TODO Performance improvement? const tmpText = new ZRText(); class TextStyleMixin { /** * Get color property or get color from option.textStyle.color */ // TODO Callback getTextColor(this: Model, isEmphasis?: boolean): ColorString { const ecModel = this.ecModel; return this.getShallow('color') || ( (!isEmphasis && ecModel) ? ecModel.get(PATH_COLOR) : null ); } /** * Create font string from fontStyle, fontWeight, fontSize, fontFamily * @return {string} */ getFont(this: Model) { return getFont({ fontStyle: this.getShallow('fontStyle'), fontWeight: this.getShallow('fontWeight'), fontSize: this.getShallow('fontSize'), fontFamily: this.getShallow('fontFamily') }, this.ecModel); } getTextRect(this: Model & TextStyleMixin, text: string): graphicUtil.BoundingRect { const style: TextStyleProps = { text: text, verticalAlign: this.getShallow('verticalAlign') || this.getShallow('baseline') }; for (let i = 0; i < textStyleParams.length; i++) { (style as any)[textStyleParams[i]] = this.getShallow(textStyleParams[i]); } tmpText.useStyle(style); tmpText.update(); return tmpText.getBoundingRect(); } }; export default TextStyleMixin;