From a5cc76216e08481a6f3614574a8ee498e5800afa Mon Sep 17 00:00:00 2001 From: Sam Varshavchik Date: Sun, 6 Dec 2020 22:35:33 -0500 Subject: courier-unicode: partial logical reordering. --- unicode/biditest2.C | 6 +++++- unicode/book.xml | 14 ++++++++++---- unicode/courier-unicode.h.in | 8 ++++++-- unicode/unicodecpp.C | 29 ++++++++++++++++++++++------- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/unicode/biditest2.C b/unicode/biditest2.C index cbd8c25..ce293b6 100644 --- a/unicode/biditest2.C +++ b/unicode/biditest2.C @@ -349,7 +349,11 @@ void character_test() unicode::bidi_logical_order(logical_string, logical_levels, - paragraph); + paragraph, + [] + (size_t, size_t) {}, + 0, + logical_string.size()); auto new_string=unicode::bidi_embed(logical_string, logical_levels, diff --git a/unicode/book.xml b/unicode/book.xml index 45686dc..3eb0a6e 100644 --- a/unicode/book.xml +++ b/unicode/book.xml @@ -2878,14 +2878,18 @@ See COPYING for distribution information. std::u32string &string std::vector <unicode_bidi_level_t> &levels unicode_bidi_level_t paragraph_embedding - const std::function<void (size_t, size_t) noexcept> &removed_callback + const std::function<void (size_t, size_t) noexcept> &reorder_callback=[](size_t, size_t){} + size_t starting_pos=0 + size_t n=(size_t)-1 void unicode::bidi_logical_order std::vector <unicode_bidi_level_t> &levels unicode_bidi_level_t paragraph_embedding - const std::function<void (size_t, size_t) noexcept> &removed_callback + const std::function<void (size_t, size_t) noexcept> &reorder_callback + size_t starting_pos=0 + size_t n=(size_t)-1 @@ -3043,8 +3047,10 @@ auto [levels, level]=unicode::bidi_calc(types); - unicode::bidi_reorder and - unicode::bidi_cleanup take two optional + unicode::bidi_reorder, + unicode::bidi_cleanup, and + unicode::bidi_logical_order + take two optional parameters (defaulted values or overloaded) specifying an optional starting position and number of characters that define a subset of the original string that gets reordered diff --git a/unicode/courier-unicode.h.in b/unicode/courier-unicode.h.in index 4bc7b55..9d398ec 100644 --- a/unicode/courier-unicode.h.in +++ b/unicode/courier-unicode.h.in @@ -2291,12 +2291,16 @@ int bidi_logical_order(std::u32string &string, std::vector &levels, unicode_bidi_level_t paragraph_embedding, const std::function - &lambda=[](size_t,size_t){}); + &lambda=[](size_t,size_t){}, + size_t starting_pos=0, + size_t n=(size_t)-1); //! Convert Unicode string from canonical rendering order to logical order. void bidi_logical_order(std::vector &levels, unicode_bidi_level_t paragraph_embedding, - const std::function &lambda); + const std::function &lambda, + size_t starting_pos=0, + size_t n=(size_t)-1); //! Embed directional and isolation markers diff --git a/unicode/unicodecpp.C b/unicode/unicodecpp.C index 5677b86..3ef3b05 100644 --- a/unicode/unicodecpp.C +++ b/unicode/unicodecpp.C @@ -806,16 +806,24 @@ int unicode::bidi_logical_order(std::u32string &string, std::vector &levels, unicode_bidi_level_t paragraph_embedding, const std::function - &lambda) + &lambda, + size_t starting_pos, + size_t n) { - if (string.size() != levels.size()) + auto s=string.size(); + + if (s != levels.size()) return -1; - if (string.empty()) + if (starting_pos >= s) return 0; + if (n > s-starting_pos) + n=s-starting_pos; + cb_wrapper cb{lambda}; - unicode_bidi_logical_order(&string[0], &levels[0], string.size(), + unicode_bidi_logical_order(&string[starting_pos], + &levels[starting_pos], n, paragraph_embedding, &reorder_callback, reinterpret_cast(&cb)); @@ -826,13 +834,20 @@ int unicode::bidi_logical_order(std::u32string &string, void unicode::bidi_logical_order(std::vector &levels, unicode_bidi_level_t paragraph_embedding, const std::function - &lambda) + &lambda, + size_t starting_pos, + size_t n) { - if (levels.size() == 0) + auto s=levels.size(); + + if (starting_pos >= s) return; + if (n > s-starting_pos) + n=s-starting_pos; + cb_wrapper cb{lambda}; - unicode_bidi_logical_order(NULL, &levels[0], levels.size(), + unicode_bidi_logical_order(NULL, &levels[starting_pos], n, paragraph_embedding, &reorder_callback, reinterpret_cast(&cb)); -- cgit v1.2.3