1cb93a386Sopenharmony_ci// Copyright (c) 2023 Huawei Device Co., Ltd. All rights reserved 2cb93a386Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be 3cb93a386Sopenharmony_ci// found in the LICENSE file. 4cb93a386Sopenharmony_ci 5cb93a386Sopenharmony_ci#ifndef FONTINFO_OHOS_H 6cb93a386Sopenharmony_ci#define FONTINFO_OHOS_H 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "securec.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "SkFixed.h" 11cb93a386Sopenharmony_ci#include "SkFontDescriptor.h" 12cb93a386Sopenharmony_ci#include "SkFontHost_FreeType_common.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ci/*! 15cb93a386Sopenharmony_ci * \brief To manage the font information 16cb93a386Sopenharmony_ci */ 17cb93a386Sopenharmony_cistruct FontInfo { 18cb93a386Sopenharmony_cipublic: 19cb93a386Sopenharmony_ci /*! Constructor 20cb93a386Sopenharmony_ci * 21cb93a386Sopenharmony_ci */ 22cb93a386Sopenharmony_ci FontInfo() : familyName(""), fname(""), index(0), 23cb93a386Sopenharmony_ci style(SkFontStyle::Normal()), isFixedWidth(false), stream(nullptr) 24cb93a386Sopenharmony_ci { 25cb93a386Sopenharmony_ci memset_s(&axisSet, sizeof(AxisSet), 0, sizeof(AxisSet)); 26cb93a386Sopenharmony_ci } 27cb93a386Sopenharmony_ci /*! Copy Constructor 28cb93a386Sopenharmony_ci * \param font an object of FontInfo 29cb93a386Sopenharmony_ci */ 30cb93a386Sopenharmony_ci explicit FontInfo(const FontInfo& font) 31cb93a386Sopenharmony_ci : familyName(font.familyName), fname(font.fname), index(font.index), 32cb93a386Sopenharmony_ci style(font.style), isFixedWidth(font.isFixedWidth), stream(nullptr) 33cb93a386Sopenharmony_ci { 34cb93a386Sopenharmony_ci axisSet.axis = font.axisSet.axis; 35cb93a386Sopenharmony_ci axisSet.range = font.axisSet.range; 36cb93a386Sopenharmony_ci if (font.stream) { 37cb93a386Sopenharmony_ci stream = font.stream->duplicate(); 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci } 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci /*! Move Constructor 42cb93a386Sopenharmony_ci * \param font an object of FontInfo 43cb93a386Sopenharmony_ci */ 44cb93a386Sopenharmony_ci explicit FontInfo(FontInfo&& font) 45cb93a386Sopenharmony_ci : familyName(std::move(font.familyName)), fname(std::move(font.fname)), index(font.index), 46cb93a386Sopenharmony_ci style(font.style), isFixedWidth(font.isFixedWidth), stream(nullptr) 47cb93a386Sopenharmony_ci { 48cb93a386Sopenharmony_ci axisSet.axis = std::move(font.axisSet.axis); 49cb93a386Sopenharmony_ci axisSet.range = std::move(font.axisSet.range); 50cb93a386Sopenharmony_ci if (font.stream) { 51cb93a386Sopenharmony_ci stream = std::move(font.stream); 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci } 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci /*! Constructor 56cb93a386Sopenharmony_ci * \param fname the fullname of font file 57cb93a386Sopenharmony_ci * \param index the index of the typeface in the font file 58cb93a386Sopenharmony_ci */ 59cb93a386Sopenharmony_ci FontInfo(const char* fname, int index) 60cb93a386Sopenharmony_ci : familyName(""), fname(""), index(index), 61cb93a386Sopenharmony_ci style(SkFontStyle::Normal()), isFixedWidth(false), stream(nullptr) 62cb93a386Sopenharmony_ci { 63cb93a386Sopenharmony_ci if (fname) { 64cb93a386Sopenharmony_ci this->fname.set(fname); 65cb93a386Sopenharmony_ci } 66cb93a386Sopenharmony_ci memset_s(&axisSet, sizeof(axisSet), 0, sizeof(axisSet)); 67cb93a386Sopenharmony_ci } 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci /*! Destructor 70cb93a386Sopenharmony_ci * 71cb93a386Sopenharmony_ci */ 72cb93a386Sopenharmony_ci virtual ~FontInfo() = default; 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci /*! Copy assignment operator 75cb93a386Sopenharmony_ci * \param font an object of FontInfo 76cb93a386Sopenharmony_ci */ 77cb93a386Sopenharmony_ci FontInfo& operator = (const FontInfo& font) 78cb93a386Sopenharmony_ci { 79cb93a386Sopenharmony_ci if (this == &font) { 80cb93a386Sopenharmony_ci return *this; 81cb93a386Sopenharmony_ci } 82cb93a386Sopenharmony_ci familyName = font.familyName; 83cb93a386Sopenharmony_ci fname = font.fname; 84cb93a386Sopenharmony_ci index = font.index; 85cb93a386Sopenharmony_ci style = font.style; 86cb93a386Sopenharmony_ci isFixedWidth = font.isFixedWidth; 87cb93a386Sopenharmony_ci axisSet.axis = font.axisSet.axis; 88cb93a386Sopenharmony_ci axisSet.range = font.axisSet.range; 89cb93a386Sopenharmony_ci if (font.stream) { 90cb93a386Sopenharmony_ci stream = font.stream->duplicate(); 91cb93a386Sopenharmony_ci } 92cb93a386Sopenharmony_ci return *this; 93cb93a386Sopenharmony_ci } 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ci /*! The move assignment operator 96cb93a386Sopenharmony_ci * \param font an object of FontInfo 97cb93a386Sopenharmony_ci */ 98cb93a386Sopenharmony_ci FontInfo& operator = (FontInfo&& font) 99cb93a386Sopenharmony_ci { 100cb93a386Sopenharmony_ci if (this == &font) { 101cb93a386Sopenharmony_ci return *this; 102cb93a386Sopenharmony_ci } 103cb93a386Sopenharmony_ci familyName = std::move(font.familyName); 104cb93a386Sopenharmony_ci fname = std::move(font.fname); 105cb93a386Sopenharmony_ci index = font.index; 106cb93a386Sopenharmony_ci style = font.style; 107cb93a386Sopenharmony_ci isFixedWidth = font.isFixedWidth; 108cb93a386Sopenharmony_ci axisSet.axis = std::move(font.axisSet.axis); 109cb93a386Sopenharmony_ci axisSet.range = std::move(font.axisSet.range); 110cb93a386Sopenharmony_ci if (font.stream) { 111cb93a386Sopenharmony_ci stream = std::move(font.stream); 112cb93a386Sopenharmony_ci } 113cb93a386Sopenharmony_ci return *this; 114cb93a386Sopenharmony_ci } 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ci /*! To set axis values 117cb93a386Sopenharmony_ci * \param count the count of axis 118cb93a386Sopenharmony_ci * \param axis an array of SkFixed value 119cb93a386Sopenharmony_ci * \param range an array of AxisDefinition 120cb93a386Sopenharmony_ci */ 121cb93a386Sopenharmony_ci void setAxisSet(int count, const SkFixed* axis, 122cb93a386Sopenharmony_ci const SkTypeface_FreeType::Scanner::AxisDefinition* range) 123cb93a386Sopenharmony_ci { 124cb93a386Sopenharmony_ci axisSet.axis.clear(); 125cb93a386Sopenharmony_ci axisSet.range.clear(); 126cb93a386Sopenharmony_ci for (int i = 0; i < count; i++) { 127cb93a386Sopenharmony_ci axisSet.axis.emplace_back(axis[i]); 128cb93a386Sopenharmony_ci axisSet.range.emplace_back(range[i]); 129cb93a386Sopenharmony_ci } 130cb93a386Sopenharmony_ci } 131cb93a386Sopenharmony_ci 132cb93a386Sopenharmony_ci SkFontStyle computeFontStyle() 133cb93a386Sopenharmony_ci { 134cb93a386Sopenharmony_ci int weight = style.weight(); 135cb93a386Sopenharmony_ci int width = style.width(); 136cb93a386Sopenharmony_ci auto slant = style.slant(); 137cb93a386Sopenharmony_ci for (size_t i = 0; i < axisSet.axis.size(); i++) { 138cb93a386Sopenharmony_ci auto value = SkFixedToScalar(axisSet.axis[i]); 139cb93a386Sopenharmony_ci auto tag = axisSet.range[i].fTag; 140cb93a386Sopenharmony_ci if (tag == SkSetFourByteTag('w', 'g', 'h', 't')) { 141cb93a386Sopenharmony_ci weight = SkScalarFloorToInt(value); 142cb93a386Sopenharmony_ci } else if (tag == SkSetFourByteTag('w', 'd', 't', 'h')) { 143cb93a386Sopenharmony_ci width = SkScalarFloorToInt(value); 144cb93a386Sopenharmony_ci } 145cb93a386Sopenharmony_ci } 146cb93a386Sopenharmony_ci return SkFontStyle(weight, width, slant); 147cb93a386Sopenharmony_ci } 148cb93a386Sopenharmony_ci 149cb93a386Sopenharmony_ci SkString familyName; // the real family name of the font 150cb93a386Sopenharmony_ci SkString fname; // the full name of font file 151cb93a386Sopenharmony_ci int index; // the index of the font in a ttc font 152cb93a386Sopenharmony_ci SkFontStyle style; // the font style 153cb93a386Sopenharmony_ci bool isFixedWidth; // the flag to indicate if the font has fixed width or not 154cb93a386Sopenharmony_ci /*! 155cb93a386Sopenharmony_ci * \brief To manage the axis values for variable font 156cb93a386Sopenharmony_ci */ 157cb93a386Sopenharmony_ci struct AxisSet { 158cb93a386Sopenharmony_ci std::vector<SkFixed> axis; // the axis values 159cb93a386Sopenharmony_ci std::vector<SkTypeface_FreeType::Scanner::AxisDefinition> range; // the axis ranges 160cb93a386Sopenharmony_ci } axisSet; // the axis values for a variable font 161cb93a386Sopenharmony_ci std::unique_ptr<SkStreamAsset> stream; // the data stream of font file 162cb93a386Sopenharmony_ci}; 163cb93a386Sopenharmony_ci 164cb93a386Sopenharmony_ci#endif /* FONTINFO_OHOS_H */ 165