Code

new command: relink clone to copied object
[inkscape.git] / src / sp-femorphology.cpp
index 78b7bbaf4acc934000cc294002b2fbd57207af08..01290391f68b98aaeee43b2b6ab28d34a6d5fab2 100644 (file)
@@ -6,7 +6,8 @@
  */
 /*
  * Authors:
- *   hugo Rodrigues <haa.rodrigues@gmail.com>
+ *   Felipe Sanches <felipe.sanches@gmail.com>
+ *   Hugo Rodrigues <haa.rodrigues@gmail.com>
  *
  * Copyright (C) 2006 Hugo Rodrigues
  *
 # include "config.h"
 #endif
 
+#include <string.h>
+
 #include "attributes.h"
 #include "svg/svg.h"
 #include "sp-femorphology.h"
 #include "xml/repr.h"
-
+#include "display/nr-filter-morphology.h"
 
 /* FeMorphology base class */
 
@@ -32,7 +35,8 @@ static void sp_feMorphology_build(SPObject *object, SPDocument *document, Inksca
 static void sp_feMorphology_release(SPObject *object);
 static void sp_feMorphology_set(SPObject *object, unsigned int key, gchar const *value);
 static void sp_feMorphology_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feMorphology_write(SPObject *object, Inkscape::XML::Node *repr, guint flags);
+static Inkscape::XML::Node *sp_feMorphology_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
+static void sp_feMorphology_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter);
 
 static SPFilterPrimitiveClass *feMorphology_parent_class;
 
@@ -61,7 +65,8 @@ static void
 sp_feMorphology_class_init(SPFeMorphologyClass *klass)
 {
     SPObjectClass *sp_object_class = (SPObjectClass *)klass;
-
+    SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
+    
     feMorphology_parent_class = (SPFilterPrimitiveClass*)g_type_class_peek_parent(klass);
 
     sp_object_class->build = sp_feMorphology_build;
@@ -69,11 +74,14 @@ sp_feMorphology_class_init(SPFeMorphologyClass *klass)
     sp_object_class->write = sp_feMorphology_write;
     sp_object_class->set = sp_feMorphology_set;
     sp_object_class->update = sp_feMorphology_update;
+    sp_primitive_class->build_renderer = sp_feMorphology_build_renderer;
 }
 
 static void
 sp_feMorphology_init(SPFeMorphology *feMorphology)
 {
+    //Setting default values:
+    feMorphology->radius.set("0");
 }
 
 /**
@@ -89,6 +97,8 @@ sp_feMorphology_build(SPObject *object, SPDocument *document, Inkscape::XML::Nod
     }
 
     /*LOAD ATTRIBUTES FROM REPR HERE*/
+    sp_object_read_attr(object, "operator");
+    sp_object_read_attr(object, "radius");
 }
 
 /**
@@ -101,6 +111,19 @@ sp_feMorphology_release(SPObject *object)
         ((SPObjectClass *) feMorphology_parent_class)->release(object);
 }
 
+static NR::FilterMorphologyOperator sp_feMorphology_read_operator(gchar const *value){
+    if (!value) return NR::MORPHOLOGY_OPERATOR_ERODE; //erode is default
+    switch(value[0]){
+        case 'e':
+            if (strncmp(value, "erode", 5) == 0) return NR::MORPHOLOGY_OPERATOR_ERODE;
+            break;
+        case 'd':
+            if (strncmp(value, "dilate", 6) == 0) return NR::MORPHOLOGY_OPERATOR_DILATE;
+            break;
+    }
+    return NR::MORPHOLOGY_OPERATOR_ERODE; //erode is default
+}
+
 /**
  * Sets a specific value in the SPFeMorphology.
  */
@@ -109,9 +132,24 @@ sp_feMorphology_set(SPObject *object, unsigned int key, gchar const *value)
 {
     SPFeMorphology *feMorphology = SP_FEMORPHOLOGY(object);
     (void)feMorphology;
-
+    
+    NR::FilterMorphologyOperator read_operator;
     switch(key) {
-       /*DEAL WITH SETTING ATTRIBUTES HERE*/
+    /*DEAL WITH SETTING ATTRIBUTES HERE*/
+        case SP_ATTR_OPERATOR:
+            read_operator = sp_feMorphology_read_operator(value);
+            if (read_operator != feMorphology->Operator){
+                feMorphology->Operator = read_operator;
+                object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+            }
+            break;
+        case SP_ATTR_RADIUS:
+            feMorphology->radius.set(value);
+            //From SVG spec: If <y-radius> is not provided, it defaults to <x-radius>.
+            if (feMorphology->radius.optNumIsSet() == false)
+                feMorphology->radius.setOptNumber(feMorphology->radius.getNumber());
+            object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+            break;
         default:
             if (((SPObjectClass *) feMorphology_parent_class)->set)
                 ((SPObjectClass *) feMorphology_parent_class)->set(object, key, value);
@@ -142,25 +180,42 @@ sp_feMorphology_update(SPObject *object, SPCtx *ctx, guint flags)
  * Writes its settings to an incoming repr object, if any.
  */
 static Inkscape::XML::Node *
-sp_feMorphology_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)
+sp_feMorphology_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
 {
     // Inkscape-only object, not copied during an "plain SVG" dump:
     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(NULL); // FIXME
+            repr = SP_OBJECT_REPR(object)->duplicate(doc);
         }
     }
 
     if (((SPObjectClass *) feMorphology_parent_class)->write) {
-        ((SPObjectClass *) feMorphology_parent_class)->write(object, repr, flags);
+        ((SPObjectClass *) feMorphology_parent_class)->write(object, doc, repr, flags);
     }
 
     return repr;
 }
 
+static void sp_feMorphology_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter) {
+    g_assert(primitive != NULL);
+    g_assert(filter != NULL);
+
+    SPFeMorphology *sp_morphology = SP_FEMORPHOLOGY(primitive);
+
+    int primitive_n = filter->add_primitive(NR::NR_FILTER_MORPHOLOGY);
+    NR::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
+    NR::FilterMorphology *nr_morphology = dynamic_cast<NR::FilterMorphology*>(nr_primitive);
+    g_assert(nr_morphology != NULL);
+
+    sp_filter_primitive_renderer_common(primitive, nr_primitive); 
+    
+    nr_morphology->set_operator(sp_morphology->Operator);
+    nr_morphology->set_xradius( sp_morphology->radius.getNumber() );
+    nr_morphology->set_yradius( sp_morphology->radius.getOptNumber() );
+}
 
 /*
   Local Variables: