From 7334636933a35a58f0fa62d5c5ebf16c7b7f586c Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Fri, 1 Apr 2022 12:46:36 +0200 Subject: [PATCH] LibGfx: Return kerning values as a `float` instead of `int` This allows for a more precise rounding of glyph positions. --- Userland/Libraries/LibGfx/BitmapFont.h | 2 +- Userland/Libraries/LibGfx/Font.h | 2 +- Userland/Libraries/LibGfx/Painter.cpp | 4 ++-- Userland/Libraries/LibGfx/TrueTypeFont/Font.cpp | 10 +++++----- Userland/Libraries/LibGfx/TrueTypeFont/Font.h | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Userland/Libraries/LibGfx/BitmapFont.h b/Userland/Libraries/LibGfx/BitmapFont.h index 0146f2fa7b..d4a0e95319 100644 --- a/Userland/Libraries/LibGfx/BitmapFont.h +++ b/Userland/Libraries/LibGfx/BitmapFont.h @@ -59,7 +59,7 @@ public: return m_glyph_width; return glyph_or_emoji_width_for_variable_width_font(code_point); } - i32 glyphs_horizontal_kerning(u32, u32) const override { return 0; } + float glyphs_horizontal_kerning(u32, u32) const override { return 0.f; } u8 glyph_height() const override { return m_glyph_height; } int x_height() const override { return m_x_height; } int preferred_line_height() const override { return glyph_height() + m_line_gap; } diff --git a/Userland/Libraries/LibGfx/Font.h b/Userland/Libraries/LibGfx/Font.h index 1f24f22bde..fa0f29bc2b 100644 --- a/Userland/Libraries/LibGfx/Font.h +++ b/Userland/Libraries/LibGfx/Font.h @@ -127,7 +127,7 @@ public: virtual u8 glyph_width(u32 code_point) const = 0; virtual int glyph_or_emoji_width(u32 code_point) const = 0; - virtual i32 glyphs_horizontal_kerning(u32 left_code_point, u32 right_code_point) const = 0; + virtual float glyphs_horizontal_kerning(u32 left_code_point, u32 right_code_point) const = 0; virtual u8 glyph_height() const = 0; virtual int x_height() const = 0; virtual int preferred_line_height() const = 0; diff --git a/Userland/Libraries/LibGfx/Painter.cpp b/Userland/Libraries/LibGfx/Painter.cpp index ba43b5e861..8329e92339 100644 --- a/Userland/Libraries/LibGfx/Painter.cpp +++ b/Userland/Libraries/LibGfx/Painter.cpp @@ -1387,8 +1387,8 @@ void draw_text_line(IntRect const& a_rect, Utf8View const& text, Font const& fon continue; } - int kerning = font.glyphs_horizontal_kerning(last_code_point, code_point); - if (kerning != 0) + int kerning = static_cast(lroundf(font.glyphs_horizontal_kerning(last_code_point, code_point))); + if (kerning != 0.f) point.translate_by(direction == TextDirection::LTR ? kerning : -kerning, 0); IntSize glyph_size(font.glyph_or_emoji_width(code_point) + font.glyph_spacing(), font.pixel_size()); diff --git a/Userland/Libraries/LibGfx/TrueTypeFont/Font.cpp b/Userland/Libraries/LibGfx/TrueTypeFont/Font.cpp index 3f48d8b0c8..f6d43eb052 100644 --- a/Userland/Libraries/LibGfx/TrueTypeFont/Font.cpp +++ b/Userland/Libraries/LibGfx/TrueTypeFont/Font.cpp @@ -558,10 +558,10 @@ ScaledGlyphMetrics Font::glyph_metrics(u32 glyph_id, float x_scale, float y_scal }; } -i32 Font::glyphs_horizontal_kerning(u32 left_glyph_id, u32 right_glyph_id, float x_scale) const +float Font::glyphs_horizontal_kerning(u32 left_glyph_id, u32 right_glyph_id, float x_scale) const { if (!m_kern.has_value()) - return 0; + return 0.f; return m_kern->get_glyph_kerning(left_glyph_id, right_glyph_id) * x_scale; } @@ -705,15 +705,15 @@ int ScaledFont::glyph_or_emoji_width(u32 code_point) const return metrics.advance_width; } -i32 ScaledFont::glyphs_horizontal_kerning(u32 left_code_point, u32 right_code_point) const +float ScaledFont::glyphs_horizontal_kerning(u32 left_code_point, u32 right_code_point) const { if (left_code_point == 0 || right_code_point == 0) - return 0; + return 0.f; auto left_glyph_id = glyph_id_for_code_point(left_code_point); auto right_glyph_id = glyph_id_for_code_point(right_code_point); if (left_glyph_id == 0 || right_glyph_id == 0) - return 0; + return 0.f; return m_font->glyphs_horizontal_kerning(left_glyph_id, right_glyph_id, m_x_scale); } diff --git a/Userland/Libraries/LibGfx/TrueTypeFont/Font.h b/Userland/Libraries/LibGfx/TrueTypeFont/Font.h index 1b63ffe07b..40262aa1d1 100644 --- a/Userland/Libraries/LibGfx/TrueTypeFont/Font.h +++ b/Userland/Libraries/LibGfx/TrueTypeFont/Font.h @@ -49,7 +49,7 @@ public: ScaledFontMetrics metrics(float x_scale, float y_scale) const; ScaledGlyphMetrics glyph_metrics(u32 glyph_id, float x_scale, float y_scale) const; - i32 glyphs_horizontal_kerning(u32 left_glyph_id, u32 right_glyph_id, float x_scale) const; + float glyphs_horizontal_kerning(u32 left_glyph_id, u32 right_glyph_id, float x_scale) const; RefPtr rasterize_glyph(u32 glyph_id, float x_scale, float y_scale) const; u32 glyph_count() const; u16 units_per_em() const; @@ -122,7 +122,7 @@ public: ScaledGlyphMetrics glyph_metrics(u32 glyph_id) const { return m_font->glyph_metrics(glyph_id, m_x_scale, m_y_scale); } RefPtr rasterize_glyph(u32 glyph_id) const; - // Gfx::Font implementation + // ^Gfx::Font virtual NonnullRefPtr clone() const override { return *this; } // FIXME: clone() should not need to be implemented virtual u8 presentation_size() const override { return m_point_height; } virtual int pixel_size() const override { return m_point_height * 1.33333333f; } @@ -134,7 +134,7 @@ public: virtual bool contains_glyph(u32 code_point) const override { return m_font->glyph_id_for_code_point(code_point) > 0; } virtual u8 glyph_width(u32 code_point) const override; virtual int glyph_or_emoji_width(u32 code_point) const override; - virtual i32 glyphs_horizontal_kerning(u32 left_code_point, u32 right_code_point) const override; + virtual float glyphs_horizontal_kerning(u32 left_code_point, u32 right_code_point) const override; virtual int preferred_line_height() const override { return metrics().height() + metrics().line_gap; } virtual u8 glyph_height() const override { return m_point_height; } virtual int x_height() const override { return m_point_height; } // FIXME: Read from font