From: KONRAD Frederic <fred.kon...@greensocs.com>

This allows to create a surface with a different format than xrgb8888.

Signed-off-by: KONRAD Frederic <fred.kon...@greensocs.com>
Cc: Gerd Hoffmann <kra...@redhat.com>
---
 include/ui/console.h |  2 ++
 ui/console.c         | 25 ++++++++++++++++++++++---
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/include/ui/console.h b/include/ui/console.h
index e8b3a9e..e816182 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -206,6 +206,8 @@ DisplaySurface *qemu_create_displaysurface_guestmem(int 
width, int height,
 PixelFormat qemu_default_pixelformat(int bpp);
 
 DisplaySurface *qemu_create_displaysurface(int width, int height);
+DisplaySurface *qemu_create_displaysurface_format(pixman_format_code_t format,
+                                                  int width, int height);
 void qemu_free_displaysurface(DisplaySurface *surface);
 
 static inline int is_surface_bgr(DisplaySurface *surface)
diff --git a/ui/console.c b/ui/console.c
index 406c36b..5fc8473 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1226,20 +1226,29 @@ static QemuConsole *new_console(DisplayState *ds, 
console_type_t console_type,
     return s;
 }
 
-static void qemu_alloc_display(DisplaySurface *surface, int width, int height)
+static void qemu_alloc_display_format(DisplaySurface *surface,
+                                      pixman_format_code_t format,
+                                      int width, int height)
 {
     qemu_pixman_image_unref(surface->image);
     surface->image = NULL;
 
-    surface->format = PIXMAN_x8r8g8b8;
+    surface->format = format;
     surface->image = pixman_image_create_bits(surface->format,
                                               width, height,
-                                              NULL, width * 4);
+                                              NULL,
+                                              width * PIXMAN_FORMAT_BPP(format)
+                                                    / 8);
     assert(surface->image != NULL);
 
     surface->flags = QEMU_ALLOCATED_FLAG;
 }
 
+static void qemu_alloc_display(DisplaySurface *surface, int width, int height)
+{
+    qemu_alloc_display_format(surface, PIXMAN_x8r8g8b8, width, height);
+}
+
 DisplaySurface *qemu_create_displaysurface(int width, int height)
 {
     DisplaySurface *surface = g_new0(DisplaySurface, 1);
@@ -1249,6 +1258,16 @@ DisplaySurface *qemu_create_displaysurface(int width, 
int height)
     return surface;
 }
 
+DisplaySurface *qemu_create_displaysurface_format(pixman_format_code_t format,
+                                                  int width, int height)
+{
+    DisplaySurface *surface = g_new0(DisplaySurface, 1);
+
+    trace_displaysurface_create(surface, width, height);
+    qemu_alloc_display_format(surface, format, width, height);
+    return surface;
+}
+
 DisplaySurface *qemu_create_displaysurface_from(int width, int height,
                                                 pixman_format_code_t format,
                                                 int linesize, uint8_t *data)
-- 
1.9.0


Reply via email to