This repository has been archived on 2025-02-28. You can view files and clone it, but cannot push or open issues or pull requests.
controller-hd/User/lib/lcd/gui/MemDev/GUIDEV_CopyFromLCD.c

93 lines
3.2 KiB
C

/*********************************************************************
* SEGGER MICROCONTROLLER SYSTEME GmbH *
* Solutions for real time microcontroller applications *
**********************************************************************
* *
* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH *
* *
* Internet: www.segger.com Support: support@segger.com *
* *
**********************************************************************
***** emWin - Graphical user interface for embedded applications *****
emWin is protected by international copyright laws. Knowledge of the
source code may not be used to write a similar product. This file may
only be used in accordance with a license and should not be re-
distributed in any way. We appreciate your understanding and fairness.
----------------------------------------------------------------------
File : GUIDEV_CopyFromLCD.c
Purpose : Implementation of memory devices
----------------------------------------------------------------------
*/
#include "GUI_Private.h"
#include "GUIDebug.h"
/* Memory device capabilities are compiled only if support for them is enabled. */
#if GUI_SUPPORT_MEMDEV
/*********************************************************************
*
* defines
*
**********************************************************************
*/
#define LCD_LIMIT(Var, Op, Limit) if (Var Op Limit) Var = Limit
/*********************************************************************
*
* public code
*
**********************************************************************
*/
/*********************************************************************
*
* GUI_MEMDEV_CopyFromLCD
*/
void GUI_MEMDEV_CopyFromLCD(GUI_MEMDEV_Handle hMem) {
/* Make sure memory handle is valid */
if (!hMem) {
hMem = GUI_Context.hDevData;
}
if (!hMem) {
return;
}
{
GUI_MEMDEV* pDevData = (GUI_MEMDEV*) GUI_ALLOC_h2p(hMem); /* Convert to pointer */
LCD_RECT r;
int y;
int XMax;
GUI_USAGE* pUsage = 0;
GUI_MEMDEV_Handle hMemOld = GUI_Context.hDevData;
GUI_MEMDEV_Select(hMem);
if (pDevData->hUsage)
pUsage = GUI_USAGE_H2P(pDevData->hUsage);
/* Get bounding rectangle */
r.y0 = pDevData->y0;
r.x0 = pDevData->x0;
r.x1 = pDevData->x0 + pDevData->XSize - 1;
r.y1 = pDevData->y0 + pDevData->YSize - 1;
/* Make sure bounds are within LCD area so we can call driver directly */
LCD_LIMIT(r.x0, <, 0);
LCD_LIMIT(r.y0, <, 0);
LCD_LIMIT(r.x1, >, LCD_GET_XSIZE() - 1);
LCD_LIMIT(r.y1, >, LCD_GET_YSIZE() - 1);
XMax = r.x1;
for (y = r.y0; y <= r.y1; y++) {
int x = r.x0;
LCD_PIXELINDEX* pData = (LCD_PIXELINDEX*)GUI_MEMDEV__XY2PTR(x,y);
if (pUsage)
GUI_USAGE_AddHLine(pUsage, x, y, r.x1 - r.x0 + 1);
for (; x <= XMax; x++) {
*pData++ = LCD_L0_GetPixelIndex(x, y);
}
}
GUI_MEMDEV_Select(hMemOld);
}
}
#endif /* GUI_MEMDEV_SUPPORT */
/*************************** end of file ****************************/