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#ifdef __cplusplus
243d0407baSopenharmony_ciextern "C" {
253d0407baSopenharmony_ci#endif
263d0407baSopenharmony_ci
273d0407baSopenharmony_ci#include "im2d_version.h"
283d0407baSopenharmony_ci#include "im2d_type.h"
293d0407baSopenharmony_ci
303d0407baSopenharmony_ci#ifndef IM_API
313d0407baSopenharmony_ci#define IM_API /* define API export as needed */
323d0407baSopenharmony_ci#endif
333d0407baSopenharmony_ci
343d0407baSopenharmony_ci#define RGA_GET_MIN(n1, n2) ((n1) < (n2) ? (n1) : (n2))
353d0407baSopenharmony_ci
363d0407baSopenharmony_ci/*
373d0407baSopenharmony_ci * @return error message string
383d0407baSopenharmony_ci */
393d0407baSopenharmony_ci#define imStrError(...) \
403d0407baSopenharmony_ci    ({ \
413d0407baSopenharmony_ci        const char* im2d_api_err; \
423d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
433d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
443d0407baSopenharmony_ci        if (__argc == 0) { \
453d0407baSopenharmony_ci            im2d_api_err = imStrError_t(IM_STATUS_INVALID_PARAM); \
463d0407baSopenharmony_ci        } else if (__argc == 1){ \
473d0407baSopenharmony_ci            im2d_api_err = imStrError_t((IM_STATUS)__args[0]); \
483d0407baSopenharmony_ci        } else { \
493d0407baSopenharmony_ci            im2d_api_err = ("Fatal error, imStrError() too many parameters\n"); \
503d0407baSopenharmony_ci            printf("Fatal error, imStrError() too many parameters\n"); \
513d0407baSopenharmony_ci        } \
523d0407baSopenharmony_ci        im2d_api_err; \
533d0407baSopenharmony_ci    })
543d0407baSopenharmony_ciIM_API const char* imStrError_t(IM_STATUS status);
553d0407baSopenharmony_ci
563d0407baSopenharmony_ci/*
573d0407baSopenharmony_ci * Import external buffers into RGA driver.
583d0407baSopenharmony_ci *
593d0407baSopenharmony_ci * @param fd/va/pa
603d0407baSopenharmony_ci *      Select dma_fd/virtual_address/physical_address by buffer type
613d0407baSopenharmony_ci * @param param
623d0407baSopenharmony_ci *      Configure buffer parameters
633d0407baSopenharmony_ci *
643d0407baSopenharmony_ci * @return rga_buffer_handle_t
653d0407baSopenharmony_ci */
663d0407baSopenharmony_ciIM_API rga_buffer_handle_t importbuffer_fd(int fd, im_handle_param_t *param);
673d0407baSopenharmony_ciIM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, im_handle_param_t *param);
683d0407baSopenharmony_ciIM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, im_handle_param_t *param);
693d0407baSopenharmony_ci
703d0407baSopenharmony_ci/*
713d0407baSopenharmony_ci * Import external buffers into RGA driver.
723d0407baSopenharmony_ci *
733d0407baSopenharmony_ci * @param handle
743d0407baSopenharmony_ci *      rga buffer handle
753d0407baSopenharmony_ci *
763d0407baSopenharmony_ci * @return success or else negative error code.
773d0407baSopenharmony_ci */
783d0407baSopenharmony_ciIM_API IM_STATUS releasebuffer_handle(rga_buffer_handle_t handle);
793d0407baSopenharmony_ci
803d0407baSopenharmony_ci/*
813d0407baSopenharmony_ci * Wrap image Parameters.
823d0407baSopenharmony_ci *
833d0407baSopenharmony_ci * @param handle
843d0407baSopenharmony_ci *      RGA buffer handle.
853d0407baSopenharmony_ci * @param width
863d0407baSopenharmony_ci *      Width of image manipulation area.
873d0407baSopenharmony_ci * @param height
883d0407baSopenharmony_ci *      Height of image manipulation area.
893d0407baSopenharmony_ci * @param wstride
903d0407baSopenharmony_ci *      Width pixel stride, default (width = wstride).
913d0407baSopenharmony_ci * @param hstride
923d0407baSopenharmony_ci *      Height pixel stride, default (height = hstride).
933d0407baSopenharmony_ci * @param format
943d0407baSopenharmony_ci *      Image format.
953d0407baSopenharmony_ci *
963d0407baSopenharmony_ci * @return rga_buffer_t
973d0407baSopenharmony_ci */
983d0407baSopenharmony_ci#define wrapbuffer_handle(handle, width, height, format, ...) \
993d0407baSopenharmony_ci    ({ \
1003d0407baSopenharmony_ci        rga_buffer_t im2d_api_buffer; \
1013d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
1023d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
1033d0407baSopenharmony_ci        if (__argc == 0) { \
1043d0407baSopenharmony_ci            im2d_api_buffer = wrapbuffer_handle_t(handle, width, height, width, height, format); \
1053d0407baSopenharmony_ci        } else if (__argc == 2){ \
1063d0407baSopenharmony_ci            im2d_api_buffer = wrapbuffer_handle_t(handle, width, height, __args[0], __args[1], format); \
1073d0407baSopenharmony_ci        } else { \
1083d0407baSopenharmony_ci            printf("invalid parameter\n"); \
1093d0407baSopenharmony_ci        } \
1103d0407baSopenharmony_ci        im2d_api_buffer; \
1113d0407baSopenharmony_ci    })
1123d0407baSopenharmony_ciIM_API rga_buffer_t wrapbuffer_handle_t(rga_buffer_handle_t handle, int width, int height, int wstride, int hstride, int format);
1133d0407baSopenharmony_ci
1143d0407baSopenharmony_ci/* For legarcy. */
1153d0407baSopenharmony_ci#define wrapbuffer_virtualaddr(vir_addr, width, height, format, ...) \
1163d0407baSopenharmony_ci    ({ \
1173d0407baSopenharmony_ci        rga_buffer_t im2d_api_buffer; \
1183d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
1193d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
1203d0407baSopenharmony_ci        if (__argc == 0) { \
1213d0407baSopenharmony_ci            im2d_api_buffer = wrapbuffer_virtualaddr_t(vir_addr, width, height, width, height, format); \
1223d0407baSopenharmony_ci        } else if (__argc == 2){ \
1233d0407baSopenharmony_ci            im2d_api_buffer = wrapbuffer_virtualaddr_t(vir_addr, width, height, __args[0], __args[1], format); \
1243d0407baSopenharmony_ci        } else { \
1253d0407baSopenharmony_ci            printf("invalid parameter\n"); \
1263d0407baSopenharmony_ci        } \
1273d0407baSopenharmony_ci        im2d_api_buffer; \
1283d0407baSopenharmony_ci    })
1293d0407baSopenharmony_ci
1303d0407baSopenharmony_ci#define wrapbuffer_physicaladdr(phy_addr, width, height, format, ...) \
1313d0407baSopenharmony_ci    ({ \
1323d0407baSopenharmony_ci        rga_buffer_t im2d_api_buffer; \
1333d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
1343d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
1353d0407baSopenharmony_ci        if (__argc == 0) { \
1363d0407baSopenharmony_ci            im2d_api_buffer = wrapbuffer_physicaladdr_t(phy_addr, width, height, width, height, format); \
1373d0407baSopenharmony_ci        } else if (__argc == 2){ \
1383d0407baSopenharmony_ci            im2d_api_buffer = wrapbuffer_physicaladdr_t(phy_addr, width, height, __args[0], __args[1], format); \
1393d0407baSopenharmony_ci        } else { \
1403d0407baSopenharmony_ci            printf("invalid parameter\n"); \
1413d0407baSopenharmony_ci        } \
1423d0407baSopenharmony_ci        im2d_api_buffer; \
1433d0407baSopenharmony_ci    })
1443d0407baSopenharmony_ci
1453d0407baSopenharmony_ci#define wrapbuffer_fd(fd, width, height, format, ...) \
1463d0407baSopenharmony_ci    ({ \
1473d0407baSopenharmony_ci        rga_buffer_t im2d_api_buffer; \
1483d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
1493d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
1503d0407baSopenharmony_ci        if (__argc == 0) { \
1513d0407baSopenharmony_ci            im2d_api_buffer = wrapbuffer_fd_t(fd, width, height, width, height, format); \
1523d0407baSopenharmony_ci        } else if (__argc == 2){ \
1533d0407baSopenharmony_ci            im2d_api_buffer = wrapbuffer_fd_t(fd, width, height, __args[0], __args[1], format); \
1543d0407baSopenharmony_ci        } else { \
1553d0407baSopenharmony_ci            printf("invalid parameter\n"); \
1563d0407baSopenharmony_ci        } \
1573d0407baSopenharmony_ci        im2d_api_buffer; \
1583d0407baSopenharmony_ci    })
1593d0407baSopenharmony_ciIM_API rga_buffer_t wrapbuffer_virtualaddr_t(void* vir_addr, int width, int height, int wstride, int hstride, int format);
1603d0407baSopenharmony_ciIM_API rga_buffer_t wrapbuffer_physicaladdr_t(void* phy_addr, int width, int height, int wstride, int hstride, int format);
1613d0407baSopenharmony_ciIM_API rga_buffer_t wrapbuffer_fd_t(int fd, int width, int height, int wstride, int hstride, int format);
1623d0407baSopenharmony_ci
1633d0407baSopenharmony_ci/*
1643d0407baSopenharmony_ci * Query RGA basic information, supported resolution, supported format, etc.
1653d0407baSopenharmony_ci *
1663d0407baSopenharmony_ci * @param name
1673d0407baSopenharmony_ci *      RGA_VENDOR
1683d0407baSopenharmony_ci *      RGA_VERSION
1693d0407baSopenharmony_ci *      RGA_MAX_INPUT
1703d0407baSopenharmony_ci *      RGA_MAX_OUTPUT
1713d0407baSopenharmony_ci *      RGA_INPUT_FORMAT
1723d0407baSopenharmony_ci *      RGA_OUTPUT_FORMAT
1733d0407baSopenharmony_ci *      RGA_EXPECTED
1743d0407baSopenharmony_ci *      RGA_ALL
1753d0407baSopenharmony_ci *
1763d0407baSopenharmony_ci * @returns a string describing properties of RGA.
1773d0407baSopenharmony_ci */
1783d0407baSopenharmony_ciIM_API const char* querystring(int name);
1793d0407baSopenharmony_ci
1803d0407baSopenharmony_ci/*
1813d0407baSopenharmony_ci * check RGA basic information, supported resolution, supported format, etc.
1823d0407baSopenharmony_ci *
1833d0407baSopenharmony_ci * @param src
1843d0407baSopenharmony_ci * @param dst
1853d0407baSopenharmony_ci * @param src_rect
1863d0407baSopenharmony_ci * @param dst_rect
1873d0407baSopenharmony_ci * @param mode_usage
1883d0407baSopenharmony_ci *
1893d0407baSopenharmony_ci * @returns no error or else negative error code.
1903d0407baSopenharmony_ci */
1913d0407baSopenharmony_ci#define imcheck(src, dst, src_rect, dst_rect, ...) \
1923d0407baSopenharmony_ci    ({ \
1933d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_NOERROR; \
1943d0407baSopenharmony_ci        rga_buffer_t __pat; \
1953d0407baSopenharmony_ci        im_rect __pat_rect; \
1963d0407baSopenharmony_ci        memset(&__pat, 0, sizeof(rga_buffer_t)); \
1973d0407baSopenharmony_ci        memset(&__pat_rect, 0, sizeof(im_rect)); \
1983d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
1993d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
2003d0407baSopenharmony_ci        if (__argc == 0) { \
2013d0407baSopenharmony_ci            rga_check_perpare((rga_buffer_t *)(&src), (rga_buffer_t *)(&dst), (rga_buffer_t *)(&__pat), \
2023d0407baSopenharmony_ci                              (im_rect *)(&src_rect), (im_rect *)(&dst_rect), (im_rect *)(&__pat_rect), 0); \
2033d0407baSopenharmony_ci            __ret = imcheck_t(src, dst, __pat, src_rect, dst_rect, __pat_rect, 0); \
2043d0407baSopenharmony_ci        } else if (__argc == 1){ \
2053d0407baSopenharmony_ci            rga_check_perpare((rga_buffer_t *)(&src), (rga_buffer_t *)(&dst), (rga_buffer_t *)(&__pat), \
2063d0407baSopenharmony_ci                              (im_rect *)(&src_rect), (im_rect *)(&dst_rect), (im_rect *)(&__pat_rect), __args[0]); \
2073d0407baSopenharmony_ci            __ret = imcheck_t(src, dst, __pat, src_rect, dst_rect, __pat_rect, __args[0]); \
2083d0407baSopenharmony_ci        } else { \
2093d0407baSopenharmony_ci            __ret = IM_STATUS_FAILED; \
2103d0407baSopenharmony_ci            printf("check failed\n"); \
2113d0407baSopenharmony_ci        } \
2123d0407baSopenharmony_ci        __ret; \
2133d0407baSopenharmony_ci    })
2143d0407baSopenharmony_ci#define imcheck_composite(src, dst, pat, src_rect, dst_rect, pat_rect, ...) \
2153d0407baSopenharmony_ci    ({ \
2163d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_NOERROR; \
2173d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
2183d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
2193d0407baSopenharmony_ci        if (__argc == 0) { \
2203d0407baSopenharmony_ci            rga_check_perpare((rga_buffer_t *)(&src), (rga_buffer_t *)(&dst), (rga_buffer_t *)(&pat), \
2213d0407baSopenharmony_ci                              (im_rect *)(&src_rect), (im_rect *)(&dst_rect), (im_rect *)(&pat_rect), 0); \
2223d0407baSopenharmony_ci            __ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, 0); \
2233d0407baSopenharmony_ci        } else if (__argc == 1){ \
2243d0407baSopenharmony_ci            rga_check_perpare((rga_buffer_t *)(&src), (rga_buffer_t *)(&dst), (rga_buffer_t *)(&pat), \
2253d0407baSopenharmony_ci                              (im_rect *)(&src_rect), (im_rect *)(&dst_rect), (im_rect *)(&pat_rect), __args[0]); \
2263d0407baSopenharmony_ci            __ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, __args[0]); \
2273d0407baSopenharmony_ci        } else { \
2283d0407baSopenharmony_ci            __ret = IM_STATUS_FAILED; \
2293d0407baSopenharmony_ci            printf("check failed\n"); \
2303d0407baSopenharmony_ci        } \
2313d0407baSopenharmony_ci        __ret; \
2323d0407baSopenharmony_ci    })
2333d0407baSopenharmony_ciIM_API void rga_check_perpare(rga_buffer_t *src, rga_buffer_t *dst, rga_buffer_t *pat,
2343d0407baSopenharmony_ci                              im_rect *src_rect, im_rect *dst_rect, im_rect *pat_rect, int mode_usage);
2353d0407baSopenharmony_ciIM_API IM_STATUS imcheck_t(const rga_buffer_t src, const rga_buffer_t dst, const rga_buffer_t pat,
2363d0407baSopenharmony_ci                           const im_rect src_rect, const im_rect dst_rect, const im_rect pat_rect, const int mode_usage);
2373d0407baSopenharmony_ci
2383d0407baSopenharmony_ci/*
2393d0407baSopenharmony_ci * Resize
2403d0407baSopenharmony_ci *
2413d0407baSopenharmony_ci * @param src
2423d0407baSopenharmony_ci * @param dst
2433d0407baSopenharmony_ci * @param fx
2443d0407baSopenharmony_ci * @param fy
2453d0407baSopenharmony_ci * @param interpolation
2463d0407baSopenharmony_ci * @param sync
2473d0407baSopenharmony_ci *      wait until operation complete
2483d0407baSopenharmony_ci *
2493d0407baSopenharmony_ci * @returns success or else negative error code.
2503d0407baSopenharmony_ci */
2513d0407baSopenharmony_ci#define imresize(src, dst, ...) \
2523d0407baSopenharmony_ci    ({ \
2533d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
2543d0407baSopenharmony_ci        double __args[] = {__VA_ARGS__}; \
2553d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(double); \
2563d0407baSopenharmony_ci        if (__argc == 0) { \
2573d0407baSopenharmony_ci            __ret = imresize_t(src, dst, 0, 0, INTER_LINEAR, 1); \
2583d0407baSopenharmony_ci        } else if (__argc == 2){ \
2593d0407baSopenharmony_ci            __ret = imresize_t(src, dst, __args[RGA_GET_MIN(__argc, 0)], __args[RGA_GET_MIN(__argc, 1)], INTER_LINEAR, 1); \
2603d0407baSopenharmony_ci        } else if (__argc == 3){ \
2613d0407baSopenharmony_ci            __ret = imresize_t(src, dst, __args[RGA_GET_MIN(__argc, 0)], __args[RGA_GET_MIN(__argc, 1)], (int)__args[RGA_GET_MIN(__argc, 2)], 1); \
2623d0407baSopenharmony_ci        } else if (__argc == 4){ \
2633d0407baSopenharmony_ci            __ret = imresize_t(src, dst, __args[RGA_GET_MIN(__argc, 0)], __args[RGA_GET_MIN(__argc, 1)], (int)__args[RGA_GET_MIN(__argc, 2)], (int)__args[RGA_GET_MIN(__argc, 3)]); \
2643d0407baSopenharmony_ci        } else { \
2653d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
2663d0407baSopenharmony_ci            printf("invalid parameter\n"); \
2673d0407baSopenharmony_ci        } \
2683d0407baSopenharmony_ci        __ret; \
2693d0407baSopenharmony_ci    })
2703d0407baSopenharmony_ci
2713d0407baSopenharmony_ci#define impyramid(src, dst, direction) \
2723d0407baSopenharmony_ci        imresize_t(src, \
2733d0407baSopenharmony_ci                   dst, \
2743d0407baSopenharmony_ci                   direction == IM_UP_SCALE ? 0.5 : 2, \
2753d0407baSopenharmony_ci                   direction == IM_UP_SCALE ? 0.5 : 2, \
2763d0407baSopenharmony_ci                   INTER_LINEAR, 1)
2773d0407baSopenharmony_ci
2783d0407baSopenharmony_ciIM_API IM_STATUS imresize_t(const rga_buffer_t src, rga_buffer_t dst, double fx, double fy, int interpolation, int sync);
2793d0407baSopenharmony_ci
2803d0407baSopenharmony_ci/*
2813d0407baSopenharmony_ci * Crop
2823d0407baSopenharmony_ci *
2833d0407baSopenharmony_ci * @param src
2843d0407baSopenharmony_ci * @param dst
2853d0407baSopenharmony_ci * @param rect
2863d0407baSopenharmony_ci * @param sync
2873d0407baSopenharmony_ci *      wait until operation complete
2883d0407baSopenharmony_ci *
2893d0407baSopenharmony_ci * @returns success or else negative error code.
2903d0407baSopenharmony_ci */
2913d0407baSopenharmony_ci#define imcrop(src, dst, rect, ...) \
2923d0407baSopenharmony_ci    ({ \
2933d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
2943d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
2953d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
2963d0407baSopenharmony_ci        if (__argc == 0) { \
2973d0407baSopenharmony_ci            __ret = imcrop_t(src, dst, rect, 1); \
2983d0407baSopenharmony_ci        } else if (__argc == 1){ \
2993d0407baSopenharmony_ci            __ret = imcrop_t(src, dst, rect, (int)__args[RGA_GET_MIN(__argc, 0)]); \
3003d0407baSopenharmony_ci        } else { \
3013d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
3023d0407baSopenharmony_ci            printf("invalid parameter\n"); \
3033d0407baSopenharmony_ci        } \
3043d0407baSopenharmony_ci        __ret; \
3053d0407baSopenharmony_ci    })
3063d0407baSopenharmony_ci
3073d0407baSopenharmony_ciIM_API IM_STATUS imcrop_t(const rga_buffer_t src, rga_buffer_t dst, im_rect rect, int sync);
3083d0407baSopenharmony_ci
3093d0407baSopenharmony_ci/*
3103d0407baSopenharmony_ci * rotation
3113d0407baSopenharmony_ci *
3123d0407baSopenharmony_ci * @param src
3133d0407baSopenharmony_ci * @param dst
3143d0407baSopenharmony_ci * @param rotation
3153d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_ROT_90
3163d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_ROT_180
3173d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_ROT_270
3183d0407baSopenharmony_ci * @param sync
3193d0407baSopenharmony_ci *      wait until operation complete
3203d0407baSopenharmony_ci *
3213d0407baSopenharmony_ci * @returns success or else negative error code.
3223d0407baSopenharmony_ci */
3233d0407baSopenharmony_ci#define imrotate(src, dst, rotation, ...) \
3243d0407baSopenharmony_ci    ({ \
3253d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
3263d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
3273d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
3283d0407baSopenharmony_ci        if (__argc == 0) { \
3293d0407baSopenharmony_ci            __ret = imrotate_t(src, dst, rotation, 1); \
3303d0407baSopenharmony_ci        } else if (__argc == 1){ \
3313d0407baSopenharmony_ci            __ret = imrotate_t(src, dst, rotation, (int)__args[RGA_GET_MIN(__argc, 0)]); \
3323d0407baSopenharmony_ci        } else { \
3333d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
3343d0407baSopenharmony_ci            printf("invalid parameter\n"); \
3353d0407baSopenharmony_ci        } \
3363d0407baSopenharmony_ci        __ret; \
3373d0407baSopenharmony_ci    })
3383d0407baSopenharmony_ci
3393d0407baSopenharmony_ciIM_API IM_STATUS imrotate_t(const rga_buffer_t src, rga_buffer_t dst, int rotation, int sync);
3403d0407baSopenharmony_ci
3413d0407baSopenharmony_ci/*
3423d0407baSopenharmony_ci * flip
3433d0407baSopenharmony_ci *
3443d0407baSopenharmony_ci * @param src
3453d0407baSopenharmony_ci * @param dst
3463d0407baSopenharmony_ci * @param mode
3473d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_FLIP_H
3483d0407baSopenharmony_ci *      IM_HAL_TRANSFORM_FLIP_V
3493d0407baSopenharmony_ci * @param sync
3503d0407baSopenharmony_ci *      wait until operation complete
3513d0407baSopenharmony_ci *
3523d0407baSopenharmony_ci * @returns success or else negative error code.
3533d0407baSopenharmony_ci */
3543d0407baSopenharmony_ci#define imflip(src, dst, mode, ...) \
3553d0407baSopenharmony_ci    ({ \
3563d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
3573d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
3583d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
3593d0407baSopenharmony_ci        if (__argc == 0) { \
3603d0407baSopenharmony_ci            __ret = imflip_t(src, dst, mode, 1); \
3613d0407baSopenharmony_ci        } else if (__argc == 1){ \
3623d0407baSopenharmony_ci            __ret = imflip_t(src, dst, mode, (int)__args[RGA_GET_MIN(__argc, 0)]); \
3633d0407baSopenharmony_ci        } else { \
3643d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
3653d0407baSopenharmony_ci            printf("invalid parameter\n"); \
3663d0407baSopenharmony_ci        } \
3673d0407baSopenharmony_ci        __ret; \
3683d0407baSopenharmony_ci    })
3693d0407baSopenharmony_ci
3703d0407baSopenharmony_ciIM_API IM_STATUS imflip_t (const rga_buffer_t src, rga_buffer_t dst, int mode, int sync);
3713d0407baSopenharmony_ci
3723d0407baSopenharmony_ci/*
3733d0407baSopenharmony_ci * fill/reset/draw
3743d0407baSopenharmony_ci *
3753d0407baSopenharmony_ci * @param src
3763d0407baSopenharmony_ci * @param dst
3773d0407baSopenharmony_ci * @param rect
3783d0407baSopenharmony_ci * @param color
3793d0407baSopenharmony_ci * @param sync
3803d0407baSopenharmony_ci *      wait until operation complete
3813d0407baSopenharmony_ci *
3823d0407baSopenharmony_ci * @returns success or else negative error code.
3833d0407baSopenharmony_ci */
3843d0407baSopenharmony_ci#define imfill(buf, rect, color, ...) \
3853d0407baSopenharmony_ci    ({ \
3863d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
3873d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
3883d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
3893d0407baSopenharmony_ci        if (__argc == 0) { \
3903d0407baSopenharmony_ci            __ret = imfill_t(buf, rect, color, 1); \
3913d0407baSopenharmony_ci        } else if (__argc == 1){ \
3923d0407baSopenharmony_ci            __ret = imfill_t(buf, rect, color, (int)__args[RGA_GET_MIN(__argc, 0)]); \
3933d0407baSopenharmony_ci        } else { \
3943d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
3953d0407baSopenharmony_ci            printf("invalid parameter\n"); \
3963d0407baSopenharmony_ci        } \
3973d0407baSopenharmony_ci        __ret; \
3983d0407baSopenharmony_ci    })
3993d0407baSopenharmony_ci
4003d0407baSopenharmony_ci#define imreset(buf, rect, color, ...) \
4013d0407baSopenharmony_ci    ({ \
4023d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
4033d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
4043d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
4053d0407baSopenharmony_ci        if (__argc == 0) { \
4063d0407baSopenharmony_ci            __ret = imfill_t(buf, rect, color, 1); \
4073d0407baSopenharmony_ci        } else if (__argc == 1){ \
4083d0407baSopenharmony_ci            __ret = imfill_t(buf, rect, color, (int)__args[RGA_GET_MIN(__argc, 0)]); \
4093d0407baSopenharmony_ci        } else { \
4103d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
4113d0407baSopenharmony_ci            printf("invalid parameter\n"); \
4123d0407baSopenharmony_ci        } \
4133d0407baSopenharmony_ci        __ret; \
4143d0407baSopenharmony_ci    })
4153d0407baSopenharmony_ci
4163d0407baSopenharmony_ci#define imdraw(buf, rect, color, ...) \
4173d0407baSopenharmony_ci    ({ \
4183d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
4193d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
4203d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
4213d0407baSopenharmony_ci        if (__argc == 0) { \
4223d0407baSopenharmony_ci            __ret = imfill_t(buf, rect, color, 1); \
4233d0407baSopenharmony_ci        } else if (__argc == 1){ \
4243d0407baSopenharmony_ci            __ret = imfill_t(buf, rect, color, (int)__args[RGA_GET_MIN(__argc, 0)]); \
4253d0407baSopenharmony_ci        } else { \
4263d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
4273d0407baSopenharmony_ci            printf("invalid parameter\n"); \
4283d0407baSopenharmony_ci        } \
4293d0407baSopenharmony_ci        __ret; \
4303d0407baSopenharmony_ci    })
4313d0407baSopenharmony_ciIM_API IM_STATUS imfill_t(rga_buffer_t dst, im_rect rect, int color, int sync);
4323d0407baSopenharmony_ci
4333d0407baSopenharmony_ci/*
4343d0407baSopenharmony_ci * palette
4353d0407baSopenharmony_ci *
4363d0407baSopenharmony_ci * @param src
4373d0407baSopenharmony_ci * @param dst
4383d0407baSopenharmony_ci * @param lut
4393d0407baSopenharmony_ci * @param sync
4403d0407baSopenharmony_ci *      wait until operation complete
4413d0407baSopenharmony_ci *
4423d0407baSopenharmony_ci * @returns success or else negative error code.
4433d0407baSopenharmony_ci */
4443d0407baSopenharmony_ci#define impalette(src, dst, lut,  ...) \
4453d0407baSopenharmony_ci    ({ \
4463d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
4473d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
4483d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
4493d0407baSopenharmony_ci        if (__argc == 0) { \
4503d0407baSopenharmony_ci            __ret = impalette_t(src, dst, lut, 1); \
4513d0407baSopenharmony_ci        } else if (__argc == 1){ \
4523d0407baSopenharmony_ci            __ret = impalette_t(src, dst, lut, (int)__args[RGA_GET_MIN(__argc, 0)]); \
4533d0407baSopenharmony_ci        } else { \
4543d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
4553d0407baSopenharmony_ci            printf("invalid parameter\n"); \
4563d0407baSopenharmony_ci        } \
4573d0407baSopenharmony_ci        __ret; \
4583d0407baSopenharmony_ci    })
4593d0407baSopenharmony_ciIM_API IM_STATUS impalette_t(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t lut, int sync);
4603d0407baSopenharmony_ci
4613d0407baSopenharmony_ci/*
4623d0407baSopenharmony_ci * translate
4633d0407baSopenharmony_ci *
4643d0407baSopenharmony_ci * @param src
4653d0407baSopenharmony_ci * @param dst
4663d0407baSopenharmony_ci * @param x
4673d0407baSopenharmony_ci * @param y
4683d0407baSopenharmony_ci * @param sync
4693d0407baSopenharmony_ci *      wait until operation complete
4703d0407baSopenharmony_ci *
4713d0407baSopenharmony_ci * @returns success or else negative error code.
4723d0407baSopenharmony_ci */
4733d0407baSopenharmony_ci#define imtranslate(src, dst, x, y, ...) \
4743d0407baSopenharmony_ci    ({ \
4753d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
4763d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
4773d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
4783d0407baSopenharmony_ci        if (__argc == 0) { \
4793d0407baSopenharmony_ci            __ret = imtranslate_t(src, dst, x, y, 1); \
4803d0407baSopenharmony_ci        } else if (__argc == 1){ \
4813d0407baSopenharmony_ci            __ret = imtranslate_t(src, dst, x, y, (int)__args[RGA_GET_MIN(__argc, 0)]); \
4823d0407baSopenharmony_ci        } else { \
4833d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
4843d0407baSopenharmony_ci            printf("invalid parameter\n"); \
4853d0407baSopenharmony_ci        } \
4863d0407baSopenharmony_ci        __ret; \
4873d0407baSopenharmony_ci    })
4883d0407baSopenharmony_ciIM_API IM_STATUS imtranslate_t(const rga_buffer_t src, rga_buffer_t dst, int x, int y, int sync);
4893d0407baSopenharmony_ci
4903d0407baSopenharmony_ci/*
4913d0407baSopenharmony_ci * copy
4923d0407baSopenharmony_ci *
4933d0407baSopenharmony_ci * @param src
4943d0407baSopenharmony_ci * @param dst
4953d0407baSopenharmony_ci * @param sync
4963d0407baSopenharmony_ci *      wait until operation complete
4973d0407baSopenharmony_ci *
4983d0407baSopenharmony_ci * @returns success or else negative error code.
4993d0407baSopenharmony_ci */
5003d0407baSopenharmony_ci#define imcopy(src, dst, ...) \
5013d0407baSopenharmony_ci    ({ \
5023d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
5033d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
5043d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
5053d0407baSopenharmony_ci        if (__argc == 0) { \
5063d0407baSopenharmony_ci            __ret = imcopy_t(src, dst, 1); \
5073d0407baSopenharmony_ci        } else if (__argc == 1){ \
5083d0407baSopenharmony_ci            __ret = imcopy_t(src, dst, (int)__args[RGA_GET_MIN(__argc, 0)]); \
5093d0407baSopenharmony_ci        } else { \
5103d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
5113d0407baSopenharmony_ci            printf("invalid parameter\n"); \
5123d0407baSopenharmony_ci        } \
5133d0407baSopenharmony_ci        __ret; \
5143d0407baSopenharmony_ci    })
5153d0407baSopenharmony_ci
5163d0407baSopenharmony_ciIM_API IM_STATUS imcopy_t(const rga_buffer_t src, rga_buffer_t dst, int sync);
5173d0407baSopenharmony_ci
5183d0407baSopenharmony_ci/*
5193d0407baSopenharmony_ci * blend (SRC + DST -> DST or SRCA + SRCB -> DST)
5203d0407baSopenharmony_ci *
5213d0407baSopenharmony_ci * @param srcA
5223d0407baSopenharmony_ci * @param srcB can be NULL.
5233d0407baSopenharmony_ci * @param dst
5243d0407baSopenharmony_ci * @param mode
5253d0407baSopenharmony_ci *      IM_ALPHA_BLEND_MODE
5263d0407baSopenharmony_ci * @param sync
5273d0407baSopenharmony_ci *      wait until operation complete
5283d0407baSopenharmony_ci *
5293d0407baSopenharmony_ci * @returns success or else negative error code.
5303d0407baSopenharmony_ci */
5313d0407baSopenharmony_ci#define imblend(srcA, dst, ...) \
5323d0407baSopenharmony_ci    ({ \
5333d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
5343d0407baSopenharmony_ci        rga_buffer_t srcB; \
5353d0407baSopenharmony_ci        memset(&srcB, 0x00, sizeof(rga_buffer_t)); \
5363d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
5373d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
5383d0407baSopenharmony_ci        if (__argc == 0) { \
5393d0407baSopenharmony_ci            __ret = imblend_t(srcA, srcB, dst, IM_ALPHA_BLEND_SRC_OVER, 1); \
5403d0407baSopenharmony_ci        } else if (__argc == 1){ \
5413d0407baSopenharmony_ci            __ret = imblend_t(srcA, srcB, dst, (int)__args[RGA_GET_MIN(__argc, 0)], 1); \
5423d0407baSopenharmony_ci        } else if (__argc == 2){ \
5433d0407baSopenharmony_ci            __ret = imblend_t(srcA, srcB, dst, (int)__args[RGA_GET_MIN(__argc, 0)], (int)__args[RGA_GET_MIN(__argc, 1)]); \
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#define imcomposite(srcA, srcB, dst, ...) \
5513d0407baSopenharmony_ci    ({ \
5523d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
5533d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
5543d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
5553d0407baSopenharmony_ci        if (__argc == 0) { \
5563d0407baSopenharmony_ci            __ret = imblend_t(srcA, srcB, dst, IM_ALPHA_BLEND_SRC_OVER, 1); \
5573d0407baSopenharmony_ci        } else if (__argc == 1){ \
5583d0407baSopenharmony_ci            __ret = imblend_t(srcA, srcB, dst, (int)__args[RGA_GET_MIN(__argc, 0)], 1); \
5593d0407baSopenharmony_ci        } else if (__argc == 2){ \
5603d0407baSopenharmony_ci            __ret = imblend_t(srcA, srcB, dst, (int)__args[RGA_GET_MIN(__argc, 0)], (int)__args[RGA_GET_MIN(__argc, 1)]); \
5613d0407baSopenharmony_ci        } else { \
5623d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
5633d0407baSopenharmony_ci            printf("invalid parameter\n"); \
5643d0407baSopenharmony_ci        } \
5653d0407baSopenharmony_ci        __ret; \
5663d0407baSopenharmony_ci    })
5673d0407baSopenharmony_ciIM_API IM_STATUS imblend_t(const rga_buffer_t srcA, const rga_buffer_t srcB, rga_buffer_t dst, int mode, int sync);
5683d0407baSopenharmony_ci
5693d0407baSopenharmony_ci/*
5703d0407baSopenharmony_ci * color key
5713d0407baSopenharmony_ci *
5723d0407baSopenharmony_ci * @param src
5733d0407baSopenharmony_ci * @param dst
5743d0407baSopenharmony_ci * @param colorkey_range
5753d0407baSopenharmony_ci *      max color
5763d0407baSopenharmony_ci *      min color
5773d0407baSopenharmony_ci * @param sync
5783d0407baSopenharmony_ci *      wait until operation complete
5793d0407baSopenharmony_ci *
5803d0407baSopenharmony_ci * @returns success or else negative error code.
5813d0407baSopenharmony_ci */
5823d0407baSopenharmony_ci#define imcolorkey(src, dst, range, ...) \
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 = imcolorkey_t(src, dst, range, IM_ALPHA_COLORKEY_NORMAL, 1); \
5893d0407baSopenharmony_ci        } else if (__argc == 1){ \
5903d0407baSopenharmony_ci            __ret = imcolorkey_t(src, dst, range, (int)__args[RGA_GET_MIN(__argc, 0)], 1); \
5913d0407baSopenharmony_ci        } else if (__argc == 2){ \
5923d0407baSopenharmony_ci            __ret = imcolorkey_t(src, dst, range, (int)__args[RGA_GET_MIN(__argc, 0)], (int)__args[RGA_GET_MIN(__argc, 1)]); \
5933d0407baSopenharmony_ci        } else { \
5943d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
5953d0407baSopenharmony_ci            printf("invalid parameter\n"); \
5963d0407baSopenharmony_ci        } \
5973d0407baSopenharmony_ci        __ret; \
5983d0407baSopenharmony_ci    })
5993d0407baSopenharmony_ciIM_API IM_STATUS imcolorkey_t(const rga_buffer_t src, rga_buffer_t dst, im_colorkey_range range, int mode, int sync);
6003d0407baSopenharmony_ci
6013d0407baSopenharmony_ci/*
6023d0407baSopenharmony_ci * format convert
6033d0407baSopenharmony_ci *
6043d0407baSopenharmony_ci * @param src
6053d0407baSopenharmony_ci * @param dst
6063d0407baSopenharmony_ci * @param sfmt
6073d0407baSopenharmony_ci * @param dfmt
6083d0407baSopenharmony_ci * @param mode
6093d0407baSopenharmony_ci *      color space mode: IM_COLOR_SPACE_MODE
6103d0407baSopenharmony_ci * @param sync
6113d0407baSopenharmony_ci *      wait until operation complete
6123d0407baSopenharmony_ci *
6133d0407baSopenharmony_ci * @returns success or else negative error code.
6143d0407baSopenharmony_ci */
6153d0407baSopenharmony_ci#define imcvtcolor(src, dst, sfmt, dfmt, ...) \
6163d0407baSopenharmony_ci    ({ \
6173d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
6183d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
6193d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
6203d0407baSopenharmony_ci        if (__argc == 0) { \
6213d0407baSopenharmony_ci            __ret = imcvtcolor_t(src, dst, sfmt, dfmt, IM_COLOR_SPACE_DEFAULT, 1); \
6223d0407baSopenharmony_ci        } else if (__argc == 1){ \
6233d0407baSopenharmony_ci            __ret = imcvtcolor_t(src, dst, sfmt, dfmt, (int)__args[RGA_GET_MIN(__argc, 0)], 1); \
6243d0407baSopenharmony_ci        } else if (__argc == 2){ \
6253d0407baSopenharmony_ci            __ret = imcvtcolor_t(src, dst, sfmt, dfmt, (int)__args[RGA_GET_MIN(__argc, 0)], (int)__args[RGA_GET_MIN(__argc, 1)]); \
6263d0407baSopenharmony_ci        } else { \
6273d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
6283d0407baSopenharmony_ci            printf("invalid parameter\n"); \
6293d0407baSopenharmony_ci        } \
6303d0407baSopenharmony_ci        __ret; \
6313d0407baSopenharmony_ci    })
6323d0407baSopenharmony_ci
6333d0407baSopenharmony_ciIM_API IM_STATUS imcvtcolor_t(rga_buffer_t src, rga_buffer_t dst, int sfmt, int dfmt, int mode, int sync);
6343d0407baSopenharmony_ci
6353d0407baSopenharmony_ci/*
6363d0407baSopenharmony_ci * nn quantize
6373d0407baSopenharmony_ci *
6383d0407baSopenharmony_ci * @param src
6393d0407baSopenharmony_ci * @param dst
6403d0407baSopenharmony_ci * @param nninfo
6413d0407baSopenharmony_ci * @param sync
6423d0407baSopenharmony_ci *      wait until operation complete
6433d0407baSopenharmony_ci *
6443d0407baSopenharmony_ci * @returns success or else negative error code.
6453d0407baSopenharmony_ci */
6463d0407baSopenharmony_ci#define imquantize(src, dst, nn_info, ...) \
6473d0407baSopenharmony_ci    ({ \
6483d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
6493d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
6503d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
6513d0407baSopenharmony_ci        if (__argc == 0) { \
6523d0407baSopenharmony_ci            __ret = imquantize_t(src, dst, nn_info, 1); \
6533d0407baSopenharmony_ci        } else if (__argc == 1){ \
6543d0407baSopenharmony_ci            __ret = imquantize_t(src, dst, nn_info, (int)__args[RGA_GET_MIN(__argc, 0)]); \
6553d0407baSopenharmony_ci        } else { \
6563d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
6573d0407baSopenharmony_ci            printf("invalid parameter\n"); \
6583d0407baSopenharmony_ci        } \
6593d0407baSopenharmony_ci        __ret; \
6603d0407baSopenharmony_ci    })
6613d0407baSopenharmony_ci
6623d0407baSopenharmony_ciIM_API IM_STATUS imquantize_t(const rga_buffer_t src, rga_buffer_t dst, im_nn_t nn_info, int sync);
6633d0407baSopenharmony_ci
6643d0407baSopenharmony_ci/*
6653d0407baSopenharmony_ci * ROP
6663d0407baSopenharmony_ci *
6673d0407baSopenharmony_ci * @param src
6683d0407baSopenharmony_ci * @param dst
6693d0407baSopenharmony_ci * @param rop_code
6703d0407baSopenharmony_ci * @param sync
6713d0407baSopenharmony_ci *      wait until operation complete
6723d0407baSopenharmony_ci *
6733d0407baSopenharmony_ci * @returns success or else negative error code.
6743d0407baSopenharmony_ci */
6753d0407baSopenharmony_ci#define imrop(src, dst, rop_code, ...) \
6763d0407baSopenharmony_ci    ({ \
6773d0407baSopenharmony_ci        IM_STATUS __ret = IM_STATUS_SUCCESS; \
6783d0407baSopenharmony_ci        int __args[] = {__VA_ARGS__}; \
6793d0407baSopenharmony_ci        int __argc = sizeof(__args)/sizeof(int); \
6803d0407baSopenharmony_ci        if (__argc == 0) { \
6813d0407baSopenharmony_ci            __ret = imrop_t(src, dst, rop_code, 1); \
6823d0407baSopenharmony_ci        } else if (__argc == 1){ \
6833d0407baSopenharmony_ci            __ret = imrop_t(src, dst, rop_code, (int)__args[RGA_GET_MIN(__argc, 0)]); \
6843d0407baSopenharmony_ci        } else { \
6853d0407baSopenharmony_ci            __ret = IM_STATUS_INVALID_PARAM; \
6863d0407baSopenharmony_ci            printf("invalid parameter\n"); \
6873d0407baSopenharmony_ci        } \
6883d0407baSopenharmony_ci        __ret; \
6893d0407baSopenharmony_ci    })
6903d0407baSopenharmony_ciIM_API IM_STATUS imrop_t(const rga_buffer_t src, rga_buffer_t dst, int rop_code, int sync);
6913d0407baSopenharmony_ci
6923d0407baSopenharmony_ci/*
6933d0407baSopenharmony_ci * MOSAIC
6943d0407baSopenharmony_ci *
6953d0407baSopenharmony_ci * @param src
6963d0407baSopenharmony_ci * @param dst
6973d0407baSopenharmony_ci * @param mosaic_mode
6983d0407baSopenharmony_ci * @param sync
6993d0407baSopenharmony_ci *      wait until operation complete
7003d0407baSopenharmony_ci *
7013d0407baSopenharmony_ci * @returns success or else negative error code.
7023d0407baSopenharmony_ci */
7033d0407baSopenharmony_ciIM_API IM_STATUS immosaic(const rga_buffer_t image, im_rect rect, int mosaic_mode, int sync);
7043d0407baSopenharmony_ci
7053d0407baSopenharmony_ci/*
7063d0407baSopenharmony_ci * OSD
7073d0407baSopenharmony_ci *
7083d0407baSopenharmony_ci * @param osd
7093d0407baSopenharmony_ci *      osd block
7103d0407baSopenharmony_ci * @param dst
7113d0407baSopenharmony_ci *      background image
7123d0407baSopenharmony_ci * @param osd_rect
7133d0407baSopenharmony_ci * @param osd_config
7143d0407baSopenharmony_ci *      osd mode config
7153d0407baSopenharmony_ci * @param sync
7163d0407baSopenharmony_ci *      wait until operation complete
7173d0407baSopenharmony_ci *
7183d0407baSopenharmony_ci * @returns success or else negative error code.
7193d0407baSopenharmony_ci */
7203d0407baSopenharmony_ciIM_API IM_STATUS imosd(const rga_buffer_t osd,const rga_buffer_t dst,
7213d0407baSopenharmony_ci                       const im_rect osd_rect, im_osd_t *osd_config, int sync);
7223d0407baSopenharmony_ci
7233d0407baSopenharmony_ci/*
7243d0407baSopenharmony_ci * process
7253d0407baSopenharmony_ci *
7263d0407baSopenharmony_ci * @param src
7273d0407baSopenharmony_ci * @param dst
7283d0407baSopenharmony_ci * @param usage
7293d0407baSopenharmony_ci * @param ...
7303d0407baSopenharmony_ci *      wait until operation complete
7313d0407baSopenharmony_ci *
7323d0407baSopenharmony_ci * @returns success or else negative error code.
7333d0407baSopenharmony_ci */
7343d0407baSopenharmony_ciIM_API IM_STATUS improcess(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
7353d0407baSopenharmony_ci                        im_rect srect, im_rect drect, im_rect prect, int usage);
7363d0407baSopenharmony_ci
7373d0407baSopenharmony_ci/*
7383d0407baSopenharmony_ci * block until all execution is complete
7393d0407baSopenharmony_ci *
7403d0407baSopenharmony_ci * @returns success or else negative error code.
7413d0407baSopenharmony_ci */
7423d0407baSopenharmony_ciIM_API IM_STATUS imsync(int out_fence_fd);
7433d0407baSopenharmony_ci
7443d0407baSopenharmony_ci/*
7453d0407baSopenharmony_ci * config
7463d0407baSopenharmony_ci *
7473d0407baSopenharmony_ci * @param name
7483d0407baSopenharmony_ci *      enum IM_CONFIG_NAME
7493d0407baSopenharmony_ci * @param value
7503d0407baSopenharmony_ci *
7513d0407baSopenharmony_ci * @returns success or else negative error code.
7523d0407baSopenharmony_ci */
7533d0407baSopenharmony_ciIM_API IM_STATUS imconfig(IM_CONFIG_NAME name, uint64_t value);
7543d0407baSopenharmony_ci
7553d0407baSopenharmony_ciIM_API im_ctx_id_t imbegin(uint32_t flags);
7563d0407baSopenharmony_ci
7573d0407baSopenharmony_ciIM_API IM_STATUS imcancel(im_ctx_id_t id);
7583d0407baSopenharmony_ci
7593d0407baSopenharmony_ci#ifdef __cplusplus
7603d0407baSopenharmony_ci}
7613d0407baSopenharmony_ci#endif
7623d0407baSopenharmony_ci#endif /* _im2d_h_ */
7633d0407baSopenharmony_ci
764