日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】如何让ucgui支持24位色(24bpp)

發布時間:2024/7/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】如何让ucgui支持24位色(24bpp) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

將UC/GUI 3.32a 更改為可以支持24bpp色彩模式

?

我打算在UC/OS-II上直接移植一個開源的GUI界面。所以我從網上找了一些GUI的開源代碼,主要看了看飛漫軟件的MiniGUI和Micrium公司的uC/GUI。

飛漫軟件的MiniGUI可免費下載的版本是1.3.3,可是不支持UC/OS-II,網上的介紹中比較適合移植到LINUX。飛漫軟件已經發行了可以在UC/OS-II上運行的版本,但已經是商業版本了,不是我可以隨便下載的了。

uC/GUI比較適合UC/OS-II,正是我希望的。我將它移植到了UC/OS-II中,發現目前的版本3.32a最大只支持16bpp,不支持24bpp。我將它改成了24bpp模式,就當作是熟悉一下uC/GUI了。

1???????? UC/GUI介紹

uC/GUI是Micrium公司開發的通用的嵌入式用戶圖形界面軟件。它給任何使用圖形LCD的應用程序提供獨立于處理器和LCD控制器之外的有效的圖形用戶接口。可以應用于單一任務環境,也可以應用于多任務環境中。uC/GUI能夠應用于任何LCD控制器和CPU的任何尺寸的物理顯示或者模擬顯示中。

?? uC/GUI的特點如下:

◆ 適用于任何8位/16位/32位CPU,可允許于支持ANSI C的任何編譯器

◆ 適用于任何控制器驅動任何LCD(單色,灰度,或者彩色)

◆ 通過配置宏,可支持任何接口

◆ 可配置顯示尺寸

◆ 可在LCD的任何一點上顯示字符和畫位圖

◆ 對于顯示尺寸和速度提供優化進程,編譯時間依賴于采用的優化進程

◆? 支持虛擬顯示,虛擬顯示的尺寸比實際顯示大。

更對UC/GUI的說明和資料請登陸www. ucgui.com。

2???????? UC/GUI需要進行的更改

www.ucgui.com上可以下載到UC/GUI的用戶手冊,如果僅僅是將UC/GUI移植到S3C2410上,可以參照第20-23章,這里就不再詳細說明。

如果是僅僅將UC/GUI移植到UC/OS-II上,可以參照第11章。

因為目前能夠獲得的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。

根據我的修改,目前使用本文后面的UCGUI_test()測試一切正常。

目前還沒有進行WM和AA的測試,本文僅僅提供一下修改的思路。以后隨著移植進一步完善,可能會有后續修改,請留意。

3???????? 配置頭文件

3.1???? LCDCONF.H

修改BPP宏:

#define LCD_BITSPERPIXEL??????? (24)

重新定義內存讀寫宏,使之符合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

將默認字體改為GUI_Font8x16,這是因為我覺得這種字體看起來比較大,適合我手頭的屏幕。為了節約空間,我僅僅使用了三種字體,其他FONT都沒有編譯。

增大GUI_ALLOC_SIZE的值,因為屏幕較大,而且使用了24bpp模式。視你需要的最大尺寸設置。

目前,我把MEMDEV、OS、TOUCH、UNICODE、WM支持都打開了,但是除了MEMDEV都沒有測試過,下一步會逐個測試。我覺得AA沒有必要,所以也沒有打開。

4???????? S3C2410驅動更改

修改LCD_S3C2410.C,在繪制位圖的函數LCD_L0_DrawBitmap中,增加LCD_BITSPERPIXEL>16的switch-case條件,使用函數DrawBitLine24BPP。

??? #if (LCD_BITSPERPIXEL > 16)

????? case 24:

??????? DrawBitLine24BPP(x0, i + y0, (const U32 *)pData, xsize, pTrans);

??????????? //注意pData的類型已經改為U32。

??????? break;

??? #endif???

增加24bpp的畫線函數,如下:

#if (LCD_BITSPERPIXEL > 16)

static void? DrawBitLine24BPP(int x, int y, U32 const * p, int xsize, const LCD_PIXELINDEX * pTrans)

{

… …//函數體與DrawBitLine16BPP相同。

}

兩個點操作函數,LCD_L0_GetPixelIndex()和LCD_L0_SetPixelIndex()可以不用修改,因為在下面的步驟中LCD_PIXELINDEX的定義已經更改為U32了。

5???????? UC/GUI內核修改

5.1???? GUI.H

修改LCD_COLORINDEX_UNION的UNION定義,否則COLOR和BKCOLOR永遠只能夠使用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個字節對齊。

#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默認的BGR色彩改為RGB色彩。

6???????? MEMDEV的修改

6.1???? GUIDEV.C

修改_DrawBitmap函數,增加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

同時修改,

#if LCD_BITSPERPIXEL <=8

? #define BITSPERPIXEL 8

#elif LCD_BITSPERPIXEL <=16

? #define BITSPERPIXEL 16

#else //增加這一句

? #define BITSPERPIXEL 24

#endif

7???????? 測試

修改后Metromerks CodeWarrior project目錄結構如下:

修改完成后使用UCGUI_test()函數測試,在每個delay()時設置斷點,可以看顯示是否正確。下面的有些語句是從《UC/GUI用戶手冊》中摘來的。

void UCGUI_test(void)

{

?? U32 i,j;

?? GUI_MEMDEV_Handle hMem;??

??

GUI_Init();

?? //測試數字顯示函數

?? 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);

??

?? //測試文本顯示函數

?? 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繪圖函數

?? 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繪圖設備測試,包括數字、文本、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???????? 結論

進行UC/GUI移植前,必須保證LCD的初始化已經正確,可以自己編寫幾個底層函數,畫點的、畫線的、寫文本、畫圖片的等。只有確保自己對S3C2410的LCD部分真正熟悉并掌握了,再移植UC/GUI才有把握。

將UC/GUI更改為24bpp,主要修改跟LCD_BITSPERPIXEL、LCD_COLOR定義有關的部分。如果移植過程中出現問題,可以單步跟蹤進去,看是什么變量導致輸出不正確。

我也沒有將UC/GUI的源文件看一遍,基本上是使用仿真跟蹤的方法確定哪部分需要修改。所以沒有用到的部分,比如AA、WM可能還需要進一步修改,這點請按照以上步驟修改的朋友注意。

(轉載自wpingme.blog.163.com)

轉載于:https://www.cnblogs.com/huangqp/archive/2012/07/29/2614067.html

總結

以上是生活随笔為你收集整理的【转】如何让ucgui支持24位色(24bpp)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。