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

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        : GUIAALib.C
  16. Purpose     : Antialiasing library
  17. ---------------------------END-OF-HEADER------------------------------
  18. */
  19. #include "GUI_Private.H"
  20. #include "LCD_ConfDefaults.h"            /* Required in order to know max. XSize so we do not waste memory */
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include <math.h>
  24. #ifdef WIN32
  25.   #pragma warning( disable : 4244 )  // Disable warning messages in simulation
  26.   #pragma warning( disable : 4761 )  // Disable warning "integral size mismatch in argument; conversion supplied"
  27. #endif                                      
  28. /*
  29.   *******************************************************************
  30.   *
  31.   *              Config defaults ...
  32.   *
  33.   *******************************************************************
  34. */
  35. #ifndef GUI_AA_LINEBUFFER_SIZE
  36.   #define GUI_AA_LINEBUFFER_SIZE LCD_XSIZE
  37. #endif
  38. /*
  39.   *******************************************************************
  40.   *
  41.   *              Statics
  42.   *
  43.   *******************************************************************
  44. */
  45. static U8   abAABuffer[GUI_AA_LINEBUFFER_SIZE];   /* This could be changed to dynamic memory ... */
  46. static U8*  pabAABuffer;
  47. static int  AA_x0, AA_x1, AA_y, AA_x0_InUse, AA_x1_InUse;
  48. static GUI_RECT ClipRect_HL;
  49. static tLCD_HL_APIList           DrawAPICopy;    /* Copy of device function ptr list */
  50. static const tLCD_HL_APIList*    pLCD_HLPrev;    /* Copy of device function ptr list */
  51. /*
  52.           **********************************************
  53.           *                                            *
  54.           *              AA Clean Line Buffer          *
  55.           *                                            *
  56.           **********************************************
  57. */
  58. static void AA_CleanLine(void) {
  59.   memset(pabAABuffer,0, AA_x1 - AA_x0+1);
  60.   AA_y = -16383;  /* Invalidate */  
  61.   AA_x0_InUse =  16383;
  62.   AA_x1_InUse = -16383;
  63. }
  64. /*
  65.           **********************************************
  66.           *                                            *
  67.           *              AA Flush Line Buffer          *
  68.           *                                            *
  69.           **********************************************
  70. */
  71. static void AA_FlushLine(void) {
  72.   int i;
  73.   int iEnd = AA_x1_InUse-AA_x0;
  74.   int IMax = GUI_Context.AA_Factor*GUI_Context.AA_Factor;
  75.   for (i =AA_x0_InUse-AA_x0; i<=iEnd; i++) {
  76.     int Intens = *(pabAABuffer+i);
  77.     if (Intens) {
  78.       /* Check we can use line draw */
  79.       if (Intens == IMax) {
  80.         int j;
  81.         for (j=i; j<iEnd; ) {
  82.           if (*(pabAABuffer+j+1) != IMax) {
  83.             break;
  84.           }
  85.           j++;
  86.         }
  87.         /* Draw the full pixel(s) */
  88.         if (j!=i) {
  89.           pLCD_HLPrev->pfDrawHLine(AA_x0+i, AA_y, AA_x0+j);
  90.           i = j;  /*xxx*/
  91.         } else {
  92.           LCD_HL_DrawPixel (AA_x0+i,AA_y);
  93.         }
  94.       } else {
  95.         LCD_SetPixelAA(AA_x0+i,AA_y, (15*Intens+IMax/2)/IMax);
  96.       }
  97.     }    
  98.   }
  99.   AA_CleanLine();
  100. }
  101. /*
  102.           **********************************************
  103.           *                                            *
  104.           *              Local DrawHLine               *
  105.           *                                            *
  106.           **********************************************
  107.   This is the redirected DrawHLine routine which is called
  108.   instead of the default output routine. Its job is to do
  109.   antialiasing and then perform the drawing operations.
  110. */
  111. static void AA_DrawHLine  (int x0, int y,  int x1) {
  112.   int x0Real, x1Real;
  113. /* Make sure there is something to do */
  114.   if (x1<x0)
  115.     return;
  116. /* Flush line if we are in an other pixel (real) line */
  117.   if (y/GUI_Context.AA_Factor != AA_y) {
  118.     AA_FlushLine();
  119.     AA_y = y/GUI_Context.AA_Factor;
  120.   }
  121.   x0Real = x0/GUI_Context.AA_Factor;
  122.   x1Real = x1/GUI_Context.AA_Factor;
  123. /* Handle used area (speed optimization for drawing) */
  124.   if (x0Real < AA_x0_InUse)
  125.     AA_x0_InUse = x0Real;
  126.   if (x1Real > AA_x1_InUse)
  127.     AA_x1_InUse = x1Real;
  128. /* Clip (should not be necessary ... Just to be on the safe side ! */
  129.   if (x0Real < AA_x0) {
  130.     x0 = AA_x0*GUI_Context.AA_Factor;
  131.   }
  132.   if (x1Real > AA_x1) {
  133.     x1 = (AA_x1+1)*GUI_Context.AA_Factor-1;
  134.   }
  135. /* Make sure there is still something to do (after clipping) */
  136.   if (x1<x0)
  137.     return;
  138. /* Inc. hit counters in buffer */
  139.   {
  140.     int x0_Off = x0/GUI_Context.AA_Factor-AA_x0;
  141.     int x1_Off = x1/GUI_Context.AA_Factor-AA_x0;
  142.     int iRem = x1_Off-x0_Off+1;
  143.     U8 *pDest = pabAABuffer+x0_Off;
  144.     if (iRem ==1) {
  145.       *(pDest) += x1-x0+1;
  146.     } else {
  147.       /* First Pixel */
  148.       *pDest++ += ((x0_Off+AA_x0+1)*GUI_Context.AA_Factor-x0);
  149.       /* Middle Pixels */
  150.       for (;--iRem>1; ) {
  151.         *pDest++ +=GUI_Context.AA_Factor;
  152.       }
  153.       /* Last Pixel */
  154.       *pDest += (1+x1- (x1_Off+AA_x0) *GUI_Context.AA_Factor);
  155.     }
  156.   }
  157. }
  158. /*
  159.   *******************************************************************
  160.   *
  161.   *              CalcClipRectHL
  162.   *
  163.   *******************************************************************
  164. */
  165. static void CalcClipRectHL(void) {
  166.   ClipRect_HL.x0 =  GUI_Context.ClipRect.x0    * GUI_Context.AA_Factor;
  167.   ClipRect_HL.y0 =  GUI_Context.ClipRect.y0    * GUI_Context.AA_Factor;
  168.   ClipRect_HL.x1 = (GUI_Context.ClipRect.x1+1) * GUI_Context.AA_Factor -1;
  169.   ClipRect_HL.y1 = (GUI_Context.ClipRect.y1+1) * GUI_Context.AA_Factor -1;
  170. }
  171. /******************************************************************
  172. *
  173. *              GUI_AA_Init
  174. *
  175. *******************************************************************
  176. */
  177. int GUI_AA_Init(int x0, int x1) {
  178.   int r =0;
  179.   /* Bounds checking:
  180.      Make sure x0, x1 are in legal range ...
  181.      (The important point is that they span no more than configured as
  182.       buffer size)
  183.   */
  184.   if (x0<0)
  185.     x0 =0;
  186.   if (x1-x0 > GUI_AA_LINEBUFFER_SIZE-1)
  187.     x1 = x0+GUI_AA_LINEBUFFER_SIZE-1;
  188.   /* Is there anything to do at all ??? */
  189.   if (x1 < x0) {
  190.     x1 = x0;   /* Not really ... */
  191.     r =1;
  192.   }
  193.   DrawAPICopy = *GUI_Context.pLCD_HL; /* Copy API table */
  194.   pLCD_HLPrev = GUI_Context.pLCD_HL; /* Remember list ptr (for restore) */
  195.   DrawAPICopy.pfDrawHLine = AA_DrawHLine;  /* modify function ptr. for hline */
  196.   GUI_Context.pLCD_HL = &DrawAPICopy;      /* Use copy of fp-list */
  197.   pabAABuffer = abAABuffer;
  198.   AA_x0 = x0;
  199.   AA_x1 = x1;
  200.   AA_CleanLine();
  201.   CalcClipRectHL();
  202.   GUI_Context.pClipRect_HL = &ClipRect_HL;
  203.   return r;
  204. }
  205. /******************************************************************
  206. *
  207. *              GUI_AA_Init
  208. *
  209. *******************************************************************
  210. */
  211. int GUI_AA_Init_HiRes(int x0, int x1) {
  212.   x0 /= GUI_Context.AA_Factor;
  213.   x1 /= GUI_Context.AA_Factor;
  214.   return GUI_AA_Init(x0, x1);
  215. }
  216. /*********************************************************************
  217. *
  218. *              AA Selection of Factors for position and quality
  219. *
  220. **********************************************************************
  221. */
  222. void GUI_AA_SetFactor(int Factor) {
  223.   GUI_Context.AA_Factor = Factor;
  224.   CalcClipRectHL();      /* High level clipping depends on quality factor */
  225. }
  226. int GUI_AA_GetFactor(void) {
  227.   return GUI_Context.AA_Factor;
  228. }
  229. void GUI_AA_DisableHiRes(void) {
  230.   GUI_Context.AA_HiResEnable = 0;
  231. }
  232. void GUI_AA_EnableHiRes(void) {
  233.   GUI_Context.AA_HiResEnable =1;
  234. }
  235. I16 GUI_AA_HiRes2Pixel(int HiRes) {
  236.   return GUI_Context.AA_Factor ? (HiRes / GUI_Context.AA_Factor) : HiRes;
  237. }
  238. /*
  239.   *******************************************************************
  240.   *
  241.   *              GUI_AA_Exit
  242.   *
  243.   *******************************************************************
  244. */
  245. void GUI_AA_Exit(void) {
  246.   AA_FlushLine();
  247.   /* restore previous settings */
  248.   GUI_Context.pLCD_HL = pLCD_HLPrev;
  249.   GUI_Context.pClipRect_HL = &GUI_Context.ClipRect;
  250. }
  251. /*********************** EOF FILE *******************************/