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


/*! @file GUIDEV_Auto.c 
 *  Implementation of automatic banding memory devices  
 * 
 *  @author hiber modified 
 *  @author Copyleft (C) 1981-2006, All Rights Givenup 
 *  @date 04/18/2006 
 *  @version  
 * 
 *  @note  
 *  @attention  
 *  @warning  
 *  @bug 
 * 
 *  @todo 
 *  @example  
 *  @see 
 */ 
#include "GUI_Protected.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 
 
////////////////////////////////////////////////////////////////////////// 
 
//! 建立一个自动设备对象 
//! @param pAutoDev 一个GUI_AUTODEV 对象的指针 
//! @return 通常是 0,保留供以后使用。 
int GUI_MEMDEV_CreateAuto(GUI_AUTODEV * pAutoDev)  
{ 
    pAutoDev->FirstCall = 1; 
    return 0; 
} 
 
//! 删除一个自动设备对象 
//! @param pAutoDev 一个GUI_AUTODEV 对象的指针 
void GUI_MEMDEV_DeleteAuto(GUI_AUTODEV * pAutoDev)  
{ 
    GUI_USE_PARA(pAutoDev);// do nothing! 
} 
 
//! 使用一个分片存储设备执行一个指定的绘图函数。 
//! @param pAutoDev 一个 GUI_AUTODEV 对象的指针。 
//! @param pAutoDevInfo 一个 GUI_AUTODEV_INFO 对象的指针。 
//! @param pfDraw 用户定义要执行的绘图函数的指针。 
//! @param pData 一个由绘图函数传递的数据结构的指针。 
//! @return 如果成功返回0,函数执行失败返回1 
//! @note  
int GUI_MEMDEV_DrawAuto(GUI_AUTODEV *pAutoDev, GUI_AUTODEV_INFO *pAutoDevInfo, 
                        GUI_CALLBACK_VOID_P *pfDraw, void *pData) 
{ 
    GUI_RECT rTemp; 
    GUI_HMEM hMem = GUI_MEASDEV_Create(); 
 
    if (!hMem) 
    { 
        return 1; 
    } 
    GUI_MEASDEV_Select(hMem); 
 
    /* Measure area to draw */ 
    if (pAutoDev->FirstCall) 
    { 
        /* Measure complete area */ 
        pAutoDevInfo->DrawFixed = 1; 
        pfDraw(pData); 
        GUI_MEASDEV_GetRect(hMem, &pAutoDev->rView); 
        /* Measure variable area only */ 
        GUI_MEASDEV_ClearRect(hMem); 
        pAutoDevInfo->DrawFixed = 0; 
        pfDraw(pData); 
        GUI_MEASDEV_GetRect(hMem, &pAutoDev->rPrev); 
    } 
    else 
    { 
        /* Measure variable area only */ 
        pfDraw(pData); 
        GUI_MEASDEV_GetRect(hMem, &pAutoDev->rView); 
        rTemp = pAutoDev->rView; 
        GUI_MergeRect(&pAutoDev->rView, &pAutoDev->rView, &pAutoDev->rPrev); 
        pAutoDev->rPrev = rTemp; 
    } 
 
    GUI_MEASDEV_Delete(hMem); 
 
    /* Do the actual drawing */ 
    pAutoDevInfo->DrawFixed = 1; 
    if (GUI_MEMDEV_Draw(&pAutoDev->rView, pfDraw, pData, 0, GUI_MEMDEV_NOTRANS)) 
    { 
        return 1; 
    } 
 
    pAutoDevInfo->DrawFixed = 0; 
    pAutoDev->FirstCall = 0; 
    return 0; 
} 
 
#else 
 
void GUIDEV_Auto(void) {} /* avoid empty object files */ 
 
#endif /* GUI_SUPPORT_MEMDEV */