📄 haibmp.c
字号:
pbih->biWidth = HAI_MAKEDWORD(pBmpData+4);
pbih->biHeight = HAI_MAKEDWORD(pBmpData+8);
pbih->biPlanes = HAI_MAKEWORD(pBmpData+12);
pbih->biBitCount = HAI_MAKEWORD(pBmpData+14);
pbih->biCompression = HAI_MAKEDWORD(pBmpData+16);
pbih->biSizeImage = HAI_MAKEDWORD(pBmpData+20);
pbih->biXPelsPerMeter = HAI_MAKEDWORD(pBmpData+24);
pbih->biYPelsPerMeter = HAI_MAKEDWORD(pBmpData+28);
pbih->biClrUsed = HAI_MAKEDWORD(pBmpData+32);
pbih->biClrImportant = HAI_MAKEDWORD(pBmpData+36);
break;
case 0x0C: //sizeof(BITMAPCOREHEADER):
bc.bcSize = HAI_MAKEDWORD(pBmpData+0);
bc.bcWidth = HAI_MAKEWORD(pBmpData+4);
bc.bcHeight = HAI_MAKEWORD(pBmpData+6);
bc.bcPlanes = HAI_MAKEWORD(pBmpData+8);
bc.bcBitCount = HAI_MAKEWORD(pBmpData+10);
pbih->biSize = bc.bcSize;
pbih->biWidth = (S_DWORD)bc.bcWidth;
pbih->biHeight = (S_DWORD)bc.bcHeight;
pbih->biPlanes = bc.bcPlanes;
pbih->biBitCount = bc.bcBitCount;
pbih->biCompression = BI_RGB;
pbih->biSizeImage = 0;
pbih->biXPelsPerMeter = 0;
pbih->biYPelsPerMeter = 0;
pbih->biClrUsed = 0;
pbih->biClrImportant = 0;
break;
default:
pbih->biSize = 0;
break;
}
FixBitmapInfo(pbih);
return pbih->biSize;
}
S_WORD _hai_ExtractBits841BI_RGB(_SP_BITMAP pBmp, BITMAPINFOHEADER *pbih, S_BYTE *pBmpData, RGBQUAD *pPalette, S_BOOL bTopDownDib)
{
S_BYTE c, *pDst, *pSrc;
S_WORD i, j;
S_WORD WidthBytes = BITMAP_WIDTHBYTES(pbih->biWidth, pbih->biBitCount);
switch (pbih->biBitCount)
{
case 8:
for (i = 0; i < pbih->biHeight; i++)
{
pDst = ((S_BYTE*)pBmp->lpImage)+i*pBmp->WidthBytes;
if (bTopDownDib)
pSrc = pBmpData+i*WidthBytes;
else
pSrc = pBmpData+(pbih->biHeight-i-1)*WidthBytes;
j = (pbih->biWidth+7)>>3;
switch (pbih->biWidth % 8)
{
case 0:do{c=*pSrc++;*pDst++=pPalette[c].rgbRed;*pDst++=pPalette[c].rgbGreen;*pDst++=pPalette[c].rgbBlue;
case 7: c=*pSrc++;*pDst++=pPalette[c].rgbRed;*pDst++=pPalette[c].rgbGreen;*pDst++=pPalette[c].rgbBlue;
case 6: c=*pSrc++;*pDst++=pPalette[c].rgbRed;*pDst++=pPalette[c].rgbGreen;*pDst++=pPalette[c].rgbBlue;
case 5: c=*pSrc++;*pDst++=pPalette[c].rgbRed;*pDst++=pPalette[c].rgbGreen;*pDst++=pPalette[c].rgbBlue;
case 4: c=*pSrc++;*pDst++=pPalette[c].rgbRed;*pDst++=pPalette[c].rgbGreen;*pDst++=pPalette[c].rgbBlue;
case 3: c=*pSrc++;*pDst++=pPalette[c].rgbRed;*pDst++=pPalette[c].rgbGreen;*pDst++=pPalette[c].rgbBlue;
case 2: c=*pSrc++;*pDst++=pPalette[c].rgbRed;*pDst++=pPalette[c].rgbGreen;*pDst++=pPalette[c].rgbBlue;
case 1: c=*pSrc++;*pDst++=pPalette[c].rgbRed;*pDst++=pPalette[c].rgbGreen;*pDst++=pPalette[c].rgbBlue;
}while (--j);
}
}
break;
case 4:
for (i = 0; i < pbih->biHeight; i++)
{
pDst = ((S_BYTE*)pBmp->lpImage)+i*pBmp->WidthBytes;
if (bTopDownDib)
pSrc = pBmpData+i*WidthBytes;
else
pSrc = pBmpData+(pbih->biHeight-i-1)*WidthBytes;
j = (S_WORD)pbih->biWidth;
while (j >= 2){
j -= 2;
c = *pSrc++;
*pDst++ = pPalette[(c>>4)&0X0F].rgbRed;
*pDst++ = pPalette[(c>>4)&0X0F].rgbGreen;
*pDst++ = pPalette[(c>>4)&0X0F].rgbBlue;
*pDst++ = pPalette[c&0X0F].rgbRed;
*pDst++ = pPalette[c&0X0F].rgbGreen;
*pDst++ = pPalette[c&0X0F].rgbBlue;
}
if (j == 1){
c = *pSrc++;
*pDst++ = pPalette[(c>>4)&0X0F].rgbRed;
*pDst++ = pPalette[(c>>4)&0X0F].rgbGreen;
*pDst++ = pPalette[(c>>4)&0X0F].rgbBlue;
}
}
break;
case 1:
for (i = 0; i < pbih->biHeight; i++)
{
pDst = ((S_BYTE*)pBmp->lpImage)+i*pBmp->WidthBytes;
if (bTopDownDib)
pSrc = pBmpData+i*WidthBytes;
else
pSrc = pBmpData+(pbih->biHeight-i-1)*WidthBytes;
j = (S_WORD)pbih->biWidth;
while (j >= 8){
j -= 8;
c = *pSrc++;
*pDst++ = pPalette[(c>>7)&0X01].rgbRed;*pDst++ = pPalette[(c>>7)&0X01].rgbGreen;*pDst++ = pPalette[(c>>7)&0X01].rgbBlue;
*pDst++ = pPalette[(c>>6)&0X01].rgbRed;*pDst++ = pPalette[(c>>6)&0X01].rgbGreen;*pDst++ = pPalette[(c>>6)&0X01].rgbBlue;
*pDst++ = pPalette[(c>>5)&0X01].rgbRed;*pDst++ = pPalette[(c>>5)&0X01].rgbGreen;*pDst++ = pPalette[(c>>5)&0X01].rgbBlue;
*pDst++ = pPalette[(c>>4)&0X01].rgbRed;*pDst++ = pPalette[(c>>4)&0X01].rgbGreen;*pDst++ = pPalette[(c>>4)&0X01].rgbBlue;
*pDst++ = pPalette[(c>>3)&0X01].rgbRed;*pDst++ = pPalette[(c>>3)&0X01].rgbGreen;*pDst++ = pPalette[(c>>3)&0X01].rgbBlue;
*pDst++ = pPalette[(c>>2)&0X01].rgbRed;*pDst++ = pPalette[(c>>2)&0X01].rgbGreen;*pDst++ = pPalette[(c>>2)&0X01].rgbBlue;
*pDst++ = pPalette[(c>>1)&0X01].rgbRed;*pDst++ = pPalette[(c>>1)&0X01].rgbGreen;*pDst++ = pPalette[(c>>1)&0X01].rgbBlue;
*pDst++ = pPalette[(c>>0)&0X01].rgbRed;*pDst++ = pPalette[(c>>0)&0X01].rgbGreen;*pDst++ = pPalette[(c>>0)&0X01].rgbBlue;
}
if (j)
{
S_SHORT w = (S_SHORT)j;
c = *pSrc++;
{*pDst++ = pPalette[(c>>7)&0X01].rgbRed;*pDst++ = pPalette[(c>>7)&0X01].rgbGreen;*pDst++ = pPalette[(c>>7)&0X01].rgbBlue;}
if (--w > 0)
{*pDst++ = pPalette[(c>>6)&0X01].rgbRed;*pDst++ = pPalette[(c>>6)&0X01].rgbGreen;*pDst++ = pPalette[(c>>6)&0X01].rgbBlue;}
if (--w > 0)
{*pDst++ = pPalette[(c>>5)&0X01].rgbRed;*pDst++ = pPalette[(c>>5)&0X01].rgbGreen;*pDst++ = pPalette[(c>>5)&0X01].rgbBlue;}
if (--w > 0)
{*pDst++ = pPalette[(c>>4)&0X01].rgbRed;*pDst++ = pPalette[(c>>4)&0X01].rgbGreen;*pDst++ = pPalette[(c>>4)&0X01].rgbBlue;}
if (--w > 0)
{*pDst++ = pPalette[(c>>3)&0X01].rgbRed;*pDst++ = pPalette[(c>>3)&0X01].rgbGreen;*pDst++ = pPalette[(c>>3)&0X01].rgbBlue;}
if (--w > 0)
{*pDst++ = pPalette[(c>>2)&0X01].rgbRed;*pDst++ = pPalette[(c>>2)&0X01].rgbGreen;*pDst++ = pPalette[(c>>2)&0X01].rgbBlue;}
if (--w > 0)
{*pDst++ = pPalette[(c>>1)&0X01].rgbRed;*pDst++ = pPalette[(c>>1)&0X01].rgbGreen;*pDst++ = pPalette[(c>>1)&0X01].rgbBlue;}
if (--w > 0)
{*pDst++ = pPalette[(c>>0)&0X01].rgbRed;*pDst++ = pPalette[(c>>0)&0X01].rgbGreen;*pDst++ = pPalette[(c>>0)&0X01].rgbBlue;}
}
}
break;
default:
return S_FALSE;
break;
}
return S_TRUE;
}
S_WORD _hai_ExtractBits841BI_RLE4(_SP_BITMAP pBmp, S_BYTE *pBmpData, RGBQUAD *pPalette, S_BOOL bTopDownDib)
{
S_BOOL bContinue = S_TRUE;
S_BYTE StatusByte = 0;
S_BYTE SecondByte = 0;
S_WORD i, bits = 0;
S_DWORD ScanLine = 0;
S_BYTE *pDst;
while (bContinue == S_TRUE)
{
StatusByte = *pBmpData++;
switch (StatusByte) {
case RLE_COMMAND :
StatusByte = *pBmpData++;
switch (StatusByte) {
case RLE_ENDOFLINE :
bits = 0;
ScanLine++;
break;
case RLE_ENDOFBITMAP :
bContinue = S_FALSE;
break;
case RLE_DELTA :
bits += *pBmpData++;
ScanLine+= *pBmpData++;
break;
default :
if (bTopDownDib)
pDst = (S_BYTE*)pBmp->lpImage + ScanLine*pBmp->WidthBytes + bits*3;
else
pDst = (S_BYTE*)pBmp->lpImage + (pBmp->height-ScanLine-1)*pBmp->WidthBytes + bits*3;
bits += StatusByte;
for (i = 0; i < StatusByte; i++, pBmpData++) {
*pDst++ = pPalette[*pBmpData>>4].rgbRed;
*pDst++ = pPalette[*pBmpData>>4].rgbGreen;
*pDst++ = pPalette[*pBmpData>>4].rgbBlue;
if (++i >= StatusByte)
{
pBmpData++;
break;
}
*pDst++ = pPalette[*pBmpData&0xF].rgbRed;
*pDst++ = pPalette[*pBmpData&0xF].rgbGreen;
*pDst++ = pPalette[*pBmpData&0xF].rgbBlue;
}
// in absolute mode, each run must be aligned on a word boundary.
if (((StatusByte+1)>>1)&1)
pBmpData++;
break;
};
break;
default :
if (bTopDownDib)
pDst = (S_BYTE*)pBmp->lpImage + ScanLine*pBmp->WidthBytes + bits*3;
else
pDst = (S_BYTE*)pBmp->lpImage + (pBmp->height-ScanLine-1)*pBmp->WidthBytes + bits*3;
SecondByte = *pBmpData++;
bits += StatusByte;
for (i = 0; i < StatusByte; i++) {
*pDst++ = pPalette[SecondByte>>4].rgbRed;
*pDst++ = pPalette[SecondByte>>4].rgbGreen;
*pDst++ = pPalette[SecondByte>>4].rgbBlue;
if (++i >= StatusByte)
{
pBmpData++;
break;
}
*pDst++ = pPalette[SecondByte&0x0F].rgbRed;
*pDst++ = pPalette[SecondByte&0x0F].rgbGreen;
*pDst++ = pPalette[SecondByte&0x0F].rgbBlue;
}
break;
};
}
return S_TRUE;
}
S_WORD _hai_ExtractBits841BI_RLE8(_SP_BITMAP pBmp, S_BYTE *pBmpData, RGBQUAD *pPalette, S_BOOL bTopDownDib)
{
S_BOOL bContinue = S_TRUE;
S_BYTE StatusByte = 0;
S_BYTE SecondByte = 0;
S_WORD i, bits = 0;
S_DWORD ScanLine = 0;
S_BYTE *pDst = (S_BYTE*)pBmp->lpImage;
while (bContinue == S_TRUE)
{
StatusByte = *pBmpData++;
switch (StatusByte) {
case RLE_COMMAND :
StatusByte = *pBmpData++;
switch (StatusByte) {
case RLE_ENDOFLINE :
bits = 0;
ScanLine++;
break;
case RLE_ENDOFBITMAP :
bContinue=S_FALSE;
break;
case RLE_DELTA :
bits += *pBmpData++;
ScanLine += *pBmpData++;
break;
default :
if (bTopDownDib)
pDst = (S_BYTE*)pBmp->lpImage + pBmp->WidthBytes*ScanLine + bits*3;
else
pDst = (S_BYTE*)pBmp->lpImage + pBmp->WidthBytes*(pBmp->height-ScanLine-1) + bits*3;
for (i = 0; i < StatusByte; i++,pBmpData++)
{
*pDst++ = pPalette[*pBmpData].rgbRed;
*pDst++ = pPalette[*pBmpData].rgbGreen;
*pDst++ = pPalette[*pBmpData].rgbBlue;
}
// in absolute mode, each run must be aligned on a word boundary.
if ((StatusByte & 1) == 1)
pBmpData++;
bits += StatusByte;
break;
};
break;
default :
if (bTopDownDib)
pDst = (S_BYTE*)pBmp->lpImage + pBmp->WidthBytes*ScanLine + bits*3;
else
pDst = (S_BYTE*)pBmp->lpImage + pBmp->WidthBytes*(pBmp->height-ScanLine-1) + bits*3;
SecondByte = *pBmpData++;
bits += StatusByte;
for (i = 0; i < StatusByte; i++) {
*pDst++ = pPalette[SecondByte].rgbRed;
*pDst++ = pPalette[SecondByte].rgbGreen;
*pDst++ = pPalette[SecondByte].rgbBlue;
}
break;
};
}
return S_TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -