144 lines
4.9 KiB
C
144 lines
4.9 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_Banding.c
|
|
Purpose : Implementation of banding memory devices
|
|
----------------------------------------------------------------------
|
|
Version-Date---Author-Explanation
|
|
----------------------------------------------------------------------
|
|
010830 RS GUI_MEMDEV_Draw now limits rectangle to
|
|
LCD area in order to avoid wasting computation time
|
|
001109 RS Bugfix: x0 was changed to 0 when moving the
|
|
active area. Fixed.
|
|
1.00 001015 RS First release
|
|
0.00.00 00 RS Initial version for internal tests
|
|
----------------------------------------------------------------------
|
|
Known problems or limitations with current version
|
|
----------------------------------------------------------------------
|
|
None
|
|
---------------------------END-OF-HEADER------------------------------
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include "GUI_Private.h"
|
|
#include "GUIDebug.h"
|
|
|
|
/* Memory device capabilities are compiled only if support for them is enabled. */
|
|
|
|
#if GUI_SUPPORT_MEMDEV
|
|
|
|
/*********************************************************************
|
|
*
|
|
* static code
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
/*********************************************************************
|
|
*
|
|
* _Min
|
|
*/
|
|
static int _Min(int v0, int v1) {
|
|
if (v0 <= v1) {
|
|
return v0;
|
|
}
|
|
return v1;
|
|
}
|
|
|
|
/*********************************************************************
|
|
*
|
|
* public code
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
/*********************************************************************
|
|
*
|
|
* GUI_MEMDEV_Draw
|
|
*
|
|
* This routine uses a banding memory device to draw the
|
|
* given area flicker free. It not only draws, but also
|
|
* automatically calculates the size of, creates, moves
|
|
* and then destroys the memory device.
|
|
*/
|
|
int GUI_MEMDEV_Draw(GUI_RECT* pRect, GUI_CALLBACK_VOID_P* pfDraw, void* pData, int NumLines, int Flags) {
|
|
int x0, y0, x1, y1, xsize, ysize;
|
|
GUI_MEMDEV_Handle hMD;
|
|
if (pRect) {
|
|
x0 = (pRect->x0 < 0) ? 0 : pRect->x0;
|
|
y0 = (pRect->y0 < 0) ? 0 : pRect->y0;
|
|
#if GUI_NUM_LAYERS == 1
|
|
x1 = _Min(pRect->x1, LCD_GET_XSIZE() - 1);
|
|
y1 = _Min(pRect->y1, LCD_GET_YSIZE() - 1);
|
|
#else
|
|
x1 = _Min(pRect->x1, LCD_GetXSizeEx(GUI_Context.SelLayer) - 1);
|
|
y1 = _Min(pRect->y1, LCD_GetYSizeEx(GUI_Context.SelLayer) - 1);
|
|
#endif
|
|
xsize = x1 - x0 + 1;
|
|
ysize = y1 - y0 + 1;
|
|
} else {
|
|
x0 = 0;
|
|
y0 = 0;
|
|
#if GUI_NUM_LAYERS == 1
|
|
xsize = LCD_GET_XSIZE();
|
|
ysize = LCD_GET_YSIZE();
|
|
#else
|
|
xsize = LCD_GetXSizeEx(GUI_Context.SelLayer);
|
|
ysize = LCD_GetYSizeEx(GUI_Context.SelLayer);
|
|
#endif
|
|
}
|
|
if (NumLines == 0) {
|
|
NumLines = -ysize; /* Request <ysize> lines ... Less is o.k. */
|
|
}
|
|
if ((xsize <= 0) || (ysize <= 0))
|
|
return 0; /* Nothing to do ... */
|
|
/* Create memory device */
|
|
hMD = GUI_MEMDEV_CreateEx(x0, y0, xsize, NumLines, Flags);
|
|
if (!hMD) {
|
|
GUI_DEBUG_ERROROUT("GUI_MEMDEV_Draw() Not enough memory ..."); /* Not enough memory ! */
|
|
pfDraw(pData);
|
|
return 1;
|
|
}
|
|
NumLines = GUI_MEMDEV_GetYSize(hMD);
|
|
GUI_MEMDEV_Select(hMD);
|
|
/* Start drawing ... */
|
|
{
|
|
int i;
|
|
for (i = 0; i < ysize; i += NumLines) {
|
|
int RemLines = ysize - i;
|
|
if (RemLines < NumLines) {
|
|
GUI_MEMDEV_ReduceYSize(hMD, RemLines);
|
|
}
|
|
if (i) {
|
|
GUI_MEMDEV_SetOrg(hMD, x0, y0 + i);
|
|
GUI_MEMDEV_Clear(hMD);
|
|
}
|
|
pfDraw(pData);
|
|
GUI_MEMDEV_CopyToLCD(hMD);
|
|
}
|
|
}
|
|
GUI_MEMDEV_Delete(hMD);
|
|
GUI_MEMDEV_Select(0);
|
|
return 0; /* Success ! */
|
|
}
|
|
|
|
#else
|
|
|
|
void GUIDEV_Banding(void) {} /* avoid empty object files */
|
|
|
|
#endif /* GUI_MEMDEV_SUPPORT */
|
|
|
|
/*************************** end of file ****************************/
|