From: buliabyak Date: Sun, 5 Feb 2006 00:44:16 +0000 (+0000) Subject: sp_text_get_length_upto to count length recursively up to a given child X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=b805145b47f7cd899f0403240e5b8fcefbb28d47;p=inkscape.git sp_text_get_length_upto to count length recursively up to a given child --- 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 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);