diff options
Diffstat (limited to 'android/display.c')
-rw-r--r-- | android/display.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/android/display.c b/android/display.c new file mode 100644 index 0000000..0cfd98d --- /dev/null +++ b/android/display.c @@ -0,0 +1,102 @@ +/* Copyright (C) 2010 The Android Open Source Project +** +** This software is licensed under the terms of the GNU General Public +** License version 2, as published by the Free Software Foundation, and +** may be copied, distributed, and modified under those terms. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +*/ + +/* Initialization of the Android-specific DisplayState. + * Read docs/DISPLAY-STATE.TXT to understand what this + * is supposed to do. + */ +#include "android/display.h" + +/* + +TECHNICAL NOTE: + +DisplayState <--> QFrameBuffer <--> QEmulator/SDL + +*/ + +/* QFrameBuffer producer callbacks */ + +/* this is called periodically by the GUI timer to check for updates + * and poll user events. Use vga_hw_update(). + */ +static void +android_display_producer_check(void *opaque) +{ + /* core: call vga_hw_update(). this will eventually + * lead to calls to android_display_update() + */ + (void)opaque; + vga_hw_update(); +} + +static void +android_display_producer_invalidate(void *opaque) +{ + (void)opaque; + vga_hw_invalidate(); +} + +/* QFrameBuffer client callbacks */ + +/* this is called from dpy_update() each time a hardware framebuffer + * rectangular update was detected. Send this to the QFrameBuffer. + */ +static void +android_display_update(DisplayState *ds, int x, int y, int w, int h) +{ + QFrameBuffer* qfbuff = ds->opaque; + qframebuffer_update(qfbuff, x, y, w, h); +} + +static void +android_display_resize(DisplayState *ds) +{ + QFrameBuffer* qfbuff = ds->opaque; + qframebuffer_rotate(qfbuff, 0); +} + +static void +android_display_refresh(DisplayState *ds) +{ + QFrameBuffer* qfbuff = ds->opaque; + qframebuffer_poll(qfbuff); +} + + +void android_display_init(DisplayState* ds, QFrameBuffer* qf) +{ + DisplayChangeListener* dcl; + + qframebuffer_set_producer(qf, ds, + android_display_producer_check, + android_display_producer_invalidate, + NULL); // detach + + /* Replace the display surface with one with the right dimensions */ + qemu_free_displaysurface(ds); + ds->opaque = qf; + ds->surface = qemu_create_displaysurface_from(qf->width, + qf->height, + 16, + qf->pitch, + qf->pixels); + + /* Register a change listener for it */ + dcl = (DisplayChangeListener *) qemu_mallocz(sizeof(DisplayChangeListener)); + dcl->dpy_update = android_display_update; + dcl->dpy_resize = android_display_resize; + dcl->dpy_refresh = android_display_refresh; + dcl->dpy_text_cursor = NULL; + + register_displaychangelistener(ds, dcl); +} |