📄 guidev_aa.c
字号:
/*! @file GUIDEV_AA.c
* Memory device drawing with Antialiasing
*
* @author hiber
* @author Copyright (C) 1981-2006, All Rights Reserved
* @date 04/18/2006
* @version
*
* @note
* @attention
* @warning
* @bug
*
* @todo
* @example <file-name>
* @see
*/
#include "GUI_Private.h"
#include <string.h>
#if GUI_SUPPORT_MEMDEV
extern void * _GUI_ALLOC_h2p_Lock(GUI_HMEM hMem);
#define GUI_ALLOC_H2P(h) _GUI_ALLOC_h2p_Lock(h)
#define GUI_ALLOC_FREE(handle) GUI_ALLOC_Free(handle)
#define GUI_ALLOC_LOCK(handle) _GUI_ALLOC_h2p_Lock(handle)
#define GUI_ALLOC_UNLOCK(handle)
#ifdef GUI_USAGE_H2P
#undef GUI_USAGE_H2P
#define GUI_USAGE_H2P(h) ((GUI_USAGE*)_GUI_ALLOC_h2p_Lock(h))
#endif
#ifdef GUI_MEMDEV_H2P
#undef GUI_MEMDEV_H2P
#define GUI_MEMDEV_H2P _GUI_ALLOC_h2p_Lock
#endif
//////////////////////////////////////////////////////////////////////////
#define SETPIXEL(x,y,colorindex) _SetPixel(x,y,colorindex);
#define BKCOLORINDEX GUI_Context.pDevData->aColorIndex[0]
#define COLORINDEX GUI_Context.pDevData->aColorIndex[1]
//! 从存储区域拷贝存储设备的内容(反锯齿)到LCD
//! @param hMem 存储设备的句柄
//! @note 器件的数据处理为反锯齿数据。一个2×2 像素矩阵转换1 个像素。最终结果的像素强度
//! 取决于在多少像素在矩阵中调整。
void GUI_MEMDEV_CopyToLCDAA(GUI_MEMDEV_Handle hMem)
{
if (hMem)
{
int x, y;
static const tLCDDEV_APIList *pDevicePrev;
GUI_MEMDEV *pDev = (GUI_MEMDEV*)GUI_ALLOC_LOCK(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;
pDevicePrev = GUI_Context.pDeviceAPI;// 暂存当前的API函数指针表
// 3.90a中加入了多层,需要修改"GUI_Context.pDeviceAPI = &LCD_L0_APIList;"为如下代码:
#if GUI_NUM_LAYERS == 1
GUI_Context.pDeviceAPI = LCD_aAPI[0];// 如果只支持一层,层0的API
#else
GUI_Context.pDeviceAPI = LCD_aAPI[GUI_Context.SelLayer];// 选定层的LCD设备API
#endif
LCD_SetClipRectMax();
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;
}
GUI_Context.pDeviceAPI = pDevicePrev; /* Restore API list ptr */
}
}
//!
//! @param hMem 存储设备的句柄
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_LOCK(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);
}
}
GUI_ALLOC_UNLOCK(hMem);
}
#else
void GUIDEV_AA(void)
{
/* avoid empty object files */
}
#endif /* GUI_MEMDEV_SUPPORT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -