📄 gdidrv16b.c
字号:
*lpDest = ~(*lpDest ^ clrBack);
}
lpDest = (LPWORD)((LPBYTE)lpDest + widthBytes);
y0 += yDir;//dir;
}
}
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 LPWORD lpDest;
register int sum, widthBytes;
WORD clrFore;
BYTE pattern;
UINT rop;
//扫描行宽度(字节数)
widthBytes = lpLineData->lpDestImage->bmWidthBytes;
//目标地址
lpDest = (LPWORD)(lpLineData->lpDestImage->bmBits + y0 * widthBytes) + x0;
//前景和背景颜色
clrFore = (WORD)lpLineData->color;
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;
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 ^= (WORD)clrFore;
lpDest = (LPWORD)((LPBYTE)lpDest + widthBytes);
y0 += yDir;//dir;
}
}
else if( rop == R2_NOTXORPEN )
{ //NOT异或
while( sum-- )
{
if( pattern & patternMask[y0&0x07] )
*lpDest = ~( *lpDest ^ (WORD)clrFore );
lpDest = (LPWORD)((LPBYTE)lpDest + widthBytes);
y0 += yDir;//dir;
}
}
return TRUE;
}
/*
static BOOL _VertialLine( _LPLINEDATA lpLineData )
{
if( lpLineData->pattern == 0xff )
{
return __VertialSolidLine( lpLineData );
}
else
{
if( lpLineData->backMode == TRANSPARENT )
return __VertialTransparentLine( lpLineData );
else
return __VertialPatternLine( lpLineData );
}
}
*/
// *****************************************************************
//声明: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 LPWORD lpDestStart;
register WORD color;
//得到开始地址
lpDestStart = (LPWORD)(lpLineData->lpDestImage->bmBits + lpLineData->lpDestImage->bmWidthBytes * y0) + x0;
color = (WORD)lpLineData->color;
//根据操作模式做不同的处理
switch( lpLineData->rop )
{
case R2_COPYPEN: //拷贝
for( ; uLen; lpDestStart += xDir, uLen-- )
{
*lpDestStart = color;
}
break;
case R2_NOT: //非
for( ; uLen; lpDestStart += xDir, uLen-- )
*lpDestStart = ~*lpDestStart;
break;
case R2_XORPEN: //异或
for( ; uLen; lpDestStart += xDir, uLen-- )
*lpDestStart ^= color;
break;
case R2_NOTXORPEN: //NOT异或
for( ; uLen; lpDestStart += xDir, uLen-- )
*lpDestStart = ~(*lpDestStart ^ color);
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 )
{
register LPWORD lpDestStart;
register WORD clrFore, clrBack;
register BYTE pattern;
UINT rop;
//得到开始地址
lpDestStart = (LPWORD)(lpLineData->lpDestImage->bmBits + lpLineData->lpDestImage->bmWidthBytes * y0) + x0;
//前景色和背景色
clrFore = (WORD)lpLineData->color;
clrBack = (WORD)lpLineData->clrBack;
pattern = lpLineData->pattern;
if( (rop = lpLineData->rop) == R2_COPYPEN )
{ //拷贝
for( ; uLen; lpDestStart += xDir, x0 += xDir, uLen-- )
{
if( pattern & patternMask[ x0 & 0x07 ] )
*lpDestStart = (WORD)clrFore;
else
*lpDestStart = (WORD)clrBack;
}
}
else if( rop == R2_NOT )
{ //非
for( ; uLen; lpDestStart += xDir, x0 += xDir, uLen-- )
{
*lpDestStart = ~*lpDestStart;
}
}
else if( rop == R2_XORPEN )
{ //异或
for( ; uLen; lpDestStart += xDir, x0 += xDir, uLen-- )
{
if( pattern & patternMask[x0&0x07] )
*lpDestStart ^= clrFore;
else
*lpDestStart ^= clrBack;
}
}
else if( rop == R2_NOTXORPEN )
{ //异或
for( ; uLen; lpDestStart += xDir, x0 += xDir, uLen-- )
{
if( pattern & patternMask[x0&0x07] )
*lpDestStart = ~(*lpDestStart ^ clrFore);
else
*lpDestStart = ~(*lpDestStart ^ clrBack);
}
}
return TRUE;
}
// *****************************************************************
//声明:static BOOL __ScanTransparentLine( _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 __ScanTransparentLine( _LPLINEDATA lpLineData, int x0, int y0, int xDir, unsigned int uLen )
{
register LPWORD lpDestStart;
register WORD clrFore;
register BYTE pattern;
UINT rop;
//得到目标地址
lpDestStart = (LPWORD)(lpLineData->lpDestImage->bmBits + lpLineData->lpDestImage->bmWidthBytes * y0 ) + x0;
clrFore = (WORD)lpLineData->color;
pattern = lpLineData->pattern;
//根据操作模式做不同的处理
if( (rop = lpLineData->rop) == R2_COPYPEN )
{ //拷贝
for( ; uLen; lpDestStart += xDir, x0 += xDir, uLen-- )
{
if( pattern & patternMask[x0&0x07] )
*lpDestStart = (WORD)clrFore;
}
}
else if( rop == R2_NOT )
{ //非
for( ; uLen; lpDestStart += xDir, x0 += xDir, uLen-- )
{
*lpDestStart = ~*lpDestStart;
}
}
else if( rop == R2_XORPEN )
{ //异或
for( ; uLen; lpDestStart += xDir, x0 += xDir, uLen-- )
{
if( pattern & patternMask[x0&0x07] )
*lpDestStart ^= (WORD)clrFore;
}
}
else if( rop == R2_NOTXORPEN )
{ //NOT异或
for( ; uLen; lpDestStart += xDir, x0 += xDir, uLen-- )
{
if( pattern & patternMask[x0&0x07] )
*lpDestStart = ~( *lpDestStart ^ (WORD)clrFore );
}
}
return TRUE;
}
/*
static BOOL _ScanLine( _LPLINEDATA lpData )
{
if( lpData->pattern == 0xff )
{
return __ScanSolidLine( lpData );
}
else
{
if( lpData->backMode == TRANSPARENT )
return __ScanTransparentLine( lpData );
else
return __ScanPatternLine( lpData );
}
}
*/
#include "..\include\line.h"
#define _SRCCOPY 0xCC // dest = source
#define _SRCPAINT 0xEE // dest = source OR dest
#define _SRCAND 0x88 // dest = source AND dest
#define _SRCINVERT 0x66 // dest = source XOR dest
// *****************************************************************
//声明:static void __MoveBits( LPBYTE lpDest, int nBits, LPCBYTE lpSrc, int count )
//参数:
// IN lpDest - 目标地址
// IN nBits - 移动的 bit 数
// IN lpSrc - 源地址
// IN count - 源bytes数
//返回值:
// 无
//功能描述:
// 将源移动 nBits 比特数。当 nBits > 0 为右移;< 0 为左移
//引用:
//
// *****************************************************************
static void __MoveBits( LPBYTE lpDest, int nBits, LPCBYTE lpSrc, WORD count )
{
int vBits;
if( nBits > 0 ) // >>
{ //为右移
*lpDest++ = *lpSrc++ >> nBits;
vBits = 8 - nBits;
count--;
while( count )
{
*lpDest = (((WORD)*(lpSrc-1)) << vBits ) | (*lpSrc >> nBits);
lpDest++; lpSrc++;
count--;
}
// end byte
*lpDest = *(lpSrc-1) << vBits;
}
else if( nBits < 0 ) // <<
{ //为左移
nBits = -nBits;
vBits = 8-nBits;
count--; // read for end byte
while( count )
{
*lpDest = (*lpSrc << nBits) | (*(lpSrc+1) >> vBits);
lpDest++; lpSrc++;
count--;
}
// end byte
*lpDest = *lpSrc << nBits;
}
else // No move
{
while( count )
{
*lpDest++ = *lpSrc++;
count--;
}
}
}
/*
BOOL _TextBitBlt( _LPBLKBITBLT lpData )
{
LPBYTE lpDestStart, lpDest;
LPCBYTE lpMaskStart, lpMask;
WORD clFore, clBack;
short i, j, rows, cols, shift;
BOOL bEraseBack = (lpData->backMode == OPAQUE);
BYTE mask, bitMask;
lpDestStart = lpData->lpDestImage->bmBits + lpData->lprcDest->top * lpData->lpDestImage->bmWidthBytes + lpData->lprcDest->left;
// lpMaskStart = lpData->lpMaskImage->bmBits + lpData->lprcMask->top * lpData->lpMaskImage->bmWidthBytes + (lpData->lprcMask->left >> 3);
lpMaskStart = lpData->lpSrcImage->bmBits + lpData->lprcSrc->top * lpData->lpSrcImage->bmWidthBytes + (lpData->lprcSrc->left >> 3);
rows = lpData->lprcDest->bottom - lpData->lprcDest->top;
cols = lpData->lprcDest->right - lpData->lprcDest->left;
// shift = lpData->lprcMask->left & 0x07;
shift = lpData->lprcSrc->left & 0x07;
clFore = lpData->solidColor;
clBack = lpData->solidBkColor;
for( i = 0; i < rows; i++ )
{
lpDest = lpDestStart;
lpMask = lpMaskStart;
mask = *lpMask++;
bitMask = 0x80 >> shift;
for( j = 0; j < cols; j++ )
{
if( bitMask == 0 )
{
mask = *lpMask++;
bitMask = 0x80;
}
if( mask & bitMask )
{
*lpDest = clFore;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -