index b9ff1287b9bdbc4bc08497b413ec180fdf56f206..cefb3227dd29cf82583511d21903e3ffb0230c2a 100644 (file)
--- a/src/filter-chemistry.cpp
+++ b/src/filter-chemistry.cpp
* bulia byak
* Niko Kiirala
*
- * Copyright (C) 2006,2007 authors
+ * Copyright (C) 2006-2008 authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
#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"
@@ -318,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<NR::Rect> const r = sp_item_bbox_desktop(item);
+ NR::Maybe<NR::Rect> const r = sp_item_bbox_desktop(item, SPItem::GEOMETRIC_BBOX);
double width;
double height;
@@ -329,9 +330,9 @@ new_filter_simple_from_item (SPDocument *document, SPItem *item, const char *mod
width = height = 0;
}
- NR::Matrix i2d = sp_item_i2d_affine (item);
+ NR::Matrix i2d = from_2geom(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));
}
/**
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());
}
// Determine the required standard deviation value
- NR::Matrix i2d = sp_item_i2d_affine (item);
- double expansion = i2d.expansion();
+ NR::Matrix i2d = from_2geom(sp_item_i2d_affine (item));
+ double expansion = NR::expansion(i2d);
double stdDeviation = radius;
if (expansion != 0)
stdDeviation /= expansion;
// Get the object size
- NR::Maybe<NR::Rect> const r = sp_item_bbox_desktop(item);
+ NR::Maybe<NR::Rect> const r = sp_item_bbox_desktop(item, SPItem::GEOMETRIC_BBOX);
double width;
double height;
if (r) {
// 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.
}
}
+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++