📄 gdidrv16b.c
字号:
/******************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
******************************************************/
/*****************************************************
文件说明:图形设备驱动程序(16bit(1byte) / pixel )
版本号:2.0.0
开发时期:2000
作者:李林
修改记录:
2.LN, 2003-07-16, 增加 MERGECOPY 和 MERGEPAINT
1.LN 2003-05-06, Hatch brush有错误
******************************************************/
#include <eframe.h>
#include <gwmeobj.h>
//#ifndef COLOR_16BPP
//#error not define COLOR_16BPP in file version.h
//#endif
//extern const _BITMAPDATA __displayBitmap;
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 _drvDisplay16BPP = {
_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颜色值得到设备相关的颜色值
// 默认的设备相关的颜色格式: 16bits: BBBBB GGGGGG RRRRR
//引用:
//
// *****************************************************************
static COLORREF _RealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat )
{ // r5 6g b5
// bbbb bbbb gggg gggg rrrr rrrr ->
// 0000 0000 rrrr rggg gggb bbbb
// DWORD r = ( color << 8 ) & 0xf800;
// DWORD g = ( color >> 5) & 0x07e0;
//DWORD b = ( color >> 19) & 0x001f;
//return r | g | b;
if( lpcdwPal )
{
return _Gdi_RealizeColor( color, lpcdwPal, uPalNumber, uPalFormat );
}
else
{
DWORD r;
DWORD g;
DWORD b;
// 默认的颜色格式: 16bits: BBBBB GGGGGG RRRRR . format to 5b 6g 5r
r = ((color << 24) >> 16) & 0xf800;
g = ((color << 16) >> 21) & 0x07e0;
b = ((color << 8) >> 27) & 0x001f;
return (b | g | r);
}
/*
这代码将会导致 灰色失真(偏绿)
DWORD r, g, b;
r = ( (color & 0xff) * 0x1f / 0xff ) << 11;
g = ( ( (color >> 8 ) & 0xff) * 0x3f / 0xff ) << 5;
b = ( ( (color >> 16 ) & 0xff) * 0x1f / 0xff );
return r | g | b;
*/
}
// *****************************************************************
//声明:static COLORREF _UnrealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat )
//参数:
// IN color - 设备相关颜色值
//返回值:
// 设备无关颜色值
//功能描述:
// 由设备相关颜色值得到设备无关的RGB值
// 默认的设备相关的颜色格式: 16bits: BBBBB GGGGGG RRRRR
//引用:
//
// *****************************************************************
static COLORREF _UnrealizeColor( DWORD color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat )
{
// 1111 1111 rrrr rggg gggb bbbb ->
// bbbb bbbb gggg gggg rrrr rrrr
if( lpcdwPal )
{
return _Gdi_UnrealizeColor( color, lpcdwPal, uPalNumber, uPalFormat );
}
else
{
DWORD r = (color >> 11) & 0x1f;
DWORD g = (color >> 5) & 0x3f;
DWORD b = (color & 0x1f);
if( r == 0x1f )
r = 0xff;
if( g == 0x3f )
g = 0xff;
if( b == 0x1f )
b = 0xff;
return (b << 19) | (g << 10) | r << 3;
}
/*
DWORD r = color & 0xf800;
DWORD g = color & 0x07e0;
DWORD b = color & 0x001f;
r = ((r << 16) >> 24);
g = ((g << 21) >> 16);
b = ((b << 27) >> 8);
return (b | g | r);
*/
// r5 6g b5
/* 这代码将会导致 灰色失真(偏绿)
DWORD r, g, b;
r = ( (color & 0xf800) >> 11) * 0xff / 0x1f;
g = ( ( (color & 0x07e0) >> 5) * 0xff / 0x3f ) << 8;
b = ( ( (color & 0x001f)) * 0xff / 0x1f ) << 16;
return r | g | b;
*/
}
// *****************************************************************
//声明:static COLORREF _PutPixel( _LPPIXELDATA lpPixelData )
//参数:
// IN lpPixelData - _PIXELDATA结构指针,包含写点需要的数据
//返回值:
// 该点对应的颜色值
//功能描述:
// 在对应的xy点输出颜色值,并返回之前的值
//引用:
//
// *****************************************************************
static COLORREF _PutPixel( _LPPIXELDATA lpPixelData )
{
LPWORD lpVideoAdr;
COLORREF c;
UINT rop;
//是否需要真实输出 ?
if( (rop = lpPixelData->rop) != R2_NOP )
{ //需要输出
//得到x 位置/地址
lpVideoAdr = (LPWORD)(lpPixelData->lpDestImage->bmBits + lpPixelData->y * lpPixelData->lpDestImage->bmWidthBytes) + lpPixelData->x;
//得到当前/返回的颜色值
c = *lpVideoAdr;
//根据操作模式做相关动作
switch( rop )
{
case R2_COPYPEN: //拷贝到目标
*lpVideoAdr = (WORD)lpPixelData->color;
break;
case R2_XORPEN: //异或
*lpVideoAdr ^= (WORD)lpPixelData->color;
break;
case R2_NOT: //非
*lpVideoAdr = ~*lpVideoAdr;
break;
case R2_BLACK: //黑
*lpVideoAdr = 0;
break;
case R2_WHITE: //白
*lpVideoAdr = 0xffff;
break;
case R2_MASKPEN: // dest = dest-pixel-color and pen-color
*lpVideoAdr &= (WORD)lpPixelData->color;
break;
case R2_MERGEPEN: // dest = dest-pixel-color or pen-color
*lpVideoAdr |= (WORD)lpPixelData->color;
break;
case R2_MERGENOTPEN:
*lpVideoAdr |= ~(WORD)lpPixelData->color;
break;
case R2_NOTCOPYPEN:
*lpVideoAdr = ~(WORD)lpPixelData->color;
break;
case R2_NOTXORPEN:
*lpVideoAdr = ~( *lpVideoAdr ^ (WORD)lpPixelData->color );
break;
}
}
else
c = -1;
return c;
}
// *****************************************************************
//声明:static COLORREF _GetPixel( _LPPIXELDATA lpPixelData )
//参数:
// IN lpPixelData - _PIXELDATA结构指针,包含该点需要的数据
//返回值:
// 该点对应的颜色值
//功能描述:
// 得到对应的xy点的颜色值
//引用:
//
// *****************************************************************
static COLORREF _GetPixel( _LPPIXELDATA lpPixelData )
{
return *((LPWORD)(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 LPWORD lpDest;
register int sum, widthBytes;
register WORD color;
UINT rop;
//扫描行宽度(字节数)
widthBytes = lpLineData->lpDestImage->bmWidthBytes;
//目标地址
lpDest = (LPWORD)(lpLineData->lpDestImage->bmBits + y0 * widthBytes) + x0;
color = (WORD)lpLineData->color;
sum = len;
//正向或反向
if( yDir < 0 )
widthBytes = -widthBytes; //反向
//根据操作模式做不同的处理
if( (rop = lpLineData->rop) == R2_COPYPEN )
{ //拷贝
while( sum-- )
{
*lpDest = color;
lpDest = (LPWORD)((LPBYTE)lpDest + widthBytes);
}
}
else if( rop == R2_NOT )
{ //非
while( sum-- )
{
*lpDest = ~*lpDest;
lpDest = (LPWORD)((LPBYTE)lpDest + widthBytes);
}
}
else if( rop == R2_XORPEN )
{ //异或
while( sum-- )
{
*lpDest = *lpDest ^ color;
lpDest = (LPWORD)((LPBYTE)lpDest + widthBytes);
}
}
else if( rop == R2_NOTXORPEN )
{ //NOT 异或
while( sum-- )
{
*lpDest = ~(*lpDest ^ color);
lpDest = (LPWORD)((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 LPWORD lpDest;
register int sum, widthBytes;
WORD clrFore, clrBack;
BYTE pattern;
UINT rop;
//扫描行宽度(字节数)
widthBytes = lpLineData->lpDestImage->bmWidthBytes;
//目标地址
lpDest = (LPWORD)(lpLineData->lpDestImage->bmBits + y0 * widthBytes) + x0;
//前景和背景颜色
clrFore = (WORD)lpLineData->color;
clrBack = (WORD)lpLineData->clrBack;
pattern = lpLineData->pattern;
sum = len;
//正向或反向
if( yDir < 0 )
widthBytes = -widthBytes; //反向
//根据操作模式做不同的处理
if( (rop = lpLineData->rop) == R2_COPYPEN )
{ //拷贝
while( sum-- )
{
if( pattern & patternMask[y0&0x07] )
{
*lpDest = (WORD)clrFore;
}
else
{
*lpDest = (WORD)clrBack;
}
lpDest = (LPWORD)((LPBYTE)lpDest + widthBytes);
y0 += yDir;//dir;
}
}
else if( rop == R2_NOT )
{ //非
while( sum-- )
{
*lpDest = ~*lpDest;
lpDest = (LPWORD)((LPBYTE)lpDest + widthBytes);
}
}
else if( rop == R2_XORPEN )
{ //异或
while( sum-- )
{
if( pattern & patternMask[y0&0x07] )
{
*lpDest ^= clrFore;
}
else
{
*lpDest ^= clrBack;
}
lpDest = (LPWORD)((LPBYTE)lpDest + widthBytes);
y0 += yDir;//dir;
}
}
else if( rop == R2_NOTXORPEN )
{
while( sum-- )
{
if( pattern & patternMask[y0&0x07] )
{
*lpDest = ~( *lpDest ^ clrFore );
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -