X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-path.cpp;h=66a70e0f1dc35e78a1f90b9a81f158c57e00a5ba;hb=6302669b796eadd6994ecdc2e70f0119b29194dd;hp=760f61e27f56550a7fb7ffba02909264950240e8;hpb=d9230e946308bebd074660d485dca111ebddf167;p=inkscape.git diff --git a/src/sp-path.cpp b/src/sp-path.cpp index 760f61e27..66a70e0f1 100644 --- a/src/sp-path.cpp +++ b/src/sp-path.cpp @@ -1,11 +1,10 @@ -#define __SP_PATH_C__ - /* * SVG implementation * * Authors: * Lauris Kaplinski * David Turner + * Abhishek Sharma * * Copyright (C) 2004 David Turner * Copyright (C) 1999-2002 Lauris Kaplinski @@ -20,6 +19,11 @@ #include +#include "live_effects/effect.h" +#include "live_effects/lpeobject.h" +#include "live_effects/lpeobject-reference.h" +#include "sp-lpe-item.h" + #include #include #include <2geom/pathvector.h> @@ -132,9 +136,24 @@ static gchar * sp_path_description(SPItem * item) { int count = sp_nodes_in_path(SP_PATH(item)); - if (sp_lpe_item_has_path_effect(SP_LPE_ITEM(item))) { - return g_strdup_printf(ngettext("Path (%i node, path effect)", - "Path (%i nodes, path effect)",count), count); + if (SP_IS_LPE_ITEM(item) && sp_lpe_item_has_path_effect(SP_LPE_ITEM(item))) { + + Glib::ustring s; + + PathEffectList effect_list = sp_lpe_item_get_effect_list(SP_LPE_ITEM(item)); + for (PathEffectList::iterator it = effect_list.begin(); it != effect_list.end(); it++) + { + LivePathEffectObject *lpeobj = (*it)->lpeobject; + if (!lpeobj || !lpeobj->get_lpe()) + break; + if (s.empty()) + s = lpeobj->get_lpe()->getName(); + else + s = s + ", " + lpeobj->get_lpe()->getName(); + } + + return g_strdup_printf(ngettext("Path (%i node, path effect: %s)", + "Path (%i nodes, path effect: %s)",count), count, s.c_str()); } else { return g_strdup_printf(ngettext("Path (%i node)", "Path (%i nodes)",count), count); @@ -151,7 +170,7 @@ sp_path_convert_to_guides(SPItem *item) std::list > 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) { @@ -194,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); @@ -205,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"), ""); } } @@ -255,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: @@ -277,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: @@ -302,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); @@ -310,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); @@ -359,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); @@ -391,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); @@ -407,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(); } } @@ -469,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(); } } @@ -484,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;