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