93 lines
3.2 KiB
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 ****************************/
|