Browse Source

Implemented the IDecoderOptions inside the png decoder.

af/merge-core
Dirk Lemstra 9 years ago
committed by Dirk Lemstra
parent
commit
b27fa62a6a
  1. 20
      src/ImageSharp.Formats.Png/IPngDecoderOptions.cs
  2. 4
      src/ImageSharp.Formats.Png/PngDecoder.cs
  3. 23
      src/ImageSharp.Formats.Png/PngDecoderCore.cs
  4. 62
      src/ImageSharp.Formats.Png/PngDecoderOptions.cs
  5. 66
      tests/ImageSharp.Tests/Formats/Png/PngDecoderCoreTests.cs

20
src/ImageSharp.Formats.Png/IPngDecoderOptions.cs

@ -0,0 +1,20 @@
// <copyright file="IPngDecoderOptions.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageSharp.Formats
{
using System.Text;
/// <summary>
/// Encapsulates the png decoder options.
/// </summary>
public interface IPngDecoderOptions : IDecoderOptions
{
/// <summary>
/// Gets the encoding that should be used when reading text chunks.
/// </summary>
Encoding TextEncoding { get; }
}
}

4
src/ImageSharp.Formats.Png/PngDecoder.cs

@ -34,7 +34,9 @@ namespace ImageSharp.Formats
public void Decode<TColor>(Image<TColor> image, Stream stream, IDecoderOptions options)
where TColor : struct, IPixel<TColor>
{
new PngDecoderCore().Decode(image, stream);
IPngDecoderOptions pngOptions = PngDecoderOptions.Create(options);
new PngDecoderCore(pngOptions).Decode(image, stream);
}
}
}

23
src/ImageSharp.Formats.Png/PngDecoderCore.cs

@ -64,6 +64,11 @@ namespace ImageSharp.Formats
/// </summary>
private readonly char[] chars = new char[4];
/// <summary>
/// The decoder options.
/// </summary>
private readonly IPngDecoderOptions options;
/// <summary>
/// Reusable crc for validating chunks.
/// </summary>
@ -120,6 +125,15 @@ namespace ImageSharp.Formats
ColorTypes.Add((int)PngColorType.RgbWithAlpha, new byte[] { 8 });
}
/// <summary>
/// Initializes a new instance of the <see cref="PngDecoderCore"/> class.
/// </summary>
/// <param name="options">The decoder options.</param>
public PngDecoderCore(IPngDecoderOptions options)
{
this.options = options ?? new PngDecoderOptions();
}
/// <summary>
/// Gets or sets the png color type
/// </summary>
@ -763,6 +777,11 @@ namespace ImageSharp.Formats
private void ReadTextChunk<TColor>(Image<TColor> image, byte[] data, int length)
where TColor : struct, IPixel<TColor>
{
if (this.options.IgnoreMetadata)
{
return;
}
int zeroIndex = 0;
for (int i = 0; i < length; i++)
@ -774,8 +793,8 @@ namespace ImageSharp.Formats
}
}
string name = Encoding.Unicode.GetString(data, 0, zeroIndex);
string value = Encoding.Unicode.GetString(data, zeroIndex + 1, length - zeroIndex - 1);
string name = this.options.TextEncoding.GetString(data, 0, zeroIndex);
string value = this.options.TextEncoding.GetString(data, zeroIndex + 1, length - zeroIndex - 1);
image.MetaData.Properties.Add(new ImageProperty(name, value));
}

62
src/ImageSharp.Formats.Png/PngDecoderOptions.cs

@ -0,0 +1,62 @@
// <copyright file="PngDecoderOptions.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageSharp.Formats
{
using System.Text;
/// <summary>
/// Encapsulates the png decoder options.
/// </summary>
public sealed class PngDecoderOptions : DecoderOptions, IPngDecoderOptions
{
private static readonly Encoding DefaultEncoding = Encoding.GetEncoding("ASCII");
/// <summary>
/// Initializes a new instance of the <see cref="PngDecoderOptions"/> class.
/// </summary>
public PngDecoderOptions()
{
this.InitializeWithDefaults();
}
/// <summary>
/// Initializes a new instance of the <see cref="PngDecoderOptions"/> class.
/// </summary>
/// <param name="options">The options for the decoder.</param>
private PngDecoderOptions(IDecoderOptions options)
: base(options)
{
this.InitializeWithDefaults();
}
/// <summary>
/// Gets or sets the encoding that should be used when reading text chunks.
/// </summary>
public Encoding TextEncoding { get; set; }
/// <summary>
/// Converts the options to a <see cref="IPngDecoderOptions"/> instance with a cast
/// or by creating a new instance with the specfied options.
/// </summary>
/// <param name="options">The options for the decoder.</param>
/// <returns>The options for the png decoder.</returns>
internal static IPngDecoderOptions Create(IDecoderOptions options)
{
IPngDecoderOptions pngOptions = options as IPngDecoderOptions;
if (pngOptions != null)
{
return pngOptions;
}
return new PngDecoderOptions(options);
}
private void InitializeWithDefaults()
{
this.TextEncoding = DefaultEncoding;
}
}
}

66
tests/ImageSharp.Tests/Formats/Png/PngDecoderCoreTests.cs

@ -0,0 +1,66 @@
// <copyright file="JpegDecoderCoreTests.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageSharp.Tests
{
using System.Text;
using Xunit;
using ImageSharp.Formats;
public class PngDecoderCoreTests
{
[Fact]
public void Decode_IgnoreMetadataIsFalse_TextChunckIsRead()
{
var options = new PngDecoderOptions()
{
IgnoreMetadata = false
};
TestFile testFile = TestFile.Create(TestImages.Png.Blur);
using (Image image = new Image(testFile.FilePath, options))
{
Assert.Equal(1, image.MetaData.Properties.Count);
Assert.Equal("Software", image.MetaData.Properties[0].Name);
Assert.Equal("paint.net 4.0.6", image.MetaData.Properties[0].Value);
}
}
[Fact]
public void Decode_IgnoreMetadataIsTrue_TextChunksAreIgnored()
{
var options = new PngDecoderOptions()
{
IgnoreMetadata = true
};
TestFile testFile = TestFile.Create(TestImages.Png.Blur);
using (Image image = new Image(testFile.FilePath, options))
{
Assert.Equal(0, image.MetaData.Properties.Count);
}
}
[Fact]
public void Decode_TextEncodingSetToUnicode_TextIsReadWithCorrectEncoding()
{
var options = new PngDecoderOptions()
{
TextEncoding = Encoding.Unicode
};
TestFile testFile = TestFile.Create(TestImages.Png.Blur);
using (Image image = new Image(testFile.FilePath, options))
{
Assert.Equal(1, image.MetaData.Properties.Count);
Assert.Equal("潓瑦慷敲", image.MetaData.Properties[0].Name);
}
}
}
}
Loading…
Cancel
Save