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