Code

Fix ef spam when adjusting pattern on text - patch from Adonis Papaderos
[inkscape.git] / src / filter-chemistry.cpp
index 46dbfe0f50c8ee58ff11d9811269fdbe1733ba59..63e618dcf8fc2f297a2d98cbb7328ea1f922f191 100644 (file)
@@ -8,7 +8,7 @@
  *   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
  */
@@ -21,7 +21,7 @@
 #include "filter-chemistry.h"
 #include "filter-enums.h"
 
-#include "sp-feblend.h"
+#include "filters/blend.h"
 #include "sp-filter.h"
 #include "sp-filter-reference.h"
 #include "sp-gaussian-blur.h"
@@ -115,7 +115,7 @@ SPFilter *new_filter(SPDocument *document)
 }
 
 SPFilterPrimitive *
-filter_add_primitive(SPFilter *filter, const NR::FilterPrimitiveType type)
+filter_add_primitive(SPFilter *filter, const Inkscape::Filters::FilterPrimitiveType type)
 {
     Inkscape::XML::Document *xml_doc = sp_document_repr_doc(filter->document);
 
@@ -125,43 +125,43 @@ filter_add_primitive(SPFilter *filter, const NR::FilterPrimitiveType type)
 
     // set default values
     switch(type) {
-        case NR::NR_FILTER_BLEND:
+        case Inkscape::Filters::NR_FILTER_BLEND:
             repr->setAttribute("blend", "normal");
             break;
-        case NR::NR_FILTER_COLORMATRIX:
+        case Inkscape::Filters::NR_FILTER_COLORMATRIX:
             break;
-        case NR::NR_FILTER_COMPONENTTRANSFER:
+        case Inkscape::Filters::NR_FILTER_COMPONENTTRANSFER:
             break;
-        case NR::NR_FILTER_COMPOSITE:
+        case Inkscape::Filters::NR_FILTER_COMPOSITE:
             break;
-        case NR::NR_FILTER_CONVOLVEMATRIX:
+        case Inkscape::Filters::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:
+        case Inkscape::Filters::NR_FILTER_DIFFUSELIGHTING:
             break;
-        case NR::NR_FILTER_DISPLACEMENTMAP:
+        case Inkscape::Filters::NR_FILTER_DISPLACEMENTMAP:
             break;
-        case NR::NR_FILTER_FLOOD:
+        case Inkscape::Filters::NR_FILTER_FLOOD:
             break;
-        case NR::NR_FILTER_GAUSSIANBLUR:
+        case Inkscape::Filters::NR_FILTER_GAUSSIANBLUR:
             repr->setAttribute("stdDeviation", "1");
             break;
-        case NR::NR_FILTER_IMAGE:
+        case Inkscape::Filters::NR_FILTER_IMAGE:
             break;
-        case NR::NR_FILTER_MERGE:
+        case Inkscape::Filters::NR_FILTER_MERGE:
             break;
-        case NR::NR_FILTER_MORPHOLOGY:
+        case Inkscape::Filters::NR_FILTER_MORPHOLOGY:
             break;
-        case NR::NR_FILTER_OFFSET:
+        case Inkscape::Filters::NR_FILTER_OFFSET:
             repr->setAttribute("dx", "0");
             repr->setAttribute("dy", "0");
             break;
-        case NR::NR_FILTER_SPECULARLIGHTING:
+        case Inkscape::Filters::NR_FILTER_SPECULARLIGHTING:
             break;
-        case NR::NR_FILTER_TILE:
+        case Inkscape::Filters::NR_FILTER_TILE:
             break;
-        case NR::NR_FILTER_TURBULENCE:
+        case Inkscape::Filters::NR_FILTER_TURBULENCE:
             break;
         default:
             break;
@@ -319,20 +319,20 @@ 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);
+    Geom::OptRect const r = sp_item_bbox_desktop(item, SPItem::GEOMETRIC_BBOX);
 
     double width;
     double height;
     if (r) {
-        width = r->extent(NR::X);
-        height= r->extent(NR::Y);
+        width = r->dimensions()[Geom::X];
+        height= r->dimensions()[Geom::Y];
     } else {
         width = height = 0;
     }
 
-    NR::Matrix i2d = sp_item_i2d_affine (item);
+    Geom::Matrix i2d (sp_item_i2d_affine (item) );
 
-    return (new_filter_blend_gaussian_blur (document, mode, radius, NR::expansion(i2d), NR::expansionX(i2d), NR::expansionY(i2d), width, height));
+    return (new_filter_blend_gaussian_blur (document, mode, radius, i2d.descrim(), i2d.expansionX(), i2d.expansionY(), width, height));
 }
 
 /**
@@ -349,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());
@@ -367,27 +367,27 @@ 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 = NR::expansion(i2d);
+    Geom::Matrix i2d (sp_item_i2d_affine (item));
+    double expansion = i2d.descrim();
     double stdDeviation = radius;
     if (expansion != 0)
         stdDeviation /= expansion;
 
     // Get the object size
-    NR::Maybe<NR::Rect> const r = sp_item_bbox_desktop(item);
+    Geom::OptRect const r = sp_item_bbox_desktop(item, SPItem::GEOMETRIC_BBOX);
     double width;
     double height;
     if (r) {
-        width = r->extent(NR::X);
-        height= r->extent(NR::Y);
+        width = r->dimensions()[Geom::X];
+        height= r->dimensions()[Geom::Y];
     } else {
         width = height = 0;
     }
 
     // Set the filter effects area
     Inkscape::XML::Node *repr = SP_OBJECT_REPR(item->style->getFilter());
-    set_filter_area(repr, radius, expansion, NR::expansionX(i2d),
-                    NR::expansionY(i2d), width, height);
+    set_filter_area(repr, radius, expansion, i2d.expansionX(),
+                    i2d.expansionY(), width, height);
 
     // Search for gaussian blur primitives. If found, set the stdDeviation
     // of the first one and return.
@@ -457,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++
@@ -466,4 +492,4 @@ void remove_filter_gaussian_blur (SPObject *item)
   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 :