xref: /OK3568_Linux_fs/external/rknpu2/examples/3rdparty/rga/RV110X/include/im2d.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
3*4882a593Smuzhiyun  * Authors:
4*4882a593Smuzhiyun  *  PutinLee <putin.lee@rock-chips.com>
5*4882a593Smuzhiyun  *  Cerf Yu <cerf.yu@rock-chips.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
8*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
9*4882a593Smuzhiyun  * You may obtain a copy of the License at
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
14*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
15*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
17*4882a593Smuzhiyun  * limitations under the License.
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #ifndef _im2d_h_
21*4882a593Smuzhiyun #define _im2d_h_
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #ifdef __cplusplus
24*4882a593Smuzhiyun extern "C" {
25*4882a593Smuzhiyun #endif
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include "im2d_version.h"
28*4882a593Smuzhiyun #include "im2d_type.h"
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #ifndef IM_API
31*4882a593Smuzhiyun #define IM_API /* define API export as needed */
32*4882a593Smuzhiyun #endif
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define RGA_GET_MIN(n1, n2) ((n1) < (n2) ? (n1) : (n2))
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /*
37*4882a593Smuzhiyun  * @return error message string
38*4882a593Smuzhiyun  */
39*4882a593Smuzhiyun #define imStrError(...) \
40*4882a593Smuzhiyun     ({ \
41*4882a593Smuzhiyun         const char* im2d_api_err; \
42*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
43*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
44*4882a593Smuzhiyun         if (__argc == 0) { \
45*4882a593Smuzhiyun             im2d_api_err = imStrError_t(IM_STATUS_INVALID_PARAM); \
46*4882a593Smuzhiyun         } else if (__argc == 1){ \
47*4882a593Smuzhiyun             im2d_api_err = imStrError_t((IM_STATUS)__args[0]); \
48*4882a593Smuzhiyun         } else { \
49*4882a593Smuzhiyun             im2d_api_err = ("Fatal error, imStrError() too many parameters\n"); \
50*4882a593Smuzhiyun             printf("Fatal error, imStrError() too many parameters\n"); \
51*4882a593Smuzhiyun         } \
52*4882a593Smuzhiyun         im2d_api_err; \
53*4882a593Smuzhiyun     })
54*4882a593Smuzhiyun IM_API const char* imStrError_t(IM_STATUS status);
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /*
57*4882a593Smuzhiyun  * Import external buffers into RGA driver.
58*4882a593Smuzhiyun  *
59*4882a593Smuzhiyun  * @param fd/va/pa
60*4882a593Smuzhiyun  *      Select dma_fd/virtual_address/physical_address by buffer type
61*4882a593Smuzhiyun  * @param param
62*4882a593Smuzhiyun  *      Configure buffer parameters
63*4882a593Smuzhiyun  *
64*4882a593Smuzhiyun  * @return rga_buffer_handle_t
65*4882a593Smuzhiyun  */
66*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_fd(int fd, im_handle_param_t *param);
67*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, im_handle_param_t *param);
68*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, im_handle_param_t *param);
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun /*
71*4882a593Smuzhiyun  * Import external buffers into RGA driver.
72*4882a593Smuzhiyun  *
73*4882a593Smuzhiyun  * @param handle
74*4882a593Smuzhiyun  *      rga buffer handle
75*4882a593Smuzhiyun  *
76*4882a593Smuzhiyun  * @return success or else negative error code.
77*4882a593Smuzhiyun  */
78*4882a593Smuzhiyun IM_API IM_STATUS releasebuffer_handle(rga_buffer_handle_t handle);
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /*
81*4882a593Smuzhiyun  * Wrap image Parameters.
82*4882a593Smuzhiyun  *
83*4882a593Smuzhiyun  * @param handle
84*4882a593Smuzhiyun  *      RGA buffer handle.
85*4882a593Smuzhiyun  * @param width
86*4882a593Smuzhiyun  *      Width of image manipulation area.
87*4882a593Smuzhiyun  * @param height
88*4882a593Smuzhiyun  *      Height of image manipulation area.
89*4882a593Smuzhiyun  * @param wstride
90*4882a593Smuzhiyun  *      Width pixel stride, default (width = wstride).
91*4882a593Smuzhiyun  * @param hstride
92*4882a593Smuzhiyun  *      Height pixel stride, default (height = hstride).
93*4882a593Smuzhiyun  * @param format
94*4882a593Smuzhiyun  *      Image format.
95*4882a593Smuzhiyun  *
96*4882a593Smuzhiyun  * @return rga_buffer_t
97*4882a593Smuzhiyun  */
98*4882a593Smuzhiyun #define wrapbuffer_handle(handle, width, height, format, ...) \
99*4882a593Smuzhiyun     ({ \
100*4882a593Smuzhiyun         rga_buffer_t im2d_api_buffer; \
101*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
102*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
103*4882a593Smuzhiyun         if (__argc == 0) { \
104*4882a593Smuzhiyun             im2d_api_buffer = wrapbuffer_handle_t(handle, width, height, width, height, format); \
105*4882a593Smuzhiyun         } else if (__argc == 2){ \
106*4882a593Smuzhiyun             im2d_api_buffer = wrapbuffer_handle_t(handle, width, height, __args[0], __args[1], format); \
107*4882a593Smuzhiyun         } else { \
108*4882a593Smuzhiyun             printf("invalid parameter\n"); \
109*4882a593Smuzhiyun         } \
110*4882a593Smuzhiyun         im2d_api_buffer; \
111*4882a593Smuzhiyun     })
112*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_handle_t(rga_buffer_handle_t handle, int width, int height, int wstride, int hstride, int format);
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun /* For legarcy. */
115*4882a593Smuzhiyun #define wrapbuffer_virtualaddr(vir_addr, width, height, format, ...) \
116*4882a593Smuzhiyun     ({ \
117*4882a593Smuzhiyun         rga_buffer_t im2d_api_buffer; \
118*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
119*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
120*4882a593Smuzhiyun         if (__argc == 0) { \
121*4882a593Smuzhiyun             im2d_api_buffer = wrapbuffer_virtualaddr_t(vir_addr, width, height, width, height, format); \
122*4882a593Smuzhiyun         } else if (__argc == 2){ \
123*4882a593Smuzhiyun             im2d_api_buffer = wrapbuffer_virtualaddr_t(vir_addr, width, height, __args[0], __args[1], format); \
124*4882a593Smuzhiyun         } else { \
125*4882a593Smuzhiyun             printf("invalid parameter\n"); \
126*4882a593Smuzhiyun         } \
127*4882a593Smuzhiyun         im2d_api_buffer; \
128*4882a593Smuzhiyun     })
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun #define wrapbuffer_physicaladdr(phy_addr, width, height, format, ...) \
131*4882a593Smuzhiyun     ({ \
132*4882a593Smuzhiyun         rga_buffer_t im2d_api_buffer; \
133*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
134*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
135*4882a593Smuzhiyun         if (__argc == 0) { \
136*4882a593Smuzhiyun             im2d_api_buffer = wrapbuffer_physicaladdr_t(phy_addr, width, height, width, height, format); \
137*4882a593Smuzhiyun         } else if (__argc == 2){ \
138*4882a593Smuzhiyun             im2d_api_buffer = wrapbuffer_physicaladdr_t(phy_addr, width, height, __args[0], __args[1], format); \
139*4882a593Smuzhiyun         } else { \
140*4882a593Smuzhiyun             printf("invalid parameter\n"); \
141*4882a593Smuzhiyun         } \
142*4882a593Smuzhiyun         im2d_api_buffer; \
143*4882a593Smuzhiyun     })
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun #define wrapbuffer_fd(fd, width, height, format, ...) \
146*4882a593Smuzhiyun     ({ \
147*4882a593Smuzhiyun         rga_buffer_t im2d_api_buffer; \
148*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
149*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
150*4882a593Smuzhiyun         if (__argc == 0) { \
151*4882a593Smuzhiyun             im2d_api_buffer = wrapbuffer_fd_t(fd, width, height, width, height, format); \
152*4882a593Smuzhiyun         } else if (__argc == 2){ \
153*4882a593Smuzhiyun             im2d_api_buffer = wrapbuffer_fd_t(fd, width, height, __args[0], __args[1], format); \
154*4882a593Smuzhiyun         } else { \
155*4882a593Smuzhiyun             printf("invalid parameter\n"); \
156*4882a593Smuzhiyun         } \
157*4882a593Smuzhiyun         im2d_api_buffer; \
158*4882a593Smuzhiyun     })
159*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_virtualaddr_t(void* vir_addr, int width, int height, int wstride, int hstride, int format);
160*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_physicaladdr_t(void* phy_addr, int width, int height, int wstride, int hstride, int format);
161*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_fd_t(int fd, int width, int height, int wstride, int hstride, int format);
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun /*
164*4882a593Smuzhiyun  * Query RGA basic information, supported resolution, supported format, etc.
165*4882a593Smuzhiyun  *
166*4882a593Smuzhiyun  * @param name
167*4882a593Smuzhiyun  *      RGA_VENDOR
168*4882a593Smuzhiyun  *      RGA_VERSION
169*4882a593Smuzhiyun  *      RGA_MAX_INPUT
170*4882a593Smuzhiyun  *      RGA_MAX_OUTPUT
171*4882a593Smuzhiyun  *      RGA_INPUT_FORMAT
172*4882a593Smuzhiyun  *      RGA_OUTPUT_FORMAT
173*4882a593Smuzhiyun  *      RGA_EXPECTED
174*4882a593Smuzhiyun  *      RGA_ALL
175*4882a593Smuzhiyun  *
176*4882a593Smuzhiyun  * @returns a string describing properties of RGA.
177*4882a593Smuzhiyun  */
178*4882a593Smuzhiyun IM_API const char* querystring(int name);
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun /*
181*4882a593Smuzhiyun  * check RGA basic information, supported resolution, supported format, etc.
182*4882a593Smuzhiyun  *
183*4882a593Smuzhiyun  * @param src
184*4882a593Smuzhiyun  * @param dst
185*4882a593Smuzhiyun  * @param src_rect
186*4882a593Smuzhiyun  * @param dst_rect
187*4882a593Smuzhiyun  * @param mode_usage
188*4882a593Smuzhiyun  *
189*4882a593Smuzhiyun  * @returns no error or else negative error code.
190*4882a593Smuzhiyun  */
191*4882a593Smuzhiyun #define imcheck(src, dst, src_rect, dst_rect, ...) \
192*4882a593Smuzhiyun     ({ \
193*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_NOERROR; \
194*4882a593Smuzhiyun         rga_buffer_t __pat; \
195*4882a593Smuzhiyun         im_rect __pat_rect; \
196*4882a593Smuzhiyun         memset(&__pat, 0, sizeof(rga_buffer_t)); \
197*4882a593Smuzhiyun         memset(&__pat_rect, 0, sizeof(im_rect)); \
198*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
199*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
200*4882a593Smuzhiyun         if (__argc == 0) { \
201*4882a593Smuzhiyun             rga_check_perpare((rga_buffer_t *)(&src), (rga_buffer_t *)(&dst), (rga_buffer_t *)(&__pat), \
202*4882a593Smuzhiyun                               (im_rect *)(&src_rect), (im_rect *)(&dst_rect), (im_rect *)(&__pat_rect), 0); \
203*4882a593Smuzhiyun             __ret = imcheck_t(src, dst, __pat, src_rect, dst_rect, __pat_rect, 0); \
204*4882a593Smuzhiyun         } else if (__argc == 1){ \
205*4882a593Smuzhiyun             rga_check_perpare((rga_buffer_t *)(&src), (rga_buffer_t *)(&dst), (rga_buffer_t *)(&__pat), \
206*4882a593Smuzhiyun                               (im_rect *)(&src_rect), (im_rect *)(&dst_rect), (im_rect *)(&__pat_rect), __args[0]); \
207*4882a593Smuzhiyun             __ret = imcheck_t(src, dst, __pat, src_rect, dst_rect, __pat_rect, __args[0]); \
208*4882a593Smuzhiyun         } else { \
209*4882a593Smuzhiyun             __ret = IM_STATUS_FAILED; \
210*4882a593Smuzhiyun             printf("check failed\n"); \
211*4882a593Smuzhiyun         } \
212*4882a593Smuzhiyun         __ret; \
213*4882a593Smuzhiyun     })
214*4882a593Smuzhiyun #define imcheck_composite(src, dst, pat, src_rect, dst_rect, pat_rect, ...) \
215*4882a593Smuzhiyun     ({ \
216*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_NOERROR; \
217*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
218*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
219*4882a593Smuzhiyun         if (__argc == 0) { \
220*4882a593Smuzhiyun             rga_check_perpare((rga_buffer_t *)(&src), (rga_buffer_t *)(&dst), (rga_buffer_t *)(&pat), \
221*4882a593Smuzhiyun                               (im_rect *)(&src_rect), (im_rect *)(&dst_rect), (im_rect *)(&pat_rect), 0); \
222*4882a593Smuzhiyun             __ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, 0); \
223*4882a593Smuzhiyun         } else if (__argc == 1){ \
224*4882a593Smuzhiyun             rga_check_perpare((rga_buffer_t *)(&src), (rga_buffer_t *)(&dst), (rga_buffer_t *)(&pat), \
225*4882a593Smuzhiyun                               (im_rect *)(&src_rect), (im_rect *)(&dst_rect), (im_rect *)(&pat_rect), __args[0]); \
226*4882a593Smuzhiyun             __ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, __args[0]); \
227*4882a593Smuzhiyun         } else { \
228*4882a593Smuzhiyun             __ret = IM_STATUS_FAILED; \
229*4882a593Smuzhiyun             printf("check failed\n"); \
230*4882a593Smuzhiyun         } \
231*4882a593Smuzhiyun         __ret; \
232*4882a593Smuzhiyun     })
233*4882a593Smuzhiyun IM_API void rga_check_perpare(rga_buffer_t *src, rga_buffer_t *dst, rga_buffer_t *pat,
234*4882a593Smuzhiyun                               im_rect *src_rect, im_rect *dst_rect, im_rect *pat_rect, int mode_usage);
235*4882a593Smuzhiyun IM_API IM_STATUS imcheck_t(const rga_buffer_t src, const rga_buffer_t dst, const rga_buffer_t pat,
236*4882a593Smuzhiyun                            const im_rect src_rect, const im_rect dst_rect, const im_rect pat_rect, const int mode_usage);
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun /*
239*4882a593Smuzhiyun  * Resize
240*4882a593Smuzhiyun  *
241*4882a593Smuzhiyun  * @param src
242*4882a593Smuzhiyun  * @param dst
243*4882a593Smuzhiyun  * @param fx
244*4882a593Smuzhiyun  * @param fy
245*4882a593Smuzhiyun  * @param interpolation
246*4882a593Smuzhiyun  * @param sync
247*4882a593Smuzhiyun  *      wait until operation complete
248*4882a593Smuzhiyun  *
249*4882a593Smuzhiyun  * @returns success or else negative error code.
250*4882a593Smuzhiyun  */
251*4882a593Smuzhiyun #define imresize(src, dst, ...) \
252*4882a593Smuzhiyun     ({ \
253*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
254*4882a593Smuzhiyun         double __args[] = {__VA_ARGS__}; \
255*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(double); \
256*4882a593Smuzhiyun         if (__argc == 0) { \
257*4882a593Smuzhiyun             __ret = imresize_t(src, dst, 0, 0, INTER_LINEAR, 1); \
258*4882a593Smuzhiyun         } else if (__argc == 2){ \
259*4882a593Smuzhiyun             __ret = imresize_t(src, dst, __args[RGA_GET_MIN(__argc, 0)], __args[RGA_GET_MIN(__argc, 1)], INTER_LINEAR, 1); \
260*4882a593Smuzhiyun         } else if (__argc == 3){ \
261*4882a593Smuzhiyun             __ret = imresize_t(src, dst, __args[RGA_GET_MIN(__argc, 0)], __args[RGA_GET_MIN(__argc, 1)], (int)__args[RGA_GET_MIN(__argc, 2)], 1); \
262*4882a593Smuzhiyun         } else if (__argc == 4){ \
263*4882a593Smuzhiyun             __ret = imresize_t(src, dst, __args[RGA_GET_MIN(__argc, 0)], __args[RGA_GET_MIN(__argc, 1)], (int)__args[RGA_GET_MIN(__argc, 2)], (int)__args[RGA_GET_MIN(__argc, 3)]); \
264*4882a593Smuzhiyun         } else { \
265*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
266*4882a593Smuzhiyun             printf("invalid parameter\n"); \
267*4882a593Smuzhiyun         } \
268*4882a593Smuzhiyun         __ret; \
269*4882a593Smuzhiyun     })
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun #define impyramid(src, dst, direction) \
272*4882a593Smuzhiyun         imresize_t(src, \
273*4882a593Smuzhiyun                    dst, \
274*4882a593Smuzhiyun                    direction == IM_UP_SCALE ? 0.5 : 2, \
275*4882a593Smuzhiyun                    direction == IM_UP_SCALE ? 0.5 : 2, \
276*4882a593Smuzhiyun                    INTER_LINEAR, 1)
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun IM_API IM_STATUS imresize_t(const rga_buffer_t src, rga_buffer_t dst, double fx, double fy, int interpolation, int sync);
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun /*
281*4882a593Smuzhiyun  * Crop
282*4882a593Smuzhiyun  *
283*4882a593Smuzhiyun  * @param src
284*4882a593Smuzhiyun  * @param dst
285*4882a593Smuzhiyun  * @param rect
286*4882a593Smuzhiyun  * @param sync
287*4882a593Smuzhiyun  *      wait until operation complete
288*4882a593Smuzhiyun  *
289*4882a593Smuzhiyun  * @returns success or else negative error code.
290*4882a593Smuzhiyun  */
291*4882a593Smuzhiyun #define imcrop(src, dst, rect, ...) \
292*4882a593Smuzhiyun     ({ \
293*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
294*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
295*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
296*4882a593Smuzhiyun         if (__argc == 0) { \
297*4882a593Smuzhiyun             __ret = imcrop_t(src, dst, rect, 1); \
298*4882a593Smuzhiyun         } else if (__argc == 1){ \
299*4882a593Smuzhiyun             __ret = imcrop_t(src, dst, rect, (int)__args[RGA_GET_MIN(__argc, 0)]); \
300*4882a593Smuzhiyun         } else { \
301*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
302*4882a593Smuzhiyun             printf("invalid parameter\n"); \
303*4882a593Smuzhiyun         } \
304*4882a593Smuzhiyun         __ret; \
305*4882a593Smuzhiyun     })
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun IM_API IM_STATUS imcrop_t(const rga_buffer_t src, rga_buffer_t dst, im_rect rect, int sync);
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun /*
310*4882a593Smuzhiyun  * rotation
311*4882a593Smuzhiyun  *
312*4882a593Smuzhiyun  * @param src
313*4882a593Smuzhiyun  * @param dst
314*4882a593Smuzhiyun  * @param rotation
315*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_ROT_90
316*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_ROT_180
317*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_ROT_270
318*4882a593Smuzhiyun  * @param sync
319*4882a593Smuzhiyun  *      wait until operation complete
320*4882a593Smuzhiyun  *
321*4882a593Smuzhiyun  * @returns success or else negative error code.
322*4882a593Smuzhiyun  */
323*4882a593Smuzhiyun #define imrotate(src, dst, rotation, ...) \
324*4882a593Smuzhiyun     ({ \
325*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
326*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
327*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
328*4882a593Smuzhiyun         if (__argc == 0) { \
329*4882a593Smuzhiyun             __ret = imrotate_t(src, dst, rotation, 1); \
330*4882a593Smuzhiyun         } else if (__argc == 1){ \
331*4882a593Smuzhiyun             __ret = imrotate_t(src, dst, rotation, (int)__args[RGA_GET_MIN(__argc, 0)]); \
332*4882a593Smuzhiyun         } else { \
333*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
334*4882a593Smuzhiyun             printf("invalid parameter\n"); \
335*4882a593Smuzhiyun         } \
336*4882a593Smuzhiyun         __ret; \
337*4882a593Smuzhiyun     })
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun IM_API IM_STATUS imrotate_t(const rga_buffer_t src, rga_buffer_t dst, int rotation, int sync);
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun /*
342*4882a593Smuzhiyun  * flip
343*4882a593Smuzhiyun  *
344*4882a593Smuzhiyun  * @param src
345*4882a593Smuzhiyun  * @param dst
346*4882a593Smuzhiyun  * @param mode
347*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_FLIP_H
348*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_FLIP_V
349*4882a593Smuzhiyun  * @param sync
350*4882a593Smuzhiyun  *      wait until operation complete
351*4882a593Smuzhiyun  *
352*4882a593Smuzhiyun  * @returns success or else negative error code.
353*4882a593Smuzhiyun  */
354*4882a593Smuzhiyun #define imflip(src, dst, mode, ...) \
355*4882a593Smuzhiyun     ({ \
356*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
357*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
358*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
359*4882a593Smuzhiyun         if (__argc == 0) { \
360*4882a593Smuzhiyun             __ret = imflip_t(src, dst, mode, 1); \
361*4882a593Smuzhiyun         } else if (__argc == 1){ \
362*4882a593Smuzhiyun             __ret = imflip_t(src, dst, mode, (int)__args[RGA_GET_MIN(__argc, 0)]); \
363*4882a593Smuzhiyun         } else { \
364*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
365*4882a593Smuzhiyun             printf("invalid parameter\n"); \
366*4882a593Smuzhiyun         } \
367*4882a593Smuzhiyun         __ret; \
368*4882a593Smuzhiyun     })
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun IM_API IM_STATUS imflip_t (const rga_buffer_t src, rga_buffer_t dst, int mode, int sync);
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun /*
373*4882a593Smuzhiyun  * fill/reset/draw
374*4882a593Smuzhiyun  *
375*4882a593Smuzhiyun  * @param src
376*4882a593Smuzhiyun  * @param dst
377*4882a593Smuzhiyun  * @param rect
378*4882a593Smuzhiyun  * @param color
379*4882a593Smuzhiyun  * @param sync
380*4882a593Smuzhiyun  *      wait until operation complete
381*4882a593Smuzhiyun  *
382*4882a593Smuzhiyun  * @returns success or else negative error code.
383*4882a593Smuzhiyun  */
384*4882a593Smuzhiyun #define imfill(buf, rect, color, ...) \
385*4882a593Smuzhiyun     ({ \
386*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
387*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
388*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
389*4882a593Smuzhiyun         if (__argc == 0) { \
390*4882a593Smuzhiyun             __ret = imfill_t(buf, rect, color, 1); \
391*4882a593Smuzhiyun         } else if (__argc == 1){ \
392*4882a593Smuzhiyun             __ret = imfill_t(buf, rect, color, (int)__args[RGA_GET_MIN(__argc, 0)]); \
393*4882a593Smuzhiyun         } else { \
394*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
395*4882a593Smuzhiyun             printf("invalid parameter\n"); \
396*4882a593Smuzhiyun         } \
397*4882a593Smuzhiyun         __ret; \
398*4882a593Smuzhiyun     })
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun #define imreset(buf, rect, color, ...) \
401*4882a593Smuzhiyun     ({ \
402*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
403*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
404*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
405*4882a593Smuzhiyun         if (__argc == 0) { \
406*4882a593Smuzhiyun             __ret = imfill_t(buf, rect, color, 1); \
407*4882a593Smuzhiyun         } else if (__argc == 1){ \
408*4882a593Smuzhiyun             __ret = imfill_t(buf, rect, color, (int)__args[RGA_GET_MIN(__argc, 0)]); \
409*4882a593Smuzhiyun         } else { \
410*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
411*4882a593Smuzhiyun             printf("invalid parameter\n"); \
412*4882a593Smuzhiyun         } \
413*4882a593Smuzhiyun         __ret; \
414*4882a593Smuzhiyun     })
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun #define imdraw(buf, rect, color, ...) \
417*4882a593Smuzhiyun     ({ \
418*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
419*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
420*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
421*4882a593Smuzhiyun         if (__argc == 0) { \
422*4882a593Smuzhiyun             __ret = imfill_t(buf, rect, color, 1); \
423*4882a593Smuzhiyun         } else if (__argc == 1){ \
424*4882a593Smuzhiyun             __ret = imfill_t(buf, rect, color, (int)__args[RGA_GET_MIN(__argc, 0)]); \
425*4882a593Smuzhiyun         } else { \
426*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
427*4882a593Smuzhiyun             printf("invalid parameter\n"); \
428*4882a593Smuzhiyun         } \
429*4882a593Smuzhiyun         __ret; \
430*4882a593Smuzhiyun     })
431*4882a593Smuzhiyun IM_API IM_STATUS imfill_t(rga_buffer_t dst, im_rect rect, int color, int sync);
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun /*
434*4882a593Smuzhiyun  * palette
435*4882a593Smuzhiyun  *
436*4882a593Smuzhiyun  * @param src
437*4882a593Smuzhiyun  * @param dst
438*4882a593Smuzhiyun  * @param lut
439*4882a593Smuzhiyun  * @param sync
440*4882a593Smuzhiyun  *      wait until operation complete
441*4882a593Smuzhiyun  *
442*4882a593Smuzhiyun  * @returns success or else negative error code.
443*4882a593Smuzhiyun  */
444*4882a593Smuzhiyun #define impalette(src, dst, lut,  ...) \
445*4882a593Smuzhiyun     ({ \
446*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
447*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
448*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
449*4882a593Smuzhiyun         if (__argc == 0) { \
450*4882a593Smuzhiyun             __ret = impalette_t(src, dst, lut, 1); \
451*4882a593Smuzhiyun         } else if (__argc == 1){ \
452*4882a593Smuzhiyun             __ret = impalette_t(src, dst, lut, (int)__args[RGA_GET_MIN(__argc, 0)]); \
453*4882a593Smuzhiyun         } else { \
454*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
455*4882a593Smuzhiyun             printf("invalid parameter\n"); \
456*4882a593Smuzhiyun         } \
457*4882a593Smuzhiyun         __ret; \
458*4882a593Smuzhiyun     })
459*4882a593Smuzhiyun IM_API IM_STATUS impalette_t(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t lut, int sync);
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun /*
462*4882a593Smuzhiyun  * translate
463*4882a593Smuzhiyun  *
464*4882a593Smuzhiyun  * @param src
465*4882a593Smuzhiyun  * @param dst
466*4882a593Smuzhiyun  * @param x
467*4882a593Smuzhiyun  * @param y
468*4882a593Smuzhiyun  * @param sync
469*4882a593Smuzhiyun  *      wait until operation complete
470*4882a593Smuzhiyun  *
471*4882a593Smuzhiyun  * @returns success or else negative error code.
472*4882a593Smuzhiyun  */
473*4882a593Smuzhiyun #define imtranslate(src, dst, x, y, ...) \
474*4882a593Smuzhiyun     ({ \
475*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
476*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
477*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
478*4882a593Smuzhiyun         if (__argc == 0) { \
479*4882a593Smuzhiyun             __ret = imtranslate_t(src, dst, x, y, 1); \
480*4882a593Smuzhiyun         } else if (__argc == 1){ \
481*4882a593Smuzhiyun             __ret = imtranslate_t(src, dst, x, y, (int)__args[RGA_GET_MIN(__argc, 0)]); \
482*4882a593Smuzhiyun         } else { \
483*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
484*4882a593Smuzhiyun             printf("invalid parameter\n"); \
485*4882a593Smuzhiyun         } \
486*4882a593Smuzhiyun         __ret; \
487*4882a593Smuzhiyun     })
488*4882a593Smuzhiyun IM_API IM_STATUS imtranslate_t(const rga_buffer_t src, rga_buffer_t dst, int x, int y, int sync);
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun /*
491*4882a593Smuzhiyun  * copy
492*4882a593Smuzhiyun  *
493*4882a593Smuzhiyun  * @param src
494*4882a593Smuzhiyun  * @param dst
495*4882a593Smuzhiyun  * @param sync
496*4882a593Smuzhiyun  *      wait until operation complete
497*4882a593Smuzhiyun  *
498*4882a593Smuzhiyun  * @returns success or else negative error code.
499*4882a593Smuzhiyun  */
500*4882a593Smuzhiyun #define imcopy(src, dst, ...) \
501*4882a593Smuzhiyun     ({ \
502*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
503*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
504*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
505*4882a593Smuzhiyun         if (__argc == 0) { \
506*4882a593Smuzhiyun             __ret = imcopy_t(src, dst, 1); \
507*4882a593Smuzhiyun         } else if (__argc == 1){ \
508*4882a593Smuzhiyun             __ret = imcopy_t(src, dst, (int)__args[RGA_GET_MIN(__argc, 0)]); \
509*4882a593Smuzhiyun         } else { \
510*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
511*4882a593Smuzhiyun             printf("invalid parameter\n"); \
512*4882a593Smuzhiyun         } \
513*4882a593Smuzhiyun         __ret; \
514*4882a593Smuzhiyun     })
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun IM_API IM_STATUS imcopy_t(const rga_buffer_t src, rga_buffer_t dst, int sync);
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun /*
519*4882a593Smuzhiyun  * blend (SRC + DST -> DST or SRCA + SRCB -> DST)
520*4882a593Smuzhiyun  *
521*4882a593Smuzhiyun  * @param srcA
522*4882a593Smuzhiyun  * @param srcB can be NULL.
523*4882a593Smuzhiyun  * @param dst
524*4882a593Smuzhiyun  * @param mode
525*4882a593Smuzhiyun  *      IM_ALPHA_BLEND_MODE
526*4882a593Smuzhiyun  * @param sync
527*4882a593Smuzhiyun  *      wait until operation complete
528*4882a593Smuzhiyun  *
529*4882a593Smuzhiyun  * @returns success or else negative error code.
530*4882a593Smuzhiyun  */
531*4882a593Smuzhiyun #define imblend(srcA, dst, ...) \
532*4882a593Smuzhiyun     ({ \
533*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
534*4882a593Smuzhiyun         rga_buffer_t srcB; \
535*4882a593Smuzhiyun         memset(&srcB, 0x00, sizeof(rga_buffer_t)); \
536*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
537*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
538*4882a593Smuzhiyun         if (__argc == 0) { \
539*4882a593Smuzhiyun             __ret = imblend_t(srcA, srcB, dst, IM_ALPHA_BLEND_SRC_OVER, 1); \
540*4882a593Smuzhiyun         } else if (__argc == 1){ \
541*4882a593Smuzhiyun             __ret = imblend_t(srcA, srcB, dst, (int)__args[RGA_GET_MIN(__argc, 0)], 1); \
542*4882a593Smuzhiyun         } else if (__argc == 2){ \
543*4882a593Smuzhiyun             __ret = imblend_t(srcA, srcB, dst, (int)__args[RGA_GET_MIN(__argc, 0)], (int)__args[RGA_GET_MIN(__argc, 1)]); \
544*4882a593Smuzhiyun         } else { \
545*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
546*4882a593Smuzhiyun             printf("invalid parameter\n"); \
547*4882a593Smuzhiyun         } \
548*4882a593Smuzhiyun         __ret; \
549*4882a593Smuzhiyun     })
550*4882a593Smuzhiyun #define imcomposite(srcA, srcB, dst, ...) \
551*4882a593Smuzhiyun     ({ \
552*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
553*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
554*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
555*4882a593Smuzhiyun         if (__argc == 0) { \
556*4882a593Smuzhiyun             __ret = imblend_t(srcA, srcB, dst, IM_ALPHA_BLEND_SRC_OVER, 1); \
557*4882a593Smuzhiyun         } else if (__argc == 1){ \
558*4882a593Smuzhiyun             __ret = imblend_t(srcA, srcB, dst, (int)__args[RGA_GET_MIN(__argc, 0)], 1); \
559*4882a593Smuzhiyun         } else if (__argc == 2){ \
560*4882a593Smuzhiyun             __ret = imblend_t(srcA, srcB, dst, (int)__args[RGA_GET_MIN(__argc, 0)], (int)__args[RGA_GET_MIN(__argc, 1)]); \
561*4882a593Smuzhiyun         } else { \
562*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
563*4882a593Smuzhiyun             printf("invalid parameter\n"); \
564*4882a593Smuzhiyun         } \
565*4882a593Smuzhiyun         __ret; \
566*4882a593Smuzhiyun     })
567*4882a593Smuzhiyun IM_API IM_STATUS imblend_t(const rga_buffer_t srcA, const rga_buffer_t srcB, rga_buffer_t dst, int mode, int sync);
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun /*
570*4882a593Smuzhiyun  * color key
571*4882a593Smuzhiyun  *
572*4882a593Smuzhiyun  * @param src
573*4882a593Smuzhiyun  * @param dst
574*4882a593Smuzhiyun  * @param colorkey_range
575*4882a593Smuzhiyun  *      max color
576*4882a593Smuzhiyun  *      min color
577*4882a593Smuzhiyun  * @param sync
578*4882a593Smuzhiyun  *      wait until operation complete
579*4882a593Smuzhiyun  *
580*4882a593Smuzhiyun  * @returns success or else negative error code.
581*4882a593Smuzhiyun  */
582*4882a593Smuzhiyun #define imcolorkey(src, dst, range, ...) \
583*4882a593Smuzhiyun     ({ \
584*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
585*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
586*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
587*4882a593Smuzhiyun         if (__argc == 0) { \
588*4882a593Smuzhiyun             __ret = imcolorkey_t(src, dst, range, IM_ALPHA_COLORKEY_NORMAL, 1); \
589*4882a593Smuzhiyun         } else if (__argc == 1){ \
590*4882a593Smuzhiyun             __ret = imcolorkey_t(src, dst, range, (int)__args[RGA_GET_MIN(__argc, 0)], 1); \
591*4882a593Smuzhiyun         } else if (__argc == 2){ \
592*4882a593Smuzhiyun             __ret = imcolorkey_t(src, dst, range, (int)__args[RGA_GET_MIN(__argc, 0)], (int)__args[RGA_GET_MIN(__argc, 1)]); \
593*4882a593Smuzhiyun         } else { \
594*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
595*4882a593Smuzhiyun             printf("invalid parameter\n"); \
596*4882a593Smuzhiyun         } \
597*4882a593Smuzhiyun         __ret; \
598*4882a593Smuzhiyun     })
599*4882a593Smuzhiyun IM_API IM_STATUS imcolorkey_t(const rga_buffer_t src, rga_buffer_t dst, im_colorkey_range range, int mode, int sync);
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun /*
602*4882a593Smuzhiyun  * format convert
603*4882a593Smuzhiyun  *
604*4882a593Smuzhiyun  * @param src
605*4882a593Smuzhiyun  * @param dst
606*4882a593Smuzhiyun  * @param sfmt
607*4882a593Smuzhiyun  * @param dfmt
608*4882a593Smuzhiyun  * @param mode
609*4882a593Smuzhiyun  *      color space mode: IM_COLOR_SPACE_MODE
610*4882a593Smuzhiyun  * @param sync
611*4882a593Smuzhiyun  *      wait until operation complete
612*4882a593Smuzhiyun  *
613*4882a593Smuzhiyun  * @returns success or else negative error code.
614*4882a593Smuzhiyun  */
615*4882a593Smuzhiyun #define imcvtcolor(src, dst, sfmt, dfmt, ...) \
616*4882a593Smuzhiyun     ({ \
617*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
618*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
619*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
620*4882a593Smuzhiyun         if (__argc == 0) { \
621*4882a593Smuzhiyun             __ret = imcvtcolor_t(src, dst, sfmt, dfmt, IM_COLOR_SPACE_DEFAULT, 1); \
622*4882a593Smuzhiyun         } else if (__argc == 1){ \
623*4882a593Smuzhiyun             __ret = imcvtcolor_t(src, dst, sfmt, dfmt, (int)__args[RGA_GET_MIN(__argc, 0)], 1); \
624*4882a593Smuzhiyun         } else if (__argc == 2){ \
625*4882a593Smuzhiyun             __ret = imcvtcolor_t(src, dst, sfmt, dfmt, (int)__args[RGA_GET_MIN(__argc, 0)], (int)__args[RGA_GET_MIN(__argc, 1)]); \
626*4882a593Smuzhiyun         } else { \
627*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
628*4882a593Smuzhiyun             printf("invalid parameter\n"); \
629*4882a593Smuzhiyun         } \
630*4882a593Smuzhiyun         __ret; \
631*4882a593Smuzhiyun     })
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun IM_API IM_STATUS imcvtcolor_t(rga_buffer_t src, rga_buffer_t dst, int sfmt, int dfmt, int mode, int sync);
634*4882a593Smuzhiyun 
635*4882a593Smuzhiyun /*
636*4882a593Smuzhiyun  * nn quantize
637*4882a593Smuzhiyun  *
638*4882a593Smuzhiyun  * @param src
639*4882a593Smuzhiyun  * @param dst
640*4882a593Smuzhiyun  * @param nninfo
641*4882a593Smuzhiyun  * @param sync
642*4882a593Smuzhiyun  *      wait until operation complete
643*4882a593Smuzhiyun  *
644*4882a593Smuzhiyun  * @returns success or else negative error code.
645*4882a593Smuzhiyun  */
646*4882a593Smuzhiyun #define imquantize(src, dst, nn_info, ...) \
647*4882a593Smuzhiyun     ({ \
648*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
649*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
650*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
651*4882a593Smuzhiyun         if (__argc == 0) { \
652*4882a593Smuzhiyun             __ret = imquantize_t(src, dst, nn_info, 1); \
653*4882a593Smuzhiyun         } else if (__argc == 1){ \
654*4882a593Smuzhiyun             __ret = imquantize_t(src, dst, nn_info, (int)__args[RGA_GET_MIN(__argc, 0)]); \
655*4882a593Smuzhiyun         } else { \
656*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
657*4882a593Smuzhiyun             printf("invalid parameter\n"); \
658*4882a593Smuzhiyun         } \
659*4882a593Smuzhiyun         __ret; \
660*4882a593Smuzhiyun     })
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun IM_API IM_STATUS imquantize_t(const rga_buffer_t src, rga_buffer_t dst, im_nn_t nn_info, int sync);
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun /*
665*4882a593Smuzhiyun  * ROP
666*4882a593Smuzhiyun  *
667*4882a593Smuzhiyun  * @param src
668*4882a593Smuzhiyun  * @param dst
669*4882a593Smuzhiyun  * @param rop_code
670*4882a593Smuzhiyun  * @param sync
671*4882a593Smuzhiyun  *      wait until operation complete
672*4882a593Smuzhiyun  *
673*4882a593Smuzhiyun  * @returns success or else negative error code.
674*4882a593Smuzhiyun  */
675*4882a593Smuzhiyun #define imrop(src, dst, rop_code, ...) \
676*4882a593Smuzhiyun     ({ \
677*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
678*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
679*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
680*4882a593Smuzhiyun         if (__argc == 0) { \
681*4882a593Smuzhiyun             __ret = imrop_t(src, dst, rop_code, 1); \
682*4882a593Smuzhiyun         } else if (__argc == 1){ \
683*4882a593Smuzhiyun             __ret = imrop_t(src, dst, rop_code, (int)__args[RGA_GET_MIN(__argc, 0)]); \
684*4882a593Smuzhiyun         } else { \
685*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
686*4882a593Smuzhiyun             printf("invalid parameter\n"); \
687*4882a593Smuzhiyun         } \
688*4882a593Smuzhiyun         __ret; \
689*4882a593Smuzhiyun     })
690*4882a593Smuzhiyun IM_API IM_STATUS imrop_t(const rga_buffer_t src, rga_buffer_t dst, int rop_code, int sync);
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun /*
693*4882a593Smuzhiyun  * MOSAIC
694*4882a593Smuzhiyun  *
695*4882a593Smuzhiyun  * @param src
696*4882a593Smuzhiyun  * @param dst
697*4882a593Smuzhiyun  * @param mosaic_mode
698*4882a593Smuzhiyun  * @param sync
699*4882a593Smuzhiyun  *      wait until operation complete
700*4882a593Smuzhiyun  *
701*4882a593Smuzhiyun  * @returns success or else negative error code.
702*4882a593Smuzhiyun  */
703*4882a593Smuzhiyun IM_API IM_STATUS immosaic(const rga_buffer_t image, im_rect rect, int mosaic_mode, int sync);
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun /*
706*4882a593Smuzhiyun  * OSD
707*4882a593Smuzhiyun  *
708*4882a593Smuzhiyun  * @param osd
709*4882a593Smuzhiyun  *      osd block
710*4882a593Smuzhiyun  * @param dst
711*4882a593Smuzhiyun  *      background image
712*4882a593Smuzhiyun  * @param osd_rect
713*4882a593Smuzhiyun  * @param osd_config
714*4882a593Smuzhiyun  *      osd mode config
715*4882a593Smuzhiyun  * @param sync
716*4882a593Smuzhiyun  *      wait until operation complete
717*4882a593Smuzhiyun  *
718*4882a593Smuzhiyun  * @returns success or else negative error code.
719*4882a593Smuzhiyun  */
720*4882a593Smuzhiyun IM_API IM_STATUS imosd(const rga_buffer_t osd,const rga_buffer_t dst,
721*4882a593Smuzhiyun                        const im_rect osd_rect, im_osd_t *osd_config, int sync);
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun /*
724*4882a593Smuzhiyun  * process
725*4882a593Smuzhiyun  *
726*4882a593Smuzhiyun  * @param src
727*4882a593Smuzhiyun  * @param dst
728*4882a593Smuzhiyun  * @param usage
729*4882a593Smuzhiyun  * @param ...
730*4882a593Smuzhiyun  *      wait until operation complete
731*4882a593Smuzhiyun  *
732*4882a593Smuzhiyun  * @returns success or else negative error code.
733*4882a593Smuzhiyun  */
734*4882a593Smuzhiyun IM_API IM_STATUS improcess(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
735*4882a593Smuzhiyun                         im_rect srect, im_rect drect, im_rect prect, int usage);
736*4882a593Smuzhiyun 
737*4882a593Smuzhiyun /*
738*4882a593Smuzhiyun  * block until all execution is complete
739*4882a593Smuzhiyun  *
740*4882a593Smuzhiyun  * @returns success or else negative error code.
741*4882a593Smuzhiyun  */
742*4882a593Smuzhiyun IM_API IM_STATUS imsync(int out_fence_fd);
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun /*
745*4882a593Smuzhiyun  * config
746*4882a593Smuzhiyun  *
747*4882a593Smuzhiyun  * @param name
748*4882a593Smuzhiyun  *      enum IM_CONFIG_NAME
749*4882a593Smuzhiyun  * @param value
750*4882a593Smuzhiyun  *
751*4882a593Smuzhiyun  * @returns success or else negative error code.
752*4882a593Smuzhiyun  */
753*4882a593Smuzhiyun IM_API IM_STATUS imconfig(IM_CONFIG_NAME name, uint64_t value);
754*4882a593Smuzhiyun 
755*4882a593Smuzhiyun IM_API im_ctx_id_t imbegin(uint32_t flags);
756*4882a593Smuzhiyun 
757*4882a593Smuzhiyun IM_API IM_STATUS imcancel(im_ctx_id_t id);
758*4882a593Smuzhiyun 
759*4882a593Smuzhiyun #ifdef __cplusplus
760*4882a593Smuzhiyun }
761*4882a593Smuzhiyun #endif
762*4882a593Smuzhiyun #endif /* _im2d_h_ */
763*4882a593Smuzhiyun 
764