1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 06:37:44 +00:00

LibGfx+icc: Add ICCProfile support for XYZType and print it

This commit is contained in:
Nico Weber 2023-01-22 22:25:44 -05:00 committed by Linus Groh
parent 2bfd09b173
commit 6cfb057430
3 changed files with 46 additions and 0 deletions

View file

@ -781,6 +781,28 @@ ErrorOr<NonnullRefPtr<TextTagData>> TextTagData::from_bytes(ReadonlyBytes bytes,
return adopt_ref(*new TextTagData(offset, size, TRY(String::from_utf8(StringView(text_data, length - 1)))));
}
ErrorOr<NonnullRefPtr<XYZTagData>> XYZTagData::from_bytes(ReadonlyBytes bytes, u32 offset, u32 size)
{
// ICC v4, 10.31 XYZType
VERIFY(tag_type(bytes) == XYZTagData::Type);
TRY(check_reserved(bytes));
// "The XYZType contains an array of three encoded values for PCSXYZ, CIEXYZ, or nCIEXYZ values. The
// number of sets of values is determined from the size of the tag."
size_t byte_size = bytes.size() - 8;
if (byte_size % sizeof(XYZNumber) != 0)
return Error::from_string_literal("ICC::Profile: XYZType wrong size");
size_t xyz_count = byte_size / sizeof(XYZNumber);
XYZNumber const* raw_xyzs = bit_cast<XYZNumber const*>(bytes.data() + 8);
Vector<XYZ, 1> xyzs;
TRY(xyzs.try_resize(xyz_count));
for (size_t i = 0; i < xyz_count; ++i)
xyzs[i] = (XYZ)raw_xyzs[i];
return adopt_ref(*new XYZTagData(offset, size, move(xyzs)));
}
ErrorOr<void> Profile::read_header(ReadonlyBytes bytes)
{
if (bytes.size() < sizeof(ICCHeader))
@ -832,6 +854,8 @@ ErrorOr<NonnullRefPtr<TagData>> Profile::read_tag(ReadonlyBytes bytes, Detail::T
return TextDescriptionTagData::from_bytes(tag_bytes, entry.offset_to_beginning_of_tag_data_element, entry.size_of_tag_data_element);
case TextTagData::Type:
return TextTagData::from_bytes(tag_bytes, entry.offset_to_beginning_of_tag_data_element, entry.size_of_tag_data_element);
case XYZTagData::Type:
return XYZTagData::from_bytes(tag_bytes, entry.offset_to_beginning_of_tag_data_element, entry.size_of_tag_data_element);
default:
// FIXME: optionally ignore tags of unknown type
return adopt_ref(*new UnknownTagData(entry.offset_to_beginning_of_tag_data_element, entry.size_of_tag_data_element, type));