From 9b022239c3bd233f9b35475591b30f61232ce937 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Mon, 13 Nov 2023 18:39:10 -0500 Subject: [PATCH] LibPDF: Apply all offsets of TJ operator TJ acts on a list of either strings or numbers. The strings are drawn, and the numbers are treated as offsets. Previously, we'd only apply the last-seen number as offset when we saw a string. That had the effect of us ignoring all but the last number in front of a string, and ignoring numbers at the end of the list. Now, we apply all numbers as offsets. Our rendering of Tests/LibPDF/text.pdf now matches other PDF viewers. --- Userland/Libraries/LibPDF/Renderer.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Userland/Libraries/LibPDF/Renderer.cpp b/Userland/Libraries/LibPDF/Renderer.cpp index 09f7965083..3a309f4f00 100644 --- a/Userland/Libraries/LibPDF/Renderer.cpp +++ b/Userland/Libraries/LibPDF/Renderer.cpp @@ -518,16 +518,15 @@ RENDERER_HANDLER(text_next_line_show_string_set_spacing) RENDERER_HANDLER(text_show_string_array) { auto elements = MUST(m_document->resolve_to(args[0]))->elements(); - float next_shift = 0.0f; for (auto& element : elements) { if (element.has()) { - next_shift = element.get(); - } else if (element.has()) { - next_shift = element.get(); - } else { - auto shift = next_shift / 1000.0f; + float shift = (float)element.get() / 1000.0f; m_text_matrix.translate(-shift * text_state().font_size * text_state().horizontal_scaling, 0.0f); + } else if (element.has()) { + float shift = element.get() / 1000.0f; + m_text_matrix.translate(-shift * text_state().font_size * text_state().horizontal_scaling, 0.0f); + } else { auto str = element.get>()->cast()->string(); TRY(show_text(str)); }