LibPDF: Bake the flipped y-axis directly into the CTM matrix

This commit is contained in:
Matthew Olsson 2021-05-28 12:18:11 -07:00 committed by Ali Mohammad Pur
parent 449ef14895
commit 0a4d8ef98d
Notes: sideshowbarker 2024-07-18 12:20:49 +09:00

View File

@ -42,6 +42,15 @@ Renderer::Renderer(RefPtr<Document> document, const Page& page, RefPtr<Gfx::Bitm
float scale_y = static_cast<float>(bitmap->height()) / height;
userspace_matrix.scale(scale_x, scale_y);
// PDF user-space coordinate y axis increases from bottom to top, so we have to
// insert a horizontal reflection about the vertical midpoint into our transformation
// matrix
static Gfx::AffineTransform horizontal_reflection_matrix = { 1, 0, 0, -1, 0, 0 };
userspace_matrix.multiply(horizontal_reflection_matrix);
userspace_matrix.translate(0.0f, -height);
m_graphics_state_stack.append(GraphicsState { userspace_matrix });
m_bitmap->fill(Gfx::Color::NamedColor::White);
@ -530,8 +539,6 @@ void Renderer::show_text(const String& string, float shift)
VERIFY(font);
auto glyph_position = text_rendering_matrix.map(Gfx::FloatPoint { 0.0f, 0.0f });
// Reverse the Y axis
glyph_position.set_y(static_cast<float>(m_bitmap->height()) - glyph_position.y());
// Account for the reversed font baseline
glyph_position.set_y(glyph_position.y() - static_cast<float>(font->baseline()));