diff --git a/src/ImageSharp/MetaData/Profiles/ICC/DataWriter/IccDataWriter.NonPrimitives.cs b/src/ImageSharp/MetaData/Profiles/ICC/DataWriter/IccDataWriter.NonPrimitives.cs index 5c57436d8..f9c4eceea 100644 --- a/src/ImageSharp/MetaData/Profiles/ICC/DataWriter/IccDataWriter.NonPrimitives.cs +++ b/src/ImageSharp/MetaData/Profiles/ICC/DataWriter/IccDataWriter.NonPrimitives.cs @@ -98,7 +98,7 @@ namespace ImageSharp /// the number of bytes written public int WriteNamedColor(IccNamedColor value) { - return this.WriteAsciiString(value.Name, 32, '\0') + return this.WriteAsciiString(value.Name, 32, true) + this.WriteArray(value.PcsCoordinates) + this.WriteArray(value.DeviceCoordinates); } diff --git a/src/ImageSharp/MetaData/Profiles/ICC/DataWriter/IccDataWriter.Primitives.cs b/src/ImageSharp/MetaData/Profiles/ICC/DataWriter/IccDataWriter.Primitives.cs index 92120d0ac..041cb4c23 100644 --- a/src/ImageSharp/MetaData/Profiles/ICC/DataWriter/IccDataWriter.Primitives.cs +++ b/src/ImageSharp/MetaData/Profiles/ICC/DataWriter/IccDataWriter.Primitives.cs @@ -189,10 +189,10 @@ namespace ImageSharp /// Writes an ASCII encoded string resizes it to the given length /// /// The string to write - /// The desired length of the string including 1 padding character - /// The character to pad to the given length + /// The desired length of the string (including potential null terminator) + /// If True, there will be a \0 added at the end /// the number of bytes written - public int WriteAsciiString(string value, int length, char paddingChar) + public int WriteAsciiString(string value, int length, bool ensureNullTerminator) { if (length == 0) { @@ -206,14 +206,23 @@ namespace ImageSharp value = string.Empty; } - value = value.Substring(0, Math.Min(length - 1, value.Length)); + byte paddingChar = (byte)' '; + int lengthAdjust = 0; + + if (ensureNullTerminator) + { + paddingChar = 0; + lengthAdjust = 1; + } + + value = value.Substring(0, Math.Min(length - lengthAdjust, value.Length)); byte[] textData = AsciiEncoding.GetBytes(value); - int actualLength = Math.Min(length - 1, textData.Length); + int actualLength = Math.Min(length - lengthAdjust, textData.Length); this.dataStream.Write(textData, 0, actualLength); for (int i = 0; i < length - actualLength; i++) { - this.dataStream.WriteByte((byte)paddingChar); + this.dataStream.WriteByte(paddingChar); } return length; diff --git a/src/ImageSharp/MetaData/Profiles/ICC/DataWriter/IccDataWriter.TagDataEntry.cs b/src/ImageSharp/MetaData/Profiles/ICC/DataWriter/IccDataWriter.TagDataEntry.cs index 893c71dde..06be71276 100644 --- a/src/ImageSharp/MetaData/Profiles/ICC/DataWriter/IccDataWriter.TagDataEntry.cs +++ b/src/ImageSharp/MetaData/Profiles/ICC/DataWriter/IccDataWriter.TagDataEntry.cs @@ -196,7 +196,7 @@ namespace ImageSharp int count = this.WriteUInt32((uint)value.ColorantData.Length); foreach (IccColorantTableEntry colorant in value.ColorantData) { - count += this.WriteAsciiString(colorant.Name, 32, '\0'); + count += this.WriteAsciiString(colorant.Name, 32, true); count += this.WriteUInt16(colorant.Pcs1); count += this.WriteUInt16(colorant.Pcs2); count += this.WriteUInt16(colorant.Pcs3); @@ -564,8 +564,8 @@ namespace ImageSharp { string[] code = value.Texts[i].Culture.Name.Split('-'); - count += this.WriteAsciiString(code[0].ToLower(), 2, ' '); - count += this.WriteAsciiString(code[1].ToUpper(), 2, ' '); + count += this.WriteAsciiString(code[0].ToLower(), 2, false); + count += this.WriteAsciiString(code[1].ToUpper(), 2, false); count += this.WriteUInt32((uint)lengths[i]); count += this.WriteUInt32(offset[i]); @@ -624,8 +624,8 @@ namespace ImageSharp int count = this.WriteInt32(value.VendorFlags) + this.WriteUInt32((uint)value.Colors.Length) + this.WriteUInt32((uint)value.CoordinateCount) - + this.WriteAsciiString(value.Prefix, 32, '\0') - + this.WriteAsciiString(value.Suffix, 32, '\0'); + + this.WriteAsciiString(value.Prefix, 32, true) + + this.WriteAsciiString(value.Suffix, 32, true); foreach (IccNamedColor color in value.Colors) { @@ -757,7 +757,7 @@ namespace ImageSharp /// The number of bytes written public int WriteSignatureTagDataEntry(IccSignatureTagDataEntry value) { - return this.WriteAsciiString(value.SignatureData, 4, ' '); + return this.WriteAsciiString(value.SignatureData, 4, false); } /// @@ -900,7 +900,7 @@ namespace ImageSharp else { this.dataStream.Position += 3; - count += size = this.WriteAsciiString(value.ScriptCode, 67, '\0'); + count += size = this.WriteAsciiString(value.ScriptCode, 67, true); this.dataStream.Position -= size + 3; count += this.WriteUInt16(value.ScriptCodeCode); count += this.WriteByte((byte)(value.ScriptCode.Length > 66 ? 67 : value.ScriptCode.Length)); diff --git a/src/ImageSharp/MetaData/Profiles/ICC/IccWriter.cs b/src/ImageSharp/MetaData/Profiles/ICC/IccWriter.cs index 5ff1f7af1..895eb0554 100644 --- a/src/ImageSharp/MetaData/Profiles/ICC/IccWriter.cs +++ b/src/ImageSharp/MetaData/Profiles/ICC/IccWriter.cs @@ -34,7 +34,7 @@ namespace ImageSharp writer.SetIndex(0); writer.WriteUInt32(writer.Length + 128); - writer.WriteAsciiString(header.CmmType, 4, ' '); + writer.WriteAsciiString(header.CmmType, 4, false); writer.WriteVersionNumber(header.Version); writer.WriteUInt32((uint)header.Class); writer.WriteUInt32((uint)header.DataColorSpace); @@ -48,7 +48,7 @@ namespace ImageSharp writer.WriteInt64((long)header.DeviceAttributes); writer.WriteUInt32((uint)header.RenderingIntent); writer.WriteXyzNumber(header.PcsIlluminant); - writer.WriteAsciiString(header.CreatorSignature, 4, ' '); + writer.WriteAsciiString(header.CreatorSignature, 4, false); #if !NETSTANDARD1_1 IccProfileId id = IccProfile.CalculateHash(writer.GetData());