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

📄 haibmp.c

📁 HGui4.1.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -