• 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 <string>
20 #include <vector>
21 
22 #include "opentype_parser/cmap_table_parser.h"
23 #include "opentype_parser/name_table_parser.h"
24 #include "opentype_parser/post_table_parser.h"
25 
26 #include "text/typeface.h"
27 
28 namespace OHOS {
29 namespace Rosen {
30 namespace TextEngine {
31 const std::string SIMPLIFIED_CHINESE = "zh-hans";
32 const std::string TRADITIONAL_CHINESE = "zh-hant";
33 const std::string ENGLISH = "en-latn";
34 const unsigned int LANGUAGE_SC = 2052;
35 const unsigned int LANGUAGE_TC = 1028;
36 const unsigned int LANGUAGE_EN = 1033;
37 const unsigned int LANGUAGE_DEFAULT = LANGUAGE_SC;
38 
39 class FontParser {
40 public:
41     enum class PlatformId {
42         UNITE_CODE = 0,
43         MACINTOSH = 1,
44         ISO = 2,
45         WINDOWS = 3,
46         CUSTOM = 4,
47     };
48 
49     enum class EncodingIdWin {
50         SYMBOL = 0,
51         UNICODE_BMP = 1,
52     };
53 
54     enum class Version {
55         SYMBOL = 0,
56         UNICODE_BMP = 1,
57     };
58 
59     enum class NameId {
60         COPYRIGHT = 0,
61         FONT_FAMILY = 1,
62         FONT_SUBFAMILY = 2,
63         UNIQUE_FONT_ID = 3,
64         FULL_NAME = 4,
65         VERSION_STRING = 5,
66         POSTSCRIPT_NAME = 6,
67         TRADEMARK = 7,
68     };
69 
70     enum SystemFontType : int32_t {
71         ALL = 1 << 0,
72         GENERIC = 1 << 1,
73         STYLISH = 1 << 2,
74         INSTALLED = 1 << 3,
75         CUSTOMIZED = 1 << 4
76     };
77 
78     struct FontDescriptor {
79         std::string path;
80         std::string postScriptName;
81         std::string fullName;
82         std::string fontFamily;
83         std::string fontSubfamily;
84         std::string requestedFullname;
85         unsigned int postScriptNameLid = 0;
86         unsigned int fullNameLid = 0;
87         unsigned int fontFamilyLid = 0;
88         unsigned int fontSubfamilyLid = 0;
89         unsigned int requestedLid = 0;
90         int weight = 0;
91         int width = 0;
92         int italic = 0;
93         bool monoSpace = false;
94         bool symbolic = false;
95     };
96 
97     FontParser();
98     std::vector<FontDescriptor> GetVisibilityFonts(const std::string &locale = SIMPLIFIED_CHINESE);
99     std::unique_ptr<FontDescriptor> GetVisibilityFontByName(const std::string& fontName,
100         const std::string locale = SIMPLIFIED_CHINESE);
101 
102     std::vector<std::shared_ptr<FontDescriptor>> GetSystemFonts(const std::string locale = ENGLISH);
103     std::vector<std::shared_ptr<FontDescriptor>> ParserFontDescriptorsFromPath(
104         const std::string& path, const std::string& locale = ENGLISH);
105     std::vector<std::shared_ptr<FontDescriptor>> CreateFontDescriptors(
106         const std::vector<std::shared_ptr<Drawing::Typeface>>& typefaces,
107         const std::string& locale = ENGLISH);
108 
109 private:
110     static void GetStringFromNameId(NameId nameId, unsigned int languageId, const std::string& nameString,
111         FontDescriptor& fontDescriptor);
112     static void ProcessTable(const CmapTables* cmapTable, FontDescriptor& fontDescriptor);
113     static void ProcessTable(const NameTable* nameTable, FontDescriptor& fontDescriptor);
114     static void ProcessTable(const PostTable* postTable, FontDescriptor& fontDescriptor);
115     template<typename T>
116     static bool ParseOneTable(std::shared_ptr<Drawing::Typeface> typeface, FontParser::FontDescriptor& fontDescriptor);
117     template<typename Tuple, size_t... Is>
118     bool ParseAllTables(
119         std::shared_ptr<Drawing::Typeface> typeface, FontDescriptor& fontDescriptor, std::index_sequence<Is...>);
120     bool ParseTable(std::shared_ptr<Drawing::Typeface> typeface, FontDescriptor& fontDescriptor);
121     bool SetFontDescriptor(const unsigned int languageId);
122     std::unique_ptr<FontParser::FontDescriptor> ParseFontDescriptor(
123         const std::string& fontName, const unsigned int languageId);
124     static void SetNameString(FontParser::FontDescriptor& fontDescriptor, std::string& field, unsigned int& fieldLid,
125         unsigned int languageId, const std::string& nameString);
GetLanguageId(const std::string & locale)126     int GetLanguageId(const std::string& locale)
127     {
128         std::string localeLower = locale;
129         transform(localeLower.begin(), localeLower.end(), localeLower.begin(), tolower);
130         if (localeLower.empty()) {
131             return LANGUAGE_SC;
132         } else if (localeLower.find(TRADITIONAL_CHINESE) == 0) {
133             return LANGUAGE_TC;
134         } else if (localeLower.find(ENGLISH) == 0) {
135             return LANGUAGE_EN;
136         } else {
137             return LANGUAGE_SC;
138         }
139     }
140 #ifdef BUILD_NON_SDK_VER
141     static std::string ConvertToString(const std::string& src, const std::string& srcType,
142         const std::string& targetType);
143 #endif
144 
145     const char* data_;
146     unsigned int length_;
147     std::vector<std::string> fontSet_;
148     std::vector<FontDescriptor> visibilityFonts_;
149 };
150 } // namespace TextEngine
151 } // namespace Rosen
152 } // namespace OHOS
153 
154 #endif // ROSEN_MODULES_TEXGINE_SRC_FONT_PARSER_H
155