软件加速

总体流程图

该流程图描绘了软件加速处理图像资源的流程。在处理图像时,根据图像的压缩状态和类型选择不同的处理方法:

  • 覆盖 (cover): 将原始图像数据直接写入到帧缓冲区中的相应位置。不进行任何处理,只是直接覆盖。

  • 旁路 (bypass): 将原始图像数据直接写入到帧缓冲区中的相应位置。旁路模式无法处理图像的透明度。它对整个图像应用全局不透明度值,从而影响整体透明度。在创建透明效果时,旁路模式相比源覆盖模式更占用空间。

  • 滤黑 (Filter black): 滤波技术有效地从原始图像数据中筛选出像素值为零的像素数据,这意味着黑色像素不会被写入到帧缓冲区中。这种机制能够加快刷新速度。除黑色以外的任何颜色像素都会经过标准处理方法,并被记录到帧缓冲区中。

  • 源覆盖 (Source_over): 一种混合方法,将图像的颜色数据和帧缓冲区像素的颜色数据结合起来,基于不透明度值 Sa 计算最终的颜色,并将其写入到帧缓冲区的相应位置。计算公式为 ((255 - Sa) * D + Sa * S) / 255,其中 Sa 是原始图像的不透明度值,D 是帧缓冲区的像素数据,S 是源图像的像素数据。

https://foruda.gitee.com/images/1726135723241666402/b6cb0cbc_13671125.png

软件加速

  • 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 压缩图像的覆盖模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。

https://foruda.gitee.com/images/1726135750546602965/e70749d0_13671125.png

Cover Mode Path

  • 如果矩阵是单位矩阵,则执行没有矩阵操作的 blit 过程;否则,执行具有矩阵操作的 blit 过程。

  • dc_bytes_per_pixel 表示显示设备的像素字节数,计算方式为 dc->bit_depth >> 3,其中 bit_depth 为显示设备的位深度。以位深度为 24 的显示设备为例,其像素字节数为 3。

无 RLE 覆盖模式(不带矩阵变换)

下面的流程图描述了将未压缩图像写入帧缓冲区的覆盖模式处理过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726135919132573906/4e4cb2fd_13671125.png

Cover_blit_2_rgb565

无 RLE 覆盖模式(带矩阵变换)

下面的流程图描述了使用覆盖模式(带矩阵变换)将未压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726135926171202621/00c62b0c_13671125.png

Cover_matrix_blit_2_rgb565

无 RLE 旁路模式概述

以下流程描述了无 RLE 压缩图像的旁路模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。

https://foruda.gitee.com/images/1726135755236374806/661c982d_13671125.png

Bypass_mode_path

  • 如果矩阵是单位矩阵,则执行没有矩阵操作的 blit 过程;否则,执行具有矩阵操作的 blit 过程。

  • dc_bytes_per_pixel 表示显示设备的像素字节数,计算方式为 dc->bit_depth >> 3,其中 bit_depth 为显示设备的位深度。以位深度为 24 的显示设备为例,其像素字节数为 3。

无 RLE 旁路模式(不带矩阵变换)

下面的流程图描述了将未压缩图像写入帧缓冲区的旁路模式处理过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726135755236374806/661c982d_13671125.png

Bypass_blit_2_rgb565

  1. 根据 img_type 执行不同的处理步骤。

  2. 基于 opacity_value 执行相应的操作将图像像素写入帧缓冲区。

  • 如果 opacity_value 为 0,表示图像不显示,直接跳出处理流程。

  • 如果 opacity_value 为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。

  • 如果 opacity_value 介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。

无 RLE 旁路模式(带矩阵变换)

下面的流程图描述了使用混合模式(带矩阵变换)将未压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726135932315321260/e1dc02cc_13671125.png

Bypass_matrix_blit_2_rgb565

  1. 根据 img_type 执行不同的处理步骤。

  2. 执行矩阵计算,将目标区域的写入点映射到图像像素,并获取图像像素的像素值。

  3. 基于 opacity_value 执行相应的操作将图像像素写入帧缓冲区。

    • 如果 opacity_value 为 0,表示图像不显示,直接跳出处理流程。

    • 如果 opacity_value 为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。

    • 如果 opacity_value 介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。

无 RLE 滤黑模式概述

以下流程描述了无 RLE 压缩图像的滤黑模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。

https://foruda.gitee.com/images/1726135914549506931/43192327_13671125.png

Filter_mode_path

无 RLE 滤黑模式(不带矩阵变换)

下面的流程图描述了将未压缩图像写入帧缓冲区的滤黑模式处理过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726135936809407977/178a3356_13671125.png

Filter_blit_2_rgb565

  1. 根据 img_type 执行不同的处理步骤。

  2. 如果像素值为 0,则跳过处理;否则,执行后续写入操作。

  3. 基于 opacity_value 执行相应的操作将图像像素写入帧缓冲区。

    • 如果 opacity_value 为 0,表示图像不显示,直接跳出处理流程。

    • 如果 opacity_value 为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。

    • 如果 opacity_value 介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。

无 RLE 旁路模式(带矩阵变换)

下面的流程图描述了使用滤黑模式(带矩阵变换)将未压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726135941645383326/65173b6c_13671125.png

Filter_matrix_blit_2_rgb565

  1. 根据 img_type 执行不同的处理步骤。

  2. 执行矩阵计算,将目标区域的写入点映射到图像像素,并获取图像像素的像素值。

  3. 如果像素值为 0,则跳过处理;否则,执行后续写入操作。

  4. 基于 opacity_value 执行相应的操作将图像像素写入帧缓冲区。

  • 如果 opacity_value 为 0,表示图像不显示,直接跳出处理流程。

  • 如果 opacity_value 为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。

  • 如果 opacity_value 介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。

无 RLE 混合模式概述

以下流程描述了无 RLE 压缩图像的源覆盖模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。

https://foruda.gitee.com/images/1726135811742209771/c8bad88f_13671125.png

Alpha_mode_path

无 RLE 混合覆盖模式(不带矩阵变换)

下面的流程图描述了将未压缩图像写入帧缓冲区的源覆盖模式处理过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726135946825496906/bafaabe5_13671125.png

Alpha_blit_2_rgb565

基于 opacity_value 执行相应的操作将图像像素写入帧缓冲区。

  • 如果 opacity_value 为 0,表示图像不显示,直接跳出处理流程。

  • 如果 opacity_value 为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。

  • 如果 opacity_value 介于 0 和 255 之间,执行 rgb565_fast_blending 对源图像像素与相应的帧缓冲区像素进行混合,将混合结果写入帧缓冲区。

无 RLE 混合覆盖模式(带矩阵变换)

下面的流程图描述了使用源覆盖模式(带矩阵变换)将未压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726135953438894385/7422d479_13671125.png

Alpha_matrix_blit_2_rgb565

  1. 执行矩阵计算,将目标区域的写入点映射到图像像素,并获取图像像素的像素值。

  2. 基于 opacity_value 执行相应的操作将图像像素写入帧缓冲区。

  • 如果 opacity_value 为 0,表示图像不显示,直接跳出处理流程。

  • 如果 opacity_value 为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。

  • 如果 opacity_value 介于 0 和 255 之间,执行 rgb565_fast_blending 对源图像像素与相应的帧缓冲区像素进行混合,将混合结果写入帧缓冲区。

RLE 覆盖模式概述

以下流程描述了 RLE 压缩图像的覆盖模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。

https://foruda.gitee.com/images/1726135823311485058/2b8f94bf_13671125.png

RLE_cover_mode_path

RLE 覆盖模式(不带矩阵变换)

下面的流程图描述了将压缩图像写入帧缓冲区的覆盖模式处理过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726136024470398285/83f66a60_13671125.png

RLE_cover_blit_2_rgb565

  1. 根据压缩数据头部的 img_type 执行不同的处理步骤。

  2. 对压缩图像数据进行解压。

  3. 将像素结果写入帧缓冲区。

RLE 覆盖模式(带矩阵变换)

下面的流程图描述了使用覆盖模式(带矩阵变换)将压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726136030945132846/70e37d28_13671125.png

RLE_cover_matrix_blit_2_rgb565

  1. 根据压缩数据头部的 img_type 执行不同的处理步骤。

  2. 对压缩图像数据进行解压。

  3. 进行矩阵计算,将目标区域的写入点映射到图像像素,并获得图像像素的像素值。

  4. 将像素结果写入帧缓冲区。

RLE 旁路模式概述

以下流程描述了 RLE 压缩图像的旁路模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。

https://foruda.gitee.com/images/1726135816836257523/3224601d_13671125.png

Rle_bypass_mode_path

RLE 旁路模式(不带矩阵变换)

下面的流程图描述了将旁路图像写入帧缓冲区的覆盖模式处理过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726136019654689664/085ffd2a_13671125.png

RLE_bypass_blit_2_rgb565

  1. 根据压缩数据头部的 img_type 执行不同的处理步骤。

  2. 对压缩图像数据进行解压。

  3. 基于 opacity_value 执行相应的操作将图像像素写入帧缓冲区。

  • 如果 opacity_value 为 0,表示图像不显示,直接跳出处理流程。

  • 如果 opacity_value 为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。

  • 如果 opacity_value 介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。

RLE 旁路模式(带矩阵变换)

下面的流程图描述了使用旁路模式(带矩阵变换)将压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726136035401068218/cd9d0da1_13671125.png

RLE_bypass_matrix_blit_2_rgb565

  1. 根据压缩数据头部的 img_type 执行不同的处理步骤。

  2. 对压缩图像数据进行解压。

  3. 进行矩阵计算,将目标区域的写入点映射到图像像素,并获得图像像素的像素值。

  4. 基于 opacity_value 执行相应的操作将图像像素写入帧缓冲区。

  • 如果 opacity_value 为 0,表示图像不显示,直接跳出处理流程。

  • 如果 opacity_value 为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。

  • 如果 opacity_value 介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。

RLE 滤黑模式概述

以下流程描述了 RLE 压缩图像的滤黑模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。

https://foruda.gitee.com/images/1726135828203631320/cee92853_13671125.png

RLE_filter_mode_path

RLE 滤黑模式(不带矩阵变换)

下面的流程图描述了将压缩图像写入帧缓冲区的滤黑模式处理过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726136039315952991/89ee16cb_13671125.png

RLE_filter_blit_2_rgb565

  1. 根据压缩数据头部的 img_type 执行不同的处理步骤。

  2. 对压缩图像数据进行解压。

  3. 如果像素值为 0,则跳过处理;否则,执行后续写入操作。

  4. 基于 opacity_value 执行相应的操作将图像像素写入帧缓冲区。

  • 如果 opacity_value 为 0,表示图像不显示,直接跳出处理流程。

  • 如果 opacity_value 为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。

  • 如果 opacity_value 介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。

RLE 滤黑模式(带矩阵变换)

下面的流程图描述了使用滤黑模式(带矩阵变换)将压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726136044246530066/3cb24841_13671125.png

RLE_filter_matrix_blit_2_rgb565

  1. 根据压缩数据头部的 img_type 执行不同的处理步骤。

  2. 对压缩图像数据进行解压。

  3. 进行矩阵计算,将目标区域的写入点映射到图像像素,并获得图像像素的像素值。

  4. 如果像素值为 0,则跳过处理;否则,执行后续写入操作。

  5. 基于 opacity_value 执行相应的操作将图像像素写入帧缓冲区。

  • 如果 opacity_value 为 0,表示图像不显示,直接跳出处理流程。

  • 如果 opacity_value 为 255,将源图像像素转换为 RGB565 格式,并写入帧缓冲区。

  • 如果 opacity_value 介于 0 和 255 之间,执行 Alpha 混合操作将源图像像素与对应的帧缓冲区像素进行混合。混合公式为 ((255 - Sa) * D + Sa * S) / 255,将混合结果写入帧缓冲区。

RLE 混合模式概述

以下流程描述了 RLE 压缩图像的源覆盖模式处理过程。根据图像矩阵和显示设备的像素字节数选择处理方法,并将其写入帧缓冲区。

https://foruda.gitee.com/images/1726135833249440419/4bf65309_13671125.png

RLE_alpha_mode_path

RLE 混合模式(不带矩阵变换)

下面的流程图描述了将压缩图像写入帧缓冲区的源覆盖模式处理过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726136048376898937/05600e92_13671125.png

RLE_alpha_blit_2_rgb565

  1. 根据压缩数据头部的 img_type 执行不同的处理步骤。

  2. 对压缩图像数据进行解压。

  3. 基于 opacity_value 执行相应的操作将图像像素写入帧缓冲区。

  • 如果 opacity_value 为 0,表示图像不显示,直接跳出处理流程。

  • 如果 opacity_value 为 255,当源图像为 RGB565 格式时,直接将其写入帧缓冲区。否则,执行相应的混合操作,并将混合结果写入帧缓冲区。

  • 如果 opacity_value 介于 0 和 255 之间,执行适当的混合操作来混合源图像像素与相应的帧缓冲区像素,将混合结果写入帧缓冲区。

RLE 源覆盖模式(带矩阵变换)

下面的流程图描述了使用源覆盖模式(带矩阵变换)将压缩图像写入帧缓冲区的过程,以 RGB565 为目标设备图像类型为例。

https://foruda.gitee.com/images/1726136052909602952/42461659_13671125.png

RLE_alpha_matrix_blit_2_rgb565

  1. 根据压缩数据头部的 img_type 执行不同的处理步骤。

  2. 对压缩图像数据进行解压。

  3. 进行矩阵计算,将目标区域的写入点映射到图像像素,并获得图像像素的像素值。

  4. 基于 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