Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use underline position and thickness value in font file #31086

Merged
merged 1 commit into from
May 7, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions scene/gui/link_button.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,11 @@ void LinkButton::_notification(int p_what) {
draw_string(font, Vector2(0, font->get_ascent()), text, color);

if (do_underline) {
int underline_spacing = get_theme_constant("underline_spacing");
int underline_spacing = get_theme_constant("underline_spacing") + font->get_underline_position();
int width = font->get_string_size(text).width;
int y = font->get_ascent() + underline_spacing;

draw_line(Vector2(0, y), Vector2(width, y), color);
draw_line(Vector2(0, y), Vector2(width, y), color, font->get_underline_thickness());
}

} break;
Expand Down
6 changes: 3 additions & 3 deletions scene/gui/rich_text_label.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -600,8 +600,8 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
if (underline) {
Color uc = color;
uc.a *= 0.5;
int uy = y + lh - line_descent + 2;
float underline_width = 1.0;
int uy = y + lh - line_descent + font->get_underline_position();
float underline_width = font->get_underline_thickness();
#ifdef TOOLS_ENABLED
underline_width *= EDSCALE;
#endif
Expand All @@ -610,7 +610,7 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
Color uc = color;
uc.a *= 0.5;
int uy = y + lh - (line_ascent + line_descent) / 2;
float strikethrough_width = 1.0;
float strikethrough_width = font->get_underline_thickness();
#ifdef TOOLS_ENABLED
strikethrough_width *= EDSCALE;
Copy link
Member

@akien-mga akien-mga Aug 6, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the EDSCALE factor still needed now that we retrieve this information from the font? Or would it scale automatically together with the font? CC @Calinou

#endif
Expand Down
4 changes: 2 additions & 2 deletions scene/gui/text_edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1487,12 +1487,12 @@ void TextEdit::_notification(int p_what) {
int yofs = ofs_y + (get_row_height() - cache.font->get_height()) / 2;
int w = drawer.draw_char(ci, Point2i(char_ofs + char_margin + ofs_x, yofs + ascent), str[j], str[j + 1], in_selection && override_selected_font_color ? cache.font_color_selected : color);
if (underlined) {
float line_width = 1.0;
float line_width = cache.font->get_underline_thickness();
#ifdef TOOLS_ENABLED
line_width *= EDSCALE;
#endif

draw_rect(Rect2(char_ofs + char_margin + ofs_x, yofs + ascent + 2, w, line_width), in_selection && override_selected_font_color ? cache.font_color_selected : color);
draw_rect(Rect2(char_ofs + char_margin + ofs_x, yofs + ascent + cache.font->get_underline_position(), w, line_width), in_selection && override_selected_font_color ? cache.font_color_selected : color);
}
} else if (draw_tabs && str[j] == '\t') {
int yofs = (get_row_height() - cache.tab_icon->get_height()) / 2;
Expand Down
28 changes: 28 additions & 0 deletions scene/resources/dynamic_font.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,8 @@ Error DynamicFontAtSize::_load() {

ascent = (face->size->metrics.ascender / 64.0) / oversampling * scale_color_font;
descent = (-face->size->metrics.descender / 64.0) / oversampling * scale_color_font;
underline_position = -face->underline_position / 64.0 / oversampling * scale_color_font;
underline_thickness = face->underline_thickness / 64.0 / oversampling * scale_color_font;
linegap = 0;

valid = true;
Expand All @@ -243,6 +245,16 @@ float DynamicFontAtSize::get_descent() const {
return descent;
}

float DynamicFontAtSize::get_underline_position() const {

return underline_position;
}

float DynamicFontAtSize::get_underline_thickness() const {

return underline_thickness;
}

const Pair<const DynamicFontAtSize::Character *, DynamicFontAtSize *> DynamicFontAtSize::_find_char_with_font(CharType p_char, const Vector<Ref<DynamicFontAtSize>> &p_fallbacks) const {
const Character *chr = char_map.getptr(p_char);
ERR_FAIL_COND_V(!chr, (Pair<const Character *, DynamicFontAtSize *>(nullptr, nullptr)));
Expand Down Expand Up @@ -821,6 +833,22 @@ float DynamicFont::get_descent() const {
return data_at_size->get_descent() + spacing_bottom;
}

float DynamicFont::get_underline_position() const {

if (!data_at_size.is_valid())
return 2;

return data_at_size->get_underline_position();
}

float DynamicFont::get_underline_thickness() const {

if (!data_at_size.is_valid())
return 1;

return data_at_size->get_underline_thickness();
}

Size2 DynamicFont::get_char_size(CharType p_char, CharType p_next) const {

if (!data_at_size.is_valid())
Expand Down
6 changes: 6 additions & 0 deletions scene/resources/dynamic_font.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ class DynamicFontAtSize : public Reference {
float rect_margin;
float oversampling;
float scale_color_font;
float underline_position;
float underline_thickness;

bool valid;

Expand Down Expand Up @@ -187,6 +189,8 @@ class DynamicFontAtSize : public Reference {

float get_ascent() const;
float get_descent() const;
float get_underline_position() const;
float get_underline_thickness() const;

Size2 get_char_size(CharType p_char, CharType p_next, const Vector<Ref<DynamicFontAtSize>> &p_fallbacks) const;

Expand Down Expand Up @@ -274,6 +278,8 @@ class DynamicFont : public Font {

virtual float get_ascent() const;
virtual float get_descent() const;
virtual float get_underline_position() const;
virtual float get_underline_thickness() const;

virtual Size2 get_char_size(CharType p_char, CharType p_next = 0) const;

Expand Down
10 changes: 10 additions & 0 deletions scene/resources/font.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,16 @@ float BitmapFont::get_descent() const {
return height - ascent;
}

float BitmapFont::get_underline_position() const {

return 2;
}

float BitmapFont::get_underline_thickness() const {

return 1;
}

void BitmapFont::add_texture(const Ref<Texture2D> &p_texture) {

ERR_FAIL_COND_MSG(p_texture.is_null(), "It's not a reference to a valid Texture object.");
Expand Down
4 changes: 4 additions & 0 deletions scene/resources/font.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ class Font : public Resource {

virtual float get_ascent() const = 0;
virtual float get_descent() const = 0;
virtual float get_underline_position() const = 0;
virtual float get_underline_thickness() const = 0;

virtual Size2 get_char_size(CharType p_char, CharType p_next = 0) const = 0;
Size2 get_string_size(const String &p_string) const;
Expand Down Expand Up @@ -167,6 +169,8 @@ class BitmapFont : public Font {
void set_ascent(float p_ascent);
float get_ascent() const;
float get_descent() const;
float get_underline_position() const;
float get_underline_thickness() const;

void add_texture(const Ref<Texture2D> &p_texture);
void add_char(CharType p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance = -1);
Expand Down