1a3e0fd82Sopenharmony_ci/*
2a3e0fd82Sopenharmony_ci * Copyright (c) 2020-2021 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#ifndef GRAPHIC_LITE_SCREEN_DEVICE_H
17a3e0fd82Sopenharmony_ci#define GRAPHIC_LITE_SCREEN_DEVICE_H
18a3e0fd82Sopenharmony_ci
19a3e0fd82Sopenharmony_ci#include "gfx_utils/color.h"
20a3e0fd82Sopenharmony_ci#include "gfx_utils/graphic_assert.h"
21a3e0fd82Sopenharmony_ci#include "gfx_utils/rect.h"
22a3e0fd82Sopenharmony_ci#include "graphic_semaphore.h"
23a3e0fd82Sopenharmony_ci#if ENABLE_WINDOW
24a3e0fd82Sopenharmony_ci#include "gfx_utils/pixel_format_utils.h"
25a3e0fd82Sopenharmony_ci#endif
26a3e0fd82Sopenharmony_ci
27a3e0fd82Sopenharmony_cinamespace OHOS {
28a3e0fd82Sopenharmony_ci#if ENABLE_WINDOW
29a3e0fd82Sopenharmony_cistruct AllocationInfo {
30a3e0fd82Sopenharmony_ci    uint8_t* virAddr;
31a3e0fd82Sopenharmony_ci    uint8_t* phyAddr;
32a3e0fd82Sopenharmony_ci    uint16_t width;
33a3e0fd82Sopenharmony_ci    uint16_t height;
34a3e0fd82Sopenharmony_ci    uint32_t stride;
35a3e0fd82Sopenharmony_ci    ImagePixelFormat pixelFormat;
36a3e0fd82Sopenharmony_ci};
37a3e0fd82Sopenharmony_ci#endif
38a3e0fd82Sopenharmony_ci
39a3e0fd82Sopenharmony_ci#ifndef TRANSFORMOPTION
40a3e0fd82Sopenharmony_ci#define TRANSFORMOPTION
41a3e0fd82Sopenharmony_cistruct TransformOption {
42a3e0fd82Sopenharmony_ci    TransformAlgorithm algorithm;
43a3e0fd82Sopenharmony_ci};
44a3e0fd82Sopenharmony_ci#endif
45a3e0fd82Sopenharmony_ci
46a3e0fd82Sopenharmony_ci/** @brief A semaphore for display buffer flushing. */
47a3e0fd82Sopenharmony_ciclass FlushSem : public HeapBase {
48a3e0fd82Sopenharmony_cipublic:
49a3e0fd82Sopenharmony_ci    /**
50a3e0fd82Sopenharmony_ci     * Constructor
51a3e0fd82Sopenharmony_ci     *
52a3e0fd82Sopenharmony_ci     * @param [in] isFlushing (Optional) True if is flushing, false if not.
53a3e0fd82Sopenharmony_ci     */
54a3e0fd82Sopenharmony_ci    FlushSem(bool isFlushing = false) : sem_(1, 1), isFlushing_(isFlushing) {}
55a3e0fd82Sopenharmony_ci
56a3e0fd82Sopenharmony_ci    /**
57a3e0fd82Sopenharmony_ci     * @brief Destructor
58a3e0fd82Sopenharmony_ci     */
59a3e0fd82Sopenharmony_ci    virtual ~FlushSem() {}
60a3e0fd82Sopenharmony_ci
61a3e0fd82Sopenharmony_ci    /** Notifies the buffer is flushing end */
62a3e0fd82Sopenharmony_ci    void Notify()
63a3e0fd82Sopenharmony_ci    {
64a3e0fd82Sopenharmony_ci        isFlushing_ = false;
65a3e0fd82Sopenharmony_ci        sem_.Notify();
66a3e0fd82Sopenharmony_ci    }
67a3e0fd82Sopenharmony_ci
68a3e0fd82Sopenharmony_ci    /** Waits the buffer is flushing */
69a3e0fd82Sopenharmony_ci    void Wait()
70a3e0fd82Sopenharmony_ci    {
71a3e0fd82Sopenharmony_ci        while (isFlushing_) {
72a3e0fd82Sopenharmony_ci            sem_.Wait();
73a3e0fd82Sopenharmony_ci        }
74a3e0fd82Sopenharmony_ci    }
75a3e0fd82Sopenharmony_ci
76a3e0fd82Sopenharmony_ci    /** set the flag as flashing */
77a3e0fd82Sopenharmony_ci    void Flushing()
78a3e0fd82Sopenharmony_ci    {
79a3e0fd82Sopenharmony_ci        isFlushing_ = true;
80a3e0fd82Sopenharmony_ci    }
81a3e0fd82Sopenharmony_ci
82a3e0fd82Sopenharmony_ciprivate:
83a3e0fd82Sopenharmony_ci    GraphicSemaphore sem_;
84a3e0fd82Sopenharmony_ci    bool isFlushing_;
85a3e0fd82Sopenharmony_ci};
86a3e0fd82Sopenharmony_ci
87a3e0fd82Sopenharmony_ci/** @brief A display device. */
88a3e0fd82Sopenharmony_ciclass ScreenDevice : public HeapBase {
89a3e0fd82Sopenharmony_cipublic:
90a3e0fd82Sopenharmony_ci    /**
91a3e0fd82Sopenharmony_ci     * @brief Constructor
92a3e0fd82Sopenharmony_ci     */
93a3e0fd82Sopenharmony_ci    ScreenDevice() {}
94a3e0fd82Sopenharmony_ci
95a3e0fd82Sopenharmony_ci    /**
96a3e0fd82Sopenharmony_ci     * @brief Destructor
97a3e0fd82Sopenharmony_ci     */
98a3e0fd82Sopenharmony_ci    virtual ~ScreenDevice() {}
99a3e0fd82Sopenharmony_ci
100a3e0fd82Sopenharmony_ci    virtual void Flush(int16_t x1, int16_t y1, int16_t x2, int16_t y2, const uint8_t* buffer, ColorMode mode) {}
101a3e0fd82Sopenharmony_ci
102a3e0fd82Sopenharmony_ci    virtual void Fill(int16_t x1, int16_t y1, int16_t x2, int16_t y2, const ColorType& color) {}
103a3e0fd82Sopenharmony_ci
104a3e0fd82Sopenharmony_ci    /**
105a3e0fd82Sopenharmony_ci     * @brief Hardware accelerated filling interface implemented by the product platform
106a3e0fd82Sopenharmony_ci     * @param fillArea Indicates the area to be filled
107a3e0fd82Sopenharmony_ci     * @param color Indicates the color to be filled
108a3e0fd82Sopenharmony_ci     * @param opa Indicates the transparency
109a3e0fd82Sopenharmony_ci     * @param dst Indicates the start address of destination memory
110a3e0fd82Sopenharmony_ci     * @param dstStride Indicates the number of bytes in a single row of destination memory
111a3e0fd82Sopenharmony_ci     * @param dstColorMode Indicates the color format of destination memory
112a3e0fd82Sopenharmony_ci     * @return Return true on success, false on failure
113a3e0fd82Sopenharmony_ci     * @since 5.0
114a3e0fd82Sopenharmony_ci     * @version 3.0
115a3e0fd82Sopenharmony_ci     */
116a3e0fd82Sopenharmony_ci    virtual bool HardwareFill(const Rect& fillArea,
117a3e0fd82Sopenharmony_ci                              uint32_t color,
118a3e0fd82Sopenharmony_ci                              OpacityType opa,
119a3e0fd82Sopenharmony_ci                              uint8_t* dst,
120a3e0fd82Sopenharmony_ci                              uint32_t dstStride,
121a3e0fd82Sopenharmony_ci                              ColorMode dstColorMode)
122a3e0fd82Sopenharmony_ci    {
123a3e0fd82Sopenharmony_ci        return false;
124a3e0fd82Sopenharmony_ci    }
125a3e0fd82Sopenharmony_ci
126a3e0fd82Sopenharmony_ci    /**
127a3e0fd82Sopenharmony_ci     * @brief Hardware accelerated blending interface implemented by the product platform
128a3e0fd82Sopenharmony_ci     * @param src Indicates the start address of source memory
129a3e0fd82Sopenharmony_ci     * @param srcRect Indicates the area of ​​the source memory for color blending
130a3e0fd82Sopenharmony_ci     * @param srcStride Indicates the number of bytes in a single row of source memory
131a3e0fd82Sopenharmony_ci     * @param srcLineNumber Indicates the number of source memory rows
132a3e0fd82Sopenharmony_ci     * @param srcColorMode Indicates the source memory color format
133a3e0fd82Sopenharmony_ci     * @param color 32-bit XRGB8888 value
134a3e0fd82Sopenharmony_ci     *              (valid when the source memory is in a format with only alpha information such as A1)
135a3e0fd82Sopenharmony_ci     * @param opa Indicates the transparency
136a3e0fd82Sopenharmony_ci     * @param dst Indicates the start address of destination memory
137a3e0fd82Sopenharmony_ci     * @param dstStride Indicates the number of bytes in a single row of destination memory
138a3e0fd82Sopenharmony_ci     * @param dstColorMode Indicates the color format of destination memory
139a3e0fd82Sopenharmony_ci     * @param x The x coordinate of the upper left vertex of the destination memory for color blending
140a3e0fd82Sopenharmony_ci     * @param y The y coordinate of the upper left vertex of the destination memory for color blending
141a3e0fd82Sopenharmony_ci     * @return Return true on success, false on failure
142a3e0fd82Sopenharmony_ci     * @since 5.0
143a3e0fd82Sopenharmony_ci     * @version 3.0
144a3e0fd82Sopenharmony_ci     */
145a3e0fd82Sopenharmony_ci    virtual bool HardwareBlend(const uint8_t* src,
146a3e0fd82Sopenharmony_ci                               const Rect& srcRect,
147a3e0fd82Sopenharmony_ci                               uint32_t srcStride,
148a3e0fd82Sopenharmony_ci                               uint32_t srcLineNumber,
149a3e0fd82Sopenharmony_ci                               ColorMode srcColorMode,
150a3e0fd82Sopenharmony_ci                               uint32_t color,
151a3e0fd82Sopenharmony_ci                               OpacityType opa,
152a3e0fd82Sopenharmony_ci                               uint8_t* dst,
153a3e0fd82Sopenharmony_ci                               uint32_t dstStride,
154a3e0fd82Sopenharmony_ci                               ColorMode dstColorMode,
155a3e0fd82Sopenharmony_ci                               uint32_t x,
156a3e0fd82Sopenharmony_ci                               uint32_t y)
157a3e0fd82Sopenharmony_ci    {
158a3e0fd82Sopenharmony_ci        return false;
159a3e0fd82Sopenharmony_ci    }
160a3e0fd82Sopenharmony_ci
161a3e0fd82Sopenharmony_ci    /**
162a3e0fd82Sopenharmony_ci     * @brief Hardware accelerated transformation interface implemented by the product platform
163a3e0fd82Sopenharmony_ci     * @param src Indicates the start address of the source image
164a3e0fd82Sopenharmony_ci     * @param srcColorMode Indicates the color format of the source image
165a3e0fd82Sopenharmony_ci     * @param srcRect Indicates the position of the source image in the destination memory and its width and height
166a3e0fd82Sopenharmony_ci     * @param transformMatrix  Indicates the transformation matrix
167a3e0fd82Sopenharmony_ci     * @param opa Indicates the transparency
168a3e0fd82Sopenharmony_ci     * @param color 32-bit XRGB8888 value
169a3e0fd82Sopenharmony_ci     *              (valid when the source memory is in a format with only alpha information such as A1)
170a3e0fd82Sopenharmony_ci     * @param mask Indicates the masking rectangle, and the content beyond the rectangle is not drawn
171a3e0fd82Sopenharmony_ci     * @param dst Indicates the start address of destination memory
172a3e0fd82Sopenharmony_ci     * @param dstStride Indicates the number of bytes in a single row of destination memory
173a3e0fd82Sopenharmony_ci     * @param dstColorMode Indicates the color format of destination memory
174a3e0fd82Sopenharmony_ci     * @param option Indicates the optional setting items for transformation operation
175a3e0fd82Sopenharmony_ci     * @return Return true on success, false on failure
176a3e0fd82Sopenharmony_ci     * @since 5.0
177a3e0fd82Sopenharmony_ci     * @version 3.0
178a3e0fd82Sopenharmony_ci     */
179a3e0fd82Sopenharmony_ci    virtual bool HardwareTransform(const uint8_t* src,
180a3e0fd82Sopenharmony_ci                                   ColorMode srcColorMode,
181a3e0fd82Sopenharmony_ci                                   const Rect& srcRect,
182a3e0fd82Sopenharmony_ci                                   const Matrix3<float>& transformMatrix,
183a3e0fd82Sopenharmony_ci                                   OpacityType opa,
184a3e0fd82Sopenharmony_ci                                   uint32_t color,
185a3e0fd82Sopenharmony_ci                                   const Rect& mask,
186a3e0fd82Sopenharmony_ci                                   uint8_t* dst,
187a3e0fd82Sopenharmony_ci                                   uint32_t dstStride,
188a3e0fd82Sopenharmony_ci                                   ColorMode dstColorMode,
189a3e0fd82Sopenharmony_ci                                   const TransformOption& option)
190a3e0fd82Sopenharmony_ci    {
191a3e0fd82Sopenharmony_ci        return false;
192a3e0fd82Sopenharmony_ci    }
193a3e0fd82Sopenharmony_ci
194a3e0fd82Sopenharmony_ci    virtual void SnapShot(uint32_t len,
195a3e0fd82Sopenharmony_ci                          bool justCopy,
196a3e0fd82Sopenharmony_ci                          uint8_t* dest,
197a3e0fd82Sopenharmony_ci                          const Rect& rect,
198a3e0fd82Sopenharmony_ci                          bool justRender)
199a3e0fd82Sopenharmony_ci    {
200a3e0fd82Sopenharmony_ci    }
201a3e0fd82Sopenharmony_ci
202a3e0fd82Sopenharmony_ci    virtual void RenderFinish(const Rect& mask) {}
203a3e0fd82Sopenharmony_ci};
204a3e0fd82Sopenharmony_ci} // namespace OHOS
205a3e0fd82Sopenharmony_ci#endif // GRAPHIC_LITE_SCREEN_DEVICE_H