Code

Extensions. Barcode extension refactoring (see https://code.launchpad.net/~doctormo...
[inkscape.git] / src / sp-path.cpp
index e570030dd439869b1a8dcd27d5187e7561672a46..66a70e0f1dc35e78a1f90b9a81f158c57e00a5ba 100644 (file)
@@ -1,11 +1,10 @@
-#define __SP_PATH_C__
-
 /*
  * SVG <path> implementation
  *
  * Authors:
  *   Lauris Kaplinski <lauris@kaplinski.com>
  *   David Turner <novalis@gnu.org>
+ *   Abhishek Sharma
  *
  * Copyright (C) 2004 David Turner
  * Copyright (C) 1999-2002 Lauris Kaplinski
@@ -171,7 +170,7 @@ sp_path_convert_to_guides(SPItem *item)
 
     std::list<std::pair<Geom::Point, Geom::Point> > pts;
 
-    Geom::Matrix const i2d (sp_item_i2d_affine(SP_ITEM(path)));
+    Geom::Matrix const i2d (SP_ITEM(path)->i2d_affine());
 
     Geom::PathVector const & pv = curve->get_pathvector();
     for(Geom::PathVector::const_iterator pit = pv.begin(); pit != pv.end(); ++pit) {
@@ -214,10 +213,10 @@ static void
 sp_path_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
 {
     /* Are these calls actually necessary? */
-    sp_object_read_attr(object, "marker");
-    sp_object_read_attr(object, "marker-start");
-    sp_object_read_attr(object, "marker-mid");
-    sp_object_read_attr(object, "marker-end");
+    object->readAttr( "marker" );
+    object->readAttr( "marker-start" );
+    object->readAttr( "marker-mid" );
+    object->readAttr( "marker-end" );
 
     sp_conn_end_pair_build(object);
 
@@ -225,13 +224,13 @@ sp_path_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
         ((SPObjectClass *) parent_class)->build(object, document, repr);
     }
 
-    sp_object_read_attr(object, "inkscape:original-d");
-    sp_object_read_attr(object, "d");
+    object->readAttr( "inkscape:original-d" );
+    object->readAttr( "d" );
 
     /* d is a required attribute */
-    gchar const *d = sp_object_getAttribute(object, "d", NULL);
+    gchar const *d = object->getAttribute("d", NULL);
     if (d == NULL) {
-        sp_object_set(object, sp_attribute_lookup("d"), "");
+        object->setKeyValue( sp_attribute_lookup("d"), "");
     }
 }
 
@@ -275,19 +274,17 @@ sp_path_set(SPObject *object, unsigned int key, gchar const *value)
                 object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
             break;
        case SP_ATTR_D:
-            if (!sp_lpe_item_has_path_effect_recursive(SP_LPE_ITEM(path))) {
                 if (value) {
                     Geom::PathVector pv = sp_svg_read_pathv(value);
                     SPCurve *curve = new SPCurve(pv);
                     if (curve) {
-                        sp_shape_set_curve((SPShape *) path, curve, TRUE);
+                        ((SPShape *) path)->setCurve(curve, TRUE);
                         curve->unref();
                     }
                 } else {
-                    sp_shape_set_curve((SPShape *) path, NULL, TRUE);
+                    ((SPShape *) path)->setCurve(NULL, TRUE);
                 }
                 object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
-            }
             break;
         case SP_PROP_MARKER:
         case SP_PROP_MARKER_START:
@@ -297,8 +294,11 @@ sp_path_set(SPObject *object, unsigned int key, gchar const *value)
             object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
             break;
         case SP_ATTR_CONNECTOR_TYPE:
+        case SP_ATTR_CONNECTOR_CURVATURE:
         case SP_ATTR_CONNECTION_START:
         case SP_ATTR_CONNECTION_END:
+        case SP_ATTR_CONNECTION_START_POINT:
+        case SP_ATTR_CONNECTION_END_POINT:
             path->connEndPair.setAttr(key, value);
             break;
         default:
@@ -322,6 +322,9 @@ sp_path_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML:
         repr = xml_doc->createElement("svg:path");
     }
 
+#ifdef PATH_VERBOSE
+g_message("sp_path_write writes 'd' attribute");
+#endif
     if ( shape->curve != NULL ) {
         gchar *str = sp_svg_write_path(shape->curve->get_pathvector());
         repr->setAttribute("d", str);
@@ -330,13 +333,15 @@ sp_path_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML:
         repr->setAttribute("d", NULL);
     }
 
-    SPPath *path = (SPPath *) object;
-    if ( path->original_curve != NULL ) {
-        gchar *str = sp_svg_write_path(path->original_curve->get_pathvector());
-        repr->setAttribute("inkscape:original-d", str);
-        g_free(str);
-    } else {
-        repr->setAttribute("inkscape:original-d", NULL);
+    if (flags & SP_OBJECT_WRITE_EXT) {
+        SPPath *path = (SPPath *) object;
+        if ( path->original_curve != NULL ) {
+            gchar *str = sp_svg_write_path(path->original_curve->get_pathvector());
+            repr->setAttribute("inkscape:original-d", str);
+            g_free(str);
+        } else {
+            repr->setAttribute("inkscape:original-d", NULL);
+        }
     }
 
     SP_PATH(shape)->connEndPair.writeRepr(repr);
@@ -379,23 +384,23 @@ sp_path_set_transform(SPItem *item, Geom::Matrix const &xform)
 
     // Transform the original-d path if this is a valid LPE item, other else the (ordinary) path
     if (path->original_curve && SP_IS_LPE_ITEM(item) && 
-                                sp_lpe_item_has_path_effect(SP_LPE_ITEM(item))) {
+                                sp_lpe_item_has_path_effect_recursive(SP_LPE_ITEM(item))) {
         path->original_curve->transform(xform);
     } else {
         shape->curve->transform(xform);
     }
 
     // Adjust stroke
-    sp_item_adjust_stroke(item, xform.descrim());
+    item->adjust_stroke(xform.descrim());
 
     // Adjust pattern fill
-    sp_item_adjust_pattern(item, xform);
+    item->adjust_pattern(xform);
 
     // Adjust gradient fill
-    sp_item_adjust_gradient(item, xform);
+    item->adjust_gradient(xform);
 
     // Adjust LPE
-    sp_item_adjust_livepatheffect(item, xform);
+    item->adjust_livepatheffect(xform);
 
     item->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG);
 
@@ -411,15 +416,22 @@ sp_path_update_patheffect(SPLPEItem *lpeitem, bool write)
     SPPath * const path = (SPPath *) lpeitem;
     Inkscape::XML::Node *repr = SP_OBJECT_REPR(shape);
 
-    if (path->original_curve && sp_lpe_item_has_path_effect(lpeitem)) {
+#ifdef PATH_VERBOSE
+g_message("sp_path_update_patheffect");
+#endif
+
+    if (path->original_curve && sp_lpe_item_has_path_effect_recursive(lpeitem)) {
         SPCurve *curve = path->original_curve->copy();
         /* if a path does not have an lpeitem applied, then reset the curve to the original_curve.
          * This is very important for LPEs to work properly! (the bbox might be recalculated depending on the curve in shape)*/
-        sp_shape_set_curve_insync(shape, curve, TRUE);
+        shape->setCurveInsync(curve, TRUE);
 
         bool success = sp_lpe_item_perform_path_effect(SP_LPE_ITEM(shape), curve);
         if (success && write) {
             // could also do SP_OBJECT(shape)->updateRepr();  but only the d attribute needs updating.
+#ifdef PATH_VERBOSE
+g_message("sp_path_update_patheffect writes 'd' attribute");
+#endif
             if ( shape->curve != NULL ) {
                 gchar *str = sp_svg_write_path(shape->curve->get_pathvector());
                 repr->setAttribute("d", str);
@@ -427,13 +439,13 @@ sp_path_update_patheffect(SPLPEItem *lpeitem, bool write)
             } else {
                 repr->setAttribute("d", NULL);
             }
-        } else {
+        } else if (!success) {
             // LPE was unsuccesfull. Read the old 'd'-attribute.
             if (gchar const * value = repr->attribute("d")) {
                 Geom::PathVector pv = sp_svg_read_pathv(value);
                 SPCurve *oldcurve = new SPCurve(pv);
                 if (oldcurve) {
-                    sp_shape_set_curve(shape, oldcurve, TRUE);
+                    shape->setCurve(oldcurve, TRUE);
                     oldcurve->unref();
                 }
             }
@@ -489,10 +501,10 @@ SPCurve*
 sp_path_get_curve_for_edit (SPPath *path)
 {
     if (path->original_curve && SP_IS_LPE_ITEM(path) && 
-                                sp_lpe_item_has_path_effect(SP_LPE_ITEM(path))) {
+                                sp_lpe_item_has_path_effect_recursive(SP_LPE_ITEM(path))) {
         return sp_path_get_original_curve(path);
     } else {
-        return sp_shape_get_curve( (SPShape *) path );
+        return ((SPShape *) path)->getCurve();
     }
 }
 
@@ -504,7 +516,7 @@ const SPCurve*
 sp_path_get_curve_reference (SPPath *path)
 {
     if (path->original_curve && SP_IS_LPE_ITEM(path) && 
-                                sp_lpe_item_has_path_effect(SP_LPE_ITEM(path))) {
+                                sp_lpe_item_has_path_effect_recursive(SP_LPE_ITEM(path))) {
         return path->original_curve;
     } else {
         return path->curve;