• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/common/properties/decoration.h"
17 
18 #include "core/pipeline/pipeline_context.h"
19 namespace OHOS::Ace {
20 
SetContextAndCallback(const WeakPtr<PipelineContext> & context,const RenderNodeAnimationCallback & callback)21 void Decoration::SetContextAndCallback(
22     const WeakPtr<PipelineContext>& context, const RenderNodeAnimationCallback& callback)
23 {
24     backgroundColor_.SetContextAndCallback(context, callback);
25     border_.SetContextAndCallback(context, callback);
26     blurRadius_.SetContextAndCallback(context, callback);
27 }
28 
AddShadow(const Shadow & shadow)29 void Decoration::AddShadow(const Shadow& shadow)
30 {
31     shadows_.push_back(shadow);
32 }
33 
ClearAllShadow()34 void Decoration::ClearAllShadow()
35 {
36     shadows_.clear();
37 }
38 
GetOccupiedSize(double dipScale) const39 Size Decoration::GetOccupiedSize(double dipScale) const
40 {
41     return border_.GetLayoutSize(dipScale) + padding_.GetLayoutSizeInPx(dipScale);
42 }
43 
GetOffset(double dipScale) const44 Offset Decoration::GetOffset(double dipScale) const
45 {
46     return border_.GetOffset(dipScale) + padding_.GetOffsetInPx(dipScale);
47 }
48 
VerticalSpaceOccupied(double dipScale) const49 double Decoration::VerticalSpaceOccupied(double dipScale) const
50 {
51     return border_.VerticalWidth(dipScale) + padding_.VerticalInPx(dipScale);
52 }
53 
HorizontalSpaceOccupied(double dipScale) const54 double Decoration::HorizontalSpaceOccupied(double dipScale) const
55 {
56     return border_.HorizontalWidth(dipScale) + padding_.HorizontalInPx(dipScale);
57 }
58 
SetGradient(const Gradient & gradient,const WeakPtr<PipelineContext> & context,const RenderNodeAnimationCallback & callback)59 void Decoration::SetGradient(
60     const Gradient& gradient, const WeakPtr<PipelineContext>& context, const RenderNodeAnimationCallback& callback)
61 {
62     gradient_ = gradient;
63     if (callback) {
64         switch (gradient_.GetType()) {
65             case GradientType::LINEAR:
66                 if (gradient_.GetLinearGradient().angle) {
67                     gradient_.GetLinearGradient().angle->SetContextAndCallbackAfterFirstAssign(context, callback);
68                 }
69                 break;
70             case GradientType::SWEEP:
71                 if (gradient_.GetSweepGradient().centerX) {
72                     gradient_.GetSweepGradient().centerX->SetContextAndCallbackAfterFirstAssign(context, callback);
73                 }
74                 if (gradient_.GetSweepGradient().centerY) {
75                     gradient_.GetSweepGradient().centerY->SetContextAndCallbackAfterFirstAssign(context, callback);
76                 }
77                 if (gradient_.GetSweepGradient().startAngle) {
78                     gradient_.GetSweepGradient().startAngle->SetContextAndCallbackAfterFirstAssign(
79                         context, callback);
80                 }
81                 if (gradient_.GetSweepGradient().endAngle) {
82                     gradient_.GetSweepGradient().endAngle->SetContextAndCallbackAfterFirstAssign(context, callback);
83                 }
84                 if (gradient_.GetSweepGradient().rotation) {
85                     gradient_.GetSweepGradient().rotation->SetContextAndCallbackAfterFirstAssign(context, callback);
86                 }
87                 break;
88             case GradientType::RADIAL:
89                 if (gradient_.GetRadialGradient().radialHorizontalSize) {
90                     gradient_.GetRadialGradient().radialHorizontalSize->SetContextAndCallbackAfterFirstAssign(
91                         context, callback);
92                 }
93                 if (gradient_.GetRadialGradient().radialVerticalSize) {
94                     gradient_.GetRadialGradient().radialVerticalSize->SetContextAndCallbackAfterFirstAssign(
95                         context, callback);
96                 }
97                 if (gradient_.GetRadialGradient().radialCenterX) {
98                     gradient_.GetRadialGradient().radialCenterX->SetContextAndCallbackAfterFirstAssign(
99                         context, callback);
100                 }
101                 if (gradient_.GetRadialGradient().radialCenterY) {
102                     gradient_.GetRadialGradient().radialCenterY->SetContextAndCallbackAfterFirstAssign(
103                         context, callback);
104                 }
105                 break;
106             default:
107                 break;
108         }
109     }
110 }
111 
AddColor(const GradientColor & color)112 void Gradient::AddColor(const GradientColor& color)
113 {
114     colors_.push_back(color);
115 }
116 
ClearColors()117 void Gradient::ClearColors()
118 {
119     colors_.clear();
120 }
121 
SetSrc(const std::string & src,const RefPtr<ThemeConstants> & themeConstants)122 void BackgroundImage::SetSrc(const std::string& src, const RefPtr<ThemeConstants>& themeConstants)
123 {
124     // If match the regex, src with the outer "url()" removed is returned.
125     // Otherwise return a copy of src directly.
126     auto imgSrc = std::regex_replace(src, std::regex(R"(^url\(\s*['"]?\s*([^()]+?)\s*['"]?\s*\)$)"), "$1");
127     src_ = ThemeUtils::ProcessImageSource(imgSrc, themeConstants);
128 }
129 
130 void BackgroundImageSize::SetSizeTypeX(BackgroundImageSizeType type)
131 {
132     typeX_ = type;
133 }
134 
135 void BackgroundImageSize::SetSizeTypeY(BackgroundImageSizeType type)
136 {
137     if (type == BackgroundImageSizeType::CONTAIN || type == BackgroundImageSizeType::COVER) {
138         return;
139     }
140     typeY_ = type;
141 }
142 
143 void BackgroundImageSize::SetSizeValueX(double value)
144 {
145     if (value < -0.0) {
146         return;
147     }
148     valueX_ = value;
149 }
150 
151 void BackgroundImageSize::SetSizeValueY(double value)
152 {
153     if (value < -0.0) {
154         return;
155     }
156     valueY_ = value;
157 }
158 
159 bool BackgroundImageSize::IsValid() const
160 {
161     if (typeY_ == BackgroundImageSizeType::CONTAIN || typeY_ == BackgroundImageSizeType::COVER) {
162         return false;
163     }
164 
165     if ((typeX_ == BackgroundImageSizeType::LENGTH || typeX_ == BackgroundImageSizeType::PERCENT) &&
166         LessOrEqual(valueX_, 0.0)) {
167         return false;
168     }
169 
170     if ((typeY_ == BackgroundImageSizeType::LENGTH || typeY_ == BackgroundImageSizeType::PERCENT) &&
171         LessOrEqual(valueY_, 0.0)) {
172         return false;
173     }
174 
175     return true;
176 }
177 
178 BackgroundImageSizeType BackgroundImageSize::GetSizeTypeX() const
179 {
180     return typeX_;
181 }
182 
183 BackgroundImageSizeType BackgroundImageSize::GetSizeTypeY() const
184 {
185     return typeY_;
186 }
187 
188 double BackgroundImageSize::GetSizeValueX() const
189 {
190     return valueX_;
191 }
192 
193 double BackgroundImageSize::GetSizeValueY() const
194 {
195     return valueY_;
196 }
197 
198 BackgroundImageSize BackgroundImageSize::operator+(const BackgroundImageSize& rhs) const
199 {
200     if ((rhs.GetSizeTypeX() != GetSizeTypeX()) || (rhs.GetSizeTypeY() != GetSizeTypeY())) {
201         // error: unit not same, just return lhs value
202         return *this;
203     }
204     auto rhsX = rhs.GetSizeValueX();
205     auto rhsY = rhs.GetSizeValueY();
206     auto lhsX = GetSizeValueX();
207     auto lhsY = GetSizeValueY();
208     BackgroundImageSize size;
209     size.SetSizeValueX(rhsX + lhsX);
210     size.SetSizeTypeX(GetSizeTypeX());
211     size.SetSizeValueY(rhsY + lhsY);
212     size.SetSizeTypeY(GetSizeTypeY());
213     return size;
214 }
215 
216 BackgroundImageSize BackgroundImageSize::operator-(const BackgroundImageSize& rhs) const
217 {
218     auto rhsX = rhs.GetSizeValueX();
219     auto rhsY = rhs.GetSizeValueY();
220     auto lhsX = GetSizeValueX();
221     auto lhsY = GetSizeValueY();
222     if ((rhs.GetSizeTypeX() != GetSizeTypeX()) || (rhs.GetSizeTypeY() != GetSizeTypeY())) {
223         // error: unit not same, just return lhs value
224         return *this;
225     }
226     BackgroundImageSize size;
227     size.SetSizeValueX(lhsX - rhsX);
228     size.SetSizeTypeX(GetSizeTypeX());
229     size.SetSizeValueY(lhsY - rhsY);
230     size.SetSizeTypeY(GetSizeTypeY());
231     return size;
232 }
233 
234 BackgroundImageSize BackgroundImageSize::operator*(double value) const
235 {
236     BackgroundImageSize size;
237     size.SetSizeValueX(GetSizeValueX() * value);
238     size.SetSizeTypeX(GetSizeTypeX());
239     size.SetSizeValueY(GetSizeValueY() * value);
240     size.SetSizeTypeY(GetSizeTypeY());
241     return size;
242 }
243 
244 bool BackgroundImageSize::operator==(const BackgroundImageSize& size) const
245 {
246     return typeX_ == size.GetSizeTypeX() && NearEqual(valueX_, size.GetSizeValueX()) && typeY_ == size.GetSizeTypeY() &&
247            NearEqual(valueY_, size.GetSizeValueY());
248 }
249 
250 bool BackgroundImageSize::operator!=(const BackgroundImageSize& size) const
251 {
252     return !operator==(size);
253 }
254 
255 std::string BackgroundImageSize::ToString() const
256 {
257     auto widthType = GetSizeTypeX();
258     if (widthType == BackgroundImageSizeType::CONTAIN) {
259         return "ImageSize.Contain";
260     }
261     if (widthType == BackgroundImageSizeType::COVER) {
262         return "ImageSize.Cover";
263     }
264     if (widthType == BackgroundImageSizeType::AUTO) {
265         return "ImageSize.Auto";
266     }
267     if (widthType == BackgroundImageSizeType::FILL) {
268         return "ImageSize.FILL";
269     }
270     auto jsonValue = JsonUtil::Create(true);
271     Dimension width = Dimension((GetSizeValueX()), DimensionUnit::PX);
272     Dimension height = Dimension((GetSizeValueY()), DimensionUnit::PX);
273     jsonValue->Put("width", width.ToString().c_str());
274     jsonValue->Put("height", height.ToString().c_str());
275     return jsonValue->ToString();
276 }
277 
278 BackgroundImagePosition BackgroundImagePosition::operator+(const BackgroundImagePosition& rhs) const
279 {
280     auto rhsX = rhs.GetSizeValueX();
281     auto rhsY = rhs.GetSizeValueY();
282     auto lhsX = GetSizeValueX();
283     auto lhsY = GetSizeValueY();
284     if ((rhs.GetSizeTypeX() != GetSizeTypeX()) || (rhs.GetSizeTypeY() != GetSizeTypeY())) {
285         // error: unit not same, just return lhs value
286         return *this;
287     }
288     BackgroundImagePosition position;
289     position.SetSizeValueX(lhsX + rhsX);
290     position.SetSizeTypeX(GetSizeTypeX());
291     position.SetSizeValueY(lhsY + rhsY);
292     position.SetSizeTypeY(GetSizeTypeY());
293     return position;
294 }
295 
296 BackgroundImagePosition BackgroundImagePosition::operator-(const BackgroundImagePosition& rhs) const
297 {
298     auto rhsX = rhs.GetSizeValueX();
299     auto rhsY = rhs.GetSizeValueY();
300     auto lhsX = GetSizeValueX();
301     auto lhsY = GetSizeValueY();
302     if ((rhs.GetSizeTypeX() != GetSizeTypeX()) || (rhs.GetSizeTypeY() != GetSizeTypeY())) {
303         // error: unit not same, just return lhs value
304         return *this;
305     }
306     BackgroundImagePosition position;
307     position.SetSizeValueX(lhsX - rhsX);
308     position.SetSizeTypeX(GetSizeTypeX());
309     position.SetSizeValueY(lhsY - rhsY);
310     position.SetSizeTypeY(GetSizeTypeY());
311     return position;
312 }
313 
314 BackgroundImagePosition BackgroundImagePosition::operator*(double value) const
315 {
316     BackgroundImagePosition position;
317     position.SetSizeValueX(GetSizeValueX() * value);
318     position.SetSizeTypeX(GetSizeTypeX());
319     position.SetSizeValueY(GetSizeValueY() * value);
320     position.SetSizeTypeY(GetSizeTypeY());
321     return position;
322 }
323 
324 bool BackgroundImagePosition::operator==(const BackgroundImagePosition& backgroundImagePosition) const
325 {
326     bool isXAxisEqual = (GetSizeX() == backgroundImagePosition.GetSizeX()) &&
327                         GetSizeTypeX() == backgroundImagePosition.GetSizeTypeX();
328     bool isYAxisEqual = (GetSizeY() == backgroundImagePosition.GetSizeY()) &&
329                         GetSizeTypeY() == backgroundImagePosition.GetSizeTypeY();
330     return isXAxisEqual && isYAxisEqual;
331 }
332 
333 bool BackgroundImagePosition::operator!=(const BackgroundImagePosition& backgroundImagePosition) const
334 {
335     return !operator==(backgroundImagePosition);
336 }
337 
338 static std::string GetAlignmentType(double width, double height)
339 {
340     const double halfDimension = 50.0;
341     auto jsonValue = JsonUtil::Create(true);
342     if (NearZero(width)) {
343         if (NearZero(height)) {
344             return "Alignment.TopStart";
345         }
346         if (NearEqual(height, halfDimension)) { // Determine whether the vertical element is centered
347             return "Alignment.Start";
348         }
349         return "Alignment.BottomStart";
350     } else if (NearEqual(width, halfDimension)) { // Judge whether the horizontal element is centered
351         if (NearZero(height)) {
352             return "Alignment.Top";
353         }
354         if (NearEqual(height, halfDimension)) {
355             return "Alignment.Center";
356         }
357         return "Alignment.Bottom";
358     } else {
359         if (NearZero(height)) {
360             return "Alignment.TopEnd";
361         }
362         if (NearEqual(height, halfDimension)) {
363             return "Alignment.End";
364         }
365         return "Alignment.BottomEnd";
366     }
367 }
368 
369 std::string BackgroundImagePosition::ToString() const
370 {
371     if (GetSizeTypeX() == BackgroundImagePositionType::PX) {
372         auto width = GetSizeValueX();
373         auto height = GetSizeValueY();
374         auto jsonValue = JsonUtil::Create(true);
375         jsonValue->Put("x", width);
376         jsonValue->Put("y", height);
377         return jsonValue->ToString();
378     }
379     auto width = GetSizeValueX();
380     auto height = GetSizeValueY();
381     return GetAlignmentType(width, height);
382 }
383 
384 CanvasPath2D::CanvasPath2D(const std::string& cmds)
385 {
386     PathArgs args;
387     args.cmds = cmds;
388     caches_.emplace_back(PathCmd::CMDS, args);
389 }
390 
391 CanvasPath2D::CanvasPath2D(const RefPtr<CanvasPath2D>& path)
392 {
393     if (path != nullptr) {
394         auto caches = path->GetCaches();
395         caches_.swap(caches);
396     }
397 }
398 
399 void CanvasPath2D::AddPath(const RefPtr<CanvasPath2D>& path)
400 {
401     if (path != nullptr) {
402         auto caches = path->GetCaches();
403         caches_.insert(caches_.end(), caches.begin(), caches.end());
404     }
405 }
406 
407 void CanvasPath2D::SetTransform(double a, double b, double c, double d, double e, double f)
408 {
409     PathArgs args;
410     args.para1 = a;
411     args.para2 = b;
412     args.para3 = c;
413     args.para4 = d;
414     args.para5 = e;
415     args.para6 = f;
416     caches_.emplace_back(PathCmd::TRANSFORM, args);
417 }
418 
419 void CanvasPath2D::MoveTo(double x, double y)
420 {
421     PathArgs args;
422     args.para1 = x;
423     args.para2 = y;
424     caches_.emplace_back(PathCmd::MOVE_TO, args);
425 }
426 
427 void CanvasPath2D::LineTo(double x, double y)
428 {
429     PathArgs args;
430     args.para1 = x;
431     args.para2 = y;
432     caches_.emplace_back(PathCmd::LINE_TO, args);
433 }
434 
435 void CanvasPath2D::Arc(double x, double y, double radius, double startAngle, double endAngle, double ccw)
436 {
437     PathArgs args;
438     args.para1 = x;
439     args.para2 = y;
440     args.para3 = radius;
441     args.para4 = startAngle;
442     args.para5 = endAngle;
443     args.para6 = ccw;
444     caches_.emplace_back(PathCmd::ARC, args);
445 }
446 
447 void CanvasPath2D::ArcTo(double x1, double y1, double x2, double y2, double radius)
448 {
449     PathArgs args;
450     args.para1 = x1;
451     args.para2 = y1;
452     args.para3 = x2;
453     args.para4 = y2;
454     args.para5 = radius;
455     caches_.emplace_back(PathCmd::ARC_TO, args);
456 }
457 
458 void CanvasPath2D::QuadraticCurveTo(double cpx, double cpy, double x, double y)
459 {
460     PathArgs args;
461     args.para1 = cpx;
462     args.para2 = cpy;
463     args.para3 = x;
464     args.para4 = y;
465     caches_.emplace_back(PathCmd::QUADRATIC_CURVE_TO, args);
466 }
467 
468 void CanvasPath2D::BezierCurveTo(double cp1x, double cp1y, double cp2x, double cp2y, double x, double y)
469 {
470     PathArgs args;
471     args.para1 = cp1x;
472     args.para2 = cp1y;
473     args.para3 = cp2x;
474     args.para4 = cp2y;
475     args.para5 = x;
476     args.para6 = y;
477     caches_.emplace_back(PathCmd::BEZIER_CURVE_TO, args);
478 }
479 
480 void CanvasPath2D::Ellipse(
481     double x, double y, double radiusX, double radiusY, double rotation, double startAngle, double endAngle, double ccw)
482 {
483     PathArgs args;
484     args.para1 = x;
485     args.para2 = y;
486     args.para3 = radiusX;
487     args.para4 = radiusY;
488     args.para5 = rotation;
489     args.para6 = startAngle;
490     args.para7 = endAngle;
491     args.para8 = ccw;
492     caches_.emplace_back(PathCmd::ELLIPSE, args);
493 }
494 
495 void CanvasPath2D::Rect(double x, double y, double width, double height)
496 {
497     PathArgs args;
498     args.para1 = x;
499     args.para2 = y;
500     args.para3 = width;
501     args.para4 = height;
502     caches_.emplace_back(PathCmd::RECT, args);
503 }
504 
505 void CanvasPath2D::RoundRect(const class Rect& rect, const std::vector<double>& radii)
506 {
507     Offset offsetXY = rect.GetOffset();
508     PathArgs args;
509     args.para1 = offsetXY.GetX();
510     args.para2 = offsetXY.GetY();
511     args.para3 = rect.Width();
512     args.para4 = rect.Height();
513     args.para5 = radii[0]; // 0: top-left
514     args.para6 = radii[1]; // 1: top-right
515     args.para7 = radii[2]; // 2: bottom-right
516     args.para8 = radii[3]; // 3: bottom-left
517     caches_.emplace_back(PathCmd::ROUND_RECT, args);
518 }
519 
520 void CanvasPath2D::ClosePath()
521 {
522     PathArgs args;
523     caches_.emplace_back(PathCmd::CLOSE_PATH, args);
524 }
525 
526 const std::vector<std::pair<PathCmd, PathArgs>>& CanvasPath2D::GetCaches() const
527 {
528     return caches_;
529 }
530 
531 std::string CanvasPath2D::ToString() const
532 {
533     std::string str;
534     for (const auto& cache : caches_) {
535         switch (cache.first) {
536             case PathCmd::CMDS: {
537                 str.append("CMDS:");
538                 str.append(cache.second.cmds).append(" ");
539                 break;
540             }
541             case PathCmd::TRANSFORM: {
542                 str.append("TRANSFORM:");
543                 str.append(std::to_string(cache.second.para1)).append(",");
544                 str.append(std::to_string(cache.second.para2)).append(",");
545                 str.append(std::to_string(cache.second.para3)).append(",");
546                 str.append(std::to_string(cache.second.para4)).append(",");
547                 str.append(std::to_string(cache.second.para5)).append(",");
548                 str.append(std::to_string(cache.second.para6)).append(" ");
549                 break;
550             }
551             case PathCmd::MOVE_TO: {
552                 str.append("MOVE_TO:");
553                 str.append(std::to_string(cache.second.para1)).append(",");
554                 str.append(std::to_string(cache.second.para2)).append(" ");
555                 break;
556             }
557             case PathCmd::LINE_TO: {
558                 str.append("LINE_TO:");
559                 str.append(std::to_string(cache.second.para1)).append(",");
560                 str.append(std::to_string(cache.second.para2)).append(" ");
561                 break;
562             }
563             case PathCmd::ARC: {
564                 str.append("ARC:");
565                 str.append(std::to_string(cache.second.para1)).append(",");
566                 str.append(std::to_string(cache.second.para2)).append(",");
567                 str.append(std::to_string(cache.second.para3)).append(",");
568                 str.append(std::to_string(cache.second.para4)).append(",");
569                 str.append(std::to_string(cache.second.para5)).append(",");
570                 str.append(std::to_string(cache.second.para6)).append(" ");
571                 break;
572             }
573             case PathCmd::ARC_TO: {
574                 str.append("ARC_TO:");
575                 str.append(std::to_string(cache.second.para1)).append(",");
576                 str.append(std::to_string(cache.second.para2)).append(",");
577                 str.append(std::to_string(cache.second.para3)).append(",");
578                 str.append(std::to_string(cache.second.para4)).append(",");
579                 str.append(std::to_string(cache.second.para5)).append(" ");
580                 break;
581             }
582             case PathCmd::QUADRATIC_CURVE_TO: {
583                 str.append("QUADRATIC_CURVE_TO:");
584                 str.append(std::to_string(cache.second.para1)).append(",");
585                 str.append(std::to_string(cache.second.para2)).append(",");
586                 str.append(std::to_string(cache.second.para3)).append(",");
587                 str.append(std::to_string(cache.second.para4)).append(" ");
588                 break;
589             }
590             case PathCmd::BEZIER_CURVE_TO: {
591                 str.append("BEZIER_CURVE_TO:");
592                 str.append(std::to_string(cache.second.para1)).append(",");
593                 str.append(std::to_string(cache.second.para2)).append(",");
594                 str.append(std::to_string(cache.second.para3)).append(",");
595                 str.append(std::to_string(cache.second.para4)).append(",");
596                 str.append(std::to_string(cache.second.para5)).append(",");
597                 str.append(std::to_string(cache.second.para6)).append(" ");
598                 break;
599             }
600             case PathCmd::ELLIPSE: {
601                 str.append("ELLIPSE:");
602                 str.append(std::to_string(cache.second.para1)).append(",");
603                 str.append(std::to_string(cache.second.para2)).append(",");
604                 str.append(std::to_string(cache.second.para3)).append(",");
605                 str.append(std::to_string(cache.second.para4)).append(",");
606                 str.append(std::to_string(cache.second.para5)).append(",");
607                 str.append(std::to_string(cache.second.para6)).append(",");
608                 str.append(std::to_string(cache.second.para7)).append(",");
609                 str.append(std::to_string(cache.second.para8)).append(" ");
610                 break;
611             }
612             case PathCmd::RECT: {
613                 str.append("RECT:");
614                 str.append(std::to_string(cache.second.para1)).append(",");
615                 str.append(std::to_string(cache.second.para2)).append(",");
616                 str.append(std::to_string(cache.second.para3)).append(",");
617                 str.append(std::to_string(cache.second.para4)).append(" ");
618                 break;
619             }
620             case PathCmd::CLOSE_PATH: {
621                 str.append("CLOSE_PATH").append(" ");
622                 break;
623             }
624             default: {
625                 break;
626             }
627         }
628     }
629     return str;
630 }
631 
632 std::unique_ptr<JsonValue> BrightnessOption::GetJsonObject() const
633 {
634     auto jsonBrightnessOption = JsonUtil::Create(true);
635     jsonBrightnessOption->Put("rate", rate);
636     jsonBrightnessOption->Put("lightUpDegree", lightUpDegree);
637     jsonBrightnessOption->Put("cubicCoeff", cubicCoeff);
638     jsonBrightnessOption->Put("quadCoeff", quadCoeff);
639     std::string posRGBstr = "[0.0,0.0,0.0]";
640     if (posRGB.size() > 1) {
641         posRGBstr = ("[" + std::to_string(posRGB[0]) + "," + std::to_string(posRGB[1]) + "," +
642                      std::to_string(posRGB[2]) + "]")
643                         .c_str();
644     }
645     jsonBrightnessOption->Put("posRGB", posRGBstr.c_str());
646     std::string negRGBstr = "[0.0,0.0,0.0]";
647     if (negRGB.size() > 1) {
648         negRGBstr = ("[" + std::to_string(negRGB[0]) + "," + std::to_string(negRGB[1]) + "," +
649                      std::to_string(negRGB[2]) + "]")
650                         .c_str();
651     }
652     jsonBrightnessOption->Put("negRGB", negRGBstr.c_str());
653     jsonBrightnessOption->Put("fraction", fraction);
654     return jsonBrightnessOption;
655 }
656 
657 void BrightnessOption::ToJsonValue(
658     std::unique_ptr<JsonValue>& json, const NG::InspectorFilter& filter, std::string key) const
659 {
660     /* no fixed attr below, just return */
661     if (filter.IsFastFilter()) {
662         return;
663     }
664     json->PutExtAttr(key.c_str(), GetJsonObject(), filter);
665 }
666 
667 void BackgroundImagePosition::SetContextAndCallback(
668     const WeakPtr<PipelineContext>& context, const RenderNodeAnimationCallback& callback)
669 {
670     valueX_.SetContextAndCallback(context, callback);
671     valueY_.SetContextAndCallback(context, callback);
672 }
673 
674 } // namespace OHOS::Ace
675