diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-08-18 08:27:04 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-08-18 09:20:54 +0100 |
commit | bff332662ef91b2cf77acb7ea7cbd7dc497b1f04 (patch) | |
tree | 745199bebfb9576a834709d9df88f0f24aa55352 | |
parent | 0a0a4f6afb499dff9552b6b9f767e0fed3f8750c (diff) |
ximage: Add a couple of variations for means of presentation
-rw-r--r-- | ximage.c | 78 |
1 files changed, 64 insertions, 14 deletions
@@ -4,6 +4,7 @@ #include <stdlib.h> #include <stdio.h> +#include <string.h> struct ximage_device { struct device base; @@ -15,15 +16,25 @@ destroy (struct framebuffer *abstract_framebuffer) { } +static void flush (struct ximage_device *device) +{ + cairo_surface_flush (device->base.scanout); + XFlush (cairo_xlib_surface_get_display (device->base.scanout)); +} + static void show (struct framebuffer *fb) { struct ximage_device *device = (struct ximage_device *) fb->device; - cairo_t *cr = cairo_create (device->base.scanout); + cairo_t *cr; + + cr = cairo_create (device->base.scanout); cairo_set_source_surface (cr, fb->surface, 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint (cr); cairo_destroy (cr); + + flush (device); } static struct framebuffer * @@ -33,6 +44,23 @@ get_fb (struct device *abstract_device) return &device->fb; } +static void +inplace_show (struct framebuffer *fb) +{ + struct ximage_device *device = (struct ximage_device *) fb->device; + cairo_surface_unmap_image (device->base.scanout, fb->surface); + + flush (device); +} + +static struct framebuffer * +get_inplace_fb (struct device *abstract_device) +{ + struct ximage_device *device = (struct ximage_device *) abstract_device; + device->fb.surface = cairo_surface_map_to_image (device->base.scanout, NULL); + return &device->fb; +} + struct device * ximage_open (int argc, char **argv) { @@ -42,15 +70,24 @@ ximage_open (int argc, char **argv) Window win; int screen; XSetWindowAttributes attr; + int i, similar, map; int x, y; + similar = 0; + map = 0; + for (i = 1; i < argc; i++) { + if (strcmp (argv[i], "--similar") == 0) + similar = cairo_version () >= CAIRO_VERSION_ENCODE (1, 12, 0); + else if (strcmp (argv[i], "--map") == 0) + map = cairo_version () >= CAIRO_VERSION_ENCODE (1, 12, 0); + } + dpy = XOpenDisplay (NULL); if (dpy == NULL) return NULL; device = (struct ximage_device *) malloc (sizeof (struct ximage_device)); device->base.name = "ximage"; - device->base.get_framebuffer = get_fb; screen = DefaultScreen (dpy); scr = XScreenOfDisplay (dpy, screen); @@ -102,19 +139,32 @@ ximage_open (int argc, char **argv) DefaultVisual (dpy, screen), CWOverrideRedirect, &attr); XMapWindow (dpy, win); - - device->base.scanout = cairo_xlib_surface_create (dpy, win, - DefaultVisual (dpy, screen), - device->base.width, device->base.height); - - device->fb.surface = - cairo_surface_create_similar_image (device->base.scanout, - CAIRO_FORMAT_RGB24, - device->base.width, device->base.height); - - device->fb.device = &device->base; - device->fb.show = show; + XFlush (dpy); + + device->base.scanout = + cairo_xlib_surface_create (dpy, win, + DefaultVisual (dpy, screen), + device->base.width, device->base.height); + + if (map) { + device->fb.show = inplace_show; + device->base.get_framebuffer = get_inplace_fb; + } else { + if (similar) + device->fb.surface = + cairo_surface_create_similar_image (device->base.scanout, + CAIRO_FORMAT_RGB24, + device->base.width, device->base.height); + else + device->fb.surface = + cairo_image_surface_create (CAIRO_FORMAT_RGB24, + device->base.width, device->base.height); + + device->fb.show = show; + device->base.get_framebuffer = get_fb; + } device->fb.destroy = destroy; + device->fb.device = &device->base; return &device->base; } |