Improvement on the code that deals with setting the color map in
GetDIBits.

diff --git a/objects/dib.c b/objects/dib.c
index 943cdb7..e541c20 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -407,8 +407,6 @@
 {
     DC * dc;
     BITMAPOBJ * bmp;
-    PALETTEENTRY * palEntry;
-    PALETTEOBJ * palette;
     int i;
 
     if (!info) return 0;
@@ -418,12 +416,6 @@
         GDI_ReleaseObj( hdc );
 	return 0;
     }
-    if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->hPalette, PALETTE_MAGIC )))
-    {
-        GDI_ReleaseObj( hdc );
-        GDI_ReleaseObj( hbitmap );
-        return 0;
-    }
 
     /* Transfer color info */
 
@@ -431,57 +423,71 @@
 
 	info->bmiHeader.biClrUsed = 0;
 
-	if(info->bmiHeader.biBitCount >= bmp->bitmap.bmBitsPixel) {
-	    palEntry = palette->logpalette.palPalEntry;
-	    for (i = 0; i < (1 << bmp->bitmap.bmBitsPixel); i++, palEntry++) {
-		if (coloruse == DIB_RGB_COLORS) {
-		    info->bmiColors[i].rgbRed      = palEntry->peRed;
-		    info->bmiColors[i].rgbGreen    = palEntry->peGreen;
-		    info->bmiColors[i].rgbBlue     = palEntry->peBlue;
-		    info->bmiColors[i].rgbReserved = 0;
-		}
-		else ((WORD *)info->bmiColors)[i] = (WORD)i;
-	    }
-	} else {
-	    switch (info->bmiHeader.biBitCount) {
-	    case 1:
-	        info->bmiColors[0].rgbRed = info->bmiColors[0].rgbGreen =
-		  info->bmiColors[0].rgbBlue = 0;
-		info->bmiColors[0].rgbReserved = 0;
-		info->bmiColors[1].rgbRed = info->bmiColors[1].rgbGreen =
-		  info->bmiColors[1].rgbBlue = 0xff;
-		info->bmiColors[1].rgbReserved = 0;
-		break;
-
-	    case 4:
-	        memcpy(info->bmiColors, EGAColors, sizeof(EGAColors));
-		break;
-
-	    case 8:
-	        {
-	        INT r, g, b;
-		RGBQUAD *color;
-
-		memcpy(info->bmiColors, DefLogPalette,
-		       10 * sizeof(RGBQUAD));
-		memcpy(info->bmiColors + 246, DefLogPalette + 10,
-		       10 * sizeof(RGBQUAD));
-		color = info->bmiColors + 10;
-		for(r = 0; r <= 5; r++) /* FIXME */
-		    for(g = 0; g <= 5; g++)
-		        for(b = 0; b <= 5; b++) {
-			    color->rgbRed =   (r * 0xff) / 5;
-			    color->rgbGreen = (g * 0xff) / 5;
-			    color->rgbBlue =  (b * 0xff) / 5;
-			    color->rgbReserved = 0;
-			    color++;
-			}
-		}
-	    }
+	/* If the bitmap object already has a dib section at the
+	   same color depth then get the color map from it */
+	if (bmp->dib && bmp->dib->dsBm.bmBitsPixel == info->bmiHeader.biBitCount) {
+	    GetDIBColorTable(hdc, 0, 1 << info->bmiHeader.biBitCount, info->bmiColors);
 	}
-    }
+        else {
+            if(info->bmiHeader.biBitCount >= bmp->bitmap.bmBitsPixel) {
+                /* Generate the color map from the selected palette */
+                PALETTEENTRY * palEntry;
+                PALETTEOBJ * palette;
+                if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->hPalette, PALETTE_MAGIC ))) {
+                    GDI_ReleaseObj( hdc );
+                    GDI_ReleaseObj( hbitmap );
+                    return 0;
+                }
+                palEntry = palette->logpalette.palPalEntry;
+                for (i = 0; i < (1 << bmp->bitmap.bmBitsPixel); i++, palEntry++) {
+                    if (coloruse == DIB_RGB_COLORS) {
+                        info->bmiColors[i].rgbRed      = palEntry->peRed;
+                        info->bmiColors[i].rgbGreen    = palEntry->peGreen;
+                        info->bmiColors[i].rgbBlue     = palEntry->peBlue;
+                        info->bmiColors[i].rgbReserved = 0;
+                    }
+                    else ((WORD *)info->bmiColors)[i] = (WORD)i;
+                }
+                GDI_ReleaseObj( dc->hPalette );
+            } else {
+                switch (info->bmiHeader.biBitCount) {
+                case 1:
+                    info->bmiColors[0].rgbRed = info->bmiColors[0].rgbGreen =
+                        info->bmiColors[0].rgbBlue = 0;
+                    info->bmiColors[0].rgbReserved = 0;
+                    info->bmiColors[1].rgbRed = info->bmiColors[1].rgbGreen =
+                        info->bmiColors[1].rgbBlue = 0xff;
+                    info->bmiColors[1].rgbReserved = 0;
+                    break;
 
-    GDI_ReleaseObj( dc->hPalette );
+                case 4:
+                    memcpy(info->bmiColors, EGAColors, sizeof(EGAColors));
+                    break;
+
+                case 8:
+                    {
+                        INT r, g, b;
+                        RGBQUAD *color;
+
+                        memcpy(info->bmiColors, DefLogPalette,
+                               10 * sizeof(RGBQUAD));
+                        memcpy(info->bmiColors + 246, DefLogPalette + 10,
+                               10 * sizeof(RGBQUAD));
+                        color = info->bmiColors + 10;
+                        for(r = 0; r <= 5; r++) /* FIXME */
+                            for(g = 0; g <= 5; g++)
+                                for(b = 0; b <= 5; b++) {
+                                    color->rgbRed =   (r * 0xff) / 5;
+                                    color->rgbGreen = (g * 0xff) / 5;
+                                    color->rgbBlue =  (b * 0xff) / 5;
+                                    color->rgbReserved = 0;
+                                    color++;
+                                }
+                    }
+                }
+            }
+        }
+    }
 
     if (bits && lines)
     {
@@ -664,8 +670,8 @@
                         }
                         break;
 
-                    default: /* ? bit bmp -> 16 bit DIB */
-                        FIXME("15/16 bit DIB %d bit bitmap\n",
+                    default: /* ? bit bmp -> 32 bit DIB */
+                        FIXME("32 bit DIB %d bit bitmap\n",
                         bmp->bitmap.bmBitsPixel);
                         break;
                     }