diff options
author | Andreas Kling <kling@serenityos.org> | 2020-09-19 18:01:32 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-09-19 19:16:22 +0200 |
commit | 95eeb321f90d326f93fe7ce2ceb0f71c03ab9ab6 (patch) | |
tree | b1556e0bd2f161affdec686ca5a1d8baea42b950 /Libraries | |
parent | d9863e0b6cf4c47dd7ad24f494a13ec510269567 (diff) | |
download | serenity-95eeb321f90d326f93fe7ce2ceb0f71c03ab9ab6.zip |
LibGfx+FontEditor+Base: Add "baseline" value to all fonts
This does nothing at the moment but will soon allow us to improve the
vertical positioning of text.
Diffstat (limited to 'Libraries')
-rw-r--r-- | Libraries/LibGfx/Font.cpp | 13 | ||||
-rw-r--r-- | Libraries/LibGfx/Font.h | 6 |
2 files changed, 13 insertions, 6 deletions
diff --git a/Libraries/LibGfx/Font.cpp b/Libraries/LibGfx/Font.cpp index 3b05960405..7837c01cdf 100644 --- a/Libraries/LibGfx/Font.cpp +++ b/Libraries/LibGfx/Font.cpp @@ -53,7 +53,8 @@ struct [[gnu::packed]] FontFileHeader u8 type; u8 is_variable_width; u8 glyph_spacing; - u8 unused[5]; + u8 baseline; + u8 unused[4]; char name[64]; }; @@ -112,7 +113,7 @@ NonnullRefPtr<Font> Font::clone() const memcpy(new_widths, m_glyph_widths, m_glyph_count); else memset(new_widths, m_glyph_width, m_glyph_count); - return adopt(*new Font(m_name, new_rows, new_widths, m_fixed_width, m_glyph_width, m_glyph_height, m_glyph_spacing, m_type)); + return adopt(*new Font(m_name, new_rows, new_widths, m_fixed_width, m_glyph_width, m_glyph_height, m_glyph_spacing, m_type, m_baseline)); } NonnullRefPtr<Font> Font::create(u8 glyph_height, u8 glyph_width, bool fixed, FontTypes type) @@ -124,10 +125,10 @@ NonnullRefPtr<Font> Font::create(u8 glyph_height, u8 glyph_width, bool fixed, Fo memset(new_rows, 0, bytes_per_glyph * count); auto* new_widths = static_cast<u8*>(malloc(count)); memset(new_widths, glyph_width, count); - return adopt(*new Font("Untitled", new_rows, new_widths, fixed, glyph_width, glyph_height, 1, type)); + return adopt(*new Font("Untitled", new_rows, new_widths, fixed, glyph_width, glyph_height, 1, type, 0)); } -Font::Font(const StringView& name, unsigned* rows, u8* widths, bool is_fixed_width, u8 glyph_width, u8 glyph_height, u8 glyph_spacing, FontTypes type) +Font::Font(const StringView& name, unsigned* rows, u8* widths, bool is_fixed_width, u8 glyph_width, u8 glyph_height, u8 glyph_spacing, FontTypes type, u8 baseline) : m_name(name) , m_type(type) , m_rows(rows) @@ -137,6 +138,7 @@ Font::Font(const StringView& name, unsigned* rows, u8* widths, bool is_fixed_wid , m_min_glyph_width(glyph_width) , m_max_glyph_width(glyph_width) , m_glyph_spacing(glyph_spacing) + , m_baseline(baseline) , m_fixed_width(is_fixed_width) { // FIXME: This is just a dumb guess. It would be cool to know the actual x-height of the font! @@ -189,7 +191,7 @@ RefPtr<Font> Font::load_from_memory(const u8* data) u8* widths = nullptr; if (header.is_variable_width) widths = (u8*)(rows) + count * bytes_per_glyph; - return adopt(*new Font(String(header.name), rows, widths, !header.is_variable_width, header.glyph_width, header.glyph_height, header.glyph_spacing, type)); + return adopt(*new Font(String(header.name), rows, widths, !header.is_variable_width, header.glyph_width, header.glyph_height, header.glyph_spacing, type, header.baseline)); } size_t Font::glyph_count_by_type(FontTypes type) @@ -240,6 +242,7 @@ bool Font::write_to_file(const StringView& path) header.glyph_width = m_glyph_width; header.glyph_height = m_glyph_height; header.type = m_type; + header.baseline = m_baseline; header.is_variable_width = !m_fixed_width; header.glyph_spacing = m_glyph_spacing; memcpy(header.name, m_name.characters(), min(m_name.length(), (size_t)63)); diff --git a/Libraries/LibGfx/Font.h b/Libraries/LibGfx/Font.h index 830e038397..1d465668b2 100644 --- a/Libraries/LibGfx/Font.h +++ b/Libraries/LibGfx/Font.h @@ -100,6 +100,9 @@ public: u8 max_glyph_width() const { return m_max_glyph_width; } u8 glyph_fixed_width() const { return m_glyph_width; } + u8 baseline() const { return m_baseline; } + void set_baseline(u8 baseline) { m_baseline = baseline; } + int width(const StringView&) const; int width(const Utf8View&) const; int width(const Utf32View&) const; @@ -129,7 +132,7 @@ public: void set_type(FontTypes type); private: - Font(const StringView& name, unsigned* rows, u8* widths, bool is_fixed_width, u8 glyph_width, u8 glyph_height, u8 glyph_spacing, FontTypes type); + Font(const StringView& name, unsigned* rows, u8* widths, bool is_fixed_width, u8 glyph_width, u8 glyph_height, u8 glyph_spacing, FontTypes type, u8 baseline); static RefPtr<Font> load_from_memory(const u8*); static size_t glyph_count_by_type(FontTypes type); @@ -151,6 +154,7 @@ private: u8 m_min_glyph_width { 0 }; u8 m_max_glyph_width { 0 }; u8 m_glyph_spacing { 0 }; + u8 m_baseline { 0 }; bool m_fixed_width { false }; bool m_boldface { false }; |