370 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			370 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /**
 | |
|     @brief Header file of gfx module.\n
 | |
|     This file contains the functions which is related to gfx in the chip.
 | |
| 
 | |
|     @file hd_gfx.h
 | |
| 
 | |
|     @ingroup mhdal
 | |
| 
 | |
|     @note Nothing.
 | |
| 
 | |
|     Copyright Novatek Microelectronics Corp. 2018.  All rights reserved.
 | |
| */
 | |
| 
 | |
| #ifndef _HD_GFX_H_
 | |
| #define _HD_GFX_H_
 | |
| 
 | |
| /********************************************************************
 | |
|     INCLUDE FILES
 | |
|  *******************************************************************/
 | |
| #include "hd_type.h"
 | |
| #include "hd_util.h"
 | |
| 
 | |
| /********************************************************************
 | |
|     MACRO CONSTANT DEFINITIONS
 | |
|  *******************************************************************/
 | |
| 
 | |
| #define HD_GFX_MAX_PLANE_NUM                 3
 | |
| #define HD_GFX_MAX_MULTI_OUT_NUM             3
 | |
| 
 | |
| /********************************************************************
 | |
|     MACRO FUNCTION DEFINITIONS
 | |
|  *******************************************************************/
 | |
| 
 | |
| /********************************************************************
 | |
|     TYPE DEFINITION
 | |
|  *******************************************************************/
 | |
| /**
 | |
| 	Job list handle
 | |
| */
 | |
| typedef UINT32 HD_GFX_HANDLE;
 | |
| 
 | |
| /**
 | |
| 	algorithm and quality for scale
 | |
| */
 | |
| typedef enum _HD_GFX_SCALE_QUALITY {
 | |
| 	HD_GFX_SCALE_QUALITY_NULL = 0,
 | |
| 	HD_GFX_SCALE_QUALITY_BICUBIC,
 | |
| 	HD_GFX_SCALE_QUALITY_BILINEAR,
 | |
| 	HD_GFX_SCALE_QUALITY_NEAREST,
 | |
| 	HD_GFX_SCALE_QUALITY_INTEGRATION,
 | |
| 	HD_GFX_SCALE_QUALITY_MAX,
 | |
| 	ENUM_DUMMY4WORD(HD_GFX_SCALE_QUALITY)
 | |
| } HD_GFX_SCALE_QUALITY;
 | |
| 
 | |
| /**
 | |
| 	select a solid or a hollow rectangle
 | |
| */
 | |
| typedef enum _HD_GFX_RECT_TYPE {
 | |
| 	HD_GFX_RECT_SOLID = 0,
 | |
| 	HD_GFX_RECT_HOLLOW,
 | |
| 	HD_GFX_RECT_MAX,
 | |
| 	ENUM_DUMMY4WORD(HD_GFX_RECT_TYPE)
 | |
| } HD_GFX_RECT_TYPE;
 | |
| 
 | |
| /**
 | |
| 	select arithmetic operation
 | |
| */
 | |
| typedef enum _HD_GFX_ARITH_OP{
 | |
| 	HD_GFX_ARITH_OP_NULL = 0,
 | |
| 	HD_GFX_ARITH_OP_PLUS,
 | |
| 	HD_GFX_ARITH_OP_MINUS,
 | |
| 	HD_GFX_ARITH_OP_MULTIPLY,
 | |
| 	HD_GFX_ARITH_OP_MAX,
 | |
| 	ENUM_DUMMY4WORD(HD_GFX_ARITH_OP)
 | |
| } HD_GFX_ARITH_OP;
 | |
| 
 | |
| /**
 | |
| 	Job list operation
 | |
| */
 | |
| typedef enum _HD_GFX_OP{
 | |
| 	HD_GFX_OP_NULL = 0,
 | |
| 	HD_GFX_OP_CROP,
 | |
| 	HD_GFX_OP_COPY,
 | |
| 	HD_GFX_OP_SCALE,
 | |
| 	HD_GFX_OP_ROTATE,
 | |
| 	HD_GFX_OP_COLOR_TRANSFORM,
 | |
| 	HD_GFX_OP_DRAW_LINE,
 | |
| 	HD_GFX_OP_DRAW_RECT,
 | |
| 	HD_GFX_OP_ARITHMETIC,
 | |
| 	HD_GFX_OP_AFFINE,
 | |
| 	HD_GFX_OP_MAX,
 | |
| 	ENUM_DUMMY4WORD(HD_GFX_OP)
 | |
| } HD_GFX_OP;
 | |
| 
 | |
| /**
 | |
|      source and destination images.
 | |
| */
 | |
| typedef struct _HD_GFX_IMG_BUF {
 | |
| 	HD_DIM              dim;                              ///< image dimension
 | |
| 	HD_VIDEO_PXLFMT     format;                           ///< image format
 | |
| 	UINT32              p_phy_addr[HD_GFX_MAX_PLANE_NUM]; ///< image buffers
 | |
| 	UINT32              lineoffset[HD_GFX_MAX_PLANE_NUM]; ///< length in byte of p_phy_addr[]
 | |
| 	UINT8               ddr_id;                           ///< from which ddr is p_phy_addr[] allocated
 | |
| 	UINT32              palette[16];                      ///< for HD_VIDEO_PXLFMT_I1/2/4 images
 | |
| } HD_GFX_IMG_BUF;
 | |
| 
 | |
| /**
 | |
|      parameters for hd_gfx_copy.
 | |
| */
 | |
| typedef struct _HD_GFX_COPY {
 | |
| 	HD_GFX_IMG_BUF          src_img;    ///< source image
 | |
| 	HD_GFX_IMG_BUF          dst_img;    ///< destination image
 | |
| 	HD_IRECT                src_region; ///< which part of source image to copy
 | |
| 	HD_IPOINT               dst_pos;    ///< paste origin
 | |
| 	UINT32                  colorkey;   ///< which source color should be transparent
 | |
| 	UINT32                  alpha;      ///< alpha value of source image
 | |
| } HD_GFX_COPY;
 | |
| 
 | |
| /**
 | |
|      parameters for hd_gfx_scale.
 | |
| */
 | |
| typedef struct _HD_GFX_SCALE {
 | |
| 	HD_GFX_IMG_BUF          src_img;    ///< source image
 | |
| 	HD_GFX_IMG_BUF          dst_img;    ///< destination image
 | |
| 	HD_IRECT                src_region; ///< which part of source image to scale
 | |
| 	HD_IRECT                dst_region; ///< paste rectangle
 | |
| 	HD_GFX_SCALE_QUALITY    quality;    ///< select scale algorithm
 | |
| } HD_GFX_SCALE;
 | |
| 
 | |
| /**
 | |
|      parameters for hd_gfx_rotate.
 | |
| */
 | |
| typedef struct _HD_GFX_ROTATE {
 | |
| 	HD_GFX_IMG_BUF          src_img;    ///< source image
 | |
| 	HD_GFX_IMG_BUF          dst_img;    ///< destination image
 | |
| 	HD_IRECT                src_region; ///< which part of source image to rotate
 | |
| 	HD_IPOINT               dst_pos;    ///< paste origin
 | |
| 	UINT32                  angle;      ///< rotate angle
 | |
| } HD_GFX_ROTATE;
 | |
| 
 | |
| /**
 | |
|      parameters for hd_gfx_color_transform.
 | |
| */
 | |
| typedef struct _HD_GFX_COLOR_TRANSFORM {
 | |
| 	HD_GFX_IMG_BUF          src_img;                              ///< source image
 | |
| 	HD_GFX_IMG_BUF          dst_img;                              ///< destination image
 | |
| 	UINT32                  p_tmp_buf;                            ///< transformation between certain formats needs extra buffer
 | |
| 	UINT32                  tmp_buf_size;                         ///< length of p_tmp_buf
 | |
| 	UINT32                  p_lookup_table[HD_GFX_MAX_PLANE_NUM]; ///< for advancing palette tranform
 | |
| } HD_GFX_COLOR_TRANSFORM;
 | |
| 
 | |
| /**
 | |
|      parameters for hd_gfx_draw_line.
 | |
| */
 | |
| typedef struct _HD_GFX_DRAW_LINE {
 | |
| 	HD_GFX_IMG_BUF          dst_img;   ///< destination image
 | |
| 	UINT32                  color;     ///< line color
 | |
| 	HD_UPOINT               start;     ///< coordinate of start point
 | |
| 	HD_UPOINT               end;       ///< coordinate of end point
 | |
| 	UINT32                  thickness; ///< border size
 | |
| } HD_GFX_DRAW_LINE;
 | |
| 
 | |
| /**
 | |
|      parameters for hd_gfx_draw_rect.
 | |
| */
 | |
| typedef struct _HD_GFX_DRAW_RECT {
 | |
| 	HD_GFX_IMG_BUF          dst_img;   ///< destination image
 | |
| 	UINT32                  color;     ///< rectangle color
 | |
| 	HD_IRECT                rect;      ///< coordinate and dimension
 | |
| 	HD_GFX_RECT_TYPE        type;      ///< solid or hollow rectangle
 | |
| 	UINT32                  thickness; ///< border size for hollow rectangle
 | |
| } HD_GFX_DRAW_RECT;
 | |
| 
 | |
| /**
 | |
|      parameters for hd_gfx_arithmetic.
 | |
| */
 | |
| typedef struct _HD_GFX_ARITHMETIC {
 | |
| 	UINT32                  p_op1;     ///< array of operands 1
 | |
| 	UINT32                  p_op2;     ///< array of operands 2
 | |
| 	UINT32                  p_out;     ///< output array
 | |
| 	UINT32                  size;      ///< how many elements in array
 | |
| 	HD_GFX_ARITH_OP         operation; ///< +, -, *, /
 | |
| 	UINT32                  bits;      ///< op is 8 bits or 16 bits
 | |
| } HD_GFX_ARITHMETIC;
 | |
| 
 | |
| /**
 | |
|      parameters for hd_gfx_affine.
 | |
| */
 | |
| typedef struct _HD_GFX_AFFINE {
 | |
| 	HD_GFX_IMG_BUF          src_img; ///< source image
 | |
| 	HD_GFX_IMG_BUF          dst_img; ///< destination image
 | |
| 	float                   coeff_a; ///< coefficient a
 | |
| 	float                   coeff_b; ///< coefficient b
 | |
| 	float                   coeff_c; ///< coefficient c
 | |
| 	float                   coeff_d; ///< coefficient d
 | |
| 	float                   coeff_e; ///< coefficient e
 | |
| 	float                   coeff_f; ///< coefficient f
 | |
| } HD_GFX_AFFINE;
 | |
| 
 | |
| /********************************************************************
 | |
|     EXTERN VARIABLES & FUNCTION PROTOTYPES DECLARATIONS
 | |
| ********************************************************************/
 | |
| 
 | |
| /**
 | |
|  * @brief Init gfx framework.
 | |
|  */
 | |
| HD_RESULT hd_gfx_init(VOID);
 | |
| 
 | |
| /**
 | |
|  * @brief Uninit gfx framework.
 | |
|  */
 | |
| HD_RESULT hd_gfx_uninit(VOID);
 | |
| 
 | |
| /**
 | |
|     Copy a portion of source image to destination image.
 | |
| 
 | |
|     @param src_img: configuration of source image.
 | |
|     @param src_region: which part of source image to copy.
 | |
|     @param dst_img: configuration of destination image.
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_crop_img(HD_GFX_IMG_BUF src_img, HD_IRECT src_region, HD_GFX_IMG_BUF dst_img);
 | |
| 
 | |
| /**
 | |
|     copy two-dimensional images.
 | |
| 
 | |
|     @param p_param: parameter for copy operation.
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_copy(HD_GFX_COPY *p_param);
 | |
| 
 | |
| /**
 | |
|     scale up/down an image.
 | |
| 
 | |
|     @param p_param: parameter for scale operation.
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_scale(HD_GFX_SCALE *p_param);
 | |
| 
 | |
| /**
 | |
|     rotate an image.
 | |
| 
 | |
|     @param p_param: parameter for rotate operation.
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_rotate(HD_GFX_ROTATE *p_param);
 | |
| 
 | |
| /**
 | |
|     change an image's format(e.g. transform a rgb image to yuv image).
 | |
| 
 | |
|     @param p_param: parameter for transform operation.
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_color_transform(HD_GFX_COLOR_TRANSFORM *p_param);
 | |
| 
 | |
| /**
 | |
|     draw a line on an image.
 | |
| 
 | |
|     @param p_param: parameter for line drawing operation.
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_draw_line(HD_GFX_DRAW_LINE *p_param);
 | |
| 
 | |
| /**
 | |
|     draw a rectangle on an image.
 | |
| 
 | |
|     @param p_param: parameter for rectangle drawing operation.
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_draw_rect(HD_GFX_DRAW_RECT *p_param);
 | |
| 
 | |
| /**
 | |
|     create a job list.
 | |
| 
 | |
|     @param p_handle: created handle. should be used in subsequent job list API
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_begin_job(HD_GFX_HANDLE *p_handle);
 | |
| 
 | |
| /**
 | |
|     trigger all jobs in a list.
 | |
| 
 | |
|     @param handle: which job list to trigger
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_end_job(HD_GFX_HANDLE handle);
 | |
| 
 | |
| /**
 | |
|     cancel all jobs in a list.
 | |
| 
 | |
|     @param handle: which job list to cancel
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_cancel_job(HD_GFX_HANDLE handle);
 | |
| 
 | |
| /**
 | |
|     append a new job to a list.
 | |
| 
 | |
|     @param handle: which job list to append new job
 | |
|     @param op: type of the new job
 | |
|     @param p_param: detailed configuration of the new job
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_add_job(HD_GFX_HANDLE handle, HD_GFX_OP op, void *p_param);
 | |
| 
 | |
| /**
 | |
|     append all line drawing jobs in an array to a list.
 | |
| 
 | |
|     @param handle: which job list to append new line drawing job
 | |
|     @param param: array of new line drawing jobs
 | |
|     @param num: element number of param
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_add_draw_line_list(HD_GFX_HANDLE handle, HD_GFX_DRAW_LINE param[], UINT32 num);
 | |
| 
 | |
| /**
 | |
|     append all rectangle drawing jobs in an array to a list.
 | |
| 
 | |
|     @param handle: which job list to append new rectangle drawing job
 | |
|     @param param: array of new rectangle drawing jobs
 | |
|     @param num: element number of param
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_add_draw_rect_list(HD_GFX_HANDLE handle, HD_GFX_DRAW_RECT param[], UINT32 num);
 | |
| 
 | |
| /**
 | |
|     copy 1-dimensional arrays.
 | |
| 
 | |
|     @param dest: destination buffer
 | |
|     @param src: source buffer
 | |
|     @param n: data length in byte to copy
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| void *hd_gfx_memcpy(UINT32 dest, const UINT32 src, size_t n);
 | |
| 
 | |
| /**
 | |
|     use specific hardware to do add, minus, multiply, divide on two arrays.
 | |
| 
 | |
|     @param p_param: parameters for arithmetic operation.
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_arithmetic(HD_GFX_ARITHMETIC *p_param);
 | |
| 
 | |
| /**
 | |
|     apply affine effect to an image.
 | |
| 
 | |
|     @param p_param: parameter for affine operation.
 | |
| 
 | |
|     @return HD_OK for success, other value indicates an error.
 | |
| */
 | |
| HD_RESULT hd_gfx_affine(HD_GFX_AFFINE *p_param);
 | |
| 
 | |
| #endif //_HD_GFX_H_
 | |
| 
 | 
