diff options
Diffstat (limited to 'unicode/unicodecpp.C')
| -rw-r--r-- | unicode/unicodecpp.C | 71 | 
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=¶graph_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; +} | 
