diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegFileMarker.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegFileMarker.cs
index 31f4efdcb..d2b0ee26e 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegFileMarker.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegFileMarker.cs
@@ -16,10 +16,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
/// The marker
/// The position within the stream
public JpegFileMarker(byte marker, long position)
+ : this(marker, position, false)
{
- this.Marker = marker;
- this.Position = position;
- this.Invalid = false;
}
///
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ScanDecoder.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ScanDecoder.cs
index 99eaf7f43..8c525335b 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ScanDecoder.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ScanDecoder.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System.Runtime.CompilerServices;
+using SixLabors.ImageSharp.IO;
namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
{
diff --git a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
index 07209bc28..3b34719a8 100644
--- a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
+++ b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
@@ -10,6 +10,7 @@ using System.Runtime.InteropServices;
using SixLabors.ImageSharp.Common.Helpers;
using SixLabors.ImageSharp.Formats.Jpeg.Components;
using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder;
+using SixLabors.ImageSharp.IO;
using SixLabors.ImageSharp.MetaData;
using SixLabors.ImageSharp.MetaData.Profiles.Exif;
using SixLabors.ImageSharp.MetaData.Profiles.Icc;
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/DoubleBufferedStreamReader.cs b/src/ImageSharp/IO/DoubleBufferedStreamReader.cs
similarity index 98%
rename from src/ImageSharp/Formats/Jpeg/Components/Decoder/DoubleBufferedStreamReader.cs
rename to src/ImageSharp/IO/DoubleBufferedStreamReader.cs
index f4527966a..94a2f2cbf 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/DoubleBufferedStreamReader.cs
+++ b/src/ImageSharp/IO/DoubleBufferedStreamReader.cs
@@ -7,8 +7,7 @@ using System.Runtime.CompilerServices;
using SixLabors.Memory;
-// TODO: This could be useful elsewhere.
-namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
+namespace SixLabors.ImageSharp.IO
{
///
/// A stream reader that add a secondary level buffer in addition to native stream buffered reading
diff --git a/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DoubleBufferedStreams.cs b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DoubleBufferedStreams.cs
index c70378464..d4cbe81e1 100644
--- a/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DoubleBufferedStreams.cs
+++ b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DoubleBufferedStreams.cs
@@ -4,8 +4,7 @@
using System;
using System.IO;
using BenchmarkDotNet.Attributes;
-
-using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder;
+using SixLabors.ImageSharp.IO;
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
diff --git a/tests/ImageSharp.Tests/Formats/Jpg/JpegFileMarkerTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/JpegFileMarkerTests.cs
new file mode 100644
index 000000000..42eea2708
--- /dev/null
+++ b/tests/ImageSharp.Tests/Formats/Jpg/JpegFileMarkerTests.cs
@@ -0,0 +1,25 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using SixLabors.ImageSharp.Formats.Jpeg;
+using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder;
+using Xunit;
+
+namespace SixLabors.ImageSharp.Tests.Formats.Jpg
+{
+ public class JpegFileMarkerTests
+ {
+ [Fact]
+ public void MarkerConstructorAssignsProperties()
+ {
+ const byte app1 = JpegConstants.Markers.APP1;
+ const int position = 5;
+ var marker = new JpegFileMarker(app1, position);
+
+ Assert.Equal(app1, marker.Marker);
+ Assert.Equal(position, marker.Position);
+ Assert.False(marker.Invalid);
+ Assert.Equal(app1.ToString("X"), marker.ToString());
+ }
+ }
+}
diff --git a/tests/ImageSharp.Tests/Formats/Jpg/DoubleBufferedStreamReaderTests.cs b/tests/ImageSharp.Tests/IO/DoubleBufferedStreamReaderTests.cs
similarity index 87%
rename from tests/ImageSharp.Tests/Formats/Jpg/DoubleBufferedStreamReaderTests.cs
rename to tests/ImageSharp.Tests/IO/DoubleBufferedStreamReaderTests.cs
index 5316ec758..4fac8d954 100644
--- a/tests/ImageSharp.Tests/Formats/Jpg/DoubleBufferedStreamReaderTests.cs
+++ b/tests/ImageSharp.Tests/IO/DoubleBufferedStreamReaderTests.cs
@@ -3,12 +3,11 @@
using System;
using System.IO;
-
-using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder;
+using SixLabors.ImageSharp.IO;
using SixLabors.Memory;
using Xunit;
-namespace SixLabors.ImageSharp.Tests.Formats.Jpg
+namespace SixLabors.ImageSharp.Tests.IO
{
public class DoubleBufferedStreamReaderTests
{
@@ -30,6 +29,24 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
}
}
+ [Fact]
+ public void DoubleBufferedStreamReaderCanReadSingleByteFromOffset()
+ {
+ using (MemoryStream stream = this.CreateTestStream())
+ {
+ byte[] expected = stream.ToArray();
+ const int offset = 5;
+ var reader = new DoubleBufferedStreamReader(this.allocator, stream);
+ reader.Position = offset;
+
+ Assert.Equal(expected[offset], reader.ReadByte());
+
+ // We've read a whole chunk but increment by 1 in our reader.
+ Assert.Equal(stream.Position, DoubleBufferedStreamReader.ChunkLength + offset);
+ Assert.Equal(offset + 1, reader.Position);
+ }
+ }
+
[Fact]
public void DoubleBufferedStreamReaderCanReadSubsequentSingleByteCorrectly()
{
@@ -139,7 +156,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
// Skip Again
reader.Skip(skip2);
- // First Skap + First Read + Second Skip
+ // First Skip + First Read + Second Skip
int position = skip + plusOne + skip2;
Assert.Equal(position, reader.Position);