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 FONT_CONFIG_H
17e9297d28Sopenharmony_ci#define FONT_CONFIG_H
18e9297d28Sopenharmony_ci
19e9297d28Sopenharmony_ci#include <string>
20e9297d28Sopenharmony_ci#include <vector>
21e9297d28Sopenharmony_ci#include <include/core/SkString.h>
22e9297d28Sopenharmony_ci#include <map>
23e9297d28Sopenharmony_ci
24e9297d28Sopenharmony_cistruct cJSON;
25e9297d28Sopenharmony_cinamespace OHOS {
26e9297d28Sopenharmony_cinamespace Rosen {
27e9297d28Sopenharmony_cinamespace TextEngine {
28e9297d28Sopenharmony_ciclass FontConfig {
29e9297d28Sopenharmony_cipublic:
30e9297d28Sopenharmony_ci    explicit FontConfig(const char* fname = nullptr);
31e9297d28Sopenharmony_ci    virtual ~FontConfig() = default;
32e9297d28Sopenharmony_ci    virtual void Dump() const;
33e9297d28Sopenharmony_ci    std::vector<std::string> GetFontSet() const;
34e9297d28Sopenharmony_ci
35e9297d28Sopenharmony_ciprotected:
36e9297d28Sopenharmony_ci    int ParseConfig(const char* fname);
37e9297d28Sopenharmony_ci    int ParseFont(const cJSON* root);
38e9297d28Sopenharmony_ci    cJSON* CheckConfigFile(const char* fname) const;
39e9297d28Sopenharmony_ci    static char* GetFileData(const char* fname, int& size);
40e9297d28Sopenharmony_ci
41e9297d28Sopenharmony_ciprivate:
42e9297d28Sopenharmony_ci    std::vector<std::string> fontSet_;
43e9297d28Sopenharmony_ci    std::string rootPath_;
44e9297d28Sopenharmony_ci};
45e9297d28Sopenharmony_ci
46e9297d28Sopenharmony_citypedef struct AdjustInfo {
47e9297d28Sopenharmony_ci    int origValue;
48e9297d28Sopenharmony_ci    int newValue;
49e9297d28Sopenharmony_ci} AdjustInfo;
50e9297d28Sopenharmony_ciusing AdjustSet = std::vector<AdjustInfo>;
51e9297d28Sopenharmony_ci
52e9297d28Sopenharmony_citypedef struct AliasInfo {
53e9297d28Sopenharmony_ci    std::string familyName;
54e9297d28Sopenharmony_ci    int weight;
55e9297d28Sopenharmony_ci} AliasInfo;
56e9297d28Sopenharmony_ciusing AliasSet = std::vector<AliasInfo>;
57e9297d28Sopenharmony_ci
58e9297d28Sopenharmony_citypedef struct FallbackInfo {
59e9297d28Sopenharmony_ci    std::string familyName;
60e9297d28Sopenharmony_ci    std::string font;
61e9297d28Sopenharmony_ci} FallbackInfo;
62e9297d28Sopenharmony_ciusing FallbackInfoSet = std::vector<FallbackInfo>;
63e9297d28Sopenharmony_ci
64e9297d28Sopenharmony_citypedef struct FallbackGroup {
65e9297d28Sopenharmony_ci    std::string groupName;
66e9297d28Sopenharmony_ci    FallbackInfoSet fallbackInfoSet;
67e9297d28Sopenharmony_ci} FallbackGroup;
68e9297d28Sopenharmony_ciusing FallbackGroupSet = std::vector<FallbackGroup>;
69e9297d28Sopenharmony_ci
70e9297d28Sopenharmony_citypedef struct FontGenericInfo {
71e9297d28Sopenharmony_ci    std::string familyName;
72e9297d28Sopenharmony_ci    AliasSet aliasSet;
73e9297d28Sopenharmony_ci    AdjustSet adjustSet;
74e9297d28Sopenharmony_ci} FontGenericInfo;
75e9297d28Sopenharmony_ciusing GenericSet = std::vector<FontGenericInfo>;
76e9297d28Sopenharmony_ci
77e9297d28Sopenharmony_citypedef struct FontConfigJsonInfo {
78e9297d28Sopenharmony_ci    std::vector<std::string> fontDirSet;
79e9297d28Sopenharmony_ci    GenericSet genericSet;
80e9297d28Sopenharmony_ci    FallbackGroupSet fallbackGroupSet;
81e9297d28Sopenharmony_ci} FontConfigJsonInfo;
82e9297d28Sopenharmony_ci
83e9297d28Sopenharmony_ciusing FontFileMap = std::map<std::string, std::string>;
84e9297d28Sopenharmony_ci
85e9297d28Sopenharmony_ciclass FontConfigJson : public FontConfig {
86e9297d28Sopenharmony_cipublic:
87e9297d28Sopenharmony_ci    FontConfigJson() = default;
88e9297d28Sopenharmony_ci    int ParseFile(const char* fname = nullptr);
89e9297d28Sopenharmony_ci    int ParseFontFileMap(const char* fname = nullptr);
90e9297d28Sopenharmony_ci    int ParseInstallConfig(const char* fname, std::vector<std::string>& fontPathList);
91e9297d28Sopenharmony_ci    std::shared_ptr<FontConfigJsonInfo> GetFontConfigJsonInfo()
92e9297d28Sopenharmony_ci    {
93e9297d28Sopenharmony_ci        return fontPtr;
94e9297d28Sopenharmony_ci    }
95e9297d28Sopenharmony_ci    std::shared_ptr<FontFileMap> GetFontFileMap()
96e9297d28Sopenharmony_ci    {
97e9297d28Sopenharmony_ci        return fontFileMap;
98e9297d28Sopenharmony_ci    }
99e9297d28Sopenharmony_ci    // for test
100e9297d28Sopenharmony_ci    void Dump() const override;
101e9297d28Sopenharmony_ci
102e9297d28Sopenharmony_ciprivate:
103e9297d28Sopenharmony_ci    int ParseConfigList(const char* fname);
104e9297d28Sopenharmony_ci    int ParseConfigListPath(const char* fname);
105e9297d28Sopenharmony_ci    int ParseGeneric(const cJSON* root, const char* key);
106e9297d28Sopenharmony_ci    int ParseAlias(const cJSON* root, FontGenericInfo &genericInfo);
107e9297d28Sopenharmony_ci    int ParseAdjust(const cJSON* root, FontGenericInfo &genericInfo);
108e9297d28Sopenharmony_ci    int ParseFallback(const cJSON* root, const char* key);
109e9297d28Sopenharmony_ci    int ParseFontMap(const cJSON* root, const char* key);
110e9297d28Sopenharmony_ci    int ParseDir(const cJSON* root);
111e9297d28Sopenharmony_ci    void AnalyseFontDir(const cJSON* root);
112e9297d28Sopenharmony_ci    int ParseAdjustArr(const cJSON* arr, FontGenericInfo &genericInfo);
113e9297d28Sopenharmony_ci    int ParseAliasArr(const cJSON* arr, FontGenericInfo &genericInfo);
114e9297d28Sopenharmony_ci    int ParseInstallFont(const cJSON* root, std::vector<std::string>& fontPathList);
115e9297d28Sopenharmony_ci    void DumpFontDir() const;
116e9297d28Sopenharmony_ci    void DumpGeneric() const;
117e9297d28Sopenharmony_ci    void DumpForbak() const;
118e9297d28Sopenharmony_ci    void DumpAlias(const AliasSet &aliasSet) const;
119e9297d28Sopenharmony_ci    void DumpAjdust(const AdjustSet &adjustSet) const;
120e9297d28Sopenharmony_ci    void DumpFontFileMap() const;
121e9297d28Sopenharmony_ci
122e9297d28Sopenharmony_ci    std::shared_ptr<FontConfigJsonInfo> fontPtr = nullptr;
123e9297d28Sopenharmony_ci    std::shared_ptr<FontFileMap> fontFileMap = nullptr;
124e9297d28Sopenharmony_ci};
125e9297d28Sopenharmony_ci} // namespace TextEngine
126e9297d28Sopenharmony_ci} // namespace Rosen
127e9297d28Sopenharmony_ci} // namespace OHOS
128e9297d28Sopenharmony_ci#endif /* FONT_CONFIG_H */
129