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