|
@@ -3070,8 +3070,10 @@ int64_t TextServerAdvanced::font_get_glyph_index(const RID &p_font_rid, int64_t
|
|
|
|
|
|
bool TextServerAdvanced::font_has_char(const RID &p_font_rid, int64_t p_char) const {
|
|
|
FontAdvanced *fd = font_owner.get_or_null(p_font_rid);
|
|
|
- ERR_FAIL_COND_V(!fd, false);
|
|
|
ERR_FAIL_COND_V_MSG((p_char >= 0xd800 && p_char <= 0xdfff) || (p_char > 0x10ffff), false, "Unicode parsing error: Invalid unicode codepoint " + String::num_int64(p_char, 16) + ".");
|
|
|
+ if (!fd) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
MutexLock lock(fd->mutex);
|
|
|
if (fd->cache.is_empty()) {
|
|
@@ -4500,35 +4502,40 @@ void TextServerAdvanced::shaped_text_overrun_trim_to_width(const RID &p_shaped_l
|
|
|
int glyphs_to = (is_rtl) ? sd_size - 1 : -1;
|
|
|
int glyphs_delta = (is_rtl) ? +1 : -1;
|
|
|
|
|
|
- for (int i = glyphs_from; i != glyphs_to; i += glyphs_delta) {
|
|
|
- if (!is_rtl) {
|
|
|
- width -= sd_glyphs[i].advance * sd_glyphs[i].repeat;
|
|
|
- }
|
|
|
- if (sd_glyphs[i].count > 0) {
|
|
|
- bool above_min_char_threshold = ((is_rtl) ? sd_size - 1 - i : i) >= ell_min_characters;
|
|
|
+ if (enforce_ellipsis && (width + ellipsis_width <= p_width)) {
|
|
|
+ trim_pos = -1;
|
|
|
+ ellipsis_pos = (is_rtl) ? 0 : sd_size;
|
|
|
+ } else {
|
|
|
+ for (int i = glyphs_from; i != glyphs_to; i += glyphs_delta) {
|
|
|
+ if (!is_rtl) {
|
|
|
+ width -= sd_glyphs[i].advance * sd_glyphs[i].repeat;
|
|
|
+ }
|
|
|
+ if (sd_glyphs[i].count > 0) {
|
|
|
+ bool above_min_char_threshold = ((is_rtl) ? sd_size - 1 - i : i) >= ell_min_characters;
|
|
|
|
|
|
- if (width + (((above_min_char_threshold && add_ellipsis) || enforce_ellipsis) ? ellipsis_width : 0) <= p_width) {
|
|
|
- if (cut_per_word && above_min_char_threshold) {
|
|
|
- if ((sd_glyphs[i].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT) {
|
|
|
+ if (width + (((above_min_char_threshold && add_ellipsis) || enforce_ellipsis) ? ellipsis_width : 0) <= p_width) {
|
|
|
+ if (cut_per_word && above_min_char_threshold) {
|
|
|
+ if ((sd_glyphs[i].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT) {
|
|
|
+ last_valid_cut = i;
|
|
|
+ found = true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
last_valid_cut = i;
|
|
|
found = true;
|
|
|
}
|
|
|
- } else {
|
|
|
- last_valid_cut = i;
|
|
|
- found = true;
|
|
|
- }
|
|
|
- if (found) {
|
|
|
- trim_pos = last_valid_cut;
|
|
|
+ if (found) {
|
|
|
+ trim_pos = last_valid_cut;
|
|
|
|
|
|
- if (add_ellipsis && (above_min_char_threshold || enforce_ellipsis) && width - ellipsis_width <= p_width) {
|
|
|
- ellipsis_pos = trim_pos;
|
|
|
+ if (add_ellipsis && (above_min_char_threshold || enforce_ellipsis) && width - ellipsis_width <= p_width) {
|
|
|
+ ellipsis_pos = trim_pos;
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
- break;
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- if (is_rtl) {
|
|
|
- width -= sd_glyphs[i].advance * sd_glyphs[i].repeat;
|
|
|
+ if (is_rtl) {
|
|
|
+ width -= sd_glyphs[i].advance * sd_glyphs[i].repeat;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|