@@ -4773,17 +4773,24 @@ bool TextServerAdvanced::_shape_substr(ShapedTextDataAdvanced *p_new_sd, const S
4773
4773
}
4774
4774
}
4775
4775
4776
+ Vector<Vector3i> bidi_ranges;
4777
+ if (p_sd->bidi_override .is_empty ()) {
4778
+ bidi_ranges.push_back (Vector3i (p_sd->start , p_sd->end , DIRECTION_INHERITED));
4779
+ } else {
4780
+ bidi_ranges = p_sd->bidi_override ;
4781
+ }
4782
+
4776
4783
int sd_size = p_sd->glyphs .size ();
4777
4784
const Glyph *sd_glyphs = p_sd->glyphs .ptr ();
4778
- for (int ov = 0 ; ov < p_sd-> bidi_override .size (); ov++) {
4785
+ for (int ov = 0 ; ov < bidi_ranges .size (); ov++) {
4779
4786
UErrorCode err = U_ZERO_ERROR;
4780
4787
4781
- if (p_sd-> bidi_override [ov].x >= p_start + p_length || p_sd-> bidi_override [ov].y <= p_start) {
4788
+ if (bidi_ranges [ov].x >= p_start + p_length || bidi_ranges [ov].y <= p_start) {
4782
4789
continue ;
4783
4790
}
4784
- int ov_start = _convert_pos_inv (p_sd, p_sd-> bidi_override [ov].x );
4791
+ int ov_start = _convert_pos_inv (p_sd, bidi_ranges [ov].x );
4785
4792
int start = MAX (0 , _convert_pos_inv (p_sd, p_start) - ov_start);
4786
- int end = MIN (_convert_pos_inv (p_sd, p_start + p_length), _convert_pos_inv (p_sd, p_sd-> bidi_override [ov].y )) - ov_start;
4793
+ int end = MIN (_convert_pos_inv (p_sd, p_start + p_length), _convert_pos_inv (p_sd, bidi_ranges [ov].y )) - ov_start;
4787
4794
4788
4795
ERR_FAIL_COND_V_MSG ((start < 0 || end - start > p_new_sd->utf16 .length ()), false , " Invalid BiDi override range." );
4789
4796
@@ -4797,7 +4804,7 @@ bool TextServerAdvanced::_shape_substr(ShapedTextDataAdvanced *p_new_sd, const S
4797
4804
// Line BiDi failed (string contains incompatible control characters), try full paragraph BiDi instead.
4798
4805
err = U_ZERO_ERROR;
4799
4806
const UChar *data = p_sd->utf16 .get_data ();
4800
- switch (static_cast <TextServer::Direction>(p_sd-> bidi_override [ov].z )) {
4807
+ switch (static_cast <TextServer::Direction>(bidi_ranges [ov].z )) {
4801
4808
case DIRECTION_LTR: {
4802
4809
ubidi_setPara (bidi_iter, data + start, end - start, UBIDI_LTR, nullptr , &err);
4803
4810
} break ;
@@ -6490,14 +6497,17 @@ bool TextServerAdvanced::_shaped_text_shape(const RID &p_shaped) {
6490
6497
} break ;
6491
6498
}
6492
6499
6500
+ Vector<Vector3i> bidi_ranges;
6493
6501
if (sd->bidi_override .is_empty ()) {
6494
- sd->bidi_override .push_back (Vector3i (sd->start , sd->end , DIRECTION_INHERITED));
6502
+ bidi_ranges.push_back (Vector3i (sd->start , sd->end , DIRECTION_INHERITED));
6503
+ } else {
6504
+ bidi_ranges = sd->bidi_override ;
6495
6505
}
6496
6506
6497
- for (int ov = 0 ; ov < sd-> bidi_override .size (); ov++) {
6507
+ for (int ov = 0 ; ov < bidi_ranges .size (); ov++) {
6498
6508
// Create BiDi iterator.
6499
- int start = _convert_pos_inv (sd, sd-> bidi_override [ov].x - sd->start );
6500
- int end = _convert_pos_inv (sd, sd-> bidi_override [ov].y - sd->start );
6509
+ int start = _convert_pos_inv (sd, bidi_ranges [ov].x - sd->start );
6510
+ int end = _convert_pos_inv (sd, bidi_ranges [ov].y - sd->start );
6501
6511
6502
6512
if (start < 0 || end - start > sd->utf16 .length ()) {
6503
6513
continue ;
@@ -6506,7 +6516,7 @@ bool TextServerAdvanced::_shaped_text_shape(const RID &p_shaped) {
6506
6516
UErrorCode err = U_ZERO_ERROR;
6507
6517
UBiDi *bidi_iter = ubidi_openSized (end - start, 0 , &err);
6508
6518
if (U_SUCCESS (err)) {
6509
- switch (static_cast <TextServer::Direction>(sd-> bidi_override [ov].z )) {
6519
+ switch (static_cast <TextServer::Direction>(bidi_ranges [ov].z )) {
6510
6520
case DIRECTION_LTR: {
6511
6521
ubidi_setPara (bidi_iter, data + start, end - start, UBIDI_LTR, nullptr , &err);
6512
6522
} break ;
0 commit comments