JL701N 2D图形硬件加速接口使用说明
AC701N 2D 图像硬件加速接口使用说明
珠海市杰理科技股份有限公司
Zhuhai Jieli Technology Co.,LTD
版权所有,未经许可,禁止外传
修改记录
| 版本 | 更新日期 | 描述 |
|---|---|---|
| 1.0 | 2022/4/15 | 初版 |
| 1.1 | 2022/5/9 | 完善文档 |
目录
一、 模块介绍...................................................................................................... 4
二、 数据结构...................................................................................................... 6
三、 函数接口.................................................................................................... 15
四、 测试环境搭建............................................................................................ 31
(一) 生成资源....................................................................................................................................... 31
(二) 使能IMB_ DEMO .........................................................................................................................32
(三) 测试............................................................................................................................................... 32
1. 背景输出(必须).................................................................................................................. 32
2. 纯色输出.................................................................................................................................. 33
3. 图片普通输出.......................................................................................................................... 35
4. 图片旋转输出.......................................................................................................................... 38
5. 图片分块输入旋转输出.......................................................................................................... 42
6. 图片缩放输出.......................................................................................................................... 46
7. 多国语言字符串输出.............................................................................................................. 49
8. 字库输出.................................................................................................................................. 52
9. 自定义绘图输出...................................................................................................................... 57
10. Imb 任务dump ....................................................................................................................... 63
11. imb 任务创建测试................................................................................................................. 64
五、 注意要点.................................................................................................... 68
一、模块介绍
imb是2D 图像加速模块,负责图像的叠加合成运算,可支持图像旋转、图像缩放、 图像截取等基本操作,可支持多种输入格式,包含ARGB8888, ARGB8565、 RGB888、 RGB565、 OSD16、 AL88、 L 8、 AL44、 L 1、 A 8,支持从SRAM/PSRAM、NORFLASH存储介质读取数据,数据支持压缩与非压缩(L1只支持非压缩),旋转图像数据只支持从SRAM(其他存储介质由于读取效率低不考虑)读取,旋转可支持分块输入(适合SRAM无法缓存一整张图片的场合),imb输出存储格式支持RGB888和RGB565。
imb支持的格式如下表格所示:
格式 描述
ARGB8888 24位真彩色,带8位alpha ARGB8565 16位真彩色,带8位alpha RGB888 24位真彩色
RGB565 16位真彩色
OSD16 16位真彩色,带镂空效果
AL88 索引图像,8位颜色表,带8位alpha
L 8 索引图像,8位颜色表
AL44 索引图像,4位颜色表,带4位alpha
L 1 索引图像, 1位颜色表
A 8 8位alpha
旋转:0~359度,精度为 1度
缩放:定点小数(3bit整数+ 10bit小数),范围0.001~7.999,精度为 1/1024
注:不支持同时旋转以及缩放
二、数据结构
struct imb_task {
u32 src_w : l0;//输入宽度
u32 src_h : 9 ;/输入高度
u32 des_w : l0;//输出宽度
u32 cur_osd0_en : l ;//背景任务
u32 rgb_tsk_en : l ;//纯色
u32 zip_en : l ;//0:非压缩数据 1:压缩数据
s32 x_offset : ll;//输出x 坐标(相对于背景)
s32 y_offset : l0;//输出y 坐标(相对于背景)
u32 des_h : 9 ;//输出高度
u32 scale_en : l ;//缩放使能
u32 nxt_wait_en : l ;//下一个任务等待使能
u32 rotate_angle : 9 ;//旋转角度
u32 rotate_c_x : l0;//输入旋转中心点x 坐标
u32 rotate_c_y : 9 ;//输入旋转中心点y 坐标
u32 cur_format : 4 ;//数据格式
u32 adr_map_adr;/地址映射表的地址(从spiflash 读取数据时有效)
u32 dat_src_adr;//数据起始地址
u32 nxt_tsk_adr;//下一个任务的地址
u32 b_from_tsk : 8 ;/纯色b 分量
u32 g_from_tsk : 8 ;/纯色g 分量
u32 r_from_tsk : 8 ;//纯色r 分量
u32 a_from_tsk : 8 ;//纯色a 分量
u32 rotate_dx : l3;//旋转使能时表示输出旋转中心点x 坐标,缩放使能时表示垂直放大倍率ratio_h = (src_h * 1024) / des_h
u32 rotate_dy : l3;//旋转使能时表示输出旋转中心点y 坐标,缩放使能时表示水平放大倍率ratio_w = (src_w * 1024) / des_w
u32 rotate_en : l ;//旋转使能
u32 osd0_in_buf : l ;//数据已在输出bufer 中(背景任务有效)
u32 cur_in_flash : l ;//数据在flash
u32 cur_tsk_valid : l ;//任务有效
u32 reservedl : 2 ;//保留
// u32 resize_des_w : 10;
// u32 resize_des_h : 9;
// u32 osd16_alpha : 8;
// u32 reserved0 : 5;
u32 src_w_pre : 10;//旋转时输入数据在原图中的宽度(旋转分块输入
相关变量)
u32 src_h_pre : 9 ;//旋转时输入数据在原图中的高度(旋转分块输入相
关变量)
u32 reserved2 : 13;
u32 x_src_offset : 10;//旋转时输入数据在原图中的x 坐标(旋转分块输入相关变量)
u32 y_src_offset : 9 ;//旋转时输入数据在原图中的y 坐标(旋转分块输入相关变量)
u32 reserved3 : 13;
//以下是硬件无关的变量
struct list_head entry;//链表
struct list_head entry_h ;
struct rect rect;//任务显示区域(相对于屏幕)
struct rect crop;//任务裁剪区域(相对于屏幕)
u8 jpeg_en : 1 ;//jpeg 使能
u8 task_en : 1 ;/任务使能
u8 rotate_chunk : 1 ;//旋转输入分块标志
u8 user_cb : 1 ;//1:用户的回调,0:默认的回调
u8 ui_malloc : 1 ;//ui malloc 标志
u8 root_index : 1 ;//任务链索引
u8 quote : 2 ;//引用,任务不参与硬件合成,可软件合成 u16 adr_map_tab_size;//地址映射表大小
u32 id;//任务id
u32 elm_id;//控件id 号
u32 *lut_tab;//颜色表(AL88/L8/AL44/L1/A8)
u32 resfile_addr;
int index;//任务索引
char name[ 8] ;//任务名称
char *filename;//不用
// struct imb_file_info *flash_file_info;
void *flash_file_info;//flash 里的文件信息
enum DATA_SRC data_src;//数据源
void *( *cb)(void *priv);//任务回调
void *cb_priv;//用户回调参数
int cb_id;//用户回调的id(自定义)
u32 priv_buf[22] ;//用户回调参数
u32 crc;//task 的crc 校验} ;
struct imb_task_info {
//输入
u16 src_w;//输入宽度
u16 src_h ;//输入高度
//输出
s16 x_offset;//x 坐标
s16 y_offset;//y 坐标
u16 des_w;//输出宽度,输出宽度小于输入宽度表示截取
u16 des_h ;//输出高度,输出高度小于输入高度表示截取
u8 cur_osd0_en: 1 ;//忽略
u8 rgb_tsk_en: 1 ;//忽略
u8 zip_en: 1 ;//是否压缩
u8 scale_en: 1 ;//是否缩放
u8 next_wait_en: 1 ;//忽略
u8 rotate_en: 1 ;//是否旋转
u8 osd0_in_buf: 1 ;//忽略
u8 cur_in_flash: 1 ;//数据存储在flash u32 rgb_task_color;//忽略
//旋转相关配置
u16 rotate_c_x;//图片的旋转中心x 坐标(相对于图片左上角)
u16 rotate_c_y;//图片的旋转中心y 坐标(相对于图片左上角)
ul6 rotate_angle;//旋转角度
ul6 rotate_dx;//输出的旋转中心x 坐标(相对于背景)
ul6 rotate_dy;//输出的旋转中心y 坐标(相对于背景)
ul6 rotate_chunk : l5 ;//分块使能&分块的高度
ul6 rotate_kick : l ;//分块输入旋转的标志位(内存变量) ul6 rotate_chunk_num;//分块数量
ul6 rotate_chunk_offset;//输入图片的y 坐标偏移
ul6 rotate_chunk_offset_cur;//内部变量 u8 *rotate_buffer;//旋转bufer(内部变量)
u8 *rotate_buffer_0 ;//旋转bufer(内部变量)
u8 *rotate_buffer_l ;//旋转bufer(内部变量) u32 x_src_offset;//输入图片的起始x 坐标
u32 y_src_offset;//输入图片的起始y 坐标
//缩放相关配置// u16 resize_des_w;
// u16 resize_des_h;
float ratio_w;/水平放大倍率(0.1~ 7.9)
float ratio_h ;//垂直放大倍率(0.1~ 7.9)
u8 lcd_format;//颜色格式
u8 quote;//自定义绘图标志位
u8 user_cb;//自定义绘图回调
u8 l1_type;//l1 格式,用于区分是图像还是文本, 图片带颜色表 u8 ui_malloc;//ui 申请内存标志
u16 lcd_width ;//屏幕宽度
u16 lcd_height;//屏幕高度
u32 id;//任务id(用于区分不同任务)
u32 elm_id;//控件id 号(sdk 自带ui 框架相关)
u32 priv;//任务参数
struct imb_task *task;//记录task 句柄,内部变量
struct rect crop;//任务显示的区域(用于截取)
struct rect rect;//任务所在的区域
struct rect draw;//临时变量
int text_color;//文本颜色
void *ff_info;// struct flash_file_info *f_info;
enum LAYER_FORMAT in_format;//输入格式
enum OUTPUT_FORMAT out_format;/imb 输出格式
enum DATA_SRC data_src;//数据来源
void *( *cb)(void *cb_priv);//回调
void *cb_priv;//回调参数
int cb_id;//回调的id(用于区分自定义绘图)} ;
//获取flash 文件信息
struct flash_file_info {
u32 *tab;//地址映射表的起始地址,4k 对齐
u16 tab_size;//地址映射表的大小
u32 offset;//文件在flash 4k 地址范围内的偏移, addr % 4096
u32 last_tab_data_len;//文件最后一个4k 剩余的长度} ;
•文件地址映射表
imb支持从norflash里直接读取文件数据,需要获取文件在norflash里的地址映射表
获 取 文 件 地 址 映 射 表 的 相 关 接 口 为 ui_res_flash_info_get、
ui_res_flash_info_free
•截取显示 imb支持图片的截取显示,如下图所示:
•链式结构
imb 的所有任务是通过一条链表连接起来,imb 合成的时候按照链表的先后顺序依次执行任务链上的各个任务
三、 函数接口
/* ------------------------------------------------------------------- */
/@brief 写颜色表
@param
@return
@note
/
/ ------------------------------------------------------------------- */
void imb_wr_lut(u32 tab, u32 tab_num)
/ ------------------------------------------------------------------- */
/@brief 读取颜色表
@param
@return
@note
/
/ ------------------------------------------------------------------- */
void imb_rd_lut(u32 tab, u32 tab_num)
/ ------------------------------------------------------------------- */
/@brief 创建imb 任务
@param root:任务链信息
@param parent:父任务
@param task_name:任务名称
@param info:任务信息
@return
@note
/
/ ------------------------------------------------------------------- */
struct imb_task *imb_task_create(struct imb_task_head *root, struct imb_task *parent, char *task_name, struct imb_task_info info)
/ ------------------------------------------------------------------- */
/@brief 设置任务的颜色表
@param task:任务句柄
@return
@note
/
/ ------------------------------------------------------------------- */
void set_lut_tab(struct imb_task task)
/ ------------------------------------------------------------------- */
/@brief 输入数据来源
@param task:任务句柄
@param data_source:DATA_SRC_FLASH/DATA_SRC_SRAM/DATA SRC PSRAM/DATA SRC NONE
@param data_type:DATA_NOZIP/DATA_ZIP
@return
@note
/
/ ------------------------------------------------------------------- */
int imb_task_set_input_data_type(struct imb_task task, enum DATA_SRC data_source, enum DATA_TYPE data_type)
/ ------------------------------------------------------------------- */
/@brief 普通任务输入
@param root:任务链表头
@param task:任务句柄
@param tsk_info:任务信息
@return
@note
/
/ ------------------------------------------------------------------- */
int imb_task_set_generic_input(struct imb_task_head *root, struct imb_task *task, struct imb_task_info tsk_info)
/ ------------------------------------------------------------------- */
/@brief 旋转任务输入
@param task:任务句柄
@psram tsk_info:任务信息
@return
@note
/
/ ------------------------------------------------------------------- */
int imb_task_set_rotate_input(struct imb_task task, struct imb_task_info * tsk_info)
/ ------------------------------------------------------------------- */
/@brief 普通任务输出
@param root:任务链表头
@param task:任务句柄
@param xofset:显示起始x 坐标
@param yofset:显示起始y 坐标
@param width:显示宽度
@param height:显示高度
@return
@note
/
/ ------------------------------------------------------------------- */
int imb_task_set_generic_output(struct imb_task_head *root, struct imb_task task, int xoffset, int yoffset, int width, int height)
/ ------------------------------------------------------------------- */
/@brief 背景输出
@param root:任务链表头
@param task:任务句柄
@param xofset:显示起始x 坐标
@param yofset:显示起始y 坐标
@param width:显示宽度
@param height:显示高度
@param format:输出格式
@return
@note
/
/ ------------------------------------------------------------------- */
void imb_task_set_background_output(struct imb_task_head *root, struct i mb_task task, int xoffset, int yoffset, int width, int height, enum OUTPUT_FORMAT format)
/ ------------------------------------------------------------------- */
/@brief 缩放任务输出
@param root:任务链表头
@param task:任务句柄
@param xofset:显示起始x 坐标
@param yofset:显示起始y 坐标
@param ratio_w:水平缩放系数
@param ratio_h:垂直缩放系数
@return
@note
/
/ ------------------------------------------------------------------- */
int imb_task_set_scale_output(struct imb_task_head *root, struct imb_task task, int xoffset, int yoffset, float ratio_w, float ratio_h)
/ ------------------------------------------------------------------- */
/**@brief 缩放任务输出(可裁剪)
@param root:任务链表头
@param task:任务句柄
@param xofset:显示x 坐标
@param yofset:显示y 坐标
@param ratio_w:水平缩放倍率
@param ratio_h:垂直缩放倍率
@param des_w:显示宽度(若小于缩放的实际宽度则截取,若大于
实际宽度则取实际宽度)
@param des_h:显示高度(若小于缩放的实际高度则截取,若大于实际高度则取实际高度)
@return
@note
/
/ ------------------------------------------------------------------- */
int imb_task_set_scale_crop_output(struct imb_task_head root, struct imb_task task, int xoffset, int yoffset, float ratio_w, float ratio_h, int des_w, int des_h)
/ ------------------------------------------------------------------- /
/**@brief 旋转任务输出
@param root:任务链表头
@param task:任务句柄
@param src_cx:图像中心x 坐标(相对图像)
@param src_cy:图像中心y 坐标(相对图像)
@param angle:角度
@param dest_cx: 目标中心x 坐标(相对背景)
@param dest_cy: 目标中心y 坐标(相对背景)
@param xofset:x 偏移
@param yofser:y 偏移
@param width:宽度
@param height:高度
@return
@note xofset、yofset、width、height 参数用于对旋转后图像的截取/
/ ------------------------------------------------------------------- */
int imb_task_set_rotate_output(struct imb_task_head *root, struct imb_task
task, int src_cx, int src_cy, int angle, int dest_cx, int dest_cy, int xoffset, int yoffset, int width, int height)
/ ------------------------------------------------------------------- */
/@brief 搜索imb 任务
@param root:任务链表头
@param task_name:任务名称
@return
@note
/
/ ------------------------------------------------------------------- */
struct imb_task *imb_task_search(struct imb_task_head *root, char task_name)
/ ------------------------------------------------------------------- */
/@brief 任务链初始化,创建任务背景
@param root:任务链表头
@param info:任务信息
@return
@note
/
/ ------------------------------------------------------------------- */
void imb_task_list_init(struct imb_task_head *root, struct imb_task_info info)
/ ------------------------------------------------------------------- */
/@brief 根据任务信息创建任务
@param root:任务链表头
@param info:任务信息
@return
@note
/
/ ------------------------------------------------------------------- */
struct imb_task *imb_task_list_add(struct imb_task_head *root, struct imb_task_info info)
/ ------------------------------------------------------------------- */
/@brief 重置imb 任务参数
@param root:任务链表头
@param p_task:imb 任务imb
@param info:任务信息
@return
@note
/
/ ------------------------------------------------------------------- */
void imb_task_reset(struct imb_task_head *root, struct imb_task *p_task, struct imb_task_info info)
/ ------------------------------------------------------------------- */
/@brief 获取任务链表头
@param idx:任务链索引
@return
@note
/
/ ------------------------------------------------------------------- */
struct imb_task_head imb_task_head_get(int idx)
/ ------------------------------------------------------------------- */
/@brief 设置输出bufer
@param root:任务链头
@param bufer:输出bu fer 地址
@return 无
@note
/
/ ------------------------------------------------------------------- */
void set_imb_output_buffer(struct imb_task_head *root, void buffer)
/ ------------------------------------------------------------------- */
/@brief 启动imb 合成
@param root:任务链表头
@psram draw:显示区域
@return
@note
/
/ ------------------------------------------------------------------- */
static void imb_task_kick(struct imb_task_head *root, struct rect draw)
/ ------------------------------------------------------------------- */
/@brief imb 加锁
@param
@return
@note 跟外挂sfc 互斥访问flash /
/ ------------------------------------------------------------------- /
void imb_task_lock()
/ ------------------------------------------------------------------- */
/@brief imb 解锁
@param
@return
@note 跟外挂sfc 互斥访问flash /
/ ------------------------------------------------------------------- /
void imb_task_unlock()
/ ------------------------------------------------------------------- */
/@brief 设置旋转角度
@param task:imb 任务
@param angle:(0~359),最小单位1 度
@return
@note
/
/ ------------------------------------------------------------------- */
void imb_task_set_rotate_angle(struct imb_task task, int angle)
/ ------------------------------------------------------------------- */
/@brief imb 相关参数配置
@param root:任务链表头
@param buf:显示bu fer
@param bufsize:显示bu fer 大小
@param width:屏幕宽度
@param height:屏幕高度
@param stride:一行像素字节数
@param lines:分块行数
@param buf_num:buf数量
@return
@note
/
/ ------------------------------------------------------------------- */
void imb_task_head_set_buf(struct imb_task_head *root, u8 buf, u32 bufsize, ul6 width, ul6 height, ul6 stride, ul6 lines, u8 buf_num)
/ ------------------------------------------------------------------- */
/@brief 配置合成相关参数
@param root:任务链表头
@param rect:屏幕刷新区域
@param canv:画布
@param rect_ref:画布参考
@param state:当前状态
@return
@note
/
/ ------------------------------------------------------------------- */
void imb_task_head_config(struct imb_task_head *root, struct rect *rect, struct rect *canv, struct rect rect_ref, u8 state)
/ ------------------------------------------------------------------- */
/@brief 启动合成并推屏显示
@param root:任务链表头
@param limit:屏幕刷新区域限制
@param disp:该参数不用,忽略
@param colums:分块宽度(一般为屏幕的宽度)
@param lines:分块高度
@return
@note
/
/ ------------------------------------------------------------------- */
void imb_start(struct imb_task_head *root, struct rect limit)
//flash 文件相关接口
/ ------------------------------------------------------------------- */
/@brief 获取文件在flash 中的存储信息
@param info:flash 文件信息
@param path:文件路径
@param str:文件类型,"res "或者"str "
@return
@note
/
/ ------------------------------------------------------------------- */
int ui_res_flash_info_get(struct flash_file_info *info, char *path, char str)
/ ------------------------------------------------------------------- */
/**@brief 释放内存
@param file_info:flash 文件信息
@param str:文件类型,"res "或者"str "
@return
@note
*/
/*------------------------------------------------------------------- */
void ui_res_flash_info_free(struct flash_file_info *file_info, char *str)
•分块大小设置
具体分块请参考屏幕驱动配置,路径btsdk/cpu/br28/ui_driver/lcd_drive/,分块参数如下图所示
注:分块的原则是水平方向不分块,与屏幕等宽,垂直方向分块

四、测试环境搭建
四、测试环境搭建
(一)生成资源
ResBuilder.xml 是工具 ResBuilder.exe 的接 口文件, 可直接编辑 ResBuilder.xml 的PictureList或CellList,也可通过工具修改,图片路径可以支持绝对路径或相对路径绝对路径
相对路径
编辑完后直接运行Run_ResBuilder.bat脚本则会生成相关资源文件以及索引文件,然后将生成的资源文件手动拷贝到下载目录ui_resources,图片索引文件ui_pic_index.h 以及字符串索引文件ui_str_index.h 则拷贝到到
btsdk/apps/watch/include/ui/目录下,修改下载脚本download.bat,脚本修改如下所示
(二)使能IMB_DEMO
btsdk/apps/watch/board/br28/board_701n_demo/board_701n_demo_cfg.h
(三)测试
1.背景输出(必须)
/* ---------------------------------------------------------------------------- */
/**@brief 创建背景任务
@param format:合成的格式,屏驱配置
@param width:背景宽度
@param height:背景高度
@param color:背景颜色(RGB565 格式)
@return
@note
/
/ ---------------------------------------------------------------------------- */
void imb_create_bg_task(u8 format, u16 width, u16 height, u16 color){
struct imb_task_info imb_tsk_info = {0};
[imb_tsk_info](imb_tsk_info.data_src = DATA_SRC_NONE)[.](imb_tsk_info.data_src = DATA_SRC_NONE)[data_src](imb_tsk_info.data_src = DATA_SRC_NONE)[ =](imb_tsk_info.data_src = DATA_SRC_NONE)[ DATA_SRC_NONE](imb_tsk_info.data_src = DATA_SRC_NONE);//无数据源 [imb_tsk_info](imb_tsk_info.zip_en = 0)[.](imb_tsk_info.zip_en = 0)[zip_en](imb_tsk_info.zip_en = 0)[ =](imb_tsk_info.zip_en = 0)[ 0](imb_tsk_info.zip_en = 0);
imb_tsk_info.in_format = LAYER_FORMAT_SOLID;//纯色
imb_tsk_info.out_format = format;
imb_tsk_info.x_offset = 0 ;
imb_tsk_info.y_offset = 0 ;
imb_tsk_info.src_w = width ;
imb_tsk_info.src_h = height;
imb_tsk_info.des_w = width ;
imb_tsk_info.des_h = height;
imb_tsk_info.priv = color;//纯色格式,该参数表示颜色0xr
5g6b5
imb_task_list_init(imb_task_head_get(0), &imb_tsk_info);}
2.纯色输出
/* ---------------------------------------------------------------------------- */
/**@brief 创建纯色任务(矩形填充)
@param x : 相对背景的x 坐标
@param y : 相对背景的y 坐标
@param width : 矩形的宽度
@param height: 矩形的高度
@param color : argb8565 格式(alpha 0~ 100)
@return
@note
/
/ ---------------------------------------------------------------------------- */
void imb_create_color_task(int x, int y, int width, int height, u32 color){
struct imb_task_info imb_tsk_info = {0};
struct imb_task p = NULL;
[imb_tsk_info](imb_tsk_info.data_src = DATA_SRC_NONE)[.](imb_tsk_info.data_src = DATA_SRC_NONE)[data_src](imb_tsk_info.data_src = DATA_SRC_NONE)[ =](imb_tsk_info.data_src = DATA_SRC_NONE)[ DATA_SRC_NONE](imb_tsk_info.data_src = DATA_SRC_NONE);
[imb_tsk_info](imb_tsk_info.zip_en = 0)[.](imb_tsk_info.zip_en = 0)[zip_en](imb_tsk_info.zip_en = 0)[ =](imb_tsk_info.zip_en = 0)[ 0](imb_tsk_info.zip_en = 0);
imb_tsk_info.in_format = LAYER_FORMAT_SOLID;
imb_tsk_info.x_offset = x;
imb_tsk_info.y_offset = y;
imb_tsk_info.src_w = width ;
imb_tsk_info.src_h = height;
imb_tsk_info.des_w = width ;
imb_tsk_info.des_h = height;
imb_tsk_info.priv = color;
/ elm_id、id 可作为任务的唯一标识,通过该标识搜索任务句柄,若搜到则重置任务信息,没搜到则创建任务 /
/ p = imb_task_search_by_id(imb_task_head_get(0), imb_tsk_info.elm_id, imb_tsk_info.id); */
if (p) {
imb_task_reset(imb_task_head_get(0), p, &imb_tsk_info);} else {
imb_task_list_add(imb_task_head_get(0), &imb_tsk_info);}
}
3. 图片普通输出
/* ---------------------------------------------------------------------------- */
/**@brief 创建图片任务
@param file:图片信息
@param file_info:图片存储信息
@param x:相对背景的x 坐标
@param y:相对背景的y 坐标
@param width:图片显示的宽度,必须小于或者等于图片的实际宽度,小于实际宽度则截取显示
@param height:图片显示的高度,必须小于或者等于图片的实际高度,小于实际高度则截取显示
@return
@note
/
/ ---------------------------------------------------------------------------- */
void imb_create_image_task(struct image_file *file, struct imb_task_info * file_info, int x, int y, int width, int height)
{
struct imb_task_info imb_tsk_info = {0};
struct imb_task *p = NULL;
if (imb_tsk_info.rotate_en) {
[imb_tsk_info](imb_tsk_info.data_src = DATA_SRC_SRAM)[.](imb_tsk_info.data_src = DATA_SRC_SRAM)[data_src](imb_tsk_info.data_src = DATA_SRC_SRAM)[ =](imb_tsk_info.data_src = DATA_SRC_SRAM)[ DATA_SRC_SRAM](imb_tsk_info.data_src = DATA_SRC_SRAM);//从flash 拷贝数据到sram,从sram 取数
imb_tsk_info.cur_in_flash = 1 ;//数据存在flash
[imb_tsk_info](imb_tsk_info.zip_en = 0)[.](imb_tsk_info.zip_en = 0)[zip_en](imb_tsk_info.zip_en = 0)[ =](imb_tsk_info.zip_en = 0)[ 0](imb_tsk_info.zip_en = 0);
} else {
[imb_tsk_info](imb_tsk_info.data_src = DATA_SRC_FLASH)[.](imb_tsk_info.data_src = DATA_SRC_FLASH)[data_src](imb_tsk_info.data_src = DATA_SRC_FLASH)[ =](imb_tsk_info.data_src = DATA_SRC_FLASH)[ DATA_SRC_FLASH](imb_tsk_info.data_src = DATA_SRC_FLASH);//直接从flash
取数
imb_tsk_info.cur_in_flash = 1 ;//数据存在flash
if (file->format == PIXEL_FMT_L 1) { [imb_tsk_info](imb_tsk_info.zip_en = 0)[.](imb_tsk_info.zip_en = 0)[zip_en](imb_tsk_info.zip_en = 0)[ =](imb_tsk_info.zip_en = 0)[ 0](imb_tsk_info.zip_en = 0);
} else {
[imb_tsk_info](imb_tsk_info.zip_en = 1)[.](imb_tsk_info.zip_en = 1)[zip_en](imb_tsk_info.zip_en = 1)[ =](imb_tsk_info.zip_en = 1)[ 1](imb_tsk_info.zip_en = 1);
}
}
imb_tsk_info.in_format = file->format;
imb_tsk_info.x_offset = x;
imb_tsk_info.y_offset = y;
imb_tsk_info.src_w = file->width ;
imb_tsk_info.src_h = file->height;
imb_tsk_info.des_w = width ;
imb_tsk_info.des_h = height;
imb_tsk_info.ff_info = file_info;
if (imb_tsk_info.in_format == PIXEL_FMT_L 1) {
imb_tsk_info.l1_type = L 1_IMAGE;
}
/* elm_id、id 可作为任务的唯一标识,通过该标识搜索任务句柄,若搜到则重置任务信息,没搜到则创建任务 /
/ p = imb_task_search_by_id(imb_task_head_get(0), imb_tsk_info.elm_id, imb_tsk_info.id); */
imb_tsk_info.priv = (u32)file;
if (p) {
imb_task_reset(imb_task_head_get(0), p, &imb_tsk_info); //imb_task 参数重置
} else {
imb_task_list_add(imb_task_head_get(0), &imb_tsk_info);}
}
4. 图片旋转输出
/* ---------------------------------------------------------------------------- */
/**@brief 创建图片旋转任务
@param file:图片信息
@param file_info:图片存储信息
@param cx:图片的旋转中心x 坐标,相对于图片
@param cy:图片的旋转中心y 坐标,相对于图片
@param angle:旋转角度
@param dx:输出的旋转中心点x 坐标,相对于背景
@param dy:输出的旋转中心点y 坐标,相对于背景
@return
@note
/
/ ---------------------------------------------------------------------------- */
void imb_create_image_rotate_task(struct image_file *file, struct imb_task_info *file_info, int cx, int cy, int angle, int dx, int dy)
{
struct imb_task_info imb_tsk_info = {0};
struct imb_task p = NULL;
imb_tsk_info.rotate_en = 1 ;
if (imb_tsk_info.rotate_en) {
imb_tsk_info.x_src_offset = 0 ;
imb_tsk_info.y_src_offset = 0 ;
imb_tsk_info.rotate_c_x = cx;
imb_tsk_info.rotate_c_y = cy;
imb_tsk_info.rotate_angle = angle;
imb_tsk_info.rotate_dx = dx;
imb_tsk_info.rotate_dy = dy;
imb_tsk_info.rotate_chunk = 0 ;
if (imb_tsk_info.rotate_chunk) {
imb_tsk_info.rotate_chunk_offset = 0 ;
imb_tsk_info.rotate_chunk_num = 8 ;
imb_tsk_info.rotate_chunk = (file->height / imb_tsk_info.rotate_chunk_num + 9) / 10 * 10;
} else {
imb_tsk_info.rotate_chunk = 0 ;
}
}
if (imb_tsk_info.rotate_en) {
[imb_tsk_info](imb_tsk_info.data_src = DATA_SRC_SRAM)[.](imb_tsk_info.data_src = DATA_SRC_SRAM)[data_src](imb_tsk_info.data_src = DATA_SRC_SRAM)[ =](imb_tsk_info.data_src = DATA_SRC_SRAM)[ DATA_SRC_SRAM](imb_tsk_info.data_src = DATA_SRC_SRAM);
imb_tsk_info.cur_in_flash = 1 ;
[imb_tsk_info](imb_tsk_info.zip_en = 0)[.](imb_tsk_info.zip_en = 0)[zip_en](imb_tsk_info.zip_en = 0)[ =](imb_tsk_info.zip_en = 0)[ 0](imb_tsk_info.zip_en = 0);
} else {
[imb_tsk_info](imb_tsk_info.data_src = DATA_SRC_FLASH)[.](imb_tsk_info.data_src = DATA_SRC_FLASH)[data_src](imb_tsk_info.data_src = DATA_SRC_FLASH)[ =](imb_tsk_info.data_src = DATA_SRC_FLASH)[ DATA_SRC_FLASH](imb_tsk_info.data_src = DATA_SRC_FLASH);
imb_tsk_info.cur_in_flash = 1 ;
if (file->format == PIXEL_FMT_L 1) { [imb_tsk_info](imb_tsk_info.zip_en = 0)[.](imb_tsk_info.zip_en = 0)[zip_en](imb_tsk_info.zip_en = 0)[ =](imb_tsk_info.zip_en = 0)[ 0](imb_tsk_info.zip_en = 0);
} else {
[imb_tsk_info](imb_tsk_info.zip_en = 1)[.](imb_tsk_info.zip_en = 1)[zip_en](imb_tsk_info.zip_en = 1)[ =](imb_tsk_info.zip_en = 1)[ 1](imb_tsk_info.zip_en = 1);
}
}
imb_tsk_info.in_format = file->format;
imb_tsk_info.src_w = file->width ;
imb_tsk_info.src_h = file->height;
//旋转这组参数设置无效,默认为背景任务大小 imb_tsk_info.x_offset = 0 ;
imb_tsk_info.y_offset = 0 ;
imb_tsk_info.des_w = 0 ;
imb_tsk_info.des_h = 0 ;
imb_tsk_info.ff_info = file_info;
if (imb_tsk_info.in_format == PIXEL_FMT_L 1) { imb_tsk_info.l1_type = L 1_IMAGE;
}
imb_tsk_info.priv = (u32)file;
/ elm_id、id 可作为任务的唯一标识,通过该标识搜索任务句柄,若搜到则重置任务信息,没搜到则创建任务 /
/ p = imb_task_search_by_id(imb_task_head_get(0), imb_tsk_info.elm_id, imb_tsk_info.id); */
if (p) {
imb_task_reset(imb_task_head_get(0), p, &imb_tsk_info);} else {
imb_task_list_add(imb_task_head_get(0), &imb_tsk_info);}
}
5. 图片分块输入旋转输出
说明:分块输入适用于图片尺寸比较大的场合,例如指南针应用, 因为旋转需要将数据从norflash搬到sram,分块输入有助于降低sram 的使用,不过会影响合成的效率,需要根据实际情况设置合适的分块大小,一条任务链最多只能有一个旋转任务分块输入
/* ---------------------------------------------------------------------------- */
/**@brief 创建图片旋转任务(图片分块拷贝到sram 作为输入)
@param file:图片信息
@param file_info:图片存储信息
@param cx:图片的旋转中心x 坐标,相对于图片
@param cy:图片的旋转中心y 坐标,相对于图片
@param angle:旋转角度
@param dx:输出的旋转中心点x 坐标,相对于背景
@param dy:输出的旋转中心点y 坐标,相对于背景
@return
@note
/
/ ---------------------------------------------------------------------------- */
void imb_create_image_rotate_chunk_task(struct image_file *file, struct imb_task_info *file_info, int cx, int cy, int angle, int dx, int dy)
{
struct imb_task_info imb_tsk_info = {0};
struct imb_task *p = NULL;
imb_tsk_info.rotate_en = 1 ;//旋转使能
if (imb_tsk_info.rotate_en) {
imb_tsk_info.x_src_offset = 0 ;
imb_tsk_info.y_src_offset = 0 ;
imb_tsk_info.rotate_c_x = cx;
imb_tsk_info.rotate_c_y = cy;
imb_tsk_info.rotate_angle = angle;
imb_tsk_info.rotate_dx = dx;
imb_tsk_info.rotate_dy = dy;
imb_tsk_info.rotate_chunk = 1 ;
if (imb_tsk_info.rotate_chunk) {
imb_tsk_info.rotate_chunk_offset = 0 ;
imb_tsk_info.rotate_chunk_num = 8 ;//输入分块数量(分块数量越少,合成速度越快,消耗ram 越多)
imb_tsk_info.rotate_chunk = (file->height / imb_tsk_info.rotate_chunk_num + 9) / 10 * 10;//每个分块高度
} else {
imb_tsk_info.rotate_chunk = 0 ;
}
}
if (imb_tsk_info.rotate_en) {
[imb_tsk_info](imb_tsk_info.data_src = DATA_SRC_SRAM)[.](imb_tsk_info.data_src = DATA_SRC_SRAM)[data_src](imb_tsk_info.data_src = DATA_SRC_SRAM)[ =](imb_tsk_info.data_src = DATA_SRC_SRAM)[ DATA_SRC_SRAM](imb_tsk_info.data_src = DATA_SRC_SRAM);
imb_tsk_info.cur_in_flash = 1 ;
[imb_tsk_info](imb_tsk_info.zip_en = 0)[.](imb_tsk_info.zip_en = 0)[zip_en](imb_tsk_info.zip_en = 0)[ =](imb_tsk_info.zip_en = 0)[ 0](imb_tsk_info.zip_en = 0);
} else {
[imb_tsk_info](imb_tsk_info.data_src = DATA_SRC_FLASH)[.](imb_tsk_info.data_src = DATA_SRC_FLASH)[data_src](imb_tsk_info.data_src = DATA_SRC_FLASH)[ =](imb_tsk_info.data_src = DATA_SRC_FLASH)[ DATA_SRC_FLASH](imb_tsk_info.data_src = DATA_SRC_FLASH);
imb_tsk_info.cur_in_flash = 1 ;
if (file->format == PIXEL_FMT_L 1) {
| imb_tsk_info.zip_en | = 0 ; |
|---|---|
| } else { imb_tsk_info.zip_en | = 1 ; |
| }} |
imb_tsk_info.in_format = file->format;
imb_tsk_info.src_w = file->width ;
imb_tsk_info.src_h = file->height;
imb_tsk_info.x_offset = 0 ;
imb_tsk_info.y_offset = 0 ;
imb_tsk_info.des_w = file->width ;
imb_tsk_info.des_h = file->height;
imb_tsk_info.ff_info = file_info;
if (imb_tsk_info.in_format == PIXEL_FMT_L 1) { imb_tsk_info.l1_type = L 1_IMAGE;
}
imb_tsk_info.priv = (u32)file;
/* elm_id、id 可作为任务的唯一标识,通过该标识搜索任务句柄,若搜到则重置任务信息,没搜到则创建任务 /
/ p = imb_task_search_by_id(imb_task_head_get(0), imb_tsk_info.elm_id, imb_tsk_info.id); */
if (p) {
imb_task_reset(imb_task_head_get(0), p, &imb_tsk_info);} else {
imb_task_list_add(imb_task_head_get(0), &imb_tsk_info);}
}
6. 图片缩放输出
/* ---------------------------------------------------------------------------- */
/**@brief 创建图片缩放任务
@param file:图片信息
@param file_info:图片存储信息
@param ratio_w:水平放大倍率
@param ratio_h:垂直放大倍率
@param x:相对背景的x 坐标
@param y:相对背景的y 坐标
@param width:显示的图片宽度(放大后的宽度)
@param height:显示的图片高度(放大后的高度)
@return
@note
/
/ ---------------------------------------------------------------------------- */
void imb_create_image_scale_task(struct image_file *file, struct imb_task_info *file_info, float ratio_w, float ratio_h, int x, int y, int width, int height)
{
struct imb_task_info imb_tsk_info = {0};
struct imb_task p = NULL;
imb_tsk_info.scale_en = true;//缩放使能
if (imb_tsk_info.scale_en) {
imb_tsk_info.ratio_w = ratio_w;
imb_tsk_info.ratio_h = ratio_h ;
ASSERT(imb_tsk_info.ratio_w) ;
ASSERT(imb_tsk_info.ratio_h);}
[imb_tsk_info](imb_tsk_info.data_src = DATA_SRC_FLASH)[.](imb_tsk_info.data_src = DATA_SRC_FLASH)[data_src](imb_tsk_info.data_src = DATA_SRC_FLASH)[ =](imb_tsk_info.data_src = DATA_SRC_FLASH)[ DATA_SRC_FLASH](imb_tsk_info.data_src = DATA_SRC_FLASH);
imb_tsk_info.cur_in_flash = 1 ;
if (file->format == PIXEL_FMT_L 1) { [imb_tsk_info](imb_tsk_info.zip_en = 0)[.](imb_tsk_info.zip_en = 0)[zip_en](imb_tsk_info.zip_en = 0)[ =](imb_tsk_info.zip_en = 0)[ 0](imb_tsk_info.zip_en = 0);
} else {
[imb_tsk_info](imb_tsk_info.zip_en = 1)[.](imb_tsk_info.zip_en = 1)[zip_en](imb_tsk_info.zip_en = 1)[ =](imb_tsk_info.zip_en = 1)[ 1](imb_tsk_info.zip_en = 1);
}
imb_tsk_info.in_format = file->format;
imb_tsk_info.x_offset = x;
imb_tsk_info.y_offset = y;
imb_tsk_info.src_w = file->width ;
imb_tsk_info.src_h = file->height;
imb_tsk_info.des_w = width ;
imb_tsk_info.des_h = height;
imb_tsk_info.ff_info = file_info;
if (imb_tsk_info.in_format == PIXEL_FMT_L 1) { imb_tsk_info.l1_type = L 1_IMAGE;
}
imb_tsk_info.priv = (u32)file;
/ elm_id、id 可作为任务的唯一标识,通过该标识搜索任务句柄,若搜到则重置任务信息,没搜到则创建任务 /
/ p = imb_task_search_by_id(imb_task_head_get(0), imb_tsk_info.elm_id, imb_tsk_info.id); */
if (p) {
imb_task_reset(imb_task_head_get(0), p, &imb_tsk_info);} else {
imb_task_list_add(imb_task_head_get(0), &imb_tsk_info);}
}
7.多国语言字符串输出
/* ---------------------------------------------------------------------------- */
/**@brief 创建字符串任务
@param file:字符串信息
@param file_info:字符串存储信息
@param x:相对背景的x 坐标
@param y:相对背景的y 坐标
@param width:字符串显示的宽度,必须小于或者等于字符串的实际
宽度,小于实际宽度则截取显示
@param height:字符串显示的高度,必须小于或者等于字符串的实际高度,小于实际高度则截取显示
@param color:字符串的颜色(RGB565 格式)
@return
@note
/
/ ---------------------------------------------------------------------------- */
void imb_create_strpic_task(struct image_file *file, struct imb_task_info *file_info, int x, int y, int width, int height, u16 color)
{
struct imb_task_info imb_tsk_info = {0};
struct imb_task p = NULL;
[imb_tsk_info](imb_tsk_info.data_src = DATA_SRC_FLASH)[.](imb_tsk_info.data_src = DATA_SRC_FLASH)[data_src](imb_tsk_info.data_src = DATA_SRC_FLASH)[ =](imb_tsk_info.data_src = DATA_SRC_FLASH)[ DATA_SRC_FLASH](imb_tsk_info.data_src = DATA_SRC_FLASH);
imb_tsk_info.cur_in_flash = 1 ;
[imb_tsk_info](imb_tsk_info.zip_en = 0)[.](imb_tsk_info.zip_en = 0)[zip_en](imb_tsk_info.zip_en = 0)[ =](imb_tsk_info.zip_en = 0)[ 0](imb_tsk_info.zip_en = 0);
imb_tsk_info.in_format = LAYER_FORMAT_L 1 ;//file->format;
imb_tsk_info.x_offset = x;
imb_tsk_info.y_offset = y;
imb_tsk_info.src_w = file->width ;
imb_tsk_info.src_h = file->height;
imb_tsk_info.des_w = width ;
imb_tsk_info.des_h = height;
imb_tsk_info.text_color = color;
imb_tsk_info.ff_info = file_info;
imb_tsk_info.l1_type = L 1_TEXT;
imb_tsk_info.priv = (u32)file;
/ elm_id、id 可作为任务的唯一标识,通过该标识搜索任务句柄,若搜到则重置任务信息,没搜到则创建任务 /
/ p = imb_task_search_by_id(imb_task_head_get(0), imb_tsk_info.elm_id, imb_tsk_info.id); */
if (p) {
imb_task_reset(imb_task_head_get(0), p, &imb_tsk_info);} else {
imb_task_list_add(imb_task_head_get(0), &imb_tsk_info);}
}
8.字库输出
//ascii 字模拼接
u8 *ascii_image_splice(char *str, int *str_width, int *str_height){
int width ;
int height;
int realsize_w;
int realsize_h ;
u8 pixel[ 128] ;
char *p;
int offset = 0 ;
u8 *pixbuf = NULL;
u8 *pixbuf_temp;
realsize_w = 0 ;
realsize_h = 0 ;
p = str;
while ( *p) {//计算ascii 的总长度
font_ascii_get_pix(*p, pixel, sizeof(pixel), &height, &width); realsize_w += width ;
p++;
}
realsize_h = height;
u16 stride = (realsize_w + 31) / 32 * 32 / 8 ;
pixbuf = br28_zalloc(stride * realsize_h); if (!pixbuf) {
return 0 ;}
pixbuf_temp = br28_zalloc((realsize_w + 7) / 8 * realsize_h); if (!pixbuf_temp) {
return 0 ;}
p = str;
while ( p) {//获取ascii 字模
int i ;
/
字库字模排列
L L
. ... .
. ... .
. ... .
M M
L L
. ... .
. ... .
. ... .
M M
*/
font_ascii_get_pix(p, pixel, sizeof(pixel), &height, &width);
for (i = 0 ; i < height / 8 ; i++) {
memcpy(pixbuf_temp + realsize_w * i + offset, pixel + width * i, width);
}
offset += width ;
p++;
}
/
L1 图像排列
M L M L
. ... . . ... .
. ... . . ... .
M L M L
*/
ll_data_transformation(pixbuf_temp, pixbuf, stride, 0, 0, realsize_h, realsize_w) ;//ascii 字模转换成L1 格式的图像
if (pixbuf_temp) {
br28_free(pixbuf_temp) ;}
*str_width = realsize_w;
str_height = realsize_h ;
return pixbuf;}
/ ---------------------------------------------------------------------------- */
/**@brief 创建字库文字显示任务
@param x:相对背景的x 坐标
@param y:相对背景的y 坐标
@param width:显示的宽度
@param height:显示的高度
@param pixbuf:内存图片的起始地址
@param color:文字的颜色(RGB565 格式)
@return
@note 从效率角度考虑,建议先把字库的文字拼接成图片,再创建任务从sram 加载显示
/
/ ---------------------------------------------------------------------------- */
void imb_create_text_task(int x, int y, int width, int height, u8 *pixbuf, u 16 color)
{
struct imb_task_info imb_tsk_info = {0};
struct imb_task p = NULL;
[imb_tsk_info](imb_tsk_info.data_src = DATA_SRC_SRAM)[.](imb_tsk_info.data_src = DATA_SRC_SRAM)[data_src](imb_tsk_info.data_src = DATA_SRC_SRAM)[ =](imb_tsk_info.data_src = DATA_SRC_SRAM)[ DATA_SRC_SRAM](imb_tsk_info.data_src = DATA_SRC_SRAM);
imb_tsk_info.cur_in_flash = 0 ;
[imb_tsk_info](imb_tsk_info.zip_en = 0)[.](imb_tsk_info.zip_en = 0)[zip_en](imb_tsk_info.zip_en = 0)[ =](imb_tsk_info.zip_en = 0)[ 0](imb_tsk_info.zip_en = 0);
imb_tsk_info.in_format = LAYER_FORMAT_L 1 ;
imb_tsk_info.x_offset = x;
imb_tsk_info.y_offset = y;
imb_tsk_info.src_w = width ;
imb_tsk_info.src_h = height;
imb_tsk_info.des_w = width ;
imb_tsk_info.des_h = height;
imb_tsk_info.text_color = color;
imb_tsk_info.priv = pixbuf;
imb_tsk_info.ui_malloc = 1 ;
/ elm_id、id 可作为任务的唯一标识,通过该标识搜索任务句柄,若搜到则重置任务信息,没搜到则创建任务 /
/ p = imb_task_search_by_id(imb_task_head_get(0), imb_tsk_info.elm_id, imb_tsk_info.id); */
if (p) {
imb_task_reset(imb_task_head_get(0), p, &imb_tsk_info);} else {
imb_task_list_add(imb_task_head_get(0), &imb_tsk_info);}
}
9. 自定义绘图输出
#define DRAW_IMAGE 0x8
struct image_buf {
u8 *buf;
u32 len;} ;
static void ui_custom_draw_cb(int id, u8 *dst_buf, struct rect *dst_r, struct rect *src_r, u8 bytes_per_pixel, void *priv)
{
int w, h ;
struct rect r;
int dst_stride = (dst_r->width * bytes_per_pixel + 3) / 4 * 4 ;
int src_stride = (src_r->width * bytes_per_pixel + 3) / 4 * 4 ;
if (id == DRAW_IMAGE) {
struct image_buf *image_b = (struct image_buf *)priv;
printf( "ui_custom_draw_cb 0x%x,%d\n", image_b->buf, image_b->len);
printf( "dst [%d,%d,%d,%d], src [%d,%d,%d,%d]\n", dst_r
->left, dst_r->top, dst_r->width, dst_r->height, src_r->left, src_r->top, src_r->width, src_r->height) ;
if (get_rect_cover(src_r, dst_r, &r)) {
for (h = 0 ; h < r.height; h++) {
memcpy(&dst_buf[(r.top + h - dst_r->top) * dst_stride +(r.left - dst_r->left) * 2],
&image_b->buf[(r.top + h - src_r->top) * src_stride + (r.left - src_r->left) * 2],
r.width * 2);
}
}
}
}
static void *imb_draw_cb(void *priv){
struct imb_task_out *out = (struct imb_task_out *)priv;
struct imb_task task = out->task;
if (out->format == OUTPUT_FORMAT_RGB888) {
task->cur_format = LAYER_FORMAT_RGB888;} else if (out->format == OUTPUT_FORMAT_RGB565) { task->cur_format = LAYER_FORMAT_RGB565 ;
} else {
ASSERT(0, "curr format is not support!\n") ;}
task->x_offset = 0 ;
task->y_offset = 0 ;
task->src_w = out->rect.width ;
task->src_h = out->rect.height;
task->des_w = out->rect.width ;
task->des_h = out->rect.height;
task->dat_src_adr = (u32)out->outbuf;
ui_custom_draw_cb(task->cb_id, out->outbuf, &out->rect, &task->rect,(out->format == OUTPUT_FORMAT_RGB888) ? 3 : 2 , task->cb_priv);//不带alpha 的显示
return NULL;
}
/ ---------------------------------------------------------------------------- */
/**@brief 创建自定义绘图任务
@param x:相对背景的x 坐标
@param y:相对背景的y 坐标
@param width:显示的宽度
@param height:显示的高度
@param cb:回调函数
@param priv:回调函数参数
@param priv_len:参数长度
@param id:回调函数id 号(自定义)
@return
@note
/
/ ---------------------------------------------------------------------------- */
void imb_create_custom_task(int x, int y, int width, int height, void *cb, void *priv, int priv_len, int id)
{
struct imb_task_info imb_tsk_info = {0};
struct imb_task p = NULL;
[imb_tsk_info](imb_tsk_info.data_src = DATA_SRC_SRAM)[.](imb_tsk_info.data_src = DATA_SRC_SRAM)[data_src](imb_tsk_info.data_src = DATA_SRC_SRAM)[ =](imb_tsk_info.data_src = DATA_SRC_SRAM)[ DATA_SRC_SRAM](imb_tsk_info.data_src = DATA_SRC_SRAM);
imb_tsk_info.cur_in_flash = 0 ;
[imb_tsk_info](imb_tsk_info.zip_en = 0)[.](imb_tsk_info.zip_en = 0)[zip_en](imb_tsk_info.zip_en = 0)[ =](imb_tsk_info.zip_en = 0)[ 0](imb_tsk_info.zip_en = 0);
imb_tsk_info.in_format = 0 ;
imb_tsk_info.x_offset = x;
imb_tsk_info.y_offset = y;
imb_tsk_info.src_w = width ;
imb_tsk_info.src_h = height;
imb_tsk_info.des_w = width ;
imb_tsk_info.des_h = height;
imb_tsk_info.ff_info = NULL;
imb_tsk_info.cb = cb;
imb_tsk_info.cb_priv = priv;
imb_tsk_info.quote = 1 ;
imb_tsk_info.user_cb = cb ? 1 : 0 ;
imb_tsk_info.cb_id = id;
/ elm_id、id 可作为任务的唯一标识,通过该标识搜索任务句柄,若搜到则重置任务信息,没搜到则创建任务 /
/ p = imb_task_search_by_id(imb_task_head_get(0), imb_tsk_info.elm_id, imb_tsk_info.id); */
if (p) {
imb_task_reset(imb_task_head_get(0), p, &imb_tsk_info);} else {
imb_task_list_add(imb_task_head_get(0), &imb_tsk_info);}
}
10.Imb任务dump
/* ---------------------------------------------------------------------------- */
/**@brief 打印任务链的所有任务
@param root:任务列表头
@return
@note
/
/ ---------------------------------------------------------------------------- */
void imb_task_info_dump(struct imb_task_head *root){
struct imb_task *p;
printf( "imb_task info dump:\n") ;
list_for_each_entry(p, &root->entry, entry) {
printf( "%d,%s,%d x %d, [%d,%d,%d,%d]\n", p->index, p->name, p->src_w, p->src_h, p->rect.left, p->rect.top, p->rect.width, p->rect.height) ;
}
}
11.imb任务创建测试
//创建背景任务(必须)
imb_create_bg_task(info.color_format, info.width, info.height, 0xffff);
//图片分块输入旋转输出测试
int id = PAGE0_daca_COMPASS1 ;
ret = open_image_by_id(0, ui_resfile, &file, id & 0xff, id >> 16); ASSERT(!ret) ;
imb_create_image_rotate_chunk_task(&file, &ui_resfile_info, 227 , 227, 90, 227, 227) ;
imb_create_color_task(100, 100, 200, 200, 50 << 24 | 0x07e0);
//图片普通输出测试
id = PAGE0_4994_03_MENU_ICON_STATE_SEL;
ret = open_image_by_id(0, ui_resfile, &file, id & 0xff, id >> 16); ASSERT(!ret) ;
imb_create_image_task(&file, &ui_resfile_info, 100, 200, file.width, file.height) ;//width,height 参数可小于file.width, file.height,若小于则裁剪
id = PAGE0_4e97_04_MENU_ICON_HEART_SEL;
ret = open_image_by_id(0, ui_resfile, &file, id & 0xff, id >> 16); ASSERT(!ret) ;
imb_create_image_task(&file, &ui_resfile_info, 250, 200, file.width, file.height) ;
//多国语言字符串输出测试
id = M26;
ret = open_string_by_id(0, ui_strfile, &file, id);
ASSERT(!ret) ;
imb_create_strpic_task(&file, &ui_strfile_info, 100, 150, file.width, file. height, 0xf800);//width,height 参数可小于file.width, file.height,若小于则裁剪
id = M27 ;
ret = open_string_by_id(0, ui_strfile, &file, id);
ASSERT(!ret) ;
imb_create_strpic_task(&file, &ui_strfile_info, 150, 150, file.width, file. height, 0x001f);
//图片旋转输出测试
id = PAGE0_ 9d77_HOUR;
ret = open_image_by_id(0, ui_resfile, &file, id & 0xff, id >> 16); ASSERT(!ret) ;
imb_create_image_rotate_task(&file, &ui_resfile_info, 23, 133, 45, 227, 227) ;
id = PAGE0_5fd9_MINUTE_SEC;
ret = open_image_by_id(0, ui_resfile, &file, id & 0xff, id >> 16); ASSERT(!ret) ;
imb_create_image_rotate_task(&file, &ui_resfile_info, 22, 202, 180, 22 7 , 227) ;
imb_create_image_rotate_task(&file, &ui_resfile_info, 22, 202, 270 , 22 7 , 227) ;
//图片缩放输出测试
id = PAGE0_5dad_05_MENU_ICON_BLOOD_SEL;
ret = open_image_by_id(0, ui_resfile, &file, id & 0xff, id >> 16); ASSERT(!ret) ;
imb_create_image_scale_task(&file, &ui_resfile_info, 1.5, 1.5, 180, 280, file.width * 1.5 , file.height*1.5) ;//width/height 参数小于放大后的宽高则为截取
//自定义绘图测试
struct image_buf image;
image.buf = icon_48x49_rgb565 ;
image.len = sizeof(icon_48x49_rgb565) ;
imb_create_custom_task(200, 200, 48, 49, imb_draw_cb, &image, size of(struct image_buf), DRAW_IMAGE) ;
//字库显示测试(为了提高效率,建议先将字库拼接成一张单色的图像) int width ;
int height;
ret = font_ascii_init(RES_PATH"font/ascii.res") ;
ASSERT(!ret) ;
u8 *pixbuf = ascii_image_splice("0123456789", &width, &height) ;
ASSERT(pixbuf);
imb_create_text_task(120, 120, width, height, pixbuf, 0xf800);
imb_task_info_dump(imb_task_head_get(0));
•效果图

五、注意要点
五、注意要点
(l) imb从sram或者psram读取图像数据时,存放在sram或者psram 的图像的stride(即每行像素的字节数)需要4对齐
(2) imb输出的图像stride(即每行像素的字节数)需要4对齐
