1 /*
2  * Copyright (c) 2022 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_ng/pattern/progress/progress_paint_method.h"
17 
18 #include <algorithm>
19 #include <optional>
20 
21 #include "base/geometry/ng/point_t.h"
22 #include "base/geometry/ng/rect_t.h"
23 #include "base/utils/utils.h"
24 #include "core/components/picker/picker_option_component.h"
25 #include "core/components/progress/progress_theme.h"
26 #include "core/components/theme/theme_manager.h"
27 #include "core/components_ng/pattern/progress/progress_pattern.h"
28 
29 namespace OHOS::Ace::NG {
GetThemeData()30 void ProgressPaintMethod::GetThemeData()
31 {
32     auto pipeline = PipelineBase::GetCurrentContext();
33     CHECK_NULL_VOID(pipeline);
34     auto progressTheme = pipeline->GetTheme<ProgressTheme>();
35     CHECK_NULL_VOID(progressTheme);
36     color_ = progressTheme->GetTrackSelectedColor();
37     if (progressType_ == ProgressType::CAPSULE) {
38         color_ = progressTheme->GetCapsuleSelectColor();
39         bgColor_ = progressTheme->GetCapsuleBgColor();
40     } else if (progressType_ == ProgressType::RING) {
41         bgColor_ = progressTheme->GetRingProgressBgColor();
42     } else {
43         bgColor_ = progressTheme->GetTrackBgColor();
44     }
45     scaleWidth_ = progressTheme->GetScaleWidth().ConvertToPx();
46     scaleCount_ = progressTheme->GetScaleNumber();
47     borderColor_ = progressTheme->GetBorderColor();
48     capsuleBorderWidth_ = progressTheme->GetBorderWidth();
49     ringProgressEndSideColor_ = progressTheme->GetRingProgressEndSideColor();
50     ringProgressBeginSideColor_ = progressTheme->GetRingProgressBeginSideColor();
51 }
52 
CalculateStrokeWidth(const SizeF & contentSize)53 void ProgressPaintMethod::CalculateStrokeWidth(const SizeF& contentSize)
54 {
55     auto length = std::min(contentSize.Width(), contentSize.Height());
56     constexpr float HALF = 0.5;
57     switch (progressType_) {
58         case ProgressType::LINEAR:
59             strokeWidth_ = std::min(strokeWidth_, length);
60             break;
61         case ProgressType::RING:
62         case ProgressType::SCALE:
63             if (strokeWidth_ >= length * HALF) {
64                 strokeWidth_ = length * HALF * HALF;
65             }
66             break;
67         case ProgressType::MOON:
68         case ProgressType::CAPSULE:
69         default:
70             break;
71     }
72 }
73 
GenerateRingProgressColor(PaintWrapper * paintWrapper)74 Gradient ProgressPaintMethod::GenerateRingProgressColor(PaintWrapper* paintWrapper)
75 {
76     auto paintProperty = DynamicCast<ProgressPaintProperty>(paintWrapper->GetPaintProperty());
77     if (paintProperty->HasGradientColor()) {
78         return paintProperty->GetGradientColorValue();
79     }
80 
81     Gradient gradient;
82     GradientColor gradientColorEnd;
83     GradientColor gradientColorStart;
84     if (paintProperty->HasColor()) {
85         Color color = paintProperty->GetColorValue();
86         gradientColorEnd.SetLinearColor(LinearColor(color));
87         gradientColorStart.SetLinearColor(LinearColor(color));
88     } else {
89         gradientColorEnd.SetLinearColor(LinearColor(ringProgressEndSideColor_));
90         gradientColorStart.SetLinearColor(LinearColor(ringProgressBeginSideColor_));
91     }
92     gradientColorEnd.SetDimension(Dimension(0.0));
93     gradient.AddColor(gradientColorEnd);
94     gradientColorStart.SetDimension(Dimension(1.0));
95     gradient.AddColor(gradientColorStart);
96     return gradient;
97 }
98 
99 } // namespace OHOS::Ace::NG
100