فهرست منبع

LibPDF: Add more knowledge to ColorSpaces classes

ColorSpaces now can tell users how many components they expect, and the
default decode array that should be used when converting unit bit
sequences into color space component input values during image
rendering.
Rodrigo Tobar 2 سال پیش
والد
کامیت
26f8c0b76c
2فایلهای تغییر یافته به همراه38 افزوده شده و 0 حذف شده
  1. 25 0
      Userland/Libraries/LibPDF/ColorSpace.cpp
  2. 13 0
      Userland/Libraries/LibPDF/ColorSpace.h

+ 25 - 0
Userland/Libraries/LibPDF/ColorSpace.cpp

@@ -73,6 +73,11 @@ Color DeviceGrayColorSpace::color(Vector<Value> const& arguments) const
     return Color(gray, gray, gray);
 }
 
+Vector<float> DeviceGrayColorSpace::default_decode() const
+{
+    return { 0.0f, 1.0f };
+}
+
 NonnullRefPtr<DeviceRGBColorSpace> DeviceRGBColorSpace::the()
 {
     static auto instance = adopt_ref(*new DeviceRGBColorSpace());
@@ -88,6 +93,11 @@ Color DeviceRGBColorSpace::color(Vector<Value> const& arguments) const
     return Color(r, g, b);
 }
 
+Vector<float> DeviceRGBColorSpace::default_decode() const
+{
+    return { 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f };
+}
+
 NonnullRefPtr<DeviceCMYKColorSpace> DeviceCMYKColorSpace::the()
 {
     static auto instance = adopt_ref(*new DeviceCMYKColorSpace());
@@ -104,6 +114,11 @@ Color DeviceCMYKColorSpace::color(Vector<Value> const& arguments) const
     return Color::from_cmyk(c, m, y, k);
 }
 
+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<CalRGBColorSpace>> CalRGBColorSpace::create(Document* document, Vector<Value>&& parameters)
 {
     if (parameters.size() != 1)
@@ -274,6 +289,11 @@ Color CalRGBColorSpace::color(Vector<Value> const& arguments) const
     return Color(red, green, blue);
 }
 
+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)
 {
     if (parameters.is_empty())
@@ -313,4 +333,9 @@ Color ICCBasedColorSpace::color(Vector<Value> const&) const
     VERIFY_NOT_REACHED();
 }
 
+Vector<float> ICCBasedColorSpace::default_decode() const
+{
+    VERIFY_NOT_REACHED();
+}
+
 }

+ 13 - 0
Userland/Libraries/LibPDF/ColorSpace.h

@@ -6,6 +6,7 @@
 
 #pragma once
 
+#include "AK/Forward.h"
 #include <AK/FlyString.h>
 #include <LibGfx/Color.h>
 #include <LibPDF/Value.h>
@@ -54,6 +55,8 @@ public:
     virtual ~ColorSpace() = default;
 
     virtual Color color(Vector<Value> const& arguments) const = 0;
+    virtual int number_of_components() const = 0;
+    virtual Vector<float> default_decode() const = 0;
     virtual ColorSpaceFamily const& family() const = 0;
 };
 
@@ -64,6 +67,8 @@ public:
     ~DeviceGrayColorSpace() override = default;
 
     Color color(Vector<Value> const& arguments) const override;
+    int number_of_components() const override { return 1; }
+    Vector<float> default_decode() const override;
     ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceGray; }
 
 private:
@@ -77,6 +82,8 @@ public:
     ~DeviceRGBColorSpace() override = default;
 
     Color color(Vector<Value> const& arguments) const override;
+    int number_of_components() const override { return 3; }
+    Vector<float> default_decode() const override;
     ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceRGB; }
 
 private:
@@ -90,6 +97,8 @@ public:
     ~DeviceCMYKColorSpace() override = default;
 
     Color color(Vector<Value> const& arguments) const override;
+    int number_of_components() const override { return 4; }
+    Vector<float> default_decode() const override;
     ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceCMYK; }
 
 private:
@@ -103,6 +112,8 @@ public:
     ~CalRGBColorSpace() override = default;
 
     Color color(Vector<Value> const& arguments) const override;
+    int number_of_components() const override { return 3; }
+    Vector<float> default_decode() const override;
     ColorSpaceFamily const& family() const override { return ColorSpaceFamily::CalRGB; }
 
 private:
@@ -121,6 +132,8 @@ public:
     ~ICCBasedColorSpace() override = default;
 
     Color color(Vector<Value> const& arguments) const override;
+    int number_of_components() const override { VERIFY_NOT_REACHED(); }
+    Vector<float> default_decode() const override;
     ColorSpaceFamily const& family() const override { return ColorSpaceFamily::ICCBased; }
 
 private: