diff options
| author | bulia byak <buliabyak@gmail.com> | 2006-09-28 05:28:43 +0000 |
|---|---|---|
| committer | buliabyak <buliabyak@users.sourceforge.net> | 2006-09-28 05:28:43 +0000 |
| commit | ac7e3a0d4c9d85bbc5e75e7ad98fd1bbe136dbef (patch) | |
| tree | 37b94740c79e0f78b5e59e22381e131578f56ebc /src/nodepath.cpp | |
| parent | fix bug in my previous commit: updating rotation centers was broken (diff) | |
| download | inkscape-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/nodepath.cpp')
| -rw-r--r-- | src/nodepath.cpp | 45 |
1 files changed, 21 insertions, 24 deletions
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 |
