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 #ifndef GRAPHIC_ADAPTER_H
17 #define GRAPHIC_ADAPTER_H
18 
19 #include <functional>
20 
21 namespace OHOS::NWeb {
22 
23 enum class VSyncErrorCode {
24     SUCCESS,
25     ERROR,
26 };
27 
28 typedef void (*NWebVSyncCb)(int64_t, void*);
29 
30 class VSyncAdapter {
31 public:
32     VSyncAdapter() = default;
33 
34     virtual ~VSyncAdapter() = default;
35 
36     virtual VSyncErrorCode RequestVsync(void* data, NWebVSyncCb cb) = 0;
37 
38     virtual int64_t GetVSyncPeriod() = 0;
39 
40     virtual void SetFrameRateLinkerEnable(bool enabled) = 0;
41 
42     virtual void SetFramePreferredRate(int32_t preferredRate) = 0;
43 
44     virtual void SetOnVsyncCallback(void (*callback)()) = 0;
45 
SetOnVsyncEndCallback(void (* onVsyncEndCallback)())46     virtual void SetOnVsyncEndCallback(void (*onVsyncEndCallback)()) {}
47 };
48 
49 // be consistent with rom/foundation/graphic/graphic_2d/interfaces/inner_api/common/graphic_common_c.h:GSError
50 enum GSErrorCode {
51     GSERROR_OK = 0,
52 };
53 
54 // be consistent with rom/drivers/peripheral/display/interfaces/include/display_type.h:PixelFormat
55 enum PixelFormatAdapter {
56     PIXEL_FMT_CLUT8 = 0,                /**< CLUT8 format */
57     PIXEL_FMT_CLUT1,                    /**< CLUT1 format */
58     PIXEL_FMT_CLUT4,                    /**< CLUT4 format */
59     PIXEL_FMT_RGB_565,                  /**< RGB565 format */
60     PIXEL_FMT_RGBA_5658,                /**< RGBA5658 format */
61     PIXEL_FMT_RGBX_4444,                /**< RGBX4444 format */
62     PIXEL_FMT_RGBA_4444,                /**< RGBA4444 format */
63     PIXEL_FMT_RGB_444,                  /**< RGB444 format */
64     PIXEL_FMT_RGBX_5551,                /**< RGBX5551 format */
65     PIXEL_FMT_RGBA_5551,                /**< RGBA5551 format */
66     PIXEL_FMT_RGB_555,                  /**< RGB555 format */
67     PIXEL_FMT_RGBX_8888,                /**< RGBX8888 format */
68     PIXEL_FMT_RGBA_8888,                /**< RGBA8888 format */
69     PIXEL_FMT_RGB_888,                  /**< RGB888 format */
70     PIXEL_FMT_BGR_565,                  /**< BGR565 format */
71     PIXEL_FMT_BGRX_4444,                /**< BGRX4444 format */
72     PIXEL_FMT_BGRA_4444,                /**< BGRA4444 format */
73     PIXEL_FMT_BGRX_5551,                /**< BGRX5551 format */
74     PIXEL_FMT_BGRA_5551,                /**< BGRA5551 format */
75     PIXEL_FMT_BGRX_8888,                /**< BGRX8888 format */
76     PIXEL_FMT_BGRA_8888,                /**< BGRA8888 format */
77     PIXEL_FMT_YUV_422_I,                /**< YUV422 interleaved format */
78     PIXEL_FMT_YCBCR_422_SP,             /**< YCBCR422 semi-planar format */
79     PIXEL_FMT_YCRCB_422_SP,             /**< YCRCB422 semi-planar format */
80     PIXEL_FMT_YCBCR_420_SP,             /**< YCBCR420 semi-planar format */
81     PIXEL_FMT_YCRCB_420_SP,             /**< YCRCB420 semi-planar format */
82     PIXEL_FMT_YCBCR_422_P,              /**< YCBCR422 planar format */
83     PIXEL_FMT_YCRCB_422_P,              /**< YCRCB422 planar format */
84     PIXEL_FMT_YCBCR_420_P,              /**< YCBCR420 planar format */
85     PIXEL_FMT_YCRCB_420_P,              /**< YCRCB420 planar format */
86     PIXEL_FMT_YUYV_422_PKG,             /**< YUYV422 packed format */
87     PIXEL_FMT_UYVY_422_PKG,             /**< UYVY422 packed format */
88     PIXEL_FMT_YVYU_422_PKG,             /**< YVYU422 packed format */
89     PIXEL_FMT_VYUY_422_PKG,             /**< VYUY422 packed format */
90     PIXEL_FMT_VENDER_MASK = 0X7FFF0000, /**< vendor mask format */
91     PIXEL_FMT_BUTT = 0X7FFFFFFF         /**< Invalid pixel format */
92 };
93 
94 enum class ColorGamutAdapter : int32_t {
95     INVALID = -1,        /**< Invalid */
96     NATIVE = 0,          /**< Native or default */
97     STANDARD_BT601 = 1,  /**< Standard BT601 */
98     STANDARD_BT709 = 2,  /**< Standard BT709 */
99     DCI_P3 = 3,          /**< DCI P3 */
100     SRGB = 4,            /**< SRGB */
101     ADOBE_RGB = 5,       /**< Adobe RGB */
102     DISPLAY_P3 = 6,      /**< display P3 */
103     BT2020 = 7,          /**< BT2020 */
104     BT2100_PQ = 8,       /**< BT2100 PQ */
105     BT2100_HLG = 9,      /**< BT2100 HLG */
106     DISPLAY_BT2020 = 10, /**< Display BT2020 */
107 };
108 
109 enum class TransformTypeAdapter : int32_t {
110     ROTATE_NONE = 0, /**< No rotation */
111     ROTATE_90,       /**< Rotation by 90 degrees */
112     ROTATE_180,      /**< Rotation by 180 degrees */
113     ROTATE_270,      /**< Rotation by 270 degrees */
114     FLIP_H,          /**< Flip horizontally */
115     FLIP_V,          /**< Flip vertically */
116     FLIP_H_ROT90,    /**< Flip horizontally and rotate 90 degrees */
117     FLIP_V_ROT90,    /**< Flip vertically and rotate 90 degrees */
118     FLIP_H_ROT180,   /**< Flip horizontally and rotate 180 degrees */
119     FLIP_V_ROT180,   /**< Flip vertically and rotate 180 degrees */
120     FLIP_H_ROT270,   /**< Flip horizontally and rotate 270 degrees */
121     FLIP_V_ROT270,   /**< Flip vertically and rotate 270 degrees */
122     ROTATE_BUTT      /**< Invalid operation */
123 };
124 
125 class BufferRequestConfigAdapter {
126 public:
127     BufferRequestConfigAdapter() = default;
128 
129     virtual ~BufferRequestConfigAdapter() = default;
130 
131     virtual int32_t GetWidth() = 0;
132 
133     virtual int32_t GetHeight() = 0;
134 
135     virtual int32_t GetStrideAlignment() = 0;
136 
137     virtual int32_t GetFormat() = 0;
138 
139     virtual uint64_t GetUsage() = 0;
140 
141     virtual int32_t GetTimeout() = 0;
142 
143     virtual ColorGamutAdapter GetColorGamut() = 0;
144 
145     virtual TransformTypeAdapter GetTransformType() = 0;
146 };
147 
148 class BufferFlushConfigAdapter {
149 public:
150     BufferFlushConfigAdapter() = default;
151 
152     virtual ~BufferFlushConfigAdapter() = default;
153 
154     virtual int32_t GetX() = 0;
155 
156     virtual int32_t GetY() = 0;
157 
158     virtual int32_t GetW() = 0;
159 
160     virtual int32_t GetH() = 0;
161 
162     virtual int64_t GetTimestamp() = 0;
163 };
164 
165 class SurfaceBufferAdapter {
166 public:
167     SurfaceBufferAdapter() = default;
168 
169     virtual ~SurfaceBufferAdapter() = default;
170 
171     virtual int32_t GetFileDescriptor() = 0;
172 
173     virtual int32_t GetWidth() = 0;
174 
175     virtual int32_t GetHeight() = 0;
176 
177     virtual int32_t GetStride() = 0;
178 
179     virtual int32_t GetFormat() = 0;
180 
181     virtual uint32_t GetSize() = 0;
182 
183     virtual void* GetVirAddr() = 0;
184 
185 protected:
186     SurfaceBufferAdapter(const SurfaceBufferAdapter&) = delete;
187 
188     SurfaceBufferAdapter& operator=(const SurfaceBufferAdapter&) = delete;
189 };
190 
191 class IBufferConsumerListenerAdapter {
192 public:
193     virtual ~IBufferConsumerListenerAdapter() = default;
194 
195     virtual void OnBufferAvailable(std::shared_ptr<SurfaceBufferAdapter> buffer) = 0;
196 };
197 
198 class IConsumerSurfaceAdapter {
199 public:
200     IConsumerSurfaceAdapter() = default;
201 
202     virtual ~IConsumerSurfaceAdapter() = default;
203 
204     virtual int32_t RegisterConsumerListener(std::shared_ptr<IBufferConsumerListenerAdapter> listener) = 0;
205 
206     virtual int32_t ReleaseBuffer(std::shared_ptr<SurfaceBufferAdapter> buffer, int32_t fence) = 0;
207 
208     virtual int32_t SetUserData(const std::string& key, const std::string& val) = 0;
209 
210     virtual int32_t SetQueueSize(uint32_t queueSize) = 0;
211 };
212 
213 using NWebNativeWindow = void*;
214 
215 class WindowAdapter {
216 public:
217     WindowAdapter() = default;
218 
219     virtual ~WindowAdapter() = default;
220 
221     virtual NWebNativeWindow CreateNativeWindowFromSurface(void* pSurface) = 0;
222 
223     virtual void DestroyNativeWindow(NWebNativeWindow window) = 0;
224 
225     virtual int32_t NativeWindowSetBufferGeometry(NWebNativeWindow window, int32_t width, int32_t height) = 0;
226 
227     virtual void NativeWindowSurfaceCleanCache(NWebNativeWindow window) = 0;
228 
229     virtual void NativeWindowSurfaceCleanCacheWithPara(NWebNativeWindow window, bool cleanAll) = 0;
230 };
231 
232 class AshmemAdapter {
233 public:
234     static int AshmemCreate(const char* name, size_t size);
235 };
236 
237 typedef void (*OnFrameAvailableCb)(void* ctx);
238 
239 class FrameAvailableListener {
240 public:
241     FrameAvailableListener() = default;
242 
243     virtual ~FrameAvailableListener() = default;
244 
245     virtual void* GetContext() = 0;
246 
247     virtual OnFrameAvailableCb GetOnFrameAvailableCb() = 0;
248 };
249 
250 class NativeImageAdapter {
251 public:
252     NativeImageAdapter() = default;
253 
254     virtual ~NativeImageAdapter() = default;
255 
256     virtual void CreateNativeImage(uint32_t textureId, uint32_t textureTarget) = 0;
257 
258     virtual NWebNativeWindow AquireNativeWindowFromNativeImage() = 0;
259 
260     virtual int32_t AttachContext(uint32_t textureId) = 0;
261 
262     virtual int32_t DetachContext() = 0;
263 
264     virtual int32_t UpdateSurfaceImage() = 0;
265 
266     virtual int64_t GetTimestamp() = 0;
267 
268     virtual int32_t GetTransformMatrix(float matrix[16]) = 0;
269 
270     virtual int32_t GetSurfaceId(uint64_t* surfaceId) = 0;
271 
272     virtual int32_t SetOnFrameAvailableListener(std::shared_ptr<FrameAvailableListener> listener) = 0;
273 
274     virtual int32_t UnsetOnFrameAvailableListener() = 0;
275 
276     virtual void DestroyNativeImage() = 0;
277 
278     virtual void NewNativeImage() = 0;
279 
280     virtual int32_t AcquireNativeWindowBuffer(
281         void** windowBuffer,
282         int* acquireFenceFd) = 0;
283 
284     virtual int32_t GetNativeBuffer(
285         void* windowBuffer,
286         void** nativeBuffer) = 0;
287 
288     virtual int32_t ReleaseNativeWindowBuffer(void* windowBuffer, int fenceFd) = 0;
289 
290     virtual void GetNativeWindowBufferSize(
291         void* windowBuffer,
292         uint32_t* width,
293         uint32_t* height) = 0;
294 };
295 
296 class ProducerSurfaceAdapter {
297 public:
298     ProducerSurfaceAdapter() = default;
299 
300     virtual ~ProducerSurfaceAdapter() = default;
301 
302     virtual std::shared_ptr<SurfaceBufferAdapter> RequestBuffer(
303         int32_t& fence, std::shared_ptr<BufferRequestConfigAdapter> config) = 0;
304 
305     virtual int32_t FlushBuffer(std::shared_ptr<SurfaceBufferAdapter> buffer, int32_t fence,
306         std::shared_ptr<BufferFlushConfigAdapter> config) = 0;
307 };
308 
309 } // namespace OHOS::NWeb
310 
311 #endif // GRAPHIC_ADAPTER_H
312