1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-06-03 00:18:12 +00:00

LibGfx: Return kerning values as a float instead of int

This allows for a more precise rounding of glyph positions.
This commit is contained in:
Jelle Raaijmakers 2022-04-01 12:46:36 +02:00 committed by Andreas Kling
parent ee9a2e0715
commit 7334636933
5 changed files with 12 additions and 12 deletions

View file

@ -59,7 +59,7 @@ public:
return m_glyph_width; return m_glyph_width;
return glyph_or_emoji_width_for_variable_width_font(code_point); 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; } u8 glyph_height() const override { return m_glyph_height; }
int x_height() const override { return m_x_height; } int x_height() const override { return m_x_height; }
int preferred_line_height() const override { return glyph_height() + m_line_gap; } int preferred_line_height() const override { return glyph_height() + m_line_gap; }

View file

@ -127,7 +127,7 @@ public:
virtual u8 glyph_width(u32 code_point) const = 0; virtual u8 glyph_width(u32 code_point) const = 0;
virtual int glyph_or_emoji_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 u8 glyph_height() const = 0;
virtual int x_height() const = 0; virtual int x_height() const = 0;
virtual int preferred_line_height() const = 0; virtual int preferred_line_height() const = 0;

View file

@ -1387,8 +1387,8 @@ void draw_text_line(IntRect const& a_rect, Utf8View const& text, Font const& fon
continue; continue;
} }
int kerning = font.glyphs_horizontal_kerning(last_code_point, code_point); int kerning = static_cast<int>(lroundf(font.glyphs_horizontal_kerning(last_code_point, code_point)));
if (kerning != 0) if (kerning != 0.f)
point.translate_by(direction == TextDirection::LTR ? kerning : -kerning, 0); 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()); IntSize glyph_size(font.glyph_or_emoji_width(code_point) + font.glyph_spacing(), font.pixel_size());

View file

@ -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()) if (!m_kern.has_value())
return 0; return 0.f;
return m_kern->get_glyph_kerning(left_glyph_id, right_glyph_id) * x_scale; 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; 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) 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 left_glyph_id = glyph_id_for_code_point(left_code_point);
auto right_glyph_id = glyph_id_for_code_point(right_code_point); auto right_glyph_id = glyph_id_for_code_point(right_code_point);
if (left_glyph_id == 0 || right_glyph_id == 0) 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); return m_font->glyphs_horizontal_kerning(left_glyph_id, right_glyph_id, m_x_scale);
} }

View file

@ -49,7 +49,7 @@ public:
ScaledFontMetrics metrics(float x_scale, float y_scale) const; ScaledFontMetrics metrics(float x_scale, float y_scale) const;
ScaledGlyphMetrics glyph_metrics(u32 glyph_id, 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<Gfx::Bitmap> rasterize_glyph(u32 glyph_id, float x_scale, float y_scale) const; RefPtr<Gfx::Bitmap> rasterize_glyph(u32 glyph_id, float x_scale, float y_scale) const;
u32 glyph_count() const; u32 glyph_count() const;
u16 units_per_em() 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); } ScaledGlyphMetrics glyph_metrics(u32 glyph_id) const { return m_font->glyph_metrics(glyph_id, m_x_scale, m_y_scale); }
RefPtr<Gfx::Bitmap> rasterize_glyph(u32 glyph_id) const; RefPtr<Gfx::Bitmap> rasterize_glyph(u32 glyph_id) const;
// Gfx::Font implementation // ^Gfx::Font
virtual NonnullRefPtr<Font> clone() const override { return *this; } // FIXME: clone() should not need to be implemented virtual NonnullRefPtr<Font> clone() const override { return *this; } // FIXME: clone() should not need to be implemented
virtual u8 presentation_size() const override { return m_point_height; } virtual u8 presentation_size() const override { return m_point_height; }
virtual int pixel_size() const override { return m_point_height * 1.33333333f; } 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 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 u8 glyph_width(u32 code_point) const override;
virtual int glyph_or_emoji_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 int preferred_line_height() const override { return metrics().height() + metrics().line_gap; }
virtual u8 glyph_height() const override { return m_point_height; } virtual u8 glyph_height() const override { return m_point_height; }
virtual int x_height() const override { return m_point_height; } // FIXME: Read from font virtual int x_height() const override { return m_point_height; } // FIXME: Read from font