summaryrefslogtreecommitdiffstats
path: root/src/sp-image.cpp
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2010-03-05 00:15:39 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2010-03-05 00:15:39 +0000
commita9b7c9028767417b2adda38f3dbf99418c73390f (patch)
tree18707d2e45d8093625fc4c7a31b387d9f6e4dc84 /src/sp-image.cpp
parentImprove behavior when pasting, DnDing and importing bitmap images (diff)
downloadinkscape-a9b7c9028767417b2adda38f3dbf99418c73390f.tar.gz
inkscape-a9b7c9028767417b2adda38f3dbf99418c73390f.zip
Always embed bitmap copies created with Alt+B.
Fixed bugs: - https://launchpad.net/bugs/169108 (bzr r9144)
Diffstat (limited to 'src/sp-image.cpp')
-rw-r--r--src/sp-image.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/sp-image.cpp b/src/sp-image.cpp
index 22b836703..8ef7969cd 100644
--- a/src/sp-image.cpp
+++ b/src/sp-image.cpp
@@ -1590,6 +1590,40 @@ sp_image_get_curve (SPImage *image)
return result;
}
+void
+sp_embed_image(Inkscape::XML::Node *image_node, GdkPixbuf *pb, Glib::ustring const &mime_in)
+{
+ Glib::ustring format, mime;
+ if (mime_in == "image/jpeg") {
+ mime = mime_in;
+ format = "jpeg";
+ } else {
+ mime = "image/png";
+ format = "png";
+ }
+
+ gchar *data;
+ gsize length;
+ gdk_pixbuf_save_to_buffer(pb, &data, &length, format.data(), NULL, NULL);
+
+ // Save base64 encoded data in image node
+ // this formula taken from Glib docs
+ guint needed_size = length * 4 / 3 + length * 4 / (3 * 72) + 7;
+ needed_size += 5 + 8 + mime.size(); // 5 bytes for data:, 8 for ;base64,
+
+ gchar *buffer = (gchar *) g_malloc(needed_size), *buf_work = buffer;
+ buf_work += g_sprintf(buffer, "data:%s;base64,", mime.data());
+
+ gint state = 0, save = 0;
+ gsize written = 0;
+ written += g_base64_encode_step((guchar*) data, length, TRUE, buf_work, &state, &save);
+ written += g_base64_encode_close(TRUE, buf_work + written, &state, &save);
+ buf_work[written] = 0; // null terminate
+
+ image_node->setAttribute("xlink:href", buffer);
+ g_free(buffer);
+}
+
void sp_image_refresh_if_outdated( SPImage* image )
{
if ( image->href && image->lastMod ) {