www.pudn.com > uCGUI3.24-MemDev-for-3.90a.rar > GUIDEV_CopyFromLCD.c


/*! @file GUIDEV_CopyFromLCD.c 
 *  Implementation of memory devices  
 * 
 *  @author hiber modified 
 *  @author Copyleft (C) 1981-2006, All Rights Givenup 
 *  @date 04/18/2006 
 *  @version  
 * 
 *  @note 3.90a和3.24部分宏和函数名不同 
 *  @attention  
 *  @warning  
 *  @bug 
 * 
 *  @todo 
 *  @example  
 *  @see 
 */ 
 
#include "GUI_Private.h" 
#include "GUIDebug.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 LCD_LIMIT(Var, Op, Limit) if (Var Op Limit) Var = Limit 
 
//! 从LCD 数据(视频存储器)拷贝一个存储设备的内容到存储设备,即回读LCD的内容到存储设备。 
//! @param hMem 存储设备的句柄 
void GUI_MEMDEV_CopyFromLCD(GUI_MEMDEV_Handle hMem) 
{ 
    /* Make sure memory handle is valid */ 
    if (!hMem) 
    { 
        hMem = GUI_Context.hDevData;// 如果参数为NULL,尝试使用图形设备上下文中的句柄 
    } 
 
    if (!hMem) 
    { 
        return ; 
    } 
 
   // 大括号... 
    { 
        GUI_MEMDEV *pDevData = (GUI_MEMDEV*)GUI_ALLOC_LOCK(hMem); /* Convert to pointer */ 
        LCD_RECT r; 
        int y; 
        int XMax; 
        GUI_USAGE *pUsage = 0; 
        GUI_MEMDEV_Handle hMemOld = GUI_Context.hDevData; 
 
        GUI_MEMDEV_Select(hMem); 
        if (pDevData->hUsage) 
        { 
            pUsage = GUI_USAGE_H2P(pDevData->hUsage); 
        } 
 
        /* Get bounding rectangle */ 
        r.y0 = pDevData->y0; 
        r.x0 = pDevData->x0; 
        r.x1 = pDevData->x0 + pDevData->XSize - 1; 
        r.y1 = pDevData->y0 + pDevData->YSize - 1; 
 
        /* Make sure bounds are within LCD area so we can call driver directly */ 
        LCD_LIMIT(r.x0,  < , 0); 
        LCD_LIMIT(r.y0,  < , 0); 
        LCD_LIMIT(r.x1,  > , LCD_GET_XSIZE() - 1); 
        LCD_LIMIT(r.y1,  > , LCD_GET_YSIZE() - 1); 
 
        XMax = r.x1; 
        for (y = r.y0; y <= r.y1; y++) 
        { 
            int x = r.x0; 
            LCD_PIXELINDEX *pData = (LCD_PIXELINDEX *)GUI_MEMDEV__XY2PTR(x, y); 
            if (pUsage) 
            { 
                GUI_USAGE_AddHLine(pUsage, x, y, r.x1 - r.x0 + 1); 
            } 
 
            for (; x <= XMax; x++) 
            { 
                *pData++ = LCD_L0_GetPixelIndex(x, y); 
            } 
        } 
 
        GUI_MEMDEV_Select(hMemOld); 
    } 
 
    GUI_ALLOC_UNLOCK(hMem); 
} 
#endif /* GUI_MEMDEV_SUPPORT */