Implement TextServer GDExtension interface, remove TextServer GDNative interface.
This commit is contained in:
parent
06c1b40b84
commit
0c0b5c84b0
58 changed files with 4388 additions and 3388 deletions
|
|
@ -2449,8 +2449,8 @@ bool Control::is_text_field() const {
|
|||
return false;
|
||||
}
|
||||
|
||||
Vector<Vector2i> Control::structured_text_parser(StructuredTextParser p_theme_type, const Array &p_args, const String p_text) const {
|
||||
Vector<Vector2i> ret;
|
||||
Array Control::structured_text_parser(StructuredTextParser p_theme_type, const Array &p_args, const String p_text) const {
|
||||
Array ret;
|
||||
switch (p_theme_type) {
|
||||
case STRUCTURED_TEXT_URI: {
|
||||
int prev = 0;
|
||||
|
|
|
|||
|
|
@ -283,7 +283,7 @@ protected:
|
|||
|
||||
//virtual void _window_gui_input(InputEvent p_event);
|
||||
|
||||
virtual Vector<Vector2i> structured_text_parser(StructuredTextParser p_theme_type, const Array &p_args, const String p_text) const;
|
||||
virtual Array structured_text_parser(StructuredTextParser p_theme_type, const Array &p_args, const String p_text) const;
|
||||
|
||||
bool _set(const StringName &p_name, const Variant &p_value);
|
||||
bool _get(const StringName &p_name, Variant &r_ret) const;
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ void Label::_shape() {
|
|||
}
|
||||
lines_rid.clear();
|
||||
|
||||
uint8_t autowrap_flags = TextServer::BREAK_MANDATORY;
|
||||
uint16_t autowrap_flags = TextServer::BREAK_MANDATORY;
|
||||
switch (autowrap_mode) {
|
||||
case AUTOWRAP_WORD_SMART:
|
||||
autowrap_flags = TextServer::BREAK_WORD_BOUND_ADAPTIVE | TextServer::BREAK_MANDATORY;
|
||||
|
|
@ -122,10 +122,10 @@ void Label::_shape() {
|
|||
case AUTOWRAP_OFF:
|
||||
break;
|
||||
}
|
||||
Vector<Vector2i> line_breaks = TS->shaped_text_get_line_breaks(text_rid, width, 0, autowrap_flags);
|
||||
PackedInt32Array line_breaks = TS->shaped_text_get_line_breaks(text_rid, width, 0, autowrap_flags);
|
||||
|
||||
for (int i = 0; i < line_breaks.size(); i++) {
|
||||
RID line = TS->shaped_text_substr(text_rid, line_breaks[i].x, line_breaks[i].y - line_breaks[i].x);
|
||||
for (int i = 0; i < line_breaks.size(); i = i + 2) {
|
||||
RID line = TS->shaped_text_substr(text_rid, line_breaks[i], line_breaks[i + 1] - line_breaks[i]);
|
||||
lines_rid.push_back(line);
|
||||
}
|
||||
}
|
||||
|
|
@ -145,7 +145,7 @@ void Label::_shape() {
|
|||
}
|
||||
|
||||
if (lines_dirty) {
|
||||
uint8_t overrun_flags = TextServer::OVERRUN_NO_TRIMMING;
|
||||
uint16_t overrun_flags = TextServer::OVERRUN_NO_TRIMMING;
|
||||
switch (overrun_behavior) {
|
||||
case OVERRUN_TRIM_WORD_ELLIPSIS:
|
||||
overrun_flags |= TextServer::OVERRUN_TRIM;
|
||||
|
|
@ -231,7 +231,7 @@ void Label::_update_visible() {
|
|||
}
|
||||
}
|
||||
|
||||
inline void draw_glyph(const TextServer::Glyph &p_gl, const RID &p_canvas, const Color &p_font_color, const Vector2 &p_ofs) {
|
||||
inline void draw_glyph(const Glyph &p_gl, const RID &p_canvas, const Color &p_font_color, const Vector2 &p_ofs) {
|
||||
if (p_gl.font_rid != RID()) {
|
||||
TS->font_draw_glyph(p_gl.font_rid, p_canvas, p_gl.font_size, p_ofs + Vector2(p_gl.x_off, p_gl.y_off), p_gl.index, p_font_color);
|
||||
} else {
|
||||
|
|
@ -239,7 +239,7 @@ inline void draw_glyph(const TextServer::Glyph &p_gl, const RID &p_canvas, const
|
|||
}
|
||||
}
|
||||
|
||||
inline void draw_glyph_outline(const TextServer::Glyph &p_gl, const RID &p_canvas, const Color &p_font_color, const Color &p_font_shadow_color, const Color &p_font_outline_color, const int &p_shadow_outline_size, const int &p_outline_size, const Vector2 &p_ofs, const Vector2 &shadow_ofs) {
|
||||
inline void draw_glyph_outline(const Glyph &p_gl, const RID &p_canvas, const Color &p_font_color, const Color &p_font_shadow_color, const Color &p_font_outline_color, const int &p_shadow_outline_size, const int &p_outline_size, const Vector2 &p_ofs, const Vector2 &shadow_ofs) {
|
||||
if (p_gl.font_rid != RID()) {
|
||||
if (p_font_shadow_color.a > 0) {
|
||||
TS->font_draw_glyph(p_gl.font_rid, p_canvas, p_gl.font_size, p_ofs + Vector2(p_gl.x_off, p_gl.y_off) + shadow_ofs, p_gl.index, p_font_shadow_color);
|
||||
|
|
@ -387,21 +387,25 @@ void Label::_notification(int p_what) {
|
|||
} break;
|
||||
}
|
||||
|
||||
const Vector<TextServer::Glyph> visual = TS->shaped_text_get_glyphs(lines_rid[i]);
|
||||
const TextServer::Glyph *glyphs = visual.ptr();
|
||||
int gl_size = visual.size();
|
||||
TextServer::TrimData trim_data = TS->shaped_text_get_trim_data(lines_rid[i]);
|
||||
const Glyph *glyphs = TS->shaped_text_get_glyphs(lines_rid[i]);
|
||||
int gl_size = TS->shaped_text_get_glyph_count(lines_rid[i]);
|
||||
|
||||
int ellipsis_pos = TS->shaped_text_get_ellipsis_pos(lines_rid[i]);
|
||||
int trim_pos = TS->shaped_text_get_trim_pos(lines_rid[i]);
|
||||
|
||||
const Glyph *ellipsis_glyphs = TS->shaped_text_get_ellipsis_glyphs(lines_rid[i]);
|
||||
int ellipsis_gl_size = TS->shaped_text_get_ellipsis_glyph_count(lines_rid[i]);
|
||||
|
||||
// Draw outline. Note: Do not merge this into the single loop with the main text, to prevent overlaps.
|
||||
if (font_shadow_color.a > 0 || (font_outline_color.a != 0.0 && outline_size > 0)) {
|
||||
Vector2 offset = ofs;
|
||||
// Draw RTL ellipsis string when necessary.
|
||||
if (rtl && trim_data.ellipsis_pos >= 0) {
|
||||
for (int gl_idx = trim_data.ellipsis_glyph_buf.size() - 1; gl_idx >= 0; gl_idx--) {
|
||||
for (int j = 0; j < trim_data.ellipsis_glyph_buf[gl_idx].repeat; j++) {
|
||||
if (rtl && ellipsis_pos >= 0) {
|
||||
for (int gl_idx = ellipsis_gl_size - 1; gl_idx >= 0; gl_idx--) {
|
||||
for (int j = 0; j < ellipsis_glyphs[gl_idx].repeat; j++) {
|
||||
//Draw glyph outlines and shadow.
|
||||
draw_glyph_outline(trim_data.ellipsis_glyph_buf[gl_idx], ci, font_color, font_shadow_color, font_outline_color, shadow_outline_size, outline_size, offset, shadow_ofs);
|
||||
offset.x += trim_data.ellipsis_glyph_buf[gl_idx].advance;
|
||||
draw_glyph_outline(ellipsis_glyphs[gl_idx], ci, font_color, font_shadow_color, font_outline_color, shadow_outline_size, outline_size, offset, shadow_ofs);
|
||||
offset.x += ellipsis_glyphs[gl_idx].advance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -410,13 +414,13 @@ void Label::_notification(int p_what) {
|
|||
for (int j = 0; j < gl_size; j++) {
|
||||
for (int k = 0; k < glyphs[j].repeat; k++) {
|
||||
// Trim when necessary.
|
||||
if (trim_data.trim_pos >= 0) {
|
||||
if (trim_pos >= 0) {
|
||||
if (rtl) {
|
||||
if (j < trim_data.trim_pos && (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) != TextServer::GRAPHEME_IS_VIRTUAL) {
|
||||
if (j < trim_pos && (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) != TextServer::GRAPHEME_IS_VIRTUAL) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (j >= trim_data.trim_pos && (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) != TextServer::GRAPHEME_IS_VIRTUAL) {
|
||||
if (j >= trim_pos && (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) != TextServer::GRAPHEME_IS_VIRTUAL) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -428,12 +432,12 @@ void Label::_notification(int p_what) {
|
|||
}
|
||||
}
|
||||
// Draw LTR ellipsis string when necessary.
|
||||
if (!rtl && trim_data.ellipsis_pos >= 0) {
|
||||
for (int gl_idx = 0; gl_idx < trim_data.ellipsis_glyph_buf.size(); gl_idx++) {
|
||||
for (int j = 0; j < trim_data.ellipsis_glyph_buf[gl_idx].repeat; j++) {
|
||||
if (!rtl && ellipsis_pos >= 0) {
|
||||
for (int gl_idx = 0; gl_idx < ellipsis_gl_size; gl_idx++) {
|
||||
for (int j = 0; j < ellipsis_glyphs[gl_idx].repeat; j++) {
|
||||
//Draw glyph outlines and shadow.
|
||||
draw_glyph_outline(trim_data.ellipsis_glyph_buf[gl_idx], ci, font_color, font_shadow_color, font_outline_color, shadow_outline_size, outline_size, offset, shadow_ofs);
|
||||
offset.x += trim_data.ellipsis_glyph_buf[gl_idx].advance;
|
||||
draw_glyph_outline(ellipsis_glyphs[gl_idx], ci, font_color, font_shadow_color, font_outline_color, shadow_outline_size, outline_size, offset, shadow_ofs);
|
||||
offset.x += ellipsis_glyphs[gl_idx].advance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -442,12 +446,12 @@ void Label::_notification(int p_what) {
|
|||
// Draw main text. Note: Do not merge this into the single loop with the outline, to prevent overlaps.
|
||||
|
||||
// Draw RTL ellipsis string when necessary.
|
||||
if (rtl && trim_data.ellipsis_pos >= 0) {
|
||||
for (int gl_idx = trim_data.ellipsis_glyph_buf.size() - 1; gl_idx >= 0; gl_idx--) {
|
||||
for (int j = 0; j < trim_data.ellipsis_glyph_buf[gl_idx].repeat; j++) {
|
||||
if (rtl && ellipsis_pos >= 0) {
|
||||
for (int gl_idx = ellipsis_gl_size - 1; gl_idx >= 0; gl_idx--) {
|
||||
for (int j = 0; j < ellipsis_glyphs[gl_idx].repeat; j++) {
|
||||
//Draw glyph outlines and shadow.
|
||||
draw_glyph(trim_data.ellipsis_glyph_buf[gl_idx], ci, font_color, ofs);
|
||||
ofs.x += trim_data.ellipsis_glyph_buf[gl_idx].advance;
|
||||
draw_glyph(ellipsis_glyphs[gl_idx], ci, font_color, ofs);
|
||||
ofs.x += ellipsis_glyphs[gl_idx].advance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -456,13 +460,13 @@ void Label::_notification(int p_what) {
|
|||
for (int j = 0; j < gl_size; j++) {
|
||||
for (int k = 0; k < glyphs[j].repeat; k++) {
|
||||
// Trim when necessary.
|
||||
if (trim_data.trim_pos >= 0) {
|
||||
if (trim_pos >= 0) {
|
||||
if (rtl) {
|
||||
if (j < trim_data.trim_pos && (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) != TextServer::GRAPHEME_IS_VIRTUAL) {
|
||||
if (j < trim_pos && (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) != TextServer::GRAPHEME_IS_VIRTUAL) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (j >= trim_data.trim_pos && (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) != TextServer::GRAPHEME_IS_VIRTUAL) {
|
||||
if (j >= trim_pos && (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) != TextServer::GRAPHEME_IS_VIRTUAL) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -474,12 +478,12 @@ void Label::_notification(int p_what) {
|
|||
}
|
||||
}
|
||||
// Draw LTR ellipsis string when necessary.
|
||||
if (!rtl && trim_data.ellipsis_pos >= 0) {
|
||||
for (int gl_idx = 0; gl_idx < trim_data.ellipsis_glyph_buf.size(); gl_idx++) {
|
||||
for (int j = 0; j < trim_data.ellipsis_glyph_buf[gl_idx].repeat; j++) {
|
||||
if (!rtl && ellipsis_pos >= 0) {
|
||||
for (int gl_idx = 0; gl_idx < ellipsis_gl_size; gl_idx++) {
|
||||
for (int j = 0; j < ellipsis_glyphs[gl_idx].repeat; j++) {
|
||||
//Draw glyph outlines and shadow.
|
||||
draw_glyph(trim_data.ellipsis_glyph_buf[gl_idx], ci, font_color, ofs);
|
||||
ofs.x += trim_data.ellipsis_glyph_buf[gl_idx].advance;
|
||||
draw_glyph(ellipsis_glyphs[gl_idx], ci, font_color, ofs);
|
||||
ofs.x += ellipsis_glyphs[gl_idx].advance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,10 +67,10 @@ void LineEdit::_move_caret_left(bool p_select, bool p_move_by_word) {
|
|||
if (p_move_by_word) {
|
||||
int cc = caret_column;
|
||||
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = words.size() - 1; i >= 0; i--) {
|
||||
if (words[i].x < cc) {
|
||||
cc = words[i].x;
|
||||
PackedInt32Array words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = words.size() - 2; i >= 0; i = i - 2) {
|
||||
if (words[i] < cc) {
|
||||
cc = words[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -99,10 +99,10 @@ void LineEdit::_move_caret_right(bool p_select, bool p_move_by_word) {
|
|||
if (p_move_by_word) {
|
||||
int cc = caret_column;
|
||||
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if (words[i].y > cc) {
|
||||
cc = words[i].y;
|
||||
PackedInt32Array words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = 1; i < words.size(); i = i + 2) {
|
||||
if (words[i] > cc) {
|
||||
cc = words[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -151,10 +151,10 @@ void LineEdit::_backspace(bool p_word, bool p_all_to_left) {
|
|||
if (p_word) {
|
||||
int cc = caret_column;
|
||||
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = words.size() - 1; i >= 0; i--) {
|
||||
if (words[i].x < cc) {
|
||||
cc = words[i].x;
|
||||
PackedInt32Array words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = words.size() - 2; i >= 0; i = i - 2) {
|
||||
if (words[i] < cc) {
|
||||
cc = words[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -194,10 +194,10 @@ void LineEdit::_delete(bool p_word, bool p_all_to_right) {
|
|||
|
||||
if (p_word) {
|
||||
int cc = caret_column;
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if (words[i].y > cc) {
|
||||
cc = words[i].y;
|
||||
PackedInt32Array words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = 1; i < words.size(); i = i + 2) {
|
||||
if (words[i] > cc) {
|
||||
cc = words[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -276,12 +276,12 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) {
|
|||
// Double-click select word.
|
||||
last_dblclk = OS::get_singleton()->get_ticks_msec();
|
||||
last_dblclk_pos = b->get_position();
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if ((words[i].x < caret_column && words[i].y > caret_column) || (i == words.size() - 1 && caret_column == words[i].y)) {
|
||||
PackedInt32Array words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = 0; i < words.size(); i = i + 2) {
|
||||
if ((words[i] < caret_column && words[i + 1] > caret_column) || (i == words.size() - 2 && caret_column == words[i + 1])) {
|
||||
selection.enabled = true;
|
||||
selection.begin = words[i].x;
|
||||
selection.end = words[i].y;
|
||||
selection.begin = words[i];
|
||||
selection.end = words[i + 1];
|
||||
selection.double_click = true;
|
||||
caret_column = selection.end;
|
||||
break;
|
||||
|
|
@ -737,9 +737,8 @@ void LineEdit::_notification(int p_what) {
|
|||
RenderingServer::get_singleton()->canvas_item_add_rect(ci, rect, selection_color);
|
||||
}
|
||||
}
|
||||
const Vector<TextServer::Glyph> visual = TS->shaped_text_get_glyphs(text_rid);
|
||||
const TextServer::Glyph *glyphs = visual.ptr();
|
||||
int gl_size = visual.size();
|
||||
const Glyph *glyphs = TS->shaped_text_get_glyphs(text_rid);
|
||||
int gl_size = TS->shaped_text_get_glyph_count(text_rid);
|
||||
|
||||
// Draw text.
|
||||
ofs.y += TS->shaped_text_get_ascent(text_rid);
|
||||
|
|
@ -783,38 +782,36 @@ void LineEdit::_notification(int p_what) {
|
|||
if (draw_caret) {
|
||||
if (ime_text.length() == 0) {
|
||||
// Normal caret.
|
||||
Rect2 l_caret, t_caret;
|
||||
TextServer::Direction l_dir, t_dir;
|
||||
TS->shaped_text_get_carets(text_rid, caret_column, l_caret, l_dir, t_caret, t_dir);
|
||||
CaretInfo caret = TS->shaped_text_get_carets(text_rid, caret_column);
|
||||
|
||||
if (l_caret == Rect2() && t_caret == Rect2()) {
|
||||
if (caret.l_caret == Rect2() && caret.t_caret == Rect2()) {
|
||||
// No carets, add one at the start.
|
||||
int h = get_theme_font(SNAME("font"))->get_height(get_theme_font_size(SNAME("font_size")));
|
||||
int y = style->get_offset().y + (y_area - h) / 2;
|
||||
if (rtl) {
|
||||
l_dir = TextServer::DIRECTION_RTL;
|
||||
l_caret = Rect2(Vector2(ofs_max, y), Size2(caret_width, h));
|
||||
caret.l_dir = TextServer::DIRECTION_RTL;
|
||||
caret.l_caret = Rect2(Vector2(ofs_max, y), Size2(caret_width, h));
|
||||
} else {
|
||||
l_dir = TextServer::DIRECTION_LTR;
|
||||
l_caret = Rect2(Vector2(x_ofs, y), Size2(caret_width, h));
|
||||
caret.l_dir = TextServer::DIRECTION_LTR;
|
||||
caret.l_caret = Rect2(Vector2(x_ofs, y), Size2(caret_width, h));
|
||||
}
|
||||
RenderingServer::get_singleton()->canvas_item_add_rect(ci, l_caret, caret_color);
|
||||
RenderingServer::get_singleton()->canvas_item_add_rect(ci, caret.l_caret, caret_color);
|
||||
} else {
|
||||
if (l_caret != Rect2() && l_dir == TextServer::DIRECTION_AUTO) {
|
||||
if (caret.l_caret != Rect2() && caret.l_dir == TextServer::DIRECTION_AUTO) {
|
||||
// Draw extra marker on top of mid caret.
|
||||
Rect2 trect = Rect2(l_caret.position.x - 3 * caret_width, l_caret.position.y, 6 * caret_width, caret_width);
|
||||
Rect2 trect = Rect2(caret.l_caret.position.x - 3 * caret_width, caret.l_caret.position.y, 6 * caret_width, caret_width);
|
||||
trect.position += ofs;
|
||||
RenderingServer::get_singleton()->canvas_item_add_rect(ci, trect, caret_color);
|
||||
}
|
||||
|
||||
l_caret.position += ofs;
|
||||
l_caret.size.x = caret_width;
|
||||
RenderingServer::get_singleton()->canvas_item_add_rect(ci, l_caret, caret_color);
|
||||
caret.l_caret.position += ofs;
|
||||
caret.l_caret.size.x = caret_width;
|
||||
RenderingServer::get_singleton()->canvas_item_add_rect(ci, caret.l_caret, caret_color);
|
||||
|
||||
t_caret.position += ofs;
|
||||
t_caret.size.x = caret_width;
|
||||
caret.t_caret.position += ofs;
|
||||
caret.t_caret.size.x = caret_width;
|
||||
|
||||
RenderingServer::get_singleton()->canvas_item_add_rect(ci, t_caret, caret_color);
|
||||
RenderingServer::get_singleton()->canvas_item_add_rect(ci, caret.t_caret, caret_color);
|
||||
}
|
||||
} else {
|
||||
{
|
||||
|
|
@ -1114,32 +1111,31 @@ Vector2i LineEdit::get_caret_pixel_pos() {
|
|||
}
|
||||
|
||||
Vector2i ret;
|
||||
Rect2 l_caret, t_caret;
|
||||
TextServer::Direction l_dir, t_dir;
|
||||
CaretInfo caret;
|
||||
// Get position of the start of caret.
|
||||
if (ime_text.length() != 0 && ime_selection.x != 0) {
|
||||
TS->shaped_text_get_carets(text_rid, caret_column + ime_selection.x, l_caret, l_dir, t_caret, t_dir);
|
||||
caret = TS->shaped_text_get_carets(text_rid, caret_column + ime_selection.x);
|
||||
} else {
|
||||
TS->shaped_text_get_carets(text_rid, caret_column, l_caret, l_dir, t_caret, t_dir);
|
||||
caret = TS->shaped_text_get_carets(text_rid, caret_column);
|
||||
}
|
||||
|
||||
if ((l_caret != Rect2() && (l_dir == TextServer::DIRECTION_AUTO || l_dir == (TextServer::Direction)input_direction)) || (t_caret == Rect2())) {
|
||||
ret.x = x_ofs + l_caret.position.x + scroll_offset;
|
||||
if ((caret.l_caret != Rect2() && (caret.l_dir == TextServer::DIRECTION_AUTO || caret.l_dir == (TextServer::Direction)input_direction)) || (caret.t_caret == Rect2())) {
|
||||
ret.x = x_ofs + caret.l_caret.position.x + scroll_offset;
|
||||
} else {
|
||||
ret.x = x_ofs + t_caret.position.x + scroll_offset;
|
||||
ret.x = x_ofs + caret.t_caret.position.x + scroll_offset;
|
||||
}
|
||||
|
||||
// Get position of the end of caret.
|
||||
if (ime_text.length() != 0) {
|
||||
if (ime_selection.y != 0) {
|
||||
TS->shaped_text_get_carets(text_rid, caret_column + ime_selection.x + ime_selection.y, l_caret, l_dir, t_caret, t_dir);
|
||||
caret = TS->shaped_text_get_carets(text_rid, caret_column + ime_selection.x + ime_selection.y);
|
||||
} else {
|
||||
TS->shaped_text_get_carets(text_rid, caret_column + ime_text.size(), l_caret, l_dir, t_caret, t_dir);
|
||||
caret = TS->shaped_text_get_carets(text_rid, caret_column + ime_text.size());
|
||||
}
|
||||
if ((l_caret != Rect2() && (l_dir == TextServer::DIRECTION_AUTO || l_dir == (TextServer::Direction)input_direction)) || (t_caret == Rect2())) {
|
||||
ret.y = x_ofs + l_caret.position.x + scroll_offset;
|
||||
if ((caret.l_caret != Rect2() && (caret.l_dir == TextServer::DIRECTION_AUTO || caret.l_dir == (TextServer::Direction)input_direction)) || (caret.t_caret == Rect2())) {
|
||||
ret.y = x_ofs + caret.l_caret.position.x + scroll_offset;
|
||||
} else {
|
||||
ret.y = x_ofs + t_caret.position.x + scroll_offset;
|
||||
ret.y = x_ofs + caret.t_caret.position.x + scroll_offset;
|
||||
}
|
||||
} else {
|
||||
ret.y = ret.x;
|
||||
|
|
@ -1502,7 +1498,7 @@ void LineEdit::insert_text_at_caret(String p_text) {
|
|||
String post = text.substr(caret_column, text.length() - caret_column);
|
||||
text = pre + p_text + post;
|
||||
_shape();
|
||||
TextServer::Direction dir = TS->shaped_text_get_dominant_direciton_in_range(text_rid, caret_column, caret_column + p_text.length());
|
||||
TextServer::Direction dir = TS->shaped_text_get_dominant_direction_in_range(text_rid, caret_column, caret_column + p_text.length());
|
||||
if (dir != TextServer::DIRECTION_AUTO) {
|
||||
input_direction = (TextDirection)dir;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -819,9 +819,8 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o
|
|||
}
|
||||
}
|
||||
|
||||
const Vector<TextServer::Glyph> visual = TS->shaped_text_get_glyphs(rid);
|
||||
const TextServer::Glyph *glyphs = visual.ptr();
|
||||
int gl_size = visual.size();
|
||||
const Glyph *glyphs = TS->shaped_text_get_glyphs(rid);
|
||||
int gl_size = TS->shaped_text_get_glyph_count(rid);
|
||||
|
||||
Vector2 gloff = off;
|
||||
// Draw oulines and shadow.
|
||||
|
|
@ -1593,18 +1592,18 @@ void RichTextLabel::gui_input(const Ref<InputEvent> &p_event) {
|
|||
|
||||
if (c_frame) {
|
||||
const Line &l = c_frame->lines[c_line];
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(l.text_buf->get_rid());
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if (c_index >= words[i].x && c_index < words[i].y) {
|
||||
PackedInt32Array words = TS->shaped_text_get_word_breaks(l.text_buf->get_rid());
|
||||
for (int i = 0; i < words.size(); i = i + 2) {
|
||||
if (c_index >= words[i] && c_index < words[i + 1]) {
|
||||
selection.from_frame = c_frame;
|
||||
selection.from_line = c_line;
|
||||
selection.from_item = c_item;
|
||||
selection.from_char = words[i].x;
|
||||
selection.from_char = words[i];
|
||||
|
||||
selection.to_frame = c_frame;
|
||||
selection.to_line = c_line;
|
||||
selection.to_item = c_item;
|
||||
selection.to_char = words[i].y;
|
||||
selection.to_char = words[i + 1];
|
||||
|
||||
selection.active = true;
|
||||
update();
|
||||
|
|
|
|||
|
|
@ -186,7 +186,7 @@ void TextEdit::Text::_calculate_max_line_width() {
|
|||
max_width = width;
|
||||
}
|
||||
|
||||
void TextEdit::Text::invalidate_cache(int p_line, int p_column, const String &p_ime_text, const Vector<Vector2i> &p_bidi_override) {
|
||||
void TextEdit::Text::invalidate_cache(int p_line, int p_column, const String &p_ime_text, const Array &p_bidi_override) {
|
||||
ERR_FAIL_INDEX(p_line, text.size());
|
||||
|
||||
if (font.is_null() || font_size <= 0) {
|
||||
|
|
@ -278,14 +278,14 @@ void TextEdit::Text::invalidate_all() {
|
|||
|
||||
void TextEdit::Text::clear() {
|
||||
text.clear();
|
||||
insert(0, "", Vector<Vector2i>());
|
||||
insert(0, "", Array());
|
||||
}
|
||||
|
||||
int TextEdit::Text::get_max_width() const {
|
||||
return max_width;
|
||||
}
|
||||
|
||||
void TextEdit::Text::set(int p_line, const String &p_text, const Vector<Vector2i> &p_bidi_override) {
|
||||
void TextEdit::Text::set(int p_line, const String &p_text, const Array &p_bidi_override) {
|
||||
ERR_FAIL_INDEX(p_line, text.size());
|
||||
|
||||
text.write[p_line].data = p_text;
|
||||
|
|
@ -293,7 +293,7 @@ void TextEdit::Text::set(int p_line, const String &p_text, const Vector<Vector2i
|
|||
invalidate_cache(p_line);
|
||||
}
|
||||
|
||||
void TextEdit::Text::insert(int p_at, const String &p_text, const Vector<Vector2i> &p_bidi_override) {
|
||||
void TextEdit::Text::insert(int p_at, const String &p_text, const Array &p_bidi_override) {
|
||||
Line line;
|
||||
line.gutters.resize(gutter_count);
|
||||
line.hidden = false;
|
||||
|
|
@ -1076,9 +1076,8 @@ void TextEdit::_notification(int p_what) {
|
|||
|
||||
ofs_y += (row_height - text_height) / 2;
|
||||
|
||||
const Vector<TextServer::Glyph> visual = TS->shaped_text_get_glyphs(rid);
|
||||
const TextServer::Glyph *glyphs = visual.ptr();
|
||||
int gl_size = visual.size();
|
||||
const Glyph *glyphs = TS->shaped_text_get_glyphs(rid);
|
||||
int gl_size = TS->shaped_text_get_glyph_count(rid);
|
||||
|
||||
ofs_y += ldata->get_line_ascent(line_wrap_index);
|
||||
int char_ofs = 0;
|
||||
|
|
@ -1185,27 +1184,26 @@ void TextEdit::_notification(int p_what) {
|
|||
caret.draw_pos.y = ofs_y + ldata->get_line_descent(line_wrap_index);
|
||||
|
||||
if (ime_text.length() == 0) {
|
||||
Rect2 l_caret, t_caret;
|
||||
TextServer::Direction l_dir, t_dir;
|
||||
CaretInfo ts_caret;
|
||||
if (str.length() != 0) {
|
||||
// Get carets.
|
||||
TS->shaped_text_get_carets(rid, caret.column, l_caret, l_dir, t_caret, t_dir);
|
||||
ts_caret = TS->shaped_text_get_carets(rid, caret.column);
|
||||
} else {
|
||||
// No carets, add one at the start.
|
||||
int h = font->get_height(font_size);
|
||||
if (rtl) {
|
||||
l_dir = TextServer::DIRECTION_RTL;
|
||||
l_caret = Rect2(Vector2(xmargin_end - char_margin + ofs_x, -h / 2), Size2(caret_width * 4, h));
|
||||
ts_caret.l_dir = TextServer::DIRECTION_RTL;
|
||||
ts_caret.l_caret = Rect2(Vector2(xmargin_end - char_margin + ofs_x, -h / 2), Size2(caret_width * 4, h));
|
||||
} else {
|
||||
l_dir = TextServer::DIRECTION_LTR;
|
||||
l_caret = Rect2(Vector2(char_ofs, -h / 2), Size2(caret_width * 4, h));
|
||||
ts_caret.l_dir = TextServer::DIRECTION_LTR;
|
||||
ts_caret.l_caret = Rect2(Vector2(char_ofs, -h / 2), Size2(caret_width * 4, h));
|
||||
}
|
||||
}
|
||||
|
||||
if ((l_caret != Rect2() && (l_dir == TextServer::DIRECTION_AUTO || l_dir == (TextServer::Direction)input_direction)) || (t_caret == Rect2())) {
|
||||
caret.draw_pos.x = char_margin + ofs_x + l_caret.position.x;
|
||||
if ((ts_caret.l_caret != Rect2() && (ts_caret.l_dir == TextServer::DIRECTION_AUTO || ts_caret.l_dir == (TextServer::Direction)input_direction)) || (ts_caret.t_caret == Rect2())) {
|
||||
caret.draw_pos.x = char_margin + ofs_x + ts_caret.l_caret.position.x;
|
||||
} else {
|
||||
caret.draw_pos.x = char_margin + ofs_x + t_caret.position.x;
|
||||
caret.draw_pos.x = char_margin + ofs_x + ts_caret.t_caret.position.x;
|
||||
}
|
||||
|
||||
if (caret.draw_pos.x >= xmargin_beg && caret.draw_pos.x < xmargin_end) {
|
||||
|
|
@ -1215,64 +1213,64 @@ void TextEdit::_notification(int p_what) {
|
|||
//Block or underline caret, draw trailing carets at full height.
|
||||
int h = font->get_height(font_size);
|
||||
|
||||
if (t_caret != Rect2()) {
|
||||
if (ts_caret.t_caret != Rect2()) {
|
||||
if (overtype_mode) {
|
||||
t_caret.position.y = TS->shaped_text_get_descent(rid);
|
||||
t_caret.size.y = caret_width;
|
||||
ts_caret.t_caret.position.y = TS->shaped_text_get_descent(rid);
|
||||
ts_caret.t_caret.size.y = caret_width;
|
||||
} else {
|
||||
t_caret.position.y = -TS->shaped_text_get_ascent(rid);
|
||||
t_caret.size.y = h;
|
||||
ts_caret.t_caret.position.y = -TS->shaped_text_get_ascent(rid);
|
||||
ts_caret.t_caret.size.y = h;
|
||||
}
|
||||
t_caret.position += Vector2(char_margin + ofs_x, ofs_y);
|
||||
draw_rect(t_caret, caret_color, overtype_mode);
|
||||
ts_caret.t_caret.position += Vector2(char_margin + ofs_x, ofs_y);
|
||||
draw_rect(ts_caret.t_caret, caret_color, overtype_mode);
|
||||
|
||||
if (l_caret != Rect2() && l_dir != t_dir) {
|
||||
l_caret.position += Vector2(char_margin + ofs_x, ofs_y);
|
||||
l_caret.size.x = caret_width;
|
||||
draw_rect(l_caret, caret_color * Color(1, 1, 1, 0.5));
|
||||
if (ts_caret.l_caret != Rect2() && ts_caret.l_dir != ts_caret.t_dir) {
|
||||
ts_caret.l_caret.position += Vector2(char_margin + ofs_x, ofs_y);
|
||||
ts_caret.l_caret.size.x = caret_width;
|
||||
draw_rect(ts_caret.l_caret, caret_color * Color(1, 1, 1, 0.5));
|
||||
}
|
||||
} else { // End of the line.
|
||||
if (gl_size > 0) {
|
||||
// Adjust for actual line dimensions.
|
||||
if (overtype_mode) {
|
||||
l_caret.position.y = TS->shaped_text_get_descent(rid);
|
||||
l_caret.size.y = caret_width;
|
||||
ts_caret.l_caret.position.y = TS->shaped_text_get_descent(rid);
|
||||
ts_caret.l_caret.size.y = caret_width;
|
||||
} else {
|
||||
l_caret.position.y = -TS->shaped_text_get_ascent(rid);
|
||||
l_caret.size.y = h;
|
||||
ts_caret.l_caret.position.y = -TS->shaped_text_get_ascent(rid);
|
||||
ts_caret.l_caret.size.y = h;
|
||||
}
|
||||
} else if (overtype_mode) {
|
||||
l_caret.position.y += l_caret.size.y;
|
||||
l_caret.size.y = caret_width;
|
||||
ts_caret.l_caret.position.y += ts_caret.l_caret.size.y;
|
||||
ts_caret.l_caret.size.y = caret_width;
|
||||
}
|
||||
if (l_caret.position.x >= TS->shaped_text_get_size(rid).x) {
|
||||
l_caret.size.x = font->get_char_size('m', 0, font_size).x;
|
||||
if (ts_caret.l_caret.position.x >= TS->shaped_text_get_size(rid).x) {
|
||||
ts_caret.l_caret.size.x = font->get_char_size('m', 0, font_size).x;
|
||||
} else {
|
||||
l_caret.size.x = 3 * caret_width;
|
||||
ts_caret.l_caret.size.x = 3 * caret_width;
|
||||
}
|
||||
l_caret.position += Vector2(char_margin + ofs_x, ofs_y);
|
||||
if (l_dir == TextServer::DIRECTION_RTL) {
|
||||
l_caret.position.x -= l_caret.size.x;
|
||||
ts_caret.l_caret.position += Vector2(char_margin + ofs_x, ofs_y);
|
||||
if (ts_caret.l_dir == TextServer::DIRECTION_RTL) {
|
||||
ts_caret.l_caret.position.x -= ts_caret.l_caret.size.x;
|
||||
}
|
||||
draw_rect(l_caret, caret_color, overtype_mode);
|
||||
draw_rect(ts_caret.l_caret, caret_color, overtype_mode);
|
||||
}
|
||||
} else {
|
||||
// Normal caret.
|
||||
if (l_caret != Rect2() && l_dir == TextServer::DIRECTION_AUTO) {
|
||||
if (ts_caret.l_caret != Rect2() && ts_caret.l_dir == TextServer::DIRECTION_AUTO) {
|
||||
// Draw extra marker on top of mid caret.
|
||||
Rect2 trect = Rect2(l_caret.position.x - 3 * caret_width, l_caret.position.y, 6 * caret_width, caret_width);
|
||||
Rect2 trect = Rect2(ts_caret.l_caret.position.x - 3 * caret_width, ts_caret.l_caret.position.y, 6 * caret_width, caret_width);
|
||||
trect.position += Vector2(char_margin + ofs_x, ofs_y);
|
||||
RenderingServer::get_singleton()->canvas_item_add_rect(ci, trect, caret_color);
|
||||
}
|
||||
l_caret.position += Vector2(char_margin + ofs_x, ofs_y);
|
||||
l_caret.size.x = caret_width;
|
||||
ts_caret.l_caret.position += Vector2(char_margin + ofs_x, ofs_y);
|
||||
ts_caret.l_caret.size.x = caret_width;
|
||||
|
||||
draw_rect(l_caret, caret_color);
|
||||
draw_rect(ts_caret.l_caret, caret_color);
|
||||
|
||||
t_caret.position += Vector2(char_margin + ofs_x, ofs_y);
|
||||
t_caret.size.x = caret_width;
|
||||
ts_caret.t_caret.position += Vector2(char_margin + ofs_x, ofs_y);
|
||||
ts_caret.t_caret.size.x = caret_width;
|
||||
|
||||
draw_rect(t_caret, caret_color);
|
||||
draw_rect(ts_caret.t_caret, caret_color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1968,10 +1966,10 @@ void TextEdit::_move_caret_left(bool p_select, bool p_move_by_word) {
|
|||
set_caret_line(caret.line - 1);
|
||||
set_caret_column(text[caret.line].length());
|
||||
} else {
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text.get_line_data(caret.line)->get_rid());
|
||||
for (int i = words.size() - 1; i >= 0; i--) {
|
||||
if (words[i].x < cc) {
|
||||
cc = words[i].x;
|
||||
PackedInt32Array words = TS->shaped_text_get_word_breaks(text.get_line_data(caret.line)->get_rid());
|
||||
for (int i = words.size() - 2; i >= 0; i = i - 2) {
|
||||
if (words[i] < cc) {
|
||||
cc = words[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -2019,10 +2017,10 @@ void TextEdit::_move_caret_right(bool p_select, bool p_move_by_word) {
|
|||
set_caret_line(caret.line + 1);
|
||||
set_caret_column(0);
|
||||
} else {
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text.get_line_data(caret.line)->get_rid());
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if (words[i].y > cc) {
|
||||
cc = words[i].y;
|
||||
PackedInt32Array words = TS->shaped_text_get_word_breaks(text.get_line_data(caret.line)->get_rid());
|
||||
for (int i = 1; i < words.size(); i = i + 2) {
|
||||
if (words[i] > cc) {
|
||||
cc = words[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -2214,10 +2212,10 @@ void TextEdit::_do_backspace(bool p_word, bool p_all_to_left) {
|
|||
int line = caret.line;
|
||||
int column = caret.column;
|
||||
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text.get_line_data(line)->get_rid());
|
||||
for (int i = words.size() - 1; i >= 0; i--) {
|
||||
if (words[i].x < column) {
|
||||
column = words[i].x;
|
||||
PackedInt32Array words = TS->shaped_text_get_word_breaks(text.get_line_data(line)->get_rid());
|
||||
for (int i = words.size() - 2; i >= 0; i = i - 2) {
|
||||
if (words[i] < column) {
|
||||
column = words[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -2257,10 +2255,10 @@ void TextEdit::_delete(bool p_word, bool p_all_to_right) {
|
|||
int line = caret.line;
|
||||
int column = caret.column;
|
||||
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text.get_line_data(line)->get_rid());
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if (words[i].y > column) {
|
||||
column = words[i].y;
|
||||
PackedInt32Array words = TS->shaped_text_get_word_breaks(text.get_line_data(line)->get_rid());
|
||||
for (int i = 1; i < words.size(); i = i + 2) {
|
||||
if (words[i] > column) {
|
||||
column = words[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -3631,10 +3629,10 @@ int TextEdit::get_caret_wrap_index() const {
|
|||
}
|
||||
|
||||
String TextEdit::get_word_under_caret() const {
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text.get_line_data(caret.line)->get_rid());
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if (words[i].x <= caret.column && words[i].y > caret.column) {
|
||||
return text[caret.line].substr(words[i].x, words[i].y - words[i].x);
|
||||
PackedInt32Array words = TS->shaped_text_get_word_breaks(text.get_line_data(caret.line)->get_rid());
|
||||
for (int i = 0; i < words.size(); i = i + 2) {
|
||||
if (words[i] <= caret.column && words[i + 1] > caret.column) {
|
||||
return text[caret.line].substr(words[i], words[i + 1] - words[i]);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
|
|
@ -3718,11 +3716,11 @@ void TextEdit::select_word_under_caret() {
|
|||
|
||||
int begin = 0;
|
||||
int end = 0;
|
||||
const Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text.get_line_data(caret.line)->get_rid());
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if ((words[i].x < caret.column && words[i].y > caret.column) || (i == words.size() - 1 && caret.column == words[i].y)) {
|
||||
begin = words[i].x;
|
||||
end = words[i].y;
|
||||
const PackedInt32Array words = TS->shaped_text_get_word_breaks(text.get_line_data(caret.line)->get_rid());
|
||||
for (int i = 0; i < words.size(); i = i + 2) {
|
||||
if ((words[i] < caret.column && words[i + 1] > caret.column) || (i == words.size() - 2 && caret.column == words[i + 1])) {
|
||||
begin = words[i];
|
||||
end = words[i + 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -5376,14 +5374,12 @@ int TextEdit::_get_column_x_offset_for_line(int p_char, int p_line) const {
|
|||
}
|
||||
}
|
||||
|
||||
Rect2 l_caret, t_caret;
|
||||
TextServer::Direction l_dir, t_dir;
|
||||
RID text_rid = text.get_line_data(p_line)->get_line_rid(row);
|
||||
TS->shaped_text_get_carets(text_rid, caret.column, l_caret, l_dir, t_caret, t_dir);
|
||||
if ((l_caret != Rect2() && (l_dir == TextServer::DIRECTION_AUTO || l_dir == (TextServer::Direction)input_direction)) || (t_caret == Rect2())) {
|
||||
return l_caret.position.x;
|
||||
CaretInfo ts_caret = TS->shaped_text_get_carets(text_rid, caret.column);
|
||||
if ((ts_caret.l_caret != Rect2() && (ts_caret.l_dir == TextServer::DIRECTION_AUTO || ts_caret.l_dir == (TextServer::Direction)input_direction)) || (ts_caret.t_caret == Rect2())) {
|
||||
return ts_caret.l_caret.position.x;
|
||||
} else {
|
||||
return t_caret.position.x;
|
||||
return ts_caret.t_caret.position.x;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -5440,11 +5436,11 @@ void TextEdit::_update_selection_mode_word() {
|
|||
int caret_pos = CLAMP(col, 0, text[line].length());
|
||||
int beg = caret_pos;
|
||||
int end = beg;
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text.get_line_data(line)->get_rid());
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if ((words[i].x < caret_pos && words[i].y > caret_pos) || (i == words.size() - 1 && caret_pos == words[i].y)) {
|
||||
beg = words[i].x;
|
||||
end = words[i].y;
|
||||
PackedInt32Array words = TS->shaped_text_get_word_breaks(text.get_line_data(line)->get_rid());
|
||||
for (int i = 0; i < words.size(); i = i + 2) {
|
||||
if ((words[i] < caret_pos && words[i + 1] > caret_pos) || (i == words.size() - 2 && caret_pos == words[i + 1])) {
|
||||
beg = words[i];
|
||||
end = words[i + 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -6032,7 +6028,7 @@ void TextEdit::_base_insert_text(int p_line, int p_char, const String &p_text, i
|
|||
r_end_line = p_line + substrings.size() - 1;
|
||||
r_end_column = text[r_end_line].length() - postinsert_text.length();
|
||||
|
||||
TextServer::Direction dir = TS->shaped_text_get_dominant_direciton_in_range(text.get_line_data(r_end_line)->get_rid(), (r_end_line == p_line) ? caret.column : 0, r_end_column);
|
||||
TextServer::Direction dir = TS->shaped_text_get_dominant_direction_in_range(text.get_line_data(r_end_line)->get_rid(), (r_end_line == p_line) ? caret.column : 0, r_end_column);
|
||||
if (dir != TextServer::DIRECTION_AUTO) {
|
||||
input_direction = (TextDirection)dir;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ private:
|
|||
Vector<Gutter> gutters;
|
||||
|
||||
String data;
|
||||
Vector<Vector2i> bidi_override;
|
||||
Array bidi_override;
|
||||
Ref<TextParagraph> data_buf;
|
||||
|
||||
Color background_color = Color(0, 0, 0, 0);
|
||||
|
|
@ -194,7 +194,7 @@ private:
|
|||
Vector<Vector2i> get_line_wrap_ranges(int p_line) const;
|
||||
const Ref<TextParagraph> get_line_data(int p_line) const;
|
||||
|
||||
void set(int p_line, const String &p_text, const Vector<Vector2i> &p_bidi_override);
|
||||
void set(int p_line, const String &p_text, const Array &p_bidi_override);
|
||||
void set_hidden(int p_line, bool p_hidden) {
|
||||
text.write[p_line].hidden = p_hidden;
|
||||
if (!p_hidden && text[p_line].width > max_width) {
|
||||
|
|
@ -204,12 +204,12 @@ private:
|
|||
}
|
||||
}
|
||||
bool is_hidden(int p_line) const { return text[p_line].hidden; }
|
||||
void insert(int p_at, const String &p_text, const Vector<Vector2i> &p_bidi_override);
|
||||
void insert(int p_at, const String &p_text, const Array &p_bidi_override);
|
||||
void remove(int p_at);
|
||||
int size() const { return text.size(); }
|
||||
void clear();
|
||||
|
||||
void invalidate_cache(int p_line, int p_column = -1, const String &p_ime_text = String(), const Vector<Vector2i> &p_bidi_override = Vector<Vector2i>());
|
||||
void invalidate_cache(int p_line, int p_column = -1, const String &p_ime_text = String(), const Array &p_bidi_override = Array());
|
||||
void invalidate_all();
|
||||
void invalidate_all_lines();
|
||||
|
||||
|
|
|
|||
|
|
@ -647,13 +647,13 @@ void CanvasItem::draw_multimesh(const Ref<MultiMesh> &p_multimesh, const Ref<Tex
|
|||
RenderingServer::get_singleton()->canvas_item_add_multimesh(canvas_item, p_multimesh->get_rid(), texture_rid);
|
||||
}
|
||||
|
||||
void CanvasItem::draw_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HAlign p_align, real_t p_width, int p_size, const Color &p_modulate, int p_outline_size, const Color &p_outline_modulate, uint8_t p_flags) const {
|
||||
void CanvasItem::draw_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HAlign p_align, real_t p_width, int p_size, const Color &p_modulate, int p_outline_size, const Color &p_outline_modulate, uint16_t p_flags) const {
|
||||
ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal.");
|
||||
ERR_FAIL_COND(p_font.is_null());
|
||||
p_font->draw_string(canvas_item, p_pos, p_text, p_align, p_width, p_size, p_modulate, p_outline_size, p_outline_modulate, p_flags);
|
||||
}
|
||||
|
||||
void CanvasItem::draw_multiline_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HAlign p_align, real_t p_width, int p_max_lines, int p_size, const Color &p_modulate, int p_outline_size, const Color &p_outline_modulate, uint8_t p_flags) const {
|
||||
void CanvasItem::draw_multiline_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HAlign p_align, real_t p_width, int p_max_lines, int p_size, const Color &p_modulate, int p_outline_size, const Color &p_outline_modulate, uint16_t p_flags) const {
|
||||
ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal.");
|
||||
ERR_FAIL_COND(p_font.is_null());
|
||||
p_font->draw_multiline_string(canvas_item, p_pos, p_text, p_align, p_width, p_max_lines, p_size, p_modulate, p_outline_size, p_outline_modulate, p_flags);
|
||||
|
|
|
|||
|
|
@ -235,8 +235,8 @@ public:
|
|||
void draw_mesh(const Ref<Mesh> &p_mesh, const Ref<Texture2D> &p_texture, const Transform2D &p_transform = Transform2D(), const Color &p_modulate = Color(1, 1, 1));
|
||||
void draw_multimesh(const Ref<MultiMesh> &p_multimesh, const Ref<Texture2D> &p_texture);
|
||||
|
||||
void draw_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HAlign p_align = HALIGN_LEFT, real_t p_width = -1, int p_size = -1, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0), uint8_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
|
||||
void draw_multiline_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HAlign p_align = HALIGN_LEFT, real_t p_width = -1, int p_max_lines = -1, int p_size = -1, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0), uint8_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
|
||||
void draw_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HAlign p_align = HALIGN_LEFT, real_t p_width = -1, int p_size = -1, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0), uint16_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
|
||||
void draw_multiline_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HAlign p_align = HALIGN_LEFT, real_t p_width = -1, int p_max_lines = -1, int p_size = -1, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0), uint16_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
|
||||
real_t draw_char(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_char, const String &p_next = "", int p_size = -1, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0)) const;
|
||||
|
||||
void draw_set_transform(const Point2 &p_offset, real_t p_rot = 0.0, const Size2 &p_scale = Size2(1.0, 1.0));
|
||||
|
|
|
|||
|
|
@ -1404,7 +1404,7 @@ real_t Font::get_underline_thickness(int p_size) const {
|
|||
return ret;
|
||||
}
|
||||
|
||||
Size2 Font::get_string_size(const String &p_text, int p_size, HAlign p_align, real_t p_width, uint8_t p_flags) const {
|
||||
Size2 Font::get_string_size(const String &p_text, int p_size, HAlign p_align, real_t p_width, uint16_t p_flags) const {
|
||||
ERR_FAIL_COND_V(data.is_empty(), Size2());
|
||||
|
||||
int size = (p_size <= 0) ? base_size : p_size;
|
||||
|
|
@ -1431,7 +1431,7 @@ Size2 Font::get_string_size(const String &p_text, int p_size, HAlign p_align, re
|
|||
return buffer->get_size();
|
||||
}
|
||||
|
||||
Size2 Font::get_multiline_string_size(const String &p_text, real_t p_width, int p_size, uint8_t p_flags) const {
|
||||
Size2 Font::get_multiline_string_size(const String &p_text, real_t p_width, int p_size, uint16_t p_flags) const {
|
||||
ERR_FAIL_COND_V(data.is_empty(), Size2());
|
||||
|
||||
int size = (p_size <= 0) ? base_size : p_size;
|
||||
|
|
@ -1470,7 +1470,7 @@ Size2 Font::get_multiline_string_size(const String &p_text, real_t p_width, int
|
|||
return ret;
|
||||
}
|
||||
|
||||
void Font::draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HAlign p_align, real_t p_width, int p_size, const Color &p_modulate, int p_outline_size, const Color &p_outline_modulate, uint8_t p_flags) const {
|
||||
void Font::draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HAlign p_align, real_t p_width, int p_size, const Color &p_modulate, int p_outline_size, const Color &p_outline_modulate, uint16_t p_flags) const {
|
||||
ERR_FAIL_COND(data.is_empty());
|
||||
|
||||
int size = (p_size <= 0) ? base_size : p_size;
|
||||
|
|
@ -1512,7 +1512,7 @@ void Font::draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_t
|
|||
buffer->draw(p_canvas_item, ofs, p_modulate);
|
||||
}
|
||||
|
||||
void Font::draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HAlign p_align, float p_width, int p_max_lines, int p_size, const Color &p_modulate, int p_outline_size, const Color &p_outline_modulate, uint8_t p_flags) const {
|
||||
void Font::draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HAlign p_align, float p_width, int p_max_lines, int p_size, const Color &p_modulate, int p_outline_size, const Color &p_outline_modulate, uint16_t p_flags) const {
|
||||
ERR_FAIL_COND(data.is_empty());
|
||||
|
||||
int size = (p_size <= 0) ? base_size : p_size;
|
||||
|
|
|
|||
|
|
@ -266,11 +266,11 @@ public:
|
|||
virtual real_t get_underline_thickness(int p_size = -1) const;
|
||||
|
||||
// Drawing string.
|
||||
virtual Size2 get_string_size(const String &p_text, int p_size = -1, HAlign p_align = HALIGN_LEFT, real_t p_width = -1, uint8_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
|
||||
virtual Size2 get_multiline_string_size(const String &p_text, real_t p_width = -1, int p_size = -1, uint8_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND) const;
|
||||
virtual Size2 get_string_size(const String &p_text, int p_size = -1, HAlign p_align = HALIGN_LEFT, real_t p_width = -1, uint16_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
|
||||
virtual Size2 get_multiline_string_size(const String &p_text, real_t p_width = -1, int p_size = -1, uint16_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND) const;
|
||||
|
||||
virtual void draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HAlign p_align = HALIGN_LEFT, real_t p_width = -1, int p_size = -1, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0), uint8_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
|
||||
virtual void draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HAlign p_align = HALIGN_LEFT, real_t p_width = -1, int p_max_lines = -1, int p_size = -1, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0), uint8_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
|
||||
virtual void draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HAlign p_align = HALIGN_LEFT, real_t p_width = -1, int p_size = -1, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0), uint16_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
|
||||
virtual void draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HAlign p_align = HALIGN_LEFT, real_t p_width = -1, int p_max_lines = -1, int p_size = -1, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0), uint16_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
|
||||
|
||||
// Helper functions.
|
||||
virtual bool has_char(char32_t p_char) const;
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ void TextLine::_bind_methods() {
|
|||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "preserve_control"), "set_preserve_control", "get_preserve_control");
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_bidi_override", "override"), &TextLine::_set_bidi_override);
|
||||
ClassDB::bind_method(D_METHOD("set_bidi_override", "override"), &TextLine::set_bidi_override);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("add_string", "text", "fonts", "size", "opentype_features", "language"), &TextLine::add_string, DEFVAL(Dictionary()), DEFVAL(""));
|
||||
ClassDB::bind_method(D_METHOD("add_object", "key", "size", "inline_align", "length"), &TextLine::add_object, DEFVAL(INLINE_ALIGN_CENTER), DEFVAL(1));
|
||||
|
|
@ -112,7 +112,7 @@ void TextLine::_shape() {
|
|||
TS->shaped_text_tab_align(rid, tab_stops);
|
||||
}
|
||||
|
||||
uint8_t overrun_flags = TextServer::OVERRUN_NO_TRIMMING;
|
||||
uint16_t overrun_flags = TextServer::OVERRUN_NO_TRIMMING;
|
||||
if (overrun_behavior != OVERRUN_NO_TRIMMING) {
|
||||
switch (overrun_behavior) {
|
||||
case OVERRUN_TRIM_WORD_ELLIPSIS:
|
||||
|
|
@ -195,15 +195,7 @@ TextServer::Orientation TextLine::get_orientation() const {
|
|||
return TS->shaped_text_get_orientation(rid);
|
||||
}
|
||||
|
||||
void TextLine::_set_bidi_override(const Array &p_override) {
|
||||
Vector<Vector2i> overrides;
|
||||
for (int i = 0; i < p_override.size(); i++) {
|
||||
overrides.push_back(p_override[i]);
|
||||
}
|
||||
set_bidi_override(overrides);
|
||||
}
|
||||
|
||||
void TextLine::set_bidi_override(const Vector<Vector2i> &p_override) {
|
||||
void TextLine::set_bidi_override(const Array &p_override) {
|
||||
TS->shaped_text_set_bidi_override(rid, p_override);
|
||||
dirty = true;
|
||||
}
|
||||
|
|
@ -256,14 +248,14 @@ void TextLine::tab_align(const Vector<float> &p_tab_stops) {
|
|||
dirty = true;
|
||||
}
|
||||
|
||||
void TextLine::set_flags(uint8_t p_flags) {
|
||||
void TextLine::set_flags(uint16_t p_flags) {
|
||||
if (flags != p_flags) {
|
||||
flags = p_flags;
|
||||
dirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t TextLine::get_flags() const {
|
||||
uint16_t TextLine::get_flags() const {
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ private:
|
|||
bool dirty = true;
|
||||
|
||||
float width = -1.0;
|
||||
uint8_t flags = TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA;
|
||||
uint16_t flags = TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA;
|
||||
HAlign align = HALIGN_LEFT;
|
||||
OverrunBehavior overrun_behavior = OVERRUN_TRIM_ELLIPSIS;
|
||||
|
||||
|
|
@ -75,7 +75,7 @@ public:
|
|||
void set_direction(TextServer::Direction p_direction);
|
||||
TextServer::Direction get_direction() const;
|
||||
|
||||
void set_bidi_override(const Vector<Vector2i> &p_override);
|
||||
void set_bidi_override(const Array &p_override);
|
||||
|
||||
void set_orientation(TextServer::Orientation p_orientation);
|
||||
TextServer::Orientation get_orientation() const;
|
||||
|
|
@ -95,8 +95,8 @@ public:
|
|||
|
||||
void tab_align(const Vector<float> &p_tab_stops);
|
||||
|
||||
void set_flags(uint8_t p_flags);
|
||||
uint8_t get_flags() const;
|
||||
void set_flags(uint16_t p_flags);
|
||||
uint16_t get_flags() const;
|
||||
|
||||
void set_text_overrun_behavior(OverrunBehavior p_behavior);
|
||||
OverrunBehavior get_text_overrun_behavior() const;
|
||||
|
|
@ -120,8 +120,6 @@ public:
|
|||
|
||||
int hit_test(float p_coords) const;
|
||||
|
||||
void _set_bidi_override(const Array &p_override);
|
||||
|
||||
TextLine(const String &p_text, const Ref<Font> &p_fonts, int p_size, const Dictionary &p_opentype_features = Dictionary(), const String &p_language = "", TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL);
|
||||
TextLine();
|
||||
~TextLine();
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ void TextParagraph::_bind_methods() {
|
|||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "preserve_control"), "set_preserve_control", "get_preserve_control");
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_bidi_override", "override"), &TextParagraph::_set_bidi_override);
|
||||
ClassDB::bind_method(D_METHOD("set_bidi_override", "override"), &TextParagraph::set_bidi_override);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_dropcap", "text", "fonts", "size", "dropcap_margins", "opentype_features", "language"), &TextParagraph::set_dropcap, DEFVAL(Rect2()), DEFVAL(Dictionary()), DEFVAL(""));
|
||||
ClassDB::bind_method(D_METHOD("clear_dropcap"), &TextParagraph::clear_dropcap);
|
||||
|
|
@ -158,9 +158,9 @@ void TextParagraph::_shape_lines() {
|
|||
|
||||
if (h_offset > 0) {
|
||||
// Dropcap, flow around.
|
||||
Vector<Vector2i> line_breaks = TS->shaped_text_get_line_breaks(rid, width - h_offset, 0, flags);
|
||||
for (int i = 0; i < line_breaks.size(); i++) {
|
||||
RID line = TS->shaped_text_substr(rid, line_breaks[i].x, line_breaks[i].y - line_breaks[i].x);
|
||||
PackedInt32Array line_breaks = TS->shaped_text_get_line_breaks(rid, width - h_offset, 0, flags);
|
||||
for (int i = 0; i < line_breaks.size(); i = i + 2) {
|
||||
RID line = TS->shaped_text_substr(rid, line_breaks[i], line_breaks[i + 1] - line_breaks[i]);
|
||||
float h = (TS->shaped_text_get_orientation(line) == TextServer::ORIENTATION_HORIZONTAL) ? TS->shaped_text_get_size(line).y : TS->shaped_text_get_size(line).x;
|
||||
if (v_offset < h) {
|
||||
TS->free(line);
|
||||
|
|
@ -171,21 +171,21 @@ void TextParagraph::_shape_lines() {
|
|||
}
|
||||
dropcap_lines++;
|
||||
v_offset -= h;
|
||||
start = line_breaks[i].y;
|
||||
start = line_breaks[i + 1];
|
||||
lines_rid.push_back(line);
|
||||
}
|
||||
}
|
||||
// Use fixed for the rest of lines.
|
||||
Vector<Vector2i> line_breaks = TS->shaped_text_get_line_breaks(rid, width, start, flags);
|
||||
for (int i = 0; i < line_breaks.size(); i++) {
|
||||
RID line = TS->shaped_text_substr(rid, line_breaks[i].x, line_breaks[i].y - line_breaks[i].x);
|
||||
PackedInt32Array line_breaks = TS->shaped_text_get_line_breaks(rid, width, start, flags);
|
||||
for (int i = 0; i < line_breaks.size(); i = i + 2) {
|
||||
RID line = TS->shaped_text_substr(rid, line_breaks[i], line_breaks[i + 1] - line_breaks[i]);
|
||||
if (!tab_stops.is_empty()) {
|
||||
TS->shaped_text_tab_align(line, tab_stops);
|
||||
}
|
||||
lines_rid.push_back(line);
|
||||
}
|
||||
|
||||
uint8_t overrun_flags = TextServer::OVERRUN_NO_TRIMMING;
|
||||
uint16_t overrun_flags = TextServer::OVERRUN_NO_TRIMMING;
|
||||
if (overrun_behavior != OVERRUN_NO_TRIMMING) {
|
||||
switch (overrun_behavior) {
|
||||
case OVERRUN_TRIM_WORD_ELLIPSIS:
|
||||
|
|
@ -347,15 +347,7 @@ int TextParagraph::get_spacing_bottom() const {
|
|||
return spacing_bottom;
|
||||
}
|
||||
|
||||
void TextParagraph::_set_bidi_override(const Array &p_override) {
|
||||
Vector<Vector2i> overrides;
|
||||
for (int i = 0; i < p_override.size(); i++) {
|
||||
overrides.push_back(p_override[i]);
|
||||
}
|
||||
set_bidi_override(overrides);
|
||||
}
|
||||
|
||||
void TextParagraph::set_bidi_override(const Vector<Vector2i> &p_override) {
|
||||
void TextParagraph::set_bidi_override(const Array &p_override) {
|
||||
TS->shaped_text_set_bidi_override(rid, p_override);
|
||||
lines_dirty = true;
|
||||
}
|
||||
|
|
@ -392,14 +384,14 @@ void TextParagraph::tab_align(const Vector<float> &p_tab_stops) {
|
|||
lines_dirty = true;
|
||||
}
|
||||
|
||||
void TextParagraph::set_flags(uint8_t p_flags) {
|
||||
void TextParagraph::set_flags(uint16_t p_flags) {
|
||||
if (flags != p_flags) {
|
||||
flags = p_flags;
|
||||
lines_dirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t TextParagraph::get_flags() const {
|
||||
uint16_t TextParagraph::get_flags() const {
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ private:
|
|||
float width = -1.0;
|
||||
int max_lines_visible = -1;
|
||||
|
||||
uint8_t flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA;
|
||||
uint16_t flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA;
|
||||
OverrunBehavior overrun_behavior = OVERRUN_NO_TRIMMING;
|
||||
|
||||
HAlign align = HALIGN_LEFT;
|
||||
|
|
@ -94,7 +94,7 @@ public:
|
|||
void set_preserve_control(bool p_enabled);
|
||||
bool get_preserve_control() const;
|
||||
|
||||
void set_bidi_override(const Vector<Vector2i> &p_override);
|
||||
void set_bidi_override(const Array &p_override);
|
||||
|
||||
bool set_dropcap(const String &p_text, const Ref<Font> &p_fonts, int p_size, const Rect2 &p_dropcap_margins = Rect2(), const Dictionary &p_opentype_features = Dictionary(), const String &p_language = "");
|
||||
void clear_dropcap();
|
||||
|
|
@ -108,8 +108,8 @@ public:
|
|||
|
||||
void tab_align(const Vector<float> &p_tab_stops);
|
||||
|
||||
void set_flags(uint8_t p_flags);
|
||||
uint8_t get_flags() const;
|
||||
void set_flags(uint16_t p_flags);
|
||||
uint16_t get_flags() const;
|
||||
|
||||
void set_text_overrun_behavior(OverrunBehavior p_behavior);
|
||||
OverrunBehavior get_text_overrun_behavior() const;
|
||||
|
|
@ -153,8 +153,6 @@ public:
|
|||
|
||||
int hit_test(const Point2 &p_coords) const;
|
||||
|
||||
void _set_bidi_override(const Array &p_override);
|
||||
|
||||
TextParagraph(const String &p_text, const Ref<Font> &p_fonts, int p_size, const Dictionary &p_opentype_features = Dictionary(), const String &p_language = "", float p_width = -1.f, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL);
|
||||
TextParagraph();
|
||||
~TextParagraph();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue