gdidrv32b.c
来自「深圳市微逻辑电子有限公司 巨果• Kingmos® 系统核心」· C语言 代码 · 共 937 行 · 第 1/2 页
C
937 行
/******************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
******************************************************/
/*****************************************************
文件说明:图形设备驱动程序(32bit)
版本号:2.0.0
开发时期:2003
作者:李林
修改记录:
******************************************************/
#include <eframe.h>
#include <gwmeobj.h>
//#ifndef COLOR_32BPP
//#error not define COLOR_32BPP in file version.h
//#endif
static COLORREF _PutPixel( _LPPIXELDATA lpPixelData );
static COLORREF _GetPixel( _LPPIXELDATA lpPixelData );
static BOOL _Line( _LPLINEDATA lpData );
static BOOL _BlkBitTransparentBlt( _LPBLKBITBLT lpData );
static BOOL _BlkBitMaskBlt( _LPBLKBITBLT lpData );
static BOOL _BlkBitBlt( _LPBLKBITBLT lpData );
static COLORREF _RealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat );
static COLORREF _UnrealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat );
//申明图形设备驱动程序接口对象
const _DISPLAYDRV _drvDisplay32BPP = {
_PutPixel,
_GetPixel,
_Line,
_BlkBitTransparentBlt,
_BlkBitMaskBlt,
_BlkBitBlt,
_RealizeColor,
_UnrealizeColor
};
static const BYTE patternMask[8]=
{
0x80,
0x40,
0x20,
0x10,
0x08,
0x04,
0x02,
0x01
};
// *****************************************************************
//声明:static COLORREF _RealizeColor( COLORREF color )
//参数:
// IN color - RGB 颜色值
//返回值:
// 设备相关的颜色值
//功能描述:
// 由RGB颜色值得到设备相关的颜色值
//引用:
// 驱动程序接口函数
// *****************************************************************
static COLORREF _RealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat )
{ // 格式: 8 8 8
if( lpcdwPal )
{
return _Gdi_RealizeColor( color, lpcdwPal, uPalNumber, uPalFormat );
}
else
{
BYTE r = ((BYTE)color) & 0xff;
BYTE g = ((BYTE)(color >> 8)) & 0xff;
BYTE b = ((BYTE)(color >> 16)) & 0xff;
return (((DWORD)r) << 16) | (((DWORD)g) << 8) | b;
}
}
// *****************************************************************
//声明:static COLORREF _UnrealizeColor( COLORREF color )
//参数:
// IN color - 设备相关颜色值
//返回值:
// 设备无关颜色值
//功能描述:
// 由设备相关颜色值得到设备无关的RGB值
//引用:
// 驱动程序接口函数
// *****************************************************************
static COLORREF _UnrealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat )
{
if( lpcdwPal )
{
return _Gdi_UnrealizeColor( color, lpcdwPal, uPalNumber, uPalFormat );
}
else
{
DWORD r = (color >> 16) & 0xff;
DWORD g = (color >> 8) & 0xff;
DWORD b = (color) & 0xff;
return RGB( r, g, b );
}
}
// *****************************************************************
//声明:static COLORREF _PutPixel( _LPPIXELDATA lpPixelData )
//参数:
// IN lpPixelData - _PIXELDATA结构指针,包含写点需要的数据
//返回值:
// 该点对应的颜色值
//功能描述:
// 在对应的xy点输出颜色值,并返回之前的值
//引用:
// 驱动程序接口函数
// *****************************************************************
static COLORREF _PutPixel( _LPPIXELDATA lpPixelData )
{
LPDWORD lpVideoAdr;
COLORREF c;
UINT rop;
//是否需要真实输出 ?
if( (rop = lpPixelData->rop) != R2_NOP )
{ //需要输出
//得到x 位置/地址
lpVideoAdr = (LPDWORD)(lpPixelData->lpDestImage->bmBits + lpPixelData->y * lpPixelData->lpDestImage->bmWidthBytes) + lpPixelData->x;
//得到当前/返回的颜色值
c = *lpVideoAdr;
//根据操作模式做相关动作
switch( rop )
{
case R2_COPYPEN: //拷贝到目标
*lpVideoAdr = (DWORD)lpPixelData->color;
break;
case R2_XORPEN: //异或
*lpVideoAdr ^= (DWORD)lpPixelData->color;
break;
case R2_NOT: //非
*lpVideoAdr = ~*lpVideoAdr;
break;
case R2_BLACK: //黑
*lpVideoAdr = 0;
break;
case R2_WHITE: //白
*lpVideoAdr = 0xffffff;//0xffffffffl;
break;
case R2_MASKPEN: // dest = dest-pixel-color and pen-color
*lpVideoAdr &= (DWORD)lpPixelData->color;
break;
case R2_MERGEPEN: // dest = dest-pixel-color or pen-color
*lpVideoAdr |= (DWORD)lpPixelData->color;
break;
case R2_MERGENOTPEN:
*lpVideoAdr |= ~(DWORD)lpPixelData->color;
break;
case R2_NOTCOPYPEN:
*lpVideoAdr = ~(DWORD)lpPixelData->color;
break;
case R2_NOTXORPEN:
*lpVideoAdr = ~( *lpVideoAdr ^ (DWORD)lpPixelData->color );
break;
}
}
else
c = -1;
return c;
}
// *****************************************************************
//声明:static COLORREF _GetPixel( _LPPIXELDATA lpPixelData )
//参数:
// IN lpPixelData - _PIXELDATA结构指针,包含该点需要的数据
//返回值:
// 该点对应的颜色值
//功能描述:
// 得到对应的xy点的颜色值
//引用:
// 驱动程序接口函数
// *****************************************************************
static COLORREF _GetPixel( _LPPIXELDATA lpPixelData )
{
return *((LPDWORD)(lpPixelData->lpDestImage->bmBits + lpPixelData->y * lpPixelData->lpDestImage->bmWidthBytes) + lpPixelData->x);
}
// *****************************************************************
//声明:static BOOL __VertialSolidLine( _LPLINEDATA lpLineData,
// int x0,
// int y0,
// int yDir,
// unsigned int uLen )
//参数:
// IN lpLineData - _LINEDATA结构指针,包含画线需要的数据
// IN x0 - 起点 x 坐标
// IN y0 - 起点 y 坐标
// IN yDir - 方向(当 < 0 , 由下向上)
// IN uLen - 点数
//返回值:
// 返回TRUE
//功能描述:
// 用纯色画垂直线
//引用:
// 被 line.h 使用
// *****************************************************************
static BOOL __VertialSolidLine( _LPLINEDATA lpLineData, int x0, int y0, int yDir, int len )
{
register LPDWORD lpDest;
register int sum, widthBytes;
register DWORD color;
//扫描行宽度(字节数)
widthBytes = lpLineData->lpDestImage->bmWidthBytes;
//目标地址
lpDest = (LPDWORD)(lpLineData->lpDestImage->bmBits + y0 * widthBytes) + x0;
color = (DWORD)lpLineData->color;
sum = len;
//正向或反向
if( yDir < 0 )
widthBytes = -widthBytes; //反向
//根据操作模式做不同的处理
if( lpLineData->rop == R2_COPYPEN )
{ //拷贝
while( sum-- )
{
*lpDest = color;
lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
}
}
else if( lpLineData->rop == R2_NOT )
{ //非
while( sum-- )
{
*lpDest = ~*lpDest;
lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
}
}
else if( lpLineData->rop == R2_XORPEN )
{ //异或
while( sum-- )
{
*lpDest = *lpDest ^ color;
lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
}
}
return TRUE;
}
// *****************************************************************
//声明:static BOOL __VertialPatternLine( _LPLINEDATA lpLineData,
// int x0,
// int y0,
// int yDir,
// unsigned int uLen )
//参数:
// IN lpLineData - _LINEDATA结构指针,包含画线需要的数据
// IN x0 - 起点 x 坐标
// IN y0 - 起点 y 坐标
// IN yDir - 方向(当 < 0 , 由下向上)
// IN uLen - 点数
//返回值:
// 返回TRUE
//功能描述:
// 带模板画垂直线
//引用:
// 被 line.h 使用
// *****************************************************************
static BOOL __VertialPatternLine( _LPLINEDATA lpLineData, int x0, int y0, int yDir, int len )
{
register LPDWORD lpDest;
register int sum, widthBytes;
DWORD clrFore, clrBack;
BYTE pattern;
//扫描行宽度(字节数)
widthBytes = lpLineData->lpDestImage->bmWidthBytes;
//目标地址
lpDest = (LPDWORD)(lpLineData->lpDestImage->bmBits + y0 * widthBytes) + x0;
//前景和背景颜色
clrFore = (DWORD)lpLineData->color;
clrBack = (DWORD)lpLineData->clrBack;
pattern = lpLineData->pattern;
sum = len;
//正向或反向
if( yDir < 0 )
widthBytes = -widthBytes; //反向
//根据操作模式做不同的处理
if( lpLineData->rop == R2_COPYPEN )
{ //拷贝
while( sum-- )
{
if( pattern & patternMask[y0&0x07] )
{
*lpDest = (DWORD)clrFore;
}
else
{
*lpDest = (DWORD)clrBack;
}
lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
y0 += yDir;
}
}
else if( lpLineData->rop == R2_XORPEN )
{ //异或
while( sum-- )
{
if( pattern & patternMask[y0&0x07] )
{
*lpDest ^= clrFore;
}
else
{
*lpDest ^= clrBack;
}
lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
y0 += yDir;
}
}
else if( lpLineData->rop == R2_NOT )
{ //非
while( sum-- )
{
*lpDest = ~*lpDest;
lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
}
}
return TRUE;
}
// *****************************************************************
//声明:static BOOL __VertialTransparentLine( _LPLINEDATA lpLineData,
// int x0,
// int y0,
// int yDir,
// unsigned int uLen )
//参数:
// IN lpLineData - _LINEDATA结构指针,包含画线需要的数据
// IN x0 - 起点 x 坐标
// IN y0 - 起点 y 坐标
// IN yDir - 方向(当 < 0 , 由下向上)
// IN uLen - 点数
//返回值:
// 返回TRUE
//功能描述:
// 带模板画透明垂直线(即当模板对应位为1时,输出;为0时,不输出)
//引用:
// 被 line.h 使用
// *****************************************************************
static BOOL __VertialTransparentLine( _LPLINEDATA lpLineData, int x0, int y0, int yDir, int len )
{
register LPDWORD lpDest;
register int sum, widthBytes;
DWORD clrFore;
BYTE pattern;
//扫描行宽度(字节数)
widthBytes = lpLineData->lpDestImage->bmWidthBytes;
//目标地址
lpDest = (LPDWORD)(lpLineData->lpDestImage->bmBits + y0 * widthBytes) + x0;
clrFore = (DWORD)lpLineData->color;
pattern = lpLineData->pattern;
sum = len;
//正向或反向
if( yDir < 0 )
widthBytes = -widthBytes; //反向
//根据操作模式做不同的处理
if( lpLineData->rop == R2_COPYPEN )
{ //拷贝
while( sum-- )
{
if( pattern & patternMask[y0&0x07] )
*lpDest = (DWORD)clrFore;
lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
y0 += yDir;
}
}
else if( lpLineData->rop == R2_XORPEN )
{ //异或
while( sum-- )
{
if( pattern & patternMask[y0&0x07] )
*lpDest ^= (DWORD)clrFore;
lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
y0 += yDir;
}
}
else if( lpLineData->rop == R2_NOT )
{ //非
while( sum-- )
{
*lpDest = ~*lpDest;
lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
}
}
return TRUE;
}
// *****************************************************************
//声明:static BOOL __ScanSolidLine( _LPLINEDATA lpLineData,
// int x0,
// int y0,
// int xDir,
// unsigned int uLen )
//参数:
// IN lpLineData - _LINEDATA结构指针,包含画线需要的数据
// IN x0 - 起点 x 坐标
// IN y0 - 起点 y 坐标
// IN xDir - 方向(当 < 0 , 由右向左)
// IN uLen - 点数
//返回值:
// 返回TRUE
//功能描述:
// 用纯色画水平线
//引用:
// 被 line.h 使用
// *****************************************************************
static BOOL __ScanSolidLine( _LPLINEDATA lpLineData, int x0, int y0, int xDir, unsigned int uLen )
{
register LPDWORD lpDestStart;
register DWORD color;
//得到开始地址
lpDestStart = (LPDWORD)(lpLineData->lpDestImage->bmBits + lpLineData->lpDestImage->bmWidthBytes * y0) + x0;
color = (DWORD)lpLineData->color;
//根据操作模式做不同的处理
switch( lpLineData->rop )
{
case R2_COPYPEN: //拷贝
for( ; uLen; lpDestStart += xDir, uLen-- )
{
*lpDestStart = color;
}
break;
case R2_XORPEN: //异或
for( ; uLen; lpDestStart += xDir, uLen-- )
*lpDestStart ^= color;
break;
case R2_NOT: //非
for( ; uLen; lpDestStart += xDir, uLen-- )
*lpDestStart = ~*lpDestStart;
break;
}
return TRUE;
}
// *****************************************************************
//声明:static BOOL __ScanPatternLine( _LPLINEDATA lpLineData,
// int x0,
// int y0,
// int xDir,
// unsigned int uLen )
//参数:
// IN lpLineData - _LINEDATA结构指针,包含画线需要的数据
// IN x0 - 起点 x 坐标
// IN y0 - 起点 y 坐标
// IN xDir - 方向(当 < 0 , 由右向左)
// IN uLen - 点数
//返回值:
// 返回TRUE
//功能描述:
// 带模板用纯色画水平线
//引用:
// 被 line.h 使用
// *****************************************************************
static BOOL __ScanPatternLine( _LPLINEDATA lpLineData, int x0, int y0, int xDir, unsigned int uLen )
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?