From 60c4803dd35b9f531e2e8eef7638edc8d48d694d Mon Sep 17 00:00:00 2001 From: Kyle Pereira Date: Thu, 7 Dec 2023 13:45:44 +0000 Subject: [PATCH] LibPDF: Pass Renderer to ColorSpace --- Userland/Libraries/LibPDF/ColorSpace.cpp | 35 ++++++++++++------------ Userland/Libraries/LibPDF/ColorSpace.h | 14 +++++----- Userland/Libraries/LibPDF/Renderer.cpp | 4 +-- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/Userland/Libraries/LibPDF/ColorSpace.cpp b/Userland/Libraries/LibPDF/ColorSpace.cpp index d2d18b426d..251f83d0a9 100644 --- a/Userland/Libraries/LibPDF/ColorSpace.cpp +++ b/Userland/Libraries/LibPDF/ColorSpace.cpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace PDF { @@ -31,20 +32,20 @@ PDFErrorOr ColorSpaceFamily::get(DeprecatedFlyString const& fa return Error(Error::Type::MalformedPDF, "Unknown ColorSpace family"_string); } -PDFErrorOr> ColorSpace::create(Document* document, NonnullRefPtr color_space_object) +PDFErrorOr> ColorSpace::create(Document* document, NonnullRefPtr color_space_object, Renderer& renderer) { // "A color space is defined by an array object whose first element is a name object identifying the color space family. // The remaining array elements, if any, are parameters that further characterize the color space; // their number and types vary according to the particular family. // For families that do not require parameters, the color space can be specified simply by the family name itself instead of an array." if (color_space_object->is()) - return ColorSpace::create(color_space_object->cast()->name()); + return ColorSpace::create(color_space_object->cast()->name(), renderer); if (color_space_object->is()) - return ColorSpace::create(document, color_space_object->cast()); + return ColorSpace::create(document, color_space_object->cast(), renderer); return Error { Error::Type::MalformedPDF, "Color space must be name or array" }; } -PDFErrorOr> ColorSpace::create(DeprecatedFlyString const& name) +PDFErrorOr> ColorSpace::create(DeprecatedFlyString const& name, Renderer&) { // Simple color spaces with no parameters, which can be specified directly if (name == CommonNames::DeviceGray) @@ -58,7 +59,7 @@ PDFErrorOr> ColorSpace::create(DeprecatedFlyString con VERIFY_NOT_REACHED(); } -PDFErrorOr> ColorSpace::create(Document* document, NonnullRefPtr color_space_array) +PDFErrorOr> ColorSpace::create(Document* document, NonnullRefPtr color_space_array, Renderer& renderer) { auto color_space_name = TRY(color_space_array->get_name_at(document, 0))->name(); @@ -74,13 +75,13 @@ PDFErrorOr> ColorSpace::create(Document* document, Non return TRY(CalRGBColorSpace::create(document, move(parameters))); if (color_space_name == CommonNames::DeviceN) - return TRY(DeviceNColorSpace::create(document, move(parameters))); + return TRY(DeviceNColorSpace::create(document, move(parameters), renderer)); if (color_space_name == CommonNames::ICCBased) - return TRY(ICCBasedColorSpace::create(document, move(parameters))); + return TRY(ICCBasedColorSpace::create(document, move(parameters), renderer)); if (color_space_name == CommonNames::Indexed) - return TRY(IndexedColorSpace::create(document, move(parameters))); + return TRY(IndexedColorSpace::create(document, move(parameters), renderer)); if (color_space_name == CommonNames::Lab) return TRY(LabColorSpace::create(document, move(parameters))); @@ -89,7 +90,7 @@ PDFErrorOr> ColorSpace::create(Document* document, Non return Error::rendering_unsupported_error("Pattern color spaces not yet implemented"); if (color_space_name == CommonNames::Separation) - return TRY(SeparationColorSpace::create(document, move(parameters))); + return TRY(SeparationColorSpace::create(document, move(parameters), renderer)); dbgln("Unknown color space: {}", color_space_name); return Error::rendering_unsupported_error("unknown color space"); @@ -154,7 +155,7 @@ Vector DeviceCMYKColorSpace::default_decode() const return { 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f }; } -PDFErrorOr> DeviceNColorSpace::create(Document* document, Vector&& parameters) +PDFErrorOr> DeviceNColorSpace::create(Document* document, Vector&& parameters, Renderer& renderer) { // "[ /DeviceN names alternateSpace tintTransform ] // or @@ -173,7 +174,7 @@ PDFErrorOr> DeviceNColorSpace::create(Document* // "The alternateSpace parameter is an array or name object that can be any device or CIE-based color space // but not another special color space (Pattern, Indexed, Separation, or DeviceN)." auto alternate_space_object = TRY(document->resolve_to(parameters[1])); - auto alternate_space = TRY(ColorSpace::create(document, alternate_space_object)); + auto alternate_space = TRY(ColorSpace::create(document, alternate_space_object, renderer)); auto family = alternate_space->family(); if (family == ColorSpaceFamily::Pattern || family == ColorSpaceFamily::Indexed || family == ColorSpaceFamily::Separation || family == ColorSpaceFamily::DeviceN) @@ -465,7 +466,7 @@ Vector CalRGBColorSpace::default_decode() const return { 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f }; } -PDFErrorOr> ICCBasedColorSpace::create(Document* document, Vector&& parameters) +PDFErrorOr> ICCBasedColorSpace::create(Document* document, Vector&& parameters, Renderer& renderer) { if (parameters.is_empty()) return Error { Error::Type::MalformedPDF, "ICCBased color space expected one parameter" }; @@ -480,7 +481,7 @@ PDFErrorOr> ICCBasedColorSpace::create(Document* docum if (dict->contains(CommonNames::Alternate)) { auto alternate_color_space_object = MUST(dict->get_object(document, CommonNames::Alternate)); if (alternate_color_space_object->is()) - return ColorSpace::create(alternate_color_space_object->cast()->name()); + return ColorSpace::create(alternate_color_space_object->cast()->name(), renderer); return Error { Error::Type::Internal, "Alternate color spaces in array format are not supported" }; } @@ -631,7 +632,7 @@ Vector LabColorSpace::default_decode() const return { 0.0f, 100.0f, m_range[0], m_range[1], m_range[2], m_range[3] }; } -PDFErrorOr> IndexedColorSpace::create(Document* document, Vector&& parameters) +PDFErrorOr> IndexedColorSpace::create(Document* document, Vector&& parameters, Renderer& renderer) { if (parameters.size() != 3) return Error { Error::Type::MalformedPDF, "Indexed color space expected three parameters" }; @@ -641,7 +642,7 @@ PDFErrorOr> IndexedColorSpace::create(Document* docume // a Separation or DeviceN space, but not a Pattern space or another Indexed space." auto base_object = TRY(document->resolve_to(parameters[0])); - auto base = TRY(ColorSpace::create(document, base_object)); + auto base = TRY(ColorSpace::create(document, base_object, renderer)); if (base->family() == ColorSpaceFamily::Pattern || base->family() == ColorSpaceFamily::Indexed) return Error { Error::Type::MalformedPDF, "Indexed color space has invalid base color space" }; @@ -713,7 +714,7 @@ Vector IndexedColorSpace::default_decode() const return { 0.0, 255.0 }; } -PDFErrorOr> SeparationColorSpace::create(Document* document, Vector&& parameters) +PDFErrorOr> SeparationColorSpace::create(Document* document, Vector&& parameters, Renderer& renderer) { if (parameters.size() != 3) return Error { Error::Type::MalformedPDF, "Separation color space expected three parameters" }; @@ -727,7 +728,7 @@ PDFErrorOr> SeparationColorSpace::create(Doc // which can be any device or CIE-based color space but not another special color space // (Pattern, Indexed, Separation, or DeviceN)." auto alternate_space_object = TRY(document->resolve_to(parameters[1])); - auto alternate_space = TRY(ColorSpace::create(document, alternate_space_object)); + auto alternate_space = TRY(ColorSpace::create(document, alternate_space_object, renderer)); auto family = alternate_space->family(); if (family == ColorSpaceFamily::Pattern || family == ColorSpaceFamily::Indexed || family == ColorSpaceFamily::Separation || family == ColorSpaceFamily::DeviceN) diff --git a/Userland/Libraries/LibPDF/ColorSpace.h b/Userland/Libraries/LibPDF/ColorSpace.h index 1e300108f0..cb4bf1da66 100644 --- a/Userland/Libraries/LibPDF/ColorSpace.h +++ b/Userland/Libraries/LibPDF/ColorSpace.h @@ -60,9 +60,9 @@ private: class ColorSpace : public RefCounted { public: - static PDFErrorOr> create(Document*, NonnullRefPtr); - static PDFErrorOr> create(DeprecatedFlyString const&); - static PDFErrorOr> create(Document*, NonnullRefPtr); + static PDFErrorOr> create(Document*, NonnullRefPtr, Renderer&); + static PDFErrorOr> create(DeprecatedFlyString const&, Renderer&); + static PDFErrorOr> create(Document*, NonnullRefPtr, Renderer&); virtual ~ColorSpace() = default; @@ -119,7 +119,7 @@ private: class DeviceNColorSpace final : public ColorSpace { public: - static PDFErrorOr> create(Document*, Vector&& parameters); + static PDFErrorOr> create(Document*, Vector&& parameters, Renderer&); ~DeviceNColorSpace() override = default; @@ -179,7 +179,7 @@ private: class ICCBasedColorSpace final : public ColorSpace { public: - static PDFErrorOr> create(Document*, Vector&& parameters); + static PDFErrorOr> create(Document*, Vector&& parameters, Renderer&); ~ICCBasedColorSpace() override = default; @@ -216,7 +216,7 @@ private: class IndexedColorSpace final : public ColorSpace { public: - static PDFErrorOr> create(Document*, Vector&& parameters); + static PDFErrorOr> create(Document*, Vector&& parameters, Renderer&); ~IndexedColorSpace() override = default; @@ -235,7 +235,7 @@ private: class SeparationColorSpace final : public ColorSpace { public: - static PDFErrorOr> create(Document*, Vector&& parameters); + static PDFErrorOr> create(Document*, Vector&& parameters, Renderer&); ~SeparationColorSpace() override = default; diff --git a/Userland/Libraries/LibPDF/Renderer.cpp b/Userland/Libraries/LibPDF/Renderer.cpp index 80618068e1..87396f7072 100644 --- a/Userland/Libraries/LibPDF/Renderer.cpp +++ b/Userland/Libraries/LibPDF/Renderer.cpp @@ -1059,7 +1059,7 @@ PDFErrorOr> Renderer::get_color_space_from_resources(V if (!maybe_color_space_family.is_error()) { auto color_space_family = maybe_color_space_family.release_value(); if (color_space_family.may_be_specified_directly()) { - return ColorSpace::create(color_space_name); + return ColorSpace::create(color_space_name, *this); } } auto color_space_resource_dict = TRY(resources->get_dict(m_document, CommonNames::ColorSpace)); @@ -1072,7 +1072,7 @@ PDFErrorOr> Renderer::get_color_space_from_resources(V PDFErrorOr> Renderer::get_color_space_from_document(NonnullRefPtr color_space_object) { - return ColorSpace::create(m_document, color_space_object); + return ColorSpace::create(m_document, color_space_object, *this); } Gfx::AffineTransform const& Renderer::calculate_text_rendering_matrix() const