summaryrefslogtreecommitdiffstats
path: root/src/interface.cpp
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2010-03-04 23:34:30 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2010-03-04 23:34:30 +0000
commit6d833eac6f8775095c3c0a0979a6dcab1e4f5c3c (patch)
treeb2765fbd0d101c27da577a95ec2ce75d78c92d7e /src/interface.cpp
parentClean up the unordered containers fix. (diff)
downloadinkscape-6d833eac6f8775095c3c0a0979a6dcab1e4f5c3c.tar.gz
inkscape-6d833eac6f8775095c3c0a0979a6dcab1e4f5c3c.zip
Improve behavior when pasting, DnDing and importing bitmap images
(bzr r9143)
Diffstat (limited to 'src/interface.cpp')
-rw-r--r--src/interface.cpp62
1 files changed, 21 insertions, 41 deletions
diff --git a/src/interface.cpp b/src/interface.cpp
index 9c1870019..cb021db18 100644
--- a/src/interface.cpp
+++ b/src/interface.cpp
@@ -23,7 +23,9 @@
#include <glib.h>
#include "inkscape-private.h"
+#include "extension/db.h"
#include "extension/effect.h"
+#include "extension/input.h"
#include "widgets/icon.h"
#include "preferences.h"
#include "path-prefix.h"
@@ -1454,48 +1456,26 @@ sp_ui_drag_data_received(GtkWidget *widget,
case PNG_DATA:
case JPEG_DATA:
case IMAGE_DATA: {
- Inkscape::XML::Document *xml_doc = sp_document_repr_doc(doc);
- Inkscape::XML::Node *newImage = xml_doc->createElement("svg:image");
- gchar *atom_name = gdk_atom_name(data->type);
-
- // this formula taken from Glib docs
- guint needed_size = data->length * 4 / 3 + data->length * 4 / (3 * 72) + 7;
- needed_size += 5 + 8 + strlen(atom_name); // 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,", atom_name);
-
- gint state = 0, save = 0;
- g_base64_encode_step(data->data, data->length, TRUE, buf_work, &state, &save);
- g_base64_encode_close(TRUE, buf_work, &state, &save);
-
- newImage->setAttribute("xlink:href", buffer);
- g_free(buffer);
-
- GError *error = NULL;
- GdkPixbufLoader *loader = gdk_pixbuf_loader_new_with_mime_type( gdk_atom_name(data->type), &error );
- if ( loader ) {
- error = NULL;
- if ( gdk_pixbuf_loader_write( loader, data->data, data->length, &error) ) {
- GdkPixbuf *pbuf = gdk_pixbuf_loader_get_pixbuf(loader);
- if ( pbuf ) {
- char tmp[1024];
- int width = gdk_pixbuf_get_width(pbuf);
- int height = gdk_pixbuf_get_height(pbuf);
- snprintf( tmp, sizeof(tmp), "%d", width );
- newImage->setAttribute("width", tmp);
-
- snprintf( tmp, sizeof(tmp), "%d", height );
- newImage->setAttribute("height", tmp);
- }
- }
- }
- g_free(atom_name);
+ const char *mime = (info == JPEG_DATA ? "image/jpeg" : "image/png");
- // Add it to the current layer
- desktop->currentLayer()->appendChildRepr(newImage);
-
- Inkscape::GC::release(newImage);
+ Inkscape::Extension::DB::InputList o;
+ Inkscape::Extension::db.get_input_list(o);
+ Inkscape::Extension::DB::InputList::const_iterator i = o.begin();
+ while (i != o.end() && strcmp( (*i)->get_mimetype(), mime ) != 0) {
+ ++i;
+ }
+ Inkscape::Extension::Extension *ext = *i;
+ bool save = ext->get_param_bool("link");
+ ext->set_param_bool("link", false);
+ ext->set_gui(false);
+
+ gchar *filename = g_build_filename( g_get_tmp_dir(), "inkscape-dnd-import", NULL );
+ g_file_set_contents(filename, reinterpret_cast<gchar const *>(data->data), data->length, NULL);
+ file_import(doc, filename, ext);
+ g_free(filename);
+
+ ext->set_param_bool("link", save);
+ ext->set_gui(true);
sp_document_done( doc , SP_VERB_NONE,
_("Drop bitmap image"));
break;