From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1EJxbQ-0003vf-I9 for qemu-devel@nongnu.org; Mon, 26 Sep 2005 14:21:24 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1EJxR5-0007n9-SH for qemu-devel@nongnu.org; Mon, 26 Sep 2005 14:10:44 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1EJxLr-0006ZQ-KF for qemu-devel@nongnu.org; Mon, 26 Sep 2005 14:05:19 -0400 Received: from [82.183.137.225] (helo=1-1-5-8a.ehn.lk.bostream.se) by monty-python.gnu.org with esmtp (Exim 4.34) id 1EJxEu-0004q6-Ik for qemu-devel@nongnu.org; Mon, 26 Sep 2005 13:58:08 -0400 Received: from draken.lkp.se (henca@localhost [127.0.0.1]) by 1-1-5-8a.ehn.lk.bostream.se (8.11.4/8.11.4) with SMTP id j8QHw6626017 for ; Mon, 26 Sep 2005 19:58:06 +0200 Date: Mon, 26 Sep 2005 19:58:06 +0200 From: Henrik Carlqvist Message-Id: <20050926195806.6ef0fbc9.henca@users.SourceForge.net> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Patch against weird colors with Hummingbird eXceed X server Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org 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