• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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