From fe5c82398947b7d7c45eb88af0169d2305ed94ac Mon Sep 17 00:00:00 2001 From: Rodrigo Tobar Date: Mon, 21 Nov 2022 13:13:58 +0800 Subject: [PATCH] LibPDF: Communicate resources to ColorSpace, not Page Resources can come from other sources (e.g., XObjects), and since the only attribute we are reading from Page are its resources it makes sense to receive resources instead. That way we'll be able to pass down arbitrary resources that are not necessarily declared at the page level. --- Userland/Libraries/LibPDF/ColorSpace.cpp | 10 +++++----- Userland/Libraries/LibPDF/ColorSpace.h | 4 ++-- Userland/Libraries/LibPDF/Renderer.cpp | 8 ++++---- Userland/Libraries/LibPDF/Renderer.h | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Userland/Libraries/LibPDF/ColorSpace.cpp b/Userland/Libraries/LibPDF/ColorSpace.cpp index f647307350..d9b87a0dc9 100644 --- a/Userland/Libraries/LibPDF/ColorSpace.cpp +++ b/Userland/Libraries/LibPDF/ColorSpace.cpp @@ -11,7 +11,7 @@ namespace PDF { -PDFErrorOr> ColorSpace::create(Document* document, FlyString const& name, Page const& page) +PDFErrorOr> ColorSpace::create(Document* document, FlyString const& name, NonnullRefPtr resources) { // Simple color spaces with no parameters, which can be specified directly if (name == CommonNames::DeviceGray) @@ -25,7 +25,7 @@ PDFErrorOr> ColorSpace::create(Document* document, Fly // The color space is a complex color space with parameters that resides in // the resource dictionary - auto color_space_resource_dict = TRY(page.resources->get_dict(document, CommonNames::ColorSpace)); + auto color_space_resource_dict = TRY(resources->get_dict(document, CommonNames::ColorSpace)); if (!color_space_resource_dict->contains(name)) TODO(); @@ -41,7 +41,7 @@ PDFErrorOr> ColorSpace::create(Document* document, Fly return TRY(CalRGBColorSpace::create(document, move(parameters))); if (color_space_name == CommonNames::ICCBased) - return TRY(ICCBasedColorSpace::create(document, page, move(parameters))); + return TRY(ICCBasedColorSpace::create(document, resources, move(parameters))); dbgln("Unknown color space: {}", color_space_name); TODO(); @@ -261,7 +261,7 @@ Color CalRGBColorSpace::color(Vector const& arguments) const return Color(red, green, blue); } -PDFErrorOr> ICCBasedColorSpace::create(Document* document, Page const& page, Vector&& parameters) +PDFErrorOr> ICCBasedColorSpace::create(Document* document, NonnullRefPtr resources, Vector&& parameters) { if (parameters.is_empty()) return Error { Error::Type::MalformedPDF, "ICCBased color space expected one parameter" }; @@ -287,7 +287,7 @@ PDFErrorOr> ICCBasedColorSpace::create(Document* docum name = TRY(dict->get_name(document, CommonNames::Alternate))->name(); } - return TRY(ColorSpace::create(document, name, page)); + return TRY(ColorSpace::create(document, name, resources)); } Color ICCBasedColorSpace::color(Vector const&) const diff --git a/Userland/Libraries/LibPDF/ColorSpace.h b/Userland/Libraries/LibPDF/ColorSpace.h index 63f3cfd996..60eaf79ff8 100644 --- a/Userland/Libraries/LibPDF/ColorSpace.h +++ b/Userland/Libraries/LibPDF/ColorSpace.h @@ -29,7 +29,7 @@ struct Page; class ColorSpace : public RefCounted { public: - static PDFErrorOr> create(Document*, FlyString const& name, Page const& page); + static PDFErrorOr> create(Document*, FlyString const& name, NonnullRefPtr resources); virtual ~ColorSpace() = default; @@ -91,7 +91,7 @@ private: class ICCBasedColorSpace final : public ColorSpace { public: - static PDFErrorOr> create(Document*, Page const&, Vector&& parameters); + static PDFErrorOr> create(Document*, NonnullRefPtr resources, Vector&& parameters); ~ICCBasedColorSpace() override = default; diff --git a/Userland/Libraries/LibPDF/Renderer.cpp b/Userland/Libraries/LibPDF/Renderer.cpp index 8a97f0fcb3..35db2e697e 100644 --- a/Userland/Libraries/LibPDF/Renderer.cpp +++ b/Userland/Libraries/LibPDF/Renderer.cpp @@ -496,14 +496,14 @@ RENDERER_TODO(type3_font_set_glyph_width_and_bbox) RENDERER_HANDLER(set_stroking_space) { - state().stroke_color_space = TRY(get_color_space(args[0])); + state().stroke_color_space = TRY(get_color_space(args[0], m_page.resources)); VERIFY(state().stroke_color_space); return {}; } RENDERER_HANDLER(set_painting_space) { - state().paint_color_space = TRY(get_color_space(args[0])); + state().paint_color_space = TRY(get_color_space(args[0], m_page.resources)); VERIFY(state().paint_color_space); return {}; } @@ -701,10 +701,10 @@ void Renderer::show_text(String const& string) m_text_matrix.translate(delta_x / text_rendering_matrix.x_scale(), 0.0f); } -PDFErrorOr> Renderer::get_color_space(Value const& value) +PDFErrorOr> Renderer::get_color_space(Value const& value, NonnullRefPtr resources) { auto name = value.get>()->cast()->name(); - return TRY(ColorSpace::create(m_document, name, m_page)); + return TRY(ColorSpace::create(m_document, name, resources)); } Gfx::AffineTransform const& Renderer::calculate_text_rendering_matrix() diff --git a/Userland/Libraries/LibPDF/Renderer.h b/Userland/Libraries/LibPDF/Renderer.h index 4f0e1b0f62..b47af63634 100644 --- a/Userland/Libraries/LibPDF/Renderer.h +++ b/Userland/Libraries/LibPDF/Renderer.h @@ -109,7 +109,7 @@ private: void end_path_paint(); PDFErrorOr set_graphics_state_from_dict(NonnullRefPtr); void show_text(String const&); - PDFErrorOr> get_color_space(Value const&); + PDFErrorOr> get_color_space(Value const&, NonnullRefPtr); ALWAYS_INLINE GraphicsState const& state() const { return m_graphics_state_stack.last(); } ALWAYS_INLINE GraphicsState& state() { return m_graphics_state_stack.last(); }