diff options
author | thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> | 2022-01-31 20:18:15 -0500 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-02-01 10:06:26 +0100 |
commit | 96895cd22c06cfa82c5cc2c03b091bd855e16e3b (patch) | |
tree | e299a45c1c0b188e794c1af24c6947c96f552c1e /Userland/Libraries/LibGfx | |
parent | 87a149c9a42696c9df1bcbaf9fd4477db5df17d5 (diff) | |
download | serenity-96895cd22c06cfa82c5cc2c03b091bd855e16e3b.zip |
Everywhere: Fully qualify font names by including their slope
Fixes typefaces of the same weight but different slopes being
incorrectly returned for each other by FontDatabase.
Diffstat (limited to 'Userland/Libraries/LibGfx')
-rw-r--r-- | Userland/Libraries/LibGfx/BitmapFont.cpp | 4 | ||||
-rw-r--r-- | Userland/Libraries/LibGfx/FontDatabase.cpp | 9 | ||||
-rw-r--r-- | Userland/Libraries/LibGfx/FontDatabase.h | 2 | ||||
-rw-r--r-- | Userland/Libraries/LibGfx/TrueTypeFont/Font.h | 2 | ||||
-rw-r--r-- | Userland/Libraries/LibGfx/Typeface.cpp | 10 | ||||
-rw-r--r-- | Userland/Libraries/LibGfx/Typeface.h | 1 |
6 files changed, 20 insertions, 8 deletions
diff --git a/Userland/Libraries/LibGfx/BitmapFont.cpp b/Userland/Libraries/LibGfx/BitmapFont.cpp index d29fc644f6..6907bb661a 100644 --- a/Userland/Libraries/LibGfx/BitmapFont.cpp +++ b/Userland/Libraries/LibGfx/BitmapFont.cpp @@ -345,7 +345,7 @@ ALWAYS_INLINE int BitmapFont::unicode_view_width(T const& view) const String BitmapFont::qualified_name() const { - return String::formatted("{} {} {}", family(), presentation_size(), weight()); + return String::formatted("{} {} {} {}", family(), presentation_size(), weight(), slope()); } String BitmapFont::variant() const @@ -366,7 +366,7 @@ Font const& Font::bold_variant() const { if (m_bold_variant) return *m_bold_variant; - m_bold_variant = Gfx::FontDatabase::the().get(family(), presentation_size(), 700); + m_bold_variant = Gfx::FontDatabase::the().get(family(), presentation_size(), 700, 0); if (!m_bold_variant) m_bold_variant = this; return *m_bold_variant; diff --git a/Userland/Libraries/LibGfx/FontDatabase.cpp b/Userland/Libraries/LibGfx/FontDatabase.cpp index fee528d24e..454ba0cb36 100644 --- a/Userland/Libraries/LibGfx/FontDatabase.cpp +++ b/Userland/Libraries/LibGfx/FontDatabase.cpp @@ -138,11 +138,12 @@ RefPtr<Gfx::Font> FontDatabase::get_by_name(StringView name) auto it = m_private->full_name_to_font_map.find(name); if (it == m_private->full_name_to_font_map.end()) { auto parts = name.split_view(" "sv); - if (parts.size() >= 3) { + if (parts.size() >= 4) { + auto slope = parts.take_last().to_int().value_or(0); auto weight = parts.take_last().to_int().value_or(0); auto size = parts.take_last().to_int().value_or(0); auto family = String::join(' ', parts); - return get(family, size, weight); + return get(family, size, weight, slope); } dbgln("Font lookup failed: '{}'", name); return nullptr; @@ -150,10 +151,10 @@ RefPtr<Gfx::Font> FontDatabase::get_by_name(StringView name) return it->value; } -RefPtr<Gfx::Font> FontDatabase::get(const String& family, unsigned size, unsigned weight) +RefPtr<Gfx::Font> FontDatabase::get(const String& family, unsigned size, unsigned weight, unsigned slope) { for (auto typeface : m_private->typefaces) { - if (typeface->family() == family && typeface->weight() == weight) + if (typeface->family() == family && typeface->weight() == weight && typeface->slope() == slope) return typeface->get_font(size); } return nullptr; diff --git a/Userland/Libraries/LibGfx/FontDatabase.h b/Userland/Libraries/LibGfx/FontDatabase.h index 35c98bfb08..9965b6f72e 100644 --- a/Userland/Libraries/LibGfx/FontDatabase.h +++ b/Userland/Libraries/LibGfx/FontDatabase.h @@ -42,7 +42,7 @@ public: static void set_default_font_query(String); static void set_fixed_width_font_query(String); - RefPtr<Gfx::Font> get(const String& family, unsigned size, unsigned weight); + RefPtr<Gfx::Font> get(const String& family, unsigned size, unsigned weight, unsigned slope); RefPtr<Gfx::Font> get(const String& family, const String& variant, unsigned size); RefPtr<Gfx::Font> get_by_name(StringView); void for_each_font(Function<void(const Gfx::Font&)>); diff --git a/Userland/Libraries/LibGfx/TrueTypeFont/Font.h b/Userland/Libraries/LibGfx/TrueTypeFont/Font.h index 7bba4765ad..dacb159786 100644 --- a/Userland/Libraries/LibGfx/TrueTypeFont/Font.h +++ b/Userland/Libraries/LibGfx/TrueTypeFont/Font.h @@ -145,7 +145,7 @@ public: virtual size_t glyph_count() const override { return m_font->glyph_count(); } virtual String family() const override { return m_font->family(); } virtual String variant() const override { return m_font->variant(); } - virtual String qualified_name() const override { return String::formatted("{} {} {}", family(), presentation_size(), weight()); } + virtual String qualified_name() const override { return String::formatted("{} {} {} {}", family(), presentation_size(), weight(), slope()); } private: NonnullRefPtr<TTF::Font> m_font; diff --git a/Userland/Libraries/LibGfx/Typeface.cpp b/Userland/Libraries/LibGfx/Typeface.cpp index 074745bdc3..f69225ec02 100644 --- a/Userland/Libraries/LibGfx/Typeface.cpp +++ b/Userland/Libraries/LibGfx/Typeface.cpp @@ -18,6 +18,16 @@ unsigned Typeface::weight() const return m_ttf_font->weight(); } +u8 Typeface::slope() const +{ + VERIFY(m_ttf_font || m_bitmap_fonts.size() > 0); + + if (is_fixed_size()) + return m_bitmap_fonts[0]->slope(); + + return m_ttf_font->slope(); +} + bool Typeface::is_fixed_width() const { VERIFY(m_ttf_font || m_bitmap_fonts.size() > 0); diff --git a/Userland/Libraries/LibGfx/Typeface.h b/Userland/Libraries/LibGfx/Typeface.h index 818cb5a760..631c306580 100644 --- a/Userland/Libraries/LibGfx/Typeface.h +++ b/Userland/Libraries/LibGfx/Typeface.h @@ -27,6 +27,7 @@ public: String family() const { return m_family; } String variant() const { return m_variant; } unsigned weight() const; + u8 slope() const; bool is_fixed_width() const; bool is_fixed_size() const { return !m_bitmap_fonts.is_empty(); } |