1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 05:47:35 +00:00

LibPDF: Add basic ICCBased color space handling

This commit is contained in:
Matthew Olsson 2022-03-24 10:08:43 -07:00 committed by Andreas Kling
parent 1238e65d30
commit e1115cfe48
3 changed files with 39 additions and 0 deletions

View file

@ -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();
}
}