mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 12:47:16 +00:00
[GDI32]
- DIB data is not mandatory in CreateDIBitmap [WIN32K] - Simplify GreCreateDIBitmap - Surface data should be 16 bits aligned svn path=/branches/reactos-yarotows/; revision=47735
This commit is contained in:
parent
cc4ef59c16
commit
f57bcb3e25
3 changed files with 43 additions and 69 deletions
|
@ -461,8 +461,8 @@ CreateDIBitmap( HDC hDC,
|
|||
LONG width, height, compr, dibsize;
|
||||
WORD planes, bpp;
|
||||
// PDC_ATTR pDc_Attr;
|
||||
UINT InfoSize;
|
||||
UINT cjBmpScanSize;
|
||||
UINT InfoSize = 0;
|
||||
UINT cjBmpScanSize = 0;
|
||||
HBITMAP hBmp;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
|
||||
|
@ -477,6 +477,8 @@ CreateDIBitmap( HDC hDC,
|
|||
// For Icm support.
|
||||
// GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
|
||||
|
||||
if(Data)
|
||||
{
|
||||
_SEH2_TRY
|
||||
{
|
||||
cjBmpScanSize = DIB_BitmapBitsSize(Data);
|
||||
|
@ -488,6 +490,7 @@ CreateDIBitmap( HDC hDC,
|
|||
Status = _SEH2_GetExceptionCode();
|
||||
}
|
||||
_SEH2_END
|
||||
}
|
||||
|
||||
if(!NT_SUCCESS(Status))
|
||||
{
|
||||
|
|
|
@ -203,12 +203,12 @@ SURFACE_bSetBitmapBits(
|
|||
if (ulWidth)
|
||||
{
|
||||
/* Align the width (Windows compatibility) */
|
||||
ulWidth = ((((ulWidth << 3) / cBitsPixel) * cBitsPixel + 31) & ~31) >> 3;
|
||||
ulWidth = ((((ulWidth << 3) / cBitsPixel) * cBitsPixel + 15) & ~15) >> 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Calculate width from the bitmap width in pixels */
|
||||
ulWidth = ((pso->sizlBitmap.cx * cBitsPixel + 31) & ~31) >> 3;
|
||||
ulWidth = ((pso->sizlBitmap.cx * cBitsPixel + 15) & ~15) >> 3;
|
||||
}
|
||||
|
||||
/* Calculate the bitmap size in bytes */
|
||||
|
|
|
@ -1177,68 +1177,39 @@ GreCreateDIBitmapInternal(
|
|||
PDC Dc;
|
||||
HBITMAP Bmp;
|
||||
WORD bpp;
|
||||
HDC hdcDest;
|
||||
|
||||
if (!hDc) // CreateBitmap
|
||||
if (!hDc) /* 1bpp monochrome bitmap */
|
||||
{ // Should use System Bitmap DC hSystemBM, with CreateCompatibleDC for this.
|
||||
hDc = IntGdiCreateDC(NULL, NULL, NULL, NULL,FALSE);
|
||||
if (!hDc)
|
||||
hdcDest = IntGdiCreateDC(NULL, NULL, NULL, NULL,FALSE);
|
||||
if(!hdcDest)
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Dc = DC_LockDc(hDc);
|
||||
if (!Dc)
|
||||
{
|
||||
NtGdiDeleteObjectApp(hDc);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return NULL;
|
||||
}
|
||||
bpp = 1;
|
||||
Bmp = IntCreateDIBitmap(Dc, cx, cy, bpp, fInit, pjInit, pbmi, iUsage);
|
||||
|
||||
DC_UnlockDc(Dc);
|
||||
NtGdiDeleteObjectApp(hDc);
|
||||
}
|
||||
else // CreateCompatibleBitmap
|
||||
else
|
||||
{
|
||||
Dc = DC_LockDc(hDc);
|
||||
hdcDest = hDc;
|
||||
}
|
||||
|
||||
Dc = DC_LockDc(hdcDest);
|
||||
if (!Dc)
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return NULL;
|
||||
}
|
||||
/* pbmi == null
|
||||
First create an un-initialised bitmap. The depth of the bitmap
|
||||
should match that of the hdc and not that supplied in bmih.
|
||||
*/
|
||||
/* It's OK to set bpp=0 here, as IntCreateDIBitmap will create a compatible Bitmap
|
||||
* if bpp != 1 and ignore the real value that was passed */
|
||||
if (pbmi)
|
||||
bpp = pbmi->bmiHeader.bV5BitCount;
|
||||
else
|
||||
{
|
||||
if (Dc->dctype != DC_TYPE_MEMORY)
|
||||
bpp = Dc->ppdev->gdiinfo.cBitsPixel;
|
||||
else
|
||||
{
|
||||
DIBSECTION dibs;
|
||||
INT Count;
|
||||
SURFACE *psurf = Dc->dclevel.pSurface;
|
||||
Count = BITMAP_GetObject(psurf, sizeof(dibs), &dibs);
|
||||
if (!Count)
|
||||
bpp = 1;
|
||||
else
|
||||
{
|
||||
if (Count == sizeof(BITMAP))
|
||||
/* A device-dependent bitmap is selected in the DC */
|
||||
bpp = dibs.dsBm.bmBitsPixel;
|
||||
else
|
||||
/* A DIB section is selected in the DC */
|
||||
bpp = dibs.dsBmih.biBitCount;
|
||||
}
|
||||
}
|
||||
}
|
||||
bpp = 0;
|
||||
Bmp = IntCreateDIBitmap(Dc, cx, cy, bpp, fInit, pjInit, pbmi, iUsage);
|
||||
DC_UnlockDc(Dc);
|
||||
|
||||
if(!hDc)
|
||||
{
|
||||
NtGdiDeleteObjectApp(hdcDest);
|
||||
}
|
||||
return Bmp;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue