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