微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第27章 抗锯齿实例讲解

第27章 抗锯齿实例讲解

时间:10-02 整理:3721RD 点击:
第27章 抗锯齿实例讲解

    本期教程主要是通过三个官方的抗锯齿实例跟大家讲解下抗锯齿的使用。

    27. 1  例子一:AA_HiResAntialiasing

    27. 2 例子二:AA_HiResPixels

    27. 3 例子三:AA_Lines

    27. 4 总结

27.1 例子一:AA_HiResAntialiasing

    这个例子主要是演示了两个动态的指针,一个具有抗锯齿效果,另一个没有抗锯齿效果。例子所在的位置如下:



    例子实际显示效果如下:



下面跟大家分析下这个程序的源码:

  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

   这个例子主要也是演示一下高分辨率,例子所在位置:



   例子实际显示效果如下:



下面跟大家分析下这个程序的源码:

  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

    这个例子给大家演示一下直线的抗锯齿效果,例子所在位置:



    例子实际显示效果如下:



下面跟大家分析下这个程序的源码:

  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  总结

    通过上面三个例子,大家要明白两点:

1、默认使用GUI_AA_XXX函数的时候,抗锯齿因子是1,也就是不使用抗锯齿效果。

2、上面说的抗锯齿和高分辨率是两码事,这个千万别搞混了。简单的理解就是通过高分辨率可以实现更好的显示效果。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top