📄 guidev_aa.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_AA.c
Purpose : Memory device drawing with Antialiasing
----------------------------------------------------------------------
Version-Date---Author-Explanation
----------------------------------------------------------------------
1.02 000804 RS LCD_CopyFromLCDAA added
1.00a 000804 RS Fix for odd X-sizes
1.00 000728 RS First release
----------------------------------------------------------------------
Known problems or limitations with current version
----------------------------------------------------------------------
None.
---------------------------END-OF-HEADER------------------------------
*/
#include "GUI_Private.h"
#include <string.h>
#if GUI_SUPPORT_MEMDEV
/*********************************************************************
*
* defines
*
**********************************************************************
*/
#define SETPIXEL(x,y,colorindex) _SetPixel(x,y,colorindex);
#define BKCOLORINDEX GUI_Context.pDevData->aColorIndex[0]
#define COLORINDEX GUI_Context.pDevData->aColorIndex[1]
/*********************************************************************
*
* public code
*
**********************************************************************
*/
/*********************************************************************
*
* GUI_MEMDEV_CopyToLCDAA
*/
void GUI_MEMDEV_CopyToLCDAA(GUI_MEMDEV_Handle hMem)
{
GUI_LOCK();
/* Make sure memory handle is valid */
if (hMem)
{
GUI_MEMDEV_Handle hMemPrev;
#if GUI_NUM_LAYERS > 1
int PrevLayer;
#endif
int x, y;
GUI_MEMDEV* pDev = (GUI_MEMDEV *) GUI_ALLOC_h2p(hMem); /* Convert to pointer */
LCD_PIXELINDEX* pData0 = (LCD_PIXELINDEX *) (pDev + 1);
int LineOff = pDev->XSize;
int x0 = pDev->x0;
int y0 = pDev->y0;
int XMax = pDev->XSize / 2;
int YMax = pDev->YSize / 2;
hMemPrev = GUI_Context.hDevData;
#if GUI_NUM_LAYERS > 1
PrevLayer = GUI_SelectLayer(pDev->LayerIndex); /* Should not we switch back to the orig. layer when done ? */
#else
GUI_SelectLCD(); /* Activate LCD */
#endif
for (y = 0; y < YMax; y++)
{
LCD_PIXELINDEX* pData = pData0;
for (x = 0; x < XMax; x++)
{
LCD_PIXELINDEX PixelIndex;
int ColorSep[3];
U32 Color = LCD_Index2Color(*pData);
ColorSep[0] = Color & 255;
ColorSep[1] = (Color >> 8) & 255;
ColorSep[2] = (Color >> 16) & 255;
Color = LCD_Index2Color(*(pData + 1));
ColorSep[0] += Color & 255;
ColorSep[1] += (Color >> 8) & 255;
ColorSep[2] += (Color >> 16) & 255;
Color = LCD_Index2Color(*(pData + LineOff));
ColorSep[0] += Color & 255;
ColorSep[1] += (Color >> 8) & 255;
ColorSep[2] += (Color >> 16) & 255;
Color = LCD_Index2Color(*(pData + LineOff + 1));
ColorSep[0] += Color & 255;
ColorSep[1] += (Color >> 8) & 255;
ColorSep[2] += (Color >> 16) & 255;
Color = (ColorSep[0] + 2) >> 2;
Color |= ((ColorSep[1] + 2) >> 2) << 8;
Color |= ((U32) ((ColorSep[2] + 2) >> 2)) << 16;
PixelIndex = LCD_Color2Index(Color);
LCD_SetPixelIndex(x + x0, y + y0, PixelIndex);
pData += 2;
}
pData0 += 2 * LineOff;
}
#if GUI_NUM_LAYERS > 1
GUI_SelectLayer(PrevLayer);
#endif
/* Reactivate previously used device */
GUI_MEMDEV_Select(hMemPrev);
}
GUI_UNLOCK();
}
/*********************************************************************
*
* GUI_MEMDEV_CopyFromLCDAA
*/
void GUI_MEMDEV_CopyFromLCDAA(GUI_MEMDEV_Handle hMem)
{
/* Make sure memory handle is valid */
if (!hMem)
{
hMem = GUI_Context.hDevData;
}
if (hMem)
{
int x, y;
GUI_MEMDEV* pDevData = (GUI_MEMDEV *) GUI_ALLOC_h2p(hMem); /* Convert to pointer */
GUI_USAGE* pUsage = 0;
int x0 = pDevData->x0;
int y0 = pDevData->y0;
int XMax = pDevData->XSize / 2;
int YMax = pDevData->YSize / 2;
LCD_PIXELINDEX* pData = (LCD_PIXELINDEX *) (pDevData + 1);
int LineOff = pDevData->BytesPerLine;
if (pDevData->hUsage)
{
pUsage = GUI_USAGE_H2P(pDevData->hUsage);
}
for (y = 0; y < YMax; y++)
{
if (pUsage)
{
GUI_USAGE_AddHLine(pUsage, 0, y * 2, pDevData->XSize);
GUI_USAGE_AddHLine(pUsage, 0, y * 2 + 1, pDevData->XSize);
}
for (x = 0; x < XMax; x++)
{
*pData = *(pData + 1) = *(pData + LineOff) = *(pData + LineOff + 1) = LCD_GetPixelIndex(x + x0, y + y0);
pData += 2;
}
pData += LineOff + (pDevData->XSize & 1);
}
}
}
#else
void GUIDEV_AA(void)
{
} /* avoid empty object files */
#endif /* GUI_MEMDEV_SUPPORT */
/*************************** end of file ****************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -