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 /**
17 * @brief Defines Base renderer
18 * @since 1.0
19 * @version 1.0.
20 */
21
22 #include "render_base.h"
23
24 namespace OHOS {
Attach(RenderPixfmtRgbaBlend & ren)25 void RenderBase::Attach(RenderPixfmtRgbaBlend& ren)
26 {
27 pixfmtType_ = &ren;
28 clipBox_.SetRect(0, 0, ren.GetWidth() - 1, ren.GetHeight() - 1);
29 }
30
ClipBox(int32_t x1,int32_t y1,int32_t x2,int32_t y2)31 bool RenderBase::ClipBox(int32_t x1, int32_t y1, int32_t x2, int32_t y2)
32 {
33 Rect32 cb(x1, y1, x2, y2);
34 cb.Normalize();
35 if (cb.Intersect(cb, Rect32(0, 0, GetWidth() - 1, GetHeight() - 1))) {
36 clipBox_.SetRect(cb.GetLeft(), cb.GetTop(), cb.GetRight(), cb.GetBottom());
37 return true;
38 }
39 ClipBoxNaked(1, 1, 0, 0);
40 return false;
41 }
42
ResetClipping(bool visibility)43 void RenderBase::ResetClipping(bool visibility)
44 {
45 if (visibility) {
46 ClipBoxNaked(0, 0, GetWidth() - 1, GetHeight() - 1);
47 } else {
48 ClipBoxNaked(1, 1, 0, 0);
49 }
50 }
51
ClipBoxNaked(int32_t x1,int32_t y1,int32_t x2,int32_t y2)52 void RenderBase::ClipBoxNaked(int32_t x1, int32_t y1, int32_t x2, int32_t y2)
53 {
54 clipBox_.SetRect(x1, y1, x2, y2);
55 }
56
Clear(const Rgba8T & color)57 void RenderBase::Clear(const Rgba8T& color)
58 {
59 if (GetWidth()) {
60 for (uint32_t y = 0; y < GetHeight(); y++) {
61 pixfmtType_->CopyHLine(0, y, GetWidth(), color);
62 }
63 }
64 }
65
BlendHLine(int32_t x1,int32_t y,int32_t x2,const Rgba8T & color,uint8_t cover)66 void RenderBase::BlendHLine(int32_t x1, int32_t y, int32_t x2, const Rgba8T& color, uint8_t cover)
67 {
68 if (x1 > x2) {
69 int32_t swapTemp = x1;
70 x1 = x2;
71 x2 = swapTemp;
72 }
73 if (y > GetYMax() || y < GetYMin() || x1 > GetXMax() || x2 < GetXMin()) {
74 return;
75 }
76 if (x1 < GetXMin()) {
77 x1 = GetXMin();
78 }
79
80 if (x2 > GetXMax()) {
81 x2 = GetXMax();
82 }
83 pixfmtType_->BlendHLine(x1, y, x2 - x1 + 1, color, cover);
84 }
85
BlendSolidHSpan(int32_t x,int32_t y,int32_t len,const Rgba8T & color,const uint8_t * covers)86 void RenderBase::BlendSolidHSpan(int32_t x, int32_t y, int32_t len, const Rgba8T& color, const uint8_t* covers)
87 {
88 if (y > GetYMax() || y < GetYMin()) {
89 return;
90 }
91 if (x < GetXMin()) {
92 len -= GetXMin() - x;
93 if (len <= 0) {
94 return;
95 }
96 covers += GetXMin() - x;
97 x = GetXMin();
98 }
99 if (x + len > GetXMax()) {
100 len = GetXMax() - x + 1;
101 if (len <= 0) {
102 return;
103 }
104 }
105 pixfmtType_->BlendSolidHSpan(x, y, len, color, covers);
106 }
107
CopyColorHSpan(int32_t x,int32_t y,int32_t len,const Rgba8T * colors)108 void RenderBase::CopyColorHSpan(int32_t x, int32_t y, int32_t len, const Rgba8T* colors)
109 {
110 const uint8_t* covers = nullptr;
111 if (!ColorHSpanHandler(x, y, len, colors, covers)) {
112 return;
113 }
114 pixfmtType_->CopyColorHSpan(x, y, len, colors);
115 }
116
BlendColorHSpan(int32_t x,int32_t y,int32_t len,const Rgba8T * colors,const uint8_t * covers,uint8_t cover)117 void RenderBase::BlendColorHSpan(int32_t x, int32_t y, int32_t len, const Rgba8T* colors, const uint8_t* covers,
118 uint8_t cover)
119 {
120 if (!ColorHSpanHandler(x, y, len, colors, covers)) {
121 return;
122 }
123 pixfmtType_->BlendColorHSpan(x, y, len, colors, covers, cover);
124 }
125
ColorHSpanHandler(int32_t & x,const int32_t & y,int32_t & len,const Rgba8T * & colors,const uint8_t * & covers) const126 bool RenderBase::ColorHSpanHandler(int32_t& x, const int32_t& y, int32_t& len, const Rgba8T*& colors,
127 const uint8_t*& covers) const
128 {
129 if (y > GetYMax() || y < GetYMin()) {
130 return false;
131 }
132 if (x < GetXMin()) {
133 int32_t d = GetXMin() - x;
134 len -= d;
135 if (len <= 0) {
136 return false;
137 }
138 if (covers) {
139 covers += d;
140 }
141 colors += d;
142 x = GetXMin();
143 }
144 if (x + len > GetXMax()) {
145 len = GetXMax() - x + 1;
146 if (len <= 0) {
147 return false;
148 }
149 }
150 return true;
151 }
152 } // namespace OHOS
153