diff --git a/Libraries/LibGfx/ColorSpace.cpp b/Libraries/LibGfx/ColorSpace.cpp index 88ef5fa22f5..4dd7c51ce67 100644 --- a/Libraries/LibGfx/ColorSpace.cpp +++ b/Libraries/LibGfx/ColorSpace.cpp @@ -47,6 +47,34 @@ ColorSpace::ColorSpace(NonnullOwnPtr&& color_space) { } +ErrorOr 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(SkColorSpace::MakeRGB(transfer_function, gamut)) }; +} + ErrorOr ColorSpace::load_from_icc_bytes(ReadonlyBytes icc_bytes) { if (icc_bytes.size() != 0) { diff --git a/Libraries/LibGfx/ColorSpace.h b/Libraries/LibGfx/ColorSpace.h index 9ef3bb06270..d4fe2552684 100644 --- a/Libraries/LibGfx/ColorSpace.h +++ b/Libraries/LibGfx/ColorSpace.h @@ -10,6 +10,7 @@ #include #include #include +#include namespace Gfx { @@ -28,6 +29,7 @@ public: ColorSpace& operator=(ColorSpace&&); ~ColorSpace(); + static ErrorOr from_cicp(Media::CodingIndependentCodePoints); static ErrorOr load_from_icc_bytes(ReadonlyBytes); // In order to keep this file free of Skia types, this function can't return diff --git a/Libraries/LibGfx/ImageFormats/ImageDecoder.cpp b/Libraries/LibGfx/ImageFormats/ImageDecoder.cpp index 5981f998d4e..89d61ad5557 100644 --- a/Libraries/LibGfx/ImageFormats/ImageDecoder.cpp +++ b/Libraries/LibGfx/ImageFormats/ImageDecoder.cpp @@ -49,6 +49,10 @@ static ErrorOr> probe_and_sniff_for_appropriate_plugi ErrorOr ImageDecoder::color_space() { + auto maybe_cicp = TRY(m_plugin->cicp()); + if (maybe_cicp.has_value()) + return ColorSpace::from_cicp(*maybe_cicp); + auto maybe_icc_data = TRY(icc_data()); if (!maybe_icc_data.has_value()) return ColorSpace {}; diff --git a/Libraries/LibGfx/ImageFormats/ImageDecoder.h b/Libraries/LibGfx/ImageFormats/ImageDecoder.h index 8b6e427049d..4dd2f8e3c80 100644 --- a/Libraries/LibGfx/ImageFormats/ImageDecoder.h +++ b/Libraries/LibGfx/ImageFormats/ImageDecoder.h @@ -16,6 +16,7 @@ #include #include #include +#include namespace Gfx { @@ -86,6 +87,7 @@ public: virtual Optional metadata() { return OptionalNone {}; } + virtual ErrorOr> cicp() { return OptionalNone {}; } virtual ErrorOr> icc_data() { return OptionalNone {}; } virtual NaturalFrameFormat natural_frame_format() const { return NaturalFrameFormat::RGB; }