16bits
void *bitBuf;
if(bmpDc==NULL)
{
bmpDc=CreateCompatibleDC(hdc);
}
if(hBmp!=NULL)
{
DeleteObject(hBmp);
hBmp=NULL;
}
bmpWid=(pngDecoder.wid+3)&(~3);
bmpHei=pngDecoder.hei;
// bmiHeader.biSize=sizeof(bmiHeader);
// bmiHeader.biWidth=bmpWid;
// bmiHeader.biHeight=-bmpHei;
// bmiHeader.biPlanes=1;
// bmiHeader.biBitCount=16;
// bmiHeader.biCompression=BI_BITFIELDS;
// bmiHeader.biSizeImage=(((((16/8)*bmpWid)+3)/4)*4)*abs(bmpHei);
//
// bmiHeader.biXPelsPerMeter=2048;
// bmiHeader.biYPelsPerMeter=2048;
// bmiHeader.biClrUsed=0;
// bmiHeader.biClrImportant=0;
//
// hBmp=CreateDIBSection(bmpDc,(BITMAPINFO *)&bmiHeader,DIB_RGB_COLORS,&bitBuf,NULL,0);
BITMAPINFO *m_info;
long bits = 16;
long len = (((((bits/8)*bmpWid)+3)/4)*4)*abs(bmpHei);
long size = len + sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*3;
m_info = (BITMAPINFO*)new BYTE[size];
::ZeroMemory(m_info,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*3);
m_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*3;
m_info->bmiHeader.biWidth = LONG(bmpWid);
m_info->bmiHeader.biHeight = -LONG(bmpHei);
m_info->bmiHeader.biBitCount = 16;
m_info->bmiHeader.biPlanes = 1;
m_info->bmiHeader.biCompression = BI_BITFIELDS;
m_info->bmiHeader.biSizeImage = len;
*((DWORD*)(m_info->bmiColors)) = 0xf800;
*((DWORD*)(m_info->bmiColors)+1) = 0x07e0;
*((DWORD*)(m_info->bmiColors)+2) = 0x001f;
// bitBuf = (LPBYTE)(m_info->bmiColors+3);
long m_PixelWidth = ((((m_info->bmiHeader.biWidth*m_info->bmiHeader.biBitCount/8)+3)/4)*4);
//m_PixelWidth = ((((m_info->bmiHeader.biWidth*m_info->bmiHeader.biBitCount/8)+3)/4)*4);
hBmp=CreateDIBSection(bmpDc,m_info,DIB_RGB_COLORS,&bitBuf,NULL,0);
// int x,y;
unsigned char *buf;
buf=(unsigned char *)bitBuf;
// for(y=0; y<bmpHei; y++)
// {
// for(x=0; x<bmpWid; x++)
// {
// const unsigned char *rgba;
// if(x<pngDecoder.wid)
// {
// rgba=pngDecoder.rgba+(y*pngDecoder.wid+x)*4;
// }
// else
// {
// rgba=pngDecoder.rgba+(y*pngDecoder.wid+pngDecoder.wid-1)*4;
// }
// //buf[(y*bmpWid+x)*3 ]=rgba[2];
// //buf[(y*bmpWid+x)*3+1]=rgba[1];
// //buf[(y*bmpWid+x)*3+2]=rgba[0];
// buf[(y*bmpWid+x)*2+1] = (rgba[0]>>3)&0x1f|0xe0&(rgba[1]<<3);
// buf[(y*bmpWid+x)*2] = (rgba[1]>>5)&0x7|(rgba[2])&0xf8;
// }
// }
int alpha;
int ialpha;
const unsigned char *rgba;
rgba = pngDecoder.rgba;
for(long i = 0;i<bmpHei*bmpWid;i++)
{
alpha = *(rgba+3);
unsigned char buffer[3];
buf[0] = 0x1f;
// buf[1] = 0xf8;
buf[1] = 0x00;
ialpha = 256 - alpha;
// if( alpha )
{
buffer[0] = (buf[0]&0x1f)<<3 ;
buffer[1] = ((buf[0]>>5)+((buf[1]<<5)))<<2;
buffer[2] = (buf[1]>>3)<<3 ;
buffer[0] = ((*(rgba+2))*alpha+buffer[0]*ialpha)>>8;
buffer[1] = ((*(rgba+1))*alpha+buffer[1]*ialpha)>>8;
buffer[2] = ((*(rgba))*alpha+buffer[2]*ialpha)>>8;
// buffer[0] = (*(rgba+2));
// buffer[1] = (*(rgba+1));
// buffer[2] = (*(rgba));
buf[0] = (buffer[0]>>3)&0x1f|0xe0&(buffer[1]<<3);
buf[1] = (buffer[1]>>5)&0x7|(buffer[2])&0xf8;
}
buf += 2;
rgba += 4;
}
if(bmpDc!=NULL && hBmp!=NULL)
{
HBITMAP hBmpSave;
hBmpSave=(HBITMAP)SelectObject(bmpDc,hBmp);
BitBlt(hdc,pRect->left,pRect->top,pRect->right,pRect->bottom,bmpDc,0,0,SRCCOPY);
SelectObject(bmpDc,hBmpSave);
}
}
24bits
BITMAPINFOHEADER bmiHeader;
void *bitBuf;
if(bmpDc==NULL)
{
bmpDc=CreateCompatibleDC(hdc);
}
if(hBmp!=NULL)
{
DeleteObject(hBmp);
hBmp=NULL;
}
bmpWid=(pngDecoder.wid+3)&(~3);
bmpHei=pngDecoder.hei;
bmiHeader.biSize=sizeof(bmiHeader);
bmiHeader.biWidth=bmpWid;
bmiHeader.biHeight=-bmpHei;
bmiHeader.biPlanes=1;
bmiHeader.biBitCount=24;
bmiHeader.biCompression=BI_RGB;
bmiHeader.biSizeImage=0;
bmiHeader.biXPelsPerMeter=2048;
bmiHeader.biYPelsPerMeter=2048;
bmiHeader.biClrUsed=0;
bmiHeader.biClrImportant=0;
hBmp=CreateDIBSection(bmpDc,(BITMAPINFO *)&bmiHeader,DIB_RGB_COLORS,&bitBuf,NULL,0);
int x,y;
unsigned char *buf;
buf=(unsigned char *)bitBuf;
for(y=0; y<bmpHei; y++)
{
for(x=0; x<bmpWid; x++)
{
const unsigned char *rgba;
if(x<pngDecoder.wid)
{
rgba=pngDecoder.rgba+(y*pngDecoder.wid+x)*4;
}
else
{
rgba=pngDecoder.rgba+(y*pngDecoder.wid+pngDecoder.wid-1)*4;
}
buf[(y*bmpWid+x)*3 ]=rgba[2];
buf[(y*bmpWid+x)*3+1]=rgba[1];
buf[(y*bmpWid+x)*3+2]=rgba[0];
}
}
//InvalidateRect(hWnd,NULL,FALSE);
//hdc=GetDC(hWnd);
if(bmpDc!=NULL && hBmp!=NULL)
{
HBITMAP hBmpSave;
//RECT rect;
int x,y;
hBmpSave=(HBITMAP)SelectObject(bmpDc,hBmp);
//GetClientRect(hWnd,pRect);
for(y=pRect->top; y<pRect->bottom; y+=bmpHei)
{
for(x=pRect->left; x<pRect->right; x+=bmpWid)
{
BitBlt(hdc,x,y,pRect->right,pRect->bottom,bmpDc,0,0,SRCCOPY);
}
}
SelectObject(bmpDc,hBmpSave);
}
}