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 */