33 #include <boost/scoped_array.hpp>
43 using namespace libjmmcg;
54 register CFile file_t(BMPFile.c_str(),CFile::modeRead|CFile::shareDenyWrite);
55 return LoadBMP(file_t,hDIB,Pal);
60 BITMAPFILEHEADER bmfHeader;
62 if (file_t.Read(
reinterpret_cast<
char *>(&bmfHeader),
sizeof(BITMAPFILEHEADER)) !=
sizeof(BITMAPFILEHEADER)) {
66 if (bmfHeader.bfType!=bitmap_type_id) {
72 if (file_t.Read(
reinterpret_cast<
char *>(hDIB.Info()),bmfHeader.bfSize-
sizeof(BITMAPFILEHEADER))!=(bmfHeader.bfSize-
sizeof(BITMAPFILEHEADER))) {
75 register DWORD tmp=(hDIB.Info()->bmiHeader.biClrUsed ? hDIB.Info()->bmiHeader.biClrUsed : (1 << (hDIB.Info()->bmiHeader.biBitCount-1)));
77 Pal=std::auto_ptr<CPalette>();
80 Pal=std::auto_ptr<CPalette>(
new CPalette);
83 if ((nColors=
static_cast<WORD>(tmp))<=max_entries && nColors) {
84 const std::auto_ptr<BYTE> buff(
new BYTE[
sizeof(LOGPALETTE)+(
sizeof(PALETTEENTRY)*nColors)]);
85 register LOGPALETTE *
const pLP=
reinterpret_cast<LOGPALETTE *>(buff.get());
87 Pal=std::auto_ptr<CPalette>();
90 pLP->palVersion = current_version;
91 pLP->palNumEntries = nColors;
92 for (
register unsigned int i=0;i<nColors;++i) {
93 pLP->palPalEntry[i].peRed=hDIB.Info()->bmiColors[i].rgbRed;
94 pLP->palPalEntry[i].peGreen=hDIB.Info()->bmiColors[i].rgbGreen;
95 pLP->palPalEntry[i].peBlue=hDIB.Info()->bmiColors[i].rgbBlue;
96 pLP->palPalEntry[i].peFlags=0;
98 Pal->CreatePalette(pLP);
103 NTUtils::BitMapInfoWrapper
104 NTUtils::CreateBitmapInfoStruct(
const CBitmap &Bmp) {
107 if (!Bmp.GetObject(
sizeof(BITMAP),
reinterpret_cast<
void *>(&bmp))) {
109 return *
reinterpret_cast<NTUtils::BitMapInfoWrapper *>(NULL);
112 WORD cClrBits=
static_cast<WORD>(bmp.bmPlanes*bmp.bmBitsPixel);
115 }
else if (cClrBits<=4) {
117 }
else if (cClrBits<=8) {
119 }
else if (cClrBits<=16) {
121 }
else if (cClrBits<=24) {
131 BitMapInfoWrapper bmi;
133 BitMapInfoWrapper biw(
sizeof(RGBQUAD)*(2^cClrBits));
140 bmi.Info()->bmiHeader.biWidth=bmp.bmWidth;
141 bmi.Info()->bmiHeader.biHeight=bmp.bmHeight;
142 bmi.Info()->bmiHeader.biPlanes=bmp.bmPlanes;
143 bmi.Info()->bmiHeader.biBitCount=bmp.bmBitsPixel;
145 bmi.Info()->bmiHeader.biClrUsed=2^cClrBits;
151 bmi.Info()->bmiHeader.biSizeImage=(bmi.Info()->bmiHeader.biWidth+7)/8*bmi.Info()->bmiHeader.biHeight*cClrBits;
156 NTUtils::CreateBMPFile(
const tstring &pszFile,
const CBitmap &BMP,
const CDC &DC) {
157 register CFile file_t(pszFile.c_str(),CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite);
158 register bool ret=CreateBMPFile(file_t,BMP,DC);
164 NTUtils::CreateBMPFile(CFile &File,
const CBitmap &BMP,
const CDC &DC) {
165 BitMapInfoWrapper pbi(NTUtils::CreateBitmapInfoStruct(BMP));
166 const boost::scoped_array<BYTE> lpBits(
new BYTE[pbi.Header()->biSizeImage]);
172 if (!GetDIBits(DC.GetSafeHdc(),
static_cast<
const HBITMAP>(BMP),0,
static_cast<WORD>(pbi.Header()->biHeight),lpBits.get(),pbi.Info(),DIB_RGB_COLORS))
174 BITMAPFILEHEADER hdr;
175 hdr.bfType=bitmap_type_id;
177 hdr.bfSize=
static_cast<DWORD>(
sizeof(BITMAPFILEHEADER)+pbi.Header()->biSize+pbi.Header()->biClrUsed*
sizeof(RGBQUAD)+pbi.Header()->biSizeImage);
181 hdr.bfOffBits=
static_cast<DWORD>(
sizeof(BITMAPFILEHEADER))+pbi.Header()->biSize+pbi.Header()->biClrUsed*
sizeof(RGBQUAD);
183 File.Write(
reinterpret_cast<
const void *>(&hdr),
sizeof(BITMAPFILEHEADER));
185 File.Write(
reinterpret_cast<
const void *>(pbi.Header()),
sizeof(BITMAPINFOHEADER)+pbi.Header()->biClrUsed*
sizeof(RGBQUAD));
187 File.Write(
reinterpret_cast<
const void *>(lpBits.get()),
static_cast<
unsigned int>(pbi.Header()->biSizeImage));