⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdidrv16b.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 3 页
字号:
                *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 + -