Alexandre Julliard : winex11: Set the reported screen bpp based on the available pixmap formats.

Alexandre Julliard julliard at winehq.org
Wed Jul 6 13:31:09 CDT 2011


Module: wine
Branch: master
Commit: 2e4b0b1ef42dbf662d69c4e07b3ce0ecc9ef103d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2e4b0b1ef42dbf662d69c4e07b3ce0ecc9ef103d

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jul  6 12:38:31 2011 +0200

winex11: Set the reported screen bpp based on the available pixmap formats.

---

 dlls/winex11.drv/dib.c         |    4 ++--
 dlls/winex11.drv/init.c        |    4 +---
 dlls/winex11.drv/x11drv.h      |    3 +--
 dlls/winex11.drv/x11drv_main.c |   38 ++++++++++++++------------------------
 4 files changed, 18 insertions(+), 31 deletions(-)

diff --git a/dlls/winex11.drv/dib.c b/dlls/winex11.drv/dib.c
index c7758e6..226c416 100644
--- a/dlls/winex11.drv/dib.c
+++ b/dlls/winex11.drv/dib.c
@@ -5053,7 +5053,7 @@ HGLOBAL X11DRV_DIB_CreateDIBFromPixmap(Pixmap pixmap, HDC hdc)
     if (!XGetGeometry(gdi_display, pixmap, &root, &x, &y, &width, &height,
                       &border_width, &depth)) depth = 0;
     wine_tsx11_unlock();
-    if (!depth) return 0;
+    if (!pixmap_formats[depth]) return 0;
 
     TRACE("\tPixmap properties: width=%d, height=%d, depth=%d\n",
           width, height, depth);
@@ -5062,7 +5062,7 @@ HGLOBAL X11DRV_DIB_CreateDIBFromPixmap(Pixmap pixmap, HDC hdc)
      * Create an HBITMAP with the same dimensions and BPP as the pixmap,
      * and make it a container for the pixmap passed.
      */
-    if (!(hBmp = CreateBitmap( width, height, 1, depth_to_bpp(depth), NULL ))) return 0;
+    if (!(hBmp = CreateBitmap( width, height, 1, pixmap_formats[depth]->bits_per_pixel, NULL ))) return 0;
 
     /* force bitmap to be owned by a screen DC */
     hdcMem = CreateCompatibleDC( hdc );
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c
index 8de1dd6..b9c1c1c 100644
--- a/dlls/winex11.drv/init.c
+++ b/dlls/winex11.drv/init.c
@@ -240,10 +240,8 @@ INT CDECL X11DRV_GetDeviceCaps( X11DRV_PDEVICE *physDev, INT cap )
          * BITSPIXEL: 8  -> COLORRES: 18
          * BITSPIXEL: 16 -> COLORRES: 16
          * BITSPIXEL: 24 -> COLORRES: 24
-         * (note that depth_to_bpp never chooses a bpp of 24)
          * BITSPIXEL: 32 -> COLORRES: 24 */
-        return (screen_bpp <= 8) ? 18 :
-               (screen_bpp == 32) ? 24 : screen_bpp;
+        return (screen_bpp <= 8) ? 18 : min( 24, screen_bpp );
     case RASTERCAPS:
         return (RC_BITBLT | RC_BANDING | RC_SCALING | RC_BITMAP64 | RC_DI_BITMAP |
                 RC_DIBTODEV | RC_BIGFONT | RC_STRETCHBLT | RC_STRETCHDIB | RC_DEVBITS |
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 5a5d109..c4125ec 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -503,8 +503,6 @@ extern COLORREF X11DRV_PALETTE_GetColor( X11DRV_PDEVICE *physDev, COLORREF color
 extern int X11DRV_PALETTE_LookupPixel(ColorShifts *shifts, COLORREF color) DECLSPEC_HIDDEN;
 extern void X11DRV_PALETTE_ComputeColorShifts(ColorShifts *shifts, unsigned long redMask, unsigned long greenMask, unsigned long blueMask) DECLSPEC_HIDDEN;
 
-extern unsigned int depth_to_bpp( unsigned int depth ) DECLSPEC_HIDDEN;
-
 /* GDI escapes */
 
 #define X11DRV_ESCAPE 6789
@@ -589,6 +587,7 @@ static inline size_t get_property_size( int format, unsigned long count )
 }
 
 extern Visual *visual DECLSPEC_HIDDEN;
+extern XPixmapFormatValues **pixmap_formats DECLSPEC_HIDDEN;
 extern Window root_window DECLSPEC_HIDDEN;
 extern int clipping_cursor DECLSPEC_HIDDEN;
 extern unsigned int screen_width DECLSPEC_HIDDEN;
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 9b01829..8e2082d 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -69,6 +69,7 @@ static CRITICAL_SECTION X11DRV_CritSection = { &critsect_debug, -1, 0, 0, 0, 0 }
 
 static Screen *screen;
 Visual *visual;
+XPixmapFormatValues **pixmap_formats;
 unsigned int screen_width;
 unsigned int screen_height;
 unsigned int screen_bpp;
@@ -324,33 +325,21 @@ void CDECL wine_tsx11_unlock(void)
 
 
 /***********************************************************************
- *		depth_to_bpp
- *
- * Convert X11-reported depth to the BPP value that Windows apps expect to see.
+ *		init_pixmap_formats
  */
-unsigned int depth_to_bpp( unsigned int depth )
+static void init_pixmap_formats( Display *display )
 {
-    switch (depth)
+    int i, count, max = 32;
+    XPixmapFormatValues *formats = XListPixmapFormats( display, &count );
+
+    for (i = 0; i < count; i++)
     {
-    case 1:
-    case 8:
-        return depth;
-    case 15:
-    case 16:
-        return 16;
-    case 24:
-        /* This is not necessarily right. X11 always has 24 bits per pixel, but it can run
-         * with 24 bit framebuffers and 32 bit framebuffers. It doesn't make any difference
-         * for windowing, but gl applications can get visuals with alpha channels. So we
-         * should check the framebuffer and/or opengl formats available to find out what the
-         * framebuffer actually does
-         */
-    case 32:
-        return 32;
-    default:
-        FIXME( "Unexpected X11 depth %d bpp, what to report to app?\n", depth );
-        return depth;
+        TRACE( "depth %u, bpp %u, pad %u\n",
+               formats[i].depth, formats[i].bits_per_pixel, formats[i].scanline_pad );
+        if (formats[i].depth > max) max = formats[i].depth;
     }
+    pixmap_formats = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*pixmap_formats) * (max + 1) );
+    for (i = 0; i < count; i++) pixmap_formats[formats[i].depth] = &formats[i];
 }
 
 
@@ -579,7 +568,8 @@ static BOOL process_attach(void)
         }
     }
     if (!screen_depth) screen_depth = DefaultDepthOfScreen( screen );
-    screen_bpp = depth_to_bpp( screen_depth );
+    init_pixmap_formats( display );
+    screen_bpp = pixmap_formats[screen_depth]->bits_per_pixel;
 
     XInternAtoms( display, (char **)atom_names, NB_XATOMS - FIRST_XATOM, False, X11DRV_Atoms );
 




More information about the wine-cvs mailing list