1 #include "..\include\raMain.h" 5 unsigned char* raIBMP::LoadDIBitmap(
raString filename, BITMAPINFO **info)
11 BITMAPFILEHEADER header;
14 if ((fp = fopen(filename.c_str(),
"rb")) == NULL)
18 if (fread(&header,
sizeof(BITMAPFILEHEADER), 1, fp) < 1)
25 if (header.bfType !=
'MB')
32 infosize = header.bfOffBits -
sizeof(BITMAPFILEHEADER);
33 if ((*info = (BITMAPINFO *)malloc(infosize)) == NULL)
40 if (fread(*info, 1, infosize, fp) < infosize)
50 if ((bitsize = (*info)->bmiHeader.biSizeImage) == 0)
51 bitsize = ((*info)->bmiHeader.biWidth *
52 (*info)->bmiHeader.biBitCount + 7) / 8 *
53 abs((*info)->bmiHeader.biHeight);
55 if ((bits = (
unsigned char*)malloc(bitsize)) == NULL)
63 if (fread(bits, 1, bitsize, fp) < bitsize)
76 bool raIBMP::SaveDIBitmap(
raString filename, BITMAPINFO *info,
unsigned char* bits)
82 BITMAPFILEHEADER header;
85 if ((fp = fopen(filename.c_str(),
"wb")) == NULL)
89 if (info->bmiHeader.biSizeImage == 0)
90 bitsize = (info->bmiHeader.biWidth *
91 info->bmiHeader.biBitCount + 7) / 8 *
92 abs(info->bmiHeader.biHeight);
94 bitsize = info->bmiHeader.biSizeImage;
97 infosize =
sizeof(BITMAPINFOHEADER);
98 switch (info->bmiHeader.biCompression)
102 if (info->bmiHeader.biClrUsed == 0)
105 if (info->bmiHeader.biBitCount > 8 &&
106 info->bmiHeader.biClrUsed == 0)
110 if (info->bmiHeader.biClrUsed == 0)
111 infosize += (1 << info->bmiHeader.biBitCount) * 4;
113 infosize += info->bmiHeader.biClrUsed * 4;
117 size =
sizeof(BITMAPFILEHEADER) + infosize + bitsize;
120 header.bfType =
'MB';
121 header.bfSize = size;
122 header.bfReserved1 = 0;
123 header.bfReserved2 = 0;
124 header.bfOffBits =
sizeof(BITMAPFILEHEADER) + infosize;
126 if (fwrite(&header, 1,
sizeof(BITMAPFILEHEADER), fp) <
sizeof(BITMAPFILEHEADER))
133 if (fwrite(info, 1, infosize, fp) < infosize)
140 if (fwrite(bits, 1, bitsize, fp) < bitsize)