Alexandre Julliard : winex11: Abstract the depth-> bpp conversion and use it in X11DRV_DIB_CreateDIBFromPixmap.
Alexandre Julliard
julliard at winehq.org
Mon Feb 4 08:43:16 CST 2008
Module: wine
Branch: master
Commit: 0d30daa8e4221a40a295c6714777b05959570af3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0d30daa8e4221a40a295c6714777b05959570af3
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Feb 4 14:36:18 2008 +0100
winex11: Abstract the depth->bpp conversion and use it in X11DRV_DIB_CreateDIBFromPixmap.
---
dlls/winex11.drv/dib.c | 2 +-
dlls/winex11.drv/x11drv.h | 2 +
dlls/winex11.drv/x11drv_main.c | 61 +++++++++++++++++++++-------------------
3 files changed, 35 insertions(+), 30 deletions(-)
diff --git a/dlls/winex11.drv/dib.c b/dlls/winex11.drv/dib.c
index 2f0bbc9..b05d904 100644
--- a/dlls/winex11.drv/dib.c
+++ b/dlls/winex11.drv/dib.c
@@ -4856,7 +4856,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.
*/
- hBmp = CreateBitmap( width, height, 1, depth, NULL );
+ if (!(hBmp = CreateBitmap( width, height, 1, depth_to_bpp(depth), NULL ))) return 0;
/* force bitmap to be owned by a screen DC */
hdcMem = CreateCompatibleDC( hdc );
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index ffd0469..7af082c 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -463,6 +463,8 @@ extern BOOL X11DRV_IsSolidColor(COLORREF color);
extern COLORREF X11DRV_PALETTE_ToLogical(int pixel);
extern int X11DRV_PALETTE_ToPhysical(X11DRV_PDEVICE *physDev, COLORREF color);
+extern unsigned int depth_to_bpp( unsigned int depth );
+
/* GDI escapes */
#define X11DRV_ESCAPE 6789
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 8d822ef..6f682c2 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -278,6 +278,37 @@ void wine_tsx11_unlock(void)
/***********************************************************************
+ * depth_to_bpp
+ *
+ * Convert X11-reported depth to the BPP value that Windows apps expect to see.
+ */
+unsigned int depth_to_bpp( unsigned int depth )
+{
+ switch (depth)
+ {
+ 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;
+ }
+}
+
+
+/***********************************************************************
* get_config_key
*
* Get a config key from either the app-specific or the default config
@@ -491,35 +522,7 @@ static BOOL process_attach(void)
screen_depth = desktop_vi->depth;
XFree(desktop_vi);
}
-
- switch(screen_depth) {
- case 8:
- screen_bpp = 8;
- break;
-
- case 15:
- /* In GetDeviceCaps MSDN description explicitly states that
- * in 15 bpp mode 16 is returned.
- */
- /* fall through */
- case 16:
- screen_bpp = 16;
- break;
-
- 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
- */
- screen_bpp = 32;
- break;
-
- default:
- FIXME("Unexpected X11 depth %d bpp, what to report to app?\n", screen_depth);
- screen_bpp = screen_depth;
- }
+ screen_bpp = depth_to_bpp( screen_depth );
XInternAtoms( display, (char **)atom_names, NB_XATOMS - FIRST_XATOM, False, X11DRV_Atoms );
More information about the wine-cvs
mailing list