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