10826e83eSopenharmony_ci/*
20826e83eSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
30826e83eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
40826e83eSopenharmony_ci * you may not use this file except in compliance with the License.
50826e83eSopenharmony_ci * You may obtain a copy of the License at
60826e83eSopenharmony_ci *
70826e83eSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
80826e83eSopenharmony_ci *
90826e83eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
100826e83eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
110826e83eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120826e83eSopenharmony_ci * See the License for the specific language governing permissions and
130826e83eSopenharmony_ci * limitations under the License.
140826e83eSopenharmony_ci */
150826e83eSopenharmony_ci
160826e83eSopenharmony_ci#ifndef GRAPHIC_ADAPTER_H
170826e83eSopenharmony_ci#define GRAPHIC_ADAPTER_H
180826e83eSopenharmony_ci
190826e83eSopenharmony_ci#include <functional>
200826e83eSopenharmony_ci
210826e83eSopenharmony_cinamespace OHOS::NWeb {
220826e83eSopenharmony_ci
230826e83eSopenharmony_cienum class VSyncErrorCode {
240826e83eSopenharmony_ci    SUCCESS,
250826e83eSopenharmony_ci    ERROR,
260826e83eSopenharmony_ci};
270826e83eSopenharmony_ci
280826e83eSopenharmony_citypedef void (*NWebVSyncCb)(int64_t, void*);
290826e83eSopenharmony_ci
300826e83eSopenharmony_ciclass VSyncAdapter {
310826e83eSopenharmony_cipublic:
320826e83eSopenharmony_ci    VSyncAdapter() = default;
330826e83eSopenharmony_ci
340826e83eSopenharmony_ci    virtual ~VSyncAdapter() = default;
350826e83eSopenharmony_ci
360826e83eSopenharmony_ci    virtual VSyncErrorCode RequestVsync(void* data, NWebVSyncCb cb) = 0;
370826e83eSopenharmony_ci
380826e83eSopenharmony_ci    virtual int64_t GetVSyncPeriod() = 0;
390826e83eSopenharmony_ci
400826e83eSopenharmony_ci    virtual void SetFrameRateLinkerEnable(bool enabled) = 0;
410826e83eSopenharmony_ci
420826e83eSopenharmony_ci    virtual void SetFramePreferredRate(int32_t preferredRate) = 0;
430826e83eSopenharmony_ci
440826e83eSopenharmony_ci    virtual void SetOnVsyncCallback(void (*callback)()) = 0;
450826e83eSopenharmony_ci
460826e83eSopenharmony_ci    virtual void SetOnVsyncEndCallback(void (*onVsyncEndCallback)()) {}
470826e83eSopenharmony_ci
480826e83eSopenharmony_ci    virtual void SetScene(const std::string& sceneName, uint32_t state) = 0;
490826e83eSopenharmony_ci};
500826e83eSopenharmony_ci
510826e83eSopenharmony_ci// be consistent with rom/foundation/graphic/graphic_2d/interfaces/inner_api/common/graphic_common_c.h:GSError
520826e83eSopenharmony_cienum GSErrorCode {
530826e83eSopenharmony_ci    GSERROR_OK = 0,
540826e83eSopenharmony_ci};
550826e83eSopenharmony_ci
560826e83eSopenharmony_ci// be consistent with rom/drivers/peripheral/display/interfaces/include/display_type.h:PixelFormat
570826e83eSopenharmony_cienum PixelFormatAdapter {
580826e83eSopenharmony_ci    PIXEL_FMT_CLUT8 = 0,                /**< CLUT8 format */
590826e83eSopenharmony_ci    PIXEL_FMT_CLUT1,                    /**< CLUT1 format */
600826e83eSopenharmony_ci    PIXEL_FMT_CLUT4,                    /**< CLUT4 format */
610826e83eSopenharmony_ci    PIXEL_FMT_RGB_565,                  /**< RGB565 format */
620826e83eSopenharmony_ci    PIXEL_FMT_RGBA_5658,                /**< RGBA5658 format */
630826e83eSopenharmony_ci    PIXEL_FMT_RGBX_4444,                /**< RGBX4444 format */
640826e83eSopenharmony_ci    PIXEL_FMT_RGBA_4444,                /**< RGBA4444 format */
650826e83eSopenharmony_ci    PIXEL_FMT_RGB_444,                  /**< RGB444 format */
660826e83eSopenharmony_ci    PIXEL_FMT_RGBX_5551,                /**< RGBX5551 format */
670826e83eSopenharmony_ci    PIXEL_FMT_RGBA_5551,                /**< RGBA5551 format */
680826e83eSopenharmony_ci    PIXEL_FMT_RGB_555,                  /**< RGB555 format */
690826e83eSopenharmony_ci    PIXEL_FMT_RGBX_8888,                /**< RGBX8888 format */
700826e83eSopenharmony_ci    PIXEL_FMT_RGBA_8888,                /**< RGBA8888 format */
710826e83eSopenharmony_ci    PIXEL_FMT_RGB_888,                  /**< RGB888 format */
720826e83eSopenharmony_ci    PIXEL_FMT_BGR_565,                  /**< BGR565 format */
730826e83eSopenharmony_ci    PIXEL_FMT_BGRX_4444,                /**< BGRX4444 format */
740826e83eSopenharmony_ci    PIXEL_FMT_BGRA_4444,                /**< BGRA4444 format */
750826e83eSopenharmony_ci    PIXEL_FMT_BGRX_5551,                /**< BGRX5551 format */
760826e83eSopenharmony_ci    PIXEL_FMT_BGRA_5551,                /**< BGRA5551 format */
770826e83eSopenharmony_ci    PIXEL_FMT_BGRX_8888,                /**< BGRX8888 format */
780826e83eSopenharmony_ci    PIXEL_FMT_BGRA_8888,                /**< BGRA8888 format */
790826e83eSopenharmony_ci    PIXEL_FMT_YUV_422_I,                /**< YUV422 interleaved format */
800826e83eSopenharmony_ci    PIXEL_FMT_YCBCR_422_SP,             /**< YCBCR422 semi-planar format */
810826e83eSopenharmony_ci    PIXEL_FMT_YCRCB_422_SP,             /**< YCRCB422 semi-planar format */
820826e83eSopenharmony_ci    PIXEL_FMT_YCBCR_420_SP,             /**< YCBCR420 semi-planar format */
830826e83eSopenharmony_ci    PIXEL_FMT_YCRCB_420_SP,             /**< YCRCB420 semi-planar format */
840826e83eSopenharmony_ci    PIXEL_FMT_YCBCR_422_P,              /**< YCBCR422 planar format */
850826e83eSopenharmony_ci    PIXEL_FMT_YCRCB_422_P,              /**< YCRCB422 planar format */
860826e83eSopenharmony_ci    PIXEL_FMT_YCBCR_420_P,              /**< YCBCR420 planar format */
870826e83eSopenharmony_ci    PIXEL_FMT_YCRCB_420_P,              /**< YCRCB420 planar format */
880826e83eSopenharmony_ci    PIXEL_FMT_YUYV_422_PKG,             /**< YUYV422 packed format */
890826e83eSopenharmony_ci    PIXEL_FMT_UYVY_422_PKG,             /**< UYVY422 packed format */
900826e83eSopenharmony_ci    PIXEL_FMT_YVYU_422_PKG,             /**< YVYU422 packed format */
910826e83eSopenharmony_ci    PIXEL_FMT_VYUY_422_PKG,             /**< VYUY422 packed format */
920826e83eSopenharmony_ci    PIXEL_FMT_VENDER_MASK = 0X7FFF0000, /**< vendor mask format */
930826e83eSopenharmony_ci    PIXEL_FMT_BUTT = 0X7FFFFFFF         /**< Invalid pixel format */
940826e83eSopenharmony_ci};
950826e83eSopenharmony_ci
960826e83eSopenharmony_cienum class ColorGamutAdapter : int32_t {
970826e83eSopenharmony_ci    INVALID = -1,        /**< Invalid */
980826e83eSopenharmony_ci    NATIVE = 0,          /**< Native or default */
990826e83eSopenharmony_ci    STANDARD_BT601 = 1,  /**< Standard BT601 */
1000826e83eSopenharmony_ci    STANDARD_BT709 = 2,  /**< Standard BT709 */
1010826e83eSopenharmony_ci    DCI_P3 = 3,          /**< DCI P3 */
1020826e83eSopenharmony_ci    SRGB = 4,            /**< SRGB */
1030826e83eSopenharmony_ci    ADOBE_RGB = 5,       /**< Adobe RGB */
1040826e83eSopenharmony_ci    DISPLAY_P3 = 6,      /**< display P3 */
1050826e83eSopenharmony_ci    BT2020 = 7,          /**< BT2020 */
1060826e83eSopenharmony_ci    BT2100_PQ = 8,       /**< BT2100 PQ */
1070826e83eSopenharmony_ci    BT2100_HLG = 9,      /**< BT2100 HLG */
1080826e83eSopenharmony_ci    DISPLAY_BT2020 = 10, /**< Display BT2020 */
1090826e83eSopenharmony_ci};
1100826e83eSopenharmony_ci
1110826e83eSopenharmony_cienum class TransformTypeAdapter : int32_t {
1120826e83eSopenharmony_ci    ROTATE_NONE = 0, /**< No rotation */
1130826e83eSopenharmony_ci    ROTATE_90,       /**< Rotation by 90 degrees */
1140826e83eSopenharmony_ci    ROTATE_180,      /**< Rotation by 180 degrees */
1150826e83eSopenharmony_ci    ROTATE_270,      /**< Rotation by 270 degrees */
1160826e83eSopenharmony_ci    FLIP_H,          /**< Flip horizontally */
1170826e83eSopenharmony_ci    FLIP_V,          /**< Flip vertically */
1180826e83eSopenharmony_ci    FLIP_H_ROT90,    /**< Flip horizontally and rotate 90 degrees */
1190826e83eSopenharmony_ci    FLIP_V_ROT90,    /**< Flip vertically and rotate 90 degrees */
1200826e83eSopenharmony_ci    FLIP_H_ROT180,   /**< Flip horizontally and rotate 180 degrees */
1210826e83eSopenharmony_ci    FLIP_V_ROT180,   /**< Flip vertically and rotate 180 degrees */
1220826e83eSopenharmony_ci    FLIP_H_ROT270,   /**< Flip horizontally and rotate 270 degrees */
1230826e83eSopenharmony_ci    FLIP_V_ROT270,   /**< Flip vertically and rotate 270 degrees */
1240826e83eSopenharmony_ci    ROTATE_BUTT      /**< Invalid operation */
1250826e83eSopenharmony_ci};
1260826e83eSopenharmony_ci
1270826e83eSopenharmony_ciclass BufferRequestConfigAdapter {
1280826e83eSopenharmony_cipublic:
1290826e83eSopenharmony_ci    BufferRequestConfigAdapter() = default;
1300826e83eSopenharmony_ci
1310826e83eSopenharmony_ci    virtual ~BufferRequestConfigAdapter() = default;
1320826e83eSopenharmony_ci
1330826e83eSopenharmony_ci    virtual int32_t GetWidth() = 0;
1340826e83eSopenharmony_ci
1350826e83eSopenharmony_ci    virtual int32_t GetHeight() = 0;
1360826e83eSopenharmony_ci
1370826e83eSopenharmony_ci    virtual int32_t GetStrideAlignment() = 0;
1380826e83eSopenharmony_ci
1390826e83eSopenharmony_ci    virtual int32_t GetFormat() = 0;
1400826e83eSopenharmony_ci
1410826e83eSopenharmony_ci    virtual uint64_t GetUsage() = 0;
1420826e83eSopenharmony_ci
1430826e83eSopenharmony_ci    virtual int32_t GetTimeout() = 0;
1440826e83eSopenharmony_ci
1450826e83eSopenharmony_ci    virtual ColorGamutAdapter GetColorGamut() = 0;
1460826e83eSopenharmony_ci
1470826e83eSopenharmony_ci    virtual TransformTypeAdapter GetTransformType() = 0;
1480826e83eSopenharmony_ci};
1490826e83eSopenharmony_ci
1500826e83eSopenharmony_ciclass BufferFlushConfigAdapter {
1510826e83eSopenharmony_cipublic:
1520826e83eSopenharmony_ci    BufferFlushConfigAdapter() = default;
1530826e83eSopenharmony_ci
1540826e83eSopenharmony_ci    virtual ~BufferFlushConfigAdapter() = default;
1550826e83eSopenharmony_ci
1560826e83eSopenharmony_ci    virtual int32_t GetX() = 0;
1570826e83eSopenharmony_ci
1580826e83eSopenharmony_ci    virtual int32_t GetY() = 0;
1590826e83eSopenharmony_ci
1600826e83eSopenharmony_ci    virtual int32_t GetW() = 0;
1610826e83eSopenharmony_ci
1620826e83eSopenharmony_ci    virtual int32_t GetH() = 0;
1630826e83eSopenharmony_ci
1640826e83eSopenharmony_ci    virtual int64_t GetTimestamp() = 0;
1650826e83eSopenharmony_ci};
1660826e83eSopenharmony_ci
1670826e83eSopenharmony_ciclass SurfaceBufferAdapter {
1680826e83eSopenharmony_cipublic:
1690826e83eSopenharmony_ci    SurfaceBufferAdapter() = default;
1700826e83eSopenharmony_ci
1710826e83eSopenharmony_ci    virtual ~SurfaceBufferAdapter() = default;
1720826e83eSopenharmony_ci
1730826e83eSopenharmony_ci    virtual int32_t GetFileDescriptor() = 0;
1740826e83eSopenharmony_ci
1750826e83eSopenharmony_ci    virtual int32_t GetWidth() = 0;
1760826e83eSopenharmony_ci
1770826e83eSopenharmony_ci    virtual int32_t GetHeight() = 0;
1780826e83eSopenharmony_ci
1790826e83eSopenharmony_ci    virtual int32_t GetStride() = 0;
1800826e83eSopenharmony_ci
1810826e83eSopenharmony_ci    virtual int32_t GetFormat() = 0;
1820826e83eSopenharmony_ci
1830826e83eSopenharmony_ci    virtual uint32_t GetSize() = 0;
1840826e83eSopenharmony_ci
1850826e83eSopenharmony_ci    virtual void* GetVirAddr() = 0;
1860826e83eSopenharmony_ci
1870826e83eSopenharmony_ciprotected:
1880826e83eSopenharmony_ci    SurfaceBufferAdapter(const SurfaceBufferAdapter&) = delete;
1890826e83eSopenharmony_ci
1900826e83eSopenharmony_ci    SurfaceBufferAdapter& operator=(const SurfaceBufferAdapter&) = delete;
1910826e83eSopenharmony_ci};
1920826e83eSopenharmony_ci
1930826e83eSopenharmony_ciclass IBufferConsumerListenerAdapter {
1940826e83eSopenharmony_cipublic:
1950826e83eSopenharmony_ci    virtual ~IBufferConsumerListenerAdapter() = default;
1960826e83eSopenharmony_ci
1970826e83eSopenharmony_ci    virtual void OnBufferAvailable(std::shared_ptr<SurfaceBufferAdapter> buffer) = 0;
1980826e83eSopenharmony_ci};
1990826e83eSopenharmony_ci
2000826e83eSopenharmony_ciclass IConsumerSurfaceAdapter {
2010826e83eSopenharmony_cipublic:
2020826e83eSopenharmony_ci    IConsumerSurfaceAdapter() = default;
2030826e83eSopenharmony_ci
2040826e83eSopenharmony_ci    virtual ~IConsumerSurfaceAdapter() = default;
2050826e83eSopenharmony_ci
2060826e83eSopenharmony_ci    virtual int32_t RegisterConsumerListener(std::shared_ptr<IBufferConsumerListenerAdapter> listener) = 0;
2070826e83eSopenharmony_ci
2080826e83eSopenharmony_ci    virtual int32_t ReleaseBuffer(std::shared_ptr<SurfaceBufferAdapter> buffer, int32_t fence) = 0;
2090826e83eSopenharmony_ci
2100826e83eSopenharmony_ci    virtual int32_t SetUserData(const std::string& key, const std::string& val) = 0;
2110826e83eSopenharmony_ci
2120826e83eSopenharmony_ci    virtual int32_t SetQueueSize(uint32_t queueSize) = 0;
2130826e83eSopenharmony_ci};
2140826e83eSopenharmony_ci
2150826e83eSopenharmony_ciusing NWebNativeWindow = void*;
2160826e83eSopenharmony_ci
2170826e83eSopenharmony_ciclass WindowAdapter {
2180826e83eSopenharmony_cipublic:
2190826e83eSopenharmony_ci    WindowAdapter() = default;
2200826e83eSopenharmony_ci
2210826e83eSopenharmony_ci    virtual ~WindowAdapter() = default;
2220826e83eSopenharmony_ci
2230826e83eSopenharmony_ci    virtual NWebNativeWindow CreateNativeWindowFromSurface(void* pSurface) = 0;
2240826e83eSopenharmony_ci
2250826e83eSopenharmony_ci    virtual void DestroyNativeWindow(NWebNativeWindow window) = 0;
2260826e83eSopenharmony_ci
2270826e83eSopenharmony_ci    virtual int32_t NativeWindowSetBufferGeometry(NWebNativeWindow window, int32_t width, int32_t height) = 0;
2280826e83eSopenharmony_ci
2290826e83eSopenharmony_ci    virtual void NativeWindowSurfaceCleanCache(NWebNativeWindow window) = 0;
2300826e83eSopenharmony_ci
2310826e83eSopenharmony_ci    virtual void NativeWindowSurfaceCleanCacheWithPara(NWebNativeWindow window, bool cleanAll) = 0;
2320826e83eSopenharmony_ci};
2330826e83eSopenharmony_ci
2340826e83eSopenharmony_ciclass AshmemAdapter {
2350826e83eSopenharmony_cipublic:
2360826e83eSopenharmony_ci    static int AshmemCreate(const char* name, size_t size);
2370826e83eSopenharmony_ci};
2380826e83eSopenharmony_ci
2390826e83eSopenharmony_citypedef void (*OnFrameAvailableCb)(void* ctx);
2400826e83eSopenharmony_ci
2410826e83eSopenharmony_ciclass FrameAvailableListener {
2420826e83eSopenharmony_cipublic:
2430826e83eSopenharmony_ci    FrameAvailableListener() = default;
2440826e83eSopenharmony_ci
2450826e83eSopenharmony_ci    virtual ~FrameAvailableListener() = default;
2460826e83eSopenharmony_ci
2470826e83eSopenharmony_ci    virtual void* GetContext() = 0;
2480826e83eSopenharmony_ci
2490826e83eSopenharmony_ci    virtual OnFrameAvailableCb GetOnFrameAvailableCb() = 0;
2500826e83eSopenharmony_ci};
2510826e83eSopenharmony_ci
2520826e83eSopenharmony_ciclass NativeImageAdapter {
2530826e83eSopenharmony_cipublic:
2540826e83eSopenharmony_ci    NativeImageAdapter() = default;
2550826e83eSopenharmony_ci
2560826e83eSopenharmony_ci    virtual ~NativeImageAdapter() = default;
2570826e83eSopenharmony_ci
2580826e83eSopenharmony_ci    virtual void CreateNativeImage(uint32_t textureId, uint32_t textureTarget) = 0;
2590826e83eSopenharmony_ci
2600826e83eSopenharmony_ci    virtual NWebNativeWindow AquireNativeWindowFromNativeImage() = 0;
2610826e83eSopenharmony_ci
2620826e83eSopenharmony_ci    virtual int32_t AttachContext(uint32_t textureId) = 0;
2630826e83eSopenharmony_ci
2640826e83eSopenharmony_ci    virtual int32_t DetachContext() = 0;
2650826e83eSopenharmony_ci
2660826e83eSopenharmony_ci    virtual int32_t UpdateSurfaceImage() = 0;
2670826e83eSopenharmony_ci
2680826e83eSopenharmony_ci    virtual int64_t GetTimestamp() = 0;
2690826e83eSopenharmony_ci
2700826e83eSopenharmony_ci    virtual int32_t GetTransformMatrix(float matrix[16]) = 0;
2710826e83eSopenharmony_ci
2720826e83eSopenharmony_ci    virtual int32_t GetSurfaceId(uint64_t* surfaceId) = 0;
2730826e83eSopenharmony_ci
2740826e83eSopenharmony_ci    virtual int32_t SetOnFrameAvailableListener(std::shared_ptr<FrameAvailableListener> listener) = 0;
2750826e83eSopenharmony_ci
2760826e83eSopenharmony_ci    virtual int32_t UnsetOnFrameAvailableListener() = 0;
2770826e83eSopenharmony_ci
2780826e83eSopenharmony_ci    virtual void DestroyNativeImage() = 0;
2790826e83eSopenharmony_ci
2800826e83eSopenharmony_ci    virtual void NewNativeImage() = 0;
2810826e83eSopenharmony_ci
2820826e83eSopenharmony_ci    virtual int32_t AcquireNativeWindowBuffer(
2830826e83eSopenharmony_ci        void** windowBuffer,
2840826e83eSopenharmony_ci        int* acquireFenceFd) = 0;
2850826e83eSopenharmony_ci
2860826e83eSopenharmony_ci    virtual int32_t GetNativeBuffer(
2870826e83eSopenharmony_ci        void* windowBuffer,
2880826e83eSopenharmony_ci        void** nativeBuffer) = 0;
2890826e83eSopenharmony_ci
2900826e83eSopenharmony_ci    virtual int32_t ReleaseNativeWindowBuffer(void* windowBuffer, int fenceFd) = 0;
2910826e83eSopenharmony_ci
2920826e83eSopenharmony_ci    virtual void GetNativeWindowBufferSize(
2930826e83eSopenharmony_ci        void* windowBuffer,
2940826e83eSopenharmony_ci        uint32_t* width,
2950826e83eSopenharmony_ci        uint32_t* height) = 0;
2960826e83eSopenharmony_ci};
2970826e83eSopenharmony_ci
2980826e83eSopenharmony_ciclass ProducerSurfaceAdapter {
2990826e83eSopenharmony_cipublic:
3000826e83eSopenharmony_ci    ProducerSurfaceAdapter() = default;
3010826e83eSopenharmony_ci
3020826e83eSopenharmony_ci    virtual ~ProducerSurfaceAdapter() = default;
3030826e83eSopenharmony_ci
3040826e83eSopenharmony_ci    virtual std::shared_ptr<SurfaceBufferAdapter> RequestBuffer(
3050826e83eSopenharmony_ci        int32_t& fence, std::shared_ptr<BufferRequestConfigAdapter> config) = 0;
3060826e83eSopenharmony_ci
3070826e83eSopenharmony_ci    virtual int32_t FlushBuffer(std::shared_ptr<SurfaceBufferAdapter> buffer, int32_t fence,
3080826e83eSopenharmony_ci        std::shared_ptr<BufferFlushConfigAdapter> config) = 0;
3090826e83eSopenharmony_ci};
3100826e83eSopenharmony_ci} // namespace OHOS::NWeb
3110826e83eSopenharmony_ci
3120826e83eSopenharmony_ci#endif // GRAPHIC_ADAPTER_H
313