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