diff options
author | Federico Mena Quintero <federico@gnome.org> | 2017-09-25 19:36:46 -0500 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2017-09-25 19:40:02 -0500 |
commit | ecb670f459069a8ec7c18cb3f8b451d0c06d17e4 (patch) | |
tree | a59e37a39f8df1a18011bff7db5092a72ab24a80 | |
parent | 6c66c98e2d529372db180b32d1a5a7199547174e (diff) | |
download | librsvg-ecb670f459069a8ec7c18cb3f8b451d0c06d17e4.tar.gz |
Move utility function in rsvg-image.[ch] to rsvg-base.c.
With this, rsvg-image.[ch] are no more. Yay!
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | rsvg-base.c | 77 | ||||
-rw-r--r-- | rsvg-cairo-draw.c | 1 | ||||
-rw-r--r-- | rsvg-filter.c | 1 | ||||
-rw-r--r-- | rsvg-paint-server.c | 1 | ||||
-rw-r--r-- | rsvg-private.h | 3 | ||||
-rw-r--r-- | rsvg-structure.h | 4 | ||||
-rw-r--r-- | rsvg.c | 1 |
8 files changed, 83 insertions, 7 deletions
diff --git a/Makefile.am b/Makefile.am index 3525902c..ae3f1c91 100644 --- a/Makefile.am +++ b/Makefile.am @@ -26,8 +26,6 @@ librsvg_@RSVG_API_MAJOR_VERSION@_la_SOURCES = \ rsvg-compat.h \ rsvg-defs.c \ rsvg-defs.h \ - rsvg-image.c \ - rsvg-image.h \ rsvg-io.c \ rsvg-io.h \ rsvg-paint-server.c \ diff --git a/rsvg-base.c b/rsvg-base.c index 392344d6..2917f6c1 100644 --- a/rsvg-base.c +++ b/rsvg-base.c @@ -33,7 +33,6 @@ #include "rsvg-styles.h" #include "rsvg-shapes.h" #include "rsvg-structure.h" -#include "rsvg-image.h" #include "rsvg-io.h" #include "rsvg-text.h" #include "rsvg-filter.h" @@ -2441,6 +2440,82 @@ rsvg_get_surface_of_node (RsvgDrawingCtx * ctx, RsvgNode * drawable, double w, d return ctx->render->get_surface_of_node (ctx, drawable, w, h); } +cairo_surface_t * +rsvg_cairo_surface_new_from_href (RsvgHandle *handle, + const char *href, + GError **error) +{ + char *data; + gsize data_len; + char *mime_type = NULL; + GdkPixbufLoader *loader = NULL; + GdkPixbuf *pixbuf = NULL; + cairo_surface_t *surface = NULL; + + data = _rsvg_handle_acquire_data (handle, href, &mime_type, &data_len, error); + if (data == NULL) + return NULL; + + if (mime_type) { + loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, error); + } else { + loader = gdk_pixbuf_loader_new (); + } + + if (loader == NULL) + goto out; + + if (!gdk_pixbuf_loader_write (loader, (guchar *) data, data_len, error)) { + gdk_pixbuf_loader_close (loader, NULL); + goto out; + } + + if (!gdk_pixbuf_loader_close (loader, error)) + goto out; + + pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); + + if (!pixbuf) { + g_set_error (error, + GDK_PIXBUF_ERROR, + GDK_PIXBUF_ERROR_FAILED, + _("Failed to load image '%s': reason not known, probably a corrupt image file"), + href); + goto out; + } + + surface = rsvg_cairo_surface_from_pixbuf (pixbuf); + + if (mime_type == NULL) { + /* Try to get the information from the loader */ + GdkPixbufFormat *format; + char **mime_types; + + if ((format = gdk_pixbuf_loader_get_format (loader)) != NULL) { + mime_types = gdk_pixbuf_format_get_mime_types (format); + + if (mime_types != NULL) + mime_type = g_strdup (mime_types[0]); + g_strfreev (mime_types); + } + } + + if ((handle->priv->flags & RSVG_HANDLE_FLAG_KEEP_IMAGE_DATA) != 0 && + mime_type != NULL && + cairo_surface_set_mime_data (surface, mime_type, (guchar *) data, + data_len, g_free, data) == CAIRO_STATUS_SUCCESS) { + data = NULL; /* transferred to the surface */ + } + + out: + if (loader) + g_object_unref (loader); + g_free (mime_type); + g_free (data); + + return surface; +} + void rsvg_render_free (RsvgRender * render) { diff --git a/rsvg-cairo-draw.c b/rsvg-cairo-draw.c index 83449d25..d456a6bd 100644 --- a/rsvg-cairo-draw.c +++ b/rsvg-cairo-draw.c @@ -36,7 +36,6 @@ #include "rsvg-path-builder.h" #include "rsvg-filter.h" #include "rsvg-structure.h" -#include "rsvg-image.h" #include <math.h> #include <string.h> diff --git a/rsvg-filter.c b/rsvg-filter.c index e6e41d6b..07f8d594 100644 --- a/rsvg-filter.c +++ b/rsvg-filter.c @@ -28,7 +28,6 @@ #include "rsvg-private.h" #include "rsvg-filter.h" #include "rsvg-styles.h" -#include "rsvg-image.h" #include "rsvg-css.h" #include "rsvg-cairo-render.h" diff --git a/rsvg-paint-server.c b/rsvg-paint-server.c index ab418d94..c3db4ba0 100644 --- a/rsvg-paint-server.c +++ b/rsvg-paint-server.c @@ -28,7 +28,6 @@ #include "rsvg-defs.h" #include "rsvg-paint-server.h" #include "rsvg-styles.h" -#include "rsvg-image.h" #include <glib.h> #include <string.h> diff --git a/rsvg-private.h b/rsvg-private.h index fa683586..8d75bb02 100644 --- a/rsvg-private.h +++ b/rsvg-private.h @@ -496,6 +496,9 @@ G_GNUC_INTERNAL cairo_surface_t *rsvg_get_surface_of_node (RsvgDrawingCtx * ctx, RsvgNode * drawable, double w, double h); G_GNUC_INTERNAL +cairo_surface_t *rsvg_cairo_surface_new_from_href (RsvgHandle *handle, const char *href, GError ** error); + +G_GNUC_INTERNAL void rsvg_drawing_ctx_free (RsvgDrawingCtx * handle); /* Implemented in rust/src/bbox.rs */ diff --git a/rsvg-structure.h b/rsvg-structure.h index 8b70a4cf..356f448d 100644 --- a/rsvg-structure.h +++ b/rsvg-structure.h @@ -58,6 +58,10 @@ RsvgNode *rsvg_node_use_new (const char *element_name, RsvgNode *parent); G_GNUC_INTERNAL RsvgNode *rsvg_node_symbol_new (const char *element_name, RsvgNode *parent); +/* Implemented in rust/src/image.rs */ +G_GNUC_INTERNAL +RsvgNode *rsvg_node_image_new (const char *element_name, RsvgNode *parent); + /* Implemented in rust/src/structure.rs */ G_GNUC_INTERNAL void rsvg_node_svg_get_size (RsvgNode *node, RsvgLength *out_width, RsvgLength *out_height); @@ -30,7 +30,6 @@ #include "rsvg-css.h" #include "rsvg-styles.h" #include "rsvg-shapes.h" -#include "rsvg-image.h" #include "rsvg-text.h" #include "rsvg-filter.h" #include "rsvg-mask.h" |