1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3cb93a386Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4cb93a386Sopenharmony_ci * you may not use this file except in compliance with the License.
5cb93a386Sopenharmony_ci * You may obtain a copy of the License at
6cb93a386Sopenharmony_ci *
7cb93a386Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8cb93a386Sopenharmony_ci *
9cb93a386Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10cb93a386Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11cb93a386Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12cb93a386Sopenharmony_ci * See the License for the specific language governing permissions and
13cb93a386Sopenharmony_ci * limitations under the License.
14cb93a386Sopenharmony_ci */
15cb93a386Sopenharmony_ci#ifndef LIB_RS_SRC_HM_SYMBOL_H_
16cb93a386Sopenharmony_ci#define LIB_RS_SRC_HM_SYMBOL_H_
17cb93a386Sopenharmony_ci#include <iostream>
18cb93a386Sopenharmony_ci#include <vector>
19cb93a386Sopenharmony_ci#include <string>
20cb93a386Sopenharmony_ci#include <map>
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_ci#include "third_party/skia/include/core/SkPath.h"
23cb93a386Sopenharmony_ci
24cb93a386Sopenharmony_cienum AnimationType {
25cb93a386Sopenharmony_ci    INVALID_ANIMATION_TYPE = 0,
26cb93a386Sopenharmony_ci    SCALE_TYPE = 1,
27cb93a386Sopenharmony_ci    VARIABLE_COLOR_TYPE = 2,
28cb93a386Sopenharmony_ci    APPEAR_TYPE = 3,
29cb93a386Sopenharmony_ci    DISAPPEAR_TYPE = 4,
30cb93a386Sopenharmony_ci    BOUNCE_TYPE = 5,
31cb93a386Sopenharmony_ci    PULSE_TYPE = 6,
32cb93a386Sopenharmony_ci    REPLACE_APPEAR_TYPE = 7,
33cb93a386Sopenharmony_ci    REPLACE_DISAPPEAR_TYPE = 8,
34cb93a386Sopenharmony_ci};
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_cienum CurveType {
37cb93a386Sopenharmony_ci    INVALID_CURVE_TYPE = 0,
38cb93a386Sopenharmony_ci    SPRING = 1,
39cb93a386Sopenharmony_ci    LINEAR = 2,
40cb93a386Sopenharmony_ci    FRICTION = 3,
41cb93a386Sopenharmony_ci    SHARP = 4,
42cb93a386Sopenharmony_ci};
43cb93a386Sopenharmony_ci
44cb93a386Sopenharmony_cienum CommonSubType {
45cb93a386Sopenharmony_ci    DOWN = 0,
46cb93a386Sopenharmony_ci    UP = 1,
47cb93a386Sopenharmony_ci};
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ciusing PiecewiseParameter = struct PiecewiseParameter {
50cb93a386Sopenharmony_ci    CurveType curveType = CurveType::INVALID_CURVE_TYPE;
51cb93a386Sopenharmony_ci    std::map<std::string, float> curveArgs;
52cb93a386Sopenharmony_ci    uint32_t duration = 0;
53cb93a386Sopenharmony_ci    int delay = 0;
54cb93a386Sopenharmony_ci    std::map<std::string, std::vector<float>> properties;
55cb93a386Sopenharmony_ci};
56cb93a386Sopenharmony_ci
57cb93a386Sopenharmony_ciusing AnimationPara = struct AnimationPara {
58cb93a386Sopenharmony_ci    uint16_t animationMode = 0; // 0 is default value, is byLayer effect
59cb93a386Sopenharmony_ci    CommonSubType commonSubType = CommonSubType::DOWN;
60cb93a386Sopenharmony_ci    std::vector<std::vector<PiecewiseParameter>> groupParameters;
61cb93a386Sopenharmony_ci};
62cb93a386Sopenharmony_ci
63cb93a386Sopenharmony_ciusing AnimationInfo = struct AnimationInfo {
64cb93a386Sopenharmony_ci    AnimationType animationType = AnimationType::INVALID_ANIMATION_TYPE;
65cb93a386Sopenharmony_ci    std::map<uint32_t, AnimationPara> animationParas;
66cb93a386Sopenharmony_ci};
67cb93a386Sopenharmony_ci
68cb93a386Sopenharmony_ciusing SColor = struct SColor {
69cb93a386Sopenharmony_ci    float a = 1;
70cb93a386Sopenharmony_ci    U8CPU r = 0;
71cb93a386Sopenharmony_ci    U8CPU g = 0;
72cb93a386Sopenharmony_ci    U8CPU b = 0;
73cb93a386Sopenharmony_ci};
74cb93a386Sopenharmony_ci
75cb93a386Sopenharmony_ciusing GroupInfo = struct GroupInfo {
76cb93a386Sopenharmony_ci    std::vector<size_t> layerIndexes;
77cb93a386Sopenharmony_ci    std::vector<size_t> maskIndexes;
78cb93a386Sopenharmony_ci};
79cb93a386Sopenharmony_ci
80cb93a386Sopenharmony_ciusing GroupSetting = struct GroupSetting {
81cb93a386Sopenharmony_ci    std::vector<GroupInfo> groupInfos;
82cb93a386Sopenharmony_ci    int animationIndex = -1; // -1 is default value, the level has no effecet
83cb93a386Sopenharmony_ci};
84cb93a386Sopenharmony_ci
85cb93a386Sopenharmony_ciusing AnimationSetting = struct AnimationSetting {
86cb93a386Sopenharmony_ci    std::vector<AnimationType> animationTypes;
87cb93a386Sopenharmony_ci    std::vector<GroupSetting> groupSettings;
88cb93a386Sopenharmony_ci};
89cb93a386Sopenharmony_ci
90cb93a386Sopenharmony_ciusing RenderGroup = struct RenderGroup {
91cb93a386Sopenharmony_ci    std::vector<GroupInfo> groupInfos;
92cb93a386Sopenharmony_ci    SColor color;
93cb93a386Sopenharmony_ci};
94cb93a386Sopenharmony_ci
95cb93a386Sopenharmony_cienum EffectStrategy {
96cb93a386Sopenharmony_ci    NONE = 0,
97cb93a386Sopenharmony_ci    SCALE = 1,
98cb93a386Sopenharmony_ci    VARIABLE_COLOR = 2,
99cb93a386Sopenharmony_ci    APPEAR = 3,
100cb93a386Sopenharmony_ci    DISAPPEAR = 4,
101cb93a386Sopenharmony_ci    BOUNCE = 5,
102cb93a386Sopenharmony_ci    PULSE = 6,
103cb93a386Sopenharmony_ci    REPLACE_APPEAR = 7,
104cb93a386Sopenharmony_ci    REPLACE_DISAPPEAR = 8,
105cb93a386Sopenharmony_ci};
106cb93a386Sopenharmony_ci
107cb93a386Sopenharmony_ciusing SymbolLayers = struct SymbolLayers {
108cb93a386Sopenharmony_ci    uint16_t symbolGlyphId = 0;
109cb93a386Sopenharmony_ci    std::vector<std::vector<size_t>> layers;
110cb93a386Sopenharmony_ci    std::vector<RenderGroup> renderGroups;
111cb93a386Sopenharmony_ci};
112cb93a386Sopenharmony_ci
113cb93a386Sopenharmony_cienum SymbolRenderingStrategy {
114cb93a386Sopenharmony_ci    SINGLE = 0,
115cb93a386Sopenharmony_ci    MULTIPLE_COLOR = 1,
116cb93a386Sopenharmony_ci    MULTIPLE_OPACITY = 2,
117cb93a386Sopenharmony_ci};
118cb93a386Sopenharmony_ci
119cb93a386Sopenharmony_ci
120cb93a386Sopenharmony_ciusing SymbolLayersGroups = struct SymbolLayersGroups {
121cb93a386Sopenharmony_ci    uint16_t symbolGlyphId = 0;
122cb93a386Sopenharmony_ci    std::vector<std::vector<size_t>> layers;
123cb93a386Sopenharmony_ci    std::map<SymbolRenderingStrategy, std::vector<RenderGroup>> renderModeGroups;
124cb93a386Sopenharmony_ci    std::vector<AnimationSetting> animationSettings;
125cb93a386Sopenharmony_ci};
126cb93a386Sopenharmony_ci
127cb93a386Sopenharmony_ciclass SK_API HMSymbolData
128cb93a386Sopenharmony_ci{
129cb93a386Sopenharmony_cipublic:
130cb93a386Sopenharmony_ci    SymbolLayers symbolInfo_;
131cb93a386Sopenharmony_ci    SkPath path_;
132cb93a386Sopenharmony_ci    uint64_t symbolId_ = 0;
133cb93a386Sopenharmony_ci};
134cb93a386Sopenharmony_ci
135cb93a386Sopenharmony_ciclass SK_API HMSymbol
136cb93a386Sopenharmony_ci{
137cb93a386Sopenharmony_cipublic:
138cb93a386Sopenharmony_ci    HMSymbol(){};
139cb93a386Sopenharmony_ci
140cb93a386Sopenharmony_ci    ~HMSymbol(){};
141cb93a386Sopenharmony_ci
142cb93a386Sopenharmony_ci    static void PathOutlineDecompose(const SkPath& path, std::vector<SkPath>& paths);
143cb93a386Sopenharmony_ci
144cb93a386Sopenharmony_ci    static void MultilayerPath(const std::vector<std::vector<size_t>>& multMap,
145cb93a386Sopenharmony_ci        const std::vector<SkPath>& paths, std::vector<SkPath>& multPaths);
146cb93a386Sopenharmony_ci};
147cb93a386Sopenharmony_ci
148cb93a386Sopenharmony_ci#endif