This is an automated email from the ASF dual-hosted git repository. pkarashchenko pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit e867b84458ac8f75a630397ffeb26f5a49167687 Author: SPRESENSE <[email protected]> AuthorDate: Tue Feb 14 17:36:08 2023 +0900 boards: cxd56_imageproc: Change alpha blend interface - Remove unnecessary member - Some member changed to appropriate type - Add usage description --- boards/arm/cxd56xx/common/src/cxd56_imageproc.c | 20 +++-- .../cxd56xx/spresense/include/cxd56_imageproc.h | 85 +++++++++++++--------- 2 files changed, 63 insertions(+), 42 deletions(-) diff --git a/boards/arm/cxd56xx/common/src/cxd56_imageproc.c b/boards/arm/cxd56xx/common/src/cxd56_imageproc.c index 2622406611..7a16712be2 100644 --- a/boards/arm/cxd56xx/common/src/cxd56_imageproc.c +++ b/boards/arm/cxd56xx/common/src/cxd56_imageproc.c @@ -499,10 +499,10 @@ static void *get_blendarea(imageproc_imginfo_t *imginfo, int offset) return imginfo->img.p_u8 + offset; case IMAGEPROC_IMGTYPE_16BPP: - return imginfo->img.p_u16 + offset; + return imginfo->img.p_u8 + (offset * 2); - case IMAGEPROC_IMGTYPE_BINARY: - return imginfo->img.binary.p_u8 + offset / 8; + case IMAGEPROC_IMGTYPE_1BPP: + return imginfo->img.binary.p_u8 + (offset / 8); default: return NULL; @@ -833,11 +833,11 @@ int imageproc_alpha_blend(imageproc_imginfo_t *dst, switch (alpha->type) { case IMAGEPROC_IMGTYPE_SINGLE: - fixed_alpha = 0x0800 | (uint8_t)alpha->img.single; + fixed_alpha = 0x0800 | alpha->img.single; break; - case IMAGEPROC_IMGTYPE_BINARY: - fixed_alpha = (uint8_t)alpha->img.binary.multiplier; + case IMAGEPROC_IMGTYPE_1BPP: + fixed_alpha = alpha->img.binary.multiplier; options |= ALPHA1BPP; break; @@ -855,8 +855,14 @@ int imageproc_alpha_blend(imageproc_imginfo_t *dst, switch (src->type) { case IMAGEPROC_IMGTYPE_SINGLE: + + /* WORKAROUND: Hardware can take Y and Cb but Cr is not. + * So it can not use full color. + * Allow only Y value to use fixed src color. (monotone) + */ + options |= FIXEDSRC; - fixed_src = src->img.single; + fixed_src = (uint16_t)src->img.single << 8 | 0x80 ; break; case IMAGEPROC_IMGTYPE_16BPP: diff --git a/boards/arm/cxd56xx/spresense/include/cxd56_imageproc.h b/boards/arm/cxd56xx/spresense/include/cxd56_imageproc.h index 25299388b1..c9ba10a4d1 100644 --- a/boards/arm/cxd56xx/spresense/include/cxd56_imageproc.h +++ b/boards/arm/cxd56xx/spresense/include/cxd56_imageproc.h @@ -54,9 +54,10 @@ typedef struct imageproc_rect_s imageproc_rect_t; enum imageproc_imginfo_e { IMAGEPROC_IMGTYPE_SINGLE = 0, /* All pixels have the same value */ - IMAGEPROC_IMGTYPE_BINARY = 1, /* Each pixels have 0 or specific non-zero value */ - IMAGEPROC_IMGTYPE_8BPP = 2, /* Each pixels have 8bit value */ - IMAGEPROC_IMGTYPE_16BPP = 3, /* Each pixels have 16bit value */ + IMAGEPROC_IMGTYPE_1BPP = 1, /* 1 bit per pixel */ + IMAGEPROC_IMGTYPE_BINARY = 1, /* deprecated, use 1BPP instead. */ + IMAGEPROC_IMGTYPE_8BPP = 2, /* 8 bits per pixel */ + IMAGEPROC_IMGTYPE_16BPP = 3, /* 16 bits per pixel */ }; /* Structure of binary image */ @@ -64,7 +65,7 @@ enum imageproc_imginfo_e struct imageproc_binary_img_s { uint8_t *p_u8; /* 1bpp image */ - int multiplier; /* specific non-zero value */ + uint8_t multiplier; /* alpha value (255 = 100% src, 0 = 0%) */ }; typedef struct imageproc_binary_img_s imageproc_binary_img_t; @@ -72,16 +73,15 @@ typedef struct imageproc_binary_img_s imageproc_binary_img_t; struct imageproc_imginfo_s { - enum imageproc_imginfo_e type; /* Type of image data */ - int w; /* width of total image */ - int h; /* height of total image */ - imageproc_rect_t *rect; /* clipped rectangle */ + enum imageproc_imginfo_e type; /* Type of image data */ + int w; /* Image width */ + int h; /* Image height */ + imageproc_rect_t *rect; /* Clipping rectangle */ union { - int single; /* type = IMAGEPROC_IMGTYPE_SINGLE */ - imageproc_binary_img_t binary; /* type = IMAGEPROC_IMGTYPE_BINARY */ - uint8_t *p_u8; /* type = IMAGEPROC_IMGTYPE_8BPP */ - uint16_t *p_u16; /* type = IMAGEPROC_IMGTYPE_16BPP */ + uint8_t single; /* for IMAGEPROC_IMGTYPE_SINGLE */ + imageproc_binary_img_t binary; /* for IMAGEPROC_IMGTYPE_1BPP */ + uint8_t *p_u8; /* for IMAGEPROC_IMGTYPE_{8,16}BPP */ } img; }; typedef struct imageproc_imginfo_s imageproc_imginfo_t; @@ -111,7 +111,7 @@ void imageproc_finalize(void); * return 0 on success, otherwise error code. */ -int imageproc_convert_yuv2rgb(uint8_t * ibuf, uint32_t hsize, +int imageproc_convert_yuv2rgb(uint8_t *ibuf, uint32_t hsize, uint32_t vsize); /* Convert color format (RGB to YUV) @@ -123,7 +123,7 @@ int imageproc_convert_yuv2rgb(uint8_t * ibuf, uint32_t hsize, * return 0 on success, otherwise error code. */ -int imageproc_convert_rgb2yuv(uint8_t * ibuf, uint32_t hsize, +int imageproc_convert_rgb2yuv(uint8_t *ibuf, uint32_t hsize, uint32_t vsize); /* Convert color format (YUV to grayscale) @@ -136,7 +136,7 @@ int imageproc_convert_rgb2yuv(uint8_t * ibuf, uint32_t hsize, * [in] vsize: Vertical size */ -void imageproc_convert_yuv2gray(uint8_t * ibuf, uint8_t * obuf, +void imageproc_convert_yuv2gray(uint8_t *ibuf, uint8_t *obuf, size_t hsize, size_t vsize); /* Resize image @@ -173,8 +173,8 @@ void imageproc_convert_yuv2gray(uint8_t * ibuf, uint8_t * obuf, * all of the pixels. */ -int imageproc_resize(uint8_t * ibuf, uint16_t ihsize, uint16_t ivsize, - uint8_t * obuf, uint16_t ohsize, uint16_t ovsize, +int imageproc_resize(uint8_t *ibuf, uint16_t ihsize, uint16_t ivsize, + uint8_t *obuf, uint16_t ohsize, uint16_t ovsize, int bpp); /* Clip and Resize image @@ -191,31 +191,46 @@ int imageproc_resize(uint8_t * ibuf, uint16_t ihsize, uint16_t ivsize, * return 0 on success, otherwise error code. */ -int imageproc_clip_and_resize(uint8_t * ibuf, uint16_t ihsize, - uint16_t ivsize, uint8_t * obuf, +int imageproc_clip_and_resize(uint8_t *ibuf, uint16_t ihsize, + uint16_t ivsize, uint8_t *obuf, uint16_t ohsize, uint16_t ovsize, int bpp, - imageproc_rect_t * clip_rect); + imageproc_rect_t *clip_rect); /* Execute alpha blending * - * Execute alpha blending. - * dst buffer is overwritten by blended image. + * dst image will be overwritten by src image masked with alpha. * * [in,out] dst: Destination image. * dst->type = IMAGEPROC_IMGTYPE_16BPP. - * [in] pos_x: x-coordinate of blended position. - * Minus value means - * the left of the destination image origin. - * [in] pos_y: y-coordinate of blended position. - * Minus value means - * the upper of the destination image origin. - * [in] src: Source image. - * src->type = IMAGEPROC_IMGTYPE_16BPP or - * IMAGEPROC_IMGTYPE_SINGLE. - * [in] alpha: Alpha plane. - * alpha->type = IMAGEPROC_IMGTYPE_SINGLE, - * IMAGEPROC_IMGTYPE_BINARY, - * or IMAGEPROC_IMGTYPE_8BPP. + * rect parameter can specify the blending area. + * + * [in] pos_x: x-coordinate of blending position from origin. + * Negative value is allowed, out of bounds src image will + * be clipped. + * [in] pos_y: y-coordinate of blending position from origin. + * Negative value is allowed, out of bounds src image will + * be clipped. + * [in] src: Source image can be input as following formats. + * + * - IMAGEPROC_IMGTYPE_16BPP + * - IMAGEPROC_IMGTYPE_SINGLE + * + * single image is emulated a fixed monotone color image + * without image buffer. + * [in] alpha: Alpha plane can be input as following formats. + * + * - IMAGEPROC_IMGTYPE_SINGLE + * - IMAGEPROC_IMGTYPE_1BPP + * - IMAGEPROC_IMGTYPE_8BPP + * + * SINGLE is specify a fixed alpha value (255 = 100%, + * 0 = 0%) applying whole image size. + * 1BPP is 1 bit per pixel map. 0 will be masked and 1 is + * blending with multiplier (255 = 100%). + * 1bpp bit order is LSB first. + * + * (0,0) (7,0) (x, y) + * 0x03 = |1|1|0|0|0|0|0|0| * * return 0 on success, otherwise error code. */
