36
36
#include "rsvg-css.h"
40
rsvg_acquire_base64_resource (const char *data, GError ** error)
42
GByteArray *array = NULL;
43
gsize data_len, written_len;
47
rsvg_return_val_if_fail (data != NULL, NULL, error);
53
data_len = strlen (data);
54
array = g_byte_array_sized_new (data_len / 4 * 3);
55
written_len = g_base64_decode_step (data, data_len, array->data,
57
g_byte_array_set_size (array, written_len);
63
rsvg_get_file_path (const gchar * filename, const gchar * base_uri)
65
gchar *absolute_filename;
67
if (g_file_test (filename, G_FILE_TEST_EXISTS) || g_path_is_absolute (filename)) {
68
absolute_filename = g_strdup (filename);
40
rsvg_cairo_surface_new_from_href (RsvgHandle *handle,
46
char *mime_type = NULL;
47
GdkPixbufLoader *loader;
48
GdkPixbuf *pixbuf = NULL;
50
cairo_surface_t *surface;
52
data = _rsvg_handle_acquire_data (handle, href, &mime_type, &data_len, error);
57
loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, error);
74
base_filename = g_filename_from_uri (base_uri, NULL, NULL);
75
if (base_filename != NULL) {
76
tmpcdir = g_path_get_dirname (base_filename);
77
g_free (base_filename);
81
tmpcdir = g_get_current_dir ();
83
absolute_filename = g_build_filename (tmpcdir, filename, NULL);
87
return absolute_filename;
91
rsvg_acquire_file_resource (const char *filename, const char *base_uri, GError ** error)
98
rsvg_return_val_if_fail (filename != NULL, NULL, error);
100
path = rsvg_get_file_path (filename, base_uri);
104
if (!g_file_get_contents (path, &data, &length, error)) {
109
array = g_byte_array_new ();
111
g_byte_array_append (array, (guint8 *)data, length);
60
loader = gdk_pixbuf_loader_new ();
68
res = gdk_pixbuf_loader_write (loader, data, data_len, error);
119
rsvg_acquire_vfs_resource (const char *filename, const char *base_uri, GError ** error)
126
gboolean res = FALSE;
128
rsvg_return_val_if_fail (filename != NULL, NULL, error);
130
file = g_file_new_for_uri (filename);
132
if (!(res = g_file_load_contents (file, NULL, &data, &size, NULL, error))) {
133
if (base_uri != NULL) {
136
g_clear_error (error);
138
g_object_unref (file);
140
base = g_file_new_for_uri (base_uri);
141
file = g_file_resolve_relative_path (base, filename);
142
g_object_unref (base);
144
res = g_file_load_contents (file, NULL, &data, &size, NULL, error);
148
g_object_unref (file);
151
array = g_byte_array_new ();
153
g_byte_array_append (array, (guint8 *)data, size);
163
_rsvg_acquire_xlink_href_resource (const char *href, const char *base_uri, GError ** err)
165
GByteArray *arr = NULL;
167
if (!(href && *href))
170
if (!strncmp (href, "data:", 5))
171
arr = rsvg_acquire_base64_resource (href, NULL);
174
arr = rsvg_acquire_file_resource (href, base_uri, NULL);
177
arr = rsvg_acquire_vfs_resource (href, base_uri, NULL);
183
rsvg_pixbuf_new_from_href (const char *href, const char *base_uri, GError ** error)
187
arr = _rsvg_acquire_xlink_href_resource (href, base_uri, error);
189
GdkPixbufLoader *loader;
190
GdkPixbuf *pixbuf = NULL;
193
loader = gdk_pixbuf_loader_new ();
195
res = gdk_pixbuf_loader_write (loader, arr->data, arr->len, error);
196
g_byte_array_free (arr, TRUE);
199
gdk_pixbuf_loader_close (loader, NULL);
200
g_object_unref (loader);
204
if (!gdk_pixbuf_loader_close (loader, error)) {
205
g_object_unref (loader);
209
pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
212
g_object_unref (loader);
215
GDK_PIXBUF_ERROR_FAILED,
217
("Failed to load image '%s': reason not known, probably a corrupt image file"),
222
g_object_ref (pixbuf);
224
g_object_unref (loader);
72
gdk_pixbuf_loader_close (loader, NULL);
73
g_object_unref (loader);
77
if (!gdk_pixbuf_loader_close (loader, error)) {
78
g_object_unref (loader);
82
pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
85
g_object_unref (loader);
88
GDK_PIXBUF_ERROR_FAILED,
89
_("Failed to load image '%s': reason not known, probably a corrupt image file"),
94
surface = rsvg_cairo_surface_from_pixbuf (pixbuf);
96
g_object_unref (loader);
304
173
rsvg_add_clipping_rect (ctx, x, y, w, h);
307
rsvg_preserve_aspect_ratio (aspect_ratio, (double) gdk_pixbuf_get_width (img),
308
(double) gdk_pixbuf_get_height (img), &w, &h, &x, &y);
176
rsvg_preserve_aspect_ratio (aspect_ratio,
177
(double) cairo_image_surface_get_width (surface),
178
(double) cairo_image_surface_get_height (surface),
310
rsvg_render_image (ctx, img, x, y, w, h);
181
rsvg_render_surface (ctx, surface, x, y, w, h);
312
183
rsvg_pop_discrete_layer (ctx);