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

LibPDF: Add basic ICCBased color space handling

Matthew Olsson преди 3 години
родител
ревизия
e1115cfe48
променени са 3 файла, в които са добавени 39 реда и са изтрити 0 реда
  1. 25 0
      Userland/Libraries/LibPDF/ColorSpace.cpp
  2. 12 0
      Userland/Libraries/LibPDF/ColorSpace.h
  3. 2 0
      Userland/Libraries/LibPDF/CommonNames.h

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

@@ -40,6 +40,9 @@ PDFErrorOr<NonnullRefPtr<ColorSpace>> ColorSpace::create(Document* document, Fly
     if (color_space_name == CommonNames::CalRGB)
         return TRY(CalRGBColorSpace::create(document, move(parameters)));
 
+    if (color_space_name == CommonNames::ICCBased)
+        return TRY(ICCBasedColorSpace::create(document, page, move(parameters)));
+
     dbgln("Unknown color space: {}", color_space_name);
     TODO();
 }
@@ -258,4 +261,26 @@ Color CalRGBColorSpace::color(Vector<Value> const& arguments) const
     return Color(red, green, blue);
 }
 
+PDFErrorOr<NonnullRefPtr<ColorSpace>> ICCBasedColorSpace::create(Document* document, Page const& page, Vector<Value>&& parameters)
+{
+    if (parameters.is_empty())
+        return Error { Error::Type::MalformedPDF, "ICCBased color space expected one parameter" };
+
+    auto param = TRY(document->resolve(parameters[0]));
+    if (!param.has<NonnullRefPtr<Object>>() || !param.get<NonnullRefPtr<Object>>()->is<StreamObject>())
+        return Error { Error::Type::MalformedPDF, "ICCBased color space expects a stream parameter" };
+
+    auto dict = param.get<NonnullRefPtr<Object>>()->cast<StreamObject>()->dict();
+    if (!dict->contains(CommonNames::Alternate))
+        TODO();
+
+    auto alternate = TRY(dict->get_name(document, CommonNames::Alternate))->name();
+    return TRY(ColorSpace::create(document, alternate, page));
+}
+
+Color ICCBasedColorSpace::color(Vector<Value> const&) const
+{
+    VERIFY_NOT_REACHED();
+}
+
 }

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

@@ -89,4 +89,16 @@ private:
     Array<float, 9> m_matrix { 1, 0, 0, 0, 1, 0, 0, 0, 1 };
 };
 
+class ICCBasedColorSpace final : public ColorSpace {
+public:
+    static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, Page const&, Vector<Value>&& parameters);
+
+    ~ICCBasedColorSpace() override = default;
+
+    Color color(Vector<Value> const& arguments) const override;
+
+private:
+    ICCBasedColorSpace() = delete;
+};
+
 }

+ 2 - 0
Userland/Libraries/LibPDF/CommonNames.h

@@ -10,6 +10,7 @@
 
 #define ENUMERATE_COMMON_NAMES(A) \
     A(AIS)                        \
+    A(Alternate)                  \
     A(ASCII85Decode)              \
     A(ASCIIHexDecode)             \
     A(BG)                         \
@@ -63,6 +64,7 @@
     A(H)                          \
     A(HT)                         \
     A(HTO)                        \
+    A(ICCBased)                   \
     A(ID)                         \
     A(JBIG2Decode)                \
     A(JPXDecode)                  \