【转】如何让ucgui支持24位色(24bpp)
將UC/GUI 3.32a 更改為可以支持24bpp色彩模式
?
我打算在UC/OS-II上直接移植一個(gè)開源的GUI界面。所以我從網(wǎng)上找了一些GUI的開源代碼,主要看了看飛漫軟件的MiniGUI和Micrium公司的uC/GUI。
飛漫軟件的MiniGUI可免費(fèi)下載的版本是1.3.3,可是不支持UC/OS-II,網(wǎng)上的介紹中比較適合移植到LINUX。飛漫軟件已經(jīng)發(fā)行了可以在UC/OS-II上運(yùn)行的版本,但已經(jīng)是商業(yè)版本了,不是我可以隨便下載的了。
uC/GUI比較適合UC/OS-II,正是我希望的。我將它移植到了UC/OS-II中,發(fā)現(xiàn)目前的版本3.32a最大只支持16bpp,不支持24bpp。我將它改成了24bpp模式,就當(dāng)作是熟悉一下uC/GUI了。
1???????? UC/GUI介紹
uC/GUI是Micrium公司開發(fā)的通用的嵌入式用戶圖形界面軟件。它給任何使用圖形LCD的應(yīng)用程序提供獨(dú)立于處理器和LCD控制器之外的有效的圖形用戶接口??梢詰?yīng)用于單一任務(wù)環(huán)境,也可以應(yīng)用于多任務(wù)環(huán)境中。uC/GUI能夠應(yīng)用于任何LCD控制器和CPU的任何尺寸的物理顯示或者模擬顯示中。
?? uC/GUI的特點(diǎn)如下:
◆ 適用于任何8位/16位/32位CPU,可允許于支持ANSI C的任何編譯器
◆ 適用于任何控制器驅(qū)動(dòng)任何LCD(單色,灰度,或者彩色)
◆ 通過配置宏,可支持任何接口
◆ 可配置顯示尺寸
◆ 可在LCD的任何一點(diǎn)上顯示字符和畫位圖
◆ 對(duì)于顯示尺寸和速度提供優(yōu)化進(jìn)程,編譯時(shí)間依賴于采用的優(yōu)化進(jìn)程
◆? 支持虛擬顯示,虛擬顯示的尺寸比實(shí)際顯示大。
更對(duì)UC/GUI的說明和資料請(qǐng)登陸www. ucgui.com。
2???????? UC/GUI需要進(jìn)行的更改
在www.ucgui.com上可以下載到UC/GUI的用戶手冊(cè),如果僅僅是將UC/GUI移植到S3C2410上,可以參照第20-23章,這里就不再詳細(xì)說明。
如果是僅僅將UC/GUI移植到UC/OS-II上,可以參照第11章。
因?yàn)槟壳澳軌颢@得的UC/GUI源碼僅能夠支持1、2、4、8、16bpp。我簡單介紹如何支持24bpp模式,可以用于在8.6英寸TFT-LCD上顯示更多色彩。
???? 需要修改的地方包括:
1)CONFIG目錄下文件:主要是LCDCONF.h、GUICONF.H;
2)LCDDRIVER目錄下文件,LCD_S3C2410.C
3)CORE目錄下文件:包括GUI.H、GUITYPE.H、LCD.H、 LCD_CONFDEFAULTS.H、LCD_PRIVATE.H、GUIALLOC.C、 LCD_L0_GENERIC.C。
4)MEMDEV目錄下文件: GUIDEV.C。
根據(jù)我的修改,目前使用本文后面的UCGUI_test()測試一切正常。
目前還沒有進(jìn)行WM和AA的測試,本文僅僅提供一下修改的思路。以后隨著移植進(jìn)一步完善,可能會(huì)有后續(xù)修改,請(qǐng)留意。
3???????? 配置頭文件
3.1???? LCDCONF.H
修改BPP宏:
#define LCD_BITSPERPIXEL??????? (24)
重新定義內(nèi)存讀寫宏,使之符合U32格式:
#define LCD_READ_MEM(Off)??????????? *((U32*)???????? (gActiveFrameBuffer+((U32)(Off))))
#define LCD_WRITE_MEM(Off,data)????? *((U32*)???????? (gActiveFrameBuffer+((U32)(Off))))=data
3.2???? GUICONF.H
將默認(rèn)字體改為GUI_Font8x16,這是因?yàn)槲矣X得這種字體看起來比較大,適合我手頭的屏幕。為了節(jié)約空間,我僅僅使用了三種字體,其他FONT都沒有編譯。
增大GUI_ALLOC_SIZE的值,因?yàn)槠聊惠^大,而且使用了24bpp模式。視你需要的最大尺寸設(shè)置。
目前,我把MEMDEV、OS、TOUCH、UNICODE、WM支持都打開了,但是除了MEMDEV都沒有測試過,下一步會(huì)逐個(gè)測試。我覺得AA沒有必要,所以也沒有打開。
4???????? S3C2410驅(qū)動(dòng)更改
修改LCD_S3C2410.C,在繪制位圖的函數(shù)LCD_L0_DrawBitmap中,增加LCD_BITSPERPIXEL>16的switch-case條件,使用函數(shù)DrawBitLine24BPP。
??? #if (LCD_BITSPERPIXEL > 16)
????? case 24:
??????? DrawBitLine24BPP(x0, i + y0, (const U32 *)pData, xsize, pTrans);
??????????? //注意pData的類型已經(jīng)改為U32。
??????? break;
??? #endif???
增加24bpp的畫線函數(shù),如下:
#if (LCD_BITSPERPIXEL > 16)
static void? DrawBitLine24BPP(int x, int y, U32 const * p, int xsize, const LCD_PIXELINDEX * pTrans)
{
… …//函數(shù)體與DrawBitLine16BPP相同。
}
兩個(gè)點(diǎn)操作函數(shù),LCD_L0_GetPixelIndex()和LCD_L0_SetPixelIndex()可以不用修改,因?yàn)樵谙旅娴牟襟E中LCD_PIXELINDEX的定義已經(jīng)更改為U32了。
5???????? UC/GUI內(nèi)核修改
5.1???? GUI.H
修改LCD_COLORINDEX_UNION的UNION定義,否則COLOR和BKCOLOR永遠(yuǎn)只能夠使用16bpp。
typedef union {
? U8? aColorIndex8[2];
? U16 aColorIndex16[2];
? U32 aColorIndex32[2]; //增加這一句。
} LCD_COLORINDEX_UNION;
5.2???? GUITYPE.H
將GUI_HANDLE、GUI_HWIN、GUI_HMEM定義為I32。
#define GUI_HANDLE int
#define GUI_HWIN??????????? I32P
#define???? GUI_HMEM I32P
5.3???? LCD.H
重新定義LCD_COLOR。
typedef U32 LCD_COLOR;
5.4???? LCD_CONFDEFAULTS.H
重新定義LCD_BITSPERPIXEL。
#if LCD_BITSPERPIXEL <=8
? #define LCD_PIXELINDEX U8
#elif LCD_BITSPERPIXEL <=16
? #define LCD_PIXELINDEX U16
#else
? #define LCD_PIXELINDEX U32 //增加這一句
#endif
5.5???? LCD_PRIVATE.H
重新定義LCD_BKCOLORINDEX、LCD_COLORINDEX、LCD_ACOLORINDEX。
#if LCD_BITSPERPIXEL <=8
? #define LCD_BKCOLORINDEX GUI_Context.LCD.aColorIndex8[0]
? #define LCD_COLORINDEX?? GUI_Context.LCD.aColorIndex8[1]
? #define LCD_ACOLORINDEX? GUI_Context.LCD.aColorIndex8
#elif LCD_BITSPERPIXEL <=16
? #define LCD_BKCOLORINDEX GUI_Context.LCD.aColorIndex16[0]
? #define LCD_COLORINDEX?? GUI_Context.LCD.aColorIndex16[1]
? #define LCD_ACOLORINDEX? GUI_Context.LCD.aColorIndex16
#else //增加一下幾句
? #define LCD_BKCOLORINDEX GUI_Context.LCD.aColorIndex32[0]
? #define LCD_COLORINDEX?? GUI_Context.LCD.aColorIndex32[1]
? #define LCD_ACOLORINDEX? GUI_Context.LCD.aColorIndex32
#endif
5.6???? GUIALLOC.C
將GUI_BLOCK_ALIGN改為4個(gè)字節(jié)對(duì)齊。
#define GUI_BLOCK_ALIGN 4
5.7???? LCD_L0_GENERIC.C
重新編寫COLOR2INDEX()和INDEX2COLOR()。
? #define COLOR2INDEX(Color) ReverseRGB(Color)
?? #define INDEX2COLOR(Index) ReverseRGB(Index)
其中,
LCD_COLOR ReverseRGB(LCD_COLOR Color)
{
?? U32 r, g, b;
????????? r = (Color)? &0xff;
????????? g = (Color>>8) &0xff;
????????? b = (Color>>16) &0xff;???????
?? return b+(g<<8)+(r<<16);
}
ReverseRGB()的目的是將UC/GUI默認(rèn)的BGR色彩改為RGB色彩。
6???????? MEMDEV的修改
6.1???? GUIDEV.C
修改_DrawBitmap函數(shù),增加BitsPerPixel==24的if語句,
? #if LCD_BITSPERPIXEL >16
??? if (BitsPerPixel==24) {
????? for (i=0; i<ysize; i++) {
??????? DrawBitLine24BPP_DDB(pUsage, x0, i+y0, (U32*)pData, xsize);
??????? pData += BytesPerLine;
????? }
????? return;
??? }
? #endif
?????? 其中DrawBitLine24BPP_DDB為,
#if LCD_BITSPERPIXEL >16
static void? DrawBitLine24BPP_DDB(GUI_USAGE* pUsage, int x, int y, const U32 *pSrc, int xsize) {
? LCD_PIXELINDEX* pDest;
? pDest = GUI_MEMDEV_XY2PTR(x,y);
? switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
? case 0:??? /* Write mode */
??? memcpy(pDest, pSrc, xsize*4);
??? break;
? case LCD_DRAWMODE_TRANS:
??? do {
????? if (*pSrc) {
??????? *pDest = *pSrc;
??????? GUI_USAGE_AddPixel(pUsage, x,y);
????? }
????? x++;
????? pDest++;
????? pSrc++;
??? } while (--xsize);
??? break;
? }
}
#endif
GUI_MEMDEV_CreateEx中增加,
? #if LCD_BITSPERPIXEL <= 8
??? int BytesPerLine = (( 8*xsize+15)>>4)<<1;? /* Reserve 8 bits for pixels */
? #elif LCD_BITSPERPIXEL <= 16
??? int BytesPerLine = ((16*xsize+15)>>4)<<1;? /* Reserve 16 bits for pixels */
? #else //增加這一句
??? int BytesPerLine = ((32*xsize+15)>>4)<<1;? /* Reserve 24 bits for pixels */
? #endif
同時(shí)修改,
#if LCD_BITSPERPIXEL <=8
? #define BITSPERPIXEL 8
#elif LCD_BITSPERPIXEL <=16
? #define BITSPERPIXEL 16
#else //增加這一句
? #define BITSPERPIXEL 24
#endif
7???????? 測試
修改后Metromerks CodeWarrior project目錄結(jié)構(gòu)如下:
修改完成后使用UCGUI_test()函數(shù)測試,在每個(gè)delay()時(shí)設(shè)置斷點(diǎn),可以看顯示是否正確。下面的有些語句是從《UC/GUI用戶手冊(cè)》中摘來的。
void UCGUI_test(void)
{
?? U32 i,j;
?? GUI_MEMDEV_Handle hMem;??
??
GUI_Init();
?? //測試數(shù)字顯示函數(shù)
?? GUI_MEMDEV_Select(0);
?? GUI_SetBkColor(GUI_BLACK);
?? GUI_SetColor(GUI_WHITE);
?? GUI_Clear();
?? GUI_DispDecAt(123456, 100, 50, 9);
?? GUI_DispDecAt(123456, 100, 70, 4);
?? GUI_DispDecAt(-123456, 100, 90, 9);
?? GUI_GotoXY(100,110);
?? GUI_DispFloat(12345.6, 9);
?? GUI_GotoXY(100,130);
?? GUI_DispFloat(12345.6, 4);
?? GUI_GotoXY(100,150);
?? GUI_DispFloat(-12345.6, 9);
?? GUI_GotoXY(100,170);
?? GUI_DispString(GUI_GetVersionString());
?? delay(600000);
??
?? //測試文本顯示函數(shù)
?? GUI_SetBkColor(GUI_BLUE);
?? GUI_Clear();
?? GUI_SetPenSize(10);
?? GUI_SetColor(GUI_RED);
?? GUI_DrawLine(80,10,240,90);
?? GUI_DrawLine(80,90,240,10);
?? GUI_SetBkColor(GUI_BLACK);
?? GUI_SetColor(GUI_WHITE);
?? GUI_SetTextMode(GUI_TM_NORMAL);
?? GUI_DispStringHCenterAt("GUI_TM_NORMAL", 160, 10);
?? GUI_SetTextMode(GUI_TM_REV);
?? GUI_DispStringHCenterAt("GUI_TM_REV", 160, 26);
?? GUI_SetTextMode(GUI_TM_TRANS);
?? GUI_DispStringHCenterAt("GUI_TM_TRANS", 160, 42);
?? GUI_SetTextMode(GUI_TM_XOR);
?? GUI_DispStringHCenterAt("GUI_TM_XOR", 160, 58);
?? GUI_SetTextMode(GUI_TM_TRANS|GUI_TM_REV);
?? GUI_DispStringHCenterAt("GUI_TM_TRANS|GUI_TM_REV", 160, 74);????????
?? delay(600000);
??
?? //測試2-D繪圖函數(shù)
?? GUI_SetColor(GUI_YELLOW);
?? GUI_SetBkColor(GUI_GRAY);
?? GUI_Clear();
?? GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);
?? GUI_FillCircle(120, 64, 40);
?? GUI_SetDrawMode(GUI_DRAWMODE_XOR);
?? GUI_FillCircle(140, 84, 40);
?? GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);
?? GUI_FillRect(100, 100, 200, 200);
?? GUI_InvertRect(120, 120, 180, 180);
?? for(i=0;i<10;i++)
??????????? GUI_DrawCircle(200, 200, 20*i);
?? GUI_DrawBitmap(&bmsample8bpp, 200, 200);
?? GUI_DrawBitmap(&bmsampleGray, 400, 200);
?? delay(600000);
??
?? //MEMDEV繪圖設(shè)備測試,包括數(shù)字、文本、2-D繪圖。
?? GUI_SetColor(GUI_YELLOW);
?? GUI_SetBkColor(GUI_GRAY);
?? GUI_SetTextMode(GUI_TM_NORMAL);
?? GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);
?? GUI_Clear();
?? hMem="GUI"_MEMDEV_Create(0,0,200,200);
?? GUI_MEMDEV_Select(hMem);
??
?? GUI_DrawBitmap(&bmsample8bpp, 0, 0);
?? GUI_DispStringAt("GUI_TM_NORMAL", 0, 100);
?? GUI_MEMDEV_CopyToLCD(hMem);
?? delay(600000);
?? GUI_Clear();
??
?? GUI_GotoXY(10,10);
?? GUI_DispFloat(-12345.6, 9);
?? GUI_DrawLine(0,0,100,100);
?? GUI_DrawLine(0,100,100,0);
?? GUI_MEMDEV_CopyToLCD(hMem);
?? delay(600000);
?? GUI_Clear();
??
?? GUI_SetPenSize(2);
?? GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);
?? GUI_FillCircle(50, 50, 20);
?? GUI_SetDrawMode(GUI_DRAWMODE_XOR);
?? GUI_FillCircle(70, 50, 20);
?? GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);
?? for(i=0;i<10;i++)
??????????? GUI_DrawCircle(50, 50, 5*i);
?? GUI_MEMDEV_CopyToLCD(hMem);
?? delay(600000);
??
?? GUI_MEMDEV_Select(0);
?? GUI_MEMDEV_Delete(hMem);
?? GUI_Clear();
}
8???????? 結(jié)論
進(jìn)行UC/GUI移植前,必須保證LCD的初始化已經(jīng)正確,可以自己編寫幾個(gè)底層函數(shù),畫點(diǎn)的、畫線的、寫文本、畫圖片的等。只有確保自己對(duì)S3C2410的LCD部分真正熟悉并掌握了,再移植UC/GUI才有把握。
將UC/GUI更改為24bpp,主要修改跟LCD_BITSPERPIXEL、LCD_COLOR定義有關(guān)的部分。如果移植過程中出現(xiàn)問題,可以單步跟蹤進(jìn)去,看是什么變量導(dǎo)致輸出不正確。
我也沒有將UC/GUI的源文件看一遍,基本上是使用仿真跟蹤的方法確定哪部分需要修改。所以沒有用到的部分,比如AA、WM可能還需要進(jìn)一步修改,這點(diǎn)請(qǐng)按照以上步驟修改的朋友注意。
(轉(zhuǎn)載自wpingme.blog.163.com)
轉(zhuǎn)載于:https://www.cnblogs.com/huangqp/archive/2012/07/29/2614067.html
總結(jié)
以上是生活随笔為你收集整理的【转】如何让ucgui支持24位色(24bpp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (原创)浅谈BUG资产,用例资产的作用
- 下一篇: SilverLight之我见