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_ */