43#include "allheaders.h"
50#define BYTESPERLINE(Width, BPP) ((l_int32)((((DWORD)(Width) * (DWORD)(BPP) + 31) >> 5)) << 2)
67DSImageBitsSize(LPBITMAPINFO pbmi)
69 switch(pbmi->bmiHeader.biCompression)
74 return pbmi->bmiHeader.biSizeImage;
79 return BYTESPERLINE(pbmi->bmiHeader.biWidth, \
80 pbmi->bmiHeader.biBitCount * pbmi->bmiHeader.biPlanes) *
81 pbmi->bmiHeader.biHeight;
99ImageBitsSize(HBITMAP hBitmap)
103 GetObject(hBitmap,
sizeof(DIBSECTION), &ds);
104 switch( ds.dsBmih.biCompression )
109 return ds.dsBmih.biSizeImage;
114 return BYTESPERLINE(ds.dsBmih.biWidth, \
115 ds.dsBmih.biBitCount * ds.dsBmih.biPlanes) *
128setColormap(LPBITMAPINFO pbmi,
131l_int32 i, nColors, rval, gval, bval;
133 nColors = pixcmapGetCount(cmap);
134 for (i = 0; i < nColors; i++) {
135 pixcmapGetColor(cmap, i, &rval, &gval, &bval);
136 pbmi->bmiColors[i].rgbRed = rval;
137 pbmi->bmiColors[i].rgbGreen = gval;
138 pbmi->bmiColors[i].rgbBlue = bval;
139 pbmi->bmiColors[i].rgbReserved = 0;
141 pbmi->bmiHeader.biClrUsed = nColors;
164DSCreateBitmapInfo(l_int32 width,
173 nInfoSize =
sizeof(BITMAPINFOHEADER);
175 nInfoSize +=
sizeof(RGBQUAD) * (1 << depth);
176 if((depth == 16) || (depth == 32))
177 nInfoSize += (3 *
sizeof(DWORD));
181 pbmi = (LPBITMAPINFO)malloc(nInfoSize);
185 ZeroMemory(pbmi, nInfoSize);
186 pbmi->bmiHeader.biSize =
sizeof(BITMAPINFOHEADER);
187 pbmi->bmiHeader.biWidth = width;
188 pbmi->bmiHeader.biHeight = height;
189 pbmi->bmiHeader.biPlanes = 1;
190 pbmi->bmiHeader.biBitCount = depth;
193 pbmi->bmiHeader.biCompression = BI_RGB;
196 pbmi->bmiHeader.biSizeImage = DSImageBitsSize(pbmi);
198 pbmi->bmiHeader.biXPelsPerMeter = 0;
199 pbmi->bmiHeader.biYPelsPerMeter = 0;
200 pbmi->bmiHeader.biClrUsed = 0;
201 pbmi->bmiHeader.biClrImportant = 0;
212 pMasks = (LPDWORD)(pbmi->bmiColors);
213 pMasks[0] = 0x00007c00;
214 pMasks[1] = 0x000003e0;
215 pMasks[2] = 0x0000001f;
216 pbmi->bmiHeader.biCompression = BI_BITFIELDS;
221 pMasks = (LPDWORD)(pbmi->bmiColors);
225 pMasks[0] = 0xff000000;
226 pMasks[1] = 0x00ff0000;
227 pMasks[2] = 0x0000ff00;
229 pbmi->bmiHeader.biCompression = BI_BITFIELDS;
234 setColormap(pbmi, cmap);
259DSCreateDIBSection(l_int32 width,
270 pbmi = DSCreateBitmapInfo (width, height, depth, cmap);
274 hRefDC = GetDC(NULL);
275 hBitmap = CreateDIBSection(hRefDC, pbmi, DIB_RGB_COLORS,
276 (
void **) &pBits, NULL, 0);
277 nInfoSize = GetLastError();
278 ReleaseDC(NULL, hRefDC);
299pixGetWindowsHBITMAP(
PIX *pix)
301l_int32 width, height, depth;
303HBITMAP hBitmap = NULL;
310 return (HBITMAP)ERROR_PTR(
"pix not defined", __func__, NULL);
312 pixGetDimensions(pix, &width, &height, &depth);
313 cmap = pixGetColormap(pix);
315 if (depth == 24) depth = 32;
317 pixt = pixConvert2To8(pix, 0, 85, 170, 255, TRUE);
319 return (HBITMAP)ERROR_PTR(
"unable to convert pix from 2bpp to 8bpp",
321 depth = pixGetDepth(pixt);
322 cmap = pixGetColormap(pixt);
327 cmap = pixcmapCreateLinear(depth, 1<<depth);
330 hBitmap = DSCreateDIBSection(width, height, depth, cmap);
332 return (HBITMAP)ERROR_PTR(
"Unable to create HBITMAP", __func__, NULL);
336 pixt = pixFlipTB(pixt, pixt);
338 pixt = pixFlipTB(NULL, pix);
342 pixInvert(pixt, pixt);
347 pixEndianByteSwap(pixt);
349 GetObject (hBitmap,
sizeof(BITMAP), &bm);
350 imageBitsSize = ImageBitsSize(hBitmap);
351 data = pixGetData(pixt);
353 memcpy (bm.bmBits, data, imageBitsSize);
355 DeleteObject (hBitmap);