// --- static LPBITMAPINFOHEADER GetBitmapInfo( HANDLE hDIB ) { LPBITMAPINFOHEADER pdibInfo = NULL; pdibInfo = (LPBITMAPINFOHEADER)hDIB; FixBitmapInfo( pdibInfo ); return pdibInfo; }
/* ReadDibBitmapInfo() * * Will read a file in DIB format and return a global HANDLE to its * BITMAPINFO. This function will work with both "old" and "new" * bitmap formats, but will always return a "new" BITMAPINFO. */ bool CxImageBMP::DibReadBitmapInfo(CxFile* fh, BITMAPINFOHEADER *pdib) { if ((fh==NULL)||(pdib==NULL)) return false; if (fh->Read(pdib,sizeof(BITMAPINFOHEADER),1)==0) return false; BITMAPCOREHEADER bc; switch (pdib->biSize) // what type of bitmap info is this? { case sizeof(BITMAPINFOHEADER): break; case 64: //sizeof(OS2_BMP_HEADER): fh->Seek((long)(64 - sizeof(BITMAPINFOHEADER)),SEEK_CUR); break; case sizeof(BITMAPCOREHEADER): bc = *(BITMAPCOREHEADER*)pdib; pdib->biSize = bc.bcSize; pdib->biWidth = (DWORD)bc.bcWidth; pdib->biHeight = (DWORD)bc.bcHeight; pdib->biPlanes = bc.bcPlanes; pdib->biBitCount = bc.bcBitCount; pdib->biCompression = BI_RGB; pdib->biSizeImage = 0; pdib->biXPelsPerMeter = 0; pdib->biYPelsPerMeter = 0; pdib->biClrUsed = 0; pdib->biClrImportant = 0; fh->Seek((long)(sizeof(BITMAPCOREHEADER)-sizeof(BITMAPINFOHEADER)), SEEK_CUR); break; default: //give a last chance if (pdib->biSize>(sizeof(BITMAPINFOHEADER))&& (pdib->biSizeImage==(unsigned long)(pdib->biHeight*((((pdib->biBitCount*pdib->biWidth)+31)/32)*4)))&& (pdib->biPlanes==1)&&(pdib->biCompression==BI_RGB)&&(pdib->biClrUsed==0)) { fh->Seek((long)(pdib->biSize - sizeof(BITMAPINFOHEADER)),SEEK_CUR); break; } return false; } FixBitmapInfo(pdib); return true; }
/* ReadDibBitmapInfo() * * Will read a file in DIB format and return a global HANDLE to its * BITMAPINFO. This function will work with both "old" and "new" * bitmap formats, but will always return a "new" BITMAPINFO. */ bool CxImageBMP::DibReadBitmapInfo(CxFile* fh, BITMAPINFOHEADER *pdib) { if ((fh==NULL)||(pdib==NULL)) return false; if (fh->Read(pdib,sizeof(BITMAPINFOHEADER),1)==0) return false; BITMAPCOREHEADER bc; switch (pdib->biSize) // what type of bitmap info is this? { case sizeof(BITMAPINFOHEADER): break; case sizeof(BITMAPCOREHEADER): bc = *(BITMAPCOREHEADER*)pdib; pdib->biSize = bc.bcSize; pdib->biWidth = (DWORD)bc.bcWidth; pdib->biHeight = (DWORD)bc.bcHeight; pdib->biPlanes = bc.bcPlanes; pdib->biBitCount = bc.bcBitCount; pdib->biCompression = BI_RGB; pdib->biSizeImage = 0; pdib->biXPelsPerMeter = 0; pdib->biYPelsPerMeter = 0; pdib->biClrUsed = 0; pdib->biClrImportant = 0; fh->Seek((long)sizeof(BITMAPCOREHEADER)-(long)sizeof(BITMAPINFOHEADER),SEEK_CUR); break; default: return false; } FixBitmapInfo(pdib); return true; }