summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibGfx
diff options
context:
space:
mode:
authorthankyouverycool <66646555+thankyouverycool@users.noreply.github.com>2022-01-31 20:18:15 -0500
committerAndreas Kling <kling@serenityos.org>2022-02-01 10:06:26 +0100
commit96895cd22c06cfa82c5cc2c03b091bd855e16e3b (patch)
treee299a45c1c0b188e794c1af24c6947c96f552c1e /Userland/Libraries/LibGfx
parent87a149c9a42696c9df1bcbaf9fd4477db5df17d5 (diff)
downloadserenity-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.cpp4
-rw-r--r--Userland/Libraries/LibGfx/FontDatabase.cpp9
-rw-r--r--Userland/Libraries/LibGfx/FontDatabase.h2
-rw-r--r--Userland/Libraries/LibGfx/TrueTypeFont/Font.h2
-rw-r--r--Userland/Libraries/LibGfx/Typeface.cpp10
-rw-r--r--Userland/Libraries/LibGfx/Typeface.h1
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(); }