LibGfx: Allow ImageDecoders to expose their color space through CICP

This introduces a new API in ImageDecoderPlugins that allow an image
decoder to return a CICP struct. Also, we use this API in
ImageDecoder::color_space() to create a color space corresponding to
these CICP.
This commit is contained in:
Lucas CHOLLET 2025-02-08 00:07:28 -05:00 committed by Tim Flynn
commit cffc8678d8
Notes: github-actions[bot] 2025-02-12 17:26:15 +00:00
4 changed files with 36 additions and 0 deletions

View file

@ -47,6 +47,34 @@ ColorSpace::ColorSpace(NonnullOwnPtr<Details::ColorSpaceImpl>&& color_space)
{
}
ErrorOr<ColorSpace> ColorSpace::from_cicp(Media::CodingIndependentCodePoints cicp)
{
// FIXME: Bail on invalid input
skcms_Matrix3x3 gamut = SkNamedGamut::kSRGB;
switch (cicp.color_primaries()) {
case Media::ColorPrimaries::BT709:
gamut = SkNamedGamut::kSRGB;
break;
case Media::ColorPrimaries::SMPTE432:
gamut = SkNamedGamut::kDisplayP3;
break;
default:
return Error::from_string_literal("FIXME: Unsupported color primaries");
}
skcms_TransferFunction transfer_function = SkNamedTransferFn::kSRGB;
switch (cicp.transfer_characteristics()) {
case Media::TransferCharacteristics::SRGB:
transfer_function = SkNamedTransferFn::kSRGB;
break;
default:
return Error::from_string_literal("FIXME: Unsupported transfer function");
}
return ColorSpace { make<Details::ColorSpaceImpl>(SkColorSpace::MakeRGB(transfer_function, gamut)) };
}
ErrorOr<ColorSpace> ColorSpace::load_from_icc_bytes(ReadonlyBytes icc_bytes)
{
if (icc_bytes.size() != 0) {