GUIDEV_CopyFromLCD.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        : GUIDev_CopyFromLCD.C
  16. Purpose     : Implementation of memory devices
  17. ----------------------------------------------------------------------
  18. */
  19. #include "GUI_Private.h"
  20. #include "GUIDebug.h"
  21. /* Memory device capabilities are compiled only if support for them is enabled. */ 
  22. #if GUI_SUPPORT_MEMDEV
  23. /*******************************************************************
  24. *
  25. *                   Function replacement macros
  26. *
  27. ********************************************************************
  28. */
  29. #define LCD_LIMIT(Var, Op, Limit) if (Var Op Limit) Var = Limit
  30. /**********************************************************************
  31. *
  32. *                        GUI_MEMDEV_CopyFromLCD
  33. *
  34. ***********************************************************************
  35. */
  36. void GUI_MEMDEV_CopyFromLCD(GUI_MEMDEV_Handle hMem) {
  37.   /* Make sure memory handle is valid */
  38.   if (!hMem) {
  39.     hMem = GUI_Context.hDevData;
  40.   }
  41.   if (!hMem) {
  42.     return;
  43.   }
  44.   {
  45.     GUI_MEMDEV* pDevData = (GUI_MEMDEV*) GUI_ALLOC_LOCK(hMem);  /* Convert to pointer */
  46.     LCD_RECT r;
  47.     int y;
  48.     int XMax;
  49.     GUI_USAGE* pUsage = 0;
  50.     GUI_MEMDEV_Handle hMemOld = GUI_Context.hDevData;
  51.     GUI_MEMDEV_Select(hMem);
  52.     if (pDevData->hUsage) 
  53.       pUsage = GUI_USAGE_h2p(pDevData->hUsage);
  54.     /* Get bounding rectangle */
  55.     r.y0  = pDevData->y0;
  56.     r.x0  = pDevData->x0;
  57.     r.x1  = pDevData->x0 + pDevData->XSize-1;
  58.     r.y1  = pDevData->y0 + pDevData->YSize-1;
  59.     /* Make sure bounds are within LCD area so we can call driver directly */
  60.     LCD_LIMIT(r.x0, <, 0);
  61.     LCD_LIMIT(r.y0, <, 0);
  62.     LCD_LIMIT(r.x1, >, LCD_GET_XSIZE() -1);
  63.     LCD_LIMIT(r.y1, >, LCD_GET_YSIZE() -1);
  64.     XMax = r.x1;
  65.     for (y=r.y0; y<=r.y1; y++) {
  66.       int x=r.x0;
  67.       LCD_PIXELINDEX* pData = GUI_MEMDEV_XY2PTR(x,y);
  68.       if (pUsage) 
  69.         GUI_USAGE_AddHLine(pUsage, x, y, r.x1 - r.x0 + 1);
  70.       for (; x<=XMax; x++) {
  71.         *pData++ = LCD_L0_GetPixelIndex(x,y);
  72.       }
  73.     }
  74.     GUI_MEMDEV_Select(hMemOld);
  75.   }
  76.   GUI_ALLOC_UNLOCK(hMem);
  77. }
  78. #endif /* GUI_MEMDEV_SUPPORT */