diff options
| author | Nicolas Dufour <nicoduf@yahoo.fr> | 2011-08-18 21:29:26 +0000 |
|---|---|---|
| committer | JazzyNico <nicoduf@yahoo.fr> | 2011-08-18 21:29:26 +0000 |
| commit | 003fc530c79f74f54e93ade3207b9b2c2d8b4c4e (patch) | |
| tree | d85cb7c502c92bba39339fff9ea6e04d9d2e8b7b /src/extension/internal/bitmap/imagemagick.cpp | |
| parent | default to slightly friendlier grid color like the one from 0.45 :) (diff) | |
| download | inkscape-003fc530c79f74f54e93ade3207b9b2c2d8b4c4e.tar.gz inkscape-003fc530c79f74f54e93ade3207b9b2c2d8b4c4e.zip | |
Extensions. New Crop bitmap extension (see Bug #517082, Request Crop Image).
(bzr r10554)
Diffstat (limited to 'src/extension/internal/bitmap/imagemagick.cpp')
| -rw-r--r-- | src/extension/internal/bitmap/imagemagick.cpp | 298 |
1 files changed, 154 insertions, 144 deletions
diff --git a/src/extension/internal/bitmap/imagemagick.cpp b/src/extension/internal/bitmap/imagemagick.cpp index 65968bdc4..a5d27726f 100644 --- a/src/extension/internal/bitmap/imagemagick.cpp +++ b/src/extension/internal/bitmap/imagemagick.cpp @@ -34,182 +34,192 @@ namespace Internal { namespace Bitmap { class ImageMagickDocCache: public Inkscape::Extension::Implementation::ImplementationDocumentCache { - friend class ImageMagick; + friend class ImageMagick; private: - void readImage(char const *xlink, Magick::Image *image); + void readImage(char const *xlink, Magick::Image *image); protected: - Inkscape::XML::Node** _nodes; - - Magick::Image** _images; - int _imageCount; - char** _caches; - unsigned* _cacheLengths; - - const char** _originals; + Inkscape::XML::Node** _nodes; + + Magick::Image** _images; + int _imageCount; + char** _caches; + unsigned* _cacheLengths; + const char** _originals; + SPItem** _imageItems; public: - ImageMagickDocCache(Inkscape::UI::View::View * view); - ~ImageMagickDocCache ( ); + ImageMagickDocCache(Inkscape::UI::View::View * view); + ~ImageMagickDocCache ( ); }; ImageMagickDocCache::ImageMagickDocCache(Inkscape::UI::View::View * view) : - Inkscape::Extension::Implementation::ImplementationDocumentCache(view), - _nodes(NULL), - _images(NULL), - _imageCount(0), - _caches(NULL), - _cacheLengths(NULL), - _originals(NULL) + Inkscape::Extension::Implementation::ImplementationDocumentCache(view), + _nodes(NULL), + _images(NULL), + _imageCount(0), + _caches(NULL), + _cacheLengths(NULL), + _originals(NULL), + _imageItems(NULL) { - SPDesktop *desktop = (SPDesktop*)view; - const GSList *selectedReprList = desktop->selection->reprList(); - int selectCount = g_slist_length((GSList *)selectedReprList); - - // Init the data-holders - _nodes = new Inkscape::XML::Node*[selectCount]; - _originals = new const char*[selectCount]; - _caches = new char*[selectCount]; - _cacheLengths = new unsigned int[selectCount]; - _images = new Magick::Image*[selectCount]; - _imageCount = 0; - - // Loop through selected nodes - for (; selectedReprList != NULL; selectedReprList = g_slist_next(selectedReprList)) - { - Inkscape::XML::Node *node = reinterpret_cast<Inkscape::XML::Node *>(selectedReprList->data); - if (!strcmp(node->name(), "image") || !strcmp(node->name(), "svg:image")) - { - _nodes[_imageCount] = node; - char const *xlink = node->attribute("xlink:href"); - - _originals[_imageCount] = xlink; - _caches[_imageCount] = ""; - _cacheLengths[_imageCount] = 0; - _images[_imageCount] = new Magick::Image(); - readImage(xlink, _images[_imageCount]); - - _imageCount++; - } - } + SPDesktop *desktop = (SPDesktop*)view; + const GSList *selectedItemList = desktop->selection->itemList(); + int selectCount = g_slist_length((GSList *)selectedItemList); + + // Init the data-holders + _nodes = new Inkscape::XML::Node*[selectCount]; + _originals = new const char*[selectCount]; + _caches = new char*[selectCount]; + _cacheLengths = new unsigned int[selectCount]; + _images = new Magick::Image*[selectCount]; + _imageCount = 0; + _imageItems = new SPItem*[selectCount]; + + // Loop through selected items + for (; selectedItemList != NULL; selectedItemList = g_slist_next(selectedItemList)) + { + SPItem *item = SP_ITEM(selectedItemList->data); + Inkscape::XML::Node *node = reinterpret_cast<Inkscape::XML::Node *>(item->getRepr()); + if (!strcmp(node->name(), "image") || !strcmp(node->name(), "svg:image")) + { + _nodes[_imageCount] = node; + char const *xlink = node->attribute("xlink:href"); + _originals[_imageCount] = xlink; + _caches[_imageCount] = (char*)""; + _cacheLengths[_imageCount] = 0; + _images[_imageCount] = new Magick::Image(); + readImage(xlink, _images[_imageCount]); + _imageItems[_imageCount] = item; + _imageCount++; + } + } } ImageMagickDocCache::~ImageMagickDocCache ( ) { - if (_nodes) - delete _nodes; - if (_originals) - delete _originals; - if (_caches) - delete _caches; - if (_cacheLengths) - delete _cacheLengths; - if (_images) - delete _images; - - return; + if (_nodes) + delete _nodes; + if (_originals) + delete _originals; + if (_caches) + delete _caches; + if (_cacheLengths) + delete _cacheLengths; + if (_images) + delete _images; + if (_imageItems) + delete _imageItems; + return; } void ImageMagickDocCache::readImage(const char *xlink, Magick::Image *image) { - // Find if the xlink:href is base64 data, i.e. if the image is embedded - char *search = (char *) g_strndup(xlink, 30); - if (strstr(search, "base64") != (char*)NULL) { - // 7 = strlen("base64") + strlen(",") - const char* pureBase64 = strstr(xlink, "base64") + 7; - Magick::Blob blob; - blob.base64(pureBase64); - image->read(blob); - } - else { - const gchar *path = xlink; + // Find if the xlink:href is base64 data, i.e. if the image is embedded + char *search = (char *) g_strndup(xlink, 30); + if (strstr(search, "base64") != (char*)NULL) { + // 7 = strlen("base64") + strlen(",") + const char* pureBase64 = strstr(xlink, "base64") + 7; + Magick::Blob blob; + blob.base64(pureBase64); + image->read(blob); + } + else { + const gchar *path = xlink; if (strncmp (xlink,"file:", 5) == 0) { path = g_filename_from_uri(xlink, NULL, NULL); - } + } - try { - image->read(path); - } catch (...) {} - } - g_free(search); + try { + image->read(path); + } catch (...) {} + } + g_free(search); } bool ImageMagick::load(Inkscape::Extension::Extension */*module*/) { - return true; + return true; } Inkscape::Extension::Implementation::ImplementationDocumentCache * ImageMagick::newDocCache (Inkscape::Extension::Extension * /*ext*/, Inkscape::UI::View::View * view) { - return new ImageMagickDocCache(view); + return new ImageMagickDocCache(view); } void ImageMagick::effect (Inkscape::Extension::Effect *module, Inkscape::UI::View::View *document, Inkscape::Extension::Implementation::ImplementationDocumentCache * docCache) { - refreshParameters(module); - - if (docCache == NULL) { // should never happen - docCache = newDocCache(module, document); - } - ImageMagickDocCache * dc = dynamic_cast<ImageMagickDocCache *>(docCache); - if (dc == NULL) { // should really never happen - printf("AHHHHHHHHH!!!!!"); - exit(1); - } - - for (int i = 0; i < dc->_imageCount; i++) - { - try - { - Magick::Image effectedImage = *dc->_images[i]; // make a copy - applyEffect(&effectedImage); - - Magick::Blob *blob = new Magick::Blob(); - effectedImage.write(blob); - - std::string raw_string = blob->base64(); - const int raw_len = raw_string.length(); - const char *raw_i = raw_string.c_str(); - - unsigned new_len = (int)(raw_len * (77.0 / 76.0) + 100); - if (new_len > dc->_cacheLengths[i]) { - dc->_cacheLengths[i] = (int)(new_len * 1.2); - dc->_caches[i] = new char[dc->_cacheLengths[i]]; - } - char *formatted_i = dc->_caches[i]; - const char *src; - - for (src = "data:image/"; *src; ) - *formatted_i++ = *src++; - for (src = effectedImage.magick().c_str(); *src ; ) - *formatted_i++ = *src++; - for (src = ";base64, \n" ; *src; ) - *formatted_i++ = *src++; - - int col = 0; - while (*raw_i) { - *formatted_i++ = *raw_i++; - if (col++ > 76) { - *formatted_i++ = '\n'; - col = 0; - } - } - if (col) { - *formatted_i++ = '\n'; - } - *formatted_i = '\0'; - - dc->_nodes[i]->setAttribute("xlink:href", dc->_caches[i], true); - dc->_nodes[i]->setAttribute("sodipodi:absref", NULL, true); - } - catch (Magick::Exception &error_) { - printf("Caught exception: %s \n", error_.what()); - } - - //while(Gtk::Main::events_pending()) { - // Gtk::Main::iteration(); - //} - } + refreshParameters(module); + + if (docCache == NULL) { // should never happen + docCache = newDocCache(module, document); + } + ImageMagickDocCache * dc = dynamic_cast<ImageMagickDocCache *>(docCache); + if (dc == NULL) { // should really never happen + printf("AHHHHHHHHH!!!!!"); + exit(1); + } + + for (int i = 0; i < dc->_imageCount; i++) + { + try + { + Magick::Image effectedImage = *dc->_images[i]; // make a copy + + applyEffect(&effectedImage); + + // postEffect can be used to change things on the item itself + // e.g. resize the image element, after the effecti is applied + postEffect(&effectedImage, dc->_imageItems[i]); + +// dc->_nodes[i]->setAttribute("xlink:href", dc->_caches[i], true); + + Magick::Blob *blob = new Magick::Blob(); + effectedImage.write(blob); + + std::string raw_string = blob->base64(); + const int raw_len = raw_string.length(); + const char *raw_i = raw_string.c_str(); + + unsigned new_len = (int)(raw_len * (77.0 / 76.0) + 100); + if (new_len > dc->_cacheLengths[i]) { + dc->_cacheLengths[i] = (int)(new_len * 1.2); + dc->_caches[i] = new char[dc->_cacheLengths[i]]; + } + char *formatted_i = dc->_caches[i]; + const char *src; + + for (src = "data:image/"; *src; ) + *formatted_i++ = *src++; + for (src = effectedImage.magick().c_str(); *src ; ) + *formatted_i++ = *src++; + for (src = ";base64, \n" ; *src; ) + *formatted_i++ = *src++; + + int col = 0; + while (*raw_i) { + *formatted_i++ = *raw_i++; + if (col++ > 76) { + *formatted_i++ = '\n'; + col = 0; + } + } + if (col) { + *formatted_i++ = '\n'; + } + *formatted_i = '\0'; + + dc->_nodes[i]->setAttribute("xlink:href", dc->_caches[i], true); + dc->_nodes[i]->setAttribute("sodipodi:absref", NULL, true); + } + catch (Magick::Exception &error_) { + printf("Caught exception: %s \n", error_.what()); + } + + //while(Gtk::Main::events_pending()) { + // Gtk::Main::iteration(); + //} + } } /** \brief A function to get the prefences for the grid |
