[WIN32K]
authorJérôme Gardou <jerome.gardou@reactos.org>
Mon, 2 Aug 2010 14:45:51 +0000 (14:45 +0000)
committerJérôme Gardou <jerome.gardou@reactos.org>
Mon, 2 Aug 2010 14:45:51 +0000 (14:45 +0000)
  - 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

subsystems/win32/win32k/misc/file.c
subsystems/win32/win32k/objects/bitmaps.c
subsystems/win32/win32k/objects/dibobj.c

index 87df7d3..856de99 100644 (file)
@@ -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
index 5d324d9..c47afa5 100644 (file)
@@ -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;
index f46a59c..74931f8 100644 (file)
@@ -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;