X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ffilter-chemistry.cpp;h=0be3252a9f3b874e25f6541d6c6e680b637aee09;hb=5d67bd380afd0885c8b4656cb3383aea24aedfcb;hp=d9bf33d60ca1a3489adc7591e3aea7827e4fa3f3;hpb=c9f29ccf73d68064b0e869847ce640bd27b94b82;p=inkscape.git diff --git a/src/filter-chemistry.cpp b/src/filter-chemistry.cpp index d9bf33d60..0be3252a9 100644 --- a/src/filter-chemistry.cpp +++ b/src/filter-chemistry.cpp @@ -26,6 +26,7 @@ #include "sp-filter-reference.h" #include "sp-gaussian-blur.h" #include "svg/css-ostringstream.h" +#include "libnr/nr-matrix-fns.h" #include "xml/repr.h" @@ -121,7 +122,6 @@ filter_add_primitive(SPFilter *filter, const NR::FilterPrimitiveType type) //create filter primitive node Inkscape::XML::Node *repr; repr = xml_doc->createElement(FPConverter.get_key(type).c_str()); - repr->setAttribute("inkscape:collect", "always"); // set default values switch(type) { @@ -135,6 +135,8 @@ filter_add_primitive(SPFilter *filter, const NR::FilterPrimitiveType type) case NR::NR_FILTER_COMPOSITE: break; case NR::NR_FILTER_CONVOLVEMATRIX: + repr->setAttribute("order", "3 3"); + repr->setAttribute("kernelMatrix", "0 0 0 0 0 0 0 0 0"); break; case NR::NR_FILTER_DIFFUSELIGHTING: break; @@ -143,7 +145,7 @@ filter_add_primitive(SPFilter *filter, const NR::FilterPrimitiveType type) case NR::NR_FILTER_FLOOD: break; case NR::NR_FILTER_GAUSSIANBLUR: - repr->setAttribute("stddeviation", "1"); + repr->setAttribute("stdDeviation", "1"); break; case NR::NR_FILTER_IMAGE: break; @@ -317,7 +319,7 @@ new_filter_blend_gaussian_blur (SPDocument *document, const char *blendmode, gdo SPFilter * new_filter_simple_from_item (SPDocument *document, SPItem *item, const char *mode, gdouble radius) { - NR::Maybe const r = sp_item_bbox_desktop(item); + NR::Maybe const r = sp_item_bbox_desktop(item, SPItem::GEOMETRIC_BBOX); double width; double height; @@ -330,7 +332,7 @@ new_filter_simple_from_item (SPDocument *document, SPItem *item, const char *mod NR::Matrix i2d = sp_item_i2d_affine (item); - return (new_filter_blend_gaussian_blur (document, mode, radius, i2d.expansion(), i2d.expansionX(), i2d.expansionY(), width, height)); + return (new_filter_blend_gaussian_blur (document, mode, radius, NR::expansion(i2d), NR::expansionX(i2d), NR::expansionY(i2d), width, height)); } /** @@ -347,7 +349,7 @@ modify_filter_gaussian_blur_from_item(SPDocument *document, SPItem *item, gdouble radius) { if (!item->style || !item->style->filter.set) { - //return new_filter_gaussian_blur_from_item(document, item, radius); + return new_filter_simple_from_item(document, item, "normal", radius); } SPFilter *filter = SP_FILTER(item->style->getFilter()); @@ -366,13 +368,13 @@ modify_filter_gaussian_blur_from_item(SPDocument *document, SPItem *item, // Determine the required standard deviation value NR::Matrix i2d = sp_item_i2d_affine (item); - double expansion = i2d.expansion(); + double expansion = NR::expansion(i2d); double stdDeviation = radius; if (expansion != 0) stdDeviation /= expansion; // Get the object size - NR::Maybe const r = sp_item_bbox_desktop(item); + NR::Maybe const r = sp_item_bbox_desktop(item, SPItem::GEOMETRIC_BBOX); double width; double height; if (r) { @@ -384,8 +386,8 @@ modify_filter_gaussian_blur_from_item(SPDocument *document, SPItem *item, // Set the filter effects area Inkscape::XML::Node *repr = SP_OBJECT_REPR(item->style->getFilter()); - set_filter_area(repr, radius, expansion, i2d.expansionX(), - i2d.expansionY(), width, height); + set_filter_area(repr, radius, expansion, NR::expansionX(i2d), + NR::expansionY(i2d), width, height); // Search for gaussian blur primitives. If found, set the stdDeviation // of the first one and return. @@ -455,6 +457,32 @@ void remove_filter_gaussian_blur (SPObject *item) } } +bool filter_is_single_gaussian_blur(SPFilter *filter) +{ + return (SP_OBJECT(filter)->firstChild() && + SP_OBJECT(filter)->firstChild() == SP_OBJECT(filter)->lastChild() && + SP_IS_GAUSSIANBLUR(SP_OBJECT(filter)->firstChild())); +} + +double get_single_gaussian_blur_radius(SPFilter *filter) +{ + if (SP_OBJECT(filter)->firstChild() && + SP_OBJECT(filter)->firstChild() == SP_OBJECT(filter)->lastChild() && + SP_IS_GAUSSIANBLUR(SP_OBJECT(filter)->firstChild())) { + + SPGaussianBlur *gb = SP_GAUSSIANBLUR(SP_OBJECT(filter)->firstChild()); + double x = gb->stdDeviation.getNumber(); + double y = gb->stdDeviation.getOptNumber(); + if (x > 0 && y > 0) { + return MAX(x, y); + } + return x; + } + return 0.0; +} + + + /* Local Variables: mode:c++