📄 loadimg.c
字号:
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 + -