diff --git a/.travis.yml b/.travis.yml
index a4f68b1d1..70501a484 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,7 +6,7 @@ matrix:
- os: linux # Ubuntu 14.04
dist: trusty
sudo: required
- dotnet: 1.0.1
+ dotnet: 1.0.4
mono: latest
# - os: osx # OSX 10.11
# osx_image: xcode7.3.1
diff --git a/src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/OrigJpegScanDecoder.cs b/src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/OrigJpegScanDecoder.cs
index 92c7ebe11..67abba9f3 100644
--- a/src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/OrigJpegScanDecoder.cs
+++ b/src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/OrigJpegScanDecoder.cs
@@ -583,7 +583,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort.Components.Decoder
}
zig = this.RefineNonZeroes(ref bp, zig, val0, delta);
- if (bp.ReachedEOF)
+
+ if (bp.ReachedEOF || bp.HasError)
{
return;
}
diff --git a/src/ImageSharp/Formats/Png/Zlib/Adler32.cs b/src/ImageSharp/Formats/Png/Zlib/Adler32.cs
index 6841c1cb8..1cce90c0b 100644
--- a/src/ImageSharp/Formats/Png/Zlib/Adler32.cs
+++ b/src/ImageSharp/Formats/Png/Zlib/Adler32.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.Formats.Png.Zlib
{
@@ -74,9 +75,17 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
}
///
- public long Value => this.checksum;
+ public long Value
+ {
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ get
+ {
+ return this.checksum;
+ }
+ }
///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Reset()
{
this.checksum = 1;
@@ -88,6 +97,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
///
/// The data value to add. The high byte of the int is ignored.
///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Update(int value)
{
// We could make a length 1 byte array and call update again, but I
@@ -102,6 +112,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
}
///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Update(byte[] buffer)
{
if (buffer == null)
@@ -113,32 +124,14 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
}
///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Update(byte[] buffer, int offset, int count)
{
- if (buffer == null)
- {
- throw new ArgumentNullException(nameof(buffer));
- }
-
- if (offset < 0)
- {
- throw new ArgumentOutOfRangeException(nameof(offset), "cannot be negative");
- }
-
- if (count < 0)
- {
- throw new ArgumentOutOfRangeException(nameof(count), "cannot be negative");
- }
-
- if (offset >= buffer.Length)
- {
- throw new ArgumentOutOfRangeException(nameof(offset), "not a valid index into buffer");
- }
-
- if (offset + count > buffer.Length)
- {
- throw new ArgumentOutOfRangeException(nameof(count), "exceeds buffer size");
- }
+ DebugGuard.NotNull(buffer, nameof(buffer));
+ DebugGuard.MustBeGreaterThanOrEqualTo(offset, 0, nameof(offset));
+ DebugGuard.MustBeGreaterThanOrEqualTo(count, 0, nameof(count));
+ DebugGuard.MustBeLessThan(offset, buffer.Length, nameof(offset));
+ DebugGuard.MustBeLessThanOrEqualTo(offset + count, buffer.Length, nameof(count));
// (By Per Bothner)
uint s1 = this.checksum & 0xFFFF;
@@ -169,4 +162,4 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
this.checksum = (s2 << 16) | s1;
}
}
-}
+}
\ No newline at end of file
diff --git a/src/ImageSharp/Formats/Png/Zlib/Crc32.cs b/src/ImageSharp/Formats/Png/Zlib/Crc32.cs
index 14a29b7af..bd686f2b9 100644
--- a/src/ImageSharp/Formats/Png/Zlib/Crc32.cs
+++ b/src/ImageSharp/Formats/Png/Zlib/Crc32.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.Formats.Png.Zlib
{
@@ -108,18 +109,15 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
///
public long Value
{
- get
- {
- return this.crc;
- }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ get => this.crc;
- set
- {
- this.crc = (uint)value;
- }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ set => this.crc = (uint)value;
}
///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Reset()
{
this.crc = 0;
@@ -129,6 +127,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
/// Updates the checksum with the given value.
///
/// The byte is taken as the lower 8 bits of value.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Update(int value)
{
this.crc ^= CrcSeed;
@@ -137,6 +136,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
}
///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Update(byte[] buffer)
{
if (buffer == null)
@@ -148,22 +148,13 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
}
///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Update(byte[] buffer, int offset, int count)
{
- if (buffer == null)
- {
- throw new ArgumentNullException(nameof(buffer));
- }
-
- if (count < 0)
- {
- throw new ArgumentOutOfRangeException(nameof(count), "Count cannot be less than zero");
- }
-
- if (offset < 0 || offset + count > buffer.Length)
- {
- throw new ArgumentOutOfRangeException(nameof(offset));
- }
+ DebugGuard.NotNull(buffer, nameof(buffer));
+ DebugGuard.MustBeGreaterThanOrEqualTo(count, 0, nameof(count));
+ DebugGuard.MustBeGreaterThanOrEqualTo(offset, 0, nameof(offset));
+ DebugGuard.MustBeLessThanOrEqualTo(offset + count, buffer.Length, nameof(count));
this.crc ^= CrcSeed;
diff --git a/tests/ImageSharp.Benchmarks/Image/DecodePng.cs b/tests/ImageSharp.Benchmarks/Image/DecodePng.cs
index b9a9d5cfa..eb13cf929 100644
--- a/tests/ImageSharp.Benchmarks/Image/DecodePng.cs
+++ b/tests/ImageSharp.Benchmarks/Image/DecodePng.cs
@@ -10,29 +10,39 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
using BenchmarkDotNet.Attributes;
+ using SixLabors.ImageSharp.Tests;
+
using CoreImage = ImageSharp.Image;
using CoreSize = SixLabors.Primitives.Size;
+ [Config(typeof(Config.ShortClr))]
public class DecodePng : BenchmarkBase
{
private byte[] pngBytes;
+ private string TestImageFullPath => Path.Combine(
+ TestEnvironment.InputImagesDirectoryFullPath,
+ this.TestImage);
+
+ [Params(TestImages.Png.Splash)]
+ public string TestImage { get; set; }
+
[GlobalSetup]
public void ReadImages()
{
if (this.pngBytes == null)
{
- this.pngBytes = File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Png/splash.png");
+ this.pngBytes = File.ReadAllBytes(this.TestImageFullPath);
}
}
[Benchmark(Baseline = true, Description = "System.Drawing Png")]
public Size PngSystemDrawing()
{
- using (MemoryStream memoryStream = new MemoryStream(this.pngBytes))
+ using (var memoryStream = new MemoryStream(this.pngBytes))
{
- using (Image image = Image.FromStream(memoryStream))
+ using (var image = Image.FromStream(memoryStream))
{
return image.Size;
}
@@ -42,9 +52,9 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
[Benchmark(Description = "ImageSharp Png")]
public CoreSize PngCore()
{
- using (MemoryStream memoryStream = new MemoryStream(this.pngBytes))
+ using (var memoryStream = new MemoryStream(this.pngBytes))
{
- using (Image image = CoreImage.Load(memoryStream))
+ using (var image = CoreImage.Load(memoryStream))
{
return new CoreSize(image.Width, image.Height);
}
diff --git a/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs
index 6f8517499..d4a395ad4 100644
--- a/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs
+++ b/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs
@@ -50,6 +50,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
TestImages.Jpeg.Progressive.Festzug, TestImages.Jpeg.Progressive.Bad.BadEOF,
TestImages.Jpeg.Issues.BadCoeffsProgressive178,
TestImages.Jpeg.Issues.MissingFF00ProgressiveGirl159,
+ TestImages.Jpeg.Issues.BadZigZagProgressive385
};
private static readonly Dictionary CustomToleranceValues = new Dictionary
@@ -67,6 +68,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
[TestImages.Jpeg.Progressive.Festzug] = 0.02f / 100,
[TestImages.Jpeg.Progressive.Fb] = 0.16f / 100,
[TestImages.Jpeg.Progressive.Progress] = 0.31f / 100,
+ [TestImages.Jpeg.Issues.BadZigZagProgressive385] = 0.23f / 100,
};
public const PixelTypes CommonNonDefaultPixelTypes = PixelTypes.Rgba32 | PixelTypes.Argb32 | PixelTypes.RgbaVector;
diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs
index 9054ddeb6..ed8f9c646 100644
--- a/tests/ImageSharp.Tests/TestImages.cs
+++ b/tests/ImageSharp.Tests/TestImages.cs
@@ -125,6 +125,7 @@ namespace SixLabors.ImageSharp.Tests
public const string CriticalEOF214 = "Jpg/issues/Issue214-CriticalEOF.jpg";
public const string MissingFF00ProgressiveGirl159 = "Jpg/issues/Issue159-MissingFF00-Progressive-Girl.jpg";
public const string BadCoeffsProgressive178 = "Jpg/issues/Issue178-BadCoeffsProgressive-Lemon.jpg";
+ public const string BadZigZagProgressive385 = "Jpg/issues/Issue385-BadZigZag-Progressive.jpg";
}
public static readonly string[] All = Baseline.All.Concat(Progressive.All).ToArray();
diff --git a/tests/Images/External b/tests/Images/External
index f99c2ea41..ab7c90362 160000
--- a/tests/Images/External
+++ b/tests/Images/External
@@ -1 +1 @@
-Subproject commit f99c2ea41419cb3b3e80e5beeab611682252df78
+Subproject commit ab7c90362a4881c790c6f264f400dcf4b4dea0ce
diff --git a/tests/Images/Input/Jpg/issues/Issue385-BadZigZag-Progressive.jpg b/tests/Images/Input/Jpg/issues/Issue385-BadZigZag-Progressive.jpg
new file mode 100644
index 000000000..3cb840622
Binary files /dev/null and b/tests/Images/Input/Jpg/issues/Issue385-BadZigZag-Progressive.jpg differ