GUIAACircle.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:3k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : GUICirleAA.C
  16. Purpose     : Draw Circle routines with Antialiasing
  17. TBD: Circle needs to be calculated from top to bottom in order
  18. to avoid AA problems at certain positions.  
  19.     
  20. ---------------------------END-OF-HEADER------------------------------
  21. */
  22. #include "GUI_Protected.H"
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include <math.h>
  26. /*********************************************************************
  27. *
  28. *       Static code
  29. *
  30. **********************************************************************
  31. */
  32. static void FillCircle       (int x0, int y0, int r) {
  33.   int i, x;
  34.   int sqmax = r*r+r/2;
  35.   int yMin, yMax;
  36.   /* First step : find uppermost and lowermost coordinates */
  37.   yMin = y0 - r;
  38.   yMax = y0 + r;
  39.   /* Use Clipping rect to reduce calculation (if possible) */
  40.   if (GUI_Context.pClipRect_HL) {
  41.     if (yMax > GUI_Context.pClipRect_HL->y1)
  42.       yMax = GUI_Context.pClipRect_HL->y1;
  43.     if (yMin < GUI_Context.pClipRect_HL->y0)
  44.       yMin = GUI_Context.pClipRect_HL->y0;
  45.   }
  46.   /* Draw top half */
  47.   for (i=0, x=r; i<r; i++) {
  48.     int y = y0-i;
  49.     if ((y >= yMin) && (y <= yMax)) {
  50.       /* calc proper x-value */
  51.       while ((i*i+x*x) >sqmax)
  52.         --x;
  53.       LCD_HL_DrawHLine (x0-x, y, x0+x);
  54.     }
  55.   }
  56.   /* Draw bottom half */
  57.   for (i=0, x=r; i<r; i++) {
  58.     int y = y0 + i;
  59.     if ((y >= yMin) && (y <= yMax)) {
  60.       /* calc proper x-value */
  61.       while ((i*i+x*x) >sqmax)
  62.         --x;
  63.       LCD_HL_DrawHLine (x0-x, y, x0+x);
  64.     }
  65.   }
  66. }
  67. /*********************************************************************
  68. *
  69. *                       GL_FillCircleAA_HiRes
  70. *
  71. **********************************************************************
  72. */
  73. void GL_FillCircleAA_HiRes  (int x0, int y0, int r) {
  74. /* Init AA Subsystem, pass horizontal limits */
  75.   GUI_AA_Init_HiRes(x0-r, x0+r);
  76. /* Do the actual drawing */
  77.   FillCircle(x0, y0, r);
  78. /* Cleanup */
  79.   GUI_AA_Exit();
  80. }
  81. /*********************************************************************
  82. *
  83. *                       GL_FillCircleAA
  84. *
  85. **********************************************************************
  86. */
  87. void GUI_AA_FillCircle(int x0, int y0, int r) {
  88.   #if (GUI_WINSUPPORT)
  89.     GUI_RECT Rect;
  90.   #endif
  91.   if (!GUI_Context.AA_HiResEnable) {
  92.     x0 *= GUI_Context.AA_Factor;
  93.     y0 *= GUI_Context.AA_Factor;
  94.     r  *= GUI_Context.AA_Factor;
  95.   }
  96.   GUI_LOCK();
  97.   #if (GUI_WINSUPPORT)
  98.     WM_ADDORG(x0,y0);
  99.     Rect.x0 = GUI_AA_HiRes2Pixel(x0 - r);
  100.     Rect.x1 = GUI_AA_HiRes2Pixel(x0 + r);
  101.     Rect.y0 = GUI_AA_HiRes2Pixel(y0 - r);
  102.     Rect.y1 = GUI_AA_HiRes2Pixel(y0 + r);
  103.     WM_ITERATE_START(&Rect); {
  104.   #endif
  105.   GL_FillCircleAA_HiRes(x0, y0, r);
  106.   #if (GUI_WINSUPPORT)
  107.     } WM_ITERATE_END();
  108.   #endif
  109.   GUI_UNLOCK();
  110. }