gdidrv32b.c

来自「深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心」· C语言 代码 · 共 937 行 · 第 1/2 页

C
937
字号
/******************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
******************************************************/


/*****************************************************
文件说明:图形设备驱动程序(32bit)
版本号:2.0.0
开发时期:2003
作者:李林
修改记录:

******************************************************/

#include <eframe.h>
#include <gwmeobj.h>

//#ifndef COLOR_32BPP
//#error not define COLOR_32BPP in file version.h
//#endif

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 _drvDisplay32BPP = {
    _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颜色值得到设备相关的颜色值
//引用: 
//	驱动程序接口函数
// *****************************************************************
static COLORREF _RealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat )
{	// 格式: 8 8 8
	if( lpcdwPal )
	{
		return _Gdi_RealizeColor( color, lpcdwPal, uPalNumber, uPalFormat );
	}
	else
	{
		BYTE r = ((BYTE)color) & 0xff;
		BYTE g = ((BYTE)(color >> 8)) & 0xff;
		BYTE b = ((BYTE)(color >> 16)) & 0xff;
		
		return (((DWORD)r) << 16) | (((DWORD)g) << 8) | b;
	}
}

// *****************************************************************
//声明:static COLORREF _UnrealizeColor( COLORREF color )
//参数:
//	IN color - 设备相关颜色值
//返回值:
//	设备无关颜色值
//功能描述:
//	由设备相关颜色值得到设备无关的RGB值
//引用: 
//	驱动程序接口函数
// *****************************************************************
static COLORREF _UnrealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat )
{
	if( lpcdwPal )
	{
		return _Gdi_UnrealizeColor( color, lpcdwPal, uPalNumber, uPalFormat );
	}
	else
	{
		DWORD r = (color >> 16) & 0xff;
		DWORD g = (color >> 8) & 0xff;
		DWORD b = (color) & 0xff;
		
		return RGB( r, g, b );
	}
}

// *****************************************************************
//声明:static COLORREF _PutPixel( _LPPIXELDATA lpPixelData )
//参数:
//	IN lpPixelData - _PIXELDATA结构指针,包含写点需要的数据
//返回值:
//	该点对应的颜色值
//功能描述:
//	在对应的xy点输出颜色值,并返回之前的值
//引用: 
//	驱动程序接口函数
// *****************************************************************
static COLORREF _PutPixel( _LPPIXELDATA lpPixelData )
{
    LPDWORD lpVideoAdr;
    COLORREF c;
	UINT rop;
	//是否需要真实输出 ?
	if( (rop = lpPixelData->rop) != R2_NOP )
	{	//需要输出
		//得到x 位置/地址
		lpVideoAdr = (LPDWORD)(lpPixelData->lpDestImage->bmBits + lpPixelData->y * lpPixelData->lpDestImage->bmWidthBytes) + lpPixelData->x;
		//得到当前/返回的颜色值
		c = *lpVideoAdr;		
		//根据操作模式做相关动作
		switch( rop )
		{
		case R2_COPYPEN:		//拷贝到目标
			*lpVideoAdr = (DWORD)lpPixelData->color;
			break;
		case R2_XORPEN:			//异或
			*lpVideoAdr ^= (DWORD)lpPixelData->color;
			break;
		case R2_NOT:			//非
			*lpVideoAdr = ~*lpVideoAdr;
			break;
		case R2_BLACK:			//黑
			*lpVideoAdr = 0;
			break;
		case R2_WHITE:			//白
			*lpVideoAdr = 0xffffff;//0xffffffffl;
			break;
		case R2_MASKPEN:   // dest = dest-pixel-color and pen-color
			*lpVideoAdr &= (DWORD)lpPixelData->color;
			break;
		case R2_MERGEPEN:  // dest = dest-pixel-color or pen-color
			*lpVideoAdr |= (DWORD)lpPixelData->color;
			break;
		case R2_MERGENOTPEN:
			*lpVideoAdr |= ~(DWORD)lpPixelData->color;
			break;
		case R2_NOTCOPYPEN:
			*lpVideoAdr = ~(DWORD)lpPixelData->color;
			break;
		case R2_NOTXORPEN:
			*lpVideoAdr = ~( *lpVideoAdr ^ (DWORD)lpPixelData->color );
			break;
		}
	}
	else
		c = -1;
    return c;
}

// *****************************************************************
//声明:static COLORREF _GetPixel( _LPPIXELDATA lpPixelData )
//参数:
//	IN lpPixelData - _PIXELDATA结构指针,包含该点需要的数据
//返回值:
//	该点对应的颜色值
//功能描述:
//	得到对应的xy点的颜色值
//引用: 
//	驱动程序接口函数
// *****************************************************************
static COLORREF _GetPixel( _LPPIXELDATA lpPixelData )
{
    return *((LPDWORD)(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 LPDWORD lpDest;
    register int sum, widthBytes;
    register DWORD color;
	//扫描行宽度(字节数)
    widthBytes = lpLineData->lpDestImage->bmWidthBytes;
	//目标地址
	lpDest = (LPDWORD)(lpLineData->lpDestImage->bmBits + y0 * widthBytes) + x0;
    color = (DWORD)lpLineData->color;
    
    sum = len;
	//正向或反向
	if( yDir < 0 )
        widthBytes = -widthBytes;	//反向
	//根据操作模式做不同的处理
    if( lpLineData->rop == R2_COPYPEN )
    {	//拷贝
        while( sum-- )
        {
            *lpDest = color;
            lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
        }
    }
    else if( lpLineData->rop == R2_NOT )
    {	//非
        while( sum-- )
        {
            *lpDest = ~*lpDest;
            lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
        }
    }
    else if( lpLineData->rop == R2_XORPEN )
    {	//异或
        while( sum-- )
        {
            *lpDest = *lpDest ^ color;
            lpDest = (LPDWORD)((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 LPDWORD lpDest;
    register int sum, widthBytes;
    DWORD clrFore, clrBack;
    BYTE pattern;
	//扫描行宽度(字节数)
    widthBytes = lpLineData->lpDestImage->bmWidthBytes;
	//目标地址
	lpDest = (LPDWORD)(lpLineData->lpDestImage->bmBits + y0 * widthBytes) + x0;
	//前景和背景颜色
    clrFore = (DWORD)lpLineData->color;
    clrBack = (DWORD)lpLineData->clrBack;

    pattern = lpLineData->pattern;
	sum = len;
	//正向或反向
	if( yDir < 0 )
		widthBytes = -widthBytes;	//反向
	//根据操作模式做不同的处理
    if( lpLineData->rop == R2_COPYPEN )
    {	//拷贝
        while( sum-- )
        {
            if( pattern & patternMask[y0&0x07] )
            {
                *lpDest = (DWORD)clrFore;
            }
            else
            {
                *lpDest = (DWORD)clrBack;
            }
            lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
            y0 += yDir;
        }
    }
    else if( lpLineData->rop == R2_XORPEN )
    {	//异或
        while( sum-- )
        {
            if( pattern & patternMask[y0&0x07] )
            {
                *lpDest ^= clrFore;
            }
            else
            {
                *lpDest ^= clrBack;
            }
            lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
            y0 += yDir;
        }
    }
    else if( lpLineData->rop == R2_NOT )
    {	//非
        while( sum-- )
        {
            *lpDest = ~*lpDest;
            lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
        }        
    }
    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 LPDWORD lpDest;
    register int sum, widthBytes;
    DWORD clrFore;
    BYTE pattern;
	//扫描行宽度(字节数)
    widthBytes = lpLineData->lpDestImage->bmWidthBytes;
	//目标地址
	lpDest = (LPDWORD)(lpLineData->lpDestImage->bmBits + y0 * widthBytes) + x0;
	
    clrFore = (DWORD)lpLineData->color;
    pattern = lpLineData->pattern;

    sum = len;
	//正向或反向
	if( yDir < 0 )
		widthBytes = -widthBytes;	//反向
	//根据操作模式做不同的处理
    if( lpLineData->rop == R2_COPYPEN )
    {	//拷贝
        while( sum-- )
        {
            if( pattern & patternMask[y0&0x07] )
                *lpDest = (DWORD)clrFore;
            lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
            y0 += yDir;
        }
    }
    else if( lpLineData->rop == R2_XORPEN )
    {	//异或
        while( sum-- )
        {
            if( pattern & patternMask[y0&0x07] )
                *lpDest ^= (DWORD)clrFore;
            lpDest = (LPDWORD)((LPBYTE)lpDest + widthBytes);
            y0 += yDir;
        }
    }
    else if( lpLineData->rop == R2_NOT )
    {	//非
        while( sum-- )
        {
            *lpDest = ~*lpDest;
            lpDest = (LPDWORD)((LPBYTE)lpDest + 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 LPDWORD lpDestStart;
    register DWORD color;
	//得到开始地址
	lpDestStart = (LPDWORD)(lpLineData->lpDestImage->bmBits + lpLineData->lpDestImage->bmWidthBytes * y0) + x0;

    color = (DWORD)lpLineData->color;
	//根据操作模式做不同的处理
    switch( lpLineData->rop )
    {
    case R2_COPYPEN:		//拷贝
		for( ; uLen; lpDestStart += xDir, uLen-- )
        {
            *lpDestStart = color;
        }
        break;
    case R2_XORPEN:			//异或
		for( ; uLen; lpDestStart += xDir, uLen-- )
            *lpDestStart ^= color;
        break;
    case R2_NOT:			//非
		for( ; uLen; lpDestStart += xDir, uLen-- )
            *lpDestStart = ~*lpDestStart;
        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 )
{

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?