static int rsvg_defs_load_extern (const RsvgDefs * defs, const char *name) { RsvgHandle *handle; gchar *filename, *base_uri; GByteArray *chars; filename = rsvg_get_file_path (name, defs->base_uri); chars = _rsvg_acquire_xlink_href_resource (name, defs->base_uri, NULL); if (chars) { handle = rsvg_handle_new (); base_uri = rsvg_get_base_uri_from_filename (filename); rsvg_handle_set_base_uri (handle, base_uri); g_free (base_uri); if (rsvg_handle_write (handle, chars->data, chars->len, NULL) && rsvg_handle_close (handle, NULL)) { g_hash_table_insert (defs->externs, g_strdup (name), handle); } g_byte_array_free (chars, TRUE); } g_free (filename); return 0; }
static void draw_page (GtkPrintOperation *operation, GtkPrintContext *context, gint page_nr, gpointer user_data) { ViewerCbInfo *info = (ViewerCbInfo *) user_data; cairo_t *cr; gdouble page_width, page_height; cr = gtk_print_context_get_cairo_context (context); page_width = gtk_print_context_get_width (context); page_height = gtk_print_context_get_height (context); { RsvgHandle *handle; RsvgDimensionData svg_dimensions; struct RsvgSizeCallbackData size_data; /* should not fail */ handle = rsvg_handle_new_from_data(info->svg_bytes->data, info->svg_bytes->len, NULL); rsvg_handle_set_base_uri (handle, info->base_uri); rsvg_handle_set_dpi_x_y (handle, gtk_print_context_get_dpi_x(context), gtk_print_context_get_dpi_y(context)); rsvg_handle_get_dimensions(handle, &svg_dimensions); if (svg_dimensions.width > page_width || svg_dimensions.height > page_height) { /* scale down the image to the page's size, while preserving the aspect ratio */ if ((double) svg_dimensions.height * (double) page_width > (double) svg_dimensions.width * (double) page_height) { svg_dimensions.width = 0.5 + (double) svg_dimensions.width *(double) page_height / (double) svg_dimensions.height; svg_dimensions.height = page_height; } else { svg_dimensions.height = 0.5 + (double) svg_dimensions.height *(double) page_width / (double) svg_dimensions.width; svg_dimensions.width = page_width; } } size_data.type = RSVG_SIZE_WH; size_data.width = svg_dimensions.width; size_data.height = svg_dimensions.height; size_data.keep_aspect_ratio = FALSE; rsvg_handle_set_size_callback (handle, _rsvg_size_callback, &size_data, NULL); rsvg_handle_render_cairo(handle, cr); g_object_unref (handle); } }
static void set_property (GObject * instance, guint prop_id, GValue const *value, GParamSpec * pspec) { RsvgHandle *self = RSVG_HANDLE (instance); switch (prop_id) { case PROP_DPI_X: rsvg_handle_set_dpi_x_y (self, g_value_get_double (value), self->priv->dpi_y); break; case PROP_DPI_Y: rsvg_handle_set_dpi_x_y (self, self->priv->dpi_x, g_value_get_double (value)); break; case PROP_BASE_URI: rsvg_handle_set_base_uri (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (instance, prop_id, pspec); } }
static GdkPixbuf * pixbuf_from_data_with_size_data (const guchar * buff, size_t len, struct RsvgSizeCallbackData *data, const char *base_uri, const char *id, GError ** error) { RsvgHandle *handle; GdkPixbuf *retval; handle = rsvg_handle_new (); if (!handle) { g_set_error (error, rsvg_error_quark (), 0, _("Error creating SVG reader")); return NULL; } rsvg_handle_set_size_callback (handle, _rsvg_size_callback, data, NULL); rsvg_handle_set_base_uri (handle, base_uri); if (!rsvg_handle_write (handle, buff, len, error)) { g_object_unref (G_OBJECT (handle)); return NULL; } if (!rsvg_handle_close (handle, error)) { g_object_unref (G_OBJECT (handle)); return NULL; } retval = rsvg_handle_get_pixbuf_sub (handle, id); g_object_unref (G_OBJECT (handle)); return retval; }
/* This function renders a pixbuf from an SVG file according to vals. */ static GdkPixbuf * load_rsvg_pixbuf (const gchar *filename, SvgLoadVals *vals, GError **error) { GdkPixbuf *pixbuf = NULL; RsvgHandle *handle; GIOChannel *io; gchar *uri; GIOStatus status = G_IO_STATUS_NORMAL; gboolean success = TRUE; io = g_io_channel_new_file (filename, "r", error); if (!io) return NULL; g_io_channel_set_encoding (io, NULL, NULL); handle = rsvg_handle_new (); rsvg_handle_set_dpi (handle, vals->resolution); /* set the base URI so that librsvg can resolve relative paths */ uri = g_filename_to_uri (filename, NULL, NULL); if (uri) { gchar *p = strrchr (uri, '/'); if (p) *p = '\0'; rsvg_handle_set_base_uri (handle, uri); g_free (uri); } rsvg_handle_set_size_callback (handle, load_set_size_callback, vals, NULL); while (success && status != G_IO_STATUS_EOF) { gchar buf[8192]; gsize len; status = g_io_channel_read_chars (io, buf, sizeof (buf), &len, error); switch (status) { case G_IO_STATUS_ERROR: success = FALSE; break; case G_IO_STATUS_EOF: success = rsvg_handle_close (handle, error); break; case G_IO_STATUS_NORMAL: success = rsvg_handle_write (handle, (const guchar *) buf, len, error); break; case G_IO_STATUS_AGAIN: break; } } g_io_channel_unref (io); if (success) pixbuf = rsvg_handle_get_pixbuf (handle); g_object_unref (handle); return pixbuf; }
static VALUE rb_rsvg_handle_set_base_uri(VALUE self, VALUE base_uri) { rsvg_handle_set_base_uri(_SELF(self), RVAL2CSTR(base_uri)); return self; }