1a3e0fd82Sopenharmony_ci/*
2a3e0fd82Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3a3e0fd82Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4a3e0fd82Sopenharmony_ci * you may not use this file except in compliance with the License.
5a3e0fd82Sopenharmony_ci * You may obtain a copy of the License at
6a3e0fd82Sopenharmony_ci *
7a3e0fd82Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8a3e0fd82Sopenharmony_ci *
9a3e0fd82Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10a3e0fd82Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11a3e0fd82Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12a3e0fd82Sopenharmony_ci * See the License for the specific language governing permissions and
13a3e0fd82Sopenharmony_ci * limitations under the License.
14a3e0fd82Sopenharmony_ci */
15a3e0fd82Sopenharmony_ci
16a3e0fd82Sopenharmony_ci/**
17a3e0fd82Sopenharmony_ci * @brief Defines Base renderer
18a3e0fd82Sopenharmony_ci * @since 1.0
19a3e0fd82Sopenharmony_ci * @version 1.0.
20a3e0fd82Sopenharmony_ci */
21a3e0fd82Sopenharmony_ci
22a3e0fd82Sopenharmony_ci#include "render_base.h"
23a3e0fd82Sopenharmony_ci
24a3e0fd82Sopenharmony_cinamespace OHOS {
25a3e0fd82Sopenharmony_civoid RenderBase::Attach(RenderPixfmtRgbaBlend& ren)
26a3e0fd82Sopenharmony_ci{
27a3e0fd82Sopenharmony_ci    pixfmtType_ = &ren;
28a3e0fd82Sopenharmony_ci    clipBox_.SetRect(0, 0, ren.GetWidth() - 1, ren.GetHeight() - 1);
29a3e0fd82Sopenharmony_ci}
30a3e0fd82Sopenharmony_ci
31a3e0fd82Sopenharmony_cibool RenderBase::ClipBox(int32_t x1, int32_t y1, int32_t x2, int32_t y2)
32a3e0fd82Sopenharmony_ci{
33a3e0fd82Sopenharmony_ci    Rect32 cb(x1, y1, x2, y2);
34a3e0fd82Sopenharmony_ci    cb.Normalize();
35a3e0fd82Sopenharmony_ci    if (cb.Intersect(cb, Rect32(0, 0, GetWidth() - 1, GetHeight() - 1))) {
36a3e0fd82Sopenharmony_ci        clipBox_.SetRect(cb.GetLeft(), cb.GetTop(), cb.GetRight(), cb.GetBottom());
37a3e0fd82Sopenharmony_ci        return true;
38a3e0fd82Sopenharmony_ci    }
39a3e0fd82Sopenharmony_ci    ClipBoxNaked(1, 1, 0, 0);
40a3e0fd82Sopenharmony_ci    return false;
41a3e0fd82Sopenharmony_ci}
42a3e0fd82Sopenharmony_ci
43a3e0fd82Sopenharmony_civoid RenderBase::ResetClipping(bool visibility)
44a3e0fd82Sopenharmony_ci{
45a3e0fd82Sopenharmony_ci    if (visibility) {
46a3e0fd82Sopenharmony_ci        ClipBoxNaked(0, 0, GetWidth() - 1, GetHeight() - 1);
47a3e0fd82Sopenharmony_ci    } else {
48a3e0fd82Sopenharmony_ci        ClipBoxNaked(1, 1, 0, 0);
49a3e0fd82Sopenharmony_ci    }
50a3e0fd82Sopenharmony_ci}
51a3e0fd82Sopenharmony_ci
52a3e0fd82Sopenharmony_civoid RenderBase::ClipBoxNaked(int32_t x1, int32_t y1, int32_t x2, int32_t y2)
53a3e0fd82Sopenharmony_ci{
54a3e0fd82Sopenharmony_ci    clipBox_.SetRect(x1, y1, x2, y2);
55a3e0fd82Sopenharmony_ci}
56a3e0fd82Sopenharmony_ci
57a3e0fd82Sopenharmony_civoid RenderBase::Clear(const Rgba8T& color)
58a3e0fd82Sopenharmony_ci{
59a3e0fd82Sopenharmony_ci    if (GetWidth()) {
60a3e0fd82Sopenharmony_ci        for (uint32_t y = 0; y < GetHeight(); y++) {
61a3e0fd82Sopenharmony_ci            pixfmtType_->CopyHLine(0, y, GetWidth(), color);
62a3e0fd82Sopenharmony_ci        }
63a3e0fd82Sopenharmony_ci    }
64a3e0fd82Sopenharmony_ci}
65a3e0fd82Sopenharmony_ci
66a3e0fd82Sopenharmony_civoid RenderBase::BlendHLine(int32_t x1, int32_t y, int32_t x2, const Rgba8T& color, uint8_t cover)
67a3e0fd82Sopenharmony_ci{
68a3e0fd82Sopenharmony_ci    if (x1 > x2) {
69a3e0fd82Sopenharmony_ci        int32_t swapTemp = x1;
70a3e0fd82Sopenharmony_ci        x1 = x2;
71a3e0fd82Sopenharmony_ci        x2 = swapTemp;
72a3e0fd82Sopenharmony_ci    }
73a3e0fd82Sopenharmony_ci    if (y > GetYMax() || y < GetYMin() || x1 > GetXMax() || x2 < GetXMin()) {
74a3e0fd82Sopenharmony_ci        return;
75a3e0fd82Sopenharmony_ci    }
76a3e0fd82Sopenharmony_ci    if (x1 < GetXMin()) {
77a3e0fd82Sopenharmony_ci        x1 = GetXMin();
78a3e0fd82Sopenharmony_ci    }
79a3e0fd82Sopenharmony_ci
80a3e0fd82Sopenharmony_ci    if (x2 > GetXMax()) {
81a3e0fd82Sopenharmony_ci        x2 = GetXMax();
82a3e0fd82Sopenharmony_ci    }
83a3e0fd82Sopenharmony_ci    pixfmtType_->BlendHLine(x1, y, x2 - x1 + 1, color, cover);
84a3e0fd82Sopenharmony_ci}
85a3e0fd82Sopenharmony_ci
86a3e0fd82Sopenharmony_civoid RenderBase::BlendSolidHSpan(int32_t x, int32_t y, int32_t len, const Rgba8T& color, const uint8_t* covers)
87a3e0fd82Sopenharmony_ci{
88a3e0fd82Sopenharmony_ci    if (y > GetYMax() || y < GetYMin()) {
89a3e0fd82Sopenharmony_ci        return;
90a3e0fd82Sopenharmony_ci    }
91a3e0fd82Sopenharmony_ci    if (x < GetXMin()) {
92a3e0fd82Sopenharmony_ci        len -= GetXMin() - x;
93a3e0fd82Sopenharmony_ci        if (len <= 0) {
94a3e0fd82Sopenharmony_ci            return;
95a3e0fd82Sopenharmony_ci        }
96a3e0fd82Sopenharmony_ci        covers += GetXMin() - x;
97a3e0fd82Sopenharmony_ci        x = GetXMin();
98a3e0fd82Sopenharmony_ci    }
99a3e0fd82Sopenharmony_ci    if (x + len > GetXMax()) {
100a3e0fd82Sopenharmony_ci        len = GetXMax() - x + 1;
101a3e0fd82Sopenharmony_ci        if (len <= 0) {
102a3e0fd82Sopenharmony_ci            return;
103a3e0fd82Sopenharmony_ci        }
104a3e0fd82Sopenharmony_ci    }
105a3e0fd82Sopenharmony_ci    pixfmtType_->BlendSolidHSpan(x, y, len, color, covers);
106a3e0fd82Sopenharmony_ci}
107a3e0fd82Sopenharmony_ci
108a3e0fd82Sopenharmony_civoid RenderBase::CopyColorHSpan(int32_t x, int32_t y, int32_t len, const Rgba8T* colors)
109a3e0fd82Sopenharmony_ci{
110a3e0fd82Sopenharmony_ci    const uint8_t* covers = nullptr;
111a3e0fd82Sopenharmony_ci    if (!ColorHSpanHandler(x, y, len, colors, covers)) {
112a3e0fd82Sopenharmony_ci        return;
113a3e0fd82Sopenharmony_ci    }
114a3e0fd82Sopenharmony_ci    pixfmtType_->CopyColorHSpan(x, y, len, colors);
115a3e0fd82Sopenharmony_ci}
116a3e0fd82Sopenharmony_ci
117a3e0fd82Sopenharmony_civoid RenderBase::BlendColorHSpan(int32_t x, int32_t y, int32_t len, const Rgba8T* colors, const uint8_t* covers,
118a3e0fd82Sopenharmony_ci                                 uint8_t cover)
119a3e0fd82Sopenharmony_ci{
120a3e0fd82Sopenharmony_ci    if (!ColorHSpanHandler(x, y, len, colors, covers)) {
121a3e0fd82Sopenharmony_ci        return;
122a3e0fd82Sopenharmony_ci    }
123a3e0fd82Sopenharmony_ci    pixfmtType_->BlendColorHSpan(x, y, len, colors, covers, cover);
124a3e0fd82Sopenharmony_ci}
125a3e0fd82Sopenharmony_ci
126a3e0fd82Sopenharmony_cibool RenderBase::ColorHSpanHandler(int32_t& x, const int32_t& y, int32_t& len, const Rgba8T*& colors,
127a3e0fd82Sopenharmony_ci                                   const uint8_t*& covers) const
128a3e0fd82Sopenharmony_ci{
129a3e0fd82Sopenharmony_ci    if (y > GetYMax() || y < GetYMin()) {
130a3e0fd82Sopenharmony_ci        return false;
131a3e0fd82Sopenharmony_ci    }
132a3e0fd82Sopenharmony_ci    if (x < GetXMin()) {
133a3e0fd82Sopenharmony_ci        int32_t d = GetXMin() - x;
134a3e0fd82Sopenharmony_ci        len -= d;
135a3e0fd82Sopenharmony_ci        if (len <= 0) {
136a3e0fd82Sopenharmony_ci            return false;
137a3e0fd82Sopenharmony_ci        }
138a3e0fd82Sopenharmony_ci        if (covers) {
139a3e0fd82Sopenharmony_ci            covers += d;
140a3e0fd82Sopenharmony_ci        }
141a3e0fd82Sopenharmony_ci        colors += d;
142a3e0fd82Sopenharmony_ci        x = GetXMin();
143a3e0fd82Sopenharmony_ci    }
144a3e0fd82Sopenharmony_ci    if (x + len > GetXMax()) {
145a3e0fd82Sopenharmony_ci        len = GetXMax() - x + 1;
146a3e0fd82Sopenharmony_ci        if (len <= 0) {
147a3e0fd82Sopenharmony_ci            return false;
148a3e0fd82Sopenharmony_ci        }
149a3e0fd82Sopenharmony_ci    }
150a3e0fd82Sopenharmony_ci    return true;
151a3e0fd82Sopenharmony_ci}
152a3e0fd82Sopenharmony_ci} // namespace OHOS
153