Hello and thanks for qemu which is a great program!

I posted a patch at http://m2.dad-answers.com/qemu-forum/ and got the
advice to also post the patch to this mailing list, so here it comes:

Most X servers I have seen have color masks something like this (from
xdpyinfo):
red, green, blue masks: 0xf800, 0x7e0, 0x1f

However, Hummingbird eXceed which is an X server for Microsoft Windows
instead looks something like this:
red, green, blue masks: 0xff, 0xff00, 0xff0000

With such an X server connected to a Linux host qemu version 0.7.2 gives
strange colors on screen as the red and blue components of colors gets
mixed up. For example an MS Windows blue screen of death becomes a red
screen of death instead.

The SDL_SetVideoMode function call returns some information about how the
color masks are ordered in the returned struct, and that data could be
used to correctly render the colors by modifying files like console.c and
vga.c. However, I found it easier to only call SDL_SetVideoMode again to
find a bit depth which does not correspond to the actual bit depth of the
X server. Then SDL gives a surface which has the color masks in the right
order.

My simple patch looks like this:

-8<-----------------------------------------------------------------
--- ../qemu-0.7.2/sdl.c 2005-09-04 19:11:31.000000000 +0200
+++ sdl.c       2005-09-21 14:16:26.000000000 +0200
@@ -49,17 +49,25 @@
 static void sdl_resize(DisplayState *ds, int w, int h)
 {
     int flags;
+    int i=0;
+    int a[4]={0,32,16,0};
  
     //    printf("resizing to %d %d\n", w, h);
  
     flags = SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_HWACCEL;
     if (gui_fullscreen)
         flags |= SDL_FULLSCREEN;
-    screen = SDL_SetVideoMode(w, h, 0, flags);
-    if (!screen) {
-        fprintf(stderr, "Could not open SDL display\n");
-        exit(1);
+    do
+    {
+        screen = SDL_SetVideoMode(w, h, a[i], flags);
+        if (!screen) {
+            fprintf(stderr, "Could not open SDL display\n");
+            exit(1);
+        }
     }
+    while ( (screen->format->Rmask < screen->format->Bmask) && (++i <
4));
+    /* Trying to find a screen which won't produce wrong colors */
+
     ds->data = screen->pixels;
     ds->linesize = screen->pitch;
     ds->depth = screen->format->BitsPerPixel;
-8<-----------------------------------------------------------------

regards Henrik

-- 
NOTE: Dear Outlook users: Please remove me from your address books.
      Read this article and you know why:
      http://newsforge.com/article.pl?sid=03/08/21/143258


_______________________________________________
Qemu-devel mailing list
Qemu-devel@nongnu.org
http://lists.nongnu.org/mailman/listinfo/qemu-devel

Reply via email to