Browse Source

Introduce JpegComData.cs

pull/2641/head
Robert Mutniański 2 years ago
parent
commit
d2251287ce
  1. 32
      src/ImageSharp/Formats/Jpeg/JpegComData.cs
  2. 2
      src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
  3. 4
      src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs
  4. 4
      src/ImageSharp/Formats/Jpeg/JpegMetadata.cs
  5. 2
      tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.Metadata.cs
  6. 10
      tests/ImageSharp.Tests/Formats/Jpg/JpegEncoderTests.Metadata.cs
  7. 6
      tests/ImageSharp.Tests/Formats/Jpg/JpegMetadataTests.cs

32
src/ImageSharp/Formats/Jpeg/JpegComData.cs

@ -0,0 +1,32 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Jpeg;
/// <summary>
/// Contains JPEG comment
/// </summary>
public readonly struct JpegComData
{
/// <summary>
/// Converts string to <see cref="JpegComData"/>
/// </summary>
/// <param name="value">The comment string.</param>
/// <returns>The <see cref="JpegComData"/></returns>
public static JpegComData FromString(string value) => new(value.AsMemory());
/// <summary>
/// Initializes a new instance of the <see cref="JpegComData"/> struct.
/// </summary>
/// <param name="value">The comment ReadOnlyMemory of chars.</param>
public JpegComData(ReadOnlyMemory<char> value)
=> this.Value = value;
public ReadOnlyMemory<char> Value { get; }
/// <summary>
/// Converts Value to string
/// </summary>
/// <returns>The comment string.</returns>
public override string ToString() => this.Value.ToString();
}

2
src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs

@ -529,7 +529,7 @@ internal sealed class JpegDecoderCore : IRawJpegData, IImageDecoderInternals
stream.Read(temp);
string comment = Encoding.ASCII.GetString(temp);
metadata.Comments.Add(comment);
metadata.Comments.Add(JpegComData.FromString(comment));
}
/// <summary>

4
src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs

@ -186,12 +186,12 @@ internal sealed unsafe partial class JpegEncoderCore : IImageEncoderInternals
for (int i = 0; i < metadata.Comments.Count; i++)
{
string comment = metadata.Comments[i];
string comment = metadata.Comments[i].ToString();
if (comment.Length > maxCommentLength)
{
string splitComment = comment.Substring(maxCommentLength, comment.Length - maxCommentLength);
metadata.Comments.Insert(i + 1, splitComment);
metadata.Comments.Insert(i + 1, JpegComData.FromString(splitComment));
// We don't want to keep the extra bytes
comment = comment.Substring(0, maxCommentLength);

4
src/ImageSharp/Formats/Jpeg/JpegMetadata.cs

@ -15,7 +15,7 @@ public class JpegMetadata : IDeepCloneable
/// </summary>
public JpegMetadata()
{
this.Comments = new List<string>();
this.Comments = new List<JpegComData>();
}
/// <summary>
@ -106,7 +106,7 @@ public class JpegMetadata : IDeepCloneable
/// <summary>
/// Gets the comments.
/// </summary>
public IList<string> Comments { get; }
public IList<JpegComData> Comments { get; }
/// <inheritdoc/>
public IDeepCloneable DeepClone() => new JpegMetadata(this);

2
tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.Metadata.cs

@ -435,7 +435,7 @@ public partial class JpegDecoderTests
JpegMetadata metadata = image.Metadata.GetJpegMetadata();
Assert.Equal(1, metadata.Comments.Count);
Assert.Equal(expectedComment, metadata.Comments.ElementAtOrDefault(0));
Assert.Equal(expectedComment, metadata.Comments.ElementAtOrDefault(0).ToString());
image.DebugSave(provider);
image.CompareToOriginal(provider);
}

10
tests/ImageSharp.Tests/Formats/Jpg/JpegEncoderTests.Metadata.cs

@ -172,7 +172,7 @@ public partial class JpegEncoderTests
JpegMetadata actual = output.Metadata.GetJpegMetadata();
Assert.NotEmpty(actual.Comments);
Assert.Equal(1, actual.Comments.Count);
Assert.Equal("TEST COMMENT", actual.Comments.ElementAtOrDefault(0));
Assert.Equal("TEST COMMENT", actual.Comments.ElementAtOrDefault(0).ToString());
}
[Fact]
@ -184,8 +184,8 @@ public partial class JpegEncoderTests
using var memStream = new MemoryStream();
// act
meta.Comments.Add("First comment");
meta.Comments.Add("Second Comment");
meta.Comments.Add(JpegComData.FromString("First comment"));
meta.Comments.Add(JpegComData.FromString("Second Comment"));
input.Save(memStream, JpegEncoder);
// assert
@ -194,8 +194,8 @@ public partial class JpegEncoderTests
JpegMetadata actual = output.Metadata.GetJpegMetadata();
Assert.NotEmpty(actual.Comments);
Assert.Equal(2, actual.Comments.Count);
Assert.Equal(meta.Comments.ElementAtOrDefault(0), actual.Comments.ElementAtOrDefault(0));
Assert.Equal(meta.Comments.ElementAtOrDefault(1), actual.Comments.ElementAtOrDefault(1));
Assert.Equal(meta.Comments.ElementAtOrDefault(0).ToString(), actual.Comments.ElementAtOrDefault(0).ToString());
Assert.Equal(meta.Comments.ElementAtOrDefault(1).ToString(), actual.Comments.ElementAtOrDefault(1).ToString());
}
[Theory]

6
tests/ImageSharp.Tests/Formats/Jpg/JpegMetadataTests.cs

@ -64,7 +64,7 @@ public class JpegMetadataTests
{
var meta = new JpegMetadata();
Assert.True(Array.Empty<string>().SequenceEqual(meta.Comments));
Assert.True(Array.Empty<JpegComData>().SequenceEqual(meta.Comments));
}
[Fact]
@ -74,9 +74,9 @@ public class JpegMetadataTests
var expectedCollection = new Collection<string> { comment };
var meta = new JpegMetadata();
meta.Comments.Add(comment);
meta.Comments.Add(JpegComData.FromString(comment));
Assert.Equal(1, meta.Comments.Count);
Assert.True(expectedCollection.FirstOrDefault() == meta.Comments.FirstOrDefault());
Assert.True(expectedCollection.FirstOrDefault() == meta.Comments.FirstOrDefault().ToString());
}
}

Loading…
Cancel
Save