diff --git a/Userland/Libraries/LibPDF/CommonNames.h b/Userland/Libraries/LibPDF/CommonNames.h index 50799ef878..f4cb9dd196 100644 --- a/Userland/Libraries/LibPDF/CommonNames.h +++ b/Userland/Libraries/LibPDF/CommonNames.h @@ -86,6 +86,7 @@ X(FitH) \ X(FitR) \ X(FitV) \ + X(Flags) \ X(FlateDecode) \ X(Font) \ X(FontDescriptor) \ diff --git a/Userland/Libraries/LibPDF/Fonts/PDFFont.cpp b/Userland/Libraries/LibPDF/Fonts/PDFFont.cpp index c863d83176..649ec89847 100644 --- a/Userland/Libraries/LibPDF/Fonts/PDFFont.cpp +++ b/Userland/Libraries/LibPDF/Fonts/PDFFont.cpp @@ -55,8 +55,14 @@ PDFErrorOr> PDFFont::create(Document* document, NonnullRe return font.release_nonnull(); } -PDFErrorOr PDFFont::initialize(Document*, NonnullRefPtr const&, float) +PDFErrorOr PDFFont::initialize(Document* document, NonnullRefPtr const& dict, float) { + if (dict->contains(CommonNames::FontDescriptor)) { + auto descriptor = TRY(dict->get_dict(document, CommonNames::FontDescriptor)); + if (descriptor->contains(CommonNames::Flags)) + m_flags = descriptor->get_value(CommonNames::Flags).to_int(); + } + return {}; } diff --git a/Userland/Libraries/LibPDF/Fonts/PDFFont.h b/Userland/Libraries/LibPDF/Fonts/PDFFont.h index 727c0c2778..57d1110021 100644 --- a/Userland/Libraries/LibPDF/Fonts/PDFFont.h +++ b/Userland/Libraries/LibPDF/Fonts/PDFFont.h @@ -30,9 +30,24 @@ public: virtual void set_font_size(float font_size) = 0; virtual PDFErrorOr draw_string(Gfx::Painter&, Gfx::FloatPoint, ByteString const&, Renderer const&) = 0; + // TABLE 5.20 Font flags + bool is_fixed_pitch() const { return m_flags & (1 << (1 - 1)); } + bool is_serif() const { return m_flags & (1 << (2 - 1)); } + bool is_symbolic() const { return m_flags & (1 << (3 - 1)); } + bool is_script() const { return m_flags & (1 << (4 - 1)); } + // Note: No bit position 5. + bool is_nonsymbolic() const { return m_flags & (1 << (6 - 1)); } + bool is_italic() const { return m_flags & (1 << (7 - 1)); } + // Note: Big jump in bit positions. + bool is_all_cap() const { return m_flags & (1 << (17 - 1)); } + bool is_small_cap() const { return m_flags & (1 << (18 - 1)); } + bool is_force_bold() const { return m_flags & (1 << (19 - 1)); } + protected: virtual PDFErrorOr initialize(Document* document, NonnullRefPtr const& dict, float font_size); static PDFErrorOr> replacement_for(StringView name, float font_size); + + unsigned m_flags { 0 }; }; }