📄 guidev_measure.c
字号:
/*! @file GUIDEV_Measure.c
* Implementation of measurement devices
* Use a measurement device to find out the area (Rectangle) affected by a sequence of drawing operations
*
* @author hiber modified
* @author Copyleft (C) 1981-2006, All Rights Givenup
* @date 04/18/2006
* @version
*
* @note
* @attention
* @warning
* @bug
*
* @todo
* @example <file-name>
* @see
*/
#include <string.h>
#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
//////////////////////////////////////////////////////////////////////////
//! 存储测量设备?
typedef struct
{
GUI_RECT rUsed;
tLCDDEV_Color2Index *pfColor2Index;
tLCDDEV_Index2Color *pfIndex2Color;
tLCDDEV_GetIndexMask* pfGetIndexMask;//!< added by hiber
} GUI_MEASDEV;
#define GUI_MEASDEV_h2p(h) ((GUI_MEASDEV*)GUI_ALLOC_h2p(h))//!< 存储测量设备句柄到内存指针的转换
//////////////////////////////////////////////////////////////////////////
// internal routines (not part of interface table)
//!
void _MarkPixel(int x, int y)
{
GUI_MEASDEV* pDev = (GUI_MEASDEV*)(GUI_MEMDEV_H2P(GUI_Context.hDevData));
if (x < pDev->rUsed.x0)
{
pDev->rUsed.x0 = x;
}
if (x > pDev->rUsed.x1)
{
pDev->rUsed.x1 = x;
}
if (y < pDev->rUsed.y0)
{
pDev->rUsed.y0 = y;
}
if (y > pDev->rUsed.y1)
{
pDev->rUsed.y1 = y;
}
}
//!
void _MarkRect(int x0, int y0, int x1, int y1)
{
GUI_MEASDEV* pDev = (GUI_MEASDEV*)(GUI_MEMDEV_H2P(GUI_Context.hDevData));
if (x0 < pDev->rUsed.x0)
{
pDev->rUsed.x0 = x0;
}
if (x1 > pDev->rUsed.x1)
{
pDev->rUsed.x1 = x1;
}
if (y1 < pDev->rUsed.y0)
{
pDev->rUsed.y0 = y0;
}
if (y1 > pDev->rUsed.y1)
{
pDev->rUsed.y1 = y1;
}
}
//!
static void _DrawBitmap(int x0, int y0, int xsize, int ysize, int BitsPerPixel,
int BytesPerLine, const U8 *pData, int Diff, const LCD_PIXELINDEX *pTrans)
{
GUI_USE_PARA(BitsPerPixel);
GUI_USE_PARA(BytesPerLine);
GUI_USE_PARA(pData);
GUI_USE_PARA(Diff);
GUI_USE_PARA(pTrans);
_MarkRect(x0, y0, x0 + xsize - 1, y0 + ysize - 1);
}
//!
static void _DrawHLine(int x0, int y, int x1)
{
_MarkRect(x0, y, x1, y);
}
//!
static void _DrawVLine(int x, int y0, int y1)
{
_MarkRect(x, y0, x, y1);
}
//!
static void _SetPixelIndex(int x, int y, int Index)
{
GUI_USE_PARA(Index);
_MarkPixel(x, y);
}
//!
static void _XorPixel(int x, int y)
{
_MarkPixel(x, y);
}
//!
static unsigned int _GetPixelIndex(int x, int y)
{
GUI_USE_PARA(x);
GUI_USE_PARA(y);
return 0;
}
//!
static void _FillRect(int x0, int y0, int x1, int y1)
{
_MarkRect(x0, y0, x1, y1);
}
//!
static void _GetRect(LCD_RECT *pRect)
{
pRect->x0 = pRect->y0 = - 4095;
pRect->x1 = pRect->y1 = 4095;
}
//!
static unsigned int _Color2Index(LCD_COLOR Color)
{
GUI_MEASDEV * pDev = GUI_MEASDEV_h2p(GUI_Context.hDevData);
return pDev->pfColor2Index(Color);
}
//!
static LCD_COLOR _Index2Color(int Index)
{
GUI_MEASDEV * pDev = GUI_MEASDEV_h2p(GUI_Context.hDevData);
return pDev->pfIndex2Color(Index);
}
//! 得到调色反索引掩码
//! @note 3.24版中GUI_MEMDEV无pfGetIndexMask
static int _GetIndexMask(void)
{
GUI_MEASDEV * pDev = GUI_MEASDEV_h2p(GUI_Context.hDevData);
return pDev->pfGetIndexMask();
}
//!
static void CalcPolyRect(GUI_RECT *pr, const GUI_POINT *paPoint, int NumPoints)
{
int i;
int xMin, xMax, yMin, yMax;
xMin = GUI_XMAX;
yMin = GUI_YMAX;
xMax = GUI_XMIN;
yMax = GUI_YMIN;
for (i = 0; i < NumPoints; i++)
{
int x = paPoint->x;
int y = paPoint->y;
if (xMin > x)
{
xMin = x;
}
if (xMax < x)
{
xMax = x;
}
if (yMin > y)
{
yMin = y;
}
if (yMax < y)
{
yMax = y;
}
paPoint++;
}
pr->x0 = xMin;
pr->x1 = xMax;
pr->y0 = yMin;
pr->y1 = yMax;
}
//!
static void _FillPolygon(const GUI_POINT *paPoint, int NumPoints, int x0, int y0)
{
GUI_RECT r;
CalcPolyRect(&r, paPoint, NumPoints);
GUI_MoveRect(&r, x0, y0);
_MarkRect(r.x0, r.y0, r.x1, r.y1);
}
//!
static void _FillPolygonAA(const GUI_POINT *paPoint, int NumPoints, int x0, int y0)
{
GUI_RECT r;
CalcPolyRect(&r, paPoint, NumPoints);
GUI_MoveRect(&r, x0, y0);
if (GUI_Context.AA_HiResEnable)
{
r.x0 /= GUI_Context.AA_Factor;
r.y0 /= GUI_Context.AA_Factor;
r.x1 = (r.x1 + GUI_Context.AA_Factor - 1) / GUI_Context.AA_Factor;
r.y1 = (r.y1 + GUI_Context.AA_Factor - 1) / GUI_Context.AA_Factor;
}
_MarkRect(r.x0, r.y0, r.x1, r.y1);
}
//! 设置LUT入口
//! @note 加入以兼容3.90a
static void _SetLUTEntry (U8 Pos, LCD_COLOR color)
{
GUI_USE_PARA(Pos);
GUI_USE_PARA(color);
}
//////////////////////////////////////////////////////////////////////////
//! LCD存储设备API函数指针表
//! @note 注意tLCDDEV_APIList结构3.90a与3.24版本不相同!
static const tLCDDEV_APIList _APIList =
{
_Color2Index,
_Index2Color,// added by hiber
_GetIndexMask,// added by hiber
_DrawBitmap,
_DrawHLine,
_DrawVLine,
_FillRect,
_GetPixelIndex,
_GetRect,
_SetPixelIndex,
_XorPixel,
_SetLUTEntry,// added by hiber
_FillPolygon,
_FillPolygonAA
};
//////////////////////////////////////////////////////////////////////////
//!
void GUI_MEASDEV_Delete(GUI_MEASDEV_Handle hMemDev)
{
/* Make sure memory device is not used */
if ((GUI_Context.hDevData = hMemDev) != 0)
{
GUI_SelectLCD();
}
GUI_ALLOC_FREE(hMemDev);
}
//!
void GUI_MEASDEV_ClearRect(GUI_MEASDEV_Handle hMemDev)
{
if (hMemDev)
{
GUI_MEASDEV* pDevData = (GUI_MEASDEV*)GUI_ALLOC_H2P(hMemDev);
pDevData->rUsed.x0 = GUI_XMAX;
pDevData->rUsed.y0 = GUI_YMAX;
pDevData->rUsed.x1 = GUI_XMIN;
pDevData->rUsed.y1 = GUI_YMIN;
}
}
//!
GUI_MEASDEV_Handle GUI_MEASDEV_Create(void)
{
int MemSize;
GUI_MEASDEV_Handle hMemDev;
MemSize = sizeof(GUI_MEASDEV);
hMemDev = GUI_ALLOC_AllocNoInit(MemSize);
if (hMemDev)
{
GUI_MEASDEV* pDevData = (GUI_MEASDEV*)GUI_ALLOC_H2P(hMemDev);
pDevData->pfColor2Index = GUI_Context.pDeviceAPI->pfColor2Index;
pDevData->pfIndex2Color = GUI_Context.pDeviceAPI->pfIndex2Color;
GUI_MEASDEV_ClearRect(hMemDev);
}
else
{
GUI_DEBUG_WARN("GUI_MEASDEV_Create: Alloc failed");
}
return hMemDev;
}
//! @param hMem 存储设备的句柄
void GUI_MEASDEV_Select(GUI_MEASDEV_Handle hMem)
{
if (hMem == 0)
{
GUI_SelectLCD();
}
else
{
#if GUI_WINSUPPORT
WM_Deactivate();
#endif
GUI_Context.hDevData = hMem;
GUI_Context.pDeviceAPI = &_APIList;
GUI_Context.pClipRect_HL = NULL;
LCD_SetClipRectMax();
}
}
//! @param hMem 存储设备的句柄
void GUI_MEASDEV_GetRect(GUI_MEASDEV_Handle hMem, GUI_RECT *pRect)
{
if (hMem)
{
GUI_MEASDEV* pDev = (GUI_MEASDEV*)GUI_ALLOC_H2P(hMem);
if (pRect)
{
pRect->x0 = pDev->rUsed.x0;
pRect->y0 = pDev->rUsed.y0;
pRect->x1 = pDev->rUsed.x1;
pRect->y1 = pDev->rUsed.y1;
}
}
}
#else
void GUIDEV_Measure(void)
{
/* avoid empty object files */
}
#endif /* GUI_MEMDEV_SUPPORT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -