X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-feimage.cpp;h=2628d397c61e8a2c405c9aaaa8f7235d8d5c5d4b;hb=ceb9b97a62780ab7aef6ec4c03f20d776368a112;hp=08bb1f3e2e67c1994888361615eb108c6f594736;hpb=761a541468cc0b8a7fcfb8c65784c0896f0f80f4;p=inkscape.git diff --git a/src/sp-feimage.cpp b/src/sp-feimage.cpp index 08bb1f3e2..2628d397c 100644 --- a/src/sp-feimage.cpp +++ b/src/sp-feimage.cpp @@ -6,8 +6,10 @@ */ /* * Authors: + * Felipe Corrêa da Silva Sanches * hugo Rodrigues * + * Copyright (C) 2007 Felipe Sanches * Copyright (C) 2006 Hugo Rodrigues * * Released under GNU GPL, read the file 'COPYING' for more information @@ -16,25 +18,16 @@ #ifdef HAVE_CONFIG_H # include "config.h" #endif - +#include "uri.h" +#include "uri-references.h" #include "attributes.h" #include "svg/svg.h" #include "sp-feimage.h" #include "xml/repr.h" +#include -//#define SP_MACROS_SILENT -//#include "macros.h" - -#define DEBUG_FEIMAGE -#ifdef DEBUG_FEIMAGE -# define debug(f, a...) { g_print("%s(%d) %s:", \ - __FILE__,__LINE__,__FUNCTION__); \ - g_print(f, ## a); \ - g_print("\n"); \ - } -#else -# define debug(f, a...) /**/ -#endif +#include "display/nr-filter.h" +#include "display/nr-filter-image.h" /* FeImage base class */ @@ -46,8 +39,9 @@ static void sp_feImage_release(SPObject *object); static void sp_feImage_set(SPObject *object, unsigned int key, gchar const *value); static void sp_feImage_update(SPObject *object, SPCtx *ctx, guint flags); static Inkscape::XML::Node *sp_feImage_write(SPObject *object, Inkscape::XML::Node *repr, guint flags); +static void sp_feImage_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter); -static SPObjectClass *feImage_parent_class; +static SPFilterPrimitiveClass *feImage_parent_class; GType sp_feImage_get_type() @@ -65,7 +59,7 @@ sp_feImage_get_type() (GInstanceInitFunc) sp_feImage_init, NULL, /* value_table */ }; - feImage_type = g_type_register_static(SP_TYPE_OBJECT, "SPFeImage", &feImage_info, (GTypeFlags)0); + feImage_type = g_type_register_static(SP_TYPE_FILTER_PRIMITIVE, "SPFeImage", &feImage_info, (GTypeFlags)0); } return feImage_type; } @@ -74,20 +68,22 @@ static void sp_feImage_class_init(SPFeImageClass *klass) { SPObjectClass *sp_object_class = (SPObjectClass *)klass; + SPFilterPrimitiveClass * sp_primitive_class = (SPFilterPrimitiveClass *)klass; - feImage_parent_class = (SPObjectClass*)g_type_class_peek_parent(klass); + feImage_parent_class = (SPFilterPrimitiveClass*)g_type_class_peek_parent(klass); sp_object_class->build = sp_feImage_build; sp_object_class->release = sp_feImage_release; sp_object_class->write = sp_feImage_write; sp_object_class->set = sp_feImage_set; sp_object_class->update = sp_feImage_update; + + sp_primitive_class->build_renderer = sp_feImage_build_renderer; } static void -sp_feImage_init(SPFeImage *feImage) +sp_feImage_init(SPFeImage */*feImage*/) { - debug("0x%p",feImage); } /** @@ -98,12 +94,22 @@ sp_feImage_init(SPFeImage *feImage) static void sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { - debug("0x%p",object); + // Save document reference so we can load images with relative paths. + SPFeImage *feImage = SP_FEIMAGE(object); + feImage->document = document; + if (((SPObjectClass *) feImage_parent_class)->build) { ((SPObjectClass *) feImage_parent_class)->build(object, document, repr); } /*LOAD ATTRIBUTES FROM REPR HERE*/ + + sp_object_read_attr(object, "x"); + sp_object_read_attr(object, "y"); + sp_object_read_attr(object, "width"); + sp_object_read_attr(object, "height"); + sp_object_read_attr(object, "xlink:href"); + } /** @@ -112,24 +118,71 @@ sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *re static void sp_feImage_release(SPObject *object) { - debug("0x%p",object); + SPFeImage *feImage = SP_FEIMAGE(object); + feImage->_modified_connection.disconnect(); + if (feImage->SVGElemRef) delete feImage->SVGElemRef; if (((SPObjectClass *) feImage_parent_class)->release) ((SPObjectClass *) feImage_parent_class)->release(object); } +static void +sp_feImage_elem_modified(SPObject* /*href*/, guint /*flags*/, SPObject* obj) +{ + obj->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); +} + /** * Sets a specific value in the SPFeImage. */ static void sp_feImage_set(SPObject *object, unsigned int key, gchar const *value) { - debug("0x%p %s(%u): '%s'",object, - sp_attribute_name(key),key,value); SPFeImage *feImage = SP_FEIMAGE(object); - - switch(key) { + (void)feImage; + Inkscape::URI* SVGElem_uri; + switch(key) { /*DEAL WITH SETTING ATTRIBUTES HERE*/ + case SP_ATTR_XLINK_HREF: + if (feImage->href) g_free(feImage->href); + feImage->href = (value) ? g_strdup (value) : NULL; + if (!feImage->href) return; + try{ + SVGElem_uri = new Inkscape::URI(feImage->href); + feImage->SVGElemRef = new Inkscape::URIReference(feImage->document); + feImage->from_element = true; + feImage->SVGElemRef->attach(*SVGElem_uri); + feImage->SVGElem = SP_ITEM(feImage->SVGElemRef->getObject()); + + g_free(SVGElem_uri); + feImage->_modified_connection = ((SPObject*) feImage->SVGElem)->connectModified(sigc::bind(sigc::ptr_fun(&sp_feImage_elem_modified), object)); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + } + catch(const Inkscape::UnsupportedURIException & e) + { + feImage->from_element = false; + g_warning("caught Inkscape::UnsupportedURIException in sp_feImage_set"); + break; + } + + + case SP_ATTR_X: + feImage->x.readOrUnset(value); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + case SP_ATTR_Y: + feImage->y.readOrUnset(value); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + case SP_ATTR_WIDTH: + feImage->width.readOrUnset(value); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + case SP_ATTR_HEIGHT: + feImage->height.readOrUnset(value); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; default: if (((SPObjectClass *) feImage_parent_class)->set) ((SPObjectClass *) feImage_parent_class)->set(object, key, value); @@ -144,13 +197,11 @@ sp_feImage_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feImage_update(SPObject *object, SPCtx *ctx, guint flags) { - debug("0x%p",object); if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { /* do something to trigger redisplay, updates? */ - } if (((SPObjectClass *) feImage_parent_class)->update) { @@ -164,15 +215,13 @@ sp_feImage_update(SPObject *object, SPCtx *ctx, guint flags) static Inkscape::XML::Node * sp_feImage_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) { - debug("0x%p",object); - // Inkscape-only object, not copied during an "plain SVG" dump: if (flags & SP_OBJECT_WRITE_EXT) { if (repr) { // is this sane? - repr->mergeFrom(SP_OBJECT_REPR(object), "id"); + //repr->mergeFrom(SP_OBJECT_REPR(object), "id"); } else { - repr = SP_OBJECT_REPR(object)->duplicate(); + repr = SP_OBJECT_REPR(object)->duplicate(NULL); // FIXME } } @@ -183,6 +232,25 @@ sp_feImage_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) return repr; } +static void sp_feImage_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter) { + g_assert(primitive != NULL); + g_assert(filter != NULL); + + SPFeImage *sp_image = SP_FEIMAGE(primitive); + + int primitive_n = filter->add_primitive(NR::NR_FILTER_IMAGE); + NR::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n); + NR::FilterImage *nr_image = dynamic_cast(nr_primitive); + g_assert(nr_image != NULL); + + sp_filter_primitive_renderer_common(primitive, nr_primitive); + + nr_image->from_element = sp_image->from_element; + nr_image->SVGElem = sp_image->SVGElem; + nr_image->set_region(sp_image->x, sp_image->y, sp_image->width, sp_image->height); + nr_image->set_href(sp_image->href); + nr_image->set_document(sp_image->document); +} /* Local Variables: