KDocs 研发资料库
  • 屏融合应用方案入口汇总
  • JL701N穿戴客述问题FAQ
  • JL701N穿戴类补丁list
  • 手表软件调试
  • JL701手表硬件设计注意事项 总结
  • 手表烧录_升级工具说明
  • 手表量产相关
  • 生产烧录KEY及代码和升级代码
  • AC695N系列手表SDK开发指南
  • JL7012A手表-SDK入门指南V1.0
  • 穿戴手表JL701N-入门到进阶开发指导
  • 彩屏充电仓JL701N LVGL入门到进阶指导文档
  • AC695N手表软硬件问题整理
  • JL701N手表软硬件问题整理
  • 701n手表SDK共性问题汇总
  • UI效果参考demo文档
  • 屏幕触摸驱动相关参考
  • 穿戴类支付宝支付流程
  • AC701N_PMU_介绍
  • 经典蓝牙相关接口说明
  • music应用详细设计说明书
  • music_player接口设计说明文档
  • PO声测试以及处理方法
  • DAC性能测试指南
  • 杰理串口升级规范
  • AC696N串口升级说明
  • AC695N系列手表UI开发指南
  • AC695N添加升级UI说明文档.
  • UI布局工具使用说明
  • UI接口设计说明书
  • UI工具快速使用说明
  • 701N_UI编辑工具用户手册
  • UI工程源文件升级工具使用说明
  • 701N屏幕驱动配置说明
  • JL701N 2D图形硬件加速接口使用说明
  • JL701_watch常用例子参考
  • JL_WATCH_SDK UI相关工具使用文档
  • 智能手表音频 设计调试手册 V1.2
  • AC695X_AC696X_AD697X 常见通话问题处理参考资料
  • 701手表 PCBA产测工具使用说明书 V1.0
  • 杰理定频问题排查2021.1.26
  • BQB5.4 20231007
  • 各类概率性死机调试解决指南
  • 不开机问题处理汇总(仅供参考)
  • 蓝牙搜索不到问题处理汇总(仅供参考)
  • 样机发烫(仅供参考)
  • 蓝牙音乐卡顿问题处理汇总(仅供参考)
  • 充电问题处理汇总(仅供参考)
  • 触摸问题处理汇总(仅供参考)
  • 功耗调试指导
  • JL701N穿戴客述问题FAQ
  • 701N 开发板新屏幕驱动修改
  • AC701 nandflash A8图片显示问题
  • 支付宝乘车码接入资料
  • 多国语言及字库使用指南
  • 查看C程序Flash 和RAM 资源占用说明文档
  • 701N_SDK3.0.1_OPUS_OGG 编解码
  • 蓝牙在线调eq说明
  • BR EDR BLE 蓝牙性能测试配置方法_
  • BLE-HID
  • BLE-HID 调试文档
  • 【问题】701v301外置flash播放wts提示音
  • 本地录音开启及调试
  • 死机分析
  • 表盘传输APP层的压缩算法
  • 功能模版:JL701_V301_UI资源使用FAT文件系统demo
  • JL7013+4G CAT1 参考设计原理图
  • 吾爱4G模组+JL701接口说明
  • (电脑一拖多)手表升级dongle工具使用补充说明
  • 蓝牙接口使用说明
  • ble 开发流程
  • 彩屏仓功耗优化
  • 彩屏仓补丁list
  • 更新字库步骤
  • 支付宝硬件接入资料

JL701N 2D图形硬件加速接口使用说明

📎 原始文档:https://www.kdocs.cn/l/cqYbc9nxPJsXimage

AC701N 2D 图像硬件加速接口使用说明

珠海市杰理科技股份有限公司

Zhuhai Jieli Technology Co.,LTD

版权所有,未经许可,禁止外传

修改记录

版本更新日期描述
1.02022/4/15初版
1.12022/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里的地址映射表
image 获 取 文 件 地 址 映 射 表 的 相 关 接 口 为 ui_res_flash_info_get、

ui_res_flash_info_free

•截取显示 imb支持图片的截取显示,如下图所示:
image

•链式结构

imb 的所有任务是通过一条链表连接起来,imb 合成的时候按照链表的先后顺序依次执行任务链上的各个任务
image

三、 函数接口

/* ------------------------------------------------------------------- */
/@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/,分块参数如下图所示
注:分块的原则是水平方向不分块,与屏幕等宽,垂直方向分块
imageimage

四、测试环境搭建

http://www.zh.jieli.com/

四、测试环境搭建

(一)生成资源

ResBuilder.xml 是工具 ResBuilder.exe 的接 口文件, 可直接编辑 ResBuilder.xml 的PictureList或CellList,也可通过工具修改,图片路径可以支持绝对路径或相对路径绝对路径
image 相对路径
image 编辑完后直接运行Run_ResBuilder.bat脚本则会生成相关资源文件以及索引文件,然后将生成的资源文件手动拷贝到下载目录ui_resources,图片索引文件ui_pic_index.h 以及字符串索引文件ui_str_index.h 则拷贝到到
btsdk/apps/watch/include/ui/目录下,修改下载脚本download.bat,脚本修改如下所示
image

(二)使能IMB_DEMO

btsdk/apps/watch/board/br28/board_701n_demo/board_701n_demo_cfg.h
image

(三)测试
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));
•效果图
imageimage

五、注意要点

http://www.zh-jieli.com/

五、注意要点

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

Prev
701N屏幕驱动配置说明
Next
JL701_watch常用例子参考