From 207717982cc594a24b27ad1199250d971e1e2e2a Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Wed, 21 Feb 2024 14:21:59 -0500 Subject: [PATCH] LibPDF: Read /Flags off font descriptors --- Userland/Libraries/LibPDF/CommonNames.h | 1 + Userland/Libraries/LibPDF/Fonts/PDFFont.cpp | 8 +++++++- Userland/Libraries/LibPDF/Fonts/PDFFont.h | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) 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 }; }; }