13d0407baSopenharmony_ci/*
23d0407baSopenharmony_ci * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
33d0407baSopenharmony_ci * Authors:
43d0407baSopenharmony_ci *  PutinLee <putin.lee@rock-chips.com>
53d0407baSopenharmony_ci *  Cerf Yu <cerf.yu@rock-chips.com>
63d0407baSopenharmony_ci *
73d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
83d0407baSopenharmony_ci * you may not use this file except in compliance with the License.
93d0407baSopenharmony_ci * You may obtain a copy of the License at
103d0407baSopenharmony_ci *
113d0407baSopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
123d0407baSopenharmony_ci *
133d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
143d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
153d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163d0407baSopenharmony_ci * See the License for the specific language governing permissions and
173d0407baSopenharmony_ci * limitations under the License.
183d0407baSopenharmony_ci */
193d0407baSopenharmony_ci
203d0407baSopenharmony_ci#ifndef _im2d_h_
213d0407baSopenharmony_ci#define _im2d_h_
223d0407baSopenharmony_ci
233d0407baSopenharmony_ci#include "securec.h"
243d0407baSopenharmony_ci#ifdef __cplusplus
253d0407baSopenharmony_ciextern "C" {
263d0407baSopenharmony_ci#endif
273d0407baSopenharmony_ci
283d0407baSopenharmony_ci#ifndef IM_API
293d0407baSopenharmony_ci#define IM_API /* define API export as needed */
303d0407baSopenharmony_ci#endif
313d0407baSopenharmony_ci
323d0407baSopenharmony_citypedef enum {
333d0407baSopenharmony_ci    /* Rotation */
343d0407baSopenharmony_ci    IM_HAL_TRANSFORM_ROT_90     = 1 << 0,
353d0407baSopenharmony_ci    IM_HAL_TRANSFORM_ROT_180    = 1 << 1,
363d0407baSopenharmony_ci    IM_HAL_TRANSFORM_ROT_270    = 1 << 2,
373d0407baSopenharmony_ci    IM_HAL_TRANSFORM_FLIP_H     = 1 << 3,
383d0407baSopenharmony_ci    IM_HAL_TRANSFORM_FLIP_V     = 1 << 4,
393d0407baSopenharmony_ci    IM_HAL_TRANSFORM_FLIP_H_V   = 1 << 5,
403d0407baSopenharmony_ci    IM_HAL_TRANSFORM_MASK       = 0x3f,
413d0407baSopenharmony_ci
423d0407baSopenharmony_ci    /*
433d0407baSopenharmony_ci     * Blend
443d0407baSopenharmony_ci     * Additional blend usage, can be used with both source and target configs.
453d0407baSopenharmony_ci     * If none of the below is set, the default "SRC over DST" is applied.
463d0407baSopenharmony_ci     */
473d0407baSopenharmony_ci    IM_ALPHA_BLEND_SRC_OVER     = 1 << 6,     /* Default, Porter-Duff "SRC over DST" */
483d0407baSopenharmony_ci    IM_ALPHA_BLEND_SRC          = 1 << 7,     /* Porter-Duff "SRC" */
493d0407baSopenharmony_ci    IM_ALPHA_BLEND_DST          = 1 << 8,     /* Porter-Duff "DST" */
503d0407baSopenharmony_ci    IM_ALPHA_BLEND_SRC_IN       = 1 << 9,     /* Porter-Duff "SRC in DST" */
513d0407baSopenharmony_ci    IM_ALPHA_BLEND_DST_IN       = 1 << 10,    /* Porter-Duff "DST in SRC" */
523d0407baSopenharmony_ci    IM_ALPHA_BLEND_SRC_OUT      = 1 << 11,    /* Porter-Duff "SRC out DST" */
533d0407baSopenharmony_ci    IM_ALPHA_BLEND_DST_OUT      = 1 << 12,    /* Porter-Duff "DST out SRC" */
543d0407baSopenharmony_ci    IM_ALPHA_BLEND_DST_OVER     = 1 << 13,    /* Porter-Duff "DST over SRC" */
553d0407baSopenharmony_ci    IM_ALPHA_BLEND_SRC_ATOP     = 1 << 14,    /* Porter-Duff "SRC ATOP" */
563d0407baSopenharmony_ci    IM_ALPHA_BLEND_DST_ATOP     = 1 << 15,    /* Porter-Duff "DST ATOP" */
573d0407baSopenharmony_ci    IM_ALPHA_BLEND_XOR          = 1 << 16,    /* Xor */
583d0407baSopenharmony_ci    IM_ALPHA_BLEND_MASK         = 0x1ffc0,
593d0407baSopenharmony_ci
603d0407baSopenharmony_ci    IM_ALPHA_COLORKEY_NORMAL    = 1 << 17,
613d0407baSopenharmony_ci    IM_ALPHA_COLORKEY_INVERTED  = 1 << 18,
623d0407baSopenharmony_ci    IM_ALPHA_COLORKEY_MASK      = 0x60000,
633d0407baSopenharmony_ci
643d0407baSopenharmony_ci    IM_SYNC                     = 1 << 19,
653d0407baSopenharmony_ci    IM_ASYNC                    = 1 << 26,
663d0407baSopenharmony_ci    IM_CROP                     = 1 << 20,    /* Unused */
673d0407baSopenharmony_ci    IM_COLOR_FILL               = 1 << 21,
683d0407baSopenharmony_ci    IM_COLOR_PALETTE            = 1 << 22,
693d0407baSopenharmony_ci    IM_NN_QUANTIZE              = 1 << 23,
703d0407baSopenharmony_ci    IM_ROP                      = 1 << 24,
713d0407baSopenharmony_ci    IM_ALPHA_BLEND_PRE_MUL      = 1 << 25,
723d0407baSopenharmony_ci} IM_USAGE;
733d0407baSopenharmony_ci
743d0407baSopenharmony_citypedef enum {
753d0407baSopenharmony_ci    IM_ROP_AND                  = 0x88,
763d0407baSopenharmony_ci    IM_ROP_OR                   = 0xee,
773d0407baSopenharmony_ci    IM_ROP_NOT_DST              = 0x55,
783d0407baSopenharmony_ci    IM_ROP_NOT_SRC              = 0x33,
793d0407baSopenharmony_ci    IM_ROP_XOR                  = 0xf6,
803d0407baSopenharmony_ci    IM_ROP_NOT_XOR              = 0xf9,
813d0407baSopenharmony_ci} IM_ROP_CODE;
823d0407baSopenharmony_ci
833d0407baSopenharmony_citypedef enum {
843d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_ERROR_INDEX = 0,
853d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_RGB_INDEX,
863d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_RGB_OTHER_INDEX,
873d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_BPP_INDEX,
883d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_YUV_8_INDEX,
893d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_YUV_10_INDEX,
903d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_YUYV_420_INDEX,
913d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_YUYV_422_INDEX,
923d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_YUV_400_INDEX,
933d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_Y4_INDEX,
943d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_MASK_INDEX,
953d0407baSopenharmony_ci} IM_RGA_SUPPORT_FORMAT_INDEX;
963d0407baSopenharmony_ci
973d0407baSopenharmony_citypedef enum {
983d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_ERROR     = 1 << IM_RGA_SUPPORT_FORMAT_ERROR_INDEX,
993d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_RGB       = 1 << IM_RGA_SUPPORT_FORMAT_RGB_INDEX,
1003d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_RGB_OTHER = 1 << IM_RGA_SUPPORT_FORMAT_RGB_OTHER_INDEX,
1013d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_BPP       = 1 << IM_RGA_SUPPORT_FORMAT_BPP_INDEX,
1023d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_YUV_8     = 1 << IM_RGA_SUPPORT_FORMAT_YUV_8_INDEX,
1033d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_YUV_10    = 1 << IM_RGA_SUPPORT_FORMAT_YUV_10_INDEX,
1043d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_YUYV_420  = 1 << IM_RGA_SUPPORT_FORMAT_YUYV_420_INDEX,
1053d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_YUYV_422  = 1 << IM_RGA_SUPPORT_FORMAT_YUYV_422_INDEX,
1063d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_YUV_400   = 1 << IM_RGA_SUPPORT_FORMAT_YUV_400_INDEX,
1073d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_Y4        = 1 << IM_RGA_SUPPORT_FORMAT_Y4_INDEX,
1083d0407baSopenharmony_ci    IM_RGA_SUPPORT_FORMAT_MASK      = ~((~(unsigned int)0x0 << IM_RGA_SUPPORT_FORMAT_MASK_INDEX) | 1),
1093d0407baSopenharmony_ci} IM_RGA_SUPPORT_FORMAT;
1103d0407baSopenharmony_ci
1113d0407baSopenharmony_citypedef enum {
1123d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_ERROR_INDEX = 0,
1133d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_COLOR_FILL_INDEX,
1143d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_COLOR_PALETTE_INDEX,
1153d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_ROP_INDEX,
1163d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_QUANTIZE_INDEX,
1173d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC_INDEX,
1183d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC_INDEX,
1193d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_MASK_INDEX,
1203d0407baSopenharmony_ci} IM_RGA_SUPPORT_FEATURE_INDEX;
1213d0407baSopenharmony_ci
1223d0407baSopenharmony_citypedef enum {
1233d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_ERROR          = 1 << IM_RGA_SUPPORT_FEATURE_ERROR_INDEX,
1243d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_COLOR_FILL     = 1 << IM_RGA_SUPPORT_FEATURE_COLOR_FILL_INDEX,
1253d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_COLOR_PALETTE  = 1 << IM_RGA_SUPPORT_FEATURE_COLOR_PALETTE_INDEX,
1263d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_ROP            = 1 << IM_RGA_SUPPORT_FEATURE_ROP_INDEX,
1273d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_QUANTIZE       = 1 << IM_RGA_SUPPORT_FEATURE_QUANTIZE_INDEX,
1283d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC   = 1 << IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC_INDEX,
1293d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC   = 1 << IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC_INDEX,
1303d0407baSopenharmony_ci    IM_RGA_SUPPORT_FEATURE_MASK           = ~((~(unsigned int)0x0 << IM_RGA_SUPPORT_FEATURE_MASK_INDEX) | 1),
1313d0407baSopenharmony_ci} IM_RGA_SUPPORT_FEATURE;
1323d0407baSopenharmony_ci
1333d0407baSopenharmony_ci/* Status codes, returned by any blit function */
1343d0407baSopenharmony_citypedef enum {
1353d0407baSopenharmony_ci    IM_STATUS_NOERROR         =  2,
1363d0407baSopenharmony_ci    IM_STATUS_SUCCESS         =  1,
1373d0407baSopenharmony_ci    IM_STATUS_NOT_SUPPORTED   = -1,
1383d0407baSopenharmony_ci    IM_STATUS_OUT_OF_MEMORY   = -2,
1393d0407baSopenharmony_ci    IM_STATUS_INVALID_PARAM   = -3,
1403d0407baSopenharmony_ci    IM_STATUS_ILLEGAL_PARAM   = -4,
1413d0407baSopenharmony_ci    IM_STATUS_FAILED          =  0,
1423d0407baSopenharmony_ci} IM_STATUS;
1433d0407baSopenharmony_ci
1443d0407baSopenharmony_ci/* Status codes, returned by any blit function */
1453d0407baSopenharmony_citypedef enum {
1463d0407baSopenharmony_ci    IM_YUV_TO_RGB_BT601_LIMIT     = 1 << 0,
1473d0407baSopenharmony_ci    IM_YUV_TO_RGB_BT601_FULL      = 2 << 0,
1483d0407baSopenharmony_ci    IM_YUV_TO_RGB_BT709_LIMIT     = 3 << 0,
1493d0407baSopenharmony_ci    IM_YUV_TO_RGB_MASK            = 3 << 0,
1503d0407baSopenharmony_ci    IM_RGB_TO_YUV_BT601_FULL      = 1 << 2,
1513d0407baSopenharmony_ci    IM_RGB_TO_YUV_BT601_LIMIT     = 2 << 2,
1523d0407baSopenharmony_ci    IM_RGB_TO_YUV_BT709_LIMIT     = 3 << 2,
1533d0407baSopenharmony_ci    IM_RGB_TO_YUV_MASK            = 3 << 2,
1543d0407baSopenharmony_ci    IM_RGB_TO_Y4                  = 1 << 4,
1553d0407baSopenharmony_ci    IM_RGB_TO_Y4_DITHER           = 2 << 4,
1563d0407baSopenharmony_ci    IM_RGB_TO_Y1_DITHER           = 3 << 4,
1573d0407baSopenharmony_ci    IM_Y4_MASK                    = 3 << 4,
1583d0407baSopenharmony_ci    IM_RGB_FULL                   = 1 << 8,
1593d0407baSopenharmony_ci    IM_RGB_CLIP                   = 2 << 8,
1603d0407baSopenharmony_ci    IM_YUV_BT601_LIMIT_RANGE      = 3 << 8,
1613d0407baSopenharmony_ci    IM_YUV_BT601_FULL_RANGE       = 4 << 8,
1623d0407baSopenharmony_ci    IM_YUV_BT709_LIMIT_RANGE      = 5 << 8,
1633d0407baSopenharmony_ci    IM_YUV_BT709_FULL_RANGE       = 6 << 8,
1643d0407baSopenharmony_ci    IM_FULL_CSC_MASK              = 0xf << 8,
1653d0407baSopenharmony_ci    IM_COLOR_SPACE_DEFAULT        = 0,
1663d0407baSopenharmony_ci} IM_COLOR_SPACE_MODE;
1673d0407baSopenharmony_ci
1683d0407baSopenharmony_citypedef enum {
1693d0407baSopenharmony_ci    IM_UP_SCALE,
1703d0407baSopenharmony_ci    IM_DOWN_SCALE,
1713d0407baSopenharmony_ci} IM_SCALE;
1723d0407baSopenharmony_ci
1733d0407baSopenharmony_citypedef enum {
1743d0407baSopenharmony_ci    INTER_NEAREST,
1753d0407baSopenharmony_ci    INTER_LINEAR,
1763d0407baSopenharmony_ci    INTER_CUBIC,
1773d0407baSopenharmony_ci} IM_SCALE_MODE;
1783d0407baSopenharmony_ci
1793d0407baSopenharmony_ci/* Get RGA basic information index */
1803d0407baSopenharmony_citypedef enum {
1813d0407baSopenharmony_ci    RGA_VENDOR = 0,
1823d0407baSopenharmony_ci    RGA_VERSION,
1833d0407baSopenharmony_ci    RGA_MAX_INPUT,
1843d0407baSopenharmony_ci    RGA_MAX_OUTPUT,
1853d0407baSopenharmony_ci    RGA_SCALE_LIMIT,
1863d0407baSopenharmony_ci    RGA_INPUT_FORMAT,
1873d0407baSopenharmony_ci    RGA_OUTPUT_FORMAT,
1883d0407baSopenharmony_ci    RGA_FEATURE,
1893d0407baSopenharmony_ci    RGA_EXPECTED,
1903d0407baSopenharmony_ci    RGA_ALL,
1913d0407baSopenharmony_ci} IM_INFORMATION;
1923d0407baSopenharmony_ci
1933d0407baSopenharmony_ci/* rga version index */
1943d0407baSopenharmony_citypedef enum {
1953d0407baSopenharmony_ci    RGA_V_ERR                  = 0x0,
1963d0407baSopenharmony_ci    RGA_1                      = 0x1,
1973d0407baSopenharmony_ci    RGA_1_PLUS                 = 0x2,
1983d0407baSopenharmony_ci    RGA_2                      = 0x3,
1993d0407baSopenharmony_ci    RGA_2_LITE0                = 0x4,
2003d0407baSopenharmony_ci    RGA_2_LITE1                = 0x5,
2013d0407baSopenharmony_ci    RGA_2_ENHANCE              = 0x6,
2023d0407baSopenharmony_ci} RGA_VERSION_NUM;
2033d0407baSopenharmony_ci
2043d0407baSopenharmony_citypedef struct {
2053d0407baSopenharmony_ci    RGA_VERSION_NUM version;
2063d0407baSopenharmony_ci    unsigned int input_resolution;
2073d0407baSopenharmony_ci    unsigned int output_resolution;
2083d0407baSopenharmony_ci    unsigned int scale_limit;
2093d0407baSopenharmony_ci    unsigned int performance;
2103d0407baSopenharmony_ci    unsigned int input_format;
2113d0407baSopenharmony_ci    unsigned int output_format;
2123d0407baSopenharmony_ci    unsigned int feature;
2133d0407baSopenharmony_ci    char reserved[28];
2143d0407baSopenharmony_ci} rga_info_table_entry;
2153d0407baSopenharmony_ci
2163d0407baSopenharmony_ci/* Rectangle definition */
2173d0407baSopenharmony_citypedef struct {
2183d0407baSopenharmony_ci    int x;        /* upper-left x */
2193d0407baSopenharmony_ci    int y;        /* upper-left y */
2203d0407baSopenharmony_ci    int width;    /* width */
2213d0407baSopenharmony_ci    int height;   /* height */
2223d0407baSopenharmony_ci} im_rect;
2233d0407baSopenharmony_ci
2243d0407baSopenharmony_citypedef struct {
2253d0407baSopenharmony_ci    int max;                    /* The Maximum value of the color key */
2263d0407baSopenharmony_ci    int min;                    /* The minimum value of the color key */
2273d0407baSopenharmony_ci} im_colorkey_range;
2283d0407baSopenharmony_ci
2293d0407baSopenharmony_ci
2303d0407baSopenharmony_citypedef struct im_nn {
2313d0407baSopenharmony_ci    int scale_r;                /* scaling factor on R channal */
2323d0407baSopenharmony_ci    int scale_g;                /* scaling factor on G channal */
2333d0407baSopenharmony_ci    int scale_b;                /* scaling factor on B channal */
2343d0407baSopenharmony_ci    int offset_r;               /* offset on R channal */
2353d0407baSopenharmony_ci    int offset_g;               /* offset on G channal */
2363d0407baSopenharmony_ci    int offset_b;               /* offset on B channal */
2373d0407baSopenharmony_ci} im_nn_t;
2383d0407baSopenharmony_ci
2393d0407baSopenharmony_ci/* im_info definition */
2403d0407baSopenharmony_citypedef struct {
2413d0407baSopenharmony_ci    void* vir_addr;                     /* virtual address */
2423d0407baSopenharmony_ci    void* phy_addr;                     /* physical address */
2433d0407baSopenharmony_ci    int fd;                             /* shared fd */
2443d0407baSopenharmony_ci    int width;                          /* width */
2453d0407baSopenharmony_ci    int height;                         /* height */
2463d0407baSopenharmony_ci    int wstride;                        /* wstride */
2473d0407baSopenharmony_ci    int hstride;                        /* hstride */
2483d0407baSopenharmony_ci    int format;                         /* format */
2493d0407baSopenharmony_ci    int color_space_mode;               /* color_space_mode */
2503d0407baSopenharmony_ci    int color;                          /* color, used by color fill */
2513d0407baSopenharmony_ci    int global_alpha;                   /* global_alpha */
2523d0407baSopenharmony_ci    im_colorkey_range colorkey_range;   /* range value of color key */
2533d0407baSopenharmony_ci    im_nn_t nn;
2543d0407baSopenharmony_ci    int rop_code;
2553d0407baSopenharmony_ci} rga_buffer_t;
2563d0407baSopenharmony_ci
2573d0407baSopenharmony_ci/*
2583d0407baSopenharmony_ci * @return error message string
2593d0407baSopenharmony_ci */
2603d0407baSopenharmony_ci#define imStrError(...) \
2613d0407baSopenharmony_ci    ( { \
2623d0407baSopenharmony_ci        const char* err; \
2633d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
2643d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
2653d0407baSopenharmony_ci        if (argc == 0) { \
2663d0407baSopenharmony_ci            err = imStrError_t(IM_STATUS_INVALID_PARAM); \
2673d0407baSopenharmony_ci        } else if (argc == 1) { \
2683d0407baSopenharmony_ci            err = imStrError_t((IM_STATUS)args[0]); \
2693d0407baSopenharmony_ci        } else { \
2703d0407baSopenharmony_ci            err = ("Fatal error, imStrError() too many parameters\n"); \
2713d0407baSopenharmony_ci            printf("Fatal error, imStrError() too many parameters\n"); \
2723d0407baSopenharmony_ci        } \
2733d0407baSopenharmony_ci        err; \
2743d0407baSopenharmony_ci    })
2753d0407baSopenharmony_ciIM_API const char* imStrError_t(IM_STATUS status);
2763d0407baSopenharmony_ci
2773d0407baSopenharmony_ci/*
2783d0407baSopenharmony_ci * @return rga_buffer_t
2793d0407baSopenharmony_ci */
2803d0407baSopenharmony_ci#define wrapbuffer_virtualaddr(vir_addr, width, height, format, ...) \
2813d0407baSopenharmony_ci    ( { \
2823d0407baSopenharmony_ci        rga_buffer_t buffer; \
2833d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
2843d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
2853d0407baSopenharmony_ci        if (argc == 0) { \
2863d0407baSopenharmony_ci            buffer = wrapbuffer_virtualaddr_t(vir_addr, width, height, width, height, format); \
2873d0407baSopenharmony_ci        } else if (argc == 2) { \
2883d0407baSopenharmony_ci            buffer = wrapbuffer_virtualaddr_t(vir_addr, width, height, args[0], args[1], format); \
2893d0407baSopenharmony_ci        } else { \
2903d0407baSopenharmony_ci            printf("invalid parameter\n"); \
2913d0407baSopenharmony_ci        } \
2923d0407baSopenharmony_ci        buffer; \
2933d0407baSopenharmony_ci    })
2943d0407baSopenharmony_ci
2953d0407baSopenharmony_ci#define wrapbuffer_physicaladdr(phy_addr, width, height, format, ...) \
2963d0407baSopenharmony_ci    ( { \
2973d0407baSopenharmony_ci        rga_buffer_t buffer; \
2983d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
2993d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
3003d0407baSopenharmony_ci        if (argc == 0) { \
3013d0407baSopenharmony_ci            buffer = wrapbuffer_physicaladdr_t(phy_addr, width, height, width, height, format); \
3023d0407baSopenharmony_ci        } else if (argc == 2) { \
3033d0407baSopenharmony_ci            buffer = wrapbuffer_physicaladdr_t(phy_addr, width, height, args[0], args[1], format); \
3043d0407baSopenharmony_ci        } else { \
3053d0407baSopenharmony_ci            printf("invalid parameter\n"); \
3063d0407baSopenharmony_ci        } \
3073d0407baSopenharmony_ci        buffer; \
3083d0407baSopenharmony_ci    })
3093d0407baSopenharmony_ci
3103d0407baSopenharmony_ci#define wrapbuffer_fd(fd, width, height, format, ...) \
3113d0407baSopenharmony_ci    ( { \
3123d0407baSopenharmony_ci        rga_buffer_t buffer; \
3133d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
3143d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
3153d0407baSopenharmony_ci        if (argc == 0) { \
3163d0407baSopenharmony_ci            buffer = wrapbuffer_fd_t(fd, width, height, width, height, format); \
3173d0407baSopenharmony_ci        } else if (argc == 2) { \
3183d0407baSopenharmony_ci            buffer = wrapbuffer_fd_t(fd, width, height, args[0], args[1], format); \
3193d0407baSopenharmony_ci        } else { \
3203d0407baSopenharmony_ci            printf("invalid parameter\n"); \
3213d0407baSopenharmony_ci        } \
3223d0407baSopenharmony_ci        buffer; \
3233d0407baSopenharmony_ci    })
3243d0407baSopenharmony_ci
3253d0407baSopenharmony_ciIM_API rga_buffer_t wrapbuffer_virtualaddr_t(
3263d0407baSopenharmony_ci    void* vir_addr,
3273d0407baSopenharmony_ci    int width,
3283d0407baSopenharmony_ci    int height,
3293d0407baSopenharmony_ci    int wstride,
3303d0407baSopenharmony_ci    int hstride,
3313d0407baSopenharmony_ci    int format);
3323d0407baSopenharmony_ciIM_API rga_buffer_t wrapbuffer_physicaladdr_t(void* phy_addr,
3333d0407baSopenharmony_ci    int width,
3343d0407baSopenharmony_ci    int height,
3353d0407baSopenharmony_ci    int wstride,
3363d0407baSopenharmony_ci    int hstride,
3373d0407baSopenharmony_ci    int format);
3383d0407baSopenharmony_ciIM_API rga_buffer_t wrapbuffer_fd_t(int fd, int width, int height, int wstride, int hstride, int format);
3393d0407baSopenharmony_ci
3403d0407baSopenharmony_ci/*
3413d0407baSopenharmony_ci * Get RGA basic information, supported resolution, supported format, etc.
3423d0407baSopenharmony_ci *
3433d0407baSopenharmony_ci * @param name
3443d0407baSopenharmony_ci *      RGA_VENDOR
3453d0407baSopenharmony_ci *      RGA_VERSION
3463d0407baSopenharmony_ci *      RGA_MAX_INPUT
3473d0407baSopenharmony_ci *      RGA_MAX_OUTPUT
3483d0407baSopenharmony_ci *      RGA_INPUT_FORMAT
3493d0407baSopenharmony_ci *      RGA_OUTPUT_FORMAT
3503d0407baSopenharmony_ci *      RGA_EXPECTED
3513d0407baSopenharmony_ci *      RGA_ALL
3523d0407baSopenharmony_ci *
3533d0407baSopenharmony_ci * @returns a usage describing properties of RGA.
3543d0407baSopenharmony_ci */
3553d0407baSopenharmony_ciIM_API IM_STATUS rga_get_info(rga_info_table_entry *return_table);
3563d0407baSopenharmony_ci
3573d0407baSopenharmony_ci/*
3583d0407baSopenharmony_ci * Query RGA basic information, supported resolution, supported format, etc.
3593d0407baSopenharmony_ci *
3603d0407baSopenharmony_ci * @param name
3613d0407baSopenharmony_ci *      RGA_VENDOR
3623d0407baSopenharmony_ci *      RGA_VERSION
3633d0407baSopenharmony_ci *      RGA_MAX_INPUT
3643d0407baSopenharmony_ci *      RGA_MAX_OUTPUT
3653d0407baSopenharmony_ci *      RGA_INPUT_FORMAT
3663d0407baSopenharmony_ci *      RGA_OUTPUT_FORMAT
3673d0407baSopenharmony_ci *      RGA_EXPECTED
3683d0407baSopenharmony_ci *      RGA_ALL
3693d0407baSopenharmony_ci *
3703d0407baSopenharmony_ci * @returns a string describing properties of RGA.
3713d0407baSopenharmony_ci */
3723d0407baSopenharmony_ciIM_API const char* querystring(int name);
3733d0407baSopenharmony_ci
3743d0407baSopenharmony_ci/*
3753d0407baSopenharmony_ci * check RGA basic information, supported resolution, supported format, etc.
3763d0407baSopenharmony_ci *
3773d0407baSopenharmony_ci * @param src
3783d0407baSopenharmony_ci * @param dst
3793d0407baSopenharmony_ci * @param src_rect
3803d0407baSopenharmony_ci * @param dst_rect
3813d0407baSopenharmony_ci * @param mode_usage
3823d0407baSopenharmony_ci *
3833d0407baSopenharmony_ci * @returns no error or else negative error code.
3843d0407baSopenharmony_ci */
3853d0407baSopenharmony_ci#define imcheck(src, dst, src_rect, dst_rect, ...) \
3863d0407baSopenharmony_ci    ( { \
3873d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_NOERROR; \
3883d0407baSopenharmony_ci        rga_buffer_t pat; \
3893d0407baSopenharmony_ci        im_rect pat_rect; \
3903d0407baSopenharmony_ci        errno_t eok = memset_s(&pat, sizeof(rga_buffer_t), 0, sizeof(rga_buffer_t)); \
3913d0407baSopenharmony_ci        if (!eok) { \
3923d0407baSopenharmony_ci            printf("memset_s failed!\n"); \
3933d0407baSopenharmony_ci        } \
3943d0407baSopenharmony_ci        eok = memset_s(&pat_rect, sizeof(im_rect), 0, sizeof(im_rect)); \
3953d0407baSopenharmony_ci        if (!eok) { \
3963d0407baSopenharmony_ci            printf("memset_s failed!\n"); \
3973d0407baSopenharmony_ci        } \
3983d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
3993d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
4003d0407baSopenharmony_ci        if (argc == 0) { \
4013d0407baSopenharmony_ci            ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, 0); \
4023d0407baSopenharmony_ci        } else if (argc == 1) { \
4033d0407baSopenharmony_ci            ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, args[0]); \
4043d0407baSopenharmony_ci        } else { \
4053d0407baSopenharmony_ci            ret = IM_STATUS_FAILED; \
4063d0407baSopenharmony_ci            printf("check failed\n"); \
4073d0407baSopenharmony_ci        } \
4083d0407baSopenharmony_ci        ret; \
4093d0407baSopenharmony_ci    })
4103d0407baSopenharmony_ci#define imcheck_composite(src, dst, pat, src_rect, dst_rect, pat_rect, ...) \
4113d0407baSopenharmony_ci    ( { \
4123d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_NOERROR; \
4133d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
4143d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
4153d0407baSopenharmony_ci        if (argc == 0) { \
4163d0407baSopenharmony_ci            ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, 0); \
4173d0407baSopenharmony_ci        } else if (argc == 1) { \
4183d0407baSopenharmony_ci            ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, args[0]); \
4193d0407baSopenharmony_ci        } else { \
4203d0407baSopenharmony_ci            ret = IM_STATUS_FAILED; \
4213d0407baSopenharmony_ci            printf("check failed\n"); \
4223d0407baSopenharmony_ci        } \
4233d0407baSopenharmony_ci        ret; \
4243d0407baSopenharmony_ci    })
4253d0407baSopenharmony_ciIM_API IM_STATUS imcheck_t(const rga_buffer_t src, const rga_buffer_t dst, const rga_buffer_t pat,
4263d0407baSopenharmony_ci                           const im_rect src_rect, const im_rect dst_rect, const im_rect pat_rect,
4273d0407baSopenharmony_ci                           const int mdoe_usage);
4283d0407baSopenharmony_ci
4293d0407baSopenharmony_ci/*
4303d0407baSopenharmony_ci * Resize
4313d0407baSopenharmony_ci *
4323d0407baSopenharmony_ci * @param src
4333d0407baSopenharmony_ci * @param dst
4343d0407baSopenharmony_ci * @param fx
4353d0407baSopenharmony_ci * @param fy
4363d0407baSopenharmony_ci * @param interpolation
4373d0407baSopenharmony_ci * @param sync
4383d0407baSopenharmony_ci *      wait until operation complete
4393d0407baSopenharmony_ci *
4403d0407baSopenharmony_ci * @returns success or else negative error code.
4413d0407baSopenharmony_ci */
4423d0407baSopenharmony_ci#define imresize(src, dst, ...) \
4433d0407baSopenharmony_ci    ( { \
4443d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
4453d0407baSopenharmony_ci        double args[] = {__VA_ARGS__}; \
4463d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(double); \
4473d0407baSopenharmony_ci        if (argc == 0) { \
4483d0407baSopenharmony_ci            ret = imresize_t(src, dst, 0, 0, INTER_LINEAR, 1); \
4493d0407baSopenharmony_ci        } else if (argc == 2) { \
4503d0407baSopenharmony_ci            ret = imresize_t(src, dst, args[0], args[1], INTER_LINEAR, 1); \
4513d0407baSopenharmony_ci        } else if (argc == 3) { \
4523d0407baSopenharmony_ci            ret = imresize_t(src, dst, args[0], args[1], (int)args[2], 1); \
4533d0407baSopenharmony_ci        } else if (argc == 4) { \
4543d0407baSopenharmony_ci            ret = imresize_t(src, dst, args[0], args[1], (int)args[2], (int)args[3]); \
4553d0407baSopenharmony_ci        } else { \
4563d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
4573d0407baSopenharmony_ci            printf("invalid parameter\n"); \
4583d0407baSopenharmony_ci        } \
4593d0407baSopenharmony_ci        ret; \
4603d0407baSopenharmony_ci    })
4613d0407baSopenharmony_ci
4623d0407baSopenharmony_ci#define impyramid(src, dst, direction) \
4633d0407baSopenharmony_ci        imresize_t(src, \
4643d0407baSopenharmony_ci                   dst, \
4653d0407baSopenharmony_ci                   (direction) == IM_UP_SCALE ? 0.5 : 2, \
4663d0407baSopenharmony_ci                   (direction) == IM_UP_SCALE ? 0.5 : 2, \
4673d0407baSopenharmony_ci                   INTER_LINEAR, 1)
4683d0407baSopenharmony_ci
4693d0407baSopenharmony_ciIM_API IM_STATUS imresize_t(const rga_buffer_t src, rga_buffer_t dst, double fx,
4703d0407baSopenharmony_ci                            double fy, int interpolation, int sync);
4713d0407baSopenharmony_ci
4723d0407baSopenharmony_ci/*
4733d0407baSopenharmony_ci * Crop
4743d0407baSopenharmony_ci *
4753d0407baSopenharmony_ci * @param src
4763d0407baSopenharmony_ci * @param dst
4773d0407baSopenharmony_ci * @param rect
4783d0407baSopenharmony_ci * @param sync
4793d0407baSopenharmony_ci *      wait until operation complete
4803d0407baSopenharmony_ci *
4813d0407baSopenharmony_ci * @returns success or else negative error code.
4823d0407baSopenharmony_ci */
4833d0407baSopenharmony_ci#define imcrop(src, dst, rect, ...) \
4843d0407baSopenharmony_ci    ( { \
4853d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
4863d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
4873d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
4883d0407baSopenharmony_ci        if (argc == 0) { \
4893d0407baSopenharmony_ci            ret = imcrop_t(src, dst, rect, 1); \
4903d0407baSopenharmony_ci        } else if (argc == 1) { \
4913d0407baSopenharmony_ci            ret = imcrop_t(src, dst, rect, args[0]);; \
4923d0407baSopenharmony_ci        } else { \
4933d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
4943d0407baSopenharmony_ci            printf("invalid parameter\n"); \
4953d0407baSopenharmony_ci        } \
4963d0407baSopenharmony_ci        ret; \
4973d0407baSopenharmony_ci    })
4983d0407baSopenharmony_ci
4993d0407baSopenharmony_ciIM_API IM_STATUS imcrop_t(const rga_buffer_t src, rga_buffer_t dst, im_rect rect, int sync);
5003d0407baSopenharmony_ci
5013d0407baSopenharmony_ci/*
5023d0407baSopenharmony_ci * rotation
5033d0407baSopenharmony_ci *
5043d0407baSopenharmony_ci * @param src
5053d0407baSopenharmony_ci * @param dst
5063d0407baSopenharmony_ci * @param rotation
5073d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_ROT_90
5083d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_ROT_180
5093d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_ROT_270
5103d0407baSopenharmony_ci * @param sync
5113d0407baSopenharmony_ci *      wait until operation complete
5123d0407baSopenharmony_ci *
5133d0407baSopenharmony_ci * @returns success or else negative error code.
5143d0407baSopenharmony_ci */
5153d0407baSopenharmony_ci#define imrotate(src, dst, rotation, ...) \
5163d0407baSopenharmony_ci    ( { \
5173d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
5183d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
5193d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
5203d0407baSopenharmony_ci        if (argc == 0) { \
5213d0407baSopenharmony_ci            ret = imrotate_t(src, dst, rotation, 1); \
5223d0407baSopenharmony_ci        } else if (argc == 1) { \
5233d0407baSopenharmony_ci            ret = imrotate_t(src, dst, rotation, args[0]);; \
5243d0407baSopenharmony_ci        } else { \
5253d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
5263d0407baSopenharmony_ci            printf("invalid parameter\n"); \
5273d0407baSopenharmony_ci        } \
5283d0407baSopenharmony_ci        ret; \
5293d0407baSopenharmony_ci    })
5303d0407baSopenharmony_ci
5313d0407baSopenharmony_ciIM_API IM_STATUS imrotate_t(const rga_buffer_t src, rga_buffer_t dst, int rotation, int sync);
5323d0407baSopenharmony_ci
5333d0407baSopenharmony_ci/*
5343d0407baSopenharmony_ci * flip
5353d0407baSopenharmony_ci *
5363d0407baSopenharmony_ci * @param src
5373d0407baSopenharmony_ci * @param dst
5383d0407baSopenharmony_ci * @param mode
5393d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_FLIP_H
5403d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_FLIP_V
5413d0407baSopenharmony_ci * @param sync
5423d0407baSopenharmony_ci *      wait until operation complete
5433d0407baSopenharmony_ci *
5443d0407baSopenharmony_ci * @returns success or else negative error code.
5453d0407baSopenharmony_ci */
5463d0407baSopenharmony_ci#define imflip(src, dst, mode, ...) \
5473d0407baSopenharmony_ci    ( { \
5483d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
5493d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
5503d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
5513d0407baSopenharmony_ci        if (argc == 0) { \
5523d0407baSopenharmony_ci            ret = imflip_t(src, dst, mode, 1); \
5533d0407baSopenharmony_ci        } else if (argc == 1) { \
5543d0407baSopenharmony_ci            ret = imflip_t(src, dst, mode, args[0]);; \
5553d0407baSopenharmony_ci        } else { \
5563d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
5573d0407baSopenharmony_ci            printf("invalid parameter\n"); \
5583d0407baSopenharmony_ci        } \
5593d0407baSopenharmony_ci        ret; \
5603d0407baSopenharmony_ci    })
5613d0407baSopenharmony_ci
5623d0407baSopenharmony_ciIM_API IM_STATUS imflip_t (const rga_buffer_t src, rga_buffer_t dst, int mode, int sync);
5633d0407baSopenharmony_ci
5643d0407baSopenharmony_ci/*
5653d0407baSopenharmony_ci * fill/reset/draw
5663d0407baSopenharmony_ci *
5673d0407baSopenharmony_ci * @param src
5683d0407baSopenharmony_ci * @param dst
5693d0407baSopenharmony_ci * @param rect
5703d0407baSopenharmony_ci * @param color
5713d0407baSopenharmony_ci * @param sync
5723d0407baSopenharmony_ci *      wait until operation complete
5733d0407baSopenharmony_ci *
5743d0407baSopenharmony_ci * @returns success or else negative error code.
5753d0407baSopenharmony_ci */
5763d0407baSopenharmony_ci#define imfill(buf, rect, color, ...) \
5773d0407baSopenharmony_ci    ( { \
5783d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
5793d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
5803d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
5813d0407baSopenharmony_ci        if (argc == 0) { \
5823d0407baSopenharmony_ci            ret = imfill_t(buf, rect, color, 1); \
5833d0407baSopenharmony_ci        } else if (argc == 1) { \
5843d0407baSopenharmony_ci            ret = imfill_t(buf, rect, color, args[0]);; \
5853d0407baSopenharmony_ci        } else { \
5863d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
5873d0407baSopenharmony_ci            printf("invalid parameter\n"); \
5883d0407baSopenharmony_ci        } \
5893d0407baSopenharmony_ci        ret; \
5903d0407baSopenharmony_ci    })
5913d0407baSopenharmony_ci
5923d0407baSopenharmony_ci#define imreset(buf, rect, color, ...) \
5933d0407baSopenharmony_ci    ( { \
5943d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
5953d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
5963d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
5973d0407baSopenharmony_ci        if (argc == 0) { \
5983d0407baSopenharmony_ci            ret = imfill_t(buf, rect, color, 1); \
5993d0407baSopenharmony_ci        } else if (argc == 1) { \
6003d0407baSopenharmony_ci            ret = imfill_t(buf, rect, color, args[0]);; \
6013d0407baSopenharmony_ci        } else { \
6023d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
6033d0407baSopenharmony_ci            printf("invalid parameter\n"); \
6043d0407baSopenharmony_ci        } \
6053d0407baSopenharmony_ci        ret; \
6063d0407baSopenharmony_ci    })
6073d0407baSopenharmony_ci
6083d0407baSopenharmony_ci#define imdraw(buf, rect, color, ...) \
6093d0407baSopenharmony_ci    ( { \
6103d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
6113d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
6123d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
6133d0407baSopenharmony_ci        if (argc == 0) { \
6143d0407baSopenharmony_ci            ret = imfill_t(buf, rect, color, 1); \
6153d0407baSopenharmony_ci        } else if (argc == 1) { \
6163d0407baSopenharmony_ci            ret = imfill_t(buf, rect, color, args[0]);; \
6173d0407baSopenharmony_ci        } else { \
6183d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
6193d0407baSopenharmony_ci            printf("invalid parameter\n"); \
6203d0407baSopenharmony_ci        } \
6213d0407baSopenharmony_ci        ret; \
6223d0407baSopenharmony_ci    })
6233d0407baSopenharmony_ciIM_API IM_STATUS imfill_t(rga_buffer_t dst, im_rect rect, int color, int sync);
6243d0407baSopenharmony_ci
6253d0407baSopenharmony_ci/*
6263d0407baSopenharmony_ci * palette
6273d0407baSopenharmony_ci *
6283d0407baSopenharmony_ci * @param src
6293d0407baSopenharmony_ci * @param dst
6303d0407baSopenharmony_ci * @param lut
6313d0407baSopenharmony_ci * @param sync
6323d0407baSopenharmony_ci *      wait until operation complete
6333d0407baSopenharmony_ci *
6343d0407baSopenharmony_ci * @returns success or else negative error code.
6353d0407baSopenharmony_ci */
6363d0407baSopenharmony_ci#define impalette(src, dst, lut,  ...) \
6373d0407baSopenharmony_ci    ( { \
6383d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
6393d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
6403d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
6413d0407baSopenharmony_ci        if (argc == 0) { \
6423d0407baSopenharmony_ci            ret = impalette_t(src, dst, lut, 1); \
6433d0407baSopenharmony_ci        } else if (argc == 1) { \
6443d0407baSopenharmony_ci            ret = impalette_t(src, dst, lut, args[0]);; \
6453d0407baSopenharmony_ci        } else { \
6463d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
6473d0407baSopenharmony_ci            printf("invalid parameter\n"); \
6483d0407baSopenharmony_ci        } \
6493d0407baSopenharmony_ci        ret; \
6503d0407baSopenharmony_ci    })
6513d0407baSopenharmony_ciIM_API IM_STATUS impalette_t(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t lut, int sync);
6523d0407baSopenharmony_ci
6533d0407baSopenharmony_ci/*
6543d0407baSopenharmony_ci * translate
6553d0407baSopenharmony_ci *
6563d0407baSopenharmony_ci * @param src
6573d0407baSopenharmony_ci * @param dst
6583d0407baSopenharmony_ci * @param x
6593d0407baSopenharmony_ci * @param y
6603d0407baSopenharmony_ci * @param sync
6613d0407baSopenharmony_ci *      wait until operation complete
6623d0407baSopenharmony_ci *
6633d0407baSopenharmony_ci * @returns success or else negative error code.
6643d0407baSopenharmony_ci */
6653d0407baSopenharmony_ci#define imtranslate(src, dst, x, y, ...) \
6663d0407baSopenharmony_ci    ( { \
6673d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
6683d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
6693d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
6703d0407baSopenharmony_ci        if (argc == 0) { \
6713d0407baSopenharmony_ci            ret = imtranslate_t(src, dst, x, y, 1); \
6723d0407baSopenharmony_ci        } else if (argc == 1) { \
6733d0407baSopenharmony_ci            ret = imtranslate_t(src, dst, x, y, args[0]);; \
6743d0407baSopenharmony_ci        } else { \
6753d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
6763d0407baSopenharmony_ci            printf("invalid parameter\n"); \
6773d0407baSopenharmony_ci        } \
6783d0407baSopenharmony_ci        ret; \
6793d0407baSopenharmony_ci    })
6803d0407baSopenharmony_ciIM_API IM_STATUS imtranslate_t(const rga_buffer_t src, rga_buffer_t dst, int x, int y, int sync);
6813d0407baSopenharmony_ci
6823d0407baSopenharmony_ci/*
6833d0407baSopenharmony_ci * copy
6843d0407baSopenharmony_ci *
6853d0407baSopenharmony_ci * @param src
6863d0407baSopenharmony_ci * @param dst
6873d0407baSopenharmony_ci * @param sync
6883d0407baSopenharmony_ci *      wait until operation complete
6893d0407baSopenharmony_ci *
6903d0407baSopenharmony_ci * @returns success or else negative error code.
6913d0407baSopenharmony_ci */
6923d0407baSopenharmony_ci#define imcopy(src, dst, ...) \
6933d0407baSopenharmony_ci    ( { \
6943d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
6953d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
6963d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
6973d0407baSopenharmony_ci        if (argc == 0) { \
6983d0407baSopenharmony_ci            ret = imcopy_t(src, dst, 1); \
6993d0407baSopenharmony_ci        } else if (argc == 1) { \
7003d0407baSopenharmony_ci            ret = imcopy_t(src, dst, args[0]);; \
7013d0407baSopenharmony_ci        } else { \
7023d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
7033d0407baSopenharmony_ci            printf("invalid parameter\n"); \
7043d0407baSopenharmony_ci        } \
7053d0407baSopenharmony_ci        ret; \
7063d0407baSopenharmony_ci    })
7073d0407baSopenharmony_ci
7083d0407baSopenharmony_ciIM_API IM_STATUS imcopy_t(const rga_buffer_t src, rga_buffer_t dst, int sync);
7093d0407baSopenharmony_ci
7103d0407baSopenharmony_ci/*
7113d0407baSopenharmony_ci * blend (SRC + DST -> DST or SRCA + SRCB -> DST)
7123d0407baSopenharmony_ci *
7133d0407baSopenharmony_ci * @param srcA
7143d0407baSopenharmony_ci * @param srcB can be NULL.
7153d0407baSopenharmony_ci * @param dst
7163d0407baSopenharmony_ci * @param mode
7173d0407baSopenharmony_ci *      IM_ALPHA_BLEND_MODE
7183d0407baSopenharmony_ci * @param sync
7193d0407baSopenharmony_ci *      wait until operation complete
7203d0407baSopenharmony_ci *
7213d0407baSopenharmony_ci * @returns success or else negative error code.
7223d0407baSopenharmony_ci */
7233d0407baSopenharmony_ci#define imblend(srcA, dst, ...) \
7243d0407baSopenharmony_ci    ( { \
7253d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
7263d0407baSopenharmony_ci        rga_buffer_t srcB; \
7273d0407baSopenharmony_ci        errno_t eok = memset_s(&srcB, sizeof(rga_buffer_t), 0x00, sizeof(rga_buffer_t)); \
7283d0407baSopenharmony_ci        if (!eok) { \
7293d0407baSopenharmony_ci            printf("memset_s failed!\n"); \
7303d0407baSopenharmony_ci        } \
7313d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
7323d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
7333d0407baSopenharmony_ci        if (argc == 0) { \
7343d0407baSopenharmony_ci            ret = imblend_t(srcA, srcB, dst, IM_ALPHA_BLEND_SRC_OVER, 1); \
7353d0407baSopenharmony_ci        } else if (argc == 1) { \
7363d0407baSopenharmony_ci            ret = imblend_t(srcA, srcB, dst, args[0], 1); \
7373d0407baSopenharmony_ci        } else if (argc == 2) { \
7383d0407baSopenharmony_ci            ret = imblend_t(srcA, srcB, dst, args[0], args[1]); \
7393d0407baSopenharmony_ci        } else { \
7403d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
7413d0407baSopenharmony_ci            printf("invalid parameter\n"); \
7423d0407baSopenharmony_ci        } \
7433d0407baSopenharmony_ci        ret; \
7443d0407baSopenharmony_ci    })
7453d0407baSopenharmony_ci#define imcomposite(srcA, srcB, dst, ...) \
7463d0407baSopenharmony_ci    ( { \
7473d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
7483d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
7493d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
7503d0407baSopenharmony_ci        if (argc == 0) { \
7513d0407baSopenharmony_ci            ret = imblend_t(srcA, srcB, dst, IM_ALPHA_BLEND_SRC_OVER, 1); \
7523d0407baSopenharmony_ci        } else if (argc == 1) { \
7533d0407baSopenharmony_ci            ret = imblend_t(srcA, srcB, dst, args[0], 1); \
7543d0407baSopenharmony_ci        } else if (argc == 2) { \
7553d0407baSopenharmony_ci            ret = imblend_t(srcA, srcB, dst, args[0], args[1]); \
7563d0407baSopenharmony_ci        } else { \
7573d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
7583d0407baSopenharmony_ci            printf("invalid parameter\n"); \
7593d0407baSopenharmony_ci        } \
7603d0407baSopenharmony_ci        ret; \
7613d0407baSopenharmony_ci    })
7623d0407baSopenharmony_ciIM_API IM_STATUS imblend_t(const rga_buffer_t srcA, const rga_buffer_t srcB, rga_buffer_t dst, int mode, int sync);
7633d0407baSopenharmony_ci
7643d0407baSopenharmony_ci/*
7653d0407baSopenharmony_ci * color key
7663d0407baSopenharmony_ci *
7673d0407baSopenharmony_ci * @param src
7683d0407baSopenharmony_ci * @param dst
7693d0407baSopenharmony_ci * @param colorkey_range
7703d0407baSopenharmony_ci *      max color
7713d0407baSopenharmony_ci *      min color
7723d0407baSopenharmony_ci * @param sync
7733d0407baSopenharmony_ci *      wait until operation complete
7743d0407baSopenharmony_ci *
7753d0407baSopenharmony_ci * @returns success or else negative error code.
7763d0407baSopenharmony_ci */
7773d0407baSopenharmony_ci#define imcolorkey(src, dst, range, ...) \
7783d0407baSopenharmony_ci    ( { \
7793d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
7803d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
7813d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
7823d0407baSopenharmony_ci        if (argc == 0) { \
7833d0407baSopenharmony_ci            ret = imcolorkey_t(src, dst, range, IM_ALPHA_COLORKEY_NORMAL, 1); \
7843d0407baSopenharmony_ci        } else if (argc == 1) { \
7853d0407baSopenharmony_ci            ret = imcolorkey_t(src, dst, range, args[0], 1); \
7863d0407baSopenharmony_ci        } else if (argc == 2) { \
7873d0407baSopenharmony_ci            ret = imcolorkey_t(src, dst, range, args[0], args[1]); \
7883d0407baSopenharmony_ci        } else { \
7893d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
7903d0407baSopenharmony_ci            printf("invalid parameter\n"); \
7913d0407baSopenharmony_ci        } \
7923d0407baSopenharmony_ci        ret; \
7933d0407baSopenharmony_ci    })
7943d0407baSopenharmony_ciIM_API IM_STATUS imcolorkey_t(const rga_buffer_t src, rga_buffer_t dst, im_colorkey_range range, int mode, int sync);
7953d0407baSopenharmony_ci
7963d0407baSopenharmony_ci/*
7973d0407baSopenharmony_ci * format convert
7983d0407baSopenharmony_ci *
7993d0407baSopenharmony_ci * @param src
8003d0407baSopenharmony_ci * @param dst
8013d0407baSopenharmony_ci * @param sfmt
8023d0407baSopenharmony_ci * @param dfmt
8033d0407baSopenharmony_ci * @param mode
8043d0407baSopenharmony_ci *      color space mode: IM_COLOR_SPACE_MODE
8053d0407baSopenharmony_ci * @param sync
8063d0407baSopenharmony_ci *      wait until operation complete
8073d0407baSopenharmony_ci *
8083d0407baSopenharmony_ci * @returns success or else negative error code.
8093d0407baSopenharmony_ci */
8103d0407baSopenharmony_ci#define imcvtcolor(src, dst, sfmt, dfmt, ...) \
8113d0407baSopenharmony_ci    ( { \
8123d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
8133d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
8143d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
8153d0407baSopenharmony_ci        if (argc == 0) { \
8163d0407baSopenharmony_ci            ret = imcvtcolor_t(src, dst, sfmt, dfmt, IM_COLOR_SPACE_DEFAULT, 1); \
8173d0407baSopenharmony_ci        } else if (argc == 1) { \
8183d0407baSopenharmony_ci            ret = imcvtcolor_t(src, dst, sfmt, dfmt, args[0], 1); \
8193d0407baSopenharmony_ci        } else if (argc == 2) { \
8203d0407baSopenharmony_ci            ret = imcvtcolor_t(src, dst, sfmt, dfmt, args[0], args[1]); \
8213d0407baSopenharmony_ci        } else { \
8223d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
8233d0407baSopenharmony_ci            printf("invalid parameter\n"); \
8243d0407baSopenharmony_ci        } \
8253d0407baSopenharmony_ci        ret; \
8263d0407baSopenharmony_ci    })
8273d0407baSopenharmony_ci
8283d0407baSopenharmony_ciIM_API IM_STATUS imcvtcolor_t(rga_buffer_t src, rga_buffer_t dst, int sfmt, int dfmt, int mode, int sync);
8293d0407baSopenharmony_ci
8303d0407baSopenharmony_ci/*
8313d0407baSopenharmony_ci * nn quantize
8323d0407baSopenharmony_ci *
8333d0407baSopenharmony_ci * @param src
8343d0407baSopenharmony_ci * @param dst
8353d0407baSopenharmony_ci * @param nninfo
8363d0407baSopenharmony_ci * @param sync
8373d0407baSopenharmony_ci *      wait until operation complete
8383d0407baSopenharmony_ci *
8393d0407baSopenharmony_ci * @returns success or else negative error code.
8403d0407baSopenharmony_ci */
8413d0407baSopenharmony_ci#define imquantize(src, dst, nn_info, ...) \
8423d0407baSopenharmony_ci    ( { \
8433d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
8443d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
8453d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
8463d0407baSopenharmony_ci        if (argc == 0) { \
8473d0407baSopenharmony_ci            ret = imquantize_t(src, dst, nn_info, 1); \
8483d0407baSopenharmony_ci        } else if (argc == 1) { \
8493d0407baSopenharmony_ci            ret = imquantize_t(src, dst, nn_info, args[0]);; \
8503d0407baSopenharmony_ci        } else { \
8513d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
8523d0407baSopenharmony_ci            printf("invalid parameter\n"); \
8533d0407baSopenharmony_ci        } \
8543d0407baSopenharmony_ci        ret; \
8553d0407baSopenharmony_ci    })
8563d0407baSopenharmony_ci
8573d0407baSopenharmony_ciIM_API IM_STATUS imquantize_t(const rga_buffer_t src, rga_buffer_t dst, im_nn_t nn_info, int sync);
8583d0407baSopenharmony_ci
8593d0407baSopenharmony_ci/*
8603d0407baSopenharmony_ci * ROP
8613d0407baSopenharmony_ci *
8623d0407baSopenharmony_ci * @param src
8633d0407baSopenharmony_ci * @param dst
8643d0407baSopenharmony_ci * @param rop_code
8653d0407baSopenharmony_ci * @param sync
8663d0407baSopenharmony_ci *      wait until operation complete
8673d0407baSopenharmony_ci *
8683d0407baSopenharmony_ci * @returns success or else negative error code.
8693d0407baSopenharmony_ci */
8703d0407baSopenharmony_ci#define imrop(src, dst, rop_code, ...) \
8713d0407baSopenharmony_ci    ( { \
8723d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS; \
8733d0407baSopenharmony_ci        int args[] = {__VA_ARGS__}; \
8743d0407baSopenharmony_ci        int argc = sizeof(args)/sizeof(int); \
8753d0407baSopenharmony_ci        if (argc == 0) { \
8763d0407baSopenharmony_ci            ret = imrop_t(src, dst, rop_code, 1); \
8773d0407baSopenharmony_ci        } else if (argc == 1) { \
8783d0407baSopenharmony_ci            ret = imrop_t(src, dst, rop_code, args[0]);; \
8793d0407baSopenharmony_ci        } else { \
8803d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM; \
8813d0407baSopenharmony_ci            printf("invalid parameter\n"); \
8823d0407baSopenharmony_ci        } \
8833d0407baSopenharmony_ci        ret; \
8843d0407baSopenharmony_ci    })
8853d0407baSopenharmony_ciIM_API IM_STATUS imrop_t(const rga_buffer_t src, rga_buffer_t dst, int rop_code, int sync);
8863d0407baSopenharmony_ci
8873d0407baSopenharmony_ci/*
8883d0407baSopenharmony_ci * process
8893d0407baSopenharmony_ci *
8903d0407baSopenharmony_ci * @param src
8913d0407baSopenharmony_ci * @param dst
8923d0407baSopenharmony_ci * @param usage
8933d0407baSopenharmony_ci * @param ...
8943d0407baSopenharmony_ci *      wait until operation complete
8953d0407baSopenharmony_ci *
8963d0407baSopenharmony_ci * @returns success or else negative error code.
8973d0407baSopenharmony_ci */
8983d0407baSopenharmony_ciIM_API IM_STATUS improcess(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
8993d0407baSopenharmony_ci                           im_rect srect, im_rect drect, im_rect prect, int usage);
9003d0407baSopenharmony_ci
9013d0407baSopenharmony_ci/*
9023d0407baSopenharmony_ci * block until all execution is complete
9033d0407baSopenharmony_ci *
9043d0407baSopenharmony_ci * @returns success or else negative error code.
9053d0407baSopenharmony_ci */
9063d0407baSopenharmony_ciIM_API IM_STATUS imsync(void);
9073d0407baSopenharmony_ci
9083d0407baSopenharmony_ci#ifdef __cplusplus
9093d0407baSopenharmony_ci}
9103d0407baSopenharmony_ci#endif
9113d0407baSopenharmony_ci#endif /* _im2d_h_ */
912