From: Jérôme Gardou Date: Mon, 2 Aug 2010 14:45:51 +0000 (+0000) Subject: [WIN32K] X-Git-Tag: backups/reactos-yarotows@57446~40 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=501947714e2ec2f08cb186a7989222a2d2e9e87f;hp=0bba315d06fa64dc42580cef59d8a25792a89079 [WIN32K] - Use correct offset in UserLoadImage, create the bitmap using display DC. - BITMAP_GetObject : Report BI_BITFIELDS compression when we should. - Use a 0 compatible DC when none is given in NtGdiCreateDIBitmapInternal. This fixes some wine tests. Enjoy. svn path=/branches/reactos-yarotows/; revision=48415 --- diff --git a/subsystems/win32/win32k/misc/file.c b/subsystems/win32/win32k/misc/file.c index 87df7d3915e..856de99015d 100644 --- a/subsystems/win32/win32k/misc/file.c +++ b/subsystems/win32/win32k/misc/file.c @@ -149,10 +149,6 @@ W32kMapViewOfSection( return pvBase; } -// FIXME: this should go to dibobj.c - - - HBITMAP NTAPI UserLoadImage(PCWSTR pwszName) @@ -213,8 +209,9 @@ UserLoadImage(PCWSTR pwszName) { /* Could be BITMAPCOREINFO */ BITMAPINFO* pConvertedInfo; + HDC hdc; - pvBits = (PVOID)((PCHAR)pbmi + pbmfh->bfOffBits); + pvBits = (PVOID)((PCHAR)pbmfh + pbmfh->bfOffBits); pConvertedInfo = DIB_ConvertBitmapInfo(pbmi, DIB_RGB_COLORS); if(!pConvertedInfo) @@ -223,19 +220,19 @@ UserLoadImage(PCWSTR pwszName) goto leave; } - // FIXME: use Gre... so that the BITMAPINFO doesn't get probed - hbmp = NtGdiCreateDIBitmapInternal(NULL, - pConvertedInfo->bmiHeader.biWidth, - pConvertedInfo->bmiHeader.biHeight, - CBM_INIT, - pvBits, - pbmi, - DIB_RGB_COLORS, - pConvertedInfo->bmiHeader.biSize, - pConvertedInfo->bmiHeader.biSizeImage, - 0, - 0); + hdc = IntGdiCreateDC(NULL, NULL, NULL, NULL,FALSE); + + hbmp = GreCreateDIBitmapInternal(hdc, + pConvertedInfo->bmiHeader.biWidth, + pConvertedInfo->bmiHeader.biHeight, + CBM_INIT, + pvBits, + pConvertedInfo, + DIB_RGB_COLORS, + 0, + 0); + NtGdiDeleteObjectApp(hdc); DIB_FreeConvertedBitmapInfo(pConvertedInfo, pbmi); } else diff --git a/subsystems/win32/win32k/objects/bitmaps.c b/subsystems/win32/win32k/objects/bitmaps.c index 5d324d97d16..c47afa58c12 100644 --- a/subsystems/win32/win32k/objects/bitmaps.c +++ b/subsystems/win32/win32k/objects/bitmaps.c @@ -971,30 +971,36 @@ BITMAP_GetObject(SURFACE *psurf, INT Count, LPVOID buffer) pds->dsBmih.biHeight = pds->dsBm.bmHeight; pds->dsBmih.biPlanes = pds->dsBm.bmPlanes; pds->dsBmih.biBitCount = pds->dsBm.bmBitsPixel; - switch (psurf->SurfObj.iBitmapFormat) - { - /* FIXME: What about BI_BITFIELDS? */ - case BMF_1BPP: - case BMF_4BPP: - case BMF_8BPP: - case BMF_16BPP: - case BMF_24BPP: - case BMF_32BPP: - pds->dsBmih.biCompression = BI_RGB; - break; - case BMF_4RLE: - pds->dsBmih.biCompression = BI_RLE4; - break; - case BMF_8RLE: - pds->dsBmih.biCompression = BI_RLE8; - break; - case BMF_JPEG: - pds->dsBmih.biCompression = BI_JPEG; - break; - case BMF_PNG: - pds->dsBmih.biCompression = BI_PNG; - break; - } + if(psurf->ppal->Mode & PAL_BITFIELDS) + { + pds->dsBmih.biCompression = BI_BITFIELDS; + } + else + { + switch (psurf->SurfObj.iBitmapFormat) + { + case BMF_1BPP: + case BMF_4BPP: + case BMF_8BPP: + case BMF_16BPP: + case BMF_24BPP: + case BMF_32BPP: + pds->dsBmih.biCompression = BI_RGB; + break; + case BMF_4RLE: + pds->dsBmih.biCompression = BI_RLE4; + break; + case BMF_8RLE: + pds->dsBmih.biCompression = BI_RLE8; + break; + case BMF_JPEG: + pds->dsBmih.biCompression = BI_JPEG; + break; + case BMF_PNG: + pds->dsBmih.biCompression = BI_PNG; + break; + } + } pds->dsBmih.biSizeImage = psurf->SurfObj.cjBits; pds->dsBmih.biXPelsPerMeter = 0; pds->dsBmih.biYPelsPerMeter = 0; diff --git a/subsystems/win32/win32k/objects/dibobj.c b/subsystems/win32/win32k/objects/dibobj.c index f46a59c4727..74931f8a54f 100644 --- a/subsystems/win32/win32k/objects/dibobj.c +++ b/subsystems/win32/win32k/objects/dibobj.c @@ -1258,7 +1258,7 @@ GreCreateDIBitmapInternal( if (!hDc) /* 1bpp monochrome bitmap */ { // Should use System Bitmap DC hSystemBM, with CreateCompatibleDC for this. - hdcDest = IntGdiCreateDC(NULL, NULL, NULL, NULL,FALSE); + hdcDest = NtGdiCreateCompatibleDC(0); if(!hdcDest) { return NULL;