#include #include #include #include static const cairo_user_data_key_t _key; #if CAIRO_HAS_XLIB_XRENDER_SURFACE #include #include static Display * _get_display (void) { static Display *dpy; if (dpy != NULL) return dpy; dpy = XOpenDisplay (NULL); if (dpy == NULL) { fprintf (stderr, "Failed to open display.\n"); exit (1); } return dpy; } static void _destroy_window (void *closure) { XFlush (_get_display ()); XDestroyWindow (_get_display(), (Window) closure); } static cairo_surface_t * _surface_create (void *closure, double width, double height) { Display *dpy; Visual *visual; XRenderPictFormat *xrender_format; XSetWindowAttributes attr; Window w; cairo_surface_t *surface; dpy = _get_display (); visual = DefaultVisual (dpy, DefaultScreen (dpy)); xrender_format = XRenderFindVisualFormat (dpy, visual); if (xrender_format == NULL) { fprintf (stderr, "X server does not have the Render extension.\n"); exit (1); } attr.override_redirect = True; w = XCreateWindow (dpy, DefaultRootWindow (dpy), 0, 0, width <= 0 ? 1 : width, height <= 0 ? 1 : height, 0, xrender_format->depth, InputOutput, visual, CWOverrideRedirect, &attr); XMapWindow (dpy, w); surface = cairo_xlib_surface_create_with_xrender_format (dpy, w, DefaultScreenOfDisplay (dpy), xrender_format, width, height); cairo_surface_set_user_data (surface, &_key, (void *) w, _destroy_window); return surface; } #else /* fallback: just use an image surface */ static cairo_surface_t * _surface_create (void *closure, double width, double height) { return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); } #endif int main (int argc, char **argv) { cairo_script_interpreter_t *csi; const cairo_script_interpreter_hooks_t hooks = { .surface_create = _surface_create }; int i; csi = cairo_script_interpreter_create (); cairo_script_interpreter_install_hooks (csi, &hooks); for (i = 1; i < argc; i++) cairo_script_interpreter_run (csi, argv[i]); return cairo_script_interpreter_destroy (csi); }