summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthankyouverycool <66646555+thankyouverycool@users.noreply.github.com>2022-01-31 20:10:30 -0500
committerAndreas Kling <kling@serenityos.org>2022-02-01 10:06:26 +0100
commit87a149c9a42696c9df1bcbaf9fd4477db5df17d5 (patch)
treeccd7b7f4d69009febdeb60c9b76ce00f5a3ebf57
parenta79e730839cf5ea0c4790d5ed613775bb448129e (diff)
downloadserenity-87a149c9a42696c9df1bcbaf9fd4477db5df17d5.zip
LibGfx: Determine slope attributes for TrueTypeFonts from tables
First checks the OS/2 table for an oblique selection flag before falling back on italic flags.
-rw-r--r--Userland/Libraries/LibGfx/BitmapFont.h2
-rw-r--r--Userland/Libraries/LibGfx/Font.h1
-rw-r--r--Userland/Libraries/LibGfx/TrueTypeFont/Font.cpp23
-rw-r--r--Userland/Libraries/LibGfx/TrueTypeFont/Font.h2
-rw-r--r--Userland/Libraries/LibGfx/TrueTypeFont/Tables.h2
5 files changed, 29 insertions, 1 deletions
diff --git a/Userland/Libraries/LibGfx/BitmapFont.h b/Userland/Libraries/LibGfx/BitmapFont.h
index 632ddd2f32..b41c7def6e 100644
--- a/Userland/Libraries/LibGfx/BitmapFont.h
+++ b/Userland/Libraries/LibGfx/BitmapFont.h
@@ -37,7 +37,7 @@ public:
u16 weight() const override { return m_weight; }
void set_weight(u16 weight) { m_weight = weight; }
- u8 slope() const { return m_slope; }
+ virtual u8 slope() const override { return m_slope; }
void set_slope(u8 slope) { m_slope = slope; }
Glyph glyph(u32 code_point) const override;
diff --git a/Userland/Libraries/LibGfx/Font.h b/Userland/Libraries/LibGfx/Font.h
index ab2974de52..da9fec975b 100644
--- a/Userland/Libraries/LibGfx/Font.h
+++ b/Userland/Libraries/LibGfx/Font.h
@@ -101,6 +101,7 @@ public:
FontMetrics metrics(u32 code_point) const;
virtual u8 presentation_size() const = 0;
+ virtual u8 slope() const = 0;
virtual u16 weight() const = 0;
virtual Glyph glyph(u32 code_point) const = 0;
diff --git a/Userland/Libraries/LibGfx/TrueTypeFont/Font.cpp b/Userland/Libraries/LibGfx/TrueTypeFont/Font.cpp
index dc5949da58..8cdb37d0dd 100644
--- a/Userland/Libraries/LibGfx/TrueTypeFont/Font.cpp
+++ b/Userland/Libraries/LibGfx/TrueTypeFont/Font.cpp
@@ -474,6 +474,24 @@ u16 Font::weight() const
return 400;
}
+u8 Font::slope() const
+{
+ // https://docs.microsoft.com/en-us/typography/opentype/spec/os2
+ constexpr u16 italic_selection_bit { 1 };
+ constexpr u16 oblique_selection_bit { 512 };
+ // https://docs.microsoft.com/en-us/typography/opentype/spec/head
+ constexpr u16 italic_style_bit { 2 };
+
+ if (m_os2.selection() & oblique_selection_bit)
+ return 2;
+ if (m_os2.selection() & italic_selection_bit)
+ return 1;
+ if (m_head.style() & italic_style_bit)
+ return 1;
+
+ return 0;
+}
+
bool Font::is_fixed_width() const
{
// FIXME: Read this information from the font file itself.
@@ -549,6 +567,11 @@ u16 OS2::weight_class() const
return be_u16(m_slice.offset_pointer((u32)Offsets::WeightClass));
}
+u16 OS2::selection() const
+{
+ return be_u16(m_slice.offset_pointer((u32)Offsets::Selection));
+}
+
i16 OS2::typographic_ascender() const
{
return be_i16(m_slice.offset_pointer((u32)Offsets::TypographicAscender));
diff --git a/Userland/Libraries/LibGfx/TrueTypeFont/Font.h b/Userland/Libraries/LibGfx/TrueTypeFont/Font.h
index 3f4341d850..7bba4765ad 100644
--- a/Userland/Libraries/LibGfx/TrueTypeFont/Font.h
+++ b/Userland/Libraries/LibGfx/TrueTypeFont/Font.h
@@ -57,6 +57,7 @@ public:
String family() const;
String variant() const;
u16 weight() const;
+ u8 slope() const;
bool is_fixed_width() const;
private:
@@ -122,6 +123,7 @@ public:
// Gfx::Font implementation
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 slope() const override { return m_font->slope(); }
virtual u16 weight() const override { return m_font->weight(); }
virtual Gfx::Glyph glyph(u32 code_point) const override;
virtual bool contains_glyph(u32 code_point) const override { return m_font->glyph_id_for_code_point(code_point) > 0; }
diff --git a/Userland/Libraries/LibGfx/TrueTypeFont/Tables.h b/Userland/Libraries/LibGfx/TrueTypeFont/Tables.h
index 7165743f64..182e2493ca 100644
--- a/Userland/Libraries/LibGfx/TrueTypeFont/Tables.h
+++ b/Userland/Libraries/LibGfx/TrueTypeFont/Tables.h
@@ -133,12 +133,14 @@ class OS2 {
public:
enum class Offsets {
WeightClass = 4,
+ Selection = 62,
TypographicAscender = 68,
TypographicDescender = 70,
TypographicLineGap = 72,
};
u16 weight_class() const;
+ u16 selection() const;
i16 typographic_ascender() const;
i16 typographic_descender() const;
i16 typographic_line_gap() const;