一、层
LTDC一共有两个Layer,Layer2在Layer1之上,三层颜色的示意图如下:
每款屏幕的层大小是根据像素大小固定了的,在LTDC的初始化中存在一个层初始化的有一个窗口配置,注意:这个配置不是层的大小,个人理解为在这个层上开辟了一个对应大小的窗口,窗口区域及窗口外均属于这个层。
二、像素透明度
透明度这个概念是针对数字图片中的像素而言的,但是屏幕像素本身是没有透明度这一个概念的,图片像素有很多格式例如RGB565、RGB888、ARGB1555、ARGB8888,前两种是没有透明度的像素,后两种是有透明度的,以ARGB8888为例,其中ARGB分别表示Alpha、Red、Green、Blue,Alpha就是透明度的分量,值为0到255,0表示这个像素完全透明,255表示这个像素完全不透明。那么如果完全透明后显示的内容是什么呢?所以引入一个新的概率背景色
三、背景色
背景色就是这个像素背后的颜色(层的默认颜色),在初始化中会配置每个层的默认颜色及透明度(只有layer1和layer2有透明度),假设配置这个背景色为Cb。那么完全不透明表示背景色完全不被显示出来,也就是只显示这个像素的颜色(前景色,表示为Cf)。完全透明表示只显示背景色,不显示前景色。介于完全不透明和完全透明中间表示显示一部分前景色和一部分背景色,也就是将前景色和背景色混合起来显示。例如前景色的像素的透明度为80,背景色的红色分量为100,前景色(像素)的红色分量为50,那么混合之后得到的混合色的红色分量为:Cm=Cb*(1- 80/ 255) + Cf*(80/ 255)=100*(1- 80/ 255) + 50*(80/ 255)≈84,这就是混合后的红色分量值。
/* LCD背景颜色 */
LTDC_InitStruct.BackgroundRedValue = 0xFF;
LTDC_InitStruct.BackgroundGreenValue = 0xFF;
LTDC_InitStruct.BackgroundBlueValue = 0xFF;
/* 默认背景颜色,该颜色在定义的层窗口外或在层禁止时使用。 */
LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0xFF;
LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0xFF;
LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0xFF;
LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0;
层中的窗口在使能后显示的为传输的像素,如果未使能是与窗口外显示的一致为层背景色,
四、层混合
层之间的混合与层中的背景色和像素点混合原理是差不多的,通用混合公式为: BC = BF1 x C + BF2 x Cs。这里的层颜色为层中的背景色和像素点混合的颜色,
层的背景均为ARGB8888格式,LCD背景层为RGB888(不包含A),层中窗口的颜色是可配的,如果配置的不包含透明度参数,那么他就是全不透明(255)进行参与混合运算
每个Layer都有两个混合因子 BlendingFactor_1 和 BlendingFactor_2,这两个混合因子就是公式中的BF1和BF2,BF1可以取值为LTDC_BlendingFactor1_CA和LTDC_BlendingFactor1_PAxCA,BF2可以取值为LTDC_BlendingFactor2_CA和LTDC_BlendingFactor2_PAxCA,LTDC_BlendingFactorx_PAxCA代表前景色和背景色的混合比例的组成,LTDC_BlendingFactorx_CA表示混合系数使用Layer的固定Alpha值,也就是每个前景色像素的透明度是无效的,进行混合运算的时候只使用Layer的固定Alpha值来计算混合比例α1。混合比例α1的计算方式是 Alpha / 255 ,那么(1 - α1)就是(1 - Alpha / 255)。
LTDC_BlendingFactorx_PAxCA表示混合系数使用Layer的固定Alpha值(A1)和像素Alpha值(A2)的混合值来计算混合比例α2。混合比例α2的计算方式是 (A1 / 255)(A2 / 255),(1 - α2)就是(1 - (A1 / 255)(A2 / 255))。
层混合是使能LTDC之后就一直存在的,因为颜色寄存器初始值为0x00即全透明,多以没有修改配置时对应的层不会显示出来
GUI系统的时候在Layer1上可以绘制背景图片或者背景色,然后在Layer2上绘制GUI内容(文本框、按键等)