X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsp-filter.cpp;h=cfd6253a3e7c0e64b8b9dd023abfad2e95ea0c92;hb=5a43b2bbcb81ab7da396dad781d3f9b7854eb002;hp=2a971ccc673745aac90c9edbc6bc3d282a2504a3;hpb=d9a7c806ee7f408ddb61ff4f233c9d96111ee2b5;p=inkscape.git diff --git a/src/sp-filter.cpp b/src/sp-filter.cpp index 2a971ccc6..cfd6253a3 100644 --- a/src/sp-filter.cpp +++ b/src/sp-filter.cpp @@ -1,5 +1,3 @@ -#define __SP_FILTER_CPP__ - /** \file * SVG implementation. */ @@ -7,6 +5,8 @@ * Authors: * Hugo Rodrigues * Niko Kiirala + * Jon A. Cruz + * Abhishek Sharma * * Copyright (C) 2006,2007 Authors * @@ -108,7 +108,7 @@ sp_filter_init(SPFilter *filter) filter->height = 0; filter->filterUnits = SP_FILTER_UNITS_OBJECTBOUNDINGBOX; - filter->primitiveUnits = SP_FILTER_UNITS_OBJECTBOUNDINGBOX; + filter->primitiveUnits = SP_FILTER_UNITS_USERSPACEONUSE; filter->filterUnits_set = FALSE; filter->primitiveUnits_set = FALSE; @@ -136,17 +136,17 @@ sp_filter_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *rep } //Read values of key attributes from XML nodes into object. - sp_object_read_attr(object, "filterUnits"); - sp_object_read_attr(object, "primitiveUnits"); - 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, "filterRes"); - sp_object_read_attr(object, "xlink:href"); + object->readAttr( "filterUnits" ); + object->readAttr( "primitiveUnits" ); + object->readAttr( "x" ); + object->readAttr( "y" ); + object->readAttr( "width" ); + object->readAttr( "height" ); + object->readAttr( "filterRes" ); + object->readAttr( "xlink:href" ); //is this necessary? - sp_document_add_resource(document, "filter", object); + document->addResource("filter", object); } /** @@ -159,7 +159,7 @@ sp_filter_release(SPObject *object) if (SP_OBJECT_DOCUMENT(object)) { /* Unregister ourselves */ - sp_document_remove_resource(SP_OBJECT_DOCUMENT(object), "filter", SP_OBJECT(object)); + SP_OBJECT_DOCUMENT(object)->removeResource("filter", SP_OBJECT(object)); } //TODO: release resources here @@ -204,14 +204,14 @@ sp_filter_set(SPObject *object, unsigned int key, gchar const *value) break; case SP_ATTR_PRIMITIVEUNITS: if (value) { - if (!strcmp(value, "userSpaceOnUse")) { - filter->primitiveUnits = SP_FILTER_UNITS_USERSPACEONUSE; - } else { + if (!strcmp(value, "objectBoundingBox")) { filter->primitiveUnits = SP_FILTER_UNITS_OBJECTBOUNDINGBOX; + } else { + filter->primitiveUnits = SP_FILTER_UNITS_USERSPACEONUSE; } filter->primitiveUnits_set = TRUE; } else { - filter->primitiveUnits = SP_FILTER_UNITS_OBJECTBOUNDINGBOX; + filter->primitiveUnits = SP_FILTER_UNITS_USERSPACEONUSE; filter->primitiveUnits_set = FALSE; } object->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -285,8 +285,27 @@ sp_filter_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::N { SPFilter *filter = SP_FILTER(object); - if (!repr) { - repr = SP_OBJECT_REPR(object)->duplicate(doc); + // Original from sp-item-group.cpp + if (flags & SP_OBJECT_WRITE_BUILD) { + if (!repr) { + repr = doc->createElement("svg:filter"); + } + GSList *l = NULL; + for ( SPObject *child = object->firstChild(); child; child = child->getNext() ) { + Inkscape::XML::Node *crepr = child->updateRepr(doc, NULL, flags); + if (crepr) { + l = g_slist_prepend (l, crepr); + } + } + while (l) { + repr->addChild((Inkscape::XML::Node *) l->data, NULL); + Inkscape::GC::release((Inkscape::XML::Node *) l->data); + l = g_slist_remove (l, l->data); + } + } else { + for ( SPObject *child = object->firstChild() ; child; child = child->getNext() ) { + child->updateRepr(flags); + } } if ((flags & SP_OBJECT_WRITE_ALL) || filter->filterUnits_set) { @@ -302,11 +321,11 @@ sp_filter_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::N if ((flags & SP_OBJECT_WRITE_ALL) || filter->primitiveUnits_set) { switch (filter->primitiveUnits) { - case SP_FILTER_UNITS_USERSPACEONUSE: - repr->setAttribute("primitiveUnits", "userSpaceOnUse"); + case SP_FILTER_UNITS_OBJECTBOUNDINGBOX: + repr->setAttribute("primitiveUnits", "objectBoundingBox"); break; default: - repr->setAttribute("primitiveUnits", "objectBoundingBox"); + repr->setAttribute("primitiveUnits", "userSpaceOnUse"); break; } } @@ -349,6 +368,15 @@ sp_filter_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::N g_free(uri_string); } + // TODO: This is evil, correctly implement support for color-interpolation-filters!!! + // The color-interpolation-filters attribute is initially set to linearRGB according to the SVG standard. + // However, Inkscape completely ignores it and implicitly assumes that it is sRGB (like color-interpolation-filters). + // This results in a discrepancy between Inkscape and other renderers in how they render filters. + // To mitigate this problem I've (Jasper van de Gronde,th.v.d.gronde@hccnet.nl) added this to ensure that at least + // any filters written by Inkscape will henceforth be rendered the same in other renderers. + // In the future Inkscape should have proper support for the color-interpolation properties and this should be changed. + repr->setAttribute("color-interpolation-filters", "sRGB"); + if (((SPObjectClass *) filter_parent_class)->write) { ((SPObjectClass *) filter_parent_class)->write(object, doc, repr, flags); } @@ -417,6 +445,8 @@ void sp_filter_build_renderer(SPFilter *sp_filter, Inkscape::Filters::Filter *nr sp_filter->_renderer = nr_filter; + nr_filter->set_filter_units(sp_filter->filterUnits); + nr_filter->set_primitive_units(sp_filter->primitiveUnits); nr_filter->set_x(sp_filter->x); nr_filter->set_y(sp_filter->y); nr_filter->set_width(sp_filter->width); @@ -479,6 +509,42 @@ int sp_filter_set_image_name(SPFilter *filter, gchar const *name) { return value; } +gchar const *sp_filter_name_for_image(SPFilter const *filter, int const image) { + switch (image) { + case Inkscape::Filters::NR_FILTER_SOURCEGRAPHIC: + return "SourceGraphic"; + break; + case Inkscape::Filters::NR_FILTER_SOURCEALPHA: + return "SourceAlpha"; + break; + case Inkscape::Filters::NR_FILTER_BACKGROUNDIMAGE: + return "BackgroundImage"; + break; + case Inkscape::Filters::NR_FILTER_BACKGROUNDALPHA: + return "BackgroundAlpha"; + break; + case Inkscape::Filters::NR_FILTER_STROKEPAINT: + return "StrokePaint"; + break; + case Inkscape::Filters::NR_FILTER_FILLPAINT: + return "FillPaint"; + break; + case Inkscape::Filters::NR_FILTER_SLOT_NOT_SET: + case Inkscape::Filters::NR_FILTER_UNNAMED_SLOT: + return 0; + break; + default: + for (map::const_iterator i + = filter->_image_name->begin() ; + i != filter->_image_name->end() ; i++) { + if (i->second == image) { + return i->first; + } + } + } + return 0; +} + Glib::ustring sp_filter_get_new_result_name(SPFilter *filter) { g_assert(filter != NULL); int largest = 0; @@ -516,4 +582,4 @@ bool ltstr::operator()(const char* s1, const char* s2) const fill-column:99 End: */ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :