From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LR0H7-00011f-Ri for qemu-devel@nongnu.org; Sun, 25 Jan 2009 03:23:25 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LR0H6-00011T-2K for qemu-devel@nongnu.org; Sun, 25 Jan 2009 03:23:24 -0500 Received: from [199.232.76.173] (port=57882 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LR0H5-00011Q-Rp for qemu-devel@nongnu.org; Sun, 25 Jan 2009 03:23:23 -0500 Received: from mx20.gnu.org ([199.232.41.8]:39789) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LR0H5-0005Hp-9G for qemu-devel@nongnu.org; Sun, 25 Jan 2009 03:23:23 -0500 Received: from cpe-68-201-101-89.rgv.res.rr.com ([68.201.101.89] helo=digitalescape.info) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LR0H4-0005mp-B4 for qemu-devel@nongnu.org; Sun, 25 Jan 2009 03:23:22 -0500 Received: from localhost (localhost [127.0.0.1]) by digitalescape.info (Postfix) with ESMTP id 6F69239BA09 for ; Sun, 25 Jan 2009 02:23:14 -0600 (CST) Received: from digitalescape.info ([127.0.0.1]) by localhost (mail.digitalescape.info [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id DPG3BBjvWHwd for ; Sun, 25 Jan 2009 02:23:13 -0600 (CST) Received: from lan.digitalescape.info (lan.digitalescape.info [172.16.144.7]) by digitalescape.info (Postfix) with ESMTP id 8FCC939B9FA for ; Sun, 25 Jan 2009 02:23:13 -0600 (CST) Message-Id: <3097312F-7315-42BA-AF5D-4C026CD874FD@digitalescape.info> From: Samuel Benson Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v930.3) Date: Sun, 25 Jan 2009 02:23:12 -0600 Subject: [Qemu-devel] [PATCH] [v2] Update cocoa.m to match new DisplayState code 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 Version 2 does as follows: [1]: Corrects endianness on issues by using native BGR to RGB conversion [2]: Uses DisplayState accessors for obtaining graphics context information, which [3]: Removes now unused variables, and [4]: Allows reading of varying color modes (32bit/24/16), and converting to native colorspace [5]: Attempts to keep itself centered on screen (as opposed to bottom right, which immediately goes off screen after bios load) on context changes (window resizes) Testing working on i386 (gentoo, Windows 2000) and PPC (debian) guests on PPC and x86 Macs. In regards to [4], Windows 2000 displays fine on quick tests, but on the lowest setting I could test, 16bit color depth at 4bpp, colors are slightly off. I used gentoo install-x86-minimal-2008.0 in framebuffer mode to test above setting; the usual grey text is now blue, and Tux appears to be BGR shifted. I do not know if previous code worked at such a low color setting. Signed-off-by: Samuel Benson --- cocoa.m | 53 ++++++++++++++++++++--------------------------------- 1 files changed, 20 insertions(+), 33 deletions(-) diff --git a/cocoa.m b/cocoa.m index fe13952..55ff2b4 100644 --- a/cocoa.m +++ b/cocoa.m @@ -57,7 +57,7 @@ typedef struct { int qemu_main(int argc, char **argv); // main defined in qemu/vl.c NSWindow *normalWindow; id cocoaView; -static void *screenBuffer; +static DisplayChangeListener *dcl; int gArgc; char **gArgv; @@ -292,9 +292,6 @@ int cocoa_keycode_to_qemu(int keycode) { COCOA_DEBUG("QemuCocoaView: dealloc\n"); - if (screenBuffer) - free(screenBuffer); - if (dataProviderRef) CGDataProviderRelease(dataProviderRef); @@ -305,9 +302,6 @@ int cocoa_keycode_to_qemu(int keycode) { COCOA_DEBUG("QemuCocoaView: drawRect\n"); - if ((int)screenBuffer == -1) - return; - // get CoreGraphic context CGContextRef viewContextRef = [[NSGraphicsContext currentContext] graphicsPort]; CGContextSetInterpolationQuality (viewContextRef, kCGInterpolationNone); @@ -320,10 +314,10 @@ int cocoa_keycode_to_qemu(int keycode) screen.height, //height screen.bitsPerComponent, //bitsPerComponent screen.bitsPerPixel, //bitsPerPixel - (screen.width * 4), //bytesPerRow + (screen.width * (screen.bitsPerComponent/2)), //bytesPerRow #if __LITTLE_ENDIAN__ CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB), // colorspace for OS X >= 10.4 - kCGImageAlphaNoneSkipLast, + kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst, #else CGColorSpaceCreateDeviceRGB(), //colorspace for OS X < 10.4 (actually ppc) kCGImageAlphaNoneSkipFirst, //bitmapInfo @@ -395,22 +389,12 @@ int cocoa_keycode_to_qemu(int keycode) // update screenBuffer if (dataProviderRef) CGDataProviderRelease(dataProviderRef); - if (screenBuffer) - free(screenBuffer); - screenBuffer = malloc( w * 4 * h ); - - ds->data = screenBuffer; - ds->linesize = (w * 4); - ds->depth = 32; - ds->width = w; - ds->height = h; -#ifdef __LITTLE_ENDIAN__ - ds->bgr = 1; -#else - ds->bgr = 0; -#endif - dataProviderRef = CGDataProviderCreateWithData(NULL, screenBuffer, w * 4 * h, NULL); + //sync host window color space with guests + screen.bitsPerPixel = ds_get_bits_per_pixel(ds); + screen.bitsPerComponent = ds_get_bytes_per_pixel(ds) * 2; + + dataProviderRef = CGDataProviderCreateWithData(NULL, ds_get_data(ds), w * 4 * h, NULL); // update windows if (isFullscreen) { @@ -423,6 +407,7 @@ int cocoa_keycode_to_qemu(int keycode) } screen.width = w; screen.height = h; + [normalWindow center]; [self setContentDimensions]; [self setFrame:NSMakeRect(cx, cy, cw, ch)]; } @@ -740,6 +725,7 @@ int cocoa_keycode_to_qemu(int keycode) [normalWindow setTitle:[NSString stringWithFormat:@"QEMU"]]; [normalWindow setContentView:cocoaView]; [normalWindow makeKeyAndOrderFront:self]; + [normalWindow center]; } return self; @@ -939,11 +925,11 @@ static void cocoa_update(DisplayState *ds, int x, int y, int w, int h) [cocoaView displayRect:rect]; } -static void cocoa_resize(DisplayState *ds, int w, int h) +static void cocoa_resize(DisplayState *ds) { COCOA_DEBUG("qemu_cocoa: cocoa_resize\n"); - [cocoaView resizeContentToWidth:w height:h displayState:ds]; + [cocoaView resizeContentToWidth:(int)(ds_get_width(ds)) height: (int)(ds_get_height(ds)) displayState:ds]; } static void cocoa_refresh(DisplayState *ds) @@ -975,20 +961,21 @@ static void cocoa_refresh(DisplayState *ds) static void cocoa_cleanup(void) { COCOA_DEBUG("qemu_cocoa: cocoa_cleanup\n"); - + qemu_free(dcl); } void cocoa_display_init(DisplayState *ds, int full_screen) { COCOA_DEBUG("qemu_cocoa: cocoa_display_init\n"); - // register vga outpu callbacks - ds->dpy_update = cocoa_update; - ds->dpy_resize = cocoa_resize; - ds->dpy_refresh = cocoa_refresh; + dcl = qemu_mallocz(sizeof(DisplayChangeListener)); + + // register vga output callbacks + dcl->dpy_update = cocoa_update; + dcl->dpy_resize = cocoa_resize; + dcl->dpy_refresh = cocoa_refresh; - // give window a initial Size - cocoa_resize(ds, 640, 400); + register_displaychangelistener(ds, dcl); // register cleanup function atexit(cocoa_cleanup);