1e9297d28Sopenharmony_ci/* 2e9297d28Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3e9297d28Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e9297d28Sopenharmony_ci * you may not use this file except in compliance with the License. 5e9297d28Sopenharmony_ci * You may obtain a copy of the License at 6e9297d28Sopenharmony_ci * 7e9297d28Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e9297d28Sopenharmony_ci * 9e9297d28Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e9297d28Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e9297d28Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e9297d28Sopenharmony_ci * See the License for the specific language governing permissions and 13e9297d28Sopenharmony_ci * limitations under the License. 14e9297d28Sopenharmony_ci */ 15e9297d28Sopenharmony_ci 16e9297d28Sopenharmony_ci#ifndef ROSEN_MODULES_TEXGINE_SRC_FONT_PARSER_H 17e9297d28Sopenharmony_ci#define ROSEN_MODULES_TEXGINE_SRC_FONT_PARSER_H 18e9297d28Sopenharmony_ci 19e9297d28Sopenharmony_ci#include <hb.h> 20e9297d28Sopenharmony_ci#include <string> 21e9297d28Sopenharmony_ci#include <vector> 22e9297d28Sopenharmony_ci 23e9297d28Sopenharmony_ci#include "opentype_parser/cmap_table_parser.h" 24e9297d28Sopenharmony_ci#include "opentype_parser/name_table_parser.h" 25e9297d28Sopenharmony_ci#include "opentype_parser/post_table_parser.h" 26e9297d28Sopenharmony_ci 27e9297d28Sopenharmony_ci#include "texgine_typeface.h" 28e9297d28Sopenharmony_ci 29e9297d28Sopenharmony_cinamespace OHOS { 30e9297d28Sopenharmony_cinamespace Rosen { 31e9297d28Sopenharmony_cinamespace TextEngine { 32e9297d28Sopenharmony_ci#define SIMPLIFIED_CHINESE "zh-hans" 33e9297d28Sopenharmony_ci#define TRADITIONAL_CHINESE "zh-hant" 34e9297d28Sopenharmony_ci#define ENGLISH "en-latn" 35e9297d28Sopenharmony_ci#define LANGUAGE_SC 2052 36e9297d28Sopenharmony_ci#define LANGUAGE_TC 1028 37e9297d28Sopenharmony_ci#define LANGUAGE_EN 1033 38e9297d28Sopenharmony_ci#define LANGUAGE_DEFAULT LANGUAGE_SC 39e9297d28Sopenharmony_ci 40e9297d28Sopenharmony_ciclass FontParser { 41e9297d28Sopenharmony_cipublic: 42e9297d28Sopenharmony_ci enum class PlatformId { 43e9297d28Sopenharmony_ci UNITE_CODE = 0, 44e9297d28Sopenharmony_ci MACINTOSH = 1, 45e9297d28Sopenharmony_ci ISO = 2, 46e9297d28Sopenharmony_ci WINDOWS = 3, 47e9297d28Sopenharmony_ci CUSTOM = 4, 48e9297d28Sopenharmony_ci }; 49e9297d28Sopenharmony_ci 50e9297d28Sopenharmony_ci enum class EncodingIdWin { 51e9297d28Sopenharmony_ci SYMBOL = 0, 52e9297d28Sopenharmony_ci UNICODE_BMP = 1, 53e9297d28Sopenharmony_ci }; 54e9297d28Sopenharmony_ci 55e9297d28Sopenharmony_ci enum class Version { 56e9297d28Sopenharmony_ci SYMBOL = 0, 57e9297d28Sopenharmony_ci UNICODE_BMP = 1, 58e9297d28Sopenharmony_ci }; 59e9297d28Sopenharmony_ci 60e9297d28Sopenharmony_ci enum class NameId { 61e9297d28Sopenharmony_ci COPYRIGHT = 0, 62e9297d28Sopenharmony_ci FONT_FAMILY = 1, 63e9297d28Sopenharmony_ci FONT_SUBFAMILY = 2, 64e9297d28Sopenharmony_ci UNIQUE_FONT_ID = 3, 65e9297d28Sopenharmony_ci FULL_NAME = 4, 66e9297d28Sopenharmony_ci VERSION_STRING = 5, 67e9297d28Sopenharmony_ci POSTSCRIPT_NAME = 6, 68e9297d28Sopenharmony_ci TRADEMARK = 7, 69e9297d28Sopenharmony_ci }; 70e9297d28Sopenharmony_ci 71e9297d28Sopenharmony_ci enum SystemFontType : int32_t { 72e9297d28Sopenharmony_ci ALL = 1 << 0, 73e9297d28Sopenharmony_ci GENERIC = 1 << 1, 74e9297d28Sopenharmony_ci STYLISH = 1 << 2, 75e9297d28Sopenharmony_ci INSTALLED = 1 << 3, 76e9297d28Sopenharmony_ci }; 77e9297d28Sopenharmony_ci 78e9297d28Sopenharmony_ci struct FontDescriptor { 79e9297d28Sopenharmony_ci std::string path; 80e9297d28Sopenharmony_ci std::string postScriptName; 81e9297d28Sopenharmony_ci std::string fullName; 82e9297d28Sopenharmony_ci std::string fontFamily; 83e9297d28Sopenharmony_ci std::string fontSubfamily; 84e9297d28Sopenharmony_ci std::string requestedFullname; 85e9297d28Sopenharmony_ci unsigned int postScriptNameLid = 0; 86e9297d28Sopenharmony_ci unsigned int fullNameLid = 0; 87e9297d28Sopenharmony_ci unsigned int fontFamilyLid = 0; 88e9297d28Sopenharmony_ci unsigned int fontSubfamilyLid = 0; 89e9297d28Sopenharmony_ci unsigned int requestedLid = 0; 90e9297d28Sopenharmony_ci int weight = 0; 91e9297d28Sopenharmony_ci int width = 0; 92e9297d28Sopenharmony_ci int italic = 0; 93e9297d28Sopenharmony_ci bool monoSpace = false; 94e9297d28Sopenharmony_ci bool symbolic = false; 95e9297d28Sopenharmony_ci }; 96e9297d28Sopenharmony_ci 97e9297d28Sopenharmony_ci FontParser(); 98e9297d28Sopenharmony_ci std::vector<FontDescriptor> GetVisibilityFonts(const std::string &locale = SIMPLIFIED_CHINESE); 99e9297d28Sopenharmony_ci std::unique_ptr<FontDescriptor> GetVisibilityFontByName(const std::string& fontName, 100e9297d28Sopenharmony_ci const std::string locale = SIMPLIFIED_CHINESE); 101e9297d28Sopenharmony_ci 102e9297d28Sopenharmony_ci std::vector<std::shared_ptr<FontDescriptor>> GetSystemFonts(const std::string locale = SIMPLIFIED_CHINESE); 103e9297d28Sopenharmony_ci bool ParserFontDescriptorFromPath(const std::string& path, 104e9297d28Sopenharmony_ci std::vector<std::shared_ptr<FontDescriptor>>& descriptors, 105e9297d28Sopenharmony_ci const std::string locale = SIMPLIFIED_CHINESE); 106e9297d28Sopenharmony_ci 107e9297d28Sopenharmony_ciprivate: 108e9297d28Sopenharmony_ci static void GetStringFromNameId(NameId nameId, unsigned int languageId, const std::string& nameString, 109e9297d28Sopenharmony_ci FontDescriptor& fontDescriptor); 110e9297d28Sopenharmony_ci static void ProcessCmapTable(const struct CmapTables* cmapTable, FontDescriptor& fontDescriptor); 111e9297d28Sopenharmony_ci int ProcessNameTable(const struct NameTable* nameTable, FontDescriptor& fontDescriptor) const; 112e9297d28Sopenharmony_ci static void ProcessPostTable(const struct PostTable* postTable, FontDescriptor& fontDescriptor); 113e9297d28Sopenharmony_ci int ParseCmapTable(std::shared_ptr<Drawing::Typeface> typeface, FontDescriptor& fontDescriptor); 114e9297d28Sopenharmony_ci int ParseNameTable(std::shared_ptr<Drawing::Typeface> typeface, FontDescriptor& fontDescriptor); 115e9297d28Sopenharmony_ci int ParsePostTable(std::shared_ptr<Drawing::Typeface> typeface, FontDescriptor& fontDescriptor); 116e9297d28Sopenharmony_ci int ParseTable(std::shared_ptr<Drawing::Typeface> typeface, FontDescriptor& fontDescriptor); 117e9297d28Sopenharmony_ci int SetFontDescriptor(const unsigned int languageId); 118e9297d28Sopenharmony_ci std::unique_ptr<FontParser::FontDescriptor> ParseFontDescriptor(const std::string& fontName, 119e9297d28Sopenharmony_ci const unsigned int languageId); 120e9297d28Sopenharmony_ci static void SetNameString(FontParser::FontDescriptor& fontDescriptor, std::string& field, unsigned int& fieldLid, 121e9297d28Sopenharmony_ci unsigned int languageId, const std::string& nameString); 122e9297d28Sopenharmony_ci int GetLanguageId(const std::string& locale) 123e9297d28Sopenharmony_ci { 124e9297d28Sopenharmony_ci std::string localeLower = locale; 125e9297d28Sopenharmony_ci transform(localeLower.begin(), localeLower.end(), localeLower.begin(), tolower); 126e9297d28Sopenharmony_ci if (localeLower.empty()) { 127e9297d28Sopenharmony_ci return LANGUAGE_SC; 128e9297d28Sopenharmony_ci } else if (localeLower.find(TRADITIONAL_CHINESE) == 0) { 129e9297d28Sopenharmony_ci return LANGUAGE_TC; 130e9297d28Sopenharmony_ci } else if (localeLower.find(ENGLISH) == 0) { 131e9297d28Sopenharmony_ci return LANGUAGE_EN; 132e9297d28Sopenharmony_ci } else { 133e9297d28Sopenharmony_ci return LANGUAGE_SC; 134e9297d28Sopenharmony_ci } 135e9297d28Sopenharmony_ci } 136e9297d28Sopenharmony_ci#ifdef BUILD_NON_SDK_VER 137e9297d28Sopenharmony_ci static std::string ToUtf8(const std::string& gbkStr); 138e9297d28Sopenharmony_ci#endif 139e9297d28Sopenharmony_ci 140e9297d28Sopenharmony_ci const char* data_; 141e9297d28Sopenharmony_ci unsigned int length_; 142e9297d28Sopenharmony_ci std::vector<std::string> fontSet_; 143e9297d28Sopenharmony_ci std::vector<FontDescriptor> visibilityFonts_; 144e9297d28Sopenharmony_ci}; 145e9297d28Sopenharmony_ci} // namespace TextEngine 146e9297d28Sopenharmony_ci} // namespace Rosen 147e9297d28Sopenharmony_ci} // namespace OHOS 148e9297d28Sopenharmony_ci 149e9297d28Sopenharmony_ci#endif // ROSEN_MODULES_TEXGINE_SRC_FONT_PARSER_H 150