• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020-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 "components/ui_circle_progress.h"
17 #include "draw/draw_arc.h"
18 #include "draw/draw_line.h"
19 #include "engines/gfx/gfx_engine_manager.h"
20 
21 namespace OHOS {
UICircleProgress()22 UICircleProgress::UICircleProgress()
23     : center_({0, 0}),
24       backgroundImagePos_({0, 0}),
25       progressImagePos_({0, 0}),
26       radius_(0),
27       startAngle_(MIN_ANGLE_VALUE),
28       endAngle_(MAX_ANGLE_VALUE)
29 {
30 }
31 
SetCenterPosition(int16_t x,int16_t y)32 void UICircleProgress::SetCenterPosition(int16_t x, int16_t y)
33 {
34     center_.x = x;
35     center_.y = y;
36 }
37 
SetStartAngle(int16_t startAngle)38 void UICircleProgress::SetStartAngle(int16_t startAngle)
39 {
40     startAngle_ = startAngle;
41 }
42 
SetEndAngle(int16_t endAngle)43 void UICircleProgress::SetEndAngle(int16_t endAngle)
44 {
45     endAngle_ = endAngle;
46 }
47 
GetStartEndAngle(int16_t & start,int16_t & end) const48 void UICircleProgress::GetStartEndAngle(int16_t& start, int16_t& end) const
49 {
50     if (startAngle_ > endAngle_) {
51         start = endAngle_;
52         end = startAngle_;
53     } else {
54         start = startAngle_;
55         end = endAngle_;
56     }
57 }
58 
GetAngleRange(int16_t & start,int16_t & end) const59 void UICircleProgress::GetAngleRange(int16_t& start, int16_t& end) const
60 {
61     GetStartEndAngle(start, end);
62     DrawArc::GetInstance()->GetDrawRange(start, end);
63 }
64 
GetRedrawAngle(int16_t & start,int16_t & end) const65 void UICircleProgress::GetRedrawAngle(int16_t& start, int16_t& end) const
66 {
67     GetStartEndAngle(start, end);
68 
69     if (startAngle_ == endAngle_) {
70         return;
71     }
72 
73     int16_t angleRange = end - start;
74     angleRange = (angleRange > CIRCLE_IN_DEGREE) ? CIRCLE_IN_DEGREE : angleRange;
75 
76     int16_t angle = GetCurrentPos(angleRange);
77     if (startAngle_ > endAngle_) {
78         start = end - angle;
79     } else {
80         end = angle + start;
81     }
82     DrawArc::GetInstance()->GetDrawRange(start, end);
83 }
84 
DrawCommonCircle(BufferInfo & gfxDstBuffer,const Rect & invalidatedArea)85 void UICircleProgress::DrawCommonCircle(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea)
86 {
87     ArcInfo arcinfo = {{0}};
88     arcinfo.radius = radius_;
89     int16_t endAngle;
90     int16_t startAngle;
91     GetRedrawAngle(startAngle, endAngle);
92 
93     int16_t start;
94     int16_t end;
95     GetAngleRange(start, end);
96     Rect rect = GetOrigRect();
97     arcinfo.center.x = center_.x + rect.GetLeft() + style_->paddingLeft_ + style_->borderWidth_;
98     arcinfo.center.y = center_.y + rect.GetTop() + style_->paddingTop_ + style_->borderWidth_;
99     BaseGfxEngine* baseGfxEngine = BaseGfxEngine::GetInstance();
100     if (enableBackground_ && ((start != end) || (backgroundStyle_->lineCap_ == CapType::CAP_ROUND))) {
101         arcinfo.imgPos.x = backgroundImagePos_.x + rect.GetLeft();
102         arcinfo.imgPos.y = backgroundImagePos_.y + rect.GetTop();
103         arcinfo.startAngle = start;
104         arcinfo.endAngle = end;
105         arcinfo.imgSrc = backgroundImage_;
106         baseGfxEngine->DrawArc(gfxDstBuffer, arcinfo, invalidatedArea, *backgroundStyle_, opaScale_,
107                                backgroundStyle_->lineCap_);
108     }
109 
110     if ((startAngle != endAngle) || (foregroundStyle_->lineCap_ == CapType::CAP_ROUND)) {
111         arcinfo.imgPos.x = progressImagePos_.x + rect.GetLeft();
112         arcinfo.imgPos.y = progressImagePos_.y + rect.GetTop();
113         arcinfo.startAngle = startAngle;
114         arcinfo.endAngle = endAngle;
115         arcinfo.imgSrc = foregroundImage_;
116         baseGfxEngine->DrawArc(gfxDstBuffer, arcinfo, invalidatedArea, *foregroundStyle_, opaScale_,
117                                foregroundStyle_->lineCap_);
118     }
119 }
120 
OnDraw(BufferInfo & gfxDstBuffer,const Rect & invalidatedArea)121 void UICircleProgress::OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea)
122 {
123     if (GetRangeSize() == 0) {
124         return;
125     }
126 
127     BaseGfxEngine::GetInstance()->DrawRect(gfxDstBuffer, GetOrigRect(), invalidatedArea, *style_, opaScale_);
128 
129     Rect trunc(invalidatedArea);
130     if (trunc.Intersect(trunc, GetOrigRect())) {
131         DrawCommonCircle(gfxDstBuffer, trunc);
132     }
133 }
134 } // namespace OHOS
135