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

📄 gdidrv1b.c

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