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