summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorbulia byak <buliabyak@gmail.com>2006-09-28 05:28:43 +0000
committerbuliabyak <buliabyak@users.sourceforge.net>2006-09-28 05:28:43 +0000
commitac7e3a0d4c9d85bbc5e75e7ad98fd1bbe136dbef (patch)
tree37b94740c79e0f78b5e59e22381e131578f56ebc /src
parentfix bug in my previous commit: updating rotation centers was broken (diff)
downloadinkscape-ac7e3a0d4c9d85bbc5e75e7ad98fd1bbe136dbef.tar.gz
inkscape-ac7e3a0d4c9d85bbc5e75e7ad98fd1bbe136dbef.zip
factor out creation of livarot_path, and make it on-demand so that update_repr does not need to do it after screen update (potentially fixing a crash)
(bzr r1721)
Diffstat (limited to 'src')
-rw-r--r--src/node-context.cpp1
-rw-r--r--src/nodepath.cpp45
-rw-r--r--src/nodepath.h1
3 files changed, 23 insertions, 24 deletions
diff --git a/src/node-context.cpp b/src/node-context.cpp
index 3142e5b0e..6ad2254ce 100644
--- a/src/node-context.cpp
+++ b/src/node-context.cpp
@@ -378,6 +378,7 @@ sp_node_context_is_over_stroke (SPNodeContext *nc, SPItem *item, NR::Point event
nc->curvepoint_doc *= sp_item_dt2i_affine(item);
nc->curvepoint_doc *= sp_item_i2doc_affine(item);
+ sp_nodepath_ensure_livarot_path(nc->nodepath);
NR::Maybe<Path::cut_position> position = get_nearest_position_on_Path(nc->nodepath->livarot_path, nc->curvepoint_doc);
NR::Point nearest = get_point_on_Path(nc->nodepath->livarot_path, position.assume().piece, position.assume().t);
NR::Point delta = nearest - nc->curvepoint_doc;
diff --git a/src/nodepath.cpp b/src/nodepath.cpp
index 7c7dc956e..59a6bcce3 100644
--- a/src/nodepath.cpp
+++ b/src/nodepath.cpp
@@ -211,9 +211,7 @@ Inkscape::NodePath::Path *sp_nodepath_new(SPDesktop *desktop, SPItem *item, bool
sp_curve_unref(curve);
// create the livarot representation from the same item
- np->livarot_path = Path_for_item(item, true, true);
- if (np->livarot_path)
- np->livarot_path->ConvertWithBackData(0.01);
+ sp_nodepath_ensure_livarot_path(np);
return np;
}
@@ -247,6 +245,16 @@ void sp_nodepath_destroy(Inkscape::NodePath::Path *np) {
}
+void sp_nodepath_ensure_livarot_path(Inkscape::NodePath::Path *np)
+{
+ if (np && np->livarot_path == NULL && np->path && SP_IS_ITEM(np->path)) {
+ np->livarot_path = Path_for_item (np->path, true, true);
+ if (np->livarot_path)
+ np->livarot_path->ConvertWithBackData(0.01);
+ }
+}
+
+
/**
* Return the node count of a given NodeSubPath.
*/
@@ -482,23 +490,16 @@ void sp_nodepath_update_repr(Inkscape::NodePath::Path *np, const gchar *annotati
//fixme: np can be NULL, so check before proceeding
g_return_if_fail(np != NULL);
- update_repr_internal(np);
- sp_canvas_end_forced_full_redraws(np->desktop->canvas);
-
- sp_document_done(sp_desktop_document(np->desktop), SP_VERB_CONTEXT_NODE,
- annotation);
-
if (np->livarot_path) {
delete np->livarot_path;
np->livarot_path = NULL;
}
- if (np->path && SP_IS_ITEM(np->path)) {
- np->livarot_path = Path_for_item (np->path, true, true);
- if (np->livarot_path)
- np->livarot_path->ConvertWithBackData(0.01);
- }
-
+ update_repr_internal(np);
+ sp_canvas_end_forced_full_redraws(np->desktop->canvas);
+
+ sp_document_done(sp_desktop_document(np->desktop), SP_VERB_CONTEXT_NODE,
+ annotation);
}
/**
@@ -506,20 +507,14 @@ void sp_nodepath_update_repr(Inkscape::NodePath::Path *np, const gchar *annotati
*/
static void sp_nodepath_update_repr_keyed(Inkscape::NodePath::Path *np, gchar const *key, const gchar *annotation)
{
- update_repr_internal(np);
- sp_document_maybe_done(sp_desktop_document(np->desktop), key, SP_VERB_CONTEXT_NODE,
- annotation);
-
if (np->livarot_path) {
delete np->livarot_path;
np->livarot_path = NULL;
}
- if (np->path && SP_IS_ITEM(np->path)) {
- np->livarot_path = Path_for_item (np->path, true, true);
- if (np->livarot_path)
- np->livarot_path->ConvertWithBackData(0.01);
- }
+ update_repr_internal(np);
+ sp_document_maybe_done(sp_desktop_document(np->desktop), key, SP_VERB_CONTEXT_NODE,
+ annotation);
}
/**
@@ -1552,6 +1547,7 @@ sp_nodepath_select_segment_near_point(Inkscape::NodePath::Path *nodepath, NR::Po
return;
}
+ sp_nodepath_ensure_livarot_path(nodepath);
Path::cut_position position = get_nearest_position_on_Path(nodepath->livarot_path, p);
//find segment to segment
@@ -1583,6 +1579,7 @@ sp_nodepath_add_node_near_point(Inkscape::NodePath::Path *nodepath, NR::Point p)
return;
}
+ sp_nodepath_ensure_livarot_path(nodepath);
Path::cut_position position = get_nearest_position_on_Path(nodepath->livarot_path, p);
//find segment to split
diff --git a/src/nodepath.h b/src/nodepath.h
index 856740038..0216af730 100644
--- a/src/nodepath.h
+++ b/src/nodepath.h
@@ -245,6 +245,7 @@ enum {
// Do function documentation in nodepath.cpp
Inkscape::NodePath::Path * sp_nodepath_new (SPDesktop * desktop, SPItem * item, bool show_handles);
void sp_nodepath_destroy (Inkscape::NodePath::Path * nodepath);
+void sp_nodepath_ensure_livarot_path(Inkscape::NodePath::Path *np);
void sp_nodepath_deselect (Inkscape::NodePath::Path *nodepath);
void sp_nodepath_select_all (Inkscape::NodePath::Path *nodepath, bool invert);
void sp_nodepath_select_all_from_subpath(Inkscape::NodePath::Path *nodepath, bool invert);