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