Преглед на файлове

LibPDF: Pass Renderer to ColorSpace

Kyle Pereira преди 1 година
родител
ревизия
60c4803dd3
променени са 3 файла, в които са добавени 27 реда и са изтрити 26 реда
  1. 18 17
      Userland/Libraries/LibPDF/ColorSpace.cpp
  2. 7 7
      Userland/Libraries/LibPDF/ColorSpace.h
  3. 2 2
      Userland/Libraries/LibPDF/Renderer.cpp

+ 18 - 17
Userland/Libraries/LibPDF/ColorSpace.cpp

@@ -9,6 +9,7 @@
 #include <LibPDF/CommonNames.h>
 #include <LibPDF/Document.h>
 #include <LibPDF/ObjectDerivatives.h>
+#include <LibPDF/Renderer.h>
 
 namespace PDF {
 
@@ -31,20 +32,20 @@ PDFErrorOr<ColorSpaceFamily> ColorSpaceFamily::get(DeprecatedFlyString const& fa
     return Error(Error::Type::MalformedPDF, "Unknown ColorSpace family"_string);
 }
 
-PDFErrorOr<NonnullRefPtr<ColorSpace>> ColorSpace::create(Document* document, NonnullRefPtr<Object> color_space_object)
+PDFErrorOr<NonnullRefPtr<ColorSpace>> ColorSpace::create(Document* document, NonnullRefPtr<Object> 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<NameObject>())
-        return ColorSpace::create(color_space_object->cast<NameObject>()->name());
+        return ColorSpace::create(color_space_object->cast<NameObject>()->name(), renderer);
     if (color_space_object->is<ArrayObject>())
-        return ColorSpace::create(document, color_space_object->cast<ArrayObject>());
+        return ColorSpace::create(document, color_space_object->cast<ArrayObject>(), renderer);
     return Error { Error::Type::MalformedPDF, "Color space must be name or array" };
 }
 
-PDFErrorOr<NonnullRefPtr<ColorSpace>> ColorSpace::create(DeprecatedFlyString const& name)
+PDFErrorOr<NonnullRefPtr<ColorSpace>> 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<NonnullRefPtr<ColorSpace>> ColorSpace::create(DeprecatedFlyString con
     VERIFY_NOT_REACHED();
 }
 
-PDFErrorOr<NonnullRefPtr<ColorSpace>> ColorSpace::create(Document* document, NonnullRefPtr<ArrayObject> color_space_array)
+PDFErrorOr<NonnullRefPtr<ColorSpace>> ColorSpace::create(Document* document, NonnullRefPtr<ArrayObject> color_space_array, Renderer& renderer)
 {
     auto color_space_name = TRY(color_space_array->get_name_at(document, 0))->name();
 
@@ -74,13 +75,13 @@ PDFErrorOr<NonnullRefPtr<ColorSpace>> 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<NonnullRefPtr<ColorSpace>> 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<float> DeviceCMYKColorSpace::default_decode() const
     return { 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f };
 }
 
-PDFErrorOr<NonnullRefPtr<DeviceNColorSpace>> DeviceNColorSpace::create(Document* document, Vector<Value>&& parameters)
+PDFErrorOr<NonnullRefPtr<DeviceNColorSpace>> DeviceNColorSpace::create(Document* document, Vector<Value>&& parameters, Renderer& renderer)
 {
     // "[ /DeviceN names alternateSpace tintTransform ]
     //  or
@@ -173,7 +174,7 @@ PDFErrorOr<NonnullRefPtr<DeviceNColorSpace>> 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<Object>(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<float> CalRGBColorSpace::default_decode() const
     return { 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f };
 }
 
-PDFErrorOr<NonnullRefPtr<ColorSpace>> ICCBasedColorSpace::create(Document* document, Vector<Value>&& parameters)
+PDFErrorOr<NonnullRefPtr<ColorSpace>> ICCBasedColorSpace::create(Document* document, Vector<Value>&& parameters, Renderer& renderer)
 {
     if (parameters.is_empty())
         return Error { Error::Type::MalformedPDF, "ICCBased color space expected one parameter" };
@@ -480,7 +481,7 @@ PDFErrorOr<NonnullRefPtr<ColorSpace>> 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<NameObject>())
-            return ColorSpace::create(alternate_color_space_object->cast<NameObject>()->name());
+            return ColorSpace::create(alternate_color_space_object->cast<NameObject>()->name(), renderer);
 
         return Error { Error::Type::Internal, "Alternate color spaces in array format are not supported" };
     }
@@ -631,7 +632,7 @@ Vector<float> LabColorSpace::default_decode() const
     return { 0.0f, 100.0f, m_range[0], m_range[1], m_range[2], m_range[3] };
 }
 
-PDFErrorOr<NonnullRefPtr<ColorSpace>> IndexedColorSpace::create(Document* document, Vector<Value>&& parameters)
+PDFErrorOr<NonnullRefPtr<ColorSpace>> IndexedColorSpace::create(Document* document, Vector<Value>&& parameters, Renderer& renderer)
 {
     if (parameters.size() != 3)
         return Error { Error::Type::MalformedPDF, "Indexed color space expected three parameters" };
@@ -641,7 +642,7 @@ PDFErrorOr<NonnullRefPtr<ColorSpace>> 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<Object>(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<float> IndexedColorSpace::default_decode() const
     return { 0.0, 255.0 };
 }
 
-PDFErrorOr<NonnullRefPtr<SeparationColorSpace>> SeparationColorSpace::create(Document* document, Vector<Value>&& parameters)
+PDFErrorOr<NonnullRefPtr<SeparationColorSpace>> SeparationColorSpace::create(Document* document, Vector<Value>&& parameters, Renderer& renderer)
 {
     if (parameters.size() != 3)
         return Error { Error::Type::MalformedPDF, "Separation color space expected three parameters" };
@@ -727,7 +728,7 @@ PDFErrorOr<NonnullRefPtr<SeparationColorSpace>> 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<Object>(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)

+ 7 - 7
Userland/Libraries/LibPDF/ColorSpace.h

@@ -60,9 +60,9 @@ private:
 
 class ColorSpace : public RefCounted<ColorSpace> {
 public:
-    static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, NonnullRefPtr<Object>);
-    static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(DeprecatedFlyString const&);
-    static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, NonnullRefPtr<ArrayObject>);
+    static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, NonnullRefPtr<Object>, Renderer&);
+    static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(DeprecatedFlyString const&, Renderer&);
+    static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, NonnullRefPtr<ArrayObject>, Renderer&);
 
     virtual ~ColorSpace() = default;
 
@@ -119,7 +119,7 @@ private:
 
 class DeviceNColorSpace final : public ColorSpace {
 public:
-    static PDFErrorOr<NonnullRefPtr<DeviceNColorSpace>> create(Document*, Vector<Value>&& parameters);
+    static PDFErrorOr<NonnullRefPtr<DeviceNColorSpace>> create(Document*, Vector<Value>&& parameters, Renderer&);
 
     ~DeviceNColorSpace() override = default;
 
@@ -179,7 +179,7 @@ private:
 
 class ICCBasedColorSpace final : public ColorSpace {
 public:
-    static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, Vector<Value>&& parameters);
+    static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, Vector<Value>&& parameters, Renderer&);
 
     ~ICCBasedColorSpace() override = default;
 
@@ -216,7 +216,7 @@ private:
 
 class IndexedColorSpace final : public ColorSpace {
 public:
-    static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, Vector<Value>&& parameters);
+    static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, Vector<Value>&& parameters, Renderer&);
 
     ~IndexedColorSpace() override = default;
 
@@ -235,7 +235,7 @@ private:
 
 class SeparationColorSpace final : public ColorSpace {
 public:
-    static PDFErrorOr<NonnullRefPtr<SeparationColorSpace>> create(Document*, Vector<Value>&& parameters);
+    static PDFErrorOr<NonnullRefPtr<SeparationColorSpace>> create(Document*, Vector<Value>&& parameters, Renderer&);
 
     ~SeparationColorSpace() override = default;
 

+ 2 - 2
Userland/Libraries/LibPDF/Renderer.cpp

@@ -1059,7 +1059,7 @@ PDFErrorOr<NonnullRefPtr<ColorSpace>> 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<NonnullRefPtr<ColorSpace>> Renderer::get_color_space_from_resources(V
 
 PDFErrorOr<NonnullRefPtr<ColorSpace>> Renderer::get_color_space_from_document(NonnullRefPtr<Object> 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