ucgui 颜色管理—逻辑颜色与物理颜色
一、基本概念
ucgui 支持黑白,灰度和彩色 的显示。
1. 逻辑颜色
逻辑颜色是应用程序中处理的颜色。它是一个24bits 的RGB值,R 、G 、B 都是8bits ,格式如下:
0xBBGGRR
因此,白色 的值为0xFFFFFF, 黑色的值为 0x000000,深红的值为 0x0000FF。
2.物理颜色
物理颜色是真正写入到 LCD 控制器的颜色值。
3. 色彩深度
色彩深度表示存储每一个像素的颜色所用的位数,常用单位为位/像素(bpp)。色彩深度越深,可用的颜色就越多。
色彩深度是用 “n 位元颜色”(n-bit color) 来说明的。常见的有:
3. 为什么需要逻辑颜色与物理颜色
前面我们说到,ucgui 支持黑白、灰度 和彩色显示。也就是支持不同色彩深度的显示(最高24位)。为了简化编程,ucgui 在最上层使用逻辑颜色来处理,GUI 框架内部自动根据用户配置完成逻辑颜色到物理颜色的转换,最终写入lcd 驱动的是物理颜色。
二、相关的API
1. 逻辑颜色API
void GUI_SetBkColor( GUI_COLOR color ){GUI_LOCK();{LCD_SetBkColor( color );} GUI_UNLOCK();}void GUI_SetColor( GUI_COLOR color ){GUI_LOCK();{LCD_SetColor( color );} GUI_UNLOCK();}
2. 物理颜色
void LCD_SetColorIndex( int Index ){LCD_ACOLORINDEX[_GetColorIndex( 1 )] = Index;}void LCD_SetBkColorIndex( int Index ){LCD_ACOLORINDEX[_GetColorIndex( 0 )] = Index;}
3. 颜色转换
int LCD_Color2Index( LCD_COLOR Color ){return LCDDEV_L0_Color2Index( Color );}LCD_COLOR LCD_Index2Color( int Index ){return LCDDEV_L0_Index2Color( Index );}
三、我遇到的问题
1. 出现的问题
移植完ucgui 之后,分别设置背景颜色,字体颜色,输出一行 “HelloWorld!” 。结果是背景颜色,字体颜色的输出都跟预期不符合。
GUI_Init();GUI_Clear();GUI_SetBkColor( GUI_RED);app_log( "bk color:%x\n", LCD_Color2Index ( GUI_RED) );GUI_SetColor( GUI_GREEN);app_log( "color:%x\n", LCD_Color2Index ( GUI_GREEN) );GUI_DispString( "Helloworld!\n" );
2. 问题分析
用物理颜色API 代替逻辑颜色API,也即是用 LCD_SetBkColorIndex 代替 GUI_SetBkColor,用GUI_SetColor 代替 LCD_SetColorIndex,参数是rgb565 颜色的表示,屏幕输出的效果符合预期,说问题出在逻辑颜色转换成物理颜色这部分处理。
手动调用颜色转换函数,进行转换,如下:
app_log( "bk color:%x\n", LCD_Color2Index ( GUI_RED) );
发现转换出来的颜色值,的确不是RGB565 表示的红色。
3. 问题排查
跳转至LCD_Color2Index 的定义,发现最底层是通过COLOR2INDEX 这个宏实现颜色转换。
由LCD_SWAP_RB决定是调用 LCD_Color2Index_M565 还是 LCD_Color2Index_565。
查看LCD_Color2Index_M565 才发现:
LCD_SWAP_RB 为1 时,以RGB 的形式转换成物理颜色LCD_SWAP_RB 为0 时,以BGR 的形式转换成物理颜色
LCD_FIXEDPALETTE == 565, 65536 colors, RRRRRGGGGGGBBBBB
这里,LCD_SWAP_RB 的定义,跟我理解的刚好相反。
4. 问题解决
在文件LCDConf.h 定义:
#define LCD_SWAP_RB (1)