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_citypedef struct im_nn {
2303d0407baSopenharmony_ci    int scale_r;  /* scaling factor on R channal */
2313d0407baSopenharmony_ci    int scale_g;  /* scaling factor on G channal */
2323d0407baSopenharmony_ci    int scale_b;  /* scaling factor on B channal */
2333d0407baSopenharmony_ci    int offset_r; /* offset on R channal */
2343d0407baSopenharmony_ci    int offset_g; /* offset on G channal */
2353d0407baSopenharmony_ci    int offset_b; /* offset on B channal */
2363d0407baSopenharmony_ci} im_nn_t;
2373d0407baSopenharmony_ci
2383d0407baSopenharmony_ci/* im_info definition */
2393d0407baSopenharmony_citypedef struct {
2403d0407baSopenharmony_ci    void *vir_addr;                   /* virtual address */
2413d0407baSopenharmony_ci    void *phy_addr;                   /* physical address */
2423d0407baSopenharmony_ci    int fd;                           /* shared fd */
2433d0407baSopenharmony_ci    int width;                        /* width */
2443d0407baSopenharmony_ci    int height;                       /* height */
2453d0407baSopenharmony_ci    int wstride;                      /* wstride */
2463d0407baSopenharmony_ci    int hstride;                      /* hstride */
2473d0407baSopenharmony_ci    int format;                       /* format */
2483d0407baSopenharmony_ci    int color_space_mode;             /* color_space_mode */
2493d0407baSopenharmony_ci    int color;                        /* color, used by color fill */
2503d0407baSopenharmony_ci    int global_alpha;                 /* global_alpha */
2513d0407baSopenharmony_ci    im_colorkey_range colorkey_range; /* range value of color key */
2523d0407baSopenharmony_ci    im_nn_t nn;
2533d0407baSopenharmony_ci    int rop_code;
2543d0407baSopenharmony_ci} rga_buffer_t;
2553d0407baSopenharmony_ci
2563d0407baSopenharmony_ci/*
2573d0407baSopenharmony_ci * @return error message string
2583d0407baSopenharmony_ci */
2593d0407baSopenharmony_ci#define imStrError(...)                                                                                                \
2603d0407baSopenharmony_ci    ( {                                                                                                                \
2613d0407baSopenharmony_ci        const char *err;                                                                                               \
2623d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
2633d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
2643d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
2653d0407baSopenharmony_ci            err = imStrError_t(IM_STATUS_INVALID_PARAM);                                                               \
2663d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
2673d0407baSopenharmony_ci            err = imStrError_t((IM_STATUS)args[0]);                                                                    \
2683d0407baSopenharmony_ci        } else {                                                                                                       \
2693d0407baSopenharmony_ci            err = ("Fatal error, imStrError() too many parameters\n");                                                 \
2703d0407baSopenharmony_ci            printf("Fatal error, imStrError() too many parameters\n");                                                 \
2713d0407baSopenharmony_ci        }                                                                                                              \
2723d0407baSopenharmony_ci        err;                                                                                                           \
2733d0407baSopenharmony_ci    })
2743d0407baSopenharmony_ciIM_API const char *imStrError_t(IM_STATUS status);
2753d0407baSopenharmony_ci
2763d0407baSopenharmony_ci/*
2773d0407baSopenharmony_ci * @return rga_buffer_t
2783d0407baSopenharmony_ci */
2793d0407baSopenharmony_ci#define wrapbuffer_virtualaddr(vir_addr, width, height, format, ...)                                                   \
2803d0407baSopenharmony_ci    ( {                                                                                                                \
2813d0407baSopenharmony_ci        rga_buffer_t buffer;                                                                                           \
2823d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
2833d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
2843d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
2853d0407baSopenharmony_ci            buffer = wrapbuffer_virtualaddr_t(vir_addr, width, height, width, height, format);                         \
2863d0407baSopenharmony_ci        } else if (argc == 2) {                                                                                        \
2873d0407baSopenharmony_ci            buffer = wrapbuffer_virtualaddr_t(vir_addr, width, height, args[0], args[1], format);                      \
2883d0407baSopenharmony_ci        } else {                                                                                                       \
2893d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
2903d0407baSopenharmony_ci        }                                                                                                              \
2913d0407baSopenharmony_ci        buffer;                                                                                                        \
2923d0407baSopenharmony_ci    })
2933d0407baSopenharmony_ci
2943d0407baSopenharmony_ci#define wrapbuffer_physicaladdr(phy_addr, width, height, format, ...)                                                  \
2953d0407baSopenharmony_ci    ( {                                                                                                                \
2963d0407baSopenharmony_ci        rga_buffer_t buffer;                                                                                           \
2973d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
2983d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
2993d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
3003d0407baSopenharmony_ci            buffer = wrapbuffer_physicaladdr_t(phy_addr, width, height, width, height, format);                        \
3013d0407baSopenharmony_ci        } else if (argc == 2) {                                                                                        \
3023d0407baSopenharmony_ci            buffer = wrapbuffer_physicaladdr_t(phy_addr, width, height, args[0], args[1], format);                     \
3033d0407baSopenharmony_ci        } else {                                                                                                       \
3043d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
3053d0407baSopenharmony_ci        }                                                                                                              \
3063d0407baSopenharmony_ci        buffer;                                                                                                        \
3073d0407baSopenharmony_ci    })
3083d0407baSopenharmony_ci
3093d0407baSopenharmony_ci#define wrapbuffer_fd(fd, width, height, format, ...)                                                                  \
3103d0407baSopenharmony_ci    ( {                                                                                                                \
3113d0407baSopenharmony_ci        rga_buffer_t buffer;                                                                                           \
3123d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
3133d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
3143d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
3153d0407baSopenharmony_ci            buffer = wrapbuffer_fd_t(fd, width, height, width, height, format);                                        \
3163d0407baSopenharmony_ci        } else if (argc == 2) {                                                                                        \
3173d0407baSopenharmony_ci            buffer = wrapbuffer_fd_t(fd, width, height, args[0], args[1], format);                                     \
3183d0407baSopenharmony_ci        } else {                                                                                                       \
3193d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
3203d0407baSopenharmony_ci        }                                                                                                              \
3213d0407baSopenharmony_ci        buffer;                                                                                                        \
3223d0407baSopenharmony_ci    })
3233d0407baSopenharmony_ci
3243d0407baSopenharmony_ciIM_API rga_buffer_t wrapbuffer_virtualaddr_t(void *vir_addr, int width, int height, int wstride, int hstride,
3253d0407baSopenharmony_ci                                             int format);
3263d0407baSopenharmony_ciIM_API rga_buffer_t wrapbuffer_physicaladdr_t(void *phy_addr, int width, int height, int wstride, int hstride,
3273d0407baSopenharmony_ci                                              int format);
3283d0407baSopenharmony_ciIM_API rga_buffer_t wrapbuffer_fd_t(int fd, int width, int height, int wstride, int hstride, int format);
3293d0407baSopenharmony_ci
3303d0407baSopenharmony_ci/*
3313d0407baSopenharmony_ci * Get RGA basic information, supported resolution, supported format, etc.
3323d0407baSopenharmony_ci *
3333d0407baSopenharmony_ci * @param name
3343d0407baSopenharmony_ci *      RGA_VENDOR
3353d0407baSopenharmony_ci *      RGA_VERSION
3363d0407baSopenharmony_ci *      RGA_MAX_INPUT
3373d0407baSopenharmony_ci *      RGA_MAX_OUTPUT
3383d0407baSopenharmony_ci *      RGA_INPUT_FORMAT
3393d0407baSopenharmony_ci *      RGA_OUTPUT_FORMAT
3403d0407baSopenharmony_ci *      RGA_EXPECTED
3413d0407baSopenharmony_ci *      RGA_ALL
3423d0407baSopenharmony_ci *
3433d0407baSopenharmony_ci * @returns a usage describing properties of RGA.
3443d0407baSopenharmony_ci */
3453d0407baSopenharmony_ciIM_API IM_STATUS rga_get_info(rga_info_table_entry *return_table);
3463d0407baSopenharmony_ci
3473d0407baSopenharmony_ci/*
3483d0407baSopenharmony_ci * Query RGA basic information, supported resolution, supported format, etc.
3493d0407baSopenharmony_ci *
3503d0407baSopenharmony_ci * @param name
3513d0407baSopenharmony_ci *      RGA_VENDOR
3523d0407baSopenharmony_ci *      RGA_VERSION
3533d0407baSopenharmony_ci *      RGA_MAX_INPUT
3543d0407baSopenharmony_ci *      RGA_MAX_OUTPUT
3553d0407baSopenharmony_ci *      RGA_INPUT_FORMAT
3563d0407baSopenharmony_ci *      RGA_OUTPUT_FORMAT
3573d0407baSopenharmony_ci *      RGA_EXPECTED
3583d0407baSopenharmony_ci *      RGA_ALL
3593d0407baSopenharmony_ci *
3603d0407baSopenharmony_ci * @returns a string describing properties of RGA.
3613d0407baSopenharmony_ci */
3623d0407baSopenharmony_ciIM_API const char *querystring(int name);
3633d0407baSopenharmony_ci
3643d0407baSopenharmony_ci/*
3653d0407baSopenharmony_ci * check RGA basic information, supported resolution, supported format, etc.
3663d0407baSopenharmony_ci *
3673d0407baSopenharmony_ci * @param src
3683d0407baSopenharmony_ci * @param dst
3693d0407baSopenharmony_ci * @param src_rect
3703d0407baSopenharmony_ci * @param dst_rect
3713d0407baSopenharmony_ci * @param mode_usage
3723d0407baSopenharmony_ci *
3733d0407baSopenharmony_ci * @returns no error or else negative error code.
3743d0407baSopenharmony_ci */
3753d0407baSopenharmony_ci#define imcheck(src, dst, src_rect, dst_rect, ...)                                                                     \
3763d0407baSopenharmony_ci    ( {                                                                                                                \
3773d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_NOERROR;                                                                             \
3783d0407baSopenharmony_ci        rga_buffer_t pat;                                                                                              \
3793d0407baSopenharmony_ci        im_rect pat_rect;                                                                                              \
3803d0407baSopenharmony_ci        errno_t eok = memset_s(&pat, sizeof(rga_buffer_t), 0, sizeof(rga_buffer_t));                                   \
3813d0407baSopenharmony_ci        if (!eok) {                                                                                                    \
3823d0407baSopenharmony_ci            printf("memset_s failed!\n");                                                                              \
3833d0407baSopenharmony_ci        }                                                                                                              \
3843d0407baSopenharmony_ci        eok = memset_s(&pat_rect, sizeof(im_rect), 0, sizeof(im_rect));                                                \
3853d0407baSopenharmony_ci        if (!eok) {                                                                                                    \
3863d0407baSopenharmony_ci            printf("memset_s failed!\n");                                                                              \
3873d0407baSopenharmony_ci        }                                                                                                              \
3883d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
3893d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
3903d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
3913d0407baSopenharmony_ci            ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, 0);                                           \
3923d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
3933d0407baSopenharmony_ci            ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, args[0]);                                     \
3943d0407baSopenharmony_ci        } else {                                                                                                       \
3953d0407baSopenharmony_ci            ret = IM_STATUS_FAILED;                                                                                    \
3963d0407baSopenharmony_ci            printf("check failed\n");                                                                                  \
3973d0407baSopenharmony_ci        }                                                                                                              \
3983d0407baSopenharmony_ci        ret;                                                                                                           \
3993d0407baSopenharmony_ci    })
4003d0407baSopenharmony_ci#define imcheck_composite(src, dst, pat, src_rect, dst_rect, pat_rect, ...)                                            \
4013d0407baSopenharmony_ci    ( {                                                                                                                \
4023d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_NOERROR;                                                                             \
4033d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
4043d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
4053d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
4063d0407baSopenharmony_ci            ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, 0);                                           \
4073d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
4083d0407baSopenharmony_ci            ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, args[0]);                                     \
4093d0407baSopenharmony_ci        } else {                                                                                                       \
4103d0407baSopenharmony_ci            ret = IM_STATUS_FAILED;                                                                                    \
4113d0407baSopenharmony_ci            printf("check failed\n");                                                                                  \
4123d0407baSopenharmony_ci        }                                                                                                              \
4133d0407baSopenharmony_ci        ret;                                                                                                           \
4143d0407baSopenharmony_ci    })
4153d0407baSopenharmony_ciIM_API IM_STATUS imcheck_t(const rga_buffer_t src, const rga_buffer_t dst, const rga_buffer_t pat,
4163d0407baSopenharmony_ci                           const im_rect src_rect, const im_rect dst_rect, const im_rect pat_rect,
4173d0407baSopenharmony_ci                           const int mdoe_usage);
4183d0407baSopenharmony_ci
4193d0407baSopenharmony_ci/*
4203d0407baSopenharmony_ci * Resize
4213d0407baSopenharmony_ci *
4223d0407baSopenharmony_ci * @param src
4233d0407baSopenharmony_ci * @param dst
4243d0407baSopenharmony_ci * @param fx
4253d0407baSopenharmony_ci * @param fy
4263d0407baSopenharmony_ci * @param interpolation
4273d0407baSopenharmony_ci * @param sync
4283d0407baSopenharmony_ci *      wait until operation complete
4293d0407baSopenharmony_ci *
4303d0407baSopenharmony_ci * @returns success or else negative error code.
4313d0407baSopenharmony_ci */
4323d0407baSopenharmony_ci#define imresize(src, dst, ...)                                                                                        \
4333d0407baSopenharmony_ci    ( {                                                                                                                \
4343d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
4353d0407baSopenharmony_ci        double args[] = {__VA_ARGS__};                                                                                 \
4363d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(double);                                                                      \
4373d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
4383d0407baSopenharmony_ci            ret = imresize_t(src, dst, 0, 0, INTER_LINEAR, 1);                                                         \
4393d0407baSopenharmony_ci        } else if (argc == 2) {                                                                                        \
4403d0407baSopenharmony_ci            ret = imresize_t(src, dst, args[0], args[1], INTER_LINEAR, 1);                                             \
4413d0407baSopenharmony_ci        } else if (argc == 3) {                                                                                        \
4423d0407baSopenharmony_ci            ret = imresize_t(src, dst, args[0], args[1], (int)args[2], 1);                                             \
4433d0407baSopenharmony_ci        } else if (argc == 4) {                                                                                        \
4443d0407baSopenharmony_ci            ret = imresize_t(src, dst, args[0], args[1], (int)args[2], (int)args[3]);                                  \
4453d0407baSopenharmony_ci        } else {                                                                                                       \
4463d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
4473d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
4483d0407baSopenharmony_ci        }                                                                                                              \
4493d0407baSopenharmony_ci        ret;                                                                                                           \
4503d0407baSopenharmony_ci    })
4513d0407baSopenharmony_ci
4523d0407baSopenharmony_ci#define impyramid(src, dst, direction)                                                                                 \
4533d0407baSopenharmony_ci    imresize_t(src, dst, (direction) == IM_UP_SCALE ? 0.5 : 2, (direction) == IM_UP_SCALE ? 0.5 : 2, INTER_LINEAR, 1)
4543d0407baSopenharmony_ci
4553d0407baSopenharmony_ciIM_API IM_STATUS imresize_t(const rga_buffer_t src, rga_buffer_t dst, double fx, double fy, int interpolation,
4563d0407baSopenharmony_ci                            int sync);
4573d0407baSopenharmony_ci
4583d0407baSopenharmony_ci/*
4593d0407baSopenharmony_ci * Crop
4603d0407baSopenharmony_ci *
4613d0407baSopenharmony_ci * @param src
4623d0407baSopenharmony_ci * @param dst
4633d0407baSopenharmony_ci * @param rect
4643d0407baSopenharmony_ci * @param sync
4653d0407baSopenharmony_ci *      wait until operation complete
4663d0407baSopenharmony_ci *
4673d0407baSopenharmony_ci * @returns success or else negative error code.
4683d0407baSopenharmony_ci */
4693d0407baSopenharmony_ci#define imcrop(src, dst, rect, ...)                                                                                    \
4703d0407baSopenharmony_ci    ( {                                                                                                                \
4713d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
4723d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
4733d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
4743d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
4753d0407baSopenharmony_ci            ret = imcrop_t(src, dst, rect, 1);                                                                         \
4763d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
4773d0407baSopenharmony_ci            ret = imcrop_t(src, dst, rect, args[0]);                                                                   \
4783d0407baSopenharmony_ci            ;                                                                                                          \
4793d0407baSopenharmony_ci        } else {                                                                                                       \
4803d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
4813d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
4823d0407baSopenharmony_ci        }                                                                                                              \
4833d0407baSopenharmony_ci        ret;                                                                                                           \
4843d0407baSopenharmony_ci    })
4853d0407baSopenharmony_ci
4863d0407baSopenharmony_ciIM_API IM_STATUS imcrop_t(const rga_buffer_t src, rga_buffer_t dst, im_rect rect, int sync);
4873d0407baSopenharmony_ci
4883d0407baSopenharmony_ci/*
4893d0407baSopenharmony_ci * rotation
4903d0407baSopenharmony_ci *
4913d0407baSopenharmony_ci * @param src
4923d0407baSopenharmony_ci * @param dst
4933d0407baSopenharmony_ci * @param rotation
4943d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_ROT_90
4953d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_ROT_180
4963d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_ROT_270
4973d0407baSopenharmony_ci * @param sync
4983d0407baSopenharmony_ci *      wait until operation complete
4993d0407baSopenharmony_ci *
5003d0407baSopenharmony_ci * @returns success or else negative error code.
5013d0407baSopenharmony_ci */
5023d0407baSopenharmony_ci#define imrotate(src, dst, rotation, ...)                                                                              \
5033d0407baSopenharmony_ci    ( {                                                                                                                \
5043d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
5053d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
5063d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
5073d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
5083d0407baSopenharmony_ci            ret = imrotate_t(src, dst, rotation, 1);                                                                   \
5093d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
5103d0407baSopenharmony_ci            ret = imrotate_t(src, dst, rotation, args[0]);                                                             \
5113d0407baSopenharmony_ci            ;                                                                                                          \
5123d0407baSopenharmony_ci        } else {                                                                                                       \
5133d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
5143d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
5153d0407baSopenharmony_ci        }                                                                                                              \
5163d0407baSopenharmony_ci        ret;                                                                                                           \
5173d0407baSopenharmony_ci    })
5183d0407baSopenharmony_ci
5193d0407baSopenharmony_ciIM_API IM_STATUS imrotate_t(const rga_buffer_t src, rga_buffer_t dst, int rotation, int sync);
5203d0407baSopenharmony_ci
5213d0407baSopenharmony_ci/*
5223d0407baSopenharmony_ci * flip
5233d0407baSopenharmony_ci *
5243d0407baSopenharmony_ci * @param src
5253d0407baSopenharmony_ci * @param dst
5263d0407baSopenharmony_ci * @param mode
5273d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_FLIP_H
5283d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_FLIP_V
5293d0407baSopenharmony_ci * @param sync
5303d0407baSopenharmony_ci *      wait until operation complete
5313d0407baSopenharmony_ci *
5323d0407baSopenharmony_ci * @returns success or else negative error code.
5333d0407baSopenharmony_ci */
5343d0407baSopenharmony_ci#define imflip(src, dst, mode, ...)                                                                                    \
5353d0407baSopenharmony_ci    ( {                                                                                                                \
5363d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
5373d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
5383d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
5393d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
5403d0407baSopenharmony_ci            ret = imflip_t(src, dst, mode, 1);                                                                         \
5413d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
5423d0407baSopenharmony_ci            ret = imflip_t(src, dst, mode, args[0]);                                                                   \
5433d0407baSopenharmony_ci            ;                                                                                                          \
5443d0407baSopenharmony_ci        } else {                                                                                                       \
5453d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
5463d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
5473d0407baSopenharmony_ci        }                                                                                                              \
5483d0407baSopenharmony_ci        ret;                                                                                                           \
5493d0407baSopenharmony_ci    })
5503d0407baSopenharmony_ci
5513d0407baSopenharmony_ciIM_API IM_STATUS imflip_t(const rga_buffer_t src, rga_buffer_t dst, int mode, int sync);
5523d0407baSopenharmony_ci
5533d0407baSopenharmony_ci/*
5543d0407baSopenharmony_ci * fill/reset/draw
5553d0407baSopenharmony_ci *
5563d0407baSopenharmony_ci * @param src
5573d0407baSopenharmony_ci * @param dst
5583d0407baSopenharmony_ci * @param rect
5593d0407baSopenharmony_ci * @param color
5603d0407baSopenharmony_ci * @param sync
5613d0407baSopenharmony_ci *      wait until operation complete
5623d0407baSopenharmony_ci *
5633d0407baSopenharmony_ci * @returns success or else negative error code.
5643d0407baSopenharmony_ci */
5653d0407baSopenharmony_ci#define imfill(buf, rect, color, ...)                                                                                  \
5663d0407baSopenharmony_ci    ( {                                                                                                                \
5673d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
5683d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
5693d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
5703d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
5713d0407baSopenharmony_ci            ret = imfill_t(buf, rect, color, 1);                                                                       \
5723d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
5733d0407baSopenharmony_ci            ret = imfill_t(buf, rect, color, args[0]);                                                                 \
5743d0407baSopenharmony_ci            ;                                                                                                          \
5753d0407baSopenharmony_ci        } else {                                                                                                       \
5763d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
5773d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
5783d0407baSopenharmony_ci        }                                                                                                              \
5793d0407baSopenharmony_ci        ret;                                                                                                           \
5803d0407baSopenharmony_ci    })
5813d0407baSopenharmony_ci
5823d0407baSopenharmony_ci#define imreset(buf, rect, color, ...)                                                                                 \
5833d0407baSopenharmony_ci    ( {                                                                                                                \
5843d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
5853d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
5863d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
5873d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
5883d0407baSopenharmony_ci            ret = imfill_t(buf, rect, color, 1);                                                                       \
5893d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
5903d0407baSopenharmony_ci            ret = imfill_t(buf, rect, color, args[0]);                                                                 \
5913d0407baSopenharmony_ci            ;                                                                                                          \
5923d0407baSopenharmony_ci        } else {                                                                                                       \
5933d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
5943d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
5953d0407baSopenharmony_ci        }                                                                                                              \
5963d0407baSopenharmony_ci        ret;                                                                                                           \
5973d0407baSopenharmony_ci    })
5983d0407baSopenharmony_ci
5993d0407baSopenharmony_ci#define imdraw(buf, rect, color, ...)                                                                                  \
6003d0407baSopenharmony_ci    ( {                                                                                                                \
6013d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
6023d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
6033d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
6043d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
6053d0407baSopenharmony_ci            ret = imfill_t(buf, rect, color, 1);                                                                       \
6063d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
6073d0407baSopenharmony_ci            ret = imfill_t(buf, rect, color, args[0]);                                                                 \
6083d0407baSopenharmony_ci            ;                                                                                                          \
6093d0407baSopenharmony_ci        } else {                                                                                                       \
6103d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
6113d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
6123d0407baSopenharmony_ci        }                                                                                                              \
6133d0407baSopenharmony_ci        ret;                                                                                                           \
6143d0407baSopenharmony_ci    })
6153d0407baSopenharmony_ciIM_API IM_STATUS imfill_t(rga_buffer_t dst, im_rect rect, int color, int sync);
6163d0407baSopenharmony_ci
6173d0407baSopenharmony_ci/*
6183d0407baSopenharmony_ci * palette
6193d0407baSopenharmony_ci *
6203d0407baSopenharmony_ci * @param src
6213d0407baSopenharmony_ci * @param dst
6223d0407baSopenharmony_ci * @param lut
6233d0407baSopenharmony_ci * @param sync
6243d0407baSopenharmony_ci *      wait until operation complete
6253d0407baSopenharmony_ci *
6263d0407baSopenharmony_ci * @returns success or else negative error code.
6273d0407baSopenharmony_ci */
6283d0407baSopenharmony_ci#define impalette(src, dst, lut, ...)                                                                                  \
6293d0407baSopenharmony_ci    ( {                                                                                                                \
6303d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
6313d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
6323d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
6333d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
6343d0407baSopenharmony_ci            ret = impalette_t(src, dst, lut, 1);                                                                       \
6353d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
6363d0407baSopenharmony_ci            ret = impalette_t(src, dst, lut, args[0]);                                                                 \
6373d0407baSopenharmony_ci            ;                                                                                                          \
6383d0407baSopenharmony_ci        } else {                                                                                                       \
6393d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
6403d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
6413d0407baSopenharmony_ci        }                                                                                                              \
6423d0407baSopenharmony_ci        ret;                                                                                                           \
6433d0407baSopenharmony_ci    })
6443d0407baSopenharmony_ciIM_API IM_STATUS impalette_t(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t lut, int sync);
6453d0407baSopenharmony_ci
6463d0407baSopenharmony_ci/*
6473d0407baSopenharmony_ci * translate
6483d0407baSopenharmony_ci *
6493d0407baSopenharmony_ci * @param src
6503d0407baSopenharmony_ci * @param dst
6513d0407baSopenharmony_ci * @param x
6523d0407baSopenharmony_ci * @param y
6533d0407baSopenharmony_ci * @param sync
6543d0407baSopenharmony_ci *      wait until operation complete
6553d0407baSopenharmony_ci *
6563d0407baSopenharmony_ci * @returns success or else negative error code.
6573d0407baSopenharmony_ci */
6583d0407baSopenharmony_ci#define imtranslate(src, dst, x, y, ...)                                                                               \
6593d0407baSopenharmony_ci    ( {                                                                                                                \
6603d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
6613d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
6623d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
6633d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
6643d0407baSopenharmony_ci            ret = imtranslate_t(src, dst, x, y, 1);                                                                    \
6653d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
6663d0407baSopenharmony_ci            ret = imtranslate_t(src, dst, x, y, args[0]);                                                              \
6673d0407baSopenharmony_ci            ;                                                                                                          \
6683d0407baSopenharmony_ci        } else {                                                                                                       \
6693d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
6703d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
6713d0407baSopenharmony_ci        }                                                                                                              \
6723d0407baSopenharmony_ci        ret;                                                                                                           \
6733d0407baSopenharmony_ci    })
6743d0407baSopenharmony_ciIM_API IM_STATUS imtranslate_t(const rga_buffer_t src, rga_buffer_t dst, int x, int y, int sync);
6753d0407baSopenharmony_ci
6763d0407baSopenharmony_ci/*
6773d0407baSopenharmony_ci * copy
6783d0407baSopenharmony_ci *
6793d0407baSopenharmony_ci * @param src
6803d0407baSopenharmony_ci * @param dst
6813d0407baSopenharmony_ci * @param sync
6823d0407baSopenharmony_ci *      wait until operation complete
6833d0407baSopenharmony_ci *
6843d0407baSopenharmony_ci * @returns success or else negative error code.
6853d0407baSopenharmony_ci */
6863d0407baSopenharmony_ci#define imcopy(src, dst, ...)                                                                                          \
6873d0407baSopenharmony_ci    ( {                                                                                                                \
6883d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
6893d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
6903d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
6913d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
6923d0407baSopenharmony_ci            ret = imcopy_t(src, dst, 1);                                                                               \
6933d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
6943d0407baSopenharmony_ci            ret = imcopy_t(src, dst, args[0]);                                                                         \
6953d0407baSopenharmony_ci            ;                                                                                                          \
6963d0407baSopenharmony_ci        } else {                                                                                                       \
6973d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
6983d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
6993d0407baSopenharmony_ci        }                                                                                                              \
7003d0407baSopenharmony_ci        ret;                                                                                                           \
7013d0407baSopenharmony_ci    })
7023d0407baSopenharmony_ci
7033d0407baSopenharmony_ciIM_API IM_STATUS imcopy_t(const rga_buffer_t src, rga_buffer_t dst, int sync);
7043d0407baSopenharmony_ci
7053d0407baSopenharmony_ci/*
7063d0407baSopenharmony_ci * blend (SRC + DST -> DST or SRCA + SRCB -> DST)
7073d0407baSopenharmony_ci *
7083d0407baSopenharmony_ci * @param srcA
7093d0407baSopenharmony_ci * @param srcB can be NULL.
7103d0407baSopenharmony_ci * @param dst
7113d0407baSopenharmony_ci * @param mode
7123d0407baSopenharmony_ci *      IM_ALPHA_BLEND_MODE
7133d0407baSopenharmony_ci * @param sync
7143d0407baSopenharmony_ci *      wait until operation complete
7153d0407baSopenharmony_ci *
7163d0407baSopenharmony_ci * @returns success or else negative error code.
7173d0407baSopenharmony_ci */
7183d0407baSopenharmony_ci#define imblend(srcA, dst, ...)                                                                                        \
7193d0407baSopenharmony_ci    ( {                                                                                                                \
7203d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
7213d0407baSopenharmony_ci        rga_buffer_t srcB;                                                                                             \
7223d0407baSopenharmony_ci        errno_t eok = memset_s(&srcB, sizeof(rga_buffer_t), 0x00, sizeof(rga_buffer_t));                               \
7233d0407baSopenharmony_ci        if (!eok) {                                                                                                    \
7243d0407baSopenharmony_ci            printf("memset_s failed!\n");                                                                              \
7253d0407baSopenharmony_ci        }                                                                                                              \
7263d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
7273d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
7283d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
7293d0407baSopenharmony_ci            ret = imblend_t(srcA, srcB, dst, IM_ALPHA_BLEND_SRC_OVER, 1);                                              \
7303d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
7313d0407baSopenharmony_ci            ret = imblend_t(srcA, srcB, dst, args[0], 1);                                                              \
7323d0407baSopenharmony_ci        } else if (argc == 2) {                                                                                        \
7333d0407baSopenharmony_ci            ret = imblend_t(srcA, srcB, dst, args[0], args[1]);                                                        \
7343d0407baSopenharmony_ci        } else {                                                                                                       \
7353d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
7363d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
7373d0407baSopenharmony_ci        }                                                                                                              \
7383d0407baSopenharmony_ci        ret;                                                                                                           \
7393d0407baSopenharmony_ci    })
7403d0407baSopenharmony_ci#define imcomposite(srcA, srcB, dst, ...)                                                                              \
7413d0407baSopenharmony_ci    ( {                                                                                                                \
7423d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
7433d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
7443d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
7453d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
7463d0407baSopenharmony_ci            ret = imblend_t(srcA, srcB, dst, IM_ALPHA_BLEND_SRC_OVER, 1);                                              \
7473d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
7483d0407baSopenharmony_ci            ret = imblend_t(srcA, srcB, dst, args[0], 1);                                                              \
7493d0407baSopenharmony_ci        } else if (argc == 2) {                                                                                        \
7503d0407baSopenharmony_ci            ret = imblend_t(srcA, srcB, dst, args[0], args[1]);                                                        \
7513d0407baSopenharmony_ci        } else {                                                                                                       \
7523d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
7533d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
7543d0407baSopenharmony_ci        }                                                                                                              \
7553d0407baSopenharmony_ci        ret;                                                                                                           \
7563d0407baSopenharmony_ci    })
7573d0407baSopenharmony_ciIM_API IM_STATUS imblend_t(const rga_buffer_t srcA, const rga_buffer_t srcB, rga_buffer_t dst, int mode, int sync);
7583d0407baSopenharmony_ci
7593d0407baSopenharmony_ci/*
7603d0407baSopenharmony_ci * color key
7613d0407baSopenharmony_ci *
7623d0407baSopenharmony_ci * @param src
7633d0407baSopenharmony_ci * @param dst
7643d0407baSopenharmony_ci * @param colorkey_range
7653d0407baSopenharmony_ci *      max color
7663d0407baSopenharmony_ci *      min color
7673d0407baSopenharmony_ci * @param sync
7683d0407baSopenharmony_ci *      wait until operation complete
7693d0407baSopenharmony_ci *
7703d0407baSopenharmony_ci * @returns success or else negative error code.
7713d0407baSopenharmony_ci */
7723d0407baSopenharmony_ci#define imcolorkey(src, dst, range, ...)                                                                               \
7733d0407baSopenharmony_ci    ( {                                                                                                                \
7743d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
7753d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
7763d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
7773d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
7783d0407baSopenharmony_ci            ret = imcolorkey_t(src, dst, range, IM_ALPHA_COLORKEY_NORMAL, 1);                                          \
7793d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
7803d0407baSopenharmony_ci            ret = imcolorkey_t(src, dst, range, args[0], 1);                                                           \
7813d0407baSopenharmony_ci        } else if (argc == 2) {                                                                                        \
7823d0407baSopenharmony_ci            ret = imcolorkey_t(src, dst, range, args[0], args[1]);                                                     \
7833d0407baSopenharmony_ci        } else {                                                                                                       \
7843d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
7853d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
7863d0407baSopenharmony_ci        }                                                                                                              \
7873d0407baSopenharmony_ci        ret;                                                                                                           \
7883d0407baSopenharmony_ci    })
7893d0407baSopenharmony_ciIM_API IM_STATUS imcolorkey_t(const rga_buffer_t src, rga_buffer_t dst, im_colorkey_range range, int mode, int sync);
7903d0407baSopenharmony_ci
7913d0407baSopenharmony_ci/*
7923d0407baSopenharmony_ci * format convert
7933d0407baSopenharmony_ci *
7943d0407baSopenharmony_ci * @param src
7953d0407baSopenharmony_ci * @param dst
7963d0407baSopenharmony_ci * @param sfmt
7973d0407baSopenharmony_ci * @param dfmt
7983d0407baSopenharmony_ci * @param mode
7993d0407baSopenharmony_ci *      color space mode: IM_COLOR_SPACE_MODE
8003d0407baSopenharmony_ci * @param sync
8013d0407baSopenharmony_ci *      wait until operation complete
8023d0407baSopenharmony_ci *
8033d0407baSopenharmony_ci * @returns success or else negative error code.
8043d0407baSopenharmony_ci */
8053d0407baSopenharmony_ci#define imcvtcolor(src, dst, sfmt, dfmt, ...)                                                                          \
8063d0407baSopenharmony_ci    ( {                                                                                                                \
8073d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
8083d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
8093d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
8103d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
8113d0407baSopenharmony_ci            ret = imcvtcolor_t(src, dst, sfmt, dfmt, IM_COLOR_SPACE_DEFAULT, 1);                                       \
8123d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
8133d0407baSopenharmony_ci            ret = imcvtcolor_t(src, dst, sfmt, dfmt, args[0], 1);                                                      \
8143d0407baSopenharmony_ci        } else if (argc == 2) {                                                                                        \
8153d0407baSopenharmony_ci            ret = imcvtcolor_t(src, dst, sfmt, dfmt, args[0], args[1]);                                                \
8163d0407baSopenharmony_ci        } else {                                                                                                       \
8173d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
8183d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
8193d0407baSopenharmony_ci        }                                                                                                              \
8203d0407baSopenharmony_ci        ret;                                                                                                           \
8213d0407baSopenharmony_ci    })
8223d0407baSopenharmony_ci
8233d0407baSopenharmony_ciIM_API IM_STATUS imcvtcolor_t(rga_buffer_t src, rga_buffer_t dst, int sfmt, int dfmt, int mode, int sync);
8243d0407baSopenharmony_ci
8253d0407baSopenharmony_ci/*
8263d0407baSopenharmony_ci * nn quantize
8273d0407baSopenharmony_ci *
8283d0407baSopenharmony_ci * @param src
8293d0407baSopenharmony_ci * @param dst
8303d0407baSopenharmony_ci * @param nninfo
8313d0407baSopenharmony_ci * @param sync
8323d0407baSopenharmony_ci *      wait until operation complete
8333d0407baSopenharmony_ci *
8343d0407baSopenharmony_ci * @returns success or else negative error code.
8353d0407baSopenharmony_ci */
8363d0407baSopenharmony_ci#define imquantize(src, dst, nn_info, ...)                                                                             \
8373d0407baSopenharmony_ci    ( {                                                                                                                \
8383d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
8393d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
8403d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
8413d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
8423d0407baSopenharmony_ci            ret = imquantize_t(src, dst, nn_info, 1);                                                                  \
8433d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
8443d0407baSopenharmony_ci            ret = imquantize_t(src, dst, nn_info, args[0]);                                                            \
8453d0407baSopenharmony_ci            ;                                                                                                          \
8463d0407baSopenharmony_ci        } else {                                                                                                       \
8473d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
8483d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
8493d0407baSopenharmony_ci        }                                                                                                              \
8503d0407baSopenharmony_ci        ret;                                                                                                           \
8513d0407baSopenharmony_ci    })
8523d0407baSopenharmony_ci
8533d0407baSopenharmony_ciIM_API IM_STATUS imquantize_t(const rga_buffer_t src, rga_buffer_t dst, im_nn_t nn_info, int sync);
8543d0407baSopenharmony_ci
8553d0407baSopenharmony_ci/*
8563d0407baSopenharmony_ci * ROP
8573d0407baSopenharmony_ci *
8583d0407baSopenharmony_ci * @param src
8593d0407baSopenharmony_ci * @param dst
8603d0407baSopenharmony_ci * @param rop_code
8613d0407baSopenharmony_ci * @param sync
8623d0407baSopenharmony_ci *      wait until operation complete
8633d0407baSopenharmony_ci *
8643d0407baSopenharmony_ci * @returns success or else negative error code.
8653d0407baSopenharmony_ci */
8663d0407baSopenharmony_ci#define imrop(src, dst, rop_code, ...)                                                                                 \
8673d0407baSopenharmony_ci    ( {                                                                                                                \
8683d0407baSopenharmony_ci        IM_STATUS ret = IM_STATUS_SUCCESS;                                                                             \
8693d0407baSopenharmony_ci        int args[] = {__VA_ARGS__};                                                                                    \
8703d0407baSopenharmony_ci        int argc = sizeof(args) / sizeof(int);                                                                         \
8713d0407baSopenharmony_ci        if (argc == 0) {                                                                                               \
8723d0407baSopenharmony_ci            ret = imrop_t(src, dst, rop_code, 1);                                                                      \
8733d0407baSopenharmony_ci        } else if (argc == 1) {                                                                                        \
8743d0407baSopenharmony_ci            ret = imrop_t(src, dst, rop_code, args[0]);                                                                \
8753d0407baSopenharmony_ci            ;                                                                                                          \
8763d0407baSopenharmony_ci        } else {                                                                                                       \
8773d0407baSopenharmony_ci            ret = IM_STATUS_INVALID_PARAM;                                                                             \
8783d0407baSopenharmony_ci            printf("invalid parameter\n");                                                                             \
8793d0407baSopenharmony_ci        }                                                                                                              \
8803d0407baSopenharmony_ci        ret;                                                                                                           \
8813d0407baSopenharmony_ci    })
8823d0407baSopenharmony_ciIM_API IM_STATUS imrop_t(const rga_buffer_t src, rga_buffer_t dst, int rop_code, int sync);
8833d0407baSopenharmony_ci
8843d0407baSopenharmony_ci/*
8853d0407baSopenharmony_ci * process
8863d0407baSopenharmony_ci *
8873d0407baSopenharmony_ci * @param src
8883d0407baSopenharmony_ci * @param dst
8893d0407baSopenharmony_ci * @param usage
8903d0407baSopenharmony_ci * @param ...
8913d0407baSopenharmony_ci *      wait until operation complete
8923d0407baSopenharmony_ci *
8933d0407baSopenharmony_ci * @returns success or else negative error code.
8943d0407baSopenharmony_ci */
8953d0407baSopenharmony_ciIM_API IM_STATUS improcess(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat, im_rect srect, im_rect drect,
8963d0407baSopenharmony_ci                           im_rect prect, int usage);
8973d0407baSopenharmony_ci
8983d0407baSopenharmony_ci/*
8993d0407baSopenharmony_ci * block until all execution is complete
9003d0407baSopenharmony_ci *
9013d0407baSopenharmony_ci * @returns success or else negative error code.
9023d0407baSopenharmony_ci */
9033d0407baSopenharmony_ciIM_API IM_STATUS imsync(void);
9043d0407baSopenharmony_ci
9053d0407baSopenharmony_ci#ifdef __cplusplus
9063d0407baSopenharmony_ci}
9073d0407baSopenharmony_ci#endif
9083d0407baSopenharmony_ci#endif /* _im2d_h_ */
909