summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Offenhäuser <metalvoidzz@gmail.com>2022-08-19 09:02:46 +0200
committerSam Atkins <atkinssj@gmail.com>2022-09-17 10:07:14 +0100
commit97ed4106e5203ffd6b5806ba58a94c9b6ca69504 (patch)
tree3b128c6d0cd427432e5f5ee8f5c6c35385886e42
parent563d91b6c4c9b9b3ca165f7ad49599e3062cddb5 (diff)
downloadserenity-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.cpp8
-rw-r--r--Userland/Libraries/LibPDF/Renderer.h3
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(); }