From 9e502dcfe41bcee2d3e99442657d4a8a2af97b48 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Fri, 1 Mar 2024 11:13:58 -0500 Subject: [PATCH] LibPDF: Honor writing mode in TJ operator as well --- Userland/Libraries/LibPDF/Fonts/PDFFont.h | 7 +++++++ Userland/Libraries/LibPDF/Fonts/Type0Font.h | 6 +----- Userland/Libraries/LibPDF/Renderer.cpp | 5 ++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Userland/Libraries/LibPDF/Fonts/PDFFont.h b/Userland/Libraries/LibPDF/Fonts/PDFFont.h index f1b2f84c1a..07c29b75cc 100644 --- a/Userland/Libraries/LibPDF/Fonts/PDFFont.h +++ b/Userland/Libraries/LibPDF/Fonts/PDFFont.h @@ -20,6 +20,11 @@ class Renderer; // these tables in some cases. Skip reading these tables. constexpr u32 pdf_skipped_opentype_tables = OpenType::FontOptions::SkipTables::Name | OpenType::FontOptions::SkipTables::Hmtx | OpenType::FontOptions::SkipTables::OS2; +enum class WritingMode { + Horizontal, + Vertical, +}; + class PDFFont : public RefCounted { public: static PDFErrorOr> create(Document*, NonnullRefPtr const&, float font_size); @@ -29,6 +34,8 @@ public: virtual void set_font_size(float font_size) = 0; virtual PDFErrorOr draw_string(Gfx::Painter&, Gfx::FloatPoint, ByteString const&, Renderer const&) = 0; + virtual WritingMode writing_mode() const { return WritingMode::Horizontal; } + // 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)); } diff --git a/Userland/Libraries/LibPDF/Fonts/Type0Font.h b/Userland/Libraries/LibPDF/Fonts/Type0Font.h index ebdca2c341..59a19732ec 100644 --- a/Userland/Libraries/LibPDF/Fonts/Type0Font.h +++ b/Userland/Libraries/LibPDF/Fonts/Type0Font.h @@ -27,11 +27,6 @@ public: virtual u32 next() = 0; }; -enum class WritingMode { - Horizontal, - Vertical, -}; - class Type0CMap { public: virtual ~Type0CMap() = default; @@ -58,6 +53,7 @@ public: void set_font_size(float font_size) override; PDFErrorOr draw_string(Gfx::Painter&, Gfx::FloatPoint, ByteString const&, Renderer const&) override; + WritingMode writing_mode() const override { return m_cmap->writing_mode(); } DeprecatedFlyString base_font_name() const { return m_base_font_name; } diff --git a/Userland/Libraries/LibPDF/Renderer.cpp b/Userland/Libraries/LibPDF/Renderer.cpp index 6c69bb10e1..4502b725e6 100644 --- a/Userland/Libraries/LibPDF/Renderer.cpp +++ b/Userland/Libraries/LibPDF/Renderer.cpp @@ -598,7 +598,10 @@ RENDERER_HANDLER(text_show_string_array) for (auto& element : elements) { if (element.has_number()) { float shift = element.to_float() / 1000.0f; - m_text_matrix.translate(-shift * text_state().font_size * text_state().horizontal_scaling, 0.0f); + if (text_state().font->writing_mode() == WritingMode::Horizontal) + m_text_matrix.translate(-shift * text_state().font_size * text_state().horizontal_scaling, 0.0f); + else + m_text_matrix.translate(0.0f, -shift * text_state().font_size); m_text_rendering_matrix_is_dirty = true; } else { auto str = element.get>()->cast()->string();