* 11/16/1999 (RJJ) lifted from wine
*/
-INT FASTCALL DIB_BitmapInfoSize(const BITMAPINFO * info, WORD coloruse)
+INT FASTCALL DIB_BitmapInfoSize(const BITMAPINFO * info, WORD coloruse, BOOL max)
{
unsigned int colors, size, masks = 0;
}
else /* assume BITMAPINFOHEADER */
{
- colors = info->bmiHeader.biClrUsed;
+ colors = max ? 1 << info->bmiHeader.biBitCount : info->bmiHeader.biClrUsed;
if (colors > 256) colors = 256;
if (!colors && (info->bmiHeader.biBitCount <= 8))
colors = 1 << info->bmiHeader.biBitCount;
}
cjBmpScanSize = DIB_BitmapMaxBitsSize(lpbmi, cScanLines);
- cjInfoSize = DIB_BitmapInfoSize(lpbmi, uUsage);
+ /* Caller must provide maximum size possible */
+ cjInfoSize = DIB_BitmapInfoSize(lpbmi, uUsage, TRUE);
if ( lpvBits )
{
_SEH2_TRY
{
/* Probe and copy the BITMAPINFO */
- ProbeForWrite(pbmiUser, cjMaxInfo, 1);
+ ProbeForRead(pbmiUser, cjMaxInfo, 1);
RtlCopyMemory(pbmi, pbmiUser, cjMaxInfo);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
/* Use SEH to copy back to user mode */
_SEH2_TRY
{
- /* Buffer is already probed, copy the data back */
+ /* Copy the data back */
+ ProbeForWrite(pbmiUser, cjMaxInfo, 1);
RtlCopyMemory(pbmiUser, pbmi, cjMaxInfo);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
HBITMAP res = 0;
SURFACE *bmp = NULL;
void *mapBits = NULL;
- PPALETTE ppalDIB;
+ PPALETTE ppalDIB = NULL;
// Fill BITMAP32 structure with DIB data
CONST BITMAPINFOHEADER *bi = &bmi->bmiHeader;
/* Create a palette for the DIB */
ppalDIB = CreateDIBPalette(bmi, dc, usage);
- if (ppalDIB)
- {
- SURFACE_vSetPalette(bmp, ppalDIB);
- PALETTE_ShareUnlockPalette(ppalDIB);
- }
// Clean up in case of errors
cleanup:
- if (!res || !bmp || !bm.bmBits)
+ if (!res || !bmp || !bm.bmBits || !ppalDIB)
{
DPRINT("Got an error res=%p, bmp=%p, bm.bmBits=%p\n", res, bmp, bm.bmBits);
if (bm.bmBits)
}
if (bmp)
+ {
+ SURFACE_ShareUnlockSurface(bmp);
bmp = NULL;
+ }
if (res)
{
GreDeleteObject(res);
res = 0;
}
+
+ if(ppalDIB)
+ {
+ PALETTE_ShareUnlockPalette(ppalDIB);
+ }
}
if (bmp)
{
+ /* If we're here, everything went fine */
+ SURFACE_vSetPalette(bmp, ppalDIB);
+ PALETTE_ShareUnlockPalette(ppalDIB);
SURFACE_ShareUnlockSurface(bmp);
}