qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] [v2] Update cocoa.m to match new DisplayState c


From: Andreas Färber
Subject: Re: [Qemu-devel] [PATCH] [v2] Update cocoa.m to match new DisplayState code
Date: Sat, 28 Feb 2009 16:09:31 +0100


Am 25.01.2009 um 09:23 schrieb Samuel Benson:

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 <address@hidden>

Acked-by: Andreas Faerber <address@hidden>

The patch fixes compilation, and I have tested the following guests on ppc host:
Debian/sparc32 (OpenBIOS and penguin feet are yellow)
Haiku/x86 @ 16bit, 15bit, 8bit (blue background, everything looks normal)

This patch implicitly adds a new feature, it centers the window on size change ("[normalWindow center];"). Previously the window would extend below the desktop bounds after the BIOS/OpenBIOS screen. Maybe that should be split out from the DisplayState changes?

This patch probably needs a Signed-off-by from Stefano since it is likely based upon his draft patch from Dec 19.

There was an additional patch from Stefano in this thread that I have not yet tested. It was supposed to fix some Windows guests as a last resort (disabling 16-bit optimizations due to lacking support in Cocoa), but nobody replied to it yet apparently.

I haven't checked in-depth in which way C. W. Bett's diff is related to these two. It does seem to contain an additional output typo fix not in here. Could you post that as a separate patch?

Andreas

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);







reply via email to

[Prev in Thread] Current Thread [Next in Thread]