Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
svg-renderer.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
13#include "svg-renderer.h"
14
15#include <stdexcept>
16#include <vector>
17
18#include <cairomm/surface.h>
19#include <glibmm/ustring.h>
20#include <giomm/file.h>
21#include <gdkmm/pixbuf.h>
22#include <gdkmm/rgba.h>
23
24#include "document.h"
25
26#include "display/cairo-utils.h"
27#include "helper/pixbuf-ops.h"
28#include "io/file.h"
29#include "object/sp-root.h"
30#include "util/safe-printf.h"
31#include "util/units.h"
32#include "xml/repr.h"
33
34namespace Inkscape {
35
36template <typename T>
37static auto ensure_nonnull(T &&t, char const *message)
38{
39 if (!t) {
40 throw std::runtime_error{message};
41 }
42 return std::forward<T>(t);
43}
44
46 : _document{document}
47 , _root{*ensure_nonnull(_document.getRoot(), "Cannot find root element in svg document")}
48{}
49
51 : _optional_storage{ensure_nonnull(ink_file_open(Gio::File::create_for_path(path)).first, "Cannot load svg document")}
52 , _document{*_optional_storage}
53 , _root{*ensure_nonnull(_document.getRoot(), "Cannot find root element in svg document")}
54{}
55
57
58size_t svg_renderer::set_style(const Glib::ustring& selector, const char* name, const Glib::ustring& value) {
59 auto objects = _document.getObjectsBySelector(selector);
60 for (auto el : objects) {
61 if (SPCSSAttr* css = sp_repr_css_attr(el->getRepr(), "style")) {
62 sp_repr_css_set_property(css, name, value.c_str());
63 el->changeCSS(css, "style");
65 }
66 }
67 return objects.size();
68}
69
71 return _document.getWidth().value("px");
72}
73
75 return _document.getHeight().value("px");
76}
77
79 auto dpi = 96 * device_scale * _scale;
80 auto area = *_document.preferredBounds();
81
82 auto checkerboard_ptr = _checkerboard ? &*_checkerboard : nullptr;
83 return sp_generate_internal_bitmap(&_document, area, dpi, {}, false, checkerboard_ptr, device_scale);
84}
85
86Glib::RefPtr<Gdk::Pixbuf> svg_renderer::render(double scale) {
87 auto pixbuf = do_render(scale);
88 if (!pixbuf) return {};
89
90 // ref it
91 auto raw = Glib::wrap(pixbuf->getPixbufRaw(), true);
92 delete pixbuf;
93 return raw;
94}
95
96Cairo::RefPtr<Cairo::ImageSurface> svg_renderer::render_surface(double scale) {
97 auto pixbuf = do_render(scale);
98 if (!pixbuf) return Cairo::RefPtr<Cairo::ImageSurface>();
99
100 // ref it by saying that we have no reference
101 auto surface = Cairo::RefPtr<Cairo::ImageSurface>(new Cairo::ImageSurface(pixbuf->getSurfaceRaw(), false));
102 delete pixbuf;
103 return surface;
104}
105
106void svg_renderer::set_scale(double scale) {
107 if (scale > 0) {
108 _scale = scale;
109 }
110}
111
112} // namespace Inkscape
113
114/*
115 Local Variables:
116 mode:c++
117 c-file-style:"stroustrup"
118 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
119 indent-tabs-mode:nil
120 fill-column:99
121 End:
122*/
123// vim:filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99:
double scale
Definition aa.cpp:228
Cairo integration helpers.
Cairo::RefPtr< Cairo::ImageSurface > surface
Definition canvas.cpp:137
Class to hold image data for raster images.
Definition cairo-utils.h:31
double value(Unit const *u) const
Return the quantity's value in the specified unit.
Definition units.cpp:565
double get_width_px() const
Pixbuf * do_render(double device_scale)
void set_scale(double scale)
double get_height_px() const
std::optional< uint32_t > _checkerboard
size_t set_style(const Glib::ustring &selector, const char *name, const Glib::ustring &value)
Glib::RefPtr< Gdk::Pixbuf > render(double scale)
Cairo::RefPtr< Cairo::ImageSurface > render_surface(double scale)
svg_renderer(char const *path)
Typed SVG document implementation.
Definition document.h:101
Inkscape::Util::Quantity getWidth() const
Definition document.cpp:848
Geom::OptRect preferredBounds() const
Definition document.cpp:969
Inkscape::Util::Quantity getHeight() const
Definition document.cpp:887
std::vector< SPObject * > getObjectsBySelector(Glib::ustring const &selector) const
Inkscape::XML::Node * _root
Reference to the clipboard's root node.
std::shared_ptr< Css const > css
std::unique_ptr< SPDocument > ink_file_open(std::span< char const > buffer)
Open a document from memory.
Definition file.cpp:60
Helper class to stream background task notifications as a series of messages.
static auto ensure_nonnull(T &&t, char const *message)
Inkscape::Pixbuf * sp_generate_internal_bitmap(SPDocument *document, Geom::Rect const &area, double dpi, std::vector< SPItem const * > items, bool opaque, uint32_t const *checkerboard_color, double device_scale, std::optional< Antialiasing > antialias)
Generates a bitmap from given items.
void sp_repr_css_attr_unref(SPCSSAttr *css)
Unreferences an SPCSSAttr (will be garbage collected if no references remain).
Definition repr-css.cpp:76
SPCSSAttr * sp_repr_css_attr(Node const *repr, gchar const *attr)
Creates a new SPCSSAttr with one attribute (i.e.
Definition repr-css.cpp:88
void sp_repr_css_set_property(SPCSSAttr *css, gchar const *name, gchar const *value)
Set a style property to a new value (e.g.
Definition repr-css.cpp:190
C facade to Inkscape::XML::Node.
SPRoot: SVG <svg> implementation.
Glib::ustring name
Definition toolbars.cpp:55