diff options
Diffstat (limited to 'csi-trace.c')
-rw-r--r-- | csi-trace.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/csi-trace.c b/csi-trace.c new file mode 100644 index 0000000..f3474bf --- /dev/null +++ b/csi-trace.c @@ -0,0 +1,80 @@ +#include <cairo-script.h> +#include <cairo-script-interpreter.h> + +#include <stdio.h> +#include <math.h> +#include <setjmp.h> +#include <time.h> + +static jmp_buf jmp; +static time_t timeout; + +static cairo_format_t +format_from_content (cairo_content_t content) +{ + switch (content) { + case CAIRO_CONTENT_ALPHA: return CAIRO_FORMAT_A8; + case CAIRO_CONTENT_COLOR: return CAIRO_FORMAT_RGB24; + default: + case CAIRO_CONTENT_COLOR_ALPHA: return CAIRO_FORMAT_ARGB32; + } +} + +static cairo_surface_t * +_script_surface_create (void *closure, + cairo_content_t content, + double width, double height) +{ + cairo_surface_t *surface, *image; + cairo_rectangle_t extents; + + if (timeout && time (NULL) > timeout) + longjmp (jmp, 1); + + /* use a image target so that we can use this surface as a source */ + image = cairo_image_surface_create (format_from_content (content), + ceil (width), ceil (height)); + surface = cairo_script_surface_create_for_target (closure, image); + cairo_surface_destroy (image); + + return surface; +} + +static cairo_status_t +write (void *closure, const unsigned char *data, unsigned int length) +{ + if (fwrite (data, length, 1, closure) != 1) + return CAIRO_STATUS_WRITE_ERROR; + + return CAIRO_STATUS_SUCCESS; +} + +int +main (int argc, char **argv) +{ + const cairo_script_interpreter_hooks_t hooks = { + .closure = cairo_script_context_create_for_stream (write, stdout), + .surface_create = _script_surface_create, + }; + cairo_script_interpreter_t *csi; + int i; + + for (i = 1; i < argc; i++) { + if (strcmp (argv[i], "--trim") == 0) { + timeout = atoi (argv[i+1]); + i++; + } else if (strncmp (argv[i], "--trim=", 7) == 0) { + timeout = atoi (argv[i] + 7); + } + } + + if (timeout) + timeout += time (NULL); + + csi = cairo_script_interpreter_create (); + cairo_script_interpreter_install_hooks (csi, &hooks); + if (setjmp (jmp) == 0) + cairo_script_interpreter_feed_stream (csi, stdin); + cairo_script_context_destroy (hooks.closure); + return cairo_script_interpreter_destroy (csi); +} |