From 648df6b455791766d98e132d021c42687d578b2c Mon Sep 17 00:00:00 2001 From: buliabyak Date: Thu, 28 Sep 2006 05:28:43 +0000 Subject: [PATCH] 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) --- src/node-context.cpp | 1 + src/nodepath.cpp | 45 +++++++++++++++++++++----------------------- src/nodepath.h | 1 + 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 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); -- 2.39.5