summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2017-09-25 19:36:46 -0500
committerFederico Mena Quintero <federico@gnome.org>2017-09-25 19:40:02 -0500
commitecb670f459069a8ec7c18cb3f8b451d0c06d17e4 (patch)
treea59e37a39f8df1a18011bff7db5092a72ab24a80
parent6c66c98e2d529372db180b32d1a5a7199547174e (diff)
downloadlibrsvg-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.am2
-rw-r--r--rsvg-base.c77
-rw-r--r--rsvg-cairo-draw.c1
-rw-r--r--rsvg-filter.c1
-rw-r--r--rsvg-paint-server.c1
-rw-r--r--rsvg-private.h3
-rw-r--r--rsvg-structure.h4
-rw-r--r--rsvg.c1
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);
diff --git a/rsvg.c b/rsvg.c
index 10045366..8c993410 100644
--- a/rsvg.c
+++ b/rsvg.c
@@ -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"