|
@@ -140,6 +140,8 @@ RID TextParagraph::get_line_rid(int p_line) const {
|
|
|
}
|
|
|
|
|
|
void TextParagraph::clear() {
|
|
|
+ spacing_top = 0;
|
|
|
+ spacing_bottom = 0;
|
|
|
for (int i = 0; i < lines.size(); i++) {
|
|
|
TS->free(lines[i]);
|
|
|
}
|
|
@@ -187,6 +189,8 @@ TextServer::Orientation TextParagraph::get_orientation() const {
|
|
|
|
|
|
bool TextParagraph::add_string(const String &p_text, const Ref<Font> &p_fonts, int p_size, const Dictionary &p_opentype_features, const String &p_language) {
|
|
|
bool res = TS->shaped_text_add_string(rid, p_text, p_fonts->get_rids(), p_size, p_opentype_features, p_language);
|
|
|
+ spacing_top = p_fonts->get_spacing(Font::SPACING_TOP);
|
|
|
+ spacing_bottom = p_fonts->get_spacing(Font::SPACING_BOTTOM);
|
|
|
dirty_lines = true;
|
|
|
return res;
|
|
|
}
|
|
@@ -260,7 +264,11 @@ float TextParagraph::get_width() const {
|
|
|
|
|
|
Size2 TextParagraph::get_non_wraped_size() const {
|
|
|
const_cast<TextParagraph *>(this)->_shape_lines();
|
|
|
- return TS->shaped_text_get_size(rid);
|
|
|
+ if (TS->shaped_text_get_orientation(rid) == TextServer::ORIENTATION_HORIZONTAL) {
|
|
|
+ return Size2(TS->shaped_text_get_size(rid).x, TS->shaped_text_get_size(rid).y + spacing_top + spacing_bottom);
|
|
|
+ } else {
|
|
|
+ return Size2(TS->shaped_text_get_size(rid).x + spacing_top + spacing_bottom, TS->shaped_text_get_size(rid).y);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
Size2 TextParagraph::get_size() const {
|
|
@@ -270,9 +278,9 @@ Size2 TextParagraph::get_size() const {
|
|
|
Size2 lsize = TS->shaped_text_get_size(lines[i]);
|
|
|
if (TS->shaped_text_get_orientation(lines[i]) == TextServer::ORIENTATION_HORIZONTAL) {
|
|
|
size.x = MAX(size.x, lsize.x);
|
|
|
- size.y += lsize.y;
|
|
|
+ size.y += lsize.y + spacing_top + spacing_bottom;
|
|
|
} else {
|
|
|
- size.x += lsize.x;
|
|
|
+ size.x += lsize.x + spacing_top + spacing_bottom;
|
|
|
size.y = MAX(size.y, lsize.y);
|
|
|
}
|
|
|
}
|
|
@@ -297,9 +305,9 @@ Rect2 TextParagraph::get_line_object_rect(int p_line, Variant p_key) const {
|
|
|
for (int i = 0; i < p_line; i++) {
|
|
|
Size2 lsize = TS->shaped_text_get_size(lines[i]);
|
|
|
if (TS->shaped_text_get_orientation(lines[i]) == TextServer::ORIENTATION_HORIZONTAL) {
|
|
|
- xrect.position.y += lsize.y;
|
|
|
+ xrect.position.y += lsize.y + spacing_top + spacing_bottom;
|
|
|
} else {
|
|
|
- xrect.position.x += lsize.x;
|
|
|
+ xrect.position.x += lsize.x + spacing_top + spacing_bottom;
|
|
|
}
|
|
|
}
|
|
|
return xrect;
|
|
@@ -308,7 +316,11 @@ Rect2 TextParagraph::get_line_object_rect(int p_line, Variant p_key) const {
|
|
|
Size2 TextParagraph::get_line_size(int p_line) const {
|
|
|
const_cast<TextParagraph *>(this)->_shape_lines();
|
|
|
ERR_FAIL_COND_V(p_line < 0 || p_line >= lines.size(), Size2());
|
|
|
- return TS->shaped_text_get_size(lines[p_line]);
|
|
|
+ if (TS->shaped_text_get_orientation(lines[p_line]) == TextServer::ORIENTATION_HORIZONTAL) {
|
|
|
+ return Size2(TS->shaped_text_get_size(lines[p_line]).x, TS->shaped_text_get_size(lines[p_line]).y + spacing_top + spacing_bottom);
|
|
|
+ } else {
|
|
|
+ return Size2(TS->shaped_text_get_size(lines[p_line]).x + spacing_top + spacing_bottom, TS->shaped_text_get_size(lines[p_line]).y);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
Vector2i TextParagraph::get_line_range(int p_line) const {
|
|
@@ -320,13 +332,13 @@ Vector2i TextParagraph::get_line_range(int p_line) const {
|
|
|
float TextParagraph::get_line_ascent(int p_line) const {
|
|
|
const_cast<TextParagraph *>(this)->_shape_lines();
|
|
|
ERR_FAIL_COND_V(p_line < 0 || p_line >= lines.size(), 0.f);
|
|
|
- return TS->shaped_text_get_ascent(lines[p_line]);
|
|
|
+ return TS->shaped_text_get_ascent(lines[p_line]) + spacing_top;
|
|
|
}
|
|
|
|
|
|
float TextParagraph::get_line_descent(int p_line) const {
|
|
|
const_cast<TextParagraph *>(this)->_shape_lines();
|
|
|
ERR_FAIL_COND_V(p_line < 0 || p_line >= lines.size(), 0.f);
|
|
|
- return TS->shaped_text_get_descent(lines[p_line]);
|
|
|
+ return TS->shaped_text_get_descent(lines[p_line]) + spacing_bottom;
|
|
|
}
|
|
|
|
|
|
float TextParagraph::get_line_width(int p_line) const {
|
|
@@ -353,10 +365,10 @@ void TextParagraph::draw(RID p_canvas, const Vector2 &p_pos, const Color &p_colo
|
|
|
for (int i = 0; i < lines.size(); i++) {
|
|
|
if (TS->shaped_text_get_orientation(lines[i]) == TextServer::ORIENTATION_HORIZONTAL) {
|
|
|
ofs.x = p_pos.x;
|
|
|
- ofs.y += TS->shaped_text_get_ascent(lines[i]);
|
|
|
+ ofs.y += TS->shaped_text_get_ascent(lines[i]) + spacing_top;
|
|
|
} else {
|
|
|
ofs.y = p_pos.y;
|
|
|
- ofs.x += TS->shaped_text_get_ascent(lines[i]);
|
|
|
+ ofs.x += TS->shaped_text_get_ascent(lines[i]) + spacing_top;
|
|
|
}
|
|
|
float length = TS->shaped_text_get_width(lines[i]);
|
|
|
if (width > 0) {
|
|
@@ -389,10 +401,10 @@ void TextParagraph::draw(RID p_canvas, const Vector2 &p_pos, const Color &p_colo
|
|
|
TS->shaped_text_draw(lines[i], p_canvas, ofs, clip_l, clip_l + width, p_color);
|
|
|
if (TS->shaped_text_get_orientation(lines[i]) == TextServer::ORIENTATION_HORIZONTAL) {
|
|
|
ofs.x = p_pos.x;
|
|
|
- ofs.y += TS->shaped_text_get_descent(lines[i]);
|
|
|
+ ofs.y += TS->shaped_text_get_descent(lines[i]) + spacing_bottom;
|
|
|
} else {
|
|
|
ofs.y = p_pos.y;
|
|
|
- ofs.x += TS->shaped_text_get_descent(lines[i]);
|
|
|
+ ofs.x += TS->shaped_text_get_descent(lines[i]) + spacing_bottom;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -403,10 +415,10 @@ void TextParagraph::draw_outline(RID p_canvas, const Vector2 &p_pos, int p_outli
|
|
|
for (int i = 0; i < lines.size(); i++) {
|
|
|
if (TS->shaped_text_get_orientation(lines[i]) == TextServer::ORIENTATION_HORIZONTAL) {
|
|
|
ofs.x = p_pos.x;
|
|
|
- ofs.y += TS->shaped_text_get_ascent(lines[i]);
|
|
|
+ ofs.y += TS->shaped_text_get_ascent(lines[i]) + spacing_top;
|
|
|
} else {
|
|
|
ofs.y = p_pos.y;
|
|
|
- ofs.x += TS->shaped_text_get_ascent(lines[i]);
|
|
|
+ ofs.x += TS->shaped_text_get_ascent(lines[i]) + spacing_top;
|
|
|
}
|
|
|
float length = TS->shaped_text_get_width(lines[i]);
|
|
|
if (width > 0) {
|
|
@@ -439,10 +451,10 @@ void TextParagraph::draw_outline(RID p_canvas, const Vector2 &p_pos, int p_outli
|
|
|
TS->shaped_text_draw_outline(lines[i], p_canvas, ofs, clip_l, clip_l + width, p_outline_size, p_color);
|
|
|
if (TS->shaped_text_get_orientation(lines[i]) == TextServer::ORIENTATION_HORIZONTAL) {
|
|
|
ofs.x = p_pos.x;
|
|
|
- ofs.y += TS->shaped_text_get_descent(lines[i]);
|
|
|
+ ofs.y += TS->shaped_text_get_descent(lines[i]) + spacing_bottom;
|
|
|
} else {
|
|
|
ofs.y = p_pos.y;
|
|
|
- ofs.x += TS->shaped_text_get_descent(lines[i]);
|
|
|
+ ofs.x += TS->shaped_text_get_descent(lines[i]) + spacing_bottom;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -462,10 +474,12 @@ int TextParagraph::hit_test(const Point2 &p_coords) const {
|
|
|
if ((p_coords.y >= ofs.y) && (p_coords.y <= ofs.y + TS->shaped_text_get_size(lines[i]).y)) {
|
|
|
return TS->shaped_text_hit_test_position(lines[i], p_coords.x);
|
|
|
}
|
|
|
+ ofs.y += TS->shaped_text_get_size(lines[i]).y + spacing_bottom + spacing_top;
|
|
|
} else {
|
|
|
if ((p_coords.x >= ofs.x) && (p_coords.x <= ofs.x + TS->shaped_text_get_size(lines[i]).x)) {
|
|
|
return TS->shaped_text_hit_test_position(lines[i], p_coords.y);
|
|
|
}
|
|
|
+ ofs.y += TS->shaped_text_get_size(lines[i]).x + spacing_bottom + spacing_top;
|
|
|
}
|
|
|
}
|
|
|
return TS->shaped_text_get_range(rid).y;
|
|
@@ -477,9 +491,9 @@ void TextParagraph::draw_line(RID p_canvas, const Vector2 &p_pos, int p_line, co
|
|
|
|
|
|
Vector2 ofs = p_pos;
|
|
|
if (TS->shaped_text_get_orientation(lines[p_line]) == TextServer::ORIENTATION_HORIZONTAL) {
|
|
|
- ofs.y += TS->shaped_text_get_ascent(lines[p_line]);
|
|
|
+ ofs.y += TS->shaped_text_get_ascent(lines[p_line]) + spacing_top;
|
|
|
} else {
|
|
|
- ofs.x += TS->shaped_text_get_ascent(lines[p_line]);
|
|
|
+ ofs.x += TS->shaped_text_get_ascent(lines[p_line]) + spacing_top;
|
|
|
}
|
|
|
return TS->shaped_text_draw(lines[p_line], p_canvas, ofs, -1, -1, p_color);
|
|
|
}
|
|
@@ -490,9 +504,9 @@ void TextParagraph::draw_line_outline(RID p_canvas, const Vector2 &p_pos, int p_
|
|
|
|
|
|
Vector2 ofs = p_pos;
|
|
|
if (TS->shaped_text_get_orientation(lines[p_line]) == TextServer::ORIENTATION_HORIZONTAL) {
|
|
|
- ofs.y += TS->shaped_text_get_ascent(lines[p_line]);
|
|
|
+ ofs.y += TS->shaped_text_get_ascent(lines[p_line]) + spacing_top;
|
|
|
} else {
|
|
|
- ofs.x += TS->shaped_text_get_ascent(lines[p_line]);
|
|
|
+ ofs.x += TS->shaped_text_get_ascent(lines[p_line]) + spacing_top;
|
|
|
}
|
|
|
return TS->shaped_text_draw_outline(lines[p_line], p_canvas, ofs, -1, -1, p_outline_size, p_color);
|
|
|
}
|
|
@@ -500,8 +514,9 @@ void TextParagraph::draw_line_outline(RID p_canvas, const Vector2 &p_pos, int p_
|
|
|
TextParagraph::TextParagraph(const String &p_text, const Ref<Font> &p_fonts, int p_size, const Dictionary &p_opentype_features, const String &p_language, float p_width, TextServer::Direction p_direction, TextServer::Orientation p_orientation) {
|
|
|
rid = TS->create_shaped_text(p_direction, p_orientation);
|
|
|
TS->shaped_text_add_string(rid, p_text, p_fonts->get_rids(), p_size, p_opentype_features, p_language);
|
|
|
+ spacing_top = p_fonts->get_spacing(Font::SPACING_TOP);
|
|
|
+ spacing_bottom = p_fonts->get_spacing(Font::SPACING_BOTTOM);
|
|
|
width = p_width;
|
|
|
- dirty_lines = true;
|
|
|
}
|
|
|
|
|
|
TextParagraph::TextParagraph() {
|