diff options
| author | bulia byak <buliabyak@gmail.com> | 2006-02-05 00:44:16 +0000 |
|---|---|---|
| committer | buliabyak <buliabyak@users.sourceforge.net> | 2006-02-05 00:44:16 +0000 |
| commit | d28d568ea6afd2e08266922daf6f2c12f6eac720 (patch) | |
| tree | 069a5c0fb116434f7da4b606b68b597b31957a4e /src | |
| parent | had 5 mins so I cleaned up a little more (diff) | |
| download | inkscape-d28d568ea6afd2e08266922daf6f2c12f6eac720.tar.gz inkscape-d28d568ea6afd2e08266922daf6f2c12f6eac720.zip | |
sp_text_get_length_upto to count length recursively up to a given child
(bzr r76)
Diffstat (limited to 'src')
| -rw-r--r-- | src/text-editing.cpp | 24 | ||||
| -rw-r--r-- | src/text-editing.h | 1 |
2 files changed, 25 insertions, 0 deletions
diff --git a/src/text-editing.cpp b/src/text-editing.cpp index 44450f8fa..d5a53fc49 100644 --- a/src/text-editing.cpp +++ b/src/text-editing.cpp @@ -182,6 +182,30 @@ unsigned sp_text_get_length(SPObject const *item) return length; } +/** Recursively gets the length of all the SPStrings at or below the given +\a item. Also adds 1 for each line break encountered. */ +unsigned sp_text_get_length_upto(SPObject const *item, SPObject const *upto) +{ + unsigned length = 0; + + if (SP_IS_STRING(item)) return SP_STRING(item)->string.length(); + if (is_line_break_object(item)) length++; + for (SPObject const *child = item->firstChild() ; child ; child = SP_OBJECT_NEXT(child)) { + if (child == upto) + return length; + if (SP_IS_STRING(child)) length += SP_STRING(child)->string.length(); + else { + if (child->isAncestorOf(upto)) { + length += sp_text_get_length(child); + return length; + } else { + length += sp_text_get_length(child); + } + } + } + return length; +} + static Inkscape::XML::Node* duplicate_node_without_children(Inkscape::XML::Node const *old_node) { switch (old_node->type()) { diff --git a/src/text-editing.h b/src/text-editing.h index 619bec89f..dba763f75 100644 --- a/src/text-editing.h +++ b/src/text-editing.h @@ -24,6 +24,7 @@ bool sp_te_output_is_empty (SPItem const *item); bool sp_te_input_is_empty (SPObject const *item); unsigned sp_text_get_length(SPObject const *item); +unsigned sp_text_get_length_upto(SPObject const *item, SPObject const *upto); std::vector<NR::Point> sp_te_create_selection_quads(SPItem const *item, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, NR::Matrix const &transform); Inkscape::Text::Layout::iterator sp_te_get_position_by_coords (SPItem const *item, NR::Point &i_p); |
