硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5172|回复: 0
收起左侧

[emWin教程入门篇] 【STemWin教程】第24章 TemWin支持的颜色

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-1-31 10:58:26 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第24章 TemWin支持的颜色

    本期教程主要是跟大家讲解一下STemWin支持的颜色,了解这些支持的颜色主要目的是为了根据实际的液晶屏支持颜色进行配置。简单的说就是,如果大家使用的屏只支持黑白两色,那么就得使用GUICC_1。
    24. 1  预定义颜色
    24. 2 固定调色板及其说明
    24. 3 模拟器上演示颜色条测试例程
    24. 4 总结
24.1 预定义颜色
    emWin支持黑色/白色、灰度 (具有不同强度的单色)和彩色显示器。同一用户程序可用于任何显示器;只有LCD显示器的配置才需要进行更改。颜色管理功能会尝试查找与要显示的任何颜色最接近的匹配颜色。
    逻辑颜色是应用程序处理的颜色。逻辑颜色始终按RGB值进行定义,是一个24位的值,每种颜色包含8位,如下所示:0xBBGGRR。因此,白色为0xFFFFFF,黑色为0x000000,鲜红色为0xFF。
    物理颜色是可用显示器实际显示的颜色。按与逻辑颜色相同的24位RGB格式进行定义。在运行时,逻辑颜色映射到物理颜色。对于有几种颜色的显示器(如单色显示器或8/16色LCD),emWin使用优化版的“最小二乘偏差搜索”对其进行转换。它将要显示的颜色 (逻辑颜色)与LCD可实际显示的所有可用颜色 (物理颜色)进行比较,并使用LCD认为最接近的颜色。
    STemWin支持的预定义颜色如下,其它没有定义的需要自己获取相应的颜色数值:
24.1.png

    这些颜色在GUI.h文件里面进行了定义:
  1. /*********************************************************************
  2. *
  3. *       Standard colors
  4. */
  5. #define GUI_BLUE          0x00FF0000
  6. #define GUI_GREEN         0x0000FF00
  7. #define GUI_RED           0x000000FF
  8. #define GUI_CYAN          0x00FFFF00
  9. #define GUI_MAGENTA       0x00FF00FF
  10. #define GUI_YELLOW        0x0000FFFF
  11. #define GUI_LIGHTBLUE     0x00FF8080
  12. #define GUI_LIGHTGREEN    0x0080FF80
  13. #define GUI_LIGHTRED      0x008080FF
  14. #define GUI_LIGHTCYAN     0x00FFFF80
  15. #define GUI_LIGHTMAGENTA  0x00FF80FF
  16. #define GUI_LIGHTYELLOW   0x0080FFFF
  17. #define GUI_DARKBLUE      0x00800000
  18. #define GUI_DARKGREEN     0x00008000
  19. #define GUI_DARKRED       0x00000080
  20. #define GUI_DARKCYAN      0x00808000
  21. #define GUI_DARKMAGENTA   0x00800080
  22. #define GUI_DARKYELLOW    0x00008080
  23. #define GUI_WHITE         0x00FFFFFF
  24. #define GUI_LIGHTGRAY     0x00D3D3D3
  25. #define GUI_GRAY          0x00808080
  26. #define GUI_DARKGRAY      0x00404040
  27. #define GUI_BLACK         0x00000000
  28. #define GUI_BROWN         0x002A2AA5
  29. #define GUI_ORANGE        0x0000A5FF
  30. #define GUI_TRANSPARENT   0xFF000000
  31. #define GUI_INVALID_COLOR 0xFFFFFFF      /* Invalid color - more than 24 bits */
复制代码
24.2 固定调色板及其说明
    STemWin支持的调色板模式很多,这里我们就只介绍下面三种,其它的看官方手册。

标示符

可用的颜色数

掩码

GUICC_1

2(黑白)

0x01

GUICC_M565

65536

RRRRRGGGGGBBBBBB

GUICC_M8888

16777216 + 8位Alpha混合

AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB


24.2.1 GUICC_1
    这种调色板适合用于OLED和12864等单色的显示屏。GUICC_1仅支持2中颜色,显示效果如下:
24.2.png
右下角是两种颜色的调色板

24.2.2 GUICC_M565
    教程配套的RA8875屏都是用的这种调色板,支持65536中颜色。这里565的意思是红色和绿色分量为5位,蓝色分量为6位,即BBBBBGGGGGGRRRRR。显示效果如下:
24.3.png


24.2.3 GUICC_M8888
    前面第三章介绍F429的STemWin的底层驱动时,就是用的这种调色板。其中低位3字节用于颜色分量,高位字节用于Alpha混合。红、绿、蓝和Alpha混合分量都是8位。颜色掩码:AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB
24.3 模拟器上演示颜色条测试例程
     官方的模拟器上有一个专门的例子进行了颜色条的演示,此程序的位置:
24.4.png
    此DEMO的实际代码如下:
  1. #include "GUI.h"
  2. #include "LCDConf.h"
  3. /*******************************************************************
  4. *
  5. *       Defines
  6. *
  7. ********************************************************************
  8. */
  9. #define X_START 60
  10. #define Y_START 40
  11. /*******************************************************************
  12. *
  13. *       Types
  14. *
  15. ********************************************************************
  16. */
  17. typedef struct {  (1)
  18.   int NumBars;
  19.   GUI_COLOR Color;
  20.   const char * s;
  21. } BAR_DATA;
  22. /*******************************************************************
  23. *
  24. *       Static data
  25. *
  26. ********************************************************************
  27. */
  28. static const BAR_DATA _aBarData[] = {(2)
  29.   { 2, GUI_RED    , "Red" },
  30.   { 2, GUI_GREEN  , "Green" },
  31.   { 2, GUI_BLUE   , "Blue" },
  32.   { 1, GUI_WHITE  , "Grey" },
  33.   { 2, GUI_YELLOW , "Yellow" },
  34.   { 2, GUI_CYAN   , "Cyan" },
  35.   { 2, GUI_MAGENTA, "Magenta" },
  36. };
  37. static const GUI_COLOR _aColorStart[] = { GUI_BLACK, GUI_WHITE };(3)
  38. /*******************************************************************
  39. *
  40. *       Static code
  41. *
  42. ********************************************************************
  43. */
  44. /*******************************************************************
  45. *
  46. *       _DemoShowColorBar
  47. */
  48. static void _DemoShowColorBar(void) {
  49.   GUI_RECT Rect;
  50.   int      yStep;
  51.   int      i;
  52.   int      j;
  53.   int      xSize;
  54.   int      ySize;
  55.   int      NumBars;
  56.   int      NumColors;
  57.   //
  58.   // Get display size
  59.   //
  60.   xSize = LCD_GetXSize();
  61.   ySize = LCD_GetYSize();
  62.   //
  63.   // Get number of bars
  64.   //
  65.   NumColors = GUI_COUNTOF(_aBarData);
  66.   for (i = NumBars = 0, NumBars = 0; i < NumColors; i++) {
  67.     NumBars += _aBarData[i].NumBars;
  68.   }
  69.   yStep = (ySize - Y_START) / NumBars;
  70.   //
  71.   // Draw text
  72.   //
  73.   Rect.x0 = 0;
  74.   Rect.x1 = X_START - 1;
  75.   Rect.y0 = Y_START;
  76. GUI_SetFont(&GUI_Font8x16);
  77.   for (i = 0; i < NumColors; i++) {
  78.     Rect.y1 = Rect.y0 + yStep * _aBarData[i].NumBars - 1;
  79.     GUI_DispStringInRect(_aBarData[i].s, &Rect, GUI_TA_LEFT | GUI_TA_VCENTER);
  80.     Rect.y0 = Rect.y1 + 1;
  81.   }
  82.   //
  83.   // Draw colors
  84.   //
  85.   Rect.x0 = X_START;
  86.   Rect.x1 = xSize - 1;
  87.   Rect.y0 = Y_START;
  88.   for (i = 0; i < NumColors; i++) {
  89.     for (j = 0; j < _aBarData[i].NumBars; j++) {
  90.       Rect.y1 = Rect.y0 + yStep - 1;
  91.       GUI_DrawGradientH(Rect.x0, Rect.y0, Rect.x1, Rect.y1, _aColorStart[j], _aBarData[i].Color);
  92.       Rect.y0 = Rect.y1 + 1;
  93.     }
  94.   }
  95. }
  96. /*********************************************************************
  97. *
  98. *       Public code
  99. *
  100. **********************************************************************
  101. */
  102. /*********************************************************************
  103. *
  104. *       MainTask
  105. */
  106. void MainTask(void) {
  107.   GUI_Init();
  108.   GUI_SetBkColor(GUI_BLACK);
  109.   GUI_Clear();
  110.   GUI_SetColor(GUI_WHITE);
  111.   GUI_SetFont(&GUI_Font24_ASCII);
  112.   GUI_DispStringHCenterAt("COLOR_ShowColorBar - Sample", 160, 5);
  113.   _DemoShowColorBar();
  114.   while(1)
  115.     GUI_Delay(100);
  116. }
复制代码
1. 这个例子比较的简单,大家要学习的就是上面1,2,3这种数据的定义方式。在主程序中调用的时候就非常方便了。
    实际显示效果如下:
24.5.png


24.4 总结
    颜色方面的知识就跟大家说这么多,后面需要的时候再跟大家详细的讲解。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 17:00 , Processed in 0.261236 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表