HAL EPIC模塊提供抽象的軟件接口操作硬件EPIC模塊,EPIC為一個2D圖形引擎,它支持的特性
| 功能 | 55X | 58X | 56X | 54X |
|---|---|---|---|---|
| 橫向縮放 | 3.8, 即縮小8倍,放大256倍, 精度1/256 | 10.16, 即縮小1024倍,放大65536倍, 精度1/65536 | 同58X | 同58X |
| 縱向縮放 | 橫向縱向縮放倍數(shù)固定一樣,不能分開配置 | 10.16, 即縮小1024倍,放大65536倍, 精度1/65536, 且可以和橫向縮放系數(shù)不一樣 | 同58X | 同58X |
| 旋轉(zhuǎn)角度 | [0 ~ 3600], 單位為0.1度 | 同55X | 同55X | 同55X |
| 水平鏡像 | 支持 | 支持 | 支持 | 支持 |
| 垂直鏡像 | 不支持 | 不支持 | 不支持 | 支持 |
例如, 前景圖為繞圖片外錨點旋轉(zhuǎn)并放大后, 與背景、輸出區(qū)域的并集不超過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 |
詳細(xì)的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 |
首先調(diào)用 HAL_EPIC_Init 初始化HAL EPIC. 在 EPIC_HandleTypeDef 結(jié)構(gòu)中需指定EPIC實例(即使用的EPIC硬件模塊),芯片只有一個EPIC實例 hwp_epic 。 初始化之后即可調(diào)用各種圖形操作的接口處理數(shù)據(jù)。
例如,
HAL_EPIC_Rotate_IT 用于中斷模式的混疊、旋轉(zhuǎn)和縮放操作, HAL_EPIC_BlendStart_IT 用于中斷模式的混疊操作,需要在中斷服務(wù)程序中調(diào)用 HAL_EPIC_IRQHandler 處理中斷。
如圖1所示,示例blend_img_1與blend_img_2中,前景圖所在區(qū)域的坐標(biāo)為(10, 20)~(59,79),背景圖所在區(qū)域的坐標(biāo)為(0,0)~(99,99), 輸出區(qū)域坐標(biāo)為(5,10)~(44,59),所有坐標(biāo)均為一個坐標(biāo)系中的數(shù)值,體現(xiàn)三個區(qū)域的相對位置關(guān)系, 前景圖以39%的透明度與背景混疊,混疊后(5,10)~(44,59)區(qū)域的顏色值被順序?qū)懭氲捷敵鯾uffer,其中與前景重疊的部分(畫叉的部分,即區(qū)域[10,20]~[44,59])為混疊后的顏色,非重疊部分則是背景圖中的顏色。 需要注意的是所有的數(shù)據(jù)buffer均為對應(yīng)區(qū)域左上角像素的存放地址,例如fg_img.data指向前景圖的坐標(biāo)(10,20)所在像素的顏色值,outout_img.data指向輸出區(qū)域的左上角像素,即(5,10)的顏色值。
blend_img_2展示了輸出buffer復(fù)用背景圖buffer的場景,這也是最常使用的,即frame buffer作為背景圖buffer和輸出buffer, 這種情況下背景圖buffer中的(10,20)~(44,59)區(qū)域所在的顏色值會被修改為混疊后的顏色,其他位置的顏色值保持不變, 需要注意output_img.width和output_img.total_width的設(shè)置,output_img.width表示輸出區(qū)域的寬度,即44-5+1=40, 但output_img.total_width表示輸出buffer的寬度,因為輸出buffer對應(yīng)的圖形大小為100*100,所以output_img.total_width應(yīng)設(shè)為100, 這樣EPIC在寫完一行40個像素的數(shù)據(jù)后,會跳過余下的60個像素,繼續(xù)更新下一行的數(shù)據(jù)。 fg_img和bg_img的width和total_width也是相同的含義。
如圖2所示,示例rotate_img將位于(10,20)~(59,79)的前景圖以圖中心為軸順時針旋轉(zhuǎn)30度,與背景圖混疊后更新背景圖對應(yīng)位置的顏色,落在旋轉(zhuǎn)后圖形外的像素仍舊保持背景圖的顏色。 由于旋轉(zhuǎn)后圖形覆蓋的矩形區(qū)域會擴(kuò)大(即[x0,y0]~[x1,y1]),為了保證旋轉(zhuǎn)后的圖形能被完整的顯示出來,可以簡單的將輸出區(qū)域設(shè)成最大,HAL將自動計算旋轉(zhuǎn)后的矩形區(qū)域, 當(dāng)背景圖buffer與輸出buffer相同時, 只會更新輸出buffer中被旋轉(zhuǎn)區(qū)域覆蓋的像素點的顏色。
如圖3所示,示例scale_down_img將位于(10,20)~(59,79)的前景圖橫向與縱向都縮小到原圖的71%,同時保持圖中心點位置不變。 類似旋轉(zhuǎn),也可以簡單的將輸出區(qū)域設(shè)成最大,如果輸出buffer復(fù)用背景buffer,HAL將只更新縮小后區(qū)域(即[x0,y0]~[x1,y1])所包含的像素的顏色值。
一個大小為100*90的buffer,在其(20,10)~(39, 49)區(qū)域填充顏色RGB(99,107,123),配置的顏色值為RGB888格式,填充后的顏色格式為RGB565,硬件會作顏色格式轉(zhuǎn)換。 透明度為100,255表示不透明,0表示透明。 因為填充的第一個像素位置為(20,10),相對buffer的首地址有偏移,配置的起始地址應(yīng)為偏移后的地址,total_width為buffer的總寬度,即100,width為填充區(qū)域的寬度,即(39-20+1)=20, 填充完一行20個像素的顏色后,會跳過余下的80個顏色,轉(zhuǎn)到下一行繼續(xù)填充,直到填完指定行數(shù)。