summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Persch <chpe@gnome.org>2011-11-26 22:18:17 +0100
committerChristian Persch <chpe@gnome.org>2011-11-26 22:25:22 +0100
commit0b8f017df3fe4d1975efad610f9afcce8a94f8e3 (patch)
tree238a1240234f759311ffe46ad1ad4b0ceee9b3e6
parent552996258212827075a8f192ab81764cd591a939 (diff)
downloadlibrsvg-0b8f017df3fe4d1975efad610f9afcce8a94f8e3.tar.gz
Add rsvg_get_surface_of_node
Similar to rsvg_get_pixbuf_of_node except that it returns a cairo_surface_t.
-rw-r--r--rsvg-base.c6
-rw-r--r--rsvg-cairo-clip.c1
-rw-r--r--rsvg-cairo-draw.c35
-rw-r--r--rsvg-cairo-draw.h2
-rw-r--r--rsvg-cairo-render.c2
-rw-r--r--rsvg-private.h4
6 files changed, 49 insertions, 1 deletions
diff --git a/rsvg-base.c b/rsvg-base.c
index d61789da..6618298d 100644
--- a/rsvg-base.c
+++ b/rsvg-base.c
@@ -1974,6 +1974,12 @@ rsvg_get_image_of_node (RsvgDrawingCtx * ctx, RsvgNode * drawable, double w, dou
return ctx->render->get_image_of_node (ctx, drawable, w, h);
}
+cairo_surface_t *
+rsvg_get_surface_of_node (RsvgDrawingCtx * ctx, RsvgNode * drawable, double w, double h)
+{
+ return ctx->render->get_surface_of_node (ctx, drawable, w, h);
+}
+
void
rsvg_render_free (RsvgRender * render)
{
diff --git a/rsvg-cairo-clip.c b/rsvg-cairo-clip.c
index 5f078d9a..f634574c 100644
--- a/rsvg-cairo-clip.c
+++ b/rsvg-cairo-clip.c
@@ -127,6 +127,7 @@ rsvg_cairo_clip_render_new (cairo_t * cr, RsvgCairoRender *parent)
render->push_discrete_layer = rsvg_cairo_clip_push_discrete_layer;
render->add_clipping_rect = rsvg_cairo_clip_add_clipping_rect;
render->get_image_of_node = NULL;
+ render->get_surface_of_node = NULL;
cairo_render->initial_cr = parent->cr;
cairo_render->cr = cr;
clip_render->parent = parent;
diff --git a/rsvg-cairo-draw.c b/rsvg-cairo-draw.c
index a086bded..2611f883 100644
--- a/rsvg-cairo-draw.c
+++ b/rsvg-cairo-draw.c
@@ -995,6 +995,41 @@ rsvg_cairo_get_image_of_node (RsvgDrawingCtx * ctx,
return img;
}
+cairo_surface_t *
+rsvg_cairo_get_surface_of_node (RsvgDrawingCtx *ctx,
+ RsvgNode *drawable,
+ double width,
+ double height)
+{
+ cairo_surface_t *surface;
+ cairo_t *cr;
+
+ RsvgCairoRender *save_render = (RsvgCairoRender *) ctx->render;
+ RsvgCairoRender *render;
+
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+ if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS) {
+ cairo_surface_destroy (surface);
+ return NULL;
+ }
+
+ cr = cairo_create (surface);
+
+ render = rsvg_cairo_render_new (cr, width, height);
+ ctx->render = (RsvgRender *) render;
+
+ rsvg_state_push (ctx);
+ rsvg_node_draw (drawable, ctx, 0);
+ rsvg_state_pop (ctx);
+
+ cairo_destroy (cr);
+
+ rsvg_render_free (ctx->render);
+ ctx->render = (RsvgRender *) save_render;
+
+ return surface;
+}
+
void
rsvg_cairo_to_pixbuf (guint8 * pixels, int rowstride, int height)
{
diff --git a/rsvg-cairo-draw.h b/rsvg-cairo-draw.h
index c1644988..1728d1ca 100644
--- a/rsvg-cairo-draw.h
+++ b/rsvg-cairo-draw.h
@@ -46,6 +46,8 @@ void rsvg_cairo_add_clipping_rect (RsvgDrawingCtx *ctx,
GdkPixbuf *rsvg_cairo_get_image_of_node (RsvgDrawingCtx *ctx, RsvgNode *drawable,
double width, double height);
+cairo_surface_t*rsvg_cairo_get_surface_of_node (RsvgDrawingCtx *ctx, RsvgNode *drawable,
+ double width, double height);
void rsvg_cairo_to_pixbuf (guint8 * pixels, int rowstride, int height);
void rsvg_pixbuf_to_cairo (guint8 * pixels, int rowstride, int height);
diff --git a/rsvg-cairo-render.c b/rsvg-cairo-render.c
index 8edf768e..afbfb5f3 100644
--- a/rsvg-cairo-render.c
+++ b/rsvg-cairo-render.c
@@ -32,6 +32,7 @@
#include <string.h>
#include "rsvg.h"
+#include "rsvg-private.h"
#include "rsvg-cairo.h"
#include "rsvg-cairo-draw.h"
#include "rsvg-cairo-render.h"
@@ -63,6 +64,7 @@ rsvg_cairo_render_new (cairo_t * cr, double width, double height)
cairo_render->super.push_discrete_layer = rsvg_cairo_push_discrete_layer;
cairo_render->super.add_clipping_rect = rsvg_cairo_add_clipping_rect;
cairo_render->super.get_image_of_node = rsvg_cairo_get_image_of_node;
+ cairo_render->super.get_surface_of_node = rsvg_cairo_get_surface_of_node;
cairo_render->width = width;
cairo_render->height = height;
cairo_render->offset_x = 0;
diff --git a/rsvg-private.h b/rsvg-private.h
index c39d1e72..dee875fc 100644
--- a/rsvg-private.h
+++ b/rsvg-private.h
@@ -224,6 +224,8 @@ struct RsvgRender {
double w, double h);
GdkPixbuf *(*get_image_of_node) (RsvgDrawingCtx * ctx, RsvgNode * drawable,
double w, double h);
+ cairo_surface_t *(*get_surface_of_node) (RsvgDrawingCtx * ctx, RsvgNode * drawable,
+ double w, double h);
};
static inline RsvgRender *
@@ -379,7 +381,7 @@ void rsvg_render_image (RsvgDrawingCtx * ctx, GdkPixbuf * pb,
void rsvg_render_free (RsvgRender * render);
void rsvg_add_clipping_rect (RsvgDrawingCtx * ctx, double x, double y, double w, double h);
GdkPixbuf *rsvg_get_image_of_node (RsvgDrawingCtx * ctx, RsvgNode * drawable, double w, double h);
-
+cairo_surface_t *rsvg_get_surface_of_node (RsvgDrawingCtx * ctx, RsvgNode * drawable, double w, double h);
void rsvg_node_set_atts (RsvgNode * node, RsvgHandle * ctx, RsvgPropertyBag * atts);