dga2 bugfix
Ove Kaaven
ovehk at ping.uio.no
Fri Feb 2 16:33:02 CST 2001
I think I had done a rather stupid mistake when I copied the dga2 mode
setting code from the xvidmode code... forgot to add code that selects the
requested color depth when choosing a mode to enter, which could clearly
give rather strange results...
Log:
Ove Kaaven <ovek at transgaming.com>
Fix DGA2 mode setting to use the correct color depth.
Index: dlls/ddraw/ddraw/dga2.c
===================================================================
RCS file: /home/cvs/wine/dlls/ddraw/ddraw/dga2.c,v
retrieving revision 1.1.1.5
diff -u -r1.1.1.5 dga2.c
--- dlls/ddraw/ddraw/dga2.c 2001/01/29 17:21:20 1.1.1.5
+++ dlls/ddraw/ddraw/dga2.c 2001/02/02 23:03:35
@@ -1,6 +1,6 @@
/* DirectDraw driver for XF86DGA2 primary surface
*
- * Copyright 2000 TransGaming Technologies Inc.
+ * Copyright 2000-2001 TransGaming Technologies Inc.
*/
#include "config.h"
@@ -100,16 +100,31 @@
TSXFree(modes);
}
-static XDGAMode* choose_mode(DWORD dwWidth, DWORD dwHeight,
+static XDGAMode* choose_mode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP,
DWORD dwRefreshRate, DWORD dwFlags)
{
XDGAMode* best = NULL;
- int i;
+ int depth, bpp, i;
+ switch (dwBPP) {
+ case 8:
+ depth = dwBPP; bpp = 8; break;
+ case 15:
+ case 16:
+ depth = dwBPP; bpp = 16; break;
+ case 24:
+ case 32:
+ depth = 24; bpp = dwBPP; break;
+ default:
+ ERR("invalid color depth (%ld)\n", dwBPP);
+ return NULL;
+ }
+
/* Choose the smallest mode that is large enough. */
for (i=0; i < num_modes; i++)
{
- if (modes[i].viewportWidth >= dwWidth && modes[i].viewportHeight >= dwHeight)
+ if (modes[i].viewportWidth >= dwWidth && modes[i].viewportHeight >= dwHeight &&
+ modes[i].depth == depth && modes[i].bitsPerPixel == bpp)
{
if (best == NULL) best = &modes[i];
else
@@ -121,23 +136,32 @@
}
}
- /* all modes were too small, use the largest */
if (!best)
{
TRACE("all modes too small\n");
+ /* use the largest */
for (i=1; i < num_modes; i++)
{
- if (best == NULL) best = &modes[i];
- else
+ if (modes[i].depth == depth && modes[i].bitsPerPixel == bpp)
{
- if (modes[i].viewportWidth > best->viewportWidth
- || modes[i].viewportHeight > best->viewportHeight)
- best = &modes[i];
+ if (best == NULL) best = &modes[i];
+ else
+ {
+ if (modes[i].viewportWidth > best->viewportWidth
+ || modes[i].viewportHeight > best->viewportHeight)
+ best = &modes[i];
+ }
}
}
}
+ if (!best)
+ {
+ ERR("requested color depth (%ld) not available, try reconfiguring X server\n", dwBPP);
+ return NULL;
+ }
+
TRACE("using %d %d for %lu %lu\n", best->viewportWidth, best->viewportHeight,
dwWidth, dwHeight);
@@ -331,7 +355,11 @@
XDGAMode* new_mode;
int old_mode_num = old_mode ? old_mode->mode.num : 0;
- new_mode = choose_mode(dwWidth, dwHeight, dwRefreshRate, dwFlags);
+ new_mode = choose_mode(dwWidth, dwHeight, dwBPP, dwRefreshRate, dwFlags);
+ if (!new_mode)
+ {
+ return DDERR_INVALIDMODE;
+ }
if (new_mode && new_mode->num != old_mode_num)
{
More information about the wine-patches
mailing list