www.pudn.com > uCGUI3.24-MemDev-for-3.90a.rar > 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* @see */ #include "GUI_Private.h" #include #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 */