xref: /OK3568_Linux_fs/external/linux-rga/im2d_api/im2d_single.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2022 Rockchip Electronics Co., Ltd.
3*4882a593Smuzhiyun  * Authors:
4*4882a593Smuzhiyun  *  Cerf Yu <cerf.yu@rock-chips.com>
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
7*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
8*4882a593Smuzhiyun  * You may obtain a copy of the License at
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
13*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
14*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
16*4882a593Smuzhiyun  * limitations under the License.
17*4882a593Smuzhiyun  */
18*4882a593Smuzhiyun #ifndef _im2d_single_h_
19*4882a593Smuzhiyun #define _im2d_single_h_
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include "im2d_type.h"
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #ifdef __cplusplus
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun /**
26*4882a593Smuzhiyun  * copy
27*4882a593Smuzhiyun  *
28*4882a593Smuzhiyun  * @param src
29*4882a593Smuzhiyun  *      The input source image.
30*4882a593Smuzhiyun  * @param dst
31*4882a593Smuzhiyun  *      The output destination image.
32*4882a593Smuzhiyun  * @param sync
33*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
34*4882a593Smuzhiyun  * @param release_fence_fd
35*4882a593Smuzhiyun  *      When 'sync == 0', the fence_fd used to identify the current job state
36*4882a593Smuzhiyun  *
37*4882a593Smuzhiyun  * @returns success or else negative error code.
38*4882a593Smuzhiyun  */
39*4882a593Smuzhiyun IM_API IM_STATUS imcopy(const rga_buffer_t src, rga_buffer_t dst, int sync = 1, int *release_fence_fd = NULL);
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /**
42*4882a593Smuzhiyun  * Resize
43*4882a593Smuzhiyun  *
44*4882a593Smuzhiyun  * @param src
45*4882a593Smuzhiyun  *      The input source image.
46*4882a593Smuzhiyun  * @param dst
47*4882a593Smuzhiyun  *      The output destination image.
48*4882a593Smuzhiyun  * @param fx
49*4882a593Smuzhiyun  *      X-direction resize factor.
50*4882a593Smuzhiyun  * @param fy
51*4882a593Smuzhiyun  *      X-direction resize factor.
52*4882a593Smuzhiyun  * @param interpolation
53*4882a593Smuzhiyun  *      Interpolation formula(Only RGA1 support).
54*4882a593Smuzhiyun  * @param sync
55*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
56*4882a593Smuzhiyun  * @param release_fence_fd
57*4882a593Smuzhiyun  *      When 'sync == 0', the fence_fd used to identify the current job state
58*4882a593Smuzhiyun  *
59*4882a593Smuzhiyun  * @returns success or else negative error code.
60*4882a593Smuzhiyun  */
61*4882a593Smuzhiyun IM_API IM_STATUS imresize(const rga_buffer_t src, rga_buffer_t dst, double fx = 0, double fy = 0, int interpolation = 0, int sync = 1, int *release_fence_fd = NULL);
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /**
64*4882a593Smuzhiyun  * Crop
65*4882a593Smuzhiyun  *
66*4882a593Smuzhiyun  * @param src
67*4882a593Smuzhiyun  *      The input source image.
68*4882a593Smuzhiyun  * @param dst
69*4882a593Smuzhiyun  *      The output destination image.
70*4882a593Smuzhiyun  * @param rect
71*4882a593Smuzhiyun  *      The rectangle on the source image that needs to be cropped.
72*4882a593Smuzhiyun  * @param sync
73*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
74*4882a593Smuzhiyun  * @param release_fence_fd
75*4882a593Smuzhiyun  *      When 'sync == 0', the fence_fd used to identify the current job state
76*4882a593Smuzhiyun  *
77*4882a593Smuzhiyun  * @returns success or else negative error code.
78*4882a593Smuzhiyun  */
79*4882a593Smuzhiyun IM_API IM_STATUS imcrop(const rga_buffer_t src, rga_buffer_t dst, im_rect rect, int sync = 1, int *release_fence_fd = NULL);
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun /**
82*4882a593Smuzhiyun  * translate
83*4882a593Smuzhiyun  *
84*4882a593Smuzhiyun  * @param src
85*4882a593Smuzhiyun  *      The input source image.
86*4882a593Smuzhiyun  * @param dst
87*4882a593Smuzhiyun  *      The output destination image.
88*4882a593Smuzhiyun  * @param x
89*4882a593Smuzhiyun  *      Output the coordinates of the starting point in the X-direction of the destination image.
90*4882a593Smuzhiyun  * @param y
91*4882a593Smuzhiyun  *      Output the coordinates of the starting point in the Y-direction of the destination image.
92*4882a593Smuzhiyun  * @param sync
93*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
94*4882a593Smuzhiyun  * @param release_fence_fd
95*4882a593Smuzhiyun  *      When 'sync == 0', the fence_fd used to identify the current job state
96*4882a593Smuzhiyun  *
97*4882a593Smuzhiyun  * @returns success or else negative error code.
98*4882a593Smuzhiyun  */
99*4882a593Smuzhiyun IM_API IM_STATUS imtranslate(const rga_buffer_t src, rga_buffer_t dst, int x, int y, int sync = 1, int *release_fence_fd = NULL);
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun /**
102*4882a593Smuzhiyun  * format convert
103*4882a593Smuzhiyun  *
104*4882a593Smuzhiyun  * @param src
105*4882a593Smuzhiyun  *      The input source image.
106*4882a593Smuzhiyun  * @param dst
107*4882a593Smuzhiyun  *      The output destination image.
108*4882a593Smuzhiyun  * @param sfmt
109*4882a593Smuzhiyun  *      The source image format.
110*4882a593Smuzhiyun  * @param dfmt
111*4882a593Smuzhiyun  *      The destination image format.
112*4882a593Smuzhiyun  * @param mode
113*4882a593Smuzhiyun  *      color space mode:
114*4882a593Smuzhiyun  *          IM_YUV_TO_RGB_BT601_LIMIT
115*4882a593Smuzhiyun  *          IM_YUV_TO_RGB_BT601_FULL
116*4882a593Smuzhiyun  *          IM_YUV_TO_RGB_BT709_LIMIT
117*4882a593Smuzhiyun  *          IM_RGB_TO_YUV_BT601_FULL
118*4882a593Smuzhiyun  *          IM_RGB_TO_YUV_BT601_LIMIT
119*4882a593Smuzhiyun  *          IM_RGB_TO_YUV_BT709_LIMIT
120*4882a593Smuzhiyun  * @param sync
121*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
122*4882a593Smuzhiyun  * @param release_fence_fd
123*4882a593Smuzhiyun  *      When 'sync == 0', the fence_fd used to identify the current job state
124*4882a593Smuzhiyun  *
125*4882a593Smuzhiyun  * @returns success or else negative error code.
126*4882a593Smuzhiyun  */
127*4882a593Smuzhiyun IM_API IM_STATUS imcvtcolor(rga_buffer_t src, rga_buffer_t dst, int sfmt, int dfmt, int mode = IM_COLOR_SPACE_DEFAULT, int sync = 1, int *release_fence_fd = NULL);
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun /**
130*4882a593Smuzhiyun  * rotation
131*4882a593Smuzhiyun  *
132*4882a593Smuzhiyun  * @param src
133*4882a593Smuzhiyun  *      The input source image.
134*4882a593Smuzhiyun  * @param dst
135*4882a593Smuzhiyun  *      The output destination image.
136*4882a593Smuzhiyun  * @param rotation
137*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_ROT_90
138*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_ROT_180
139*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_ROT_270
140*4882a593Smuzhiyun  * @param sync
141*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
142*4882a593Smuzhiyun  * @param release_fence_fd
143*4882a593Smuzhiyun  *      When 'sync == 0', the fence_fd used to identify the current job state
144*4882a593Smuzhiyun  *
145*4882a593Smuzhiyun  * @returns success or else negative error code.
146*4882a593Smuzhiyun  */
147*4882a593Smuzhiyun IM_API IM_STATUS imrotate(const rga_buffer_t src, rga_buffer_t dst, int rotation, int sync = 1, int *release_fence_fd = NULL);
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /**
150*4882a593Smuzhiyun  * flip
151*4882a593Smuzhiyun  *
152*4882a593Smuzhiyun  * @param src
153*4882a593Smuzhiyun  *      The input source image.
154*4882a593Smuzhiyun  * @param dst
155*4882a593Smuzhiyun  *      The output destination image.
156*4882a593Smuzhiyun  * @param mode
157*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_FLIP_H
158*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_FLIP_V
159*4882a593Smuzhiyun  * @param sync
160*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
161*4882a593Smuzhiyun  * @param release_fence_fd
162*4882a593Smuzhiyun  *      When 'sync == 0', the fence_fd used to identify the current job state
163*4882a593Smuzhiyun  *
164*4882a593Smuzhiyun  * @returns success or else negative error code.
165*4882a593Smuzhiyun  */
166*4882a593Smuzhiyun IM_API IM_STATUS imflip(const rga_buffer_t src, rga_buffer_t dst, int mode, int sync = 1, int *release_fence_fd = NULL);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /**
169*4882a593Smuzhiyun  * 2-channel blend (SRC + DST -> DST or SRCA + SRCB -> DST)
170*4882a593Smuzhiyun  *
171*4882a593Smuzhiyun  * @param fg_image
172*4882a593Smuzhiyun  *      The foreground image.
173*4882a593Smuzhiyun  * @param bg_image
174*4882a593Smuzhiyun  *      The background image, which is also the output destination image.
175*4882a593Smuzhiyun  * @param mode
176*4882a593Smuzhiyun  *      Port-Duff mode:
177*4882a593Smuzhiyun  *          IM_ALPHA_BLEND_SRC
178*4882a593Smuzhiyun  *          IM_ALPHA_BLEND_DST
179*4882a593Smuzhiyun  *          IM_ALPHA_BLEND_SRC_OVER
180*4882a593Smuzhiyun  *          IM_ALPHA_BLEND_DST_OVER
181*4882a593Smuzhiyun  * @param sync
182*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
183*4882a593Smuzhiyun  * @param release_fence_fd
184*4882a593Smuzhiyun  *      When 'sync == 0', the fence_fd used to identify the current job state
185*4882a593Smuzhiyun  *
186*4882a593Smuzhiyun  * @returns success or else negative error code.
187*4882a593Smuzhiyun  */
188*4882a593Smuzhiyun IM_API IM_STATUS imblend(const rga_buffer_t fd_image, rga_buffer_t bg_image, int mode = IM_ALPHA_BLEND_SRC_OVER, int sync = 1, int *release_fence_fd = NULL);
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun /**
191*4882a593Smuzhiyun  * 3-channel blend (SRC + DST -> DST or SRCA + SRCB -> DST)
192*4882a593Smuzhiyun  *
193*4882a593Smuzhiyun  * @param fg_image
194*4882a593Smuzhiyun  *      The foreground image.
195*4882a593Smuzhiyun  * @param bg_image
196*4882a593Smuzhiyun  *      The background image.
197*4882a593Smuzhiyun  * @param output_image
198*4882a593Smuzhiyun  *      The output destination image.
199*4882a593Smuzhiyun  * @param mode
200*4882a593Smuzhiyun  *      Port-Duff mode:
201*4882a593Smuzhiyun  *          IM_ALPHA_BLEND_SRC
202*4882a593Smuzhiyun  *          IM_ALPHA_BLEND_DST
203*4882a593Smuzhiyun  *          IM_ALPHA_BLEND_SRC_OVER
204*4882a593Smuzhiyun  *          IM_ALPHA_BLEND_DST_OVER
205*4882a593Smuzhiyun  * @param sync
206*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
207*4882a593Smuzhiyun  * @param release_fence_fd
208*4882a593Smuzhiyun  *      When 'sync == 0', the fence_fd used to identify the current job state
209*4882a593Smuzhiyun  *
210*4882a593Smuzhiyun  * @returns success or else negative error code.
211*4882a593Smuzhiyun  */
212*4882a593Smuzhiyun IM_API IM_STATUS imcomposite(const rga_buffer_t srcA, const rga_buffer_t srcB, rga_buffer_t dst, int mode = IM_ALPHA_BLEND_SRC_OVER, int sync = 1, int *release_fence_fd = NULL);
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun /**
215*4882a593Smuzhiyun  * color key
216*4882a593Smuzhiyun  *
217*4882a593Smuzhiyun  * @param fg_image
218*4882a593Smuzhiyun  *      The foreground image.
219*4882a593Smuzhiyun  * @param bg_image
220*4882a593Smuzhiyun  *      The background image, which is also the output destination image.
221*4882a593Smuzhiyun  * @param colorkey_range
222*4882a593Smuzhiyun  *      The range of color key.
223*4882a593Smuzhiyun  * @param sync
224*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
225*4882a593Smuzhiyun  *
226*4882a593Smuzhiyun  * @returns success or else negative error code.
227*4882a593Smuzhiyun  */
228*4882a593Smuzhiyun IM_API IM_STATUS imcolorkey(const rga_buffer_t src, rga_buffer_t dst, im_colorkey_range range, int mode = IM_ALPHA_COLORKEY_NORMAL, int sync = 1, int *release_fence_fd = NULL);
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun /**
231*4882a593Smuzhiyun  * OSD
232*4882a593Smuzhiyun  *
233*4882a593Smuzhiyun  * @param osd
234*4882a593Smuzhiyun  *      The osd text block.
235*4882a593Smuzhiyun  * @param dst
236*4882a593Smuzhiyun  *      The background image.
237*4882a593Smuzhiyun  * @param osd_rect
238*4882a593Smuzhiyun  *      The rectangle on the source image that needs to be OSD.
239*4882a593Smuzhiyun  * @param osd_config
240*4882a593Smuzhiyun  *      osd mode configuration.
241*4882a593Smuzhiyun  * @param sync
242*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
243*4882a593Smuzhiyun  *
244*4882a593Smuzhiyun  * @returns success or else negative error code.
245*4882a593Smuzhiyun  */
246*4882a593Smuzhiyun IM_API IM_STATUS imosd(const rga_buffer_t osd,const rga_buffer_t dst,
247*4882a593Smuzhiyun                        const im_rect osd_rect, im_osd_t *osd_config,
248*4882a593Smuzhiyun                        int sync = 1, int *release_fence_fd = NULL);
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun /**
251*4882a593Smuzhiyun  * nn quantize
252*4882a593Smuzhiyun  *
253*4882a593Smuzhiyun  * @param src
254*4882a593Smuzhiyun  *      The input source image.
255*4882a593Smuzhiyun  * @param dst
256*4882a593Smuzhiyun  *      The output destination image.
257*4882a593Smuzhiyun  * @param nninfo
258*4882a593Smuzhiyun  *      nn configuration
259*4882a593Smuzhiyun  * @param sync
260*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
261*4882a593Smuzhiyun  *
262*4882a593Smuzhiyun  * @returns success or else negative error code.
263*4882a593Smuzhiyun  */
264*4882a593Smuzhiyun IM_API IM_STATUS imquantize(const rga_buffer_t src, rga_buffer_t dst, im_nn_t nn_info, int sync = 1, int *release_fence_fd = NULL);
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun /**
267*4882a593Smuzhiyun  * ROP
268*4882a593Smuzhiyun  *
269*4882a593Smuzhiyun  * @param src
270*4882a593Smuzhiyun  *      The input source image.
271*4882a593Smuzhiyun  * @param dst
272*4882a593Smuzhiyun  *      The output destination image.
273*4882a593Smuzhiyun  * @param rop_code
274*4882a593Smuzhiyun  *      The ROP opcode.
275*4882a593Smuzhiyun  * @param sync
276*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
277*4882a593Smuzhiyun  *
278*4882a593Smuzhiyun  * @returns success or else negative error code.
279*4882a593Smuzhiyun  */
280*4882a593Smuzhiyun IM_API IM_STATUS imrop(const rga_buffer_t src, rga_buffer_t dst, int rop_code, int sync = 1, int *release_fence_fd = NULL);
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun /**
283*4882a593Smuzhiyun  * fill/reset/draw
284*4882a593Smuzhiyun  *
285*4882a593Smuzhiyun  * @param dst
286*4882a593Smuzhiyun  *      The output destination image.
287*4882a593Smuzhiyun  * @param rect
288*4882a593Smuzhiyun  *      The rectangle on the source image that needs to be filled with color.
289*4882a593Smuzhiyun  * @param color
290*4882a593Smuzhiyun  *      The fill color value.
291*4882a593Smuzhiyun  * @param sync
292*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
293*4882a593Smuzhiyun  *
294*4882a593Smuzhiyun  * @returns success or else negative error code.
295*4882a593Smuzhiyun  */
296*4882a593Smuzhiyun IM_API IM_STATUS imfill(rga_buffer_t dst, im_rect rect, int color, int sync = 1, int *release_fence_fd = NULL);
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun /**
299*4882a593Smuzhiyun  * fill array
300*4882a593Smuzhiyun  *
301*4882a593Smuzhiyun  * @param dst
302*4882a593Smuzhiyun  *      The output destination image.
303*4882a593Smuzhiyun  * @param rect_array
304*4882a593Smuzhiyun  *      The rectangle arrays on the source image that needs to be filled with color.
305*4882a593Smuzhiyun  * @param array_size
306*4882a593Smuzhiyun  *      The size of rectangular area arrays.
307*4882a593Smuzhiyun  * @param color
308*4882a593Smuzhiyun  *      The fill color value.
309*4882a593Smuzhiyun  * @param sync
310*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
311*4882a593Smuzhiyun  *
312*4882a593Smuzhiyun  * @returns success or else negative error code.
313*4882a593Smuzhiyun  */
314*4882a593Smuzhiyun IM_API IM_STATUS imfillArray(rga_buffer_t dst, im_rect *rect_array, int array_size, uint32_t color, int sync = 1, int *release_fence_fd = NULL);
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun /**
317*4882a593Smuzhiyun  * fill rectangle
318*4882a593Smuzhiyun  *
319*4882a593Smuzhiyun  * @param dst
320*4882a593Smuzhiyun  *      The output destination image.
321*4882a593Smuzhiyun  * @param rect
322*4882a593Smuzhiyun  *      The rectangle on the source image that needs to be filled with color.
323*4882a593Smuzhiyun  * @param color
324*4882a593Smuzhiyun  *      The fill color value.
325*4882a593Smuzhiyun  * @param thickness
326*4882a593Smuzhiyun  *      Thickness of lines that make up the rectangle. Negative values, like -1,
327*4882a593Smuzhiyun  *      mean that the function has to draw a filled rectangle.
328*4882a593Smuzhiyun  * @param sync
329*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
330*4882a593Smuzhiyun  *
331*4882a593Smuzhiyun  * @returns success or else negative error code.
332*4882a593Smuzhiyun  */
333*4882a593Smuzhiyun IM_API IM_STATUS imrectangle(rga_buffer_t dst, im_rect rect,
334*4882a593Smuzhiyun                              uint32_t color, int thickness,
335*4882a593Smuzhiyun                              int sync = 1, int *release_fence_fd = NULL);
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun /**
338*4882a593Smuzhiyun  * fill rectangle array
339*4882a593Smuzhiyun  *
340*4882a593Smuzhiyun  * @param dst
341*4882a593Smuzhiyun  *      The output destination image.
342*4882a593Smuzhiyun  * @param rect_array
343*4882a593Smuzhiyun  *      The rectangle arrays on the source image that needs to be filled with color.
344*4882a593Smuzhiyun  * @param array_size
345*4882a593Smuzhiyun  *      The size of rectangular area arrays.
346*4882a593Smuzhiyun  * @param color
347*4882a593Smuzhiyun  *      The fill color value.
348*4882a593Smuzhiyun  * @param thickness
349*4882a593Smuzhiyun  *      Thickness of lines that make up the rectangle. Negative values, like -1,
350*4882a593Smuzhiyun  *      mean that the function has to draw a filled rectangle.
351*4882a593Smuzhiyun  * @param sync
352*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
353*4882a593Smuzhiyun  *
354*4882a593Smuzhiyun  * @returns success or else negative error code.
355*4882a593Smuzhiyun  */
356*4882a593Smuzhiyun IM_API IM_STATUS imrectangleArray(rga_buffer_t dst, im_rect *rect_array, int array_size,
357*4882a593Smuzhiyun                                    uint32_t color, int thickness,
358*4882a593Smuzhiyun                                    int sync = 1, int *release_fence_fd = NULL);
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun /**
361*4882a593Smuzhiyun  * MOSAIC
362*4882a593Smuzhiyun  *
363*4882a593Smuzhiyun  * @param image
364*4882a593Smuzhiyun  *      The output destination image.
365*4882a593Smuzhiyun  * @param rect
366*4882a593Smuzhiyun  *      The rectangle on the source image that needs to be mosaicked.
367*4882a593Smuzhiyun  * @param mosaic_mode
368*4882a593Smuzhiyun  *      mosaic block width configuration:
369*4882a593Smuzhiyun  *          IM_MOSAIC_8
370*4882a593Smuzhiyun  *          IM_MOSAIC_16
371*4882a593Smuzhiyun  *          IM_MOSAIC_32
372*4882a593Smuzhiyun  *          IM_MOSAIC_64
373*4882a593Smuzhiyun  *          IM_MOSAIC_128
374*4882a593Smuzhiyun  * @param sync
375*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
376*4882a593Smuzhiyun  *
377*4882a593Smuzhiyun  * @returns success or else negative error code.
378*4882a593Smuzhiyun  */
379*4882a593Smuzhiyun IM_API IM_STATUS immosaic(const rga_buffer_t image, im_rect rect, int mosaic_mode, int sync = 1, int *release_fence_fd = NULL);
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun /**
382*4882a593Smuzhiyun  * MOSAIC array
383*4882a593Smuzhiyun  *
384*4882a593Smuzhiyun  * @param image
385*4882a593Smuzhiyun  *      The output destination image.
386*4882a593Smuzhiyun  * @param rect_array
387*4882a593Smuzhiyun  *      The rectangle arrays on the source image that needs to be filled with color.
388*4882a593Smuzhiyun  * @param array_size
389*4882a593Smuzhiyun  *      The size of rectangular area arrays.
390*4882a593Smuzhiyun  * @param mosaic_mode
391*4882a593Smuzhiyun  *      mosaic block width configuration:
392*4882a593Smuzhiyun  *          IM_MOSAIC_8
393*4882a593Smuzhiyun  *          IM_MOSAIC_16
394*4882a593Smuzhiyun  *          IM_MOSAIC_32
395*4882a593Smuzhiyun  *          IM_MOSAIC_64
396*4882a593Smuzhiyun  *          IM_MOSAIC_128
397*4882a593Smuzhiyun  * @param sync
398*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
399*4882a593Smuzhiyun  *
400*4882a593Smuzhiyun  * @returns success or else negative error code.
401*4882a593Smuzhiyun  */
402*4882a593Smuzhiyun IM_API IM_STATUS immosaicArray(const rga_buffer_t image, im_rect *rect_array, int array_size, int mosaic_mode, int sync = 1, int *release_fence_fd = NULL);
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun /**
405*4882a593Smuzhiyun  * palette
406*4882a593Smuzhiyun  *
407*4882a593Smuzhiyun  * @param src
408*4882a593Smuzhiyun  *      The input source image.
409*4882a593Smuzhiyun  * @param dst
410*4882a593Smuzhiyun  *      The output destination image.
411*4882a593Smuzhiyun  * @param lut
412*4882a593Smuzhiyun  *      The LUT table.
413*4882a593Smuzhiyun  * @param sync
414*4882a593Smuzhiyun  *      When 'sync == 1', wait for the operation to complete and return, otherwise return directly.
415*4882a593Smuzhiyun  *
416*4882a593Smuzhiyun  * @returns success or else negative error code.
417*4882a593Smuzhiyun  */
418*4882a593Smuzhiyun IM_API IM_STATUS impalette(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t lut, int sync = 1, int *release_fence_fd = NULL);
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun /**
421*4882a593Smuzhiyun  * process for single task mode
422*4882a593Smuzhiyun  *
423*4882a593Smuzhiyun  * @param src
424*4882a593Smuzhiyun  *      The input source image and is also the foreground image in blend.
425*4882a593Smuzhiyun  * @param dst
426*4882a593Smuzhiyun  *      The output destination image and is also the foreground image in blend.
427*4882a593Smuzhiyun  * @param pat
428*4882a593Smuzhiyun  *      The foreground image, or a LUT table.
429*4882a593Smuzhiyun  * @param srect
430*4882a593Smuzhiyun  *      The rectangle on the src channel image that needs to be processed.
431*4882a593Smuzhiyun  * @param drect
432*4882a593Smuzhiyun  *      The rectangle on the dst channel image that needs to be processed.
433*4882a593Smuzhiyun  * @param prect
434*4882a593Smuzhiyun  *      The rectangle on the pat channel image that needs to be processed.
435*4882a593Smuzhiyun  * @param opt
436*4882a593Smuzhiyun  *      The image processing options configuration.
437*4882a593Smuzhiyun  * @param usage
438*4882a593Smuzhiyun  *      The image processing usage.
439*4882a593Smuzhiyun  *
440*4882a593Smuzhiyun  * @returns success or else negative error code.
441*4882a593Smuzhiyun  */
442*4882a593Smuzhiyun IM_API IM_STATUS improcess(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
443*4882a593Smuzhiyun                            im_rect srect, im_rect drect, im_rect prect,
444*4882a593Smuzhiyun                            int acquire_fence_fd, int *release_fence_fd,
445*4882a593Smuzhiyun                            im_opt_t *opt_ptr, int usage);
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun /**
448*4882a593Smuzhiyun  * make border
449*4882a593Smuzhiyun  *
450*4882a593Smuzhiyun  * @param src
451*4882a593Smuzhiyun  *      The input source image.
452*4882a593Smuzhiyun  * @param dst
453*4882a593Smuzhiyun  *      The output destination image.
454*4882a593Smuzhiyun  * @param top
455*4882a593Smuzhiyun  *      the top pixels
456*4882a593Smuzhiyun  * @param bottom
457*4882a593Smuzhiyun  *      the bottom pixels
458*4882a593Smuzhiyun  * @param left
459*4882a593Smuzhiyun  *      the left pixels
460*4882a593Smuzhiyun  * @param right
461*4882a593Smuzhiyun  *      the right pixels
462*4882a593Smuzhiyun  * @param border_type
463*4882a593Smuzhiyun  *      Border type.
464*4882a593Smuzhiyun  * @param value
465*4882a593Smuzhiyun  *      The pixel value at which the border is filled.
466*4882a593Smuzhiyun  *
467*4882a593Smuzhiyun  * @returns success or else negative error code.
468*4882a593Smuzhiyun  */
469*4882a593Smuzhiyun IM_API IM_STATUS immakeBorder(rga_buffer_t src, rga_buffer_t dst,
470*4882a593Smuzhiyun                               int top, int bottom, int left, int right,
471*4882a593Smuzhiyun                               int border_type, int value = 0,
472*4882a593Smuzhiyun                               int sync = 1, int acquir_fence_fd = -1, int *release_fence_fd = NULL);
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun #endif /* #ifdef __cplusplus */
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun IM_C_API IM_STATUS immosaic(const rga_buffer_t image, im_rect rect, int mosaic_mode, int sync);
477*4882a593Smuzhiyun IM_C_API IM_STATUS imosd(const rga_buffer_t osd,const rga_buffer_t dst,
478*4882a593Smuzhiyun                          const im_rect osd_rect, im_osd_t *osd_config, int sync);
479*4882a593Smuzhiyun IM_C_API IM_STATUS improcess(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
480*4882a593Smuzhiyun                              im_rect srect, im_rect drect, im_rect prect, int usage);
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun /* Start: Symbols reserved for compatibility with macro functions */
483*4882a593Smuzhiyun IM_C_API IM_STATUS imcopy_t(const rga_buffer_t src, rga_buffer_t dst, int sync);
484*4882a593Smuzhiyun IM_C_API IM_STATUS imresize_t(const rga_buffer_t src, rga_buffer_t dst, double fx, double fy, int interpolation, int sync);
485*4882a593Smuzhiyun IM_C_API IM_STATUS imcrop_t(const rga_buffer_t src, rga_buffer_t dst, im_rect rect, int sync);
486*4882a593Smuzhiyun IM_C_API IM_STATUS imtranslate_t(const rga_buffer_t src, rga_buffer_t dst, int x, int y, int sync);
487*4882a593Smuzhiyun IM_C_API IM_STATUS imcvtcolor_t(rga_buffer_t src, rga_buffer_t dst, int sfmt, int dfmt, int mode, int sync);
488*4882a593Smuzhiyun IM_C_API IM_STATUS imrotate_t(const rga_buffer_t src, rga_buffer_t dst, int rotation, int sync);
489*4882a593Smuzhiyun IM_C_API IM_STATUS imflip_t (const rga_buffer_t src, rga_buffer_t dst, int mode, int sync);
490*4882a593Smuzhiyun IM_C_API IM_STATUS imblend_t(const rga_buffer_t srcA, const rga_buffer_t srcB, rga_buffer_t dst, int mode, int sync);
491*4882a593Smuzhiyun IM_C_API IM_STATUS imcolorkey_t(const rga_buffer_t src, rga_buffer_t dst, im_colorkey_range range, int mode, int sync);
492*4882a593Smuzhiyun IM_C_API IM_STATUS imquantize_t(const rga_buffer_t src, rga_buffer_t dst, im_nn_t nn_info, int sync);
493*4882a593Smuzhiyun IM_C_API IM_STATUS imrop_t(const rga_buffer_t src, rga_buffer_t dst, int rop_code, int sync);
494*4882a593Smuzhiyun IM_C_API IM_STATUS imfill_t(rga_buffer_t dst, im_rect rect, int color, int sync);
495*4882a593Smuzhiyun IM_C_API IM_STATUS impalette_t(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t lut, int sync);
496*4882a593Smuzhiyun /* End: Symbols reserved for compatibility with macro functions */
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun #ifndef __cplusplus
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun #define RGA_GET_MIN(n1, n2) ((n1) < (n2) ? (n1) : (n2))
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun /**
503*4882a593Smuzhiyun  * copy
504*4882a593Smuzhiyun  *
505*4882a593Smuzhiyun  * @param src
506*4882a593Smuzhiyun  * @param dst
507*4882a593Smuzhiyun  * @param sync
508*4882a593Smuzhiyun  *      wait until operation complete
509*4882a593Smuzhiyun  *
510*4882a593Smuzhiyun  * @returns success or else negative error code.
511*4882a593Smuzhiyun  */
512*4882a593Smuzhiyun #define imcopy(src, dst, ...) \
513*4882a593Smuzhiyun     ({ \
514*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
515*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
516*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
517*4882a593Smuzhiyun         if (__argc == 0) { \
518*4882a593Smuzhiyun             __ret = imcopy_t(src, dst, 1); \
519*4882a593Smuzhiyun         } else if (__argc == 1){ \
520*4882a593Smuzhiyun             __ret = imcopy_t(src, dst, (int)__args[RGA_GET_MIN(__argc, 0)]); \
521*4882a593Smuzhiyun         } else { \
522*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
523*4882a593Smuzhiyun             printf("invalid parameter\n"); \
524*4882a593Smuzhiyun         } \
525*4882a593Smuzhiyun         __ret; \
526*4882a593Smuzhiyun     })
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun /**
529*4882a593Smuzhiyun  * Resize
530*4882a593Smuzhiyun  *
531*4882a593Smuzhiyun  * @param src
532*4882a593Smuzhiyun  * @param dst
533*4882a593Smuzhiyun  * @param fx
534*4882a593Smuzhiyun  * @param fy
535*4882a593Smuzhiyun  * @param interpolation
536*4882a593Smuzhiyun  * @param sync
537*4882a593Smuzhiyun  *      wait until operation complete
538*4882a593Smuzhiyun  *
539*4882a593Smuzhiyun  * @returns success or else negative error code.
540*4882a593Smuzhiyun  */
541*4882a593Smuzhiyun #define imresize(src, dst, ...) \
542*4882a593Smuzhiyun     ({ \
543*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
544*4882a593Smuzhiyun         double __args[] = {__VA_ARGS__}; \
545*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(double); \
546*4882a593Smuzhiyun         if (__argc == 0) { \
547*4882a593Smuzhiyun             __ret = imresize_t(src, dst, 0, 0, INTER_LINEAR, 1); \
548*4882a593Smuzhiyun         } else if (__argc == 2){ \
549*4882a593Smuzhiyun             __ret = imresize_t(src, dst, __args[RGA_GET_MIN(__argc, 0)], __args[RGA_GET_MIN(__argc, 1)], INTER_LINEAR, 1); \
550*4882a593Smuzhiyun         } else if (__argc == 3){ \
551*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); \
552*4882a593Smuzhiyun         } else if (__argc == 4){ \
553*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)]); \
554*4882a593Smuzhiyun         } else { \
555*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
556*4882a593Smuzhiyun             printf("invalid parameter\n"); \
557*4882a593Smuzhiyun         } \
558*4882a593Smuzhiyun         __ret; \
559*4882a593Smuzhiyun     })
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun #define impyramid(src, dst, direction) \
562*4882a593Smuzhiyun         imresize_t(src, \
563*4882a593Smuzhiyun                    dst, \
564*4882a593Smuzhiyun                    direction == IM_UP_SCALE ? 0.5 : 2, \
565*4882a593Smuzhiyun                    direction == IM_UP_SCALE ? 0.5 : 2, \
566*4882a593Smuzhiyun                    INTER_LINEAR, 1)
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun /**
569*4882a593Smuzhiyun  * format convert
570*4882a593Smuzhiyun  *
571*4882a593Smuzhiyun  * @param src
572*4882a593Smuzhiyun  * @param dst
573*4882a593Smuzhiyun  * @param sfmt
574*4882a593Smuzhiyun  * @param dfmt
575*4882a593Smuzhiyun  * @param mode
576*4882a593Smuzhiyun  *      color space mode: IM_COLOR_SPACE_MODE
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 imcvtcolor(src, dst, sfmt, dfmt, ...) \
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 = imcvtcolor_t(src, dst, sfmt, dfmt, IM_COLOR_SPACE_DEFAULT, 1); \
589*4882a593Smuzhiyun         } else if (__argc == 1){ \
590*4882a593Smuzhiyun             __ret = imcvtcolor_t(src, dst, sfmt, dfmt, (int)__args[RGA_GET_MIN(__argc, 0)], 1); \
591*4882a593Smuzhiyun         } else if (__argc == 2){ \
592*4882a593Smuzhiyun             __ret = imcvtcolor_t(src, dst, sfmt, dfmt, (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 
600*4882a593Smuzhiyun /**
601*4882a593Smuzhiyun  * Crop
602*4882a593Smuzhiyun  *
603*4882a593Smuzhiyun  * @param src
604*4882a593Smuzhiyun  * @param dst
605*4882a593Smuzhiyun  * @param rect
606*4882a593Smuzhiyun  * @param sync
607*4882a593Smuzhiyun  *      wait until operation complete
608*4882a593Smuzhiyun  *
609*4882a593Smuzhiyun  * @returns success or else negative error code.
610*4882a593Smuzhiyun  */
611*4882a593Smuzhiyun #define imcrop(src, dst, rect, ...) \
612*4882a593Smuzhiyun     ({ \
613*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
614*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
615*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
616*4882a593Smuzhiyun         if (__argc == 0) { \
617*4882a593Smuzhiyun             __ret = imcrop_t(src, dst, rect, 1); \
618*4882a593Smuzhiyun         } else if (__argc == 1){ \
619*4882a593Smuzhiyun             __ret = imcrop_t(src, dst, rect, (int)__args[RGA_GET_MIN(__argc, 0)]); \
620*4882a593Smuzhiyun         } else { \
621*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
622*4882a593Smuzhiyun             printf("invalid parameter\n"); \
623*4882a593Smuzhiyun         } \
624*4882a593Smuzhiyun         __ret; \
625*4882a593Smuzhiyun     })
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun /**
628*4882a593Smuzhiyun  * translate
629*4882a593Smuzhiyun  *
630*4882a593Smuzhiyun  * @param src
631*4882a593Smuzhiyun  * @param dst
632*4882a593Smuzhiyun  * @param x
633*4882a593Smuzhiyun  * @param y
634*4882a593Smuzhiyun  * @param sync
635*4882a593Smuzhiyun  *      wait until operation complete
636*4882a593Smuzhiyun  *
637*4882a593Smuzhiyun  * @returns success or else negative error code.
638*4882a593Smuzhiyun  */
639*4882a593Smuzhiyun #define imtranslate(src, dst, x, y, ...) \
640*4882a593Smuzhiyun     ({ \
641*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
642*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
643*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
644*4882a593Smuzhiyun         if (__argc == 0) { \
645*4882a593Smuzhiyun             __ret = imtranslate_t(src, dst, x, y, 1); \
646*4882a593Smuzhiyun         } else if (__argc == 1){ \
647*4882a593Smuzhiyun             __ret = imtranslate_t(src, dst, x, y, (int)__args[RGA_GET_MIN(__argc, 0)]); \
648*4882a593Smuzhiyun         } else { \
649*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
650*4882a593Smuzhiyun             printf("invalid parameter\n"); \
651*4882a593Smuzhiyun         } \
652*4882a593Smuzhiyun         __ret; \
653*4882a593Smuzhiyun     })
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun /**
656*4882a593Smuzhiyun  * rotation
657*4882a593Smuzhiyun  *
658*4882a593Smuzhiyun  * @param src
659*4882a593Smuzhiyun  * @param dst
660*4882a593Smuzhiyun  * @param rotation
661*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_ROT_90
662*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_ROT_180
663*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_ROT_270
664*4882a593Smuzhiyun  * @param sync
665*4882a593Smuzhiyun  *      wait until operation complete
666*4882a593Smuzhiyun  *
667*4882a593Smuzhiyun  * @returns success or else negative error code.
668*4882a593Smuzhiyun  */
669*4882a593Smuzhiyun #define imrotate(src, dst, rotation, ...) \
670*4882a593Smuzhiyun     ({ \
671*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
672*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
673*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
674*4882a593Smuzhiyun         if (__argc == 0) { \
675*4882a593Smuzhiyun             __ret = imrotate_t(src, dst, rotation, 1); \
676*4882a593Smuzhiyun         } else if (__argc == 1){ \
677*4882a593Smuzhiyun             __ret = imrotate_t(src, dst, rotation, (int)__args[RGA_GET_MIN(__argc, 0)]); \
678*4882a593Smuzhiyun         } else { \
679*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
680*4882a593Smuzhiyun             printf("invalid parameter\n"); \
681*4882a593Smuzhiyun         } \
682*4882a593Smuzhiyun         __ret; \
683*4882a593Smuzhiyun     })
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun 
686*4882a593Smuzhiyun /**
687*4882a593Smuzhiyun  * flip
688*4882a593Smuzhiyun  *
689*4882a593Smuzhiyun  * @param src
690*4882a593Smuzhiyun  * @param dst
691*4882a593Smuzhiyun  * @param mode
692*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_FLIP_H
693*4882a593Smuzhiyun  *      IM_HAL_TRANSFORM_FLIP_V
694*4882a593Smuzhiyun  * @param sync
695*4882a593Smuzhiyun  *      wait until operation complete
696*4882a593Smuzhiyun  *
697*4882a593Smuzhiyun  * @returns success or else negative error code.
698*4882a593Smuzhiyun  */
699*4882a593Smuzhiyun #define imflip(src, dst, mode, ...) \
700*4882a593Smuzhiyun     ({ \
701*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
702*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
703*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
704*4882a593Smuzhiyun         if (__argc == 0) { \
705*4882a593Smuzhiyun             __ret = imflip_t(src, dst, mode, 1); \
706*4882a593Smuzhiyun         } else if (__argc == 1){ \
707*4882a593Smuzhiyun             __ret = imflip_t(src, dst, mode, (int)__args[RGA_GET_MIN(__argc, 0)]); \
708*4882a593Smuzhiyun         } else { \
709*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
710*4882a593Smuzhiyun             printf("invalid parameter\n"); \
711*4882a593Smuzhiyun         } \
712*4882a593Smuzhiyun         __ret; \
713*4882a593Smuzhiyun     })
714*4882a593Smuzhiyun 
715*4882a593Smuzhiyun /**
716*4882a593Smuzhiyun  * blend (SRC + DST -> DST or SRCA + SRCB -> DST)
717*4882a593Smuzhiyun  *
718*4882a593Smuzhiyun  * @param srcA
719*4882a593Smuzhiyun  * @param srcB can be NULL.
720*4882a593Smuzhiyun  * @param dst
721*4882a593Smuzhiyun  * @param mode
722*4882a593Smuzhiyun  *      IM_ALPHA_BLEND_MODE
723*4882a593Smuzhiyun  * @param sync
724*4882a593Smuzhiyun  *      wait until operation complete
725*4882a593Smuzhiyun  *
726*4882a593Smuzhiyun  * @returns success or else negative error code.
727*4882a593Smuzhiyun  */
728*4882a593Smuzhiyun #define imblend(srcA, dst, ...) \
729*4882a593Smuzhiyun     ({ \
730*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
731*4882a593Smuzhiyun         rga_buffer_t srcB; \
732*4882a593Smuzhiyun         memset(&srcB, 0x00, sizeof(rga_buffer_t)); \
733*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
734*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
735*4882a593Smuzhiyun         if (__argc == 0) { \
736*4882a593Smuzhiyun             __ret = imblend_t(srcA, srcB, dst, IM_ALPHA_BLEND_SRC_OVER, 1); \
737*4882a593Smuzhiyun         } else if (__argc == 1){ \
738*4882a593Smuzhiyun             __ret = imblend_t(srcA, srcB, dst, (int)__args[RGA_GET_MIN(__argc, 0)], 1); \
739*4882a593Smuzhiyun         } else if (__argc == 2){ \
740*4882a593Smuzhiyun             __ret = imblend_t(srcA, srcB, dst, (int)__args[RGA_GET_MIN(__argc, 0)], (int)__args[RGA_GET_MIN(__argc, 1)]); \
741*4882a593Smuzhiyun         } else { \
742*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
743*4882a593Smuzhiyun             printf("invalid parameter\n"); \
744*4882a593Smuzhiyun         } \
745*4882a593Smuzhiyun         __ret; \
746*4882a593Smuzhiyun     })
747*4882a593Smuzhiyun #define imcomposite(srcA, srcB, dst, ...) \
748*4882a593Smuzhiyun     ({ \
749*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
750*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
751*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
752*4882a593Smuzhiyun         if (__argc == 0) { \
753*4882a593Smuzhiyun             __ret = imblend_t(srcA, srcB, dst, IM_ALPHA_BLEND_SRC_OVER, 1); \
754*4882a593Smuzhiyun         } else if (__argc == 1){ \
755*4882a593Smuzhiyun             __ret = imblend_t(srcA, srcB, dst, (int)__args[RGA_GET_MIN(__argc, 0)], 1); \
756*4882a593Smuzhiyun         } else if (__argc == 2){ \
757*4882a593Smuzhiyun             __ret = imblend_t(srcA, srcB, dst, (int)__args[RGA_GET_MIN(__argc, 0)], (int)__args[RGA_GET_MIN(__argc, 1)]); \
758*4882a593Smuzhiyun         } else { \
759*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
760*4882a593Smuzhiyun             printf("invalid parameter\n"); \
761*4882a593Smuzhiyun         } \
762*4882a593Smuzhiyun         __ret; \
763*4882a593Smuzhiyun     })
764*4882a593Smuzhiyun 
765*4882a593Smuzhiyun /**
766*4882a593Smuzhiyun  * color key
767*4882a593Smuzhiyun  *
768*4882a593Smuzhiyun  * @param src
769*4882a593Smuzhiyun  * @param dst
770*4882a593Smuzhiyun  * @param colorkey_range
771*4882a593Smuzhiyun  *      max color
772*4882a593Smuzhiyun  *      min color
773*4882a593Smuzhiyun  * @param sync
774*4882a593Smuzhiyun  *      wait until operation complete
775*4882a593Smuzhiyun  *
776*4882a593Smuzhiyun  * @returns success or else negative error code.
777*4882a593Smuzhiyun  */
778*4882a593Smuzhiyun #define imcolorkey(src, dst, range, ...) \
779*4882a593Smuzhiyun     ({ \
780*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
781*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
782*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
783*4882a593Smuzhiyun         if (__argc == 0) { \
784*4882a593Smuzhiyun             __ret = imcolorkey_t(src, dst, range, IM_ALPHA_COLORKEY_NORMAL, 1); \
785*4882a593Smuzhiyun         } else if (__argc == 1){ \
786*4882a593Smuzhiyun             __ret = imcolorkey_t(src, dst, range, (int)__args[RGA_GET_MIN(__argc, 0)], 1); \
787*4882a593Smuzhiyun         } else if (__argc == 2){ \
788*4882a593Smuzhiyun             __ret = imcolorkey_t(src, dst, range, (int)__args[RGA_GET_MIN(__argc, 0)], (int)__args[RGA_GET_MIN(__argc, 1)]); \
789*4882a593Smuzhiyun         } else { \
790*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
791*4882a593Smuzhiyun             printf("invalid parameter\n"); \
792*4882a593Smuzhiyun         } \
793*4882a593Smuzhiyun         __ret; \
794*4882a593Smuzhiyun     })
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun /**
797*4882a593Smuzhiyun  * nn quantize
798*4882a593Smuzhiyun  *
799*4882a593Smuzhiyun  * @param src
800*4882a593Smuzhiyun  * @param dst
801*4882a593Smuzhiyun  * @param nninfo
802*4882a593Smuzhiyun  * @param sync
803*4882a593Smuzhiyun  *      wait until operation complete
804*4882a593Smuzhiyun  *
805*4882a593Smuzhiyun  * @returns success or else negative error code.
806*4882a593Smuzhiyun  */
807*4882a593Smuzhiyun #define imquantize(src, dst, nn_info, ...) \
808*4882a593Smuzhiyun     ({ \
809*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
810*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
811*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
812*4882a593Smuzhiyun         if (__argc == 0) { \
813*4882a593Smuzhiyun             __ret = imquantize_t(src, dst, nn_info, 1); \
814*4882a593Smuzhiyun         } else if (__argc == 1){ \
815*4882a593Smuzhiyun             __ret = imquantize_t(src, dst, nn_info, (int)__args[RGA_GET_MIN(__argc, 0)]); \
816*4882a593Smuzhiyun         } else { \
817*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
818*4882a593Smuzhiyun             printf("invalid parameter\n"); \
819*4882a593Smuzhiyun         } \
820*4882a593Smuzhiyun         __ret; \
821*4882a593Smuzhiyun     })
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun 
824*4882a593Smuzhiyun /**
825*4882a593Smuzhiyun  * ROP
826*4882a593Smuzhiyun  *
827*4882a593Smuzhiyun  * @param src
828*4882a593Smuzhiyun  * @param dst
829*4882a593Smuzhiyun  * @param rop_code
830*4882a593Smuzhiyun  * @param sync
831*4882a593Smuzhiyun  *      wait until operation complete
832*4882a593Smuzhiyun  *
833*4882a593Smuzhiyun  * @returns success or else negative error code.
834*4882a593Smuzhiyun  */
835*4882a593Smuzhiyun #define imrop(src, dst, rop_code, ...) \
836*4882a593Smuzhiyun     ({ \
837*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
838*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
839*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
840*4882a593Smuzhiyun         if (__argc == 0) { \
841*4882a593Smuzhiyun             __ret = imrop_t(src, dst, rop_code, 1); \
842*4882a593Smuzhiyun         } else if (__argc == 1){ \
843*4882a593Smuzhiyun             __ret = imrop_t(src, dst, rop_code, (int)__args[RGA_GET_MIN(__argc, 0)]); \
844*4882a593Smuzhiyun         } else { \
845*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
846*4882a593Smuzhiyun             printf("invalid parameter\n"); \
847*4882a593Smuzhiyun         } \
848*4882a593Smuzhiyun         __ret; \
849*4882a593Smuzhiyun     })
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun /**
852*4882a593Smuzhiyun  * fill/reset/draw
853*4882a593Smuzhiyun  *
854*4882a593Smuzhiyun  * @param src
855*4882a593Smuzhiyun  * @param dst
856*4882a593Smuzhiyun  * @param rect
857*4882a593Smuzhiyun  * @param color
858*4882a593Smuzhiyun  * @param sync
859*4882a593Smuzhiyun  *      wait until operation complete
860*4882a593Smuzhiyun  *
861*4882a593Smuzhiyun  * @returns success or else negative error code.
862*4882a593Smuzhiyun  */
863*4882a593Smuzhiyun #define imfill(buf, rect, color, ...) \
864*4882a593Smuzhiyun     ({ \
865*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
866*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
867*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
868*4882a593Smuzhiyun         if (__argc == 0) { \
869*4882a593Smuzhiyun             __ret = imfill_t(buf, rect, color, 1); \
870*4882a593Smuzhiyun         } else if (__argc == 1){ \
871*4882a593Smuzhiyun             __ret = imfill_t(buf, rect, color, (int)__args[RGA_GET_MIN(__argc, 0)]); \
872*4882a593Smuzhiyun         } else { \
873*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
874*4882a593Smuzhiyun             printf("invalid parameter\n"); \
875*4882a593Smuzhiyun         } \
876*4882a593Smuzhiyun         __ret; \
877*4882a593Smuzhiyun     })
878*4882a593Smuzhiyun 
879*4882a593Smuzhiyun #define imreset(buf, rect, color, ...) \
880*4882a593Smuzhiyun     ({ \
881*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
882*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
883*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
884*4882a593Smuzhiyun         if (__argc == 0) { \
885*4882a593Smuzhiyun             __ret = imfill_t(buf, rect, color, 1); \
886*4882a593Smuzhiyun         } else if (__argc == 1){ \
887*4882a593Smuzhiyun             __ret = imfill_t(buf, rect, color, (int)__args[RGA_GET_MIN(__argc, 0)]); \
888*4882a593Smuzhiyun         } else { \
889*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
890*4882a593Smuzhiyun             printf("invalid parameter\n"); \
891*4882a593Smuzhiyun         } \
892*4882a593Smuzhiyun         __ret; \
893*4882a593Smuzhiyun     })
894*4882a593Smuzhiyun 
895*4882a593Smuzhiyun #define imdraw(buf, rect, color, ...) \
896*4882a593Smuzhiyun     ({ \
897*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
898*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
899*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
900*4882a593Smuzhiyun         if (__argc == 0) { \
901*4882a593Smuzhiyun             __ret = imfill_t(buf, rect, color, 1); \
902*4882a593Smuzhiyun         } else if (__argc == 1){ \
903*4882a593Smuzhiyun             __ret = imfill_t(buf, rect, color, (int)__args[RGA_GET_MIN(__argc, 0)]); \
904*4882a593Smuzhiyun         } else { \
905*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
906*4882a593Smuzhiyun             printf("invalid parameter\n"); \
907*4882a593Smuzhiyun         } \
908*4882a593Smuzhiyun         __ret; \
909*4882a593Smuzhiyun     })
910*4882a593Smuzhiyun 
911*4882a593Smuzhiyun /**
912*4882a593Smuzhiyun  * palette
913*4882a593Smuzhiyun  *
914*4882a593Smuzhiyun  * @param src
915*4882a593Smuzhiyun  * @param dst
916*4882a593Smuzhiyun  * @param lut
917*4882a593Smuzhiyun  * @param sync
918*4882a593Smuzhiyun  *      wait until operation complete
919*4882a593Smuzhiyun  *
920*4882a593Smuzhiyun  * @returns success or else negative error code.
921*4882a593Smuzhiyun  */
922*4882a593Smuzhiyun #define impalette(src, dst, lut,  ...) \
923*4882a593Smuzhiyun     ({ \
924*4882a593Smuzhiyun         IM_STATUS __ret = IM_STATUS_SUCCESS; \
925*4882a593Smuzhiyun         int __args[] = {__VA_ARGS__}; \
926*4882a593Smuzhiyun         int __argc = sizeof(__args)/sizeof(int); \
927*4882a593Smuzhiyun         if (__argc == 0) { \
928*4882a593Smuzhiyun             __ret = impalette_t(src, dst, lut, 1); \
929*4882a593Smuzhiyun         } else if (__argc == 1){ \
930*4882a593Smuzhiyun             __ret = impalette_t(src, dst, lut, (int)__args[RGA_GET_MIN(__argc, 0)]); \
931*4882a593Smuzhiyun         } else { \
932*4882a593Smuzhiyun             __ret = IM_STATUS_INVALID_PARAM; \
933*4882a593Smuzhiyun             printf("invalid parameter\n"); \
934*4882a593Smuzhiyun         } \
935*4882a593Smuzhiyun         __ret; \
936*4882a593Smuzhiyun     })
937*4882a593Smuzhiyun /* End define IM2D macro API */
938*4882a593Smuzhiyun #endif
939*4882a593Smuzhiyun 
940*4882a593Smuzhiyun #endif /* #ifndef _im2d_single_h_ */