diff --git a/Userland/Libraries/LibPDF/ColorSpace.cpp b/Userland/Libraries/LibPDF/ColorSpace.cpp index 184361f645..28949882ce 100644 --- a/Userland/Libraries/LibPDF/ColorSpace.cpp +++ b/Userland/Libraries/LibPDF/ColorSpace.cpp @@ -40,6 +40,9 @@ PDFErrorOr> 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 const& arguments) const return Color(red, green, blue); } +PDFErrorOr> ICCBasedColorSpace::create(Document* document, Page const& page, Vector&& 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>() || !param.get>()->is()) + return Error { Error::Type::MalformedPDF, "ICCBased color space expects a stream parameter" }; + + auto dict = param.get>()->cast()->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 const&) const +{ + VERIFY_NOT_REACHED(); +} + } diff --git a/Userland/Libraries/LibPDF/ColorSpace.h b/Userland/Libraries/LibPDF/ColorSpace.h index b4d011c091..79e0062d76 100644 --- a/Userland/Libraries/LibPDF/ColorSpace.h +++ b/Userland/Libraries/LibPDF/ColorSpace.h @@ -89,4 +89,16 @@ private: Array m_matrix { 1, 0, 0, 0, 1, 0, 0, 0, 1 }; }; +class ICCBasedColorSpace final : public ColorSpace { +public: + static PDFErrorOr> create(Document*, Page const&, Vector&& parameters); + + ~ICCBasedColorSpace() override = default; + + Color color(Vector const& arguments) const override; + +private: + ICCBasedColorSpace() = delete; +}; + } diff --git a/Userland/Libraries/LibPDF/CommonNames.h b/Userland/Libraries/LibPDF/CommonNames.h index b10980f3ce..537ec02298 100644 --- a/Userland/Libraries/LibPDF/CommonNames.h +++ b/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) \