Possible optimization with X11DRV_PALETTE_ToPhysical

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Mon May 5 12:52:12 CDT 2003


Hallo,

there are several loops in wine/graphics/x11drv/dib.c that call
X11DRV_PALETTE_ToPhysical inside the loop. X11DRV_PALETTE_ToPhysical always
does a GDI_GetObjPtr at entry and a Release at exit. E.g. with MS
pinball.exe I sees a look querying 256 entries in a row. If we do the
GDI_GetObjPtr/Release outside the loop and have a ..._ToPhysical call that
takes palPtr we would save a loot those Get/ReleasePtr calls. Is this worth
doing? I the approach below right? 

Bye
-- 
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
Index: wine/dlls/x11drv/x11drv.h
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/x11drv.h,v
retrieving revision 1.1
diff -u -r1.1 x11drv.h
--- wine/dlls/x11drv/x11drv.h	22 Apr 2003 04:05:08 -0000	1.1
+++ wine/dlls/x11drv/x11drv.h	5 May 2003 17:43:44 -0000
@@ -43,6 +43,8 @@
 #include "user.h"
 #include "win.h"
 #include "thread.h"
+#include "palette.h"
+#include "windef.h"
 
 #define MAX_PIXELFORMATS 8
 
@@ -314,6 +316,7 @@
 
 extern COLORREF X11DRV_PALETTE_ToLogical(int pixel);
 extern int X11DRV_PALETTE_ToPhysical(X11DRV_PDEVICE *physDev, COLORREF color);
+extern int X11DRV_PALETTEOBJ_ToPhysical( DC *dc, HPALETTE hPal, PALETTEOBJ *palPtr, COLORREF color);
 
 /* GDI escapes */
 
Index: wine/graphics/x11drv/dib.c
===================================================================
RCS file: /home/wine/wine/graphics/x11drv/dib.c,v
retrieving revision 1.108
diff -u -r1.108 dib.c
--- wine/graphics/x11drv/dib.c	31 Mar 2003 01:32:47 -0000	1.108
+++ wine/graphics/x11drv/dib.c	5 May 2003 17:43:58 -0000
@@ -174,6 +174,9 @@
                              const void *colorPtr, int start, int end )
 {
     int i;
+    DC *dc = physDev ? physDev->dc : NULL;
+    HPALETTE		 hPal = (dc)? dc->hPalette: GetStockObject(DEFAULT_PALETTE);
+    PALETTEOBJ* 	 palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
 
     if (coloruse == DIB_RGB_COLORS)
     {
@@ -191,7 +194,7 @@
                                        rgb->rgbBlue > 255*3/2);
             else
                 for (i = start; i < end; i++, rgb++)
-                    colorMapping[i] = X11DRV_PALETTE_ToPhysical( physDev, RGB(rgb->rgbRed,
+                    colorMapping[i] = X11DRV_PALETTEOBJ_ToPhysical( dc, hPal, palPtr, RGB(rgb->rgbRed,
                                                                 rgb->rgbGreen,
                                                                 rgb->rgbBlue));
         }
@@ -205,7 +208,7 @@
                                        rgb->rgbtBlue > 255*3/2);
             else
                 for (i = start; i < end; i++, rgb++)
-                    colorMapping[i] = X11DRV_PALETTE_ToPhysical( physDev, RGB(rgb->rgbtRed,
+                    colorMapping[i] = X11DRV_PALETTEOBJ_ToPhysical( dc, hPal, palPtr, RGB(rgb->rgbtRed,
                                                                rgb->rgbtGreen,
                                                                rgb->rgbtBlue));
         }
@@ -216,13 +219,15 @@
             WORD * index = (WORD *)colorPtr;
 
             for (i = start; i < end; i++, index++)
-                colorMapping[i] = X11DRV_PALETTE_ToPhysical( physDev, PALETTEINDEX(*index) );
+                colorMapping[i] = X11DRV_PALETTEOBJ_ToPhysical( dc, hPal, palPtr, PALETTEINDEX(*index) );
         } else {
             for (i = start; i < end; i++)
-                colorMapping[i] = X11DRV_PALETTE_ToPhysical( physDev, PALETTEINDEX(i) );
+                colorMapping[i] = X11DRV_PALETTEOBJ_ToPhysical( dc, hPal, palPtr, PALETTEINDEX(i) );
         }
     }
 
+    if (palPtr)
+      GDI_ReleaseObj( palPtr );
     return colorMapping;
 }
 
@@ -3176,6 +3181,9 @@
             int rShift1,gShift1,bShift1;
             int rShift2,gShift2,bShift2;
             BYTE gMask1,gMask2;
+	    DC *dc = physDev ? physDev->dc : NULL;
+	    HPALETTE		 hPal = (dc)? dc->hPalette: GetStockObject(DEFAULT_PALETTE);
+	    PALETTEOBJ* 	 palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
 
             /* Set color scaling values */
             rShift1=16+X11DRV_DIB_MaskToShift(rSrc)-3;
@@ -3214,11 +3222,13 @@
                     blue= ((srcval >> bShift1) & 0xf8) |
                         ((srcval >> bShift2) & 0x07);
                     XPutPixel(bmpImage, x, h,
-                              X11DRV_PALETTE_ToPhysical
-                              (physDev, RGB(red,green,blue)));
+                              X11DRV_PALETTEOBJ_ToPhysical
+                              (dc, hPal, palPtr, RGB(red,green,blue)));
                 }
                 srcbits += linebytes;
             }
+	    if(palPtr)
+	      GDI_ReleaseObj( palPtr );
         }
         break;
     }
@@ -3697,6 +3707,9 @@
         {
             /* ==== rgb 888 dib -> any bmp bormat ==== */
             const BYTE* srcbyte;
+	    DC *dc = physDev ? physDev->dc : NULL;
+	    HPALETTE		 hPal = (dc)? dc->hPalette: GetStockObject(DEFAULT_PALETTE);
+	    PALETTEOBJ* 	 palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
 
             /* Windows only supports one 24bpp DIB format: RGB888 */
             srcbits+=left*3;
@@ -3704,12 +3717,14 @@
                 srcbyte=(const BYTE*)srcbits;
                 for (x = left; x < dstwidth+left; x++) {
                     XPutPixel(bmpImage, x, h,
-                              X11DRV_PALETTE_ToPhysical
-                              (physDev, RGB(srcbyte[2], srcbyte[1], srcbyte[0])));
+                              X11DRV_PALETTEOBJ_ToPhysical
+                              (dc, hPal, palPtr, RGB(srcbyte[2], srcbyte[1], srcbyte[0])));
                     srcbyte+=3;
                 }
                 srcbits += linebytes;
             }
+	    if(palPtr)
+	      GDI_ReleaseObj( palPtr );
         }
         break;
     }
@@ -4171,6 +4186,9 @@
             /* ==== any 0888 dib -> pal 1, 4 or 8 bmp ==== */
             const DWORD* srcpixel;
             int rShift,gShift,bShift;
+	    DC *dc = physDev ? physDev->dc : NULL;
+	    HPALETTE		 hPal = (dc)? dc->hPalette: GetStockObject(DEFAULT_PALETTE);
+	    PALETTEOBJ* 	 palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
 
             rShift=X11DRV_DIB_MaskToShift(rSrc);
             gShift=X11DRV_DIB_MaskToShift(gSrc);
@@ -4185,12 +4203,14 @@
                     red=  (srcvalue >> rShift) & 0xff;
                     green=(srcvalue >> gShift) & 0xff;
                     blue= (srcvalue >> bShift) & 0xff;
-                    XPutPixel(bmpImage, x, h, X11DRV_PALETTE_ToPhysical
-                              (physDev, RGB(red,green,blue)));
+                    XPutPixel(bmpImage, x, h, X11DRV_PALETTEOBJ_ToPhysical
+                              (dc, hPal, palPtr, RGB(red,green,blue)));
                 }
                 srcbits += linebytes;
-            }
-        }
+           }
+	    if (palPtr)
+	      GDI_ReleaseObj( palPtr );
+	}
         break;
     }
 
Index: wine/graphics/x11drv/palette.c
===================================================================
RCS file: /home/wine/wine/graphics/x11drv/palette.c,v
retrieving revision 1.36
diff -u -r1.36 palette.c
--- wine/graphics/x11drv/palette.c	31 Oct 2002 02:38:20 -0000	1.36
+++ wine/graphics/x11drv/palette.c	5 May 2003 17:44:00 -0000
@@ -819,23 +819,32 @@
     return best;
 }
 
-
-/***********************************************************************
- *           X11DRV_PALETTE_ToPhysical
- *
- * Return the physical color closest to 'color'.
- */
 int X11DRV_PALETTE_ToPhysical( X11DRV_PDEVICE *physDev, COLORREF color )
 {
     DC *dc = physDev ? physDev->dc : NULL;
-    WORD 		 index = 0;
     HPALETTE		 hPal = (dc)? dc->hPalette: GetStockObject(DEFAULT_PALETTE);
-    unsigned char	 spec_type = color >> 24;
     PALETTEOBJ* 	 palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
+    int ret;
 
     /* palPtr can be NULL when DC is being destroyed */
     if( !palPtr ) return 0;
+    ret =  X11DRV_PALETTEOBJ_ToPhysical(dc, hPal, palPtr, color);
+    GDI_ReleaseObj( hPal );
+    return ret;
+}
+
 
+/***********************************************************************
+ *           X11DRV_PALETTEOBJ_ToPhysical
+ *
+ * Return the physical color closest to 'color'.
+ */
+int X11DRV_PALETTEOBJ_ToPhysical( DC *dc, HPALETTE hPal, PALETTEOBJ* palPtr, COLORREF color )
+{
+    WORD                 index = 0;
+    unsigned char	 spec_type = color >> 24;
+
+    if (!palPtr) return 0;
     if ( X11DRV_PALETTE_PaletteFlags & X11DRV_PALETTE_FIXED )
     {
         /* there is no colormap limitation; we are going to have to compute
@@ -852,14 +861,12 @@
             if( (idx = color & 0xffff) >= palPtr->logpalette.palNumEntries)
             {
                 WARN("RGB(%lx) : idx %d is out of bounds, assuming black\n", color, idx);
-		GDI_ReleaseObj( hPal );
                 return 0;
             }
 
             if( palPtr->mapping )
 	    {
                 int ret = palPtr->mapping[idx];
-		GDI_ReleaseObj( hPal );
 		return ret;
 	    }
 	    color = *(COLORREF*)(palPtr->logpalette.palPalEntry + idx);
@@ -872,7 +879,6 @@
 	  case 0: /* RGB */
 	    if( dc && (dc->bitsPerPixel == 1) )
 	    {
-		GDI_ReleaseObj( hPal );
 		return (((color >> 16) & 0xff) +
 			((color >> 8) & 0xff) + (color & 0xff) > 255*3/2) ? 1 : 0;
 	    }
@@ -884,7 +890,6 @@
 	if (X11DRV_PALETTE_Graymax)
         {
 	    /* grayscale only; return scaled value */
-	    GDI_ReleaseObj( hPal );
             return ( (red * 30 + green * 59 + blue * 11) * X11DRV_PALETTE_Graymax) / 25500;
 	}
 	else
@@ -906,7 +911,6 @@
 		blue =  blue  << (X11DRV_PALETTE_PBlue.scale-8) |
                         blue  >> (16-X11DRV_PALETTE_PBlue.scale);
 
-	    GDI_ReleaseObj( hPal );
             return (red << X11DRV_PALETTE_PRed.shift) | (green << X11DRV_PALETTE_PGreen.shift) | (blue << X11DRV_PALETTE_PBlue.shift);
         }
     }
@@ -925,7 +929,6 @@
        	    case 0:  /* RGB */
 		if( dc && (dc->bitsPerPixel == 1) )
 		{
-		    GDI_ReleaseObj( hPal );
 		    return (((color >> 16) & 0xff) +
 			    ((color >> 8) & 0xff) + (color & 0xff) > 255*3/2) ? 1 : 0;
 		}
@@ -955,7 +958,6 @@
 	}
     }
 
-    GDI_ReleaseObj( hPal );
     return index;
 }
 



More information about the wine-devel mailing list