硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第27章  抗锯齿实例讲解

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-2-6 16:09:30 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第27章      抗锯齿实例讲解

    本期教程主要是通过三个官方的抗锯齿实例跟大家讲解下抗锯齿的使用。
    27. 1  例子一:AA_HiResAntialiasing
    27. 2 例子二:AA_HiResPixels
    27. 3 例子三:AA_HiResAntialiasing
    27. 3 总结
27.1  例子一:AA_HiResAntialiasing
    这个例子主要是演示了两个动态的指针,一个具有抗锯齿效果,另一个没有抗锯齿效果。例子所在的位置如下:
    27.1.png

    例子实际显示效果如下:
27.2.png


下面跟大家分析下这个程序的源码:
  1. #include "GUI.h"
  2. /*******************************************************************
  3. *
  4. *       Defines
  5. *
  6. ********************************************************************
  7. */
  8. #define countof(Obj) (sizeof(Obj)/sizeof(Obj[0]))(1)
  9. /*******************************************************************
  10. *
  11. *       static variables
  12. *
  13. ********************************************************************
  14. */
  15. static const GUI_POINT _aPointer[] = {(2)
  16.   { 0,  3},
  17.   {85,  1},
  18.   {90,  0},
  19.   {85, -1},
  20.   { 0, -3}
  21. };
  22. static GUI_POINT _aPointerHiRes[countof(_aPointer)];
  23. typedef struct {
  24.   GUI_AUTODEV_INFO AutoInfo;
  25.   GUI_POINT aPoints[countof(_aPointer)];
  26.   int Factor;
  27. } PARAM;
  28. /*******************************************************************
  29. *
  30. *       Static functions
  31. *
  32. ********************************************************************
  33. */
  34. /*******************************************************************
  35. *
  36. *       _DrawHiRes
  37. *
  38. * Function description
  39. *   This function draws the high resolution pointer
  40. */
  41. static void _DrawHiRes(void * p) {
  42.   PARAM * pParam = (PARAM *)p;
  43.   if (pParam->AutoInfo.DrawFixed) {
  44.     GUI_ClearRect(60, 60, 159, 159);
  45.   }
  46.   GUI_AA_FillPolygon(pParam->aPoints,       (3)
  47.                      countof(_aPointer),
  48.                      65  * pParam->Factor,
  49.                      155 * pParam->Factor);
  50. }
  51. /*******************************************************************
  52. *
  53. *       _Draw
  54. *
  55. * Function description
  56. *   This function draws the non high resolution pointer
  57. */
  58. static void _Draw(void * p) {
  59.   PARAM * pParam = (PARAM *)p;
  60.   if (pParam->AutoInfo.DrawFixed) {
  61.     GUI_ClearRect(160, 60, 259, 159);
  62.   }
  63.   GUI_AA_FillPolygon(pParam->aPoints, countof(_aPointer), 165, 155); (4)
  64. }
  65. /*******************************************************************
  66. *
  67. *       _ShowHiresAntialiasing
  68. *
  69. * Function description
  70. *   This function creates the memory auto devices and handle the
  71. *   rotation of the pointers
  72. */
  73. static void _ShowHiresAntialiasing(void) {
  74.   GUI_AUTODEV aAuto[2];
  75.   PARAM       Param;
  76.   unsigned         i;
  77.   Param.Factor = 3;
  78.   GUI_SetBkColor(GUI_BLACK);
  79.   GUI_Clear();
  80.   GUI_SetColor(GUI_WHITE);
  81.   GUI_SetTextAlign(GUI_TA_HCENTER);
  82.   GUI_SetFont(&GUI_Font24_ASCII);
  83.   GUI_DispStringAt("AA_HiResAntialiasing - Sample", 160, 5);
  84.   GUI_SetFont(&GUI_Font6x8);
  85.   GUI_DispStringHCenterAt("Using\nhigh\nresolution\nmode", 110, 180);
  86.   GUI_DispStringHCenterAt("Not using\nhigh\nresolution\nmode", 210, 180);
  87.   //
  88.   // Create GUI_AUTODEV objects
  89.   //
  90.   for (i = 0; i < countof(aAuto); i++) {(5)
  91.     GUI_MEMDEV_CreateAuto(&aAuto[i]);
  92.   }
  93.   //
  94.   // Calculate pointer for high resolution
  95.   //
  96.   for (i = 0; i < countof(_aPointer); i++) {
  97.     _aPointerHiRes[i].x = _aPointer[i].x * Param.Factor;
  98.     _aPointerHiRes[i].y = _aPointer[i].y * Param.Factor;
  99.   }
  100.   GUI_AA_SetFactor(Param.Factor); /* Set antialiasing factor */(6)
  101.   while (1) {
  102.     for (i = 0; i < 1800; i++) {
  103.       float Angle = (i >= 900) ? 1800 - i : i;
  104.       Angle *= 3.1415926f / 1800;
  105.       //
  106.       // Draw pointer with high resolution(7)
  107.       //
  108.       GUI_AA_EnableHiRes();
  109.       GUI_RotatePolygon(Param.aPoints, _aPointerHiRes, countof(_aPointer), Angle);
  110.       GUI_MEMDEV_DrawAuto(&aAuto[0], &Param.AutoInfo, _DrawHiRes, &Param);
  111.       //
  112.       // Draw pointer without high resolution(8)
  113.       //
  114.       GUI_AA_DisableHiRes();
  115.       GUI_RotatePolygon(Param.aPoints, _aPointer, countof(_aPointer), Angle);
  116.       GUI_MEMDEV_DrawAuto(&aAuto[1], &Param.AutoInfo, _Draw, &Param);
  117.       GUI_Delay(2);
  118.     }
  119.   }
  120. }
  121. /*********************************************************************
  122. *
  123. *       Public code
  124. *
  125. **********************************************************************
  126. */
  127. /*********************************************************************
  128. *
  129. *       MainTask
  130. */
  131. void MainTask(void) {
  132.   GUI_Init();
  133.   _ShowHiresAntialiasing();
  134. }
复制代码
1.    通过这种方式可以获得数组中元素的个数。
2.    指针的坐标点,注意这些坐标点的值是相对于函数中指定的X,Y来说说的。这些数组中的值是相对值。
3.    这个函数在26.2.6小节有讲解。
4.    同上,只是这里没有使用高分辨率。
5.    创建一个内存设备,这个函数会在后面教程中再跟大家详细讲解。
6.    设置抗锯齿因子。
7.    绘制指针,带抗锯齿效果。
8.    绘制指针,不带抗锯齿效果。
27.2  例子二:AA_HiResPixels
    这个例子主要也是演示一下高分辨率,例子所在位置:
27.3.png


    例子实际显示效果如下:
27.4.png


下面跟大家分析下这个程序的源码:
  1. #include "GUI.h"
  2. #include "WM.h"
  3. /*******************************************************************
  4. *
  5. *       Defines
  6. *
  7. ********************************************************************
  8. */
  9. #define AA_FACTOR    4
  10. #define POLY_SIZE   19
  11. #define POLY_POINTS  3
  12. #define COORD_0(Plus, AA_Factor) (I16)(((I32)((Plus ? POLY_SIZE : -POLY_SIZE) * AA_Factor * 0.7071f * 10000)) / 10000)
  13. #define COORD_1(Plus, AA_Factor) (I16)(((I32)((Plus ? POLY_SIZE : -POLY_SIZE) * AA_Factor * 1.2247f * 10000)) / 10000)
  14. #define COORD_2(Plus, AA_Factor) (I16)(((I32)((Plus ? POLY_SIZE : -POLY_SIZE) * AA_Factor * 1.4142f * 10000)) / 10000)
  15. /*******************************************************************
  16. *
  17. *       Static variables
  18. *
  19. ********************************************************************
  20. */
  21. static int _pos_x1         = 30;
  22. static int _pos_y1         = 30;
  23. static int _pos_x2         = 125;
  24. static int _pos_y2         = 30;
  25. static int _pos_x3         = 220 * AA_FACTOR;
  26. static int _pos_y3         = 30  * AA_FACTOR;
  27. static int _color_d        = -1;
  28. static GUI_COLOR _color_a  = 0xFF00FE;
  29. static GUI_COLOR _color_b  = 0x00FEFF;
  30. static GUI_COLOR _color_c  = 0xFEFFFE;
  31. static const GUI_POINT _aPolygon_src[] = { (1)
  32.   {             0, COORD_2(0, 1) },
  33.   { COORD_1(1, 1), COORD_0(1, 1) },
  34.   { COORD_1(0, 1), COORD_0(1, 1) }
  35. };
  36. static const GUI_POINT _aPolygonHiRes_src[] = { (2)
  37.   {                     0, COORD_2(0, AA_FACTOR) },
  38.   { COORD_1(1, AA_FACTOR), COORD_0(1, AA_FACTOR) },
  39.   { COORD_1(0, AA_FACTOR), COORD_0(1, AA_FACTOR) }
  40. };
  41. static GUI_POINT _aPolygon[POLY_POINTS];
  42. static GUI_POINT _aPolygonHiRes[POLY_POINTS];
  43. /*******************************************************************
  44. *
  45. *       Static code
  46. *
  47. ********************************************************************
  48. */
  49. /*******************************************************************
  50. *
  51. *       _cbWindow
  52. *
  53. * Function description
  54. *   This is the callback for the window. A callback was used
  55. *   for memory devices.
  56. */
  57. static void _cbWindow(WM_MESSAGE * pMsg) {(3)
  58.   switch (pMsg->MsgId) {
  59.   case WM_PAINT:
  60.     GUI_SetBkColor(_color_a); (4)
  61.     GUI_ClearRect( 0, 0, 250, 14);
  62.     GUI_SetBkColor(_color_b);
  63.     GUI_ClearRect( 0, 15, 250, 29);
  64.     GUI_SetBkColor(GUI_BLACK);
  65.     GUI_ClearRect( 0, 30, 250, 60);
  66.     GUI_SetColor(_color_c);
  67.     GUI_FillPolygon(_aPolygon, POLY_POINTS, _pos_x1, _pos_y1);(5)
  68.     GUI_AA_FillPolygon(_aPolygon, POLY_POINTS, _pos_x2, _pos_y2);(6)
  69.     GUI_AA_EnableHiRes();
  70.     GUI_AA_FillPolygon(_aPolygonHiRes, POLY_POINTS, _pos_x3, _pos_y3);(7)
  71.     GUI_AA_DisableHiRes();
  72.     break;
  73.   default:
  74.     WM_DefaultProc(pMsg);
  75.   }
  76. }
  77. /*******************************************************************
  78. *
  79. *       _CalcColor
  80. *
  81. * Function description
  82. *   Calculates the color-fading.
  83. */
  84. static void _CalcColor(void) {
  85.   _color_a += 0x000002 * _color_d;
  86.   _color_b += 0x000200 * _color_d;
  87.   _color_c += 0x020002 * _color_d;
  88.   if (_color_c == 0xFEFFFE || _color_c == 0x00FF00) {
  89.     _color_d = -_color_d;
  90.   }
  91. }
  92. /*******************************************************************
  93. *
  94. *       _ShowHiResPixels
  95. *
  96. * Function description
  97. *   This is frame-function for the callback. It creates the window
  98. *   and handles the rotation of polygons and colors.
  99. */
  100. static void _ShowHiResPixels(void) {
  101.   const GUI_FONT * FontOld;
  102.   WM_HWIN          hWindow;
  103.   float            pi;
  104.   float            Step;
  105.   float            Angle;
  106.   int              i;
  107.   pi   = 3.1415926f;
  108.   Step = pi / 180;
  109.   GUI_SetBkColor(GUI_BLACK);
  110.   GUI_Clear();
  111.   GUI_SetColor(GUI_WHITE);
  112.   GUI_SetTextAlign(GUI_TA_HCENTER);
  113.   FontOld = GUI_SetFont(&GUI_Font24_ASCII);
  114.   GUI_DispStringAt("AA_HiResPixels - Sample", 160, 5);
  115.   GUI_SetFont(FontOld);
  116.   GUI_SetColor(GUI_RED);
  117.   GUI_DispStringHCenterAt("not\nantialised", 65, 100);
  118.   GUI_SetColor(GUI_GREEN);
  119.   GUI_DispStringHCenterAt("antialised", 160, 100);
  120.   GUI_SetColor(GUI_BLUE);
  121.   GUI_DispStringHCenterAt("antialised\nwith high\nresolution", 255, 100);
  122.   hWindow = WM_CreateWindow(35, 140, 250, 60, WM_CF_SHOW | WM_CF_MEMDEV, _cbWindow, 0);
  123.   WM_SelectWindow(hWindow);
  124.   GUI_AA_SetFactor(AA_FACTOR);
  125.   while (1) {
  126.     for (i = 0, Angle = 0; i < 360; i++) {(8)
  127.       Angle += Step;
  128.       GUI_RotatePolygon(_aPolygonHiRes, _aPolygonHiRes_src, POLY_POINTS, Angle);(9)
  129.       GUI_RotatePolygon(_aPolygon,      _aPolygon_src,      POLY_POINTS, Angle);
  130.       _CalcColor();
  131.       WM_InvalidateWindow(hWindow);(10)
  132.       GUI_Delay(50);
  133.     }
  134.   }
  135. }
  136. /*********************************************************************
  137. *
  138. *       Public code
  139. *
  140. **********************************************************************
  141. */
  142. /*********************************************************************
  143. *
  144. *       MainTask
  145. */
  146. void MainTask(void) {
  147.   GUI_Init();
  148.   _ShowHiResPixels();
  149. }
复制代码
1. 多边形的原始坐标。
2. 加入了高分辨率后的坐标点。
3. 所创建窗口的回调函数。
4. 这里主要是实现回调函数中的重绘消息。
5. 绘制多边形。
6. 绘制具有抗锯齿效果的多边形。
7. 绘制具有抗锯齿并支持高分辨率坐标的多边形。
8. 通过for循环实现图像的旋转。
9. 旋转多边形的原始坐标点,得到新的坐标点。详细可以看用户手册上面对这个函数的介绍
10.   通过使窗口无效来执行回调函数。从而实现多边形的旋转效果。
27.3  例子三:AA_HiResAntialiasing
    这个例子给大家演示一下直线的抗锯齿效果,例子所在位置:
27.5.png


    例子实际显示效果如下:
27.6.png


下面跟大家分析下这个程序的源码:
  1. #include "GUI.h"
  2. /*******************************************************************
  3. *
  4. *       Static code
  5. *
  6. ********************************************************************
  7. */
  8. /*******************************************************************
  9. *
  10. *       _DemoAntialiasing
  11. *
  12. * Function description
  13. *   Draws lines with different antialiasing factors
  14. */
  15. static void _DemoAntialiasing(void) {
  16.   const GUI_FONT * font_old;
  17.   int              i;
  18.   int              x1;
  19.   int              x2;
  20.   int              y1;
  21.   int              y2;
  22.   y1 = 65;
  23.   y2 = 5;
  24.   //
  25.   // Set drawing attributes
  26.   //
  27.   GUI_SetColor(GUI_WHITE);
  28.   GUI_SetBkColor(GUI_BLACK);
  29.   GUI_SetPenShape(GUI_PS_FLAT);(1)
  30.   GUI_Clear();
  31.   //
  32.   // Draw headline
  33.   //
  34.   font_old = GUI_SetFont(&GUI_Font24_ASCII);
  35.   GUI_SetTextAlign(GUI_TA_HCENTER);
  36.   GUI_DispStringAt("AA_Lines - Sample", 160, 5);
  37.   //
  38.   // Draw lines without antialiased  (2)
  39.   //
  40.   GUI_Delay(1000);
  41.   GUI_SetFont(&GUI_Font8x16);
  42.   GUI_SetTextAlign(GUI_TA_LEFT);
  43.   GUI_DispStringAtCEOL("draw normal lines using", 5, 40);
  44.   GUI_DispStringAtCEOL("GUI_DrawLine", 5, 55);
  45.   GUI_Delay(2500);
  46.   x1 = 20;
  47.   x2 = 100;
  48.   GUI_SetFont(font_old);
  49.   GUI_DispStringHCenterAt("Normal", (x1 + x2) / 2, 30 + y1);
  50.   for (i = 1; i < 8; i++) {
  51.     GUI_SetPenSize(i);
  52.     GUI_DrawLine(x1, 40 + i * 15 + y1, x2, 40 + i * 15 + y1 + y2);
  53.   }
  54.   //
  55.   // Draw lines with antialiasing quality factor 2 (3)
  56.   //
  57.   GUI_Delay(3000);
  58.   GUI_SetFont(&GUI_Font8x16);
  59.   GUI_DispStringAtCEOL("", 5, 40);
  60.   GUI_DispStringAtCEOL("", 5, 55);
  61.   GUI_Delay(200);
  62.   GUI_DispStringAtCEOL("draw antialiased lines using", 5, 40);
  63.   GUI_DispStringAtCEOL("GUI_AA_DrawLine", 5, 55);
  64.   GUI_Delay(3500);
  65.   x1 = 120;
  66.   x2 = 200;
  67.   GUI_AA_SetFactor(2);
  68.   GUI_SetFont(font_old);
  69.   GUI_DispStringHCenterAt("Antialiased\nusing factor 2", (x1 + x2) / 2, 30 + y1);
  70.   for (i = 1; i < 8; i++) {
  71.     GUI_SetPenSize(i);
  72.     GUI_AA_DrawLine(x1, 40 + i * 15 + y1, x2, 40 + i * 15 + y1 + y2);
  73.   }
  74.   //
  75.   // Draw lines with antialiasing quality factor 6  (4)
  76.   //
  77.   GUI_Delay(1500);
  78.   x1 = 220;
  79.   x2 = 300;
  80.   GUI_AA_SetFactor(6);
  81.   GUI_SetFont(font_old);
  82.   GUI_DispStringHCenterAt("Antialiased\nusing factor 6", (x1 + x2) / 2, 30 + y1);
  83.   for (i = 1; i < 8; i++) {
  84.     GUI_SetPenSize(i);
  85.     GUI_AA_DrawLine(x1, 40 + i * 15 + y1, x2, 40 + i * 15 + y1 + y2);
  86.   }
  87.   GUI_Delay(7500);
  88. }
  89. /*********************************************************************
  90. *
  91. *       Public code
  92. *
  93. **********************************************************************
  94. */
  95. /*********************************************************************
  96. *
  97. *       MainTask
  98. */
  99. void MainTask(void) {
  100.   GUI_Init();
  101.   while (1) {
  102.     _DemoAntialiasing();
  103.   }
  104. }
复制代码
1.     这个函数在手册上面没有查到相关的说明。
2.     绘制普通的直线,不具有抗锯齿效果。
3.     绘制具有抗锯齿效果的直线,抗锯齿因子取2.
4.     绘制具有抗锯齿效果的直线,抗锯齿因子取4。
27.4  总结
    通过上面三个例子,大家要明白两点:
l 默认使用GUI_AA_XXX函数的时候,抗锯齿因子是1,也就是不使用抗锯齿效果。
l 上面说的抗锯齿和高分辨率是两码事,这个千万别搞混了。简单的理解就是通过高分辨率可以实现更好的显示效果。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-1 07:59 , Processed in 0.209968 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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