600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > ucgui 颜色管理—逻辑颜色与物理颜色

ucgui 颜色管理—逻辑颜色与物理颜色

时间:2021-08-23 19:38:35

相关推荐

ucgui 颜色管理—逻辑颜色与物理颜色

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)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。