From a1de65c34f4521efe166132854f6b81d43d6fc9b Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Fri, 17 Feb 2023 21:43:05 -0500 Subject: [PATCH] LibGfx: Implement serialization of TextTagData --- Userland/Libraries/LibGfx/ICC/BinaryWriter.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Userland/Libraries/LibGfx/ICC/BinaryWriter.cpp b/Userland/Libraries/LibGfx/ICC/BinaryWriter.cpp index a57adc4f6f..f4a9d68101 100644 --- a/Userland/Libraries/LibGfx/ICC/BinaryWriter.cpp +++ b/Userland/Libraries/LibGfx/ICC/BinaryWriter.cpp @@ -149,6 +149,20 @@ static ErrorOr encode_signature(SignatureTagData const& tag_data) return bytes; } +static ErrorOr encode_text(TextTagData const& tag_data) +{ + // ICC v4, 10.24 textType + // "The textType is a simple text structure that contains a 7-bit ASCII text string. The length of the string is obtained + // by subtracting 8 from the element size portion of the tag itself. This string shall be terminated with a 00h byte." + auto text_bytes = tag_data.text().bytes(); + auto bytes = TRY(ByteBuffer::create_uninitialized(2 * sizeof(u32) + text_bytes.size() + 1)); + *bit_cast*>(bytes.data()) = (u32)TextTagData::Type; + *bit_cast*>(bytes.data() + 4) = 0; + memcpy(bytes.data() + 8, text_bytes.data(), text_bytes.size()); + *(bytes.data() + 8 + text_bytes.size()) = '\0'; + return bytes; +} + static ErrorOr encode_xyz(XYZTagData const& tag_data) { // ICC v4, 10.31 XYZType @@ -180,6 +194,8 @@ static ErrorOr encode_tag_data(TagData const& tag_data) return encode_s15_fixed_array(static_cast(tag_data)); case SignatureTagData::Type: return encode_signature(static_cast(tag_data)); + case TextTagData::Type: + return encode_text(static_cast(tag_data)); case XYZTagData::Type: return encode_xyz(static_cast(tag_data)); }