rsvg.c 3.67 KB
Newer Older
1 2
/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim: set sw=4 sts=4 expandtab: */
3
/*
4
   rsvg.c: SAX-based renderer for SVG files into a GdkPixbuf.
5

6
   Copyright (C) 2000 Eazel, Inc.
7
   Copyright (C) 2002-2005 Dom Lachowicz <cinamod@hotmail.com>
8

9
   This program is free software; you can redistribute it and/or
10
   modify it under the terms of the GNU Library General Public License as
11 12
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.
13

14 15 16
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
   Library General Public License for more details.
18

19
   You should have received a copy of the GNU Library General Public
20 21 22
   License along with this program; if not, write to the
   Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.
23

24 25 26
   Author: Raph Levien <raph@artofcode.com>
*/

27
#include "config.h"
28

29
#include "rsvg-private.h"
30 31 32 33
#include "rsvg-css.h"
#include "rsvg-styles.h"
#include "rsvg-shapes.h"
#include "rsvg-text.h"
34
#include "rsvg-filter.h"
35
#include "rsvg-mask.h"
36
#include "rsvg-marker.h"
37

38
#include <math.h>
39
#include <string.h>
Michael Meeks's avatar
Michael Meeks committed
40
#include <stdarg.h>
41

42
#include "rsvg-cairo.h"
Caleb Michael Moore's avatar
Caleb Michael Moore committed
43
#include "rsvg-cairo-draw.h"
44

Dom Lachowicz's avatar
Dom Lachowicz committed
45 46 47
/**
 * rsvg_handle_get_pixbuf_sub:
 * @handle: An #RsvgHandle
48 49 50
 * @id: (nullable): The id of an element inside the SVG, or %NULL to
 * render the whole SVG. For example, if you have a layer called
 * "layer1" that you wish to render, pass "##layer1" as the id.
Dom Lachowicz's avatar
Dom Lachowicz committed
51
 *
52
 * Returns the pixbuf loaded by @handle.  The pixbuf returned will be reffed, so
Dom Lachowicz's avatar
Dom Lachowicz committed
53 54 55 56 57
 * the caller of this function must assume that ref.  If insufficient data has
 * been read to create the pixbuf, or an error occurred in loading, then %NULL
 * will be returned.  Note that the pixbuf may not be complete until
 * @rsvg_handle_close has been called.
 *
58
 * Returns: (transfer full) (nullable): the pixbuf loaded by @handle, or %NULL.
59 60
 *
 * Since: 2.14
Dom Lachowicz's avatar
Dom Lachowicz committed
61
 **/
62
GdkPixbuf *
63
rsvg_handle_get_pixbuf_sub (RsvgHandle * handle, const char *id)
64
{
65 66 67 68
    RsvgDimensionData dimensions;
    GdkPixbuf *output = NULL;
    cairo_surface_t *surface;
    cairo_t *cr;
69

70
    g_return_val_if_fail (handle != NULL, NULL);
71

72
    if (handle->priv->state != RSVG_HANDLE_STATE_CLOSED_OK)
73
        return NULL;
74

75 76 77
    rsvg_handle_get_dimensions (handle, &dimensions);
    if (!(dimensions.width && dimensions.height))
        return NULL;
78

79 80 81 82
    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
                                          dimensions.width, dimensions.height);
    if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS) {
        cairo_surface_destroy (surface);
83
        return NULL;
84
    }
Caleb Michael Moore's avatar
Caleb Michael Moore committed
85

86
    cr = cairo_create (surface);
87

88 89 90 91 92
    if (!rsvg_handle_render_cairo_sub (handle, cr, id)) {
        cairo_destroy (cr);
        cairo_surface_destroy (surface);
        return NULL;
    }
93

94
    cairo_destroy (cr);
95

96 97 98
    output = rsvg_cairo_surface_to_pixbuf (surface);
    cairo_surface_destroy (surface);

99
    return output;
100
}
101 102 103 104 105

/**
 * rsvg_handle_get_pixbuf:
 * @handle: An #RsvgHandle
 *
106
 * Returns the pixbuf loaded by @handle.  The pixbuf returned will be reffed, so
107 108 109 110 111
 * the caller of this function must assume that ref.  If insufficient data has
 * been read to create the pixbuf, or an error occurred in loading, then %NULL
 * will be returned.  Note that the pixbuf may not be complete until
 * @rsvg_handle_close has been called.
 *
112
 * Returns: (transfer full) (nullable): the pixbuf loaded by @handle, or %NULL.
113 114
 **/
GdkPixbuf *
115
rsvg_handle_get_pixbuf (RsvgHandle * handle)
116
{
117
    return rsvg_handle_get_pixbuf_sub (handle, NULL);
118
}