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 #ifndef GRAPHIC_LITE_DRAW_ARC_H
17 #define GRAPHIC_LITE_DRAW_ARC_H
18 #include "common/image.h"
19 #include "draw_image.h"
20 #include "draw_utils.h"
21 #include "gfx_utils/graphic_math.h"
22 #include "gfx_utils/heap_base.h"
23 #include "imgdecode/cache_manager.h"
24 #include "gfx_utils/style.h"
25 
26 namespace OHOS {
27 class DrawArc : public HeapBase {
28 public:
29     static DrawArc* GetInstance();
30 
31     void GetDrawRange(int16_t& start, int16_t& end);
32 
33     void Draw(BufferInfo& gfxDstBuffer, ArcInfo& arcInfo, const Rect& mask,
34               const Style& style, uint8_t opaScale, uint8_t cap);
35 
36 private:
37     static constexpr uint8_t DRAW_ARC_QUADRANT_NUM = 4;
38     static constexpr uint8_t ARC_QUADRANT_ONE = 0;
39     static constexpr uint8_t ARC_QUADRANT_TWO = 1;
40     static constexpr uint8_t ARC_QUADRANT_THREE = 2;
41     static constexpr uint8_t ARC_QUADRANT_FOUR = 3;
42     static constexpr int16_t IN_DEGREE_RANG = 0;
43     static constexpr int16_t OUT_DEGREE_RANG = 1;
44     static constexpr int16_t INTERSECT = 2;
45     static constexpr int16_t DOUBLE_INTERSECT = 3;
46 
47     int16_t lineStart_;
48     int16_t lineEnd_;
49     int16_t outAntiStart_;
50     int16_t outAntiEnd_;
51     int16_t inAntiStart_;
52     int16_t inAntiEnd_;
53     int16_t y_;
54     int16_t outRadius_;
55     int16_t inRadius_;
56     uint32_t ySqr_;
57     uint32_t outRadiusSqr_;
58     uint32_t inRadiusSqr_;
59     bool isCircle_;
60     uint32_t antiOutRadiusSqr_;
61     uint32_t antiInRadiusSqr_;
62 
DrawArc()63     DrawArc()
64         : lineStart_(0),
65           lineEnd_(0),
66           outAntiStart_(0),
67           outAntiEnd_(0),
68           inAntiStart_(0),
69           inAntiEnd_(0),
70           y_(0),
71           outRadius_(0),
72           inRadius_(0),
73           ySqr_(0),
74           outRadiusSqr_(0),
75           inRadiusSqr_(0),
76           isCircle_(false),
77           antiOutRadiusSqr_(0),
78           antiInRadiusSqr_(0)
79     {
80     }
81 
~DrawArc()82     ~DrawArc() {}
83 
84     void DrawVerLine(BufferInfo& gfxDstBuffer,
85                      const Point& begin,
86                      const Point& imgPos,
87                      const Rect& mask,
88                      int16_t len,
89                      const Style& style,
90                      uint8_t opaScale,
91                      const Image* imgSrc);
92 
93     void DrawHorLine(BufferInfo& gfxDstBuffer,
94                      const Point& begin,
95                      const Point& imgPos,
96                      const Rect& mask,
97                      int16_t len,
98                      const Style& style,
99                      uint8_t opaScale,
100                      const Image* imgSrc);
101 
102     void DrawImg(BufferInfo& gfxDstBuffer,
103                  const Point& imgPos,
104                  Rect& area,
105                  const Rect& invalidatedArea,
106                  const Style& style,
107                  uint8_t opaScale,
108                  const Image* imgSrc);
109 
110     int16_t GetDegreeRangeIntersectState(uint16_t degreeStart, uint16_t degreeEnd, uint16_t start, uint16_t end);
111 
112     uint16_t CalculateTanDegree(uint16_t x, uint16_t y);
113 
114     int16_t GetDrawAngle(int16_t angle);
115 
116     void DrawCircleNoEndpoint(BufferInfo& gfxDstBuffer, ArcInfo& arcInfo, const Rect& mask, const Style& style,
117                               uint8_t opa, bool anti);
118 
119     void DrawAxisLine(BufferInfo& gfxDstBuffer, ArcInfo& arcInfo, const Rect& mask, const Style& style, uint8_t opa);
120 
121     void DrawLineWithDegree(BufferInfo& gfxDstBuffer,
122                             ArcInfo& arcInfo,
123                             int16_t start,
124                             int16_t end,
125                             int16_t y,
126                             const Rect& mask,
127                             const Style& style,
128                             uint8_t opaScale,
129                             uint8_t quadrant);
130 
131     int16_t DrawLineWithDegreeInner(BufferInfo& gfxDstBuffer,
132                                     ArcInfo& arcInfo,
133                                     int16_t start,
134                                     int16_t end,
135                                     int16_t y,
136                                     const Rect& mask,
137                                     const Style& style,
138                                     uint8_t opaScale,
139                                     uint8_t quadrant);
140 #if defined(ENABLE_ANTIALIAS) && ENABLE_ANTIALIAS
141     void DrawLineAnti(BufferInfo& gfxDstBuffer, ArcInfo& arcInfo, const Rect& mask, const Style& style, uint8_t opa);
142     void DrawPointAnti(BufferInfo& gfxDstBuffer,
143                        ArcInfo& arcInfo,
144                        int16_t x,
145                        const Rect& mask,
146                        const Style& style,
147                        uint8_t antiOpa);
148 #endif
149     uint16_t GetDegreeInQuadrant(uint16_t degree, uint8_t quadrant);
150     void SetArcInfo(ArcInfo& arcInfo, const Style& style);
151     void CalculatedYStartAndYEnd(int16_t& yStart, int16_t& yEnd);
152 };
153 } // namespace OHOS
154 #endif // GRAPHIC_LITE_DRAW_ARC_H
155