[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] Update cocoa.m to match new DisplayState code
From: |
Stefano Stabellini |
Subject: |
Re: [Qemu-devel] [PATCH] Update cocoa.m to match new DisplayState code |
Date: |
Sat, 24 Jan 2009 15:36:20 +0000 |
User-agent: |
Thunderbird 2.0.0.14 (X11/20080505) |
Samuel Benson wrote:
> Hello all,
>
> Attached patch is an attempt to update cocoa.m to be in sync with the new
> displaystate changes committed a few weeks back.
>
> Tested working on OS X 10.5.6 on G4 and G5 PPC machines.
>
> Tests and comments welcome.
Hi Samuel, thanks for your efforts.
> @@ -396,18 +397,18 @@ int cocoa_keycode_to_qemu(int keycode)
> 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;
> + qemu_free(screenBuffer);
> + screenBuffer = qemu_mallocz( w * 4 * h );
> +
> + ds->surface->data = screenBuffer;
> + ds->surface->linesize = (w * 4);
> + ds->surface->pf.depth = 32;
> + ds->surface->width = w;
> + ds->surface->height = h;
> #ifdef __LITTLE_ENDIAN__
> - ds->bgr = 1;
> + ds->surface->flags = 0x00;
> #else
> - ds->bgr = 0;
> + ds->surface->flags = QEMU_BIG_ENDIAN_FLAG;
> #endif
>
> dataProviderRef = CGDataProviderCreateWithData(NULL, screenBuffer,
> w * 4 * h, NULL);
It would be better not to change the DisplayState surface from
cocoa\sdl\vnc but try to render the format exposed by the emulated
graphic card ourself.
In fact in most cases the emulated vga exposes a 32bpp surface with
linesize = width * 4, so you don't need to force it yourself.
The only exception is the 16bpp case, but you should be able to render
that as well without too many problems.
> 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;
>
> + register_displaychangelistener(ds, dcl);
> +
> // give window a initial Size
> - cocoa_resize(ds, 640, 400);
> + cocoa_resize(ds);
>
The initialization seems correct, the call to cocoa_resize may be
unnecessary.