X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-feimage.cpp;h=271baa5914a9a978a33b4307541aa013812e5050;hb=f2c65c84b2e5016ef16907bf15d51ded9c25411e;hp=b7c857d4e374fdcb182b3cd977051803eaa5c758;hpb=8c833a9abfd335f0305466ad7451c03c2f6b50dd;p=inkscape.git diff --git a/src/sp-feimage.cpp b/src/sp-feimage.cpp index b7c857d4e..271baa591 100644 --- a/src/sp-feimage.cpp +++ b/src/sp-feimage.cpp @@ -1,4 +1,4 @@ - #define __SP_FEIMAGE_CPP__ +#define __SP_FEIMAGE_CPP__ /** \file * SVG implementation. @@ -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 @@ -21,7 +23,10 @@ #include "svg/svg.h" #include "sp-feimage.h" #include "xml/repr.h" +#include +#include "display/nr-filter.h" +#include "display/nr-filter-image.h" /* FeImage base class */ @@ -33,6 +38,7 @@ 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 SPFilterPrimitiveClass *feImage_parent_class; @@ -61,6 +67,7 @@ static void sp_feImage_class_init(SPFeImageClass *klass) { SPObjectClass *sp_object_class = (SPObjectClass *)klass; + SPFilterPrimitiveClass * sp_primitive_class = (SPFilterPrimitiveClass *)klass; feImage_parent_class = (SPFilterPrimitiveClass*)g_type_class_peek_parent(klass); @@ -69,10 +76,12 @@ sp_feImage_class_init(SPFeImageClass *klass) 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*/) { } @@ -84,11 +93,22 @@ sp_feImage_init(SPFeImage *feImage) static void sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { + // 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"); + } /** @@ -109,9 +129,31 @@ static void sp_feImage_set(SPObject *object, unsigned int key, gchar const *value) { SPFeImage *feImage = SP_FEIMAGE(object); + (void)feImage; - switch(key) { + 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; + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + 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); @@ -126,11 +168,11 @@ sp_feImage_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feImage_update(SPObject *object, SPCtx *ctx, guint flags) { + 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) { @@ -148,9 +190,9 @@ sp_feImage_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) 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 } } @@ -161,6 +203,22 @@ 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->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: