1 /*
2  * Copyright (c) 2023 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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_LOADING_PROGRESS_LOADING_PROGRESS_UTILLL_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_LOADING_PROGRESS_LOADING_PROGRESS_UTILLL_H
18 
19 #include "base/geometry/dimension.h"
20 #include "base/utils/utils.h"
21 #include "core/components_ng/pattern/loading_progress/loading_progress_base.h"
22 namespace OHOS::Ace::NG {
23 namespace {
24 constexpr int32_t DEFAULT_INDEX = 3;
25 constexpr uint32_t SIZE = 6;
26 const Dimension RING_STROKE_WIDTH[] = { 1.12_vp, 1.5_vp, 1.76_vp, 1.9_vp, 2.16_vp, 2.28_vp };
27 const Dimension COMET_RADIUS[] = { 1.2_vp, 1.8_vp, 2.4_vp, 3.0_vp, 3.36_vp, 4.18_vp };
28 const Dimension DIAMETER[] = { 16.0_vp, 24.0_vp, 32.0_vp, 40.0_vp, 48.0_vp, 76.0_vp};
29 const float RING_DARK_RADIUS_16VP = 0.5f;
30 const float RING_DARK_RADIUS_40VP = 0.2f;
31 const float RING_DARK_RADIUS_76VP = 0.1f;
32 const float RING_DARK_BACKGROUND_WIDTH_40VP = 3.0f;
33 const float RING_DARK_BACKGROUND_WIDTH_76VP = 2.0f;
34 const float RING_DARK_BACKGROUND_RADIUS = 2.0f;
35 const Dimension MODE_16 = 16.0_vp;
36 const Dimension MODE_24 = 24.0_vp;
37 const Dimension MODE_32 = 32.0_vp;
38 const Dimension MODE_40 = 40.0_vp;
39 const Dimension MODE_48 = 48.0_vp;
40 const Dimension MODE_76 = 76.0_vp;
41 
42 constexpr Dimension RING_RADIUS_BASE40 = 10.5_vp;
43 constexpr Dimension ORBIT_RADIUS_BASE40 = 17.0_vp;
44 } // namespace
45 class LoadingProgressUtill {
46 public:
47     LoadingProgressUtill() = default;
48     ~LoadingProgressUtill() = default;
49 
GetRingRadius(float diameter)50     static float GetRingRadius(float diameter)
51     {
52         return RING_RADIUS_BASE40.ConvertToPx() * diameter / MODE_40.ConvertToPx();
53     }
54 
GetOrbitRadius(float diameter)55     static float GetOrbitRadius(float diameter)
56     {
57         return ORBIT_RADIUS_BASE40.ConvertToPx() * diameter / MODE_40.ConvertToPx();
58     }
59 
GetRingStrokeWidth(float diameter)60     static float GetRingStrokeWidth(float diameter)
61     {
62         if (LessOrEqual(diameter, MODE_16.ConvertToPx())) {
63             return diameter / MODE_16.ConvertToPx() * RING_STROKE_WIDTH[0].ConvertToPx();
64         } else if (GreatOrEqual(diameter, MODE_76.ConvertToPx())) {
65             return GetMostStrokeWidth(diameter);
66         } else {
67             for (uint32_t index = 1; index < SIZE; index++) {
68                 if (LessOrEqual(diameter, DIAMETER[index].ConvertToPx())) {
69                     return CalculateValue(diameter, DIAMETER[index - 1].ConvertToPx(), DIAMETER[index].ConvertToPx(),
70                         RING_STROKE_WIDTH[index - 1].ConvertToPx(), RING_STROKE_WIDTH[index].ConvertToPx());
71                 }
72             }
73         }
74         return RING_STROKE_WIDTH[DEFAULT_INDEX].ConvertToPx();
75     }
76 
GetRingDarkRadius(float diameter)77     static float GetRingDarkRadius(float diameter)
78     {
79         if (LessOrEqual(diameter, MODE_16.ConvertToPx())) {
80             return Dimension(RING_DARK_RADIUS_16VP * (diameter / MODE_40.ConvertToPx()), DimensionUnit::VP)
81                 .ConvertToPx();
82         } else if (GreatOrEqual(diameter, MODE_76.ConvertToPx())) {
83             return Dimension(RING_DARK_RADIUS_76VP * (diameter / MODE_40.ConvertToPx()), DimensionUnit::VP)
84                 .ConvertToPx();
85         } else {
86             return Dimension(RING_DARK_RADIUS_40VP * (diameter / MODE_40.ConvertToPx()), DimensionUnit::VP)
87                 .ConvertToPx();
88         }
89     }
90 
GetRingDarkBackgroundWidth(float diameter)91     static float GetRingDarkBackgroundWidth(float diameter)
92     {
93         if (LessOrEqual(diameter, MODE_40.ConvertToPx())) {
94             return Dimension(RING_DARK_BACKGROUND_WIDTH_40VP * (diameter / MODE_40.ConvertToPx()), DimensionUnit::VP)
95                 .ConvertToPx();
96         } else {
97             return Dimension(RING_DARK_BACKGROUND_WIDTH_76VP * (diameter / MODE_40.ConvertToPx()), DimensionUnit::VP)
98                 .ConvertToPx();
99         }
100     }
101 
GetRingDarkBackgroundRadius(float diameter)102     static float GetRingDarkBackgroundRadius(float diameter)
103     {
104         return Dimension(RING_DARK_BACKGROUND_RADIUS * (diameter / MODE_40.ConvertToPx()), DimensionUnit::VP)
105             .ConvertToPx();
106     }
107 
GetCometRadius(float diameter)108     static float GetCometRadius(float diameter)
109     {
110         if (LessOrEqual(diameter, MODE_16.ConvertToPx())) {
111             return diameter / MODE_16.ConvertToPx() * COMET_RADIUS[0].ConvertToPx();
112         } else if (GreatOrEqual(diameter, MODE_76.ConvertToPx())) {
113             return GetMostCometRadius(diameter);
114         } else {
115             for (uint32_t index = 1; index < SIZE; index++) {
116                 if (LessOrEqual(diameter, DIAMETER[index].ConvertToPx())) {
117                     return CalculateValue(diameter, DIAMETER[index - 1].ConvertToPx(), DIAMETER[index].ConvertToPx(),
118                         COMET_RADIUS[index - 1].ConvertToPx(), COMET_RADIUS[index].ConvertToPx());
119                 }
120             }
121         }
122         return COMET_RADIUS[DEFAULT_INDEX].ConvertToPx();
123     }
124 
GetMostStrokeWidth(float diameter)125     static float GetMostStrokeWidth(float diameter)
126     {
127         auto index_76 = static_cast<uint32_t>(LoadingProgressBase::BASE76);
128         auto strokeWidth_76 =
129             RING_STROKE_WIDTH[index_76].ConvertToPx() / (MODE_76.ConvertToPx() / MODE_40.ConvertToPx());
130         return strokeWidth_76 * (diameter / MODE_40.ConvertToPx());
131     }
132 
GetMostCometRadius(float diameter)133     static float GetMostCometRadius(float diameter)
134     {
135         auto index_76 = static_cast<uint32_t>(LoadingProgressBase::BASE76);
136         auto cometRadius_76 = COMET_RADIUS[index_76].ConvertToPx() / (MODE_76.ConvertToPx() / MODE_40.ConvertToPx());
137         return cometRadius_76 * (diameter / MODE_40.ConvertToPx());
138     }
139 
140 private:
CalculateValue(float inputValue,float minInput,float maxInput,float minOutPut,float maxOutput)141     static float CalculateValue(float inputValue, float minInput, float maxInput, float minOutPut, float maxOutput)
142     {
143         auto inputScale = (inputValue - minInput) / (maxInput - minInput);
144         return (maxOutput - minOutPut) * inputScale + minOutPut;
145     }
146 };
147 } // namespace OHOS::Ace::NG
148 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_LOADING_PROGRESS_LOADING_PROGRESS_UTILLL_H
149