@@ -572,6 +572,7 @@ void TextServer::_bind_methods() {
572572 BIND_BITFIELD_FLAG (GRAPHEME_IS_CONNECTED);
573573 BIND_BITFIELD_FLAG (GRAPHEME_IS_SAFE_TO_INSERT_TATWEEL);
574574 BIND_BITFIELD_FLAG (GRAPHEME_IS_EMBEDDED_OBJECT);
575+ BIND_BITFIELD_FLAG (GRAPHEME_IS_SOFT_HYPHEN);
575576
576577 /* Hinting */
577578 BIND_ENUM_CONSTANT (HINTING_NONE);
@@ -733,6 +734,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
733734
734735 ERR_FAIL_COND_V (p_width.is_empty (), lines);
735736
737+ TextServer::Orientation orientation = shaped_text_get_orientation (p_shaped);
736738 const_cast <TextServer *>(this )->shaped_text_update_breaks (p_shaped);
737739 const Vector2i &range = shaped_text_get_range (p_shaped);
738740
@@ -758,10 +760,10 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
758760 if (p_break_flags.has_flag (BREAK_TRIM_EDGE_SPACES)) {
759761 int start_pos = prev_safe_break;
760762 int end_pos = last_safe_break;
761- while (trim_next && (start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
763+ while (trim_next && (start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SOFT_HYPHEN) != GRAPHEME_IS_SOFT_HYPHEN) && ((l_gl[start_pos]. flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
762764 start_pos += l_gl[start_pos].count ;
763765 }
764- while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
766+ while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SOFT_HYPHEN) != GRAPHEME_IS_SOFT_HYPHEN) && ((l_gl[end_pos]. flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
765767 end_pos -= l_gl[end_pos].count ;
766768 }
767769 if (last_end <= l_gl[start_pos].start ) {
@@ -829,8 +831,17 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
829831 }
830832 if (p_break_flags.has_flag (BREAK_WORD_BOUND)) {
831833 if ((l_gl[i].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT) {
832- last_safe_break = i;
833- word_count++;
834+ if ((l_gl[i].flags & GRAPHEME_IS_SOFT_HYPHEN) == GRAPHEME_IS_SOFT_HYPHEN) {
835+ uint32_t gl = font_get_glyph_index (l_gl[i].font_rid , l_gl[i].font_size , 0x00ad , 0 );
836+ float w = font_get_glyph_advance (l_gl[i].font_rid , l_gl[i].font_size , gl)[(orientation == ORIENTATION_HORIZONTAL) ? 0 : 1 ];
837+ if (width + l_gl[i].advance + w <= p_width[chunk]) {
838+ last_safe_break = i;
839+ word_count++;
840+ }
841+ } else {
842+ last_safe_break = i;
843+ word_count++;
844+ }
834845 }
835846 }
836847 if (p_break_flags.has_flag (BREAK_GRAPHEME_BOUND) && word_count == 0 ) {
@@ -876,6 +887,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
876887 int word_count = 0 ;
877888 bool trim_next = false ;
878889
890+ TextServer::Orientation orientation = shaped_text_get_orientation (p_shaped);
879891 int l_size = shaped_text_get_glyph_count (p_shaped);
880892 const Glyph *l_gl = const_cast <TextServer *>(this )->shaped_text_sort_logical (p_shaped);
881893
@@ -889,10 +901,10 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
889901 if (p_break_flags.has_flag (BREAK_TRIM_EDGE_SPACES)) {
890902 int start_pos = prev_safe_break;
891903 int end_pos = last_safe_break;
892- while (trim_next && (start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
904+ while (trim_next && (start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SOFT_HYPHEN) != GRAPHEME_IS_SOFT_HYPHEN) && ((l_gl[start_pos]. flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
893905 start_pos += l_gl[start_pos].count ;
894906 }
895- while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
907+ while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SOFT_HYPHEN) != GRAPHEME_IS_SOFT_HYPHEN) && ((l_gl[end_pos]. flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
896908 end_pos -= l_gl[end_pos].count ;
897909 }
898910 if (last_end <= l_gl[start_pos].start ) {
@@ -949,8 +961,17 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
949961 }
950962 if (p_break_flags.has_flag (BREAK_WORD_BOUND)) {
951963 if ((l_gl[i].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT) {
952- last_safe_break = i;
953- word_count++;
964+ if ((l_gl[i].flags & GRAPHEME_IS_SOFT_HYPHEN) == GRAPHEME_IS_SOFT_HYPHEN) {
965+ uint32_t gl = font_get_glyph_index (l_gl[i].font_rid , l_gl[i].font_size , 0x00AD , 0 );
966+ float w = font_get_glyph_advance (l_gl[i].font_rid , l_gl[i].font_size , gl)[(orientation == ORIENTATION_HORIZONTAL) ? 0 : 1 ];
967+ if (width + l_gl[i].advance + w <= p_width) {
968+ last_safe_break = i;
969+ word_count++;
970+ }
971+ } else {
972+ last_safe_break = i;
973+ word_count++;
974+ }
954975 }
955976 if (p_break_flags.has_flag (BREAK_ADAPTIVE) && word_count == 0 ) {
956977 last_safe_break = i;
0 commit comments