软件加速
总体流程图
该流程图描绘了软件加速处理图像资源的流程。在处理图像时,根据图像的压缩状态和类型选择不同的处理方法:
覆盖 (cover): 将原始图像数据直接写入到帧缓冲区中的相应位置。不进行任何处理,只是直接覆盖。
旁路 (bypass): 将原始图像数据直接写入到帧缓冲区中的相应位置。旁路模式无法处理图像的透明度。它对整个图像应用全局不透明度值,从而影响整体透明度。在创建透明效果时,旁路模式相比源覆盖模式更占用空间。
滤黑 (Filter black): 滤波技术有效地从原始图像数据中筛选出像素值为零的像素数据,这意味着黑色像素不会被写入到帧缓冲区中。这种机制能够加快刷新速度。除黑色以外的任何颜色像素都会经过标准处理方法,并被记录到帧缓冲区中。
源覆盖 (Source_over): 一种混合方法,将图像的颜色数据和帧缓冲区像素的颜色数据结合起来,基于不透明度值 Sa 计算最终的颜色,并将其写入到帧缓冲区的相应位置。计算公式为 ((255 - Sa) * D + Sa * S) / 255,其中
Sa是原始图像的不透明度值,D是帧缓冲区的像素数据,S是源图像的像素数据。
软件加速
img_type可以从图像的头部中获得,图像头部的结构如下:
typedef struct gui_rgb_data_head
{
unsigned char scan : 1;
unsigned char align : 1;
unsigned char resize: 2; //0-no resize;1-50%(x&y);2-70%;3-80%
unsigned char compress: 1;
unsigned char jpeg: 1;
unsigned char idu: 1;
unsigned char png : 1;
char type;
short w;
short h;
char version;
char rsvd2;
} gui_rgb_data_head_t;
img_type的枚举值如下。如果值为IMDC_COMPRESS,则表示图像已压缩,并进入 RLE 处理流程;否则,进入无 RLE 处理流程。
/**
* GUI_FormatType
* Pixel and image format identifiers.
* Note: Bit indices refer to positions within the pixel word where bit0 is LSB.
*/
typedef enum
{
/* Packed RGB formats, pls refs def_color.h */
RGB565 = 0, /* 16-bit: bit[4:0] for Blue, bit[10:5] for Green, bit[15:11] for Red */
ARGB8565 = 1, /* 24-bit: bit[4:0] for Blue, bit[10:5] for Green, bit[15:11] for Red, bit[23:16] for Alpha, packed*/
RGB888 = 3, /* 24-bit: bit[7:0] for Blue, bit[15:8] for Green, bit[23:16] for Red */
ARGB8888 = 4, /* 32-bit: bit[7:0] for Blue, bit[15:8] for Green, bit[23:16] for Red, bit[31:24] for Alpha */
XRGB8888 = 5, /* 32-bit: bit[7:0] for Blue, bit[15:8] for Green, bit[23:16] for Red, bit[31:24] for X (unused or fixed 0xFF) */
/* Luma / mask / indexed formats */
BINARY = 6, /* 1-bit monochrome (black/white) */
GRAY = 7, /* Grayscale, 8 bits per pixel */
ALPHAMASK = 9, /* Alpha-only mask (default 8 bits) */
PALETTE = 10, /* Indexed color using a palette (CLUT) */
/* Encoded image container formats */
BMP = 11, /* BMP image file format */
JPEG = 12, /* JPEG image file format */
PNG = 13, /* PNG image file format */
GIF = 14, /* GIF image file format */
RTKARGB8565 = 15, /* Planar: [A 8bpp plane][RGB565 plane], not interleaved */
/* Grayscale subtypes (luminance only) */
GRAY1 = BINARY, /* 1 bpp grayscale (2 levels) */
GRAY2 = 0x21, /* 2 bpp grayscale (4 levels) */
GRAY4 = 0x22, /* 4 bpp grayscale (16 levels) */
GRAY8 = GRAY, /* 8 bpp grayscale (256 levels) */
A8 = 0x30, /* 8 bpp alpha (256 levels) */
A4 = 0x31, /* 4 bpp alpha (16 levels) */
A2 = 0x32, /* 2 bpp alpha (4 levels) */
A1 = 0x33, /* 1 bpp alpha (2 levels) */
X8 = 0x34, /* 8 bpp X (256 levels) */
X4 = 0x35, /* 4 bpp X (16 levels) */
X2 = 0x36, /* 2 bpp X (4 levels) */
X1 = 0x37, /* 1 bpp X (2 levels) */
I8 = 0x38, /* 8 bpp indexed (256 levels) */
I4 = 0x39, /* 4 bpp indexed (16 levels) */
I2 = 0x3a, /* 2 bpp indexed (4 levels) */
I1 = 0x3b, /* 1 bpp indexed (2 levels) */
} GUI_FormatType;
根据不同的混合模式
blend_mode执行相应的 blit 过程。
typedef enum
{
IMG_BYPASS_MODE = 0,
IMG_FILTER_BLACK,
IMG_SRC_OVER_MODE, //S * Sa + (1 - Sa) * D
IMG_COVER_MODE,
IMG_RECT,
IMG_2D_SW_RGB565_ONLY,
IMG_2D_SW_SRC_OVER_MODE, //S * Sa + (1 - Sa) * D
IMG_2D_SW_FIX_A8_FG, //fixed fg
IMG_2D_SW_FIX_A8_BGFG, //fixed fg and bg
IMG_PLUS_DARKER, //darken blend: min(blended, background)
IMG_A8_BLUR, //A8-shaped blur: blur the framebuffer under the image, masked by the A8 alpha
IMG_RASTER_HORIZONTAL, // ROI src-over horizontal direction
IMG_RASTER_VERTICAL, // ROI src-over vertical direction
IMG_SRC_MODE, //opaque write of source with RGB scaled by opacity_value (brightness), no background blend
} BLEND_MODE_TYPE;
当图像被压缩时,需要从压缩数据的地址中获取压缩头。该头部中的
algorithm_type参数包含了实际的图像类型。压缩图像的类型在imdc_src_type结构体中描述。
typedef struct imdc_file_header
{
struct
{
uint8_t algorithm: 2;
uint8_t feature_1: 2;
uint8_t feature_2: 2;
uint8_t pixel_bytes: 2;
} algorithm_type;
uint8_t reserved[3];
uint32_t raw_pic_width;
uint32_t raw_pic_height;
} imdc_file_header_t;
typedef enum
{
IMDC_SRC_1BIT = 0x00,
IMDC_SRC_2BIT = 0x01,
IMDC_SRC_4BIT = 0x02,
IMDC_SRC_8BIT = 0x03,
IMDC_SRC_16BIT = 0x04,
IMDC_SRC_24BIT = 0x05,
IMDC_SRC_32BIT = 0x06,
} imdc_src_type;
无 RLE 覆盖模式概述
以下流程描述了无 RLE 压缩图像的覆盖模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。
Cover Mode Path
如果矩阵是单位矩阵,则执行没有矩阵操作的 blit 过程;否则,执行具有矩阵操作的 blit 过程。
dc_bytes_per_pixel表示显示设备的像素字节数,计算方式为dc->bit_depth >> 3,其中bit_depth为显示设备的位深度。以位深度为 24 的显示设备为例,其像素字节数为 3。
无 RLE 覆盖模式(不带矩阵变换)
下面的流程图描述了将未压缩图像写入帧缓冲区的覆盖模式处理过程,以 RGB565 为目标设备图像类型为例。
Cover_blit_2_rgb565
无 RLE 覆盖模式(带矩阵变换)
下面的流程图描述了使用覆盖模式(带矩阵变换)将未压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。
Cover_matrix_blit_2_rgb565
无 RLE 旁路模式概述
以下流程描述了无 RLE 压缩图像的旁路模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。
Bypass_mode_path
如果矩阵是单位矩阵,则执行没有矩阵操作的 blit 过程;否则,执行具有矩阵操作的 blit 过程。
dc_bytes_per_pixel表示显示设备的像素字节数,计算方式为dc->bit_depth >> 3,其中bit_depth为显示设备的位深度。以位深度为 24 的显示设备为例,其像素字节数为 3。
无 RLE 旁路模式(不带矩阵变换)
下面的流程图描述了将未压缩图像写入帧缓冲区的旁路模式处理过程,以 RGB565 为目标设备图像类型为例。
Bypass_blit_2_rgb565
根据
img_type执行不同的处理步骤。基于
opacity_value执行相应的操作将图像像素写入帧缓冲区。
如果
opacity_value为 0,表示图像不显示,直接跳出处理流程。如果
opacity_value为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。如果
opacity_value介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。
无 RLE 旁路模式(带矩阵变换)
下面的流程图描述了使用混合模式(带矩阵变换)将未压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。
Bypass_matrix_blit_2_rgb565
根据
img_type执行不同的处理步骤。执行矩阵计算,将目标区域的写入点映射到图像像素,并获取图像像素的像素值。
基于
opacity_value执行相应的操作将图像像素写入帧缓冲区。如果
opacity_value为 0,表示图像不显示,直接跳出处理流程。如果
opacity_value为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。如果
opacity_value介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。
无 RLE 滤黑模式概述
以下流程描述了无 RLE 压缩图像的滤黑模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。
Filter_mode_path
无 RLE 滤黑模式(不带矩阵变换)
下面的流程图描述了将未压缩图像写入帧缓冲区的滤黑模式处理过程,以 RGB565 为目标设备图像类型为例。
Filter_blit_2_rgb565
根据
img_type执行不同的处理步骤。如果像素值为 0,则跳过处理;否则,执行后续写入操作。
基于
opacity_value执行相应的操作将图像像素写入帧缓冲区。如果
opacity_value为 0,表示图像不显示,直接跳出处理流程。如果
opacity_value为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。如果
opacity_value介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。
无 RLE 旁路模式(带矩阵变换)
下面的流程图描述了使用滤黑模式(带矩阵变换)将未压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。
Filter_matrix_blit_2_rgb565
根据
img_type执行不同的处理步骤。执行矩阵计算,将目标区域的写入点映射到图像像素,并获取图像像素的像素值。
如果像素值为 0,则跳过处理;否则,执行后续写入操作。
基于
opacity_value执行相应的操作将图像像素写入帧缓冲区。
如果
opacity_value为 0,表示图像不显示,直接跳出处理流程。如果
opacity_value为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。如果
opacity_value介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。
无 RLE 混合模式概述
以下流程描述了无 RLE 压缩图像的源覆盖模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。
Alpha_mode_path
无 RLE 混合覆盖模式(不带矩阵变换)
下面的流程图描述了将未压缩图像写入帧缓冲区的源覆盖模式处理过程,以 RGB565 为目标设备图像类型为例。
Alpha_blit_2_rgb565
基于 opacity_value 执行相应的操作将图像像素写入帧缓冲区。
如果
opacity_value为 0,表示图像不显示,直接跳出处理流程。如果
opacity_value为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。如果
opacity_value介于 0 和 255 之间,执行rgb565_fast_blending对源图像像素与相应的帧缓冲区像素进行混合,将混合结果写入帧缓冲区。
无 RLE 混合覆盖模式(带矩阵变换)
下面的流程图描述了使用源覆盖模式(带矩阵变换)将未压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。
Alpha_matrix_blit_2_rgb565
执行矩阵计算,将目标区域的写入点映射到图像像素,并获取图像像素的像素值。
基于
opacity_value执行相应的操作将图像像素写入帧缓冲区。
如果
opacity_value为 0,表示图像不显示,直接跳出处理流程。如果
opacity_value为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。如果
opacity_value介于 0 和 255 之间,执行rgb565_fast_blending对源图像像素与相应的帧缓冲区像素进行混合,将混合结果写入帧缓冲区。
RLE 覆盖模式概述
以下流程描述了 RLE 压缩图像的覆盖模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。
RLE_cover_mode_path
RLE 覆盖模式(不带矩阵变换)
下面的流程图描述了将压缩图像写入帧缓冲区的覆盖模式处理过程,以 RGB565 为目标设备图像类型为例。
RLE_cover_blit_2_rgb565
根据压缩数据头部的
img_type执行不同的处理步骤。对压缩图像数据进行解压。
将像素结果写入帧缓冲区。
RLE 覆盖模式(带矩阵变换)
下面的流程图描述了使用覆盖模式(带矩阵变换)将压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。
RLE_cover_matrix_blit_2_rgb565
根据压缩数据头部的
img_type执行不同的处理步骤。对压缩图像数据进行解压。
进行矩阵计算,将目标区域的写入点映射到图像像素,并获得图像像素的像素值。
将像素结果写入帧缓冲区。
RLE 旁路模式概述
以下流程描述了 RLE 压缩图像的旁路模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。
Rle_bypass_mode_path
RLE 旁路模式(不带矩阵变换)
下面的流程图描述了将旁路图像写入帧缓冲区的覆盖模式处理过程,以 RGB565 为目标设备图像类型为例。
RLE_bypass_blit_2_rgb565
根据压缩数据头部的
img_type执行不同的处理步骤。对压缩图像数据进行解压。
基于
opacity_value执行相应的操作将图像像素写入帧缓冲区。
如果
opacity_value为 0,表示图像不显示,直接跳出处理流程。如果
opacity_value为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。如果
opacity_value介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。
RLE 旁路模式(带矩阵变换)
下面的流程图描述了使用旁路模式(带矩阵变换)将压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。
RLE_bypass_matrix_blit_2_rgb565
根据压缩数据头部的
img_type执行不同的处理步骤。对压缩图像数据进行解压。
进行矩阵计算,将目标区域的写入点映射到图像像素,并获得图像像素的像素值。
基于
opacity_value执行相应的操作将图像像素写入帧缓冲区。
如果
opacity_value为 0,表示图像不显示,直接跳出处理流程。如果
opacity_value为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。如果
opacity_value介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。
RLE 滤黑模式概述
以下流程描述了 RLE 压缩图像的滤黑模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。
RLE_filter_mode_path
RLE 滤黑模式(不带矩阵变换)
下面的流程图描述了将压缩图像写入帧缓冲区的滤黑模式处理过程,以 RGB565 为目标设备图像类型为例。
RLE_filter_blit_2_rgb565
根据压缩数据头部的
img_type执行不同的处理步骤。对压缩图像数据进行解压。
如果像素值为 0,则跳过处理;否则,执行后续写入操作。
基于
opacity_value执行相应的操作将图像像素写入帧缓冲区。
如果
opacity_value为 0,表示图像不显示,直接跳出处理流程。如果
opacity_value为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。如果
opacity_value介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。
RLE 滤黑模式(带矩阵变换)
下面的流程图描述了使用滤黑模式(带矩阵变换)将压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。
RLE_filter_matrix_blit_2_rgb565
根据压缩数据头部的
img_type执行不同的处理步骤。对压缩图像数据进行解压。
进行矩阵计算,将目标区域的写入点映射到图像像素,并获得图像像素的像素值。
如果像素值为 0,则跳过处理;否则,执行后续写入操作。
基于
opacity_value执行相应的操作将图像像素写入帧缓冲区。
如果
opacity_value为 0,表示图像不显示,直接跳出处理流程。如果
opacity_value为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。如果
opacity_value介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。
RLE 混合模式概述
以下流程描述了 RLE 压缩图像的源覆盖模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。
RLE_alpha_mode_path
RLE 混合模式(不带矩阵变换)
下面的流程图描述了将压缩图像写入帧缓冲区的源覆盖模式处理过程,以 RGB565 为目标设备图像类型为例。
RLE_alpha_blit_2_rgb565
根据压缩数据头部的
img_type执行不同的处理步骤。对压缩图像数据进行解压。
基于
opacity_value执行相应的操作将图像像素写入帧缓冲区。
如果
opacity_value为 0,表示图像不显示,直接跳出处理流程。如果
opacity_value为 255,当源图像为 RGB565 格式时,直接将其写入帧缓冲区。否则,执行相应的混合操作,并将混合结果写入帧缓冲区。如果
opacity_value介于 0 和 255 之间,执行适当的混合操作来混合源图像像素与相应的帧缓冲区像素,将混合结果写入帧缓冲区。
RLE 源覆盖模式(带矩阵变换)
下面的流程图描述了使用源覆盖模式(带矩阵变换)将压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。
RLE_alpha_matrix_blit_2_rgb565
根据压缩数据头部的
img_type执行不同的处理步骤。对压缩图像数据进行解压。
进行矩阵计算,将目标区域的写入点映射到图像像素,并获得图像像素的像素值。
基于
opacity_value执行相应的操作将图像像素写入帧缓冲区。
如果
opacity_value为 0,表示图像不显示,直接跳出处理流程。如果
opacity_value为 255,当源图像为 RGB565 格式时,直接将其写入帧缓冲区。否则,执行相应的混合操作,并将混合结果写入帧缓冲区。如果
opacity_value介于 0 和 255 之间,执行适当的混合操作来混合源图像像素与相应的帧缓冲区像素,将混合结果写入帧缓冲区。
备注
在压缩的 source_over 矩阵模式下,rle_rgb888 和 rle_rgba8888 相当于输出 rle_rgb565。
支持的输入类型和输出类型
输入类型 |
输出类型 |
|---|---|
RGB565 |
RGB565 |
RGB888 |
RGB888 |
ARGB8888 |
RLE_ARGB8888 |
ARGB8565 |
ARGB8565 |
RLE_RGB565 |
RLE_RGB565 |
RLE_RGB888 |
RLE_RGB888 |
RLE_ARGB8888 |
RLE_ARGB8888 |
RLE_ARGB8565 |
RLE_ARGB8565 |