| /* | 
 | * 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<LabelOption, 'fontStyle' | 'fontWeight' | 'fontSize' | 'fontFamily'>; | 
 | type LabelRectRelatedOption = Pick<LabelOption, | 
 |     'align' | 'verticalAlign' | 'padding' | 'lineHeight' | 'baseline' | 'rich' | 
 |     | 'width' | 'height' | 'overflow' | 
 | > & 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<LabelFontOption>) { | 
 |         return getFont({ | 
 |             fontStyle: this.getShallow('fontStyle'), | 
 |             fontWeight: this.getShallow('fontWeight'), | 
 |             fontSize: this.getShallow('fontSize'), | 
 |             fontFamily: this.getShallow('fontFamily') | 
 |         }, this.ecModel); | 
 |     } | 
 |  | 
 |     getTextRect(this: Model<LabelRectRelatedOption> & 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; |