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

📄 loadimg.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 5 页
字号:
	ObjList_Delete( &lpCursorObjList, (ULONG)hOwner, _FreeIconCursor, 1 );
	LeaveCriticalSection( &csCursorObjList );
}

// **************************************************
// 声明:static int GetColorTableNum( BITMAPINFOHEADER * lpbih )
// 参数:
// 	IN lpbih - 得到颜色表项数
// 返回值:
//	假如成功,返回颜色表项数;否则,返回0
// 功能描述:
//	得到 BITMAPINFOHEADER 结构中包含的颜色表项数
// 引用: 
//	
// ************************************************

static int GetColorTableNum( BITMAPINFOHEADER * lpbih )
{
    int clrTableItemNum = 0;
    if( lpbih->biCompression == BI_BITFIELDS )
        clrTableItemNum = 3;
    switch ( lpbih->biBitCount)
    {
    case 1:		//单色 黑白
        if( lpbih->biClrUsed == 0 )
            clrTableItemNum += 2;
        else
            clrTableItemNum = lpbih->biClrUsed;
        break;
    case 2:		//4色
        if( lpbih->biClrUsed == 0 )
            clrTableItemNum += 4;
        else
            clrTableItemNum = lpbih->biClrUsed;
        break;
    case 4:		//16色
        if( lpbih->biClrUsed == 0 )
            clrTableItemNum += 16;
        else
            clrTableItemNum = lpbih->biClrUsed;
        break;
    case 8:		//256色
        if( lpbih->biClrUsed == 0 )
            clrTableItemNum += 256;
        else
            clrTableItemNum = lpbih->biClrUsed;
        break;
    case 16:		//65536色
        if( lpbih->biCompression == BI_RGB )
			clrTableItemNum = 0; //default
        else if( lpbih->biCompression == BI_BITFIELDS )
			clrTableItemNum = 3; // 3 dword mask of red, green, blue
        break;
    case 24:
        clrTableItemNum = lpbih->biClrUsed;
        break;
    case 32:
        clrTableItemNum += lpbih->biClrUsed;
    }
    return clrTableItemNum;
}

// **************************************************
// 声明:static int GetShiftValue( DWORD dwValue )
// 参数:
// 	IN dwValue - 值
// 返回值:
//	返回最高有效位
// 功能描述:
//	得到数值的最高有效位数,以便于以后的移位操作
// 引用: 
//	
// ************************************************

static int GetShiftValue( DWORD dwValue )
{
    int i;
	for( i = 0; dwValue; i++ )
		dwValue >>= 1;
	return 32-i;
}

// **************************************************
// 声明:static void _ConvertRGBQUADColorRGBColor( BITMAPINFO * lpbi )
// 参数:
// 	IN/OUT lpbi - BITMAPINFO 结构指针
// 返回值:
//	无
// 功能描述:
//	将 lpbi中的 RGBQUAD 颜色表格式转化为 RGB格式
// 引用: 
//	
// ************************************************

static void _ConvertRGBQUADColorRGBColor( BITMAPINFO * lpbi )
{
    RGBQUAD * lpquad = (RGBQUAD *)lpbi->bmiColors;
    COLORREF * lprgb = (COLORREF *)lpbi->bmiColors;
	//得到颜色表项数
    int n = GetColorTableNum( &lpbi->bmiHeader );
    if( lpbi->bmiHeader.biCompression == BI_BITFIELDS )
    {
        n -= 3;
        lpquad += 3;
        lprgb += 3;
    }
    while( n )
    {
        *lprgb = RGB( lpquad->rgbRed, lpquad->rgbGreen, lpquad->rgbBlue );
        lprgb++;
        lpquad++;
        n--;
    }
}

// **************************************************
// 声明:static void _ConvertRGBQUADColorToPalColor( BITMAPINFO * lpbi )
// 参数:
// 	IN/OUT lpbi - BITMAPINFO 结构指针
// 返回值:
//	无
// 功能描述:
//	将 lpbi中的 RGBQUAD 颜色表格式转化为 颜色表索引值
// 引用: 
//	
// ************************************************

static void _ConvertRGBQUADColorToPalColor( BITMAPINFO * lpbi )
{
    RGBQUAD * lpquad = (RGBQUAD *)lpbi->bmiColors;
	INT16 * lpPal = (INT16 *)lpbi->bmiColors;
	//得到颜色表项数
    int n = GetColorTableNum( &lpbi->bmiHeader );
    if( lpbi->bmiHeader.biCompression == BI_BITFIELDS )
    {
        n -= 3;
        lpquad += 3;
        lpPal += 6;
    }
    while( n )
    {	//得到设备相关的值
        *lpPal = (INT16)lpDrvDisplayDefault->lpRealizeColor( RGB( lpquad->rgbRed, lpquad->rgbGreen, lpquad->rgbBlue ), NULL, 0, 0 ); 
        lpPal++;
		lpquad++;
        n--;
    }
}

// **************************************************
// 声明:static void _ConvertMonoBitmap( 
//									_LPBITMAPDATA lpImage, 
//									DWORD dwStartScanLine, 
//									DWORD dwReadScanLine, 
//									DWORD dwScanLineWidth, 
//									LPBYTE lpbData, 
//									BITMAPINFO * lpbi, 
//									BOOL bInvert )
// 参数:
//	IN/OUT lpImage - 目标位图对象,将lpbData数据转化到该对象
//	IN dwStartScanLine - 开始扫描行
//	IN dwReadScanLine - 需要处理的扫描行
//	IN dwScanLineWidth - 扫描行字节数
//	IN lpbData - 包含位图数据的内存
//	IN lpbi - 描述 lpbData 数据信息的结构
//	IN bInvert - 是否反转位图数据
// 返回值:
//	无
// 功能描述:
//	将 lpbData 指向的数据拷贝到 lpImage里
// 引用: 
//	
// ************************************************

static void _ConvertMonoBitmap( _LPBITMAPDATA lpImage, 
                                DWORD dwStartScanLine, 
                                DWORD dwReadScanLine, 
                                DWORD dwScanLineWidth, 
                                LPBYTE lpbData, 
                                BITMAPINFO * lpbi, 
                                BOOL bInvert )
{	//是否相同的格式 ?
    if( lpbi->bmiHeader.biBitCount == 1 && 
        lpImage->bmBitsPixel == 1 )
    {	//是
        DWORD dwDestScanLineBytes = lpImage->bmWidthBytes;
		DWORD dwDestScanLineDwords = dwDestScanLineBytes >> 2;
		int iDestScanLineAddBytes = dwDestScanLineBytes;
        LPBYTE lpDest;

		if( lpbi->bmiHeader.biHeight > 0 )
		{	//位图数据为反向(由低到顶)
			lpDest = lpImage->bmBits + dwDestScanLineBytes * ( lpImage->bmHeight - dwStartScanLine - 1 );
			iDestScanLineAddBytes = -iDestScanLineAddBytes;
		}
		else
		{	//正向
			lpDest = lpImage->bmBits + dwDestScanLineBytes * dwStartScanLine;
		}
		
        for( ; dwReadScanLine; dwReadScanLine--, lpbData += dwScanLineWidth )
        {
			LPBYTE lps, lpd;
			int i = dwDestScanLineDwords;
			int iWriteBytes = 0;
			lpd = lpDest; lps = lpbData;
			//是否反转 ?
			if( bInvert )
			{	//反转  dest = ~source
				while( i-- )
				{
					*(LPDWORD)lpd = ~(*(LPDWORD)lps);
					( (LPDWORD)lpd )++; ( (LPDWORD)lps )++;
					iWriteBytes+=4;
				}
				while( iWriteBytes <  (int)dwDestScanLineBytes )
				{
					*lpd = ~(*lps);
					lpd++; lps++;
					iWriteBytes++;
				}
			}
			else
			{	//直接拷贝
				while( i-- )
				{
					//*(LPDWORD)lpd = ~(*(LPDWORD)lps); //2004-04-07 delete
					*(LPDWORD)lpd = (*(LPDWORD)lps);  //
					//
					( (LPDWORD)lpd )++; ( (LPDWORD)lps )++;
					iWriteBytes+=4;
				}
				while( iWriteBytes < (int)dwDestScanLineBytes )
				{
					*lpd = (*lps);
					lpd++; lps++;
					iWriteBytes++;
				}
			}
			//下一行
            lpDest += iDestScanLineAddBytes;
        }
    }
}

// **************************************************
// 声明:int _WinGdi_ConvertImageColorValue( 
//								    _LPCDISPLAYDRV lpDrv,
//								    _LPBITMAP_DIB lpDestImage,  // dest image data
//									LPCRECT lprcDestClip,
//									CONST BITMAPINFO * lpbi,// src image info
//									LPCRECT lprcSrcClip,
//								    DWORD dwStartScanLine,  // src start scan line
//                                  DWORD dwScanLineNum, 
//									DWORD dwScanLineWidth,
//                                  LPCBYTE lpbData,// src bitmap bits data
//								    int fuColorUse   // use src's RGB or PAL
//									)
// 参数:
//	IN lpDrv - 显示驱动程序接口
//	IN lpDestImage - 用于接受位图数据的目标位图对象
//	IN lprcDestClip - 在目标上的裁剪矩形
//	IN lpbi - 包含源位图信息的结构指针
//	IN lprcSrcClip - 在源位图上的裁剪矩形
//	IN dwStartScanLine - 源位图数据的开始,  // src start scan line
//  IN dwScanLineNum, 
//	IN dwScanLineWidth,
//  IN lpbData,// src bitmap bits data
//	IN fuColorUse   // use src's RGB or PAL
// 返回值:
//	假如成功,返回实际操作的行数;否则,返回0
// 功能描述:
//	将位图由一钟格式转化到另一种格式
// 引用: 
//	
// ************************************************

int _WinGdi_ConvertImageColorValue( 
								    _LPCDISPLAYDRV lpDrv,
								    _LPBITMAP_DIB lpDestImage,  // dest image data
									LPCRECT lprcDestClip,
									CONST BITMAPINFO * lpbi,// src image info
									LPCRECT lprcSrcClip,
								    DWORD dwStartScanLine,  // src start scan line
                                    DWORD dwScanLineNum, 
                                    DWORD dwScanLineWidth,
                                    LPCBYTE lpbData,// src bitmap bits data
								    int fuColorUse   // use src's RGB or PAL
									)
{
	DWORD dwReadScanLine;
    _PIXELDATA pixelData;
	LPBYTE lpbDestStart;
	int    iDestWidthBytes;
	int    iSrcDir;
	int    iDestDir;
	int    yDestDir;

	int xDestStart;
	int yDestStart;
	int xDestWidth;

	int xSrcStart;
	int xOffset, yOffset;
	RECT rcSrcClip, rcDestClip; 

	ASSERT( lpDrv );

    //检查目标方向
	if( lpDestImage->bitmap.bmFlags & BF_DIB )
	{ // dest is dib format
		iDestDir = lpDestImage->biDir;
	}
	else
		iDestDir = 1;
	//检查源方向
	if( lpbi->bmiHeader.biHeight < 0 )
		iSrcDir = 1;
	else
		iSrcDir = -1;
	//是否做裁剪工作 ?
	if( lprcDestClip || lprcSrcClip )
	{  // 是do clip 
		//检查源裁剪面的合法性
		//得到源位图矩形
		rcSrcClip.left = 0;
		rcSrcClip.right = lpbi->bmiHeader.biWidth;
		if( iSrcDir > 0 )
		{   // top - >bottom			
			rcSrcClip.top = -lpbi->bmiHeader.biHeight - dwStartScanLine - dwScanLineNum;
		}
		else
		{  // bottom - >top
			rcSrcClip.top = lpbi->bmiHeader.biHeight - dwStartScanLine - dwScanLineNum;
		}
		rcSrcClip.bottom = rcSrcClip.top + dwScanLineNum;

		if( lprcSrcClip )
		{	//源位图矩形与源裁剪矩形相交
		    if( IntersectRect( &rcSrcClip, &rcSrcClip, lprcSrcClip ) == FALSE )
				return 0;
			xOffset = rcSrcClip.left - lprcSrcClip->left;
			yOffset = rcSrcClip.top - lprcSrcClip->top;
        }
		else
		{
			xOffset = 0;
		    yOffset = rcSrcClip.top;
		}
		//检查目标裁剪面的合法性
		if( lprcDestClip )
		{	//将目标设备坐标系转换到源坐标系
		    rcDestClip.left = lprcDestClip->left + xOffset; 
		    rcDestClip.top = lprcDestClip->top + yOffset;
		    rcDestClip.right = rcDestClip.left + (rcSrcClip.right-rcSrcClip.left);
            rcDestClip.bottom = rcDestClip.top + (rcSrcClip.bottom-rcSrcClip.top);
			//得到在源的有效矩形
		    if( IntersectRect( &rcDestClip, &rcDestClip, lprcDestClip ) == FALSE )
				return 0;
		}
		else
		{	//将目标设备坐标系转换到源坐标系
		    rcDestClip.left = xOffset;
		    rcDestClip.top = yOffset;
		    rcDestClip.right = rcDestClip.left + (rcSrcClip.right-rcSrcClip.left);
            rcDestClip.bottom = rcDestClip.top + (rcSrcClip.bottom-rcSrcClip.top);
		}
	}
	else
	{   //目标和源的长宽和原点是相同的 the dest and source's width and height and origin is same
		rcDestClip.left = rcSrcClip.left = 0;
		rcDestClip.right = rcSrcClip.right = lpDestImage->bitmap.bmWidth;
		if( iSrcDir < 0 )
		{
			rcDestClip.top = rcSrcClip.top = lpbi->bmiHeader.biHeight - dwStartScanLine - dwScanLineNum;
		}
		else
		{
			rcDestClip.top = rcSrcClip.top = -lpbi->bmiHeader.biHeight - dwStartScanLine - dwScanLineNum;
		}
	    rcDestClip.bottom = rcSrcClip.bottom = rcDestClip.top + dwScanLineNum;
	}
	//
	dwScanLineNum = rcDestClip.bottom - rcDestClip.top;
	xDestStart = rcDestClip.left;
	xDestWidth = rcDestClip.right - xDestStart;
    xSrcStart = rcSrcClip.left;

	if( iDestDir > 0 )
	{	//目标是正向
		if( iSrcDir < 0 )
		{	//源是反向 b->u
			yDestStart = rcDestClip.bottom-1;//dwScanLineNum;//-1;
			lpbDestStart = lpDestImage->bitmap.bmBits + yDestStart * lpDestImage->bitmap.bmWidthBytes;
		    iDestWidthBytes = -lpDestImage->bitmap.bmWidthBytes;    
			yDestDir = -1; 		
		}
		else
		{	//源是正向
			yDestStart = rcDestClip.top;
			lpbDestStart = lpDestImage->bitmap.bmBits + yDestStart * lpDestImage->bitmap.bmWidthBytes;
		    iDestWidthBytes = lpDestImage->bitmap.bmWidthBytes;    

⌨️ 快捷键说明

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