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

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        : GUIDevB.C
  16. Purpose     : Implementation of banding memory devices
  17. ----------------------------------------------------------------------
  18. Version-Date---Author-Explanation
  19. ----------------------------------------------------------------------
  20.         010830 RS     GUI_MEMDEV_Draw now limits rectangle to
  21.                       LCD area in order to avoid wasting computation time
  22.         001109 RS     Bugfix: x0 was changed to 0 when moving the
  23.                       active area. Fixed.
  24. 1.00    001015 RS     First release
  25. 0.00.00 00     RS     Initial version for internal tests
  26. ----------------------------------------------------------------------
  27. Known problems or limitations with current version
  28. ----------------------------------------------------------------------
  29. None
  30. ---------------------------END-OF-HEADER------------------------------
  31. */
  32. #include <string.h>
  33. #include "GUI_Protected.h"
  34. #include "GUIDebug.h"
  35. /*
  36.  Memory device capabilities are compiled only if support for them is enabled.
  37. */ 
  38. #if GUI_SUPPORT_MEMDEV
  39. /*
  40. *********************************************************
  41. *
  42. *              GUI_MEMDEV_Draw
  43. *
  44. *********************************************************
  45. This routine uses a banding memory device to draw the
  46. given area flicker free. It not only draws, but also
  47. automatically calculates the size of, creates, moves
  48. and then destroys the memory device.
  49. */
  50. static int Min(int v0, int v1) {
  51.   if (v0 <= v1)
  52.     return v0;
  53.   return v1;
  54. }
  55. int GUI_MEMDEV_Draw(GUI_RECT* pRect, GUI_CALLBACK_VOID_P* pfDraw, void* pData, int NumLines, int Flags) {
  56.   int x0,y0, x1, y1, xsize, ysize;
  57.   GUI_MEMDEV_Handle hMD;
  58.   if (pRect) {
  59.     x0 = (pRect->x0 < 0) ? 0 : pRect->x0;
  60.     y0 = (pRect->y0 < 0) ? 0 : pRect->y0;
  61.     x1 = Min(pRect->x1, LCD_GET_XSIZE()-1);
  62.     y1 = Min(pRect->y1, LCD_GET_YSIZE()-1);
  63.     xsize = x1-x0+1;
  64.     ysize = y1-y0+1;
  65.   } else {
  66.     x0 = 0;
  67.     y0 = 0;
  68.     xsize = LCD_GET_XSIZE();
  69.     ysize = LCD_GET_YSIZE();
  70.   }
  71.   if (NumLines == 0) {
  72.     NumLines = -ysize;   /* Request <ysize> lines ... Less is o.k. */
  73.   }
  74.   if ((xsize<=0) || (ysize<=0))
  75.     return 0;           /* Nothing to do ... */
  76. /* Create memory device */
  77.   hMD = GUI_MEMDEV_CreateEx(x0,y0, xsize, NumLines, Flags);
  78.   if (!hMD) {
  79.     GUI_DEBUG_ERROROUT("GUI_MEMDEV_Draw() Not enough memory ...");            /* Not enough memory ! */
  80.     pfDraw(pData);
  81.     return 1;
  82.   }
  83.   NumLines = GUI_MEMDEV_GetYSize(hMD);
  84.   GUI_MEMDEV_Select(hMD);
  85. /* Start drawing ... */
  86.   {
  87.     int i;
  88.     for (i=0; i< ysize; i+=NumLines) {
  89.       int RemLines = ysize-i;
  90.       if (RemLines<NumLines) {
  91.         GUI_MEMDEV_ReduceYSize(hMD, RemLines);
  92.       }
  93.       if (i) {
  94.         GUI_MEMDEV_SetOrg(hMD, x0, y0+i);
  95.         GUI_MEMDEV_Clear(hMD);
  96.       }
  97.       pfDraw(pData);
  98.       GUI_MEMDEV_CopyToLCD(hMD);
  99.     }
  100.   }
  101.   GUI_MEMDEV_Delete(hMD);
  102.   GUI_MEMDEV_Select(0);
  103.   return 0;             /* Success ! */
  104. }
  105. #else
  106. void GUIDEV_Banding(void) {} /* avoid empty object files */
  107. #endif /* GUI_MEMDEV_SUPPORT */