1 /*
2  * Copyright (c) 2021 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 #include "core/components_v2/inspector/shape_container_composed_element.h"
17 
18 #include "base/log/dump_log.h"
19 #include "core/components/shape/render_shape_container.h"
20 #include "core/components_v2/inspector/utils.h"
21 
22 namespace OHOS::Ace::V2 {
23 namespace {
24 
25 using StrFuncType = std::function<std::string(const ShapeContainerComposedElement&)>;
26 const std::unordered_map<std::string, StrFuncType> CREATE_JSON_MAP {
__anona2101dcf0202() 27     { "fill", [](const ShapeContainerComposedElement& inspector) { return inspector.GetFill(); } },
__anona2101dcf0302() 28     { "fillOpacity", [](const ShapeContainerComposedElement& inspector) { return inspector.GetFillOpacity(); } },
__anona2101dcf0402() 29     { "stroke", [](const ShapeContainerComposedElement& inspector) { return inspector.GetStroke(); } },
30     { "strokeDashOffset",
__anona2101dcf0502() 31         [](const ShapeContainerComposedElement& inspector) { return inspector.GetStrokeDashOffset(); } },
__anona2101dcf0602() 32     { "strokeLineCap", [](const ShapeContainerComposedElement& inspector) { return inspector.GetStrokeLineCap(); } },
__anona2101dcf0702() 33     { "strokeLineJoin", [](const ShapeContainerComposedElement& inspector) { return inspector.GetStrokeLineJoin(); } },
34     { "strokeMiterLimit",
__anona2101dcf0802() 35         [](const ShapeContainerComposedElement& inspector) { return inspector.GetStrokeMiterLimit(); } },
__anona2101dcf0902() 36     { "strokeOpacity", [](const ShapeContainerComposedElement& inspector) { return inspector.GetStrokeOpacity(); } },
__anona2101dcf0a02() 37     { "strokeWidth", [](const ShapeContainerComposedElement& inspector) { return inspector.GetStrokeWidth(); } },
__anona2101dcf0b02() 38     { "antiAlias", [](const ShapeContainerComposedElement& inspector) { return inspector.GetAntiAlias(); } },
39 };
40 
41 using JsonFuncType = std::function<std::unique_ptr<JsonValue>(const ShapeContainerComposedElement&)>;
42 const std::unordered_map<std::string, JsonFuncType> CREATE_JSON_JSON_VALUE_MAP {
43     { "strokeDashArray",
__anona2101dcf0c02() 44         [](const ShapeContainerComposedElement& inspector) { return inspector.GetStrokeDashArray(); } },
__anona2101dcf0d02() 45     { "viewPort", [](const ShapeContainerComposedElement& inspector) { return inspector.GetViewBox(); } },
__anona2101dcf0e02() 46     { "mesh", [](const ShapeContainerComposedElement& inspector) { return inspector.GetMesh(); } },
47 };
48 
49 }
50 
LineCapStyleToString(LineCapStyle lineCapStyle)51 std::string ShapeContainerComposedElement::LineCapStyleToString(LineCapStyle lineCapStyle)
52 {
53     static const std::unordered_map<LineCapStyle, std::string> STYLE_MAP {
54         { LineCapStyle::BUTT, "LineCapStyle.Butt" },
55         { LineCapStyle::ROUND, "LineCapStyle.Round" },
56         { LineCapStyle::SQUARE, "LineCapStyle.Square" },
57     };
58 
59     auto pos = STYLE_MAP.find(lineCapStyle);
60     if (pos != STYLE_MAP.end()) {
61         return pos->second;
62     }
63     return "";
64 }
65 
LineJoinStyleToString(LineJoinStyle lineJoinStyle)66 std::string ShapeContainerComposedElement::LineJoinStyleToString(LineJoinStyle lineJoinStyle)
67 {
68     static const std::unordered_map<LineJoinStyle, std::string> STYLE_MAP {
69         { LineJoinStyle::MITER, "LineJoinStyle.Miter" },
70         { LineJoinStyle::BEVEL, "LineJoinStyle.Bevel" },
71         { LineJoinStyle::ROUND, "LineJoinStyle.Round" },
72     };
73 
74     auto pos = STYLE_MAP.find(lineJoinStyle);
75     if (pos != STYLE_MAP.end()) {
76         return pos->second;
77     }
78     return "";
79 }
80 
Dump()81 void ShapeContainerComposedElement::Dump()
82 {
83     InspectorComposedElement::Dump();
84     for (const auto& value : CREATE_JSON_MAP) {
85         DumpLog::GetInstance().AddDesc(std::string(value.first + ": ").append(value.second(*this)));
86     }
87 }
88 
ToJsonObject() const89 std::unique_ptr<JsonValue> ShapeContainerComposedElement::ToJsonObject() const
90 {
91     auto resultJson = InspectorComposedElement::ToJsonObject();
92     for (const auto& value : CREATE_JSON_MAP) {
93         resultJson->Put(value.first.c_str(), value.second(*this).c_str());
94     }
95     for (const auto& value : CREATE_JSON_JSON_VALUE_MAP) {
96         resultJson->Put(value.first.c_str(), value.second(*this));
97     }
98     return resultJson;
99 }
100 
GetAntiAlias() const101 std::string ShapeContainerComposedElement::GetAntiAlias() const
102 {
103     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
104     if (render) {
105         return ConvertBoolToString(render->GetAntiAlias());
106     }
107     return "";
108 }
109 
GetFill() const110 std::string ShapeContainerComposedElement::GetFill() const
111 {
112     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
113     if (render) {
114         return render->GetFillState().GetColor().ColorToString();
115     }
116     return "";
117 }
118 
GetFillOpacity() const119 std::string ShapeContainerComposedElement::GetFillOpacity() const
120 {
121     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
122     if (render) {
123         return std::to_string(render->GetFillState().GetOpacity().GetValue());
124     }
125     return "";
126 }
127 
GetStroke() const128 std::string ShapeContainerComposedElement::GetStroke() const
129 {
130     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
131     if (render) {
132         return render->GetStrokeState().GetColor().ColorToString();
133     }
134     return "";
135 }
136 
GetStrokeDashOffset() const137 std::string ShapeContainerComposedElement::GetStrokeDashOffset() const
138 {
139     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
140     if (render) {
141         return render->GetStrokeState().GetStrokeDashOffset().ToString();
142     }
143     return "";
144 }
145 
GetStrokeDashArray() const146 std::unique_ptr<JsonValue> ShapeContainerComposedElement::GetStrokeDashArray() const
147 {
148     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
149     auto jsonDashArray = JsonUtil::CreateArray(true);
150     if (render) {
151         std::vector<Dimension> array = render->GetStrokeState().GetStrokeDashArray();
152         for (size_t i = 0; i < array.size(); i++) {
153             auto index = std::to_string(i);
154             auto value = array[i].ToString();
155             jsonDashArray->Put(index.c_str(), value.c_str());
156         }
157     }
158     return jsonDashArray;
159 }
160 
GetStrokeLineCap() const161 std::string ShapeContainerComposedElement::GetStrokeLineCap() const
162 {
163     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
164     if (render) {
165         auto style = render->GetStrokeState().GetLineCap();
166         return LineCapStyleToString(style);
167     }
168     return "";
169 }
170 
GetStrokeLineJoin() const171 std::string ShapeContainerComposedElement::GetStrokeLineJoin() const
172 {
173     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
174     if (render) {
175         auto style = render->GetStrokeState().GetLineJoin();
176         return LineJoinStyleToString(style);
177     }
178     return "";
179 }
180 
GetStrokeMiterLimit() const181 std::string ShapeContainerComposedElement::GetStrokeMiterLimit() const
182 {
183     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
184     if (render) {
185         return std::to_string(render->GetStrokeState().GetMiterLimit());
186     }
187     return "";
188 }
189 
GetStrokeOpacity() const190 std::string ShapeContainerComposedElement::GetStrokeOpacity() const
191 {
192     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
193     if (render) {
194         return std::to_string(render->GetStrokeState().GetOpacity().GetValue());
195     }
196     return "";
197 }
198 
GetStrokeWidth() const199 std::string ShapeContainerComposedElement::GetStrokeWidth() const
200 {
201     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
202     if (render) {
203         return render->GetStrokeState().GetLineWidth().ToString();
204     }
205     return "";
206 }
207 
GetViewBox() const208 std::unique_ptr<JsonValue> ShapeContainerComposedElement::GetViewBox() const
209 {
210     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
211     auto jsonViewBox = JsonUtil::Create(true);
212     if (render) {
213         auto viewBox = render->GetShapeViewBox();
214         jsonViewBox->Put("x", viewBox.Left().ToString().c_str());
215         jsonViewBox->Put("y", viewBox.Top().ToString().c_str());
216         jsonViewBox->Put("width", viewBox.Width().ToString().c_str());
217         jsonViewBox->Put("height", viewBox.Height().ToString().c_str());
218     }
219     return jsonViewBox;
220 }
221 
GetMesh() const222 std::unique_ptr<JsonValue> ShapeContainerComposedElement::GetMesh() const
223 {
224     auto render = GetContentRender<RenderShapeContainer>(ShapeContainerElement::TypeId());
225     auto jsonMesh = JsonUtil::Create(true);
226     if (render && jsonMesh) {
227         auto jsonValueArray = JsonUtil::CreateArray(true);
228         std::vector<double> array = render->GetMesh();
229         for (size_t i = 0; i < array.size(); i++) {
230             auto index = std::to_string(i);
231             auto value = std::to_string(array[i]);
232             jsonValueArray->Put(index.c_str(), value.c_str());
233         }
234         jsonMesh->Put("value", jsonValueArray);
235         jsonMesh->Put("column", std::to_string(render->GetColumn()).c_str());
236         jsonMesh->Put("row", std::to_string(render->GetRow()).c_str());
237     }
238     return jsonMesh;
239 }
240 } // namespace OHOS::Ace::V2
241