📄 gdidrv1b.c
字号:
while( sum-- )
{
if( pattern & patternMask[y0&0x07] )
*lpVideoAdr |= xbit;
lpVideoAdr += widthBytes;
y0 += yDir;//dir;
}
}
else
{
while( sum-- )
{
if( pattern & patternMask[y0&0x07] )
*lpVideoAdr &= ixbit;
lpVideoAdr += widthBytes;
y0 += yDir;//dir;
}
}
}
else if( lpLineData->rop == R2_XORPEN )
{
if( clrFore )
{
while( sum-- )
{
if( pattern & patternMask[y0&0x07] )
*lpVideoAdr ^= xbit;
lpVideoAdr += widthBytes;
y0 += yDir;//dir;
}
}
}
else if( lpLineData->rop == R2_NOT )
{
while( sum-- )
{
*lpVideoAdr ^= xbit;
lpVideoAdr += 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 LPBYTE lpVideoAdrStart, lpVideoAdrEnd;
register int x1, y;//, dir;
register BYTE color;
register BYTE xbitStart;
register BYTE xbitEnd;
if( xDir > 0 )
{
x1 = x0 + uLen;
xbitStart = leftFillMask[x0 & 0x07];
xbitEnd = rightFillMask[x1 & 0x07];
x1--;
}
else
{
x1 = x0 - uLen + 1;
xbitStart = rightFillMask[( x0 + 1 ) & 0x07];
xbitEnd = leftFillMask[x1 & 0x07];
}
y = y0;
y *= lpLineData->lpDestImage->bmWidthBytes;
//在显存的开始地址
lpVideoAdrStart = lpLineData->lpDestImage->bmBits + y + (x0 >> 3);
//在显存的结束地址
lpVideoAdrEnd = lpLineData->lpDestImage->bmBits + y + (x1 >> 3);
if( lpLineData->color )
color = 0xff;
else
color = 0;
if( lpVideoAdrStart == lpVideoAdrEnd )
{ //开始点和结束点在同一个地址
xbitStart &= xbitEnd;
switch( lpLineData->rop )
{
case R2_COPYPEN:
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( color & xbitStart );
break;
case R2_XORPEN:
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( (*lpVideoAdrStart ^ color) & xbitStart );
break;
case R2_NOT:
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( ~*lpVideoAdrStart & xbitStart );
break;
}
}
else
{ //开始点和结束点在不同地址
// draw start byte
switch( lpLineData->rop )
{
case R2_COPYPEN:
//画开始地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | (color & xbitStart );
lpVideoAdrStart += xDir;//dir;
//画中间的点
for( ; lpVideoAdrStart != lpVideoAdrEnd; lpVideoAdrStart+= xDir )
*lpVideoAdrStart = color;
//画结束地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitEnd) | ( color & xbitEnd );
break;
case R2_XORPEN:
//画开始地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( (*lpVideoAdrStart ^ color) & xbitStart );
lpVideoAdrStart += xDir;
//画中间的点
for( ; lpVideoAdrStart != lpVideoAdrEnd; lpVideoAdrStart+=xDir )
*lpVideoAdrStart = (*lpVideoAdrStart ^ color);
//画结束地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitEnd) | ( (*lpVideoAdrStart ^ color) & xbitEnd );
break;
case R2_NOT:
//画开始地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( ~*lpVideoAdrStart & xbitStart );
lpVideoAdrStart+=xDir;
//画中间的点
for( ; lpVideoAdrStart != lpVideoAdrEnd; lpVideoAdrStart+=xDir )
*lpVideoAdrStart = ~*lpVideoAdrStart;
//画结束地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitEnd) | ( ~*lpVideoAdrStart & xbitEnd );
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 LPBYTE lpVideoAdrStart, lpVideoAdrEnd;
register int x1, y;//, dir;
register WORD color, clrFore, clrBack;
register BYTE xbitStart;
register BYTE xbitEnd;
if( xDir > 0 )
{
x1 = x0 + uLen;
xbitStart = leftFillMask[x0 & 0x07];
xbitEnd = rightFillMask[x1 & 0x07];
x1--;
}
else
{
x1 = x0 - uLen + 1;
xbitStart = rightFillMask[(x0+1) & 0x07];
xbitEnd = leftFillMask[x1 & 0x07];
}
y = y0;
y *= lpLineData->lpDestImage->bmWidthBytes;
//在显存的开始地址
lpVideoAdrStart = lpLineData->lpDestImage->bmBits + y + (x0 >> 3);
//在显存的结束地址
lpVideoAdrEnd = lpLineData->lpDestImage->bmBits + y + (x1 >> 3);
if( lpLineData->color )
clrFore = 0xffff;
else
clrFore = 0;
if( lpLineData->clrBack )
clrBack = 0xffff;
else
clrBack = 0;
color = (clrFore & lpLineData->pattern) | (clrBack & ~lpLineData->pattern );
if( lpVideoAdrStart == lpVideoAdrEnd )
{ //开始点和结束点在同一个地址
xbitStart &= xbitEnd;
switch( lpLineData->rop )
{
case R2_COPYPEN:
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( color & xbitStart );
break;
case R2_XORPEN:
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( (*lpVideoAdrStart ^ color) & xbitStart );
break;
case R2_NOT:
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( ~*lpVideoAdrStart & xbitStart );
break;
}
}
else
{ // //开始点和结束点在不同地址 draw start byte
switch( lpLineData->rop )
{
case R2_COPYPEN:
//画开始地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | (color & xbitStart );
//画中间的点
lpVideoAdrStart+=xDir;
for( ; lpVideoAdrStart != lpVideoAdrEnd; lpVideoAdrStart+=xDir )
*lpVideoAdrStart = (BYTE)color;
//画结束地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitEnd) | ( color & xbitEnd );
break;
case R2_XORPEN:
//画开始地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( (*lpVideoAdrStart ^ color) & xbitStart );
//画中间的点
lpVideoAdrStart+=xDir;
for( ; lpVideoAdrStart != lpVideoAdrEnd; lpVideoAdrStart+=xDir )
*lpVideoAdrStart = (*lpVideoAdrStart ^ color);
//画结束地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitEnd) | ( (*lpVideoAdrStart ^ color) & xbitEnd );
break;
case R2_NOT:
//画开始地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( ~*lpVideoAdrStart & xbitStart );
//画中间的点
lpVideoAdrStart+=xDir;
for( ; lpVideoAdrStart != lpVideoAdrEnd; lpVideoAdrStart+=xDir )
*lpVideoAdrStart = ~*lpVideoAdrStart;
//画结束地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitEnd) | ( ~*lpVideoAdrStart & xbitEnd );
break;
}
}
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 )
{
LPBYTE lpVideoAdrStart, lpVideoAdrEnd;
int x1, y;//, dir;
WORD color;
BYTE xbitStart;
BYTE xbitEnd;
register BYTE pattern;
if( xDir > 0 )
{
x1 = x0 + uLen;
xbitStart = leftFillMask[x0 & 0x07];
xbitEnd = rightFillMask[x1 & 0x07];
x1--;
}
else
{
x1 = x0 - uLen + 1;
xbitStart = rightFillMask[(x0+1) & 0x07];
xbitEnd = leftFillMask[x1 & 0x07];
}
y = y0;
y *= lpLineData->lpDestImage->bmWidthBytes;
//在显存的开始地址
lpVideoAdrStart = lpLineData->lpDestImage->bmBits + y + (x0 >> 3);
//在显存的结束地址
lpVideoAdrEnd = lpLineData->lpDestImage->bmBits + y + (x1 >> 3);
pattern = lpLineData->pattern;
if( lpLineData->color )
color = 0xffff;
else
color = 0;
color = (color & pattern);
if( lpVideoAdrStart == lpVideoAdrEnd )
{ //开始点和结束点在同一个地址
xbitStart &= xbitEnd;
switch( lpLineData->rop )
{
case R2_COPYPEN:
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( color & xbitStart );
break;
case R2_XORPEN:
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( (*lpVideoAdrStart ^ color) & xbitStart );
break;
case R2_NOT:
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( ~*lpVideoAdrStart & xbitStart );
break;
}
}
else
{ //开始点和结束点在不同地址// draw start byte
switch( lpLineData->rop )
{
case R2_COPYPEN:
//画开始地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | (color & xbitStart );
//画中间的点
lpVideoAdrStart+=xDir;
for( ; lpVideoAdrStart != lpVideoAdrEnd; lpVideoAdrStart+=xDir )
*lpVideoAdrStart = (*lpVideoAdrStart & ~pattern) | color;
//画结束地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitEnd) | ( color & xbitEnd );
break;
case R2_XORPEN:
//画开始地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( (*lpVideoAdrStart ^ color) & xbitStart );
//画中间的点
lpVideoAdrStart+=xDir;
for( ; lpVideoAdrStart != lpVideoAdrEnd; lpVideoAdrStart+=xDir )
*lpVideoAdrStart = (*lpVideoAdrStart & ~pattern) | ( (*lpVideoAdrStart ^ color) & pattern );
//画结束地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitEnd) | ( (*lpVideoAdrStart ^ color) & xbitEnd );
break;
case R2_NOT:
//画开始地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitStart) | ( ~*lpVideoAdrStart & xbitStart );
//画中间的点
lpVideoAdrStart+=xDir;
for( ; lpVideoAdrStart != lpVideoAdrEnd; lpVideoAdrStart+=xDir )
*lpVideoAdrStart = (*lpVideoAdrStart & ~pattern) | (~*lpVideoAdrStart & pattern);
//画结束地址的点
*lpVideoAdrStart = (*lpVideoAdrStart & ~xbitEnd) | ( ~*lpVideoAdrStart & xbitEnd );
break;
}
}
return TRUE;
}
#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, int 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--;
}
}
}
// *****************************************************************
//声明:static BOOL __TextSolidBitBlt( _LPBLKBITBLT lpData )
//参数:
// IN lpData - _BLKBITBLT结构指针
//返回值:
// 返回TRUE
//功能描述:
// 用纯色输出文本
//引用:
//
// *****************************************************************
static BOOL __TextSolidBitBlt( _LPBLKBITBLT lpData )
{
LPBYTE lpDestStart, lpDst;
LPCBYTE lpMaskStart, lpStart;
WORD clFore, clBack, color;
WORD maskValue, lMask, rMask, rightMask, destBytes, maskBytes;
int i, j, n, rows, maskShift, dstShift, shift;
BYTE mask;
//目标地址
lpDestStart = lpData->lpDestImage->bmBits + lpData->lprcDest->top * lpData->lpDestImage->bmWidthBytes + (lpData->lprcDest->left >> 3);
//位模开始位置
lpMaskStart = lpData->lpSrcImage->bmBits + lpData->lprcSrc->top * lpData->lpSrcImage->bmWidthBytes + (lpData->lprcSrc->left >> 3);
i = lpData->lprcDest->right - lpData->lprcDest->left;
mask = (lpData->lprcSrc->left + i) & 0x07;
if ( mask )
rightMask = (WORD)(0xffffff00l >> mask);
else
rightMask = (WORD)0xffffffffl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -