diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2007-04-19 22:13:08 -0400 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2007-04-20 00:52:02 -0400 |
commit | 65f636649d54348722354b2400c3a191309da0e1 (patch) | |
tree | 2f6e80f4603372dfcb4e5031ceb30ae75d73a127 /boilerplate/cairo-boilerplate-svg.c | |
parent | 8c9960675b82978acbd5a85ef358c674c3407ee3 (diff) | |
download | cairo-65f636649d54348722354b2400c3a191309da0e1.tar.gz |
[boilerplate] Strip svg boilerplate into cairo-boilerplate-svg*
Diffstat (limited to 'boilerplate/cairo-boilerplate-svg.c')
-rw-r--r-- | boilerplate/cairo-boilerplate-svg.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/boilerplate/cairo-boilerplate-svg.c b/boilerplate/cairo-boilerplate-svg.c new file mode 100644 index 000000000..819303198 --- /dev/null +++ b/boilerplate/cairo-boilerplate-svg.c @@ -0,0 +1,129 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#include "cairo-boilerplate.h" +#include "cairo-boilerplate-svg-private.h" + +#include "cairo-svg.h" + +cairo_user_data_key_t svg_closure_key; + +typedef struct _svg_target_closure +{ + char *filename; + int width, height; + cairo_surface_t *target; +} svg_target_closure_t; + +cairo_surface_t * +_cairo_boilerplate_svg_create_surface (const char *name, + cairo_content_t content, + int width, + int height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + svg_target_closure_t *ptc; + cairo_surface_t *surface; + + *closure = ptc = xmalloc (sizeof (svg_target_closure_t)); + + ptc->width = width; + ptc->height = height; + + xasprintf (&ptc->filename, "%s-svg-%s-out.svg", + name, cairo_boilerplate_content_name (content)); + + surface = cairo_svg_surface_create (ptc->filename, width, height); + if (cairo_surface_status (surface)) { + free (ptc->filename); + free (ptc); + return NULL; + } + cairo_surface_set_fallback_resolution (surface, 72., 72.); + + if (content == CAIRO_CONTENT_COLOR) { + ptc->target = surface; + surface = cairo_surface_create_similar (ptc->target, + CAIRO_CONTENT_COLOR, + width, height); + } else { + ptc->target = NULL; + } + + cairo_boilerplate_surface_set_user_data (surface, + &svg_closure_key, + ptc, NULL); + + return surface; +} + +cairo_status_t +_cairo_boilerplate_svg_surface_write_to_png (cairo_surface_t *surface, const char *filename) +{ + svg_target_closure_t *ptc = cairo_surface_get_user_data (surface, &svg_closure_key); + char command[4096]; + + /* Both surface and ptc->target were originally created at the + * same dimensions. We want a 1:1 copy here, so we first clear any + * device offset on surface. + * + * In a more realistic use case of device offsets, the target of + * this copying would be of a different size than the source, and + * the offset would be desirable during the copy operation. */ + cairo_surface_set_device_offset (surface, 0, 0); + + if (ptc->target) { + cairo_t *cr; + cr = cairo_create (ptc->target); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + cairo_show_page (cr); + cairo_destroy (cr); + + cairo_surface_finish (surface); + surface = ptc->target; + } + + cairo_surface_finish (surface); + sprintf (command, "./svg2png %s %s", + ptc->filename, filename); + + if (system (command) != 0) + return CAIRO_STATUS_WRITE_ERROR; + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_boilerplate_svg_cleanup (void *closure) +{ + svg_target_closure_t *ptc = closure; + if (ptc->target) + cairo_surface_destroy (ptc->target); + free (ptc->filename); + free (ptc); +} |