HAL EPIC模块提供抽象的软件接口操作硬件EPIC模块,EPIC为一个2D图形引擎,它支持的特性
功能 | 55X | 58X | 56X | 54X |
---|---|---|---|---|
横向缩放 | 3.8, 即缩小8倍,放大256倍, 精度1/256 | 10.16, 即缩小1024倍,放大65536倍, 精度1/65536 | 同58X | 同58X |
纵向缩放 | 横向纵向缩放倍数固定一样,不能分开配置 | 10.16, 即缩小1024倍,放大65536倍, 精度1/65536, 且可以和横向缩放系数不一样 | 同58X | 同58X |
旋转角度 | [0 ~ 3600], 单位为0.1度 | 同55X | 同55X | 同55X |
水平镜像 | 支持 | 支持 | 支持 | 支持 |
垂直镜像 | 不支持 | 不支持 | 不支持 | 支持 |
例如, 前景图为绕图片外锚点旋转并放大后, 与背景、输出区域的并集不超过1024
![]()
输入颜色格式支持 | 55X | 58X | 56X | 54X |
---|---|---|---|---|
RGB565/ARGB8565/RGB888/ARGB88888 | Y | Y | Y | Y |
L8 | N | Y | Y | Y |
A4/A8 (Mask,Overwrite,Fill) | N | Y | Y | Y |
YUV(YUYV/UYVY/iYUV) | N | N | Y | Y |
A2 (Fill) | N | N | N | Y |
输出颜色格式支持 | 55X | 58X | 56X | 54X |
---|---|---|---|---|
RGB565/ARGB8565/RGB888/ARGB88888 | Y | Y | Y | Y |
详细的API说明请参考 EPIC 。
bit31~bit25 | bit24~bit17 | bit16~bit8 | bit7~bit0 | |
---|---|---|---|---|
RGB565 | / | / | R4~R0G5~G3 | G2~G0B4~B0 |
ARGB8565 | / | A7 ~ A0 | R4~R0G5~G3 | G2~G0B4~B0 |
RGB888 | / | R7 ~ R0 | G7 ~ G0 | B7 ~ B0 |
ARGB8888 | A7 ~ A0 | R7 ~ R0 | G7 ~ G0 | B7 ~ B0 |
A8 | D7 ~ D0 | C7~C0 | B7~B0 | A7~A0 |
A4 | / | / | D3~D0C3~C0 | B3~B0A3~A0 |
A2 | / | / | H1H0G1G0F1F0E1E0 | D1D0C1C0B1B0A1A0 |
首先调用 HAL_EPIC_Init 初始化HAL EPIC. 在 EPIC_HandleTypeDef 结构中需指定EPIC实例(即使用的EPIC硬件模块),芯片只有一个EPIC实例 hwp_epic 。 初始化之后即可调用各种图形操作的接口处理数据。
例如,
HAL_EPIC_Rotate_IT 用于中断模式的混叠、旋转和缩放操作, HAL_EPIC_BlendStart_IT 用于中断模式的混叠操作,需要在中断服务程序中调用 HAL_EPIC_IRQHandler 处理中断。
如图1所示,示例blend_img_1
与blend_img_2
中,前景图所在区域的坐标为(10, 20)~(59,79),背景图所在区域的坐标为(0,0)~(99,99), 输出区域坐标为(5,10)~(44,59),所有坐标均为一个坐标系中的数值,体现三个区域的相对位置关系, 前景图以39%的透明度与背景混叠,混叠后(5,10)~(44,59)区域的颜色值被顺序写入到输出buffer,其中与前景重叠的部分(画叉的部分,即区域[10,20]~[44,59])为混叠后的颜色,非重叠部分则是背景图中的颜色。 需要注意的是所有的数据buffer均为对应区域左上角像素的存放地址,例如fg_img.data指向前景图的坐标(10,20)所在像素的颜色值,outout_img.data指向输出区域的左上角像素,即(5,10)的颜色值。
blend_img_2
展示了输出buffer复用背景图buffer的场景,这也是最常使用的,即frame buffer作为背景图buffer和输出buffer, 这种情况下背景图buffer中的(10,20)~(44,59)区域所在的颜色值会被修改为混叠后的颜色,其他位置的颜色值保持不变, 需要注意output_img.width和output_img.total_width的设置,output_img.width表示输出区域的宽度,即44-5+1=40, 但output_img.total_width表示输出buffer的宽度,因为输出buffer对应的图形大小为100*100,所以output_img.total_width应设为100, 这样EPIC在写完一行40个像素的数据后,会跳过余下的60个像素,继续更新下一行的数据。 fg_img和bg_img的width和total_width也是相同的含义。
如图2所示,示例rotate_img将位于(10,20)~(59,79)的前景图以图中心为轴顺时针旋转30度,与背景图混叠后更新背景图对应位置的颜色,落在旋转后图形外的像素仍旧保持背景图的颜色。 由于旋转后图形覆盖的矩形区域会扩大(即[x0,y0]~[x1,y1]),为了保证旋转后的图形能被完整的显示出来,可以简单的将输出区域设成最大,HAL将自动计算旋转后的矩形区域, 当背景图buffer与输出buffer相同时, 只会更新输出buffer中被旋转区域覆盖的像素点的颜色。
如图3所示,示例scale_down_img将位于(10,20)~(59,79)的前景图横向与纵向都缩小到原图的71%,同时保持图中心点位置不变。 类似旋转,也可以简单的将输出区域设成最大,如果输出buffer复用背景buffer,HAL将只更新缩小后区域(即[x0,y0]~[x1,y1])所包含的像素的颜色值。
一个大小为100*90的buffer,在其(20,10)~(39, 49)区域填充颜色RGB(99,107,123),配置的颜色值为RGB888格式,填充后的颜色格式为RGB565,硬件会作颜色格式转换。 透明度为100,255表示不透明,0表示透明。 因为填充的第一个像素位置为(20,10),相对buffer的首地址有偏移,配置的起始地址应为偏移后的地址,total_width为buffer的总宽度,即100,width为填充区域的宽度,即(39-20+1)=20, 填充完一行20个像素的颜色后,会跳过余下的80个颜色,转到下一行继续填充,直到填完指定行数。