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