summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-08-18 08:27:04 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-08-18 09:20:54 +0100
commitbff332662ef91b2cf77acb7ea7cbd7dc497b1f04 (patch)
tree745199bebfb9576a834709d9df88f0f24aa55352
parent0a0a4f6afb499dff9552b6b9f767e0fed3f8750c (diff)
ximage: Add a couple of variations for means of presentation
-rw-r--r--ximage.c78
1 files changed, 64 insertions, 14 deletions
diff --git a/ximage.c b/ximage.c
index 071376a..a3de2b0 100644
--- a/ximage.c
+++ b/ximage.c
@@ -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;
}