[WIN32K]
[reactos.git] / reactos / subsystems / win32 / win32k / objects / bitmaps.c
index 23e8c39..75e1b1c 100644 (file)
@@ -438,7 +438,8 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
 
     XPos += dc->ptlDCOrig.x;
     YPos += dc->ptlDCOrig.y;
-    if (RECTL_bPointInRect(&dc->rosdc.CombinedClip->rclBounds, XPos, YPos))
+    if ((dc->rosdc.CombinedClip == NULL) ||
+        (RECTL_bPointInRect(&dc->rosdc.CombinedClip->rclBounds, XPos, YPos)))
     {
         bInRect = TRUE;
         psurf = dc->dclevel.pSurface;
@@ -841,7 +842,7 @@ BITMAP_CopyBitmap(HBITMAP hBitmap)
         return 0;
     }
 
-    Bitmap = SURFACE_LockSurface(hBitmap);
+    Bitmap = SURFACE_ShareLockSurface(hBitmap);
     if (Bitmap == NULL)
     {
         return 0;
@@ -866,11 +867,14 @@ BITMAP_CopyBitmap(HBITMAP hBitmap)
 
     if (res)
     {
-        resBitmap = SURFACE_LockSurface(res);
+        resBitmap = SURFACE_ShareLockSurface(res);
         if (resBitmap)
         {
             IntSetBitmapBits(resBitmap, Bitmap->SurfObj.cjBits, Bitmap->SurfObj.pvBits);
-                       SURFACE_UnlockSurface(resBitmap);
+            GDIOBJ_IncrementShareCount(&Bitmap->ppal->BaseObject);
+            GDIOBJ_ShareUnlockObjByPtr(&resBitmap->ppal->BaseObject);
+            resBitmap->ppal = Bitmap->ppal;
+            SURFACE_ShareUnlockSurface(resBitmap);
         }
         else
         {
@@ -879,7 +883,7 @@ BITMAP_CopyBitmap(HBITMAP hBitmap)
         }
     }
 
-    SURFACE_UnlockSurface(Bitmap);
+    SURFACE_ShareUnlockSurface(Bitmap);
 
     return  res;
 }
@@ -919,36 +923,46 @@ 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;
-                       if(psurf->ppal->flFlags & 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;
-                               }
-                       }
+
+            switch (psurf->SurfObj.iBitmapFormat)
+            {
+                case BMF_1BPP:
+                case BMF_4BPP:
+                case BMF_8BPP:
+                case BMF_24BPP:
+                   pds->dsBmih.biCompression = BI_RGB;
+                   break;
+
+                case BMF_16BPP:
+                    if (psurf->ppal->flFlags & PAL_RGB16_555)
+                        pds->dsBmih.biCompression = BI_RGB;
+                    else
+                        pds->dsBmih.biCompression = BI_BITFIELDS;
+                    break;
+
+                case BMF_32BPP:
+                    if (psurf->ppal->flFlags & PAL_RGB)
+                        pds->dsBmih.biCompression = BI_RGB;
+                    else
+                        pds->dsBmih.biCompression = BI_BITFIELDS;
+                    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;
+                default:
+                    ASSERT(FALSE); /* this shouldn't happen */
+            }
+
             pds->dsBmih.biSizeImage = psurf->SurfObj.cjBits;
             pds->dsBmih.biXPelsPerMeter = 0;
             pds->dsBmih.biYPelsPerMeter = 0;