diff options
| author | Thomas Holder <thomas@thomas-holder.de> | 2018-11-03 21:34:23 +0000 |
|---|---|---|
| committer | Tavmjong Bah <tavmjong@free.fr> | 2018-11-04 16:24:42 +0000 |
| commit | c9b918d330b74b82f4e61cfa537674bcd53ade5f (patch) | |
| tree | 6b5f3cf85593cf375850b53908b1cfc13e557573 /src | |
| parent | Add --preload option. (diff) | |
| download | inkscape-c9b918d330b74b82f4e61cfa537674bcd53ade5f.tar.gz inkscape-c9b918d330b74b82f4e61cfa537674bcd53ade5f.zip | |
Image HTTP support
Uses Gio::File::load_contents (via URI::getContents) to load images from
non-file/non-data URIs. Depends on GVfs.
Diffstat (limited to 'src')
| -rw-r--r-- | src/display/cairo-utils.cpp | 29 | ||||
| -rw-r--r-- | src/display/cairo-utils.h | 3 | ||||
| -rw-r--r-- | src/object/sp-image.cpp | 8 |
3 files changed, 36 insertions, 4 deletions
diff --git a/src/display/cairo-utils.cpp b/src/display/cairo-utils.cpp index e4cef786d..516d52678 100644 --- a/src/display/cairo-utils.cpp +++ b/src/display/cairo-utils.cpp @@ -363,6 +363,31 @@ Pixbuf *Pixbuf::create_from_file(std::string const &fn, double svgdpi) std::cerr << " (" << fn << ")" << std::endl; return nullptr; } + + pb = Pixbuf::create_from_buffer(std::move(data), len, svgdpi, fn); + + if (pb) { + pb->_mod_time = stdir.st_mtime; + } + } else { + std::cerr << "Pixbuf::create_from_file: failed to get contents: " << fn << std::endl; + return nullptr; + } + + return pb; +} + +Pixbuf *Pixbuf::create_from_buffer(std::string const &buffer, double svgdpi, std::string const &fn) +{ + auto datacopy = (gchar *)g_memdup(buffer.data(), buffer.size()); + return Pixbuf::create_from_buffer(std::move(datacopy), buffer.size(), svgdpi, fn); +} + +Pixbuf *Pixbuf::create_from_buffer(gchar *&&data, gsize len, double svgdpi, std::string const &fn) +{ + Pixbuf *pb = nullptr; + GError *error = nullptr; + { GdkPixbuf *buf = nullptr; GdkPixbufLoader *loader = nullptr; std::string::size_type idx; @@ -432,7 +457,6 @@ Pixbuf *Pixbuf::create_from_file(std::string const &fn, double svgdpi) if (buf) { g_object_ref(buf); pb = new Pixbuf(buf); - pb->_mod_time = stdir.st_mtime; pb->_path = fn; if (!is_svg) { GdkPixbufFormat *fmt = gdk_pixbuf_loader_get_format(loader); @@ -450,9 +474,6 @@ Pixbuf *Pixbuf::create_from_file(std::string const &fn, double svgdpi) // TODO: we could also read DPI, ICC profile, gamma correction, and other information // from the file. This can be done by using format-specific libraries e.g. libpng. - } else { - std::cerr << "Pixbuf::create_from_file: failed to get contents: " << fn << std::endl; - return nullptr; } return pb; diff --git a/src/display/cairo-utils.h b/src/display/cairo-utils.h index ada78ce51..9c4c9b68b 100644 --- a/src/display/cairo-utils.h +++ b/src/display/cairo-utils.h @@ -119,8 +119,11 @@ public: static Pixbuf *create_from_data_uri(gchar const *uri, double svgdpi = 0); static Pixbuf *create_from_file(std::string const &fn, double svgddpi = 0); + static Pixbuf *create_from_buffer(std::string const &, double svgddpi = 0, std::string const &fn = ""); private: + static Pixbuf *create_from_buffer(gchar *&&, gsize, double svgddpi = 0, std::string const &fn = ""); + void _ensurePixelsARGB32(); void _ensurePixelsPixbuf(); void _forceAlpha(); diff --git a/src/object/sp-image.cpp b/src/object/sp-image.cpp index a66bb3625..ee0efc720 100644 --- a/src/object/sp-image.cpp +++ b/src/object/sp-image.cpp @@ -25,6 +25,7 @@ #include <2geom/rect.h> #include <2geom/transforms.h> #include <glibmm/i18n.h> +#include <giomm/error.h> #include "display/drawing-image.h" #include "display/cairo-utils.h" @@ -590,6 +591,13 @@ Inkscape::Pixbuf *sp_image_repr_read_image(gchar const *href, gchar const *absre if (url.hasScheme("file")) { auto native = url.toNativeFilename(); inkpb = Inkscape::Pixbuf::create_from_file(native.c_str(), svgdpi); + } else { + try { + auto contents = url.getContents(); + inkpb = Inkscape::Pixbuf::create_from_buffer(contents, svgdpi); + } catch (const Gio::Error &e) { + g_warning("URI::getContents failed for '%.100s'", href); + } } } |
