mirror of
https://github.com/reactos/reactos.git
synced 2025-01-07 14:51:00 +00:00
[GDI32]
- ConvertBitmapInfo returns value of the cjInfoSize variable. We should not ignore this value. Checks are added - The call of CalculateColorTableSize is not necessary, its value was already returned by ConvertBitmapInfo. * Fixes 9 tests for gdi32_apitest CreateDIBitmap svn path=/trunk/; revision=72534
This commit is contained in:
parent
9598f87c7c
commit
dff1c73022
1 changed files with 61 additions and 41 deletions
|
@ -403,13 +403,11 @@ CreateDIBitmap(
|
|||
const BITMAPINFO *Data,
|
||||
UINT ColorUse)
|
||||
{
|
||||
LONG width, height, compr, dibsize;
|
||||
WORD planes, bpp;
|
||||
LONG Width, Height, Compression, DibSize;
|
||||
WORD Planes, BitsPerPixel;
|
||||
// PDC_ATTR pDc_Attr;
|
||||
UINT InfoSize = 0;
|
||||
UINT cjBmpScanSize = 0;
|
||||
HBITMAP hBmp = NULL;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
HBITMAP hBitmap = NULL;
|
||||
PBITMAPINFO pbmiConverted;
|
||||
UINT cjInfoSize;
|
||||
|
||||
|
@ -419,6 +417,22 @@ CreateDIBitmap(
|
|||
/* Check for CBM_CREATDIB */
|
||||
if (Init & CBM_CREATDIB)
|
||||
{
|
||||
if (cjInfoSize == 0)
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
else if (Init & CBM_INIT)
|
||||
{
|
||||
if (Bits == NULL)
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Bits = NULL;
|
||||
}
|
||||
|
||||
/* CBM_CREATDIB needs Data. */
|
||||
if (pbmiConverted == NULL)
|
||||
{
|
||||
|
@ -437,6 +451,23 @@ CreateDIBitmap(
|
|||
/* Use the header from the data */
|
||||
Header = &Data->bmiHeader;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Init & CBM_INIT)
|
||||
{
|
||||
if (Bits != NULL)
|
||||
{
|
||||
if (cjInfoSize == 0)
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Init &= ~CBM_INIT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Header is required */
|
||||
if (!Header)
|
||||
|
@ -447,7 +478,7 @@ CreateDIBitmap(
|
|||
}
|
||||
|
||||
/* Get the bitmap format and dimensions */
|
||||
if (DIB_GetBitmapInfo(Header, &width, &height, &planes, &bpp, &compr, &dibsize) == -1)
|
||||
if (DIB_GetBitmapInfo(Header, &Width, &Height, &Planes, &BitsPerPixel, &Compression, &DibSize) == -1)
|
||||
{
|
||||
DPRINT1("DIB_GetBitmapInfo failed!\n");
|
||||
GdiSetLastError(ERROR_INVALID_PARAMETER);
|
||||
|
@ -455,16 +486,16 @@ CreateDIBitmap(
|
|||
}
|
||||
|
||||
/* Check if the Compr is incompatible */
|
||||
if ((compr == BI_JPEG) || (compr == BI_PNG) || (compr == BI_BITFIELDS))
|
||||
if ((Compression == BI_JPEG) || (Compression == BI_PNG) || (Compression == BI_BITFIELDS))
|
||||
{
|
||||
DPRINT1("invalid compr: %lu!\n", compr);
|
||||
DPRINT1("Invalid compression: %lu!\n", Compression);
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
/* Only DIB_RGB_COLORS (0), DIB_PAL_COLORS (1) and 2 are valid. */
|
||||
if (ColorUse > DIB_PAL_COLORS + 1)
|
||||
{
|
||||
DPRINT1("invalid compr: %lu!\n", compr);
|
||||
DPRINT1("Invalid compression: %lu!\n", Compression);
|
||||
GdiSetLastError(ERROR_INVALID_PARAMETER);
|
||||
goto Exit;
|
||||
}
|
||||
|
@ -478,60 +509,49 @@ CreateDIBitmap(
|
|||
}
|
||||
|
||||
/* Negative width is not allowed */
|
||||
if (width < 0)
|
||||
if (Width < 0)
|
||||
{
|
||||
DPRINT1("Negative width: %li\n", width);
|
||||
DPRINT1("Negative width: %li\n", Width);
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
/* Top-down DIBs have a negative height. */
|
||||
height = abs(height);
|
||||
Height = abs(Height);
|
||||
|
||||
// For Icm support.
|
||||
// GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
|
||||
|
||||
if (pbmiConverted)
|
||||
cjBmpScanSize = GdiGetBitmapBitsSize(pbmiConverted);
|
||||
|
||||
DPRINT("pBMI %p, Size bpp %u, dibsize %d, Conv %u, BSS %u\n",
|
||||
Data, BitsPerPixel, DibSize, cjInfoSize, cjBmpScanSize);
|
||||
|
||||
if (!Width || !Height)
|
||||
{
|
||||
_SEH2_TRY
|
||||
{
|
||||
cjBmpScanSize = GdiGetBitmapBitsSize(pbmiConverted);
|
||||
CalculateColorTableSize(&pbmiConverted->bmiHeader, &ColorUse, &InfoSize);
|
||||
InfoSize += pbmiConverted->bmiHeader.biSize;
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
Status = _SEH2_GetExceptionCode();
|
||||
}
|
||||
_SEH2_END
|
||||
hBitmap = GetStockObject(DEFAULT_BITMAP);
|
||||
}
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Got an exception!\n");
|
||||
GdiSetLastError(ERROR_INVALID_PARAMETER);
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
DPRINT("pBMI %p, Size bpp %u, dibsize %d, Conv %u, BSS %u\n", Data, bpp, dibsize, InfoSize,
|
||||
cjBmpScanSize);
|
||||
|
||||
if (!width || !height)
|
||||
hBmp = GetStockObject(DEFAULT_BITMAP);
|
||||
else
|
||||
{
|
||||
hBmp = NtGdiCreateDIBitmapInternal(hDC, width, height, Init, (LPBYTE)Bits,
|
||||
(LPBITMAPINFO)pbmiConverted, ColorUse, InfoSize, cjBmpScanSize, 0, 0);
|
||||
hBitmap = NtGdiCreateDIBitmapInternal(hDC,
|
||||
Width,
|
||||
Height,
|
||||
Init,
|
||||
(LPBYTE)Bits,
|
||||
(LPBITMAPINFO)pbmiConverted,
|
||||
ColorUse,
|
||||
cjInfoSize,
|
||||
cjBmpScanSize,
|
||||
0, 0);
|
||||
}
|
||||
|
||||
Exit:
|
||||
|
||||
/* Cleanup converted BITMAPINFO */
|
||||
if ((pbmiConverted != NULL) && (pbmiConverted != Data))
|
||||
{
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, pbmiConverted);
|
||||
}
|
||||
|
||||
return hBmp;
|
||||
return hBitmap;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue