From e92ec26771f1372a85e28f70519587487f5751e5 Mon Sep 17 00:00:00 2001 From: Rodrigo Tobar Date: Wed, 23 Nov 2022 21:11:29 +0800 Subject: [PATCH] LibPDF: Introduce rendering preferences and show clipping paths A new struct allows users to specify specific rendering preferences that the Renderer class might use to paint some Document elements onto the target bitmap. The first toggle allows rendering (or not) the clipping paths on a page, which is useful for debugging. --- Userland/Libraries/LibPDF/Renderer.cpp | 10 +++++++--- Userland/Libraries/LibPDF/Renderer.h | 9 +++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibPDF/Renderer.cpp b/Userland/Libraries/LibPDF/Renderer.cpp index 41dee7fcd0..85bf2c59db 100644 --- a/Userland/Libraries/LibPDF/Renderer.cpp +++ b/Userland/Libraries/LibPDF/Renderer.cpp @@ -21,9 +21,9 @@ namespace PDF { -PDFErrorOr Renderer::render(Document& document, Page const& page, RefPtr bitmap) +PDFErrorOr Renderer::render(Document& document, Page const& page, RefPtr bitmap, RenderingPreferences rendering_preferences) { - return Renderer(document, page, bitmap).render(); + return Renderer(document, page, bitmap, rendering_preferences).render(); } static void rect_path(Gfx::Path& path, float x, float y, float width, float height) @@ -48,12 +48,13 @@ static Gfx::Path rect_path(Gfx::Rect rect) return rect_path(rect.x(), rect.y(), rect.width(), rect.height()); } -Renderer::Renderer(RefPtr document, Page const& page, RefPtr bitmap) +Renderer::Renderer(RefPtr document, Page const& page, RefPtr bitmap, RenderingPreferences rendering_preferences) : m_document(document) , m_bitmap(bitmap) , m_page(page) , m_painter(*bitmap) , m_anti_aliasing_painter(m_painter) + , m_rendering_preferences(rendering_preferences) { auto media_box = m_page.media_box; @@ -247,6 +248,9 @@ void Renderer::begin_path_paint() { auto bounding_box = map(state().clipping_paths.current.bounding_box()); m_painter.clear_clip_rect(); + if (m_rendering_preferences.show_clipping_paths) { + m_painter.stroke_path(rect_path(bounding_box), Color::Black, 1); + } m_painter.add_clip_rect(bounding_box.to_type()); } diff --git a/Userland/Libraries/LibPDF/Renderer.h b/Userland/Libraries/LibPDF/Renderer.h index 0c0de5e155..4f0e1b0f62 100644 --- a/Userland/Libraries/LibPDF/Renderer.h +++ b/Userland/Libraries/LibPDF/Renderer.h @@ -84,12 +84,16 @@ struct GraphicsState { TextState text_state {}; }; +struct RenderingPreferences { + bool show_clipping_paths { false }; +}; + class Renderer { public: - static PDFErrorOr render(Document&, Page const&, RefPtr); + static PDFErrorOr render(Document&, Page const&, RefPtr, RenderingPreferences preferences); private: - Renderer(RefPtr, Page const&, RefPtr); + Renderer(RefPtr, Page const&, RefPtr, RenderingPreferences); PDFErrorOr render(); @@ -128,6 +132,7 @@ private: Page const& m_page; Gfx::Painter m_painter; Gfx::AntiAliasingPainter m_anti_aliasing_painter; + RenderingPreferences m_rendering_preferences; Gfx::Path m_current_path; Vector m_graphics_state_stack;