diff options
author | Julian Offenhäuser <metalvoidzz@gmail.com> | 2022-08-19 09:02:46 +0200 |
---|---|---|
committer | Sam Atkins <atkinssj@gmail.com> | 2022-09-17 10:07:14 +0100 |
commit | 97ed4106e5203ffd6b5806ba58a94c9b6ca69504 (patch) | |
tree | 3b128c6d0cd427432e5f5ee8f5c6c35385886e42 | |
parent | 563d91b6c4c9b9b3ca165f7ad49599e3062cddb5 (diff) | |
download | serenity-97ed4106e5203ffd6b5806ba58a94c9b6ca69504.zip |
LibPDF: Fix text positioning with operator TJ
As per spec, the positioning (or kerning) parameter of this operator
should translate the text matrix before the next showing of text.
Previously, this calculation was slightly wrong and also only applied
after the text was already shown.
-rw-r--r-- | Userland/Libraries/LibPDF/Renderer.cpp | 8 | ||||
-rw-r--r-- | Userland/Libraries/LibPDF/Renderer.h | 3 |
2 files changed, 6 insertions, 5 deletions
diff --git a/Userland/Libraries/LibPDF/Renderer.cpp b/Userland/Libraries/LibPDF/Renderer.cpp index f7766c4912..79b33f7332 100644 --- a/Userland/Libraries/LibPDF/Renderer.cpp +++ b/Userland/Libraries/LibPDF/Renderer.cpp @@ -453,8 +453,10 @@ RENDERER_HANDLER(text_show_string_array) } else if (element.has<float>()) { next_shift = element.get<float>(); } else { + auto shift = next_shift / 1000.0f; + m_text_matrix.translate(-shift * text_state().font_size * text_state().horizontal_scaling, 0.0f); auto str = element.get<NonnullRefPtr<Object>>()->cast<StringObject>()->string(); - show_text(str, next_shift); + show_text(str); } } @@ -637,7 +639,7 @@ PDFErrorOr<void> Renderer::set_graphics_state_from_dict(NonnullRefPtr<DictObject return {}; } -void Renderer::show_text(String const& string, float shift) +void Renderer::show_text(String const& string) { auto& text_rendering_matrix = calculate_text_rendering_matrix(); @@ -660,7 +662,7 @@ void Renderer::show_text(String const& string, float shift) m_painter.draw_glyph(glyph_position.to_type<int>(), code_point, *font, state().paint_color); auto glyph_width = char_width * font_size; - auto tx = (glyph_width - shift / 1000.0f); + auto tx = glyph_width; tx += text_state().character_spacing; if (code_point == ' ') diff --git a/Userland/Libraries/LibPDF/Renderer.h b/Userland/Libraries/LibPDF/Renderer.h index 0be1c342f6..75e57a80c3 100644 --- a/Userland/Libraries/LibPDF/Renderer.h +++ b/Userland/Libraries/LibPDF/Renderer.h @@ -98,8 +98,7 @@ private: PDFErrorOr<void> handle_text_next_line_show_string_set_spacing(Vector<Value> const& args); PDFErrorOr<void> set_graphics_state_from_dict(NonnullRefPtr<DictObject>); - // shift is the manual advance given in the TJ operator array - void show_text(String const&, float shift = 0.0f); + void show_text(String const&); PDFErrorOr<NonnullRefPtr<ColorSpace>> get_color_space(Value const&); ALWAYS_INLINE GraphicsState const& state() const { return m_graphics_state_stack.last(); } |