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 * @file renderer_base.h
18a3e0fd82Sopenharmony_ci * @brief Defines Base renderer
19a3e0fd82Sopenharmony_ci * @since 1.0
20a3e0fd82Sopenharmony_ci * @version 1.0.
21a3e0fd82Sopenharmony_ci */
22a3e0fd82Sopenharmony_ci
23a3e0fd82Sopenharmony_ci#ifndef GRAPHIC_LITE_RENDER_BASE_H
24a3e0fd82Sopenharmony_ci#define GRAPHIC_LITE_RENDER_BASE_H
25a3e0fd82Sopenharmony_ci
26a3e0fd82Sopenharmony_ci#include "gfx_utils/diagram/common/common_basics.h"
27a3e0fd82Sopenharmony_ci#include "render/render_buffer.h"
28a3e0fd82Sopenharmony_ci#include "render/render_pixfmt_rgba_blend.h"
29a3e0fd82Sopenharmony_ci#include "gfx_utils/color.h"
30a3e0fd82Sopenharmony_cinamespace OHOS {
31a3e0fd82Sopenharmony_ciclass RenderBase {
32a3e0fd82Sopenharmony_cipublic:
33a3e0fd82Sopenharmony_ci    RenderBase() : pixfmtType_(nullptr), clipBox_(1, 1, 0, 0) {}
34a3e0fd82Sopenharmony_ci
35a3e0fd82Sopenharmony_ci    explicit RenderBase(RenderPixfmtRgbaBlend& ren)
36a3e0fd82Sopenharmony_ci        : pixfmtType_(&ren), clipBox_(0, 0, ren.GetWidth() - 1, ren.GetHeight() - 1) {}
37a3e0fd82Sopenharmony_ci
38a3e0fd82Sopenharmony_ci    /**
39a3e0fd82Sopenharmony_ci     * @brief afferent pixfmt_type param.
40a3e0fd82Sopenharmony_ci     */
41a3e0fd82Sopenharmony_ci    void Attach(RenderPixfmtRgbaBlend& ren);
42a3e0fd82Sopenharmony_ci
43a3e0fd82Sopenharmony_ci    /**
44a3e0fd82Sopenharmony_ci     * @brief Gets the width to render.
45a3e0fd82Sopenharmony_ci     */
46a3e0fd82Sopenharmony_ci    uint32_t GetWidth() const
47a3e0fd82Sopenharmony_ci    {
48a3e0fd82Sopenharmony_ci        return pixfmtType_->GetWidth();
49a3e0fd82Sopenharmony_ci    }
50a3e0fd82Sopenharmony_ci
51a3e0fd82Sopenharmony_ci    /**
52a3e0fd82Sopenharmony_ci     * @brief Gets the height to render.
53a3e0fd82Sopenharmony_ci     */
54a3e0fd82Sopenharmony_ci    uint32_t GetHeight() const
55a3e0fd82Sopenharmony_ci    {
56a3e0fd82Sopenharmony_ci        return pixfmtType_->GetHeight();
57a3e0fd82Sopenharmony_ci    }
58a3e0fd82Sopenharmony_ci
59a3e0fd82Sopenharmony_ci    /**
60a3e0fd82Sopenharmony_ci     * @brief ClipBox Sets the size of the clipping box.
61a3e0fd82Sopenharmony_ci     * @param x1 rectangular starting point x coordinate.
62a3e0fd82Sopenharmony_ci     * @param y1 rectangular starting point y coordinate.
63a3e0fd82Sopenharmony_ci     * @param x2 rectangular diagonal x coordinate.
64a3e0fd82Sopenharmony_ci     * @param y2 rectangular diagonal y coordinate.
65a3e0fd82Sopenharmony_ci     * @return Returns whether the rectangle was created successfully.
66a3e0fd82Sopenharmony_ci     */
67a3e0fd82Sopenharmony_ci    bool ClipBox(int32_t x1, int32_t y1, int32_t x2, int32_t y2);
68a3e0fd82Sopenharmony_ci
69a3e0fd82Sopenharmony_ci    /**
70a3e0fd82Sopenharmony_ci     * @brief ResetClipping Set the size of the clipping box according to the visibility,
71a3e0fd82Sopenharmony_ci     *  The visibility is set to normal, and the invisibility is set to one pixel.
72a3e0fd82Sopenharmony_ci     * @param visibility Visible.
73a3e0fd82Sopenharmony_ci     */
74a3e0fd82Sopenharmony_ci    void ResetClipping(bool visibility);
75a3e0fd82Sopenharmony_ci
76a3e0fd82Sopenharmony_ci    /**
77a3e0fd82Sopenharmony_ci     * @brief ClipBoxNaked Sets the size of the box.
78a3e0fd82Sopenharmony_ci     * @param x1 rectangular starting point x coordinate.
79a3e0fd82Sopenharmony_ci     * @param y1 rectangular starting point y coordinate.
80a3e0fd82Sopenharmony_ci     * @param x2 rectangular starting point x coordinate.
81a3e0fd82Sopenharmony_ci     * @param y2 rectangular starting point y coordinate.
82a3e0fd82Sopenharmony_ci     */
83a3e0fd82Sopenharmony_ci    void ClipBoxNaked(int32_t x1, int32_t y1, int32_t x2, int32_t y2);
84a3e0fd82Sopenharmony_ci
85a3e0fd82Sopenharmony_ci    /**
86a3e0fd82Sopenharmony_ci     * @brief inbox determines whether the point (x, y) is within the rectangle.
87a3e0fd82Sopenharmony_ci     * @param x coordinate of x point.
88a3e0fd82Sopenharmony_ci     * @param y coordinate of y point.
89a3e0fd82Sopenharmony_ci     * @return Return whether.
90a3e0fd82Sopenharmony_ci     */
91a3e0fd82Sopenharmony_ci    bool Inbox(int32_t x, int32_t y) const
92a3e0fd82Sopenharmony_ci    {
93a3e0fd82Sopenharmony_ci        return x >= clipBox_.GetLeft() && y >= clipBox_.GetTop() &&
94a3e0fd82Sopenharmony_ci               x <= clipBox_.GetRight() && y <= clipBox_.GetBottom();
95a3e0fd82Sopenharmony_ci    }
96a3e0fd82Sopenharmony_ci
97a3e0fd82Sopenharmony_ci    /**
98a3e0fd82Sopenharmony_ci     * @brief GetClipBox Get cut box.
99a3e0fd82Sopenharmony_ci     * @return Return to the corresponding box.
100a3e0fd82Sopenharmony_ci     */
101a3e0fd82Sopenharmony_ci    const Rect32& GetClipBox() const
102a3e0fd82Sopenharmony_ci    {
103a3e0fd82Sopenharmony_ci        return clipBox_;
104a3e0fd82Sopenharmony_ci    }
105a3e0fd82Sopenharmony_ci
106a3e0fd82Sopenharmony_ci    /**
107a3e0fd82Sopenharmony_ci     * @return Returns the minimum value of the x-axis of the box.
108a3e0fd82Sopenharmony_ci     */
109a3e0fd82Sopenharmony_ci    int32_t GetXMin() const
110a3e0fd82Sopenharmony_ci    {
111a3e0fd82Sopenharmony_ci        return clipBox_.GetLeft();
112a3e0fd82Sopenharmony_ci    }
113a3e0fd82Sopenharmony_ci
114a3e0fd82Sopenharmony_ci    /**
115a3e0fd82Sopenharmony_ci     * @return Returns the minimum value of the y-axis of the box.
116a3e0fd82Sopenharmony_ci     */
117a3e0fd82Sopenharmony_ci    int32_t GetYMin() const
118a3e0fd82Sopenharmony_ci    {
119a3e0fd82Sopenharmony_ci        return clipBox_.GetTop();
120a3e0fd82Sopenharmony_ci    }
121a3e0fd82Sopenharmony_ci
122a3e0fd82Sopenharmony_ci    /**
123a3e0fd82Sopenharmony_ci     * @return Returns the maximum value of the x-axis of the box.
124a3e0fd82Sopenharmony_ci     */
125a3e0fd82Sopenharmony_ci    int32_t GetXMax() const
126a3e0fd82Sopenharmony_ci    {
127a3e0fd82Sopenharmony_ci        return clipBox_.GetRight();
128a3e0fd82Sopenharmony_ci    }
129a3e0fd82Sopenharmony_ci
130a3e0fd82Sopenharmony_ci    /**
131a3e0fd82Sopenharmony_ci     * @return Returns the maximum value of the Y-axis of the box.
132a3e0fd82Sopenharmony_ci     */
133a3e0fd82Sopenharmony_ci    int32_t GetYMax() const
134a3e0fd82Sopenharmony_ci    {
135a3e0fd82Sopenharmony_ci        return clipBox_.GetBottom();
136a3e0fd82Sopenharmony_ci    }
137a3e0fd82Sopenharmony_ci
138a3e0fd82Sopenharmony_ci    /**
139a3e0fd82Sopenharmony_ci     * @brief Clear clear the pixels in the rectangle under getwidth() width and getheight() height with color.
140a3e0fd82Sopenharmony_ci     * @param color colour.
141a3e0fd82Sopenharmony_ci     */
142a3e0fd82Sopenharmony_ci    void Clear(const Rgba8T& color);
143a3e0fd82Sopenharmony_ci
144a3e0fd82Sopenharmony_ci    /**
145a3e0fd82Sopenharmony_ci     * @brief BlendHLine Render scanlines within a certain range of the X axis on the Y axis.
146a3e0fd82Sopenharmony_ci     * @param x1 Scan line left coordinate.
147a3e0fd82Sopenharmony_ci     * @param y  Scan line Y-axis coordinates.
148a3e0fd82Sopenharmony_ci     * @param x2 Scan line right coordinate.
149a3e0fd82Sopenharmony_ci     * @param c The color of the rendered scanline.
150a3e0fd82Sopenharmony_ci     * @param colors Scan line corresponding color array.
151a3e0fd82Sopenharmony_ci     */
152a3e0fd82Sopenharmony_ci    void BlendHLine(int32_t x1, int32_t y, int32_t x2, const Rgba8T& color, uint8_t cover);
153a3e0fd82Sopenharmony_ci
154a3e0fd82Sopenharmony_ci    /**
155a3e0fd82Sopenharmony_ci     * @brief BlendSolidHSpan Renders a scan line of a solid line within a certain range of the Y axis.
156a3e0fd82Sopenharmony_ci     * @param x scan line X-axis start coordinate.
157a3e0fd82Sopenharmony_ci     * @param y scan line Y-axis start coordinate.
158a3e0fd82Sopenharmony_ci     * @param len Scan line length.
159a3e0fd82Sopenharmony_ci     * @param c The color of the rendered scanline.
160a3e0fd82Sopenharmony_ci     * @param colors Scan line corresponding color array.
161a3e0fd82Sopenharmony_ci     */
162a3e0fd82Sopenharmony_ci    void BlendSolidHSpan(int32_t x, int32_t y, int32_t len, const Rgba8T& color, const uint8_t* covers);
163a3e0fd82Sopenharmony_ci
164a3e0fd82Sopenharmony_ci    /**
165a3e0fd82Sopenharmony_ci     * @brief CopyColorHSpan Copy colors within a certain Y-axis range
166a3e0fd82Sopenharmony_ci     * @param x Scan line X-axis start coordinate
167a3e0fd82Sopenharmony_ci     * @param y Scan line Y-axis start coordinate
168a3e0fd82Sopenharmony_ci     * @param len Scan line length.
169a3e0fd82Sopenharmony_ci     * @param colors Scan line corresponding color array.
170a3e0fd82Sopenharmony_ci     */
171a3e0fd82Sopenharmony_ci    void CopyColorHSpan(int32_t x, int32_t y, int32_t len, const Rgba8T* colors);
172a3e0fd82Sopenharmony_ci
173a3e0fd82Sopenharmony_ci    /**
174a3e0fd82Sopenharmony_ci     * @brief BlendColorHSpan Mix colors within a certain height.
175a3e0fd82Sopenharmony_ci     * @param x Scan line X-axis start coordinate
176a3e0fd82Sopenharmony_ci     * @param y Scan line Y-axis start coordinate
177a3e0fd82Sopenharmony_ci     * @param len Scan line length.
178a3e0fd82Sopenharmony_ci     * @param colors Scan line corresponding color array.
179a3e0fd82Sopenharmony_ci     * @param covers Scan line corresponding coverage array.
180a3e0fd82Sopenharmony_ci     * @param cover Coverage
181a3e0fd82Sopenharmony_ci     */
182a3e0fd82Sopenharmony_ci    void BlendColorHSpan(int32_t x, int32_t y, int32_t len, const Rgba8T* colors, const uint8_t* covers,
183a3e0fd82Sopenharmony_ci                         uint8_t cover = COVER_FULL);
184a3e0fd82Sopenharmony_ci
185a3e0fd82Sopenharmony_ci    /**
186a3e0fd82Sopenharmony_ci     * @brief ColorHSpanHandler Handle ColorHSpan params.
187a3e0fd82Sopenharmony_ci     * @param x Scan line X-axis start coordinate
188a3e0fd82Sopenharmony_ci     * @param y Scan line Y-axis start coordinate
189a3e0fd82Sopenharmony_ci     * @param len Scan line length.
190a3e0fd82Sopenharmony_ci     * @param colors Scan line corresponding color array.
191a3e0fd82Sopenharmony_ci     * @param covers Scan line corresponding coverage array.
192a3e0fd82Sopenharmony_ci     * @return Returns true if should run the follow programs.
193a3e0fd82Sopenharmony_ci     */
194a3e0fd82Sopenharmony_ci    bool ColorHSpanHandler(int32_t& x, const int32_t& y, int32_t& len, const Rgba8T*& colors,
195a3e0fd82Sopenharmony_ci                           const uint8_t*& covers) const;
196a3e0fd82Sopenharmony_ci
197a3e0fd82Sopenharmony_ciprivate:
198a3e0fd82Sopenharmony_ci    RenderPixfmtRgbaBlend* pixfmtType_;
199a3e0fd82Sopenharmony_ci    Rect32 clipBox_;
200a3e0fd82Sopenharmony_ci};
201a3e0fd82Sopenharmony_ci} // namespace OHOS
202a3e0fd82Sopenharmony_ci#endif
203