1 /*
2  * Copyright (c) 2021 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 INTERFACES_INNERKITS_SURFACE_SURFACE_TYPE_H
17 #define INTERFACES_INNERKITS_SURFACE_SURFACE_TYPE_H
18 
19 #include <cstdint>
20 #include <string>
21 #include <vector>
22 #include <graphic_common.h>
23 
24 namespace OHOS {
25 #define SURFACE_MAX_USER_DATA_COUNT 1000
26 #define SURFACE_MAX_QUEUE_SIZE 64
27 #define SURFACE_DEFAULT_QUEUE_SIZE 3
28 #define SURFACE_MAX_STRIDE_ALIGNMENT 32
29 #define SURFACE_MIN_STRIDE_ALIGNMENT 4
30 #define SURFACE_DEFAULT_STRIDE_ALIGNMENT 4
31 #define SURFACE_MAX_SIZE 58982400 // 8K * 8K
32 
33 constexpr uint32_t SURFACE_PARCEL_SIZE_LIMIT = 1024;
34 
35 /*
36  * @brief Enumerates return values of the functions.
37  */
38 using GraphicDispErrCode = enum {
39     GRAPHIC_DISPLAY_SUCCESS = 0,           /**< Success */
40     GRAPHIC_DISPLAY_FAILURE = -1,          /**< Failure */
41     GRAPHIC_DISPLAY_FD_ERR = -2,           /**< File handle (FD) error */
42     GRAPHIC_DISPLAY_PARAM_ERR = -3,        /**< Parameter error */
43     GRAPHIC_DISPLAY_NULL_PTR = -4,         /**< Null pointer */
44     GRAPHIC_DISPLAY_NOT_SUPPORT = -5,      /**< Unsupported feature */
45     GRAPHIC_DISPLAY_NOMEM = -6,            /**< Insufficient memory */
46     GRAPHIC_DISPLAY_SYS_BUSY = -7,         /**< System busy */
47     GRAPHIC_DISPLAY_NOT_PERM = -8          /**< Forbidden operation */
48 };
49 
50 using GraphicCompositionType = enum {
51     GRAPHIC_COMPOSITION_CLIENT,       /**< Client composition type. The composer should be the CPU or GPU. */
52     GRAPHIC_COMPOSITION_DEVICE,       /**< Device composition type. The composer should be the hardware. */
53     GRAPHIC_COMPOSITION_CURSOR,       /**< Cursor composition type, used for cursor. */
54     GRAPHIC_COMPOSITION_VIDEO,        /**< Video composition type, used for video. */
55     GRAPHIC_COMPOSITION_DEVICE_CLEAR, /**< Device clear composition type, the device will clear the target region. */
56     GRAPHIC_COMPOSITION_CLIENT_CLEAR, /**< Client clear composition type, the service will clear the target region. */
57     GRAPHIC_COMPOSITION_TUNNEL,       /**< Tunnel composition type, used for tunnel. */
58     GRAPHIC_COMPOSITION_SOLID_COLOR,  /**< used for SetLayerColor. */
59     GRAPHIC_COMPOSITION_BUTT
60 };
61 
62 using GraphicLayerAlpha = struct {
63     bool enGlobalAlpha;   /**< Global alpha enable bit */
64     bool enPixelAlpha;    /**< Pixel alpha enable bit */
65     uint8_t alpha0;       /**< Alpha0 value, ranging from 0 to 255 */
66     uint8_t alpha1;       /**< Alpha1 value, ranging from 0 to 255 */
67     uint8_t gAlpha;       /**< Global alpha value, ranging from 0 to 255 */
68 };
69 
70 using GraphicBlendType = enum {
71     GRAPHIC_BLEND_NONE = 0,         /**< No blending */
72     GRAPHIC_BLEND_CLEAR,            /**< CLEAR blending */
73     GRAPHIC_BLEND_SRC,              /**< SRC blending */
74     GRAPHIC_BLEND_SRCOVER,          /**< SRC_OVER blending */
75     GRAPHIC_BLEND_DSTOVER,          /**< DST_OVER blending */
76     GRAPHIC_BLEND_SRCIN,            /**< SRC_IN blending */
77     GRAPHIC_BLEND_DSTIN,            /**< DST_IN blending */
78     GRAPHIC_BLEND_SRCOUT,           /**< SRC_OUT blending */
79     GRAPHIC_BLEND_DSTOUT,           /**< DST_OUT blending */
80     GRAPHIC_BLEND_SRCATOP,          /**< SRC_ATOP blending */
81     GRAPHIC_BLEND_DSTATOP,          /**< DST_ATOP blending */
82     GRAPHIC_BLEND_ADD,              /**< ADD blending */
83     GRAPHIC_BLEND_XOR,              /**< XOR blending */
84     GRAPHIC_BLEND_DST,              /**< DST blending */
85     GRAPHIC_BLEND_AKS,              /**< AKS blending */
86     GRAPHIC_BLEND_AKD,              /**< AKD blending */
87     GRAPHIC_BLEND_BUTT              /**< Null operation */
88 };
89 
90 /*
91  * @brief Enumeration values are indicated for external consistency.
92  */
93 using GraphicPixelFormat = enum {
94     GRAPHIC_PIXEL_FMT_CLUT8 = 0,                    /**< CLUT8 format */
95     GRAPHIC_PIXEL_FMT_CLUT1 = 1,                    /**< CLUT1 format */
96     GRAPHIC_PIXEL_FMT_CLUT4 = 2,                    /**< CLUT4 format */
97     GRAPHIC_PIXEL_FMT_RGB_565 = 3,                  /**< RGB565 format */
98     GRAPHIC_PIXEL_FMT_RGBA_5658 = 4,                /**< RGBA5658 format */
99     GRAPHIC_PIXEL_FMT_RGBX_4444 = 5,                /**< RGBX4444 format */
100     GRAPHIC_PIXEL_FMT_RGBA_4444 = 6,                /**< RGBA4444 format */
101     GRAPHIC_PIXEL_FMT_RGB_444 = 7,                  /**< RGB444 format */
102     GRAPHIC_PIXEL_FMT_RGBX_5551 = 8,                /**< RGBX5551 format */
103     GRAPHIC_PIXEL_FMT_RGBA_5551 = 9,                /**< RGBA5551 format */
104     GRAPHIC_PIXEL_FMT_RGB_555 = 10,                 /**< RGB555 format */
105     GRAPHIC_PIXEL_FMT_RGBX_8888 = 11,               /**< RGBX8888 format */
106     GRAPHIC_PIXEL_FMT_RGBA_8888 = 12,               /**< RGBA8888 format */
107     GRAPHIC_PIXEL_FMT_RGB_888 = 13,                 /**< RGB888 format */
108     GRAPHIC_PIXEL_FMT_BGR_565 = 14,                 /**< BGR565 format */
109     GRAPHIC_PIXEL_FMT_BGRX_4444 = 15,               /**< BGRX4444 format */
110     GRAPHIC_PIXEL_FMT_BGRA_4444 = 16,               /**< BGRA4444 format */
111     GRAPHIC_PIXEL_FMT_BGRX_5551 = 17,               /**< BGRX5551 format */
112     GRAPHIC_PIXEL_FMT_BGRA_5551 = 18,               /**< BGRA5551 format */
113     GRAPHIC_PIXEL_FMT_BGRX_8888 = 19,               /**< BGRX8888 format */
114     GRAPHIC_PIXEL_FMT_BGRA_8888 = 20,               /**< BGRA8888 format */
115     GRAPHIC_PIXEL_FMT_YUV_422_I = 21,               /**< YUV422 interleaved format */
116     GRAPHIC_PIXEL_FMT_YCBCR_422_SP = 22,            /**< YCBCR422 semi-planar format */
117     GRAPHIC_PIXEL_FMT_YCRCB_422_SP = 23,            /**< YCRCB422 semi-planar format */
118     GRAPHIC_PIXEL_FMT_YCBCR_420_SP = 24,            /**< YCBCR420 semi-planar format */
119     GRAPHIC_PIXEL_FMT_YCRCB_420_SP = 25,            /**< YCRCB420 semi-planar format */
120     GRAPHIC_PIXEL_FMT_YCBCR_422_P = 26,             /**< YCBCR422 planar format */
121     GRAPHIC_PIXEL_FMT_YCRCB_422_P = 27,             /**< YCRCB422 planar format */
122     GRAPHIC_PIXEL_FMT_YCBCR_420_P = 28,             /**< YCBCR420 planar format */
123     GRAPHIC_PIXEL_FMT_YCRCB_420_P = 29,             /**< YCRCB420 planar format */
124     GRAPHIC_PIXEL_FMT_YUYV_422_PKG = 30,            /**< YUYV422 packed format */
125     GRAPHIC_PIXEL_FMT_UYVY_422_PKG = 31,            /**< UYVY422 packed format */
126     GRAPHIC_PIXEL_FMT_YVYU_422_PKG = 32,            /**< YVYU422 packed format */
127     GRAPHIC_PIXEL_FMT_VYUY_422_PKG = 33,            /**< VYUY422 packed format */
128     GRAPHIC_PIXEL_FMT_RGBA_1010102 = 34,            /**< RGBA_1010102 packed format */
129     GRAPHIC_PIXEL_FMT_YCBCR_P010 = 35,              /**< YCBCR420 semi-planar 10bit packed format */
130     GRAPHIC_PIXEL_FMT_YCRCB_P010 = 36,              /**< YCRCB420 semi-planar 10bit packed format */
131     GRAPHIC_PIXEL_FMT_RAW10 = 37,                   /**< Raw 10bit packed format */
132     GRAPHIC_PIXEL_FMT_BLOB = 38,                    /**< BLOB format */
133     GRAPHIC_PIXEL_FMT_RGBA16_FLOAT = 39,            /**< RGBA16 float format */
134     GRAPHIC_PIXEL_FMT_VENDER_MASK = 0X7FFF0000,     /**< vendor mask format */
135     GRAPHIC_PIXEL_FMT_BUTT = 0X7FFFFFFF             /**< Invalid pixel format */
136 };
137 
138 using GraphicLayerType = enum {
139     GRAPHIC_LAYER_TYPE_GRAPHIC,         /**< Graphic layer */
140     GRAPHIC_LAYER_TYPE_OVERLAY,         /**< Overlay layer */
141     GRAPHIC_LAYER_TYPE_SDIEBAND,        /**< Sideband layer */
142     GRAPHIC_LAYER_TYPE_CURSOR,          /**< Cursor Layer */
143     GRAPHIC_LAYER_TYPE_BUTT             /**< Empty layer */
144 };
145 
146 using ProducerInitInfo = struct {
147     uint64_t uniqueId;
148     int32_t width;
149     int32_t height;
150     std::string name;
151 };
152 
153 using GraphicLayerInfo = struct {
154     int32_t width;                /**< Layer width */
155     int32_t height;               /**< Layer height */
156     GraphicLayerType type;        /**< Layer type, which can be a graphic layer, overlay layer, or sideband layer */
157     int32_t bpp;                  /**< Number of bits occupied by each pixel */
158     GraphicPixelFormat pixFormat; /**< Pixel format of the layer */
159 };
160 
161 using GraphicIRect = struct GraphicIRect {
162     int32_t x;      /**< Start X coordinate of the rectangle */
163     int32_t y;      /**< Start Y coordinate of the rectangle */
164     int32_t w;      /**< Width of the rectangle */
165     int32_t h;      /**< Height of the rectangle */
166 
167     bool operator==(const GraphicIRect& rect) const
168     {
169         return (x == rect.x) && (y == rect.y) && (w == rect.w) && (h == rect.h);
170     }
171 };
172 
173 using GraphicMatrix = struct GraphicMatrix {
174     float scaleX;   /* horizontal scale factor */
175     float skewX;    /* horizontal skew factor */
176     float transX;   /* horizontal translation */
177     float skewY;    /* vertical scale factor */
178     float scaleY;   /* vertical skew factor */
179     float transY;   /* vertical translation */
180     float pers0;    /* input x-axis perspective factor */
181     float pers1;    /* input y-axis perspective factor */
182     float pers2;    /* perspective scale factor */
183 
floatEqualGraphicMatrix184     inline static bool floatEqual(float x, float y)
185     {
186         return (std::abs((x) - (y)) <= (std::numeric_limits<float>::epsilon()));
187     }
188 
189     bool operator==(const GraphicMatrix& matrix) const
190     {
191         return floatEqual(scaleX, matrix.scaleX) && floatEqual(skewX, matrix.skewX) &&
192                floatEqual(transX, matrix.transX) && floatEqual(skewY, matrix.skewY) &&
193                floatEqual(scaleY, matrix.scaleY) && floatEqual(transY, matrix.transY) &&
194                floatEqual(pers0, matrix.pers0) && floatEqual(pers1, matrix.pers1) && floatEqual(pers2, matrix.pers2);
195     }
196 };
197 
198 using BufferAllocInfo = struct {
199     uint32_t width;                 /**< Width of the requested memory */
200     uint32_t height;                /**< Height of the requested memory */
201     uint64_t usage;                 /**< Usage of the requested memory */
202     GraphicPixelFormat format;      /**< Format of the requested memory */
203     uint32_t expectedSize;          /**< Size assigned by memory requester */
204 };
205 
206 
207 using BufferVerifyAllocInfo = struct {
208     uint32_t width;               /**< Width of the memory to allocate */
209     uint32_t height;              /**< Height of the memory to allocate */
210     uint64_t usage;               /**< Usage of the memory */
211     GraphicPixelFormat format;    /**< Format of the memory to allocate */
212 };
213 
214 using GraphicPresentTimestampType = enum {
215     GRAPHIC_DISPLAY_PTS_UNSUPPORTED = 0,        /**< Unsupported */
216     GRAPHIC_DISPLAY_PTS_DELAY = 1 << 0,         /**< Delay */
217     GRAPHIC_DISPLAY_PTS_TIMESTAMP = 1 << 1,     /**< Timestamp */
218 };
219 
220 using GraphicPresentTimestamp = struct {
221     GraphicPresentTimestampType type;     /**< Present timestamp type */
222     int64_t time;                         /**< Present timestamp value */
223 };
224 
225 using Rect = struct {
226     int32_t x;
227     int32_t y;
228     int32_t w;
229     int32_t h;
230 };
231 
232 using ScalingMode = enum {
233     SCALING_MODE_FREEZE = 0,
234     SCALING_MODE_SCALE_TO_WINDOW,
235     SCALING_MODE_SCALE_CROP,
236     SCALING_MODE_NO_SCALE_CROP,
237     SCALING_MODE_SCALE_FIT,
238 };
239 
240 using HDRMetaDataType = enum {
241     HDR_NOT_USED = 0,
242     HDR_META_DATA,
243     HDR_META_DATA_SET,
244 };
245 
246 using GraphicHDRMetadataKey = enum {
247     GRAPHIC_MATAKEY_RED_PRIMARY_X = 0,
248     GRAPHIC_MATAKEY_RED_PRIMARY_Y = 1,
249     GRAPHIC_MATAKEY_GREEN_PRIMARY_X = 2,
250     GRAPHIC_MATAKEY_GREEN_PRIMARY_Y = 3,
251     GRAPHIC_MATAKEY_BLUE_PRIMARY_X = 4,
252     GRAPHIC_MATAKEY_BLUE_PRIMARY_Y = 5,
253     GRAPHIC_MATAKEY_WHITE_PRIMARY_X = 6,
254     GRAPHIC_MATAKEY_WHITE_PRIMARY_Y = 7,
255     GRAPHIC_MATAKEY_MAX_LUMINANCE = 8,
256     GRAPHIC_MATAKEY_MIN_LUMINANCE = 9,
257     GRAPHIC_MATAKEY_MAX_CONTENT_LIGHT_LEVEL = 10,
258     GRAPHIC_MATAKEY_MAX_FRAME_AVERAGE_LIGHT_LEVEL = 11,
259     GRAPHIC_MATAKEY_HDR10_PLUS = 12,
260     GRAPHIC_MATAKEY_HDR_VIVID = 13,
261 };
262 
263 using GraphicHDRMetaDataSet = struct GraphicHDRMetaDataSet {
264     GraphicHDRMetadataKey key = GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X;
265     std::vector<uint8_t> metaData;
266 };
267 
268 typedef struct {
269     GraphicHDRMetadataKey key;
270     float value;
271 } GraphicHDRMetaData;
272 
273 using SurfaceBufferUsage = enum {
274     BUFFER_USAGE_CPU_READ = (1ULL << 0),        /**< CPU read buffer */
275     BUFFER_USAGE_CPU_WRITE = (1ULL << 1),       /**< CPU write memory */
276     BUFFER_USAGE_MEM_MMZ = (1ULL << 2),         /**< Media memory zone (MMZ) */
277     BUFFER_USAGE_MEM_DMA = (1ULL << 3),         /**< Direct memory access (DMA) buffer */
278     BUFFER_USAGE_MEM_SHARE = (1ULL << 4),       /**< Shared memory buffer*/
279     BUFFER_USAGE_MEM_MMZ_CACHE = (1ULL << 5),   /**< MMZ with cache*/
280     BUFFER_USAGE_MEM_FB = (1ULL << 6),          /**< Framebuffer */
281     BUFFER_USAGE_ASSIGN_SIZE = (1ULL << 7),     /**< Memory assigned */
282     BUFFER_USAGE_HW_RENDER = (1ULL << 8),       /**< For GPU write case */
283     BUFFER_USAGE_HW_TEXTURE = (1ULL << 9),      /**< For GPU read case */
284     BUFFER_USAGE_HW_COMPOSER = (1ULL << 10),    /**< For hardware composer */
285     BUFFER_USAGE_PROTECTED = (1ULL << 11),      /**< For safe buffer case, such as DRM */
286     BUFFER_USAGE_CAMERA_READ = (1ULL << 12),    /**< For camera read case */
287     BUFFER_USAGE_CAMERA_WRITE = (1ULL << 13),   /**< For camera write case */
288     BUFFER_USAGE_VIDEO_ENCODER = (1ULL << 14),  /**< For encode case */
289     BUFFER_USAGE_VIDEO_DECODER = (1ULL << 15),  /**< For decode case */
290     BUFFER_USAGE_CPU_READ_OFTEN = (1ULL << 16), /**< CPU read often buffer */
291     BUFFER_USAGE_CPU_HW_BOTH = (1ULL << 17),    /**< CPU read often buffer */
292     BUFFER_USAGE_ALIGNMENT_512 = (1ULL << 18),  /**< 512 bytes alignment */
293     BUFFER_USAGE_DRM_REDRAW  = (1ULL << 24),    /**< For drm redraw framebuffer allocate */
294     BUFFER_USAGE_VENDOR_PRI0 = (1ULL << 44),    /**< Reserverd for vendor */
295     BUFFER_USAGE_VENDOR_PRI1 = (1ULL << 45),    /**< Reserverd for vendor */
296     BUFFER_USAGE_VENDOR_PRI2 = (1ULL << 46),    /**< Reserverd for vendor */
297     BUFFER_USAGE_VENDOR_PRI3 = (1ULL << 47),    /**< Reserverd for vendor */
298     BUFFER_USAGE_VENDOR_PRI4 = (1ULL << 48),    /**< Reserverd for vendor */
299     BUFFER_USAGE_VENDOR_PRI5 = (1ULL << 49),    /**< Reserverd for vendor */
300     BUFFER_USAGE_VENDOR_PRI6 = (1ULL << 50),    /**< Reserverd for vendor */
301     BUFFER_USAGE_VENDOR_PRI7 = (1ULL << 51),    /**< Reserverd for vendor */
302     BUFFER_USAGE_VENDOR_PRI8 = (1ULL << 52),    /**< Reserverd for vendor */
303     BUFFER_USAGE_VENDOR_PRI9 = (1ULL << 53),    /**< Reserverd for vendor */
304     BUFFER_USAGE_VENDOR_PRI10 = (1ULL << 54),   /**< Reserverd for vendor */
305     BUFFER_USAGE_VENDOR_PRI11 = (1ULL << 55),   /**< Reserverd for vendor */
306     BUFFER_USAGE_VENDOR_PRI12 = (1ULL << 56),   /**< Reserverd for vendor */
307     BUFFER_USAGE_VENDOR_PRI13 = (1ULL << 57),   /**< Reserverd for vendor */
308     BUFFER_USAGE_VENDOR_PRI14 = (1ULL << 58),   /**< Reserverd for vendor */
309     BUFFER_USAGE_VENDOR_PRI15 = (1ULL << 59),   /**< Reserverd for vendor */
310     BUFFER_USAGE_VENDOR_PRI16 = (1ULL << 60),   /**< Reserverd for vendor */
311     BUFFER_USAGE_VENDOR_PRI17 = (1ULL << 61),   /**< Reserverd for vendor */
312     BUFFER_USAGE_VENDOR_PRI18 = (1ULL << 62),   /**< Reserverd for vendor */
313     BUFFER_USAGE_VENDOR_PRI19 = (1ULL << 63),   /**< Reserverd for vendor */
314 };
315 
316 using GraphicColorGamut = enum {
317     GRAPHIC_COLOR_GAMUT_INVALID = -1,            /**< Invalid */
318     GRAPHIC_COLOR_GAMUT_NATIVE = 0,              /**< Native or default */
319     GRAPHIC_COLOR_GAMUT_STANDARD_BT601 = 1,      /**< Standard BT601 */
320     GRAPHIC_COLOR_GAMUT_STANDARD_BT709 = 2,      /**< Standard BT709 */
321     GRAPHIC_COLOR_GAMUT_DCI_P3 = 3,              /**< DCI P3 */
322     GRAPHIC_COLOR_GAMUT_SRGB = 4,                /**< SRGB */
323     GRAPHIC_COLOR_GAMUT_ADOBE_RGB = 5,           /**< Adobe RGB */
324     GRAPHIC_COLOR_GAMUT_DISPLAY_P3 = 6,          /**< display P3 */
325     GRAPHIC_COLOR_GAMUT_BT2020 = 7,              /**< BT2020 */
326     GRAPHIC_COLOR_GAMUT_BT2100_PQ = 8,           /**< BT2100 PQ */
327     GRAPHIC_COLOR_GAMUT_BT2100_HLG = 9,          /**< BT2100 HLG */
328     GRAPHIC_COLOR_GAMUT_DISPLAY_BT2020 = 10,     /**< Display BT2020 */
329 };
330 
331 using GraphicCM_ColorSpaceType = enum {
332     GRAPHIC_CM_COLORSPACE_NONE,
333 
334     /* COLORPRIMARIES_BT601_P | (TRANSFUNC_BT709 << 8) | (MATRIX_BT601_P << 16) | (RANGE_FULL << 21) */
335     GRAPHIC_CM_BT601_EBU_FULL      = 2 | (1 << 8) | (2 << 16) | (1 << 21),
336     /* COLORPRIMARIES_BT601_N | (TRANSFUNC_BT709 << 8) | (MATRIX_BT601_N << 16) | (RANGE_FULL << 21) */
337     GRAPHIC_CM_BT601_SMPTE_C_FULL  = 3 | (1 << 8) | (3 << 16) | (1 << 21),
338     /* COLORPRIMARIES_BT709   | (TRANSFUNC_BT709 << 8) | (MATRIX_BT709   << 16) | (RANGE_FULL << 21) */
339     GRAPHIC_CM_BT709_FULL          = 1 | (1 << 8) | (1 << 16) | (1 << 21),
340     /* COLORPRIMARIES_BT2020  | (TRANSFUNC_HLG   << 8) | (MATRIX_BT2020  << 16) | (RANGE_FULL << 21) */
341     GRAPHIC_CM_BT2020_HLG_FULL     = 4 | (5 << 8) | (4 << 16) | (1 << 21),
342     /* COLORPRIMARIES_BT2020  | (TRANSFUNC_PQ    << 8) | (MATRIX_BT2020  << 16) | (RANGE_FULL << 21) */
343     GRAPHIC_CM_BT2020_PQ_FULL      = 4 | (4 << 8) | (4 << 16) | (1 << 21),
344 
345     /* COLORPRIMARIES_BT601_P | (TRANSFUNC_BT709 << 8) | (MATRIX_BT601_P << 16) | (RANGE_LIMITED << 21) */
346     GRAPHIC_CM_BT601_EBU_LIMIT     = 2 | (1 << 8) | (2 << 16) | (2 << 21),
347     /* COLORPRIMARIES_BT601_N | (TRANSFUNC_BT709 << 8) | (MATRIX_BT601_N << 16) | (RANGE_LIMITED << 21) */
348     GRAPHIC_CM_BT601_SMPTE_C_LIMIT = 3 | (1 << 8) | (3 << 16) | (2 << 21),
349     /* COLORPRIMARIES_BT709   | (TRANSFUNC_BT709 << 8) | (MATRIX_BT709   << 16) | (RANGE_LIMITED << 21) */
350     GRAPHIC_CM_BT709_LIMIT         = 1 | (1 << 8) | (1 << 16) | (2 << 21),
351     /* COLORPRIMARIES_BT2020  | (TRANSFUNC_HLG   << 8) | (MATRIX_BT2020  << 16) | (RANGE_LIMITED << 21) */
352     GRAPHIC_CM_BT2020_HLG_LIMIT    = 4 | (5 << 8) | (4 << 16) | (2 << 21),
353     /* COLORPRIMARIES_BT2020  | (TRANSFUNC_PQ    << 8) | (MATRIX_BT2020  << 16) | (RANGE_LIMITED << 21) */
354     GRAPHIC_CM_BT2020_PQ_LIMIT     = 4 | (4 << 8) | (4 << 16) | (2 << 21),
355 
356     /* COLORPRIMARIES_SRGB     | (TRANSFUNC_SRGB     << 8) | (MATRIX_BT601_N  << 16) | (RANGE_FULL << 21) */
357     GRAPHIC_CM_SRGB_FULL           = 1 | (2 << 8) | (3 << 16) | (1 << 21),
358     /* COLORPRIMARIES_P3_D65   | (TRANSFUNC_SRGB     << 8) | (MATRIX_P3       << 16) | (RANGE_FULL << 21) */
359     GRAPHIC_CM_P3_FULL             = 6 | (2 << 8) | (3 << 16) | (1 << 21),
360     /* COLORPRIMARIES_P3_D65   | (TRANSFUNC_HLG      << 8) | (MATRIX_P3       << 16) | (RANGE_FULL << 21) */
361     GRAPHIC_CM_P3_HLG_FULL         = 6 | (5 << 8) | (3 << 16) | (1 << 21),
362     /* COLORPRIMARIES_P3_D65   | (TRANSFUNC_PQ       << 8) | (MATRIX_P3       << 16) | (RANGE_FULL << 21) */
363     GRAPHIC_CM_P3_PQ_FULL          = 6 | (4 << 8) | (3 << 16) | (1 << 21),
364     /* COLORPRIMARIES_ADOBERGB | (TRANSFUNC_ADOBERGB << 8) | (MATRIX_ADOBERGB << 16) | (RANGE_FULL << 21) */
365     GRAPHIC_CM_ADOBERGB_FULL       = 23 | (6 << 8) | (0 << 16) | (1 << 21),
366 
367     /* COLORPRIMARIES_SRGB     | (TRANSFUNC_SRGB     << 8) | (MATRIX_BT601_N  << 16) | (RANGE_LIMITED << 21) */
368     GRAPHIC_CM_SRGB_LIMIT          = 1 | (2 << 8) | (3 << 16) | (2 << 21),
369     /* COLORPRIMARIES_P3_D65   | (TRANSFUNC_SRGB     << 8) | (MATRIX_P3       << 16) | (RANGE_LIMITED << 21) */
370     GRAPHIC_CM_P3_LIMIT            = 6 | (2 << 8) | (3 << 16) | (2 << 21),
371     /* COLORPRIMARIES_P3_D65   | (TRANSFUNC_HLG      << 8) | (MATRIX_P3       << 16) | (RANGE_LIMITED << 21) */
372     GRAPHIC_CM_P3_HLG_LIMIT        = 6 | (5 << 8) | (3 << 16) | (2 << 21),
373     /* COLORPRIMARIES_P3_D65   | (TRANSFUNC_PQ       << 8) | (MATRIX_P3       << 16) | (RANGE_LIMITED << 21) */
374     GRAPHIC_CM_P3_PQ_LIMIT         = 6 | (4 << 8) | (3 << 16) | (2 << 21),
375     /* COLORPRIMARIES_ADOBERGB | (TRANSFUNC_ADOBERGB << 8) | (MATRIX_ADOBERGB << 16) | (RANGE_LIMITED << 21) */
376     GRAPHIC_CM_ADOBERGB_LIMIT      = 23 | (6 << 8) | (0 << 16) | (2 << 21),
377 
378     /* COLORPRIMARIES_SRGB   | (TRANSFUNC_LINEAR << 8) */
379     GRAPHIC_CM_LINEAR_SRGB         = 1 | (3 << 8),
380     /* equal to GRAPHIC_CM_LINEAR_SRGB */
381     GRAPHIC_CM_LINEAR_BT709        = 1 | (3 << 8),
382     /* COLORPRIMARIES_P3_D65 | (TRANSFUNC_LINEAR << 8) */
383     GRAPHIC_CM_LINEAR_P3           = 6 | (3 << 8),
384     /* COLORPRIMARIES_BT2020 | (TRANSFUNC_LINEAR << 8) */
385     GRAPHIC_CM_LINEAR_BT2020       = 4 | (3 << 8),
386 
387     /* equal to GRAPHIC_CM_SRGB_FULL */
388     GRAPHIC_CM_DISPLAY_SRGB        = 1 | (2 << 8) | (3 << 16) | (1 << 21),
389     /* equal to GRAPHIC_CM_P3_FULL */
390     GRAPHIC_CM_DISPLAY_P3_SRGB     = 6 | (2 << 8) | (3 << 16) | (1 << 21),
391     /* equal to GRAPHIC_CM_P3_HLG_FULL */
392     GRAPHIC_CM_DISPLAY_P3_HLG      = 6 | (5 << 8) | (3 << 16) | (1 << 21),
393     /* equal to GRAPHIC_CM_P3_PQ_FULL */
394     GRAPHIC_CM_DISPLAY_P3_PQ       = 6 | (4 << 8) | (3 << 16) | (1 << 21),
395     /* COLORPRIMARIES_BT2020   | (TRANSFUNC_SRGB << 8)     | (MATRIX_BT2020 << 16)   | (RANGE_FULL << 21) */
396     GRAPHIC_CM_DISPLAY_BT2020_SRGB = 4 | (2 << 8) | (4 << 16) | (1 << 21),
397     /* equal to GRAPHIC_CM_BT2020_HLG_FULL */
398     GRAPHIC_CM_DISPLAY_BT2020_HLG  = 4 | (5 << 8) | (4 << 16) | (1 << 21),
399     /* equal to GRAPHIC_CM_BT2020_PQ_FULL */
400     GRAPHIC_CM_DISPLAY_BT2020_PQ   = 4 | (4 << 8) | (4 << 16) | (1 << 21)
401 };
402 
403 using GraphicColorDataSpace = enum {
404     GRAPHIC_COLOR_DATA_SPACE_UNKNOWN = 0,
405     GRAPHIC_GAMUT_BT601 = 0x00000001,
406     GRAPHIC_GAMUT_BT709 = 0x00000002,
407     GRAPHIC_GAMUT_DCI_P3 = 0x00000003,
408     GRAPHIC_GAMUT_SRGB = 0x00000004,
409     GRAPHIC_GAMUT_ADOBE_RGB = 0x00000005,
410     GRAPHIC_GAMUT_DISPLAY_P3 = 0x00000006,
411     GRAPHIC_GAMUT_BT2020 = 0x00000007,
412     GRAPHIC_GAMUT_BT2100_PQ = 0x00000008,
413     GRAPHIC_GAMUT_BT2100_HLG = 0x00000009,
414     GRAPHIC_GAMUT_DISPLAY_BT2020 = 0x0000000a,
415     GRAPHIC_TRANSFORM_FUNC_UNSPECIFIED = 0x00000100,
416     GRAPHIC_TRANSFORM_FUNC_LINEAR = 0x00000200,
417     GRAPHIC_TRANSFORM_FUNC_SRGB = 0x00000300,
418     GRAPHIC_TRANSFORM_FUNC_SMPTE_170M = 0x00000400,
419     GRAPHIC_TRANSFORM_FUNC_GM2_2 = 0x00000500,
420     GRAPHIC_TRANSFORM_FUNC_GM2_6 = 0x00000600,
421     GRAPHIC_TRANSFORM_FUNC_GM2_8 = 0x00000700,
422     GRAPHIC_TRANSFORM_FUNC_ST2084 = 0x00000800,
423     GRAPHIC_TRANSFORM_FUNC_HLG = 0x00000900,
424     GRAPHIC_PRECISION_UNSPECIFIED = 0x00010000,
425     GRAPHIC_PRECISION_FULL = 0x00020000,
426     GRAPHIC_PRESION_LIMITED = 0x00030000,
427     GRAPHIC_PRESION_EXTENDED = 0x00040000,
428     GRAPHIC_BT601_SMPTE170M_FULL = GRAPHIC_GAMUT_BT601 | GRAPHIC_TRANSFORM_FUNC_SMPTE_170M | GRAPHIC_PRECISION_FULL,
429     GRAPHIC_BT601_SMPTE170M_LIMITED = GRAPHIC_GAMUT_BT601 | GRAPHIC_TRANSFORM_FUNC_SMPTE_170M |
430         GRAPHIC_PRESION_LIMITED,
431     GRAPHIC_BT709_LINEAR_FULL = GRAPHIC_GAMUT_BT709 | GRAPHIC_TRANSFORM_FUNC_LINEAR | GRAPHIC_PRECISION_FULL,
432     GRAPHIC_BT709_LINEAR_EXTENDED = GRAPHIC_GAMUT_BT709 | GRAPHIC_TRANSFORM_FUNC_LINEAR | GRAPHIC_PRESION_EXTENDED,
433     GRAPHIC_BT709_SRGB_FULL = GRAPHIC_GAMUT_BT709 | GRAPHIC_TRANSFORM_FUNC_SRGB | GRAPHIC_PRECISION_FULL,
434     GRAPHIC_BT709_SRGB_EXTENDED = GRAPHIC_GAMUT_BT709 | GRAPHIC_TRANSFORM_FUNC_SRGB | GRAPHIC_PRESION_EXTENDED,
435     GRAPHIC_BT709_SMPTE170M_LIMITED = GRAPHIC_GAMUT_BT709 | GRAPHIC_TRANSFORM_FUNC_SMPTE_170M |
436         GRAPHIC_PRESION_LIMITED,
437     GRAPHIC_DCI_P3_LINEAR_FULL = GRAPHIC_GAMUT_DCI_P3 | GRAPHIC_TRANSFORM_FUNC_LINEAR | GRAPHIC_PRECISION_FULL,
438     GRAPHIC_DCI_P3_GAMMA26_FULL = GRAPHIC_GAMUT_DCI_P3 | GRAPHIC_TRANSFORM_FUNC_GM2_6 | GRAPHIC_PRECISION_FULL,
439     GRAPHIC_DISPLAY_P3_LINEAR_FULL = GRAPHIC_GAMUT_DISPLAY_P3 | GRAPHIC_TRANSFORM_FUNC_LINEAR | GRAPHIC_PRECISION_FULL,
440     GRAPHIC_DCI_P3_SRGB_FULL = GRAPHIC_GAMUT_DCI_P3 | GRAPHIC_TRANSFORM_FUNC_SRGB | GRAPHIC_PRECISION_FULL,
441     GRAPHIC_ADOBE_RGB_GAMMA22_FULL = GRAPHIC_GAMUT_ADOBE_RGB | GRAPHIC_TRANSFORM_FUNC_GM2_2 | GRAPHIC_PRECISION_FULL,
442     GRAPHIC_BT2020_LINEAR_FULL = GRAPHIC_GAMUT_BT2020 | GRAPHIC_TRANSFORM_FUNC_LINEAR | GRAPHIC_PRECISION_FULL,
443     GRAPHIC_BT2020_SRGB_FULL = GRAPHIC_GAMUT_BT2020 | GRAPHIC_TRANSFORM_FUNC_SRGB | GRAPHIC_PRECISION_FULL,
444     GRAPHIC_BT2020_SMPTE170M_FULL = GRAPHIC_GAMUT_BT2020 | GRAPHIC_TRANSFORM_FUNC_SMPTE_170M | GRAPHIC_PRECISION_FULL,
445     GRAPHIC_BT2020_ST2084_FULL = GRAPHIC_GAMUT_BT2020 | GRAPHIC_TRANSFORM_FUNC_ST2084 | GRAPHIC_PRECISION_FULL,
446     GRAPHIC_BT2020_HLG_FULL = GRAPHIC_GAMUT_BT2020 | GRAPHIC_TRANSFORM_FUNC_HLG | GRAPHIC_PRECISION_FULL,
447     GRAPHIC_BT2020_ST2084_LIMITED = GRAPHIC_GAMUT_BT2020 | GRAPHIC_TRANSFORM_FUNC_ST2084 | GRAPHIC_PRESION_LIMITED,
448 };
449 
450 using GraphicTransformType = enum {
451     GRAPHIC_ROTATE_NONE = 0,        /**< No rotation */
452     GRAPHIC_ROTATE_90,              /**< Rotation by 90 degrees */
453     GRAPHIC_ROTATE_180,             /**< Rotation by 180 degrees */
454     GRAPHIC_ROTATE_270,             /**< Rotation by 270 degrees */
455     GRAPHIC_FLIP_H,                 /**< Flip horizontally */
456     GRAPHIC_FLIP_V,                 /**< Flip vertically */
457     GRAPHIC_FLIP_H_ROT90,           /**< Flip horizontally and rotate 90 degrees */
458     GRAPHIC_FLIP_V_ROT90,           /**< Flip vertically and rotate 90 degrees */
459     GRAPHIC_FLIP_H_ROT180,          /**< Flip horizontally and rotate 180 degrees */
460     GRAPHIC_FLIP_V_ROT180,          /**< Flip vertically and rotate 180 degrees */
461     GRAPHIC_FLIP_H_ROT270,          /**< Flip horizontally and rotate 270 degrees */
462     GRAPHIC_FLIP_V_ROT270,          /**< Flip vertically and rotate 270 degrees */
463     GRAPHIC_ROTATE_BUTT            /**< Invalid operation */
464 };
465 
466 using BufferRequestConfig = struct BufferRequestConfig {
467     int32_t width;
468     int32_t height;
469     int32_t strideAlignment; // output parameter, system components can ignore it
470     int32_t format; // GraphicPixelFormat
471     uint64_t usage;
472     int32_t timeout;
473     GraphicColorGamut colorGamut = GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB;
474     GraphicTransformType transform = GraphicTransformType::GRAPHIC_ROTATE_NONE;
475     bool operator ==(const struct BufferRequestConfig &config) const
476     {
477         return width == config.width && height == config.height &&
478                format == config.format && usage == config.usage;
479     }
480     bool operator != (const struct BufferRequestConfig &config) const
481     {
482         return !(*this == config);
483     }
484 };
485 
486 using BufferFlushConfig = struct {
487     Rect damage;
488     int64_t timestamp;
489     int64_t desiredPresentTimestamp;
490 };
491 
492 using BufferFlushConfigWithDamages = struct BufferFlushConfigWithDamages {
493     std::vector<Rect> damages = {};
494     int64_t timestamp;
495     int64_t desiredPresentTimestamp;
496 };
497 
498 using SceneType = enum {
499     SURFACE_SCENE_TYPE_EGL = 0,
500     SURFACE_SCENE_TYPE_MEDIA,
501     SURFACE_SCENE_TYPE_CAMERA,
502     SURFACE_SCENE_TYPE_CPU,
503 };
504 
505 using GraphicExtDataHandle = struct {
506     /**< Handle fd, -1 if not supported */
507     int32_t fd;
508     /**< the number of reserved integer value */
509     uint32_t reserveInts;
510     /**< the reserved data */
511     int32_t reserve[0];
512 };
513 } // namespace OHOS
514 
515 #endif // INTERFACES_INNERKITS_SURFACE_SURFACE_TYPE_H
516