summaryrefslogtreecommitdiffstats
path: root/unicode/unicodecpp.C
diff options
context:
space:
mode:
Diffstat (limited to 'unicode/unicodecpp.C')
-rw-r--r--unicode/unicodecpp.C71
1 files changed, 64 insertions, 7 deletions
diff --git a/unicode/unicodecpp.C b/unicode/unicodecpp.C
index babb6bb..7bb6edc 100644
--- a/unicode/unicodecpp.C
+++ b/unicode/unicodecpp.C
@@ -581,18 +581,29 @@ void unicode::bidi_calc_types::setbnl(std::u32string &s)
unicode_bidi_setbnl(&s[0], &types[0], s.size());
}
-std::tuple<std::vector<unicode_bidi_level_t>, unicode_bidi_level_t>
+std::tuple<std::vector<unicode_bidi_level_t>,
+ struct unicode_bidi_direction>
unicode::bidi_calc(const bidi_calc_types &s)
{
return unicode::bidi_calc(s, UNICODE_BIDI_SKIP);
}
-std::tuple<std::vector<unicode_bidi_level_t>, unicode_bidi_level_t>
+std::tuple<std::vector<unicode_bidi_level_t>,
+ struct unicode_bidi_direction>
unicode::bidi_calc(const bidi_calc_types &st,
unicode_bidi_level_t paragraph_embedding_level)
{
+ std::tuple<std::vector<unicode_bidi_level_t>,
+ struct unicode_bidi_direction>
+ ret;
+ auto &direction_ret=std::get<1>(ret);
+
if (st.s.size() != st.types.size())
- return { {}, UNICODE_BIDI_LR };
+ {
+ direction_ret.direction=UNICODE_BIDI_LR;
+ direction_ret.is_explicit=false;
+ return ret;
+ }
const unicode_bidi_level_t *initial_embedding_level=0;
@@ -602,11 +613,17 @@ unicode::bidi_calc(const bidi_calc_types &st,
initial_embedding_level=&paragraph_embedding_level;
}
- std::tuple<std::vector<unicode_bidi_level_t>, unicode_bidi_level_t>
- ret;
-
std::get<0>(ret).resize(st.s.size());
- std::get<1>(ret)=UNICODE_BIDI_LR;
+
+ if (initial_embedding_level)
+ {
+ direction_ret.direction=paragraph_embedding_level;
+ direction_ret.is_explicit=1;
+ }
+ else
+ {
+ direction_ret.direction= UNICODE_BIDI_LR;
+ }
if (st.s.size())
{
@@ -932,3 +949,43 @@ unicode_bidi_direction unicode::bidi_get_direction(const std::u32string &string,
return unicode_bidi_get_direction(string.c_str()+starting_pos, n);
}
+
+bool unicode::bidi_needs_embed(const std::u32string &string,
+ const std::vector<unicode_bidi_level_t> &levels,
+ const unicode_bidi_level_t *paragraph_embedding,
+ size_t starting_pos,
+ size_t n)
+{
+ if (string.size() != levels.size())
+ return false;
+
+ auto s=levels.size();
+
+ if (starting_pos >= s)
+ return false;
+
+ if (n > s-starting_pos)
+ n=s-starting_pos;
+
+ return unicode_bidi_needs_embed(string.c_str(),
+ n == 0 ? NULL : &levels[starting_pos],
+ n,
+ paragraph_embedding) != 0;
+}
+
+std::u32string unicode::bidi_override(const std::u32string &s,
+ unicode_bidi_level_t direction,
+ int cleanup_options)
+{
+ std::u32string ret;
+
+ ret.reserve(s.size()+1);
+
+ ret.push_back(' ');
+ ret.insert(ret.end(), s.begin(), s.end());
+
+ bidi_cleanup(ret, [](size_t) {}, cleanup_options);
+ ret.at(0)=direction & 1 ? UNICODE_RLO : UNICODE_LRO;
+
+ return ret;
+}