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

📄 gdidrv16b.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
******************************************************/


/*****************************************************
文件说明:图形设备驱动程序(16bit(1byte) / pixel )
版本号:2.0.0
开发时期:2000
作者:李林
修改记录:
     2.LN, 2003-07-16, 增加 MERGECOPY 和 MERGEPAINT
     1.LN 2003-05-06, Hatch brush有错误

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

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

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

//extern const _BITMAPDATA __displayBitmap;

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 _drvDisplay16BPP = {
    _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颜色值得到设备相关的颜色值
//	默认的设备相关的颜色格式: 16bits: BBBBB GGGGGG RRRRR 
//引用: 
//	
// *****************************************************************
static COLORREF _RealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat )
{  // r5 6g b5
	// bbbb bbbb gggg gggg rrrr rrrr ->
	// 0000 0000 rrrr rggg gggb bbbb

//    DWORD r = ( color << 8 ) & 0xf800;
  //  DWORD g = ( color >> 5) & 0x07e0;
    //DWORD b = ( color >> 19) & 0x001f;
	//return r | g | b;

	if( lpcdwPal )
	{
		return _Gdi_RealizeColor( color, lpcdwPal, uPalNumber, uPalFormat );
	}
	else
	{

		DWORD r;
		DWORD g;
		DWORD b;
		
		// 默认的颜色格式: 16bits: BBBBB GGGGGG RRRRR    . format to 5b 6g 5r
		r = ((color << 24) >> 16) & 0xf800;
		g = ((color << 16) >> 21) & 0x07e0;
		b = ((color << 8) >> 27) & 0x001f;
		return (b | g | r);
	}

/*  
	这代码将会导致 灰色失真(偏绿)
	DWORD r, g, b;

	r = ( (color & 0xff) * 0x1f / 0xff ) << 11;	
	g = ( ( (color >> 8 ) & 0xff) * 0x3f / 0xff ) << 5;
	b = ( ( (color >> 16 ) & 0xff) * 0x1f / 0xff );
	
	return r | g | b;
*/

}

// *****************************************************************
//声明:static COLORREF _UnrealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat )
//参数:
//	IN color - 设备相关颜色值
//返回值:
//	设备无关颜色值
//功能描述:
//	由设备相关颜色值得到设备无关的RGB值
//	默认的设备相关的颜色格式: 16bits: BBBBB GGGGGG RRRRR
//引用: 
//	
// *****************************************************************
static COLORREF _UnrealizeColor( DWORD color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat )
{
	// 1111 1111 rrrr rggg gggb bbbb ->
	// bbbb bbbb gggg gggg rrrr rrrr

	if( lpcdwPal )
	{
		return _Gdi_UnrealizeColor( color, lpcdwPal, uPalNumber, uPalFormat );
	}
	else
	{
		DWORD r = (color >> 11) & 0x1f;	
		DWORD g = (color >> 5) & 0x3f;
		DWORD b = (color & 0x1f);
		
		if( r == 0x1f )
			r = 0xff;
		if( g == 0x3f )
			g = 0xff;
		if( b == 0x1f )
			b = 0xff;    
		return (b << 19) | (g << 10) | r << 3;
	}
/*

	DWORD r = color & 0xf800;
    DWORD g = color & 0x07e0;
	DWORD b = color & 0x001f;

    r = ((r << 16) >> 24);
    g = ((g << 21) >> 16);
	b = ((b << 27) >> 8);
    return (b | g | r);
*/

  // r5 6g b5

/*  这代码将会导致 灰色失真(偏绿)
	DWORD r, g, b;

    r = ( (color & 0xf800) >> 11) * 0xff / 0x1f;
	g = ( ( (color & 0x07e0) >> 5) * 0xff / 0x3f ) << 8;
	b = ( ( (color & 0x001f)) * 0xff / 0x1f ) << 16;

	return r | g | b;
*/
}

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

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

    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;
            }
            else
            {
                *lpDest = (WORD)clrBack;
            }
            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 ^= clrFore;
            }
            else
            {
                *lpDest ^= clrBack;
            }
            lpDest = (LPWORD)((LPBYTE)lpDest + widthBytes);
            y0 += yDir;//dir;
        }
    }
	else if( rop == R2_NOTXORPEN )
	{
        while( sum-- )
        {
            if( pattern & patternMask[y0&0x07] )
            {
                *lpDest = ~( *lpDest ^ clrFore );
            }
            else
            {

⌨️ 快捷键说明

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