[librsvg] Move utility function in rsvg-image.[ch] to rsvg-base.c.



commit ecb670f459069a8ec7c18cb3f8b451d0c06d17e4
Author: Federico Mena Quintero <federico gnome org>
Date:   Mon Sep 25 19:36:46 2017 -0500

    Move utility function in rsvg-image.[ch] to rsvg-base.c.
    
    With this, rsvg-image.[ch] are no more.  Yay!

 Makefile.am         |    2 -
 rsvg-base.c         |   77 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 rsvg-cairo-draw.c   |    1 -
 rsvg-filter.c       |    1 -
 rsvg-paint-server.c |    1 -
 rsvg-private.h      |    3 ++
 rsvg-structure.h    |    4 ++
 rsvg.c              |    1 -
 8 files changed, 83 insertions(+), 7 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 3525902..ae3f1c9 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 392344d..2917f6c 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 83449d2..d456a6b 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 e6e41d6..07f8d59 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 ab418d9..c3db4ba 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 fa68358..8d75bb0 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 8b70a4c..356f448 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 1004536..8c99341 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"


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]