Browse Source

Ensure buffer is always aligned and fix tests

pull/549/head
James Jackson-South 8 years ago
parent
commit
f64f2b0899
  1. 11
      src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/DoubleBufferedStreamReader.cs
  2. 11
      tests/ImageSharp.Tests/Formats/Jpg/DoubleBufferedStreamReaderTests.cs

11
src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/DoubleBufferedStreamReader.cs

@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components
internal class DoubleBufferedStreamReader : IDisposable internal class DoubleBufferedStreamReader : IDisposable
{ {
/// <summary> /// <summary>
/// The length, in bytes, of the chunk /// The length, in bytes, of the buffering chunk
/// </summary> /// </summary>
public const int ChunkLength = 4096; public const int ChunkLength = 4096;
@ -38,7 +38,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components
{ {
this.stream = stream; this.stream = stream;
this.Length = stream.Length; this.Length = stream.Length;
this.buffer = memoryManager.AllocateCleanManagedByteBuffer(ChunkLength); this.buffer = memoryManager.AllocateCleanManagedByteBuffer(ChunkLength);
this.chunk = this.buffer.Array; this.chunk = this.buffer.Array;
} }
@ -62,7 +61,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components
{ {
// Reset everything. It's easier than tracking. // Reset everything. It's easier than tracking.
this.position = value; this.position = value;
this.stream.Seek(this.position, SeekOrigin.Begin);
this.bytesRead = ChunkLength; this.bytesRead = ChunkLength;
} }
} }
@ -96,8 +94,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components
/// <param name="count">The number of bytes to skip</param> /// <param name="count">The number of bytes to skip</param>
public void Skip(int count) public void Skip(int count)
{ {
this.position += count; this.Position += count;
this.bytesRead += count;
} }
/// <summary> /// <summary>
@ -144,9 +141,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components
this.stream.Seek(this.position, SeekOrigin.Begin); this.stream.Seek(this.position, SeekOrigin.Begin);
n = this.stream.Read(buffer, offset, count); n = this.stream.Read(buffer, offset, count);
// Ensure next read fills the chunk this.Position += count;
this.bytesRead = ChunkLength;
this.position += count;
} }
return Math.Max(n, 0); return Math.Max(n, 0);

11
tests/ImageSharp.Tests/Formats/Jpg/DoubleBufferedStreamReaderTests.cs

@ -4,19 +4,22 @@
using System; using System;
using System.IO; using System.IO;
using SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components; using SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components;
using SixLabors.ImageSharp.Memory;
using Xunit; using Xunit;
namespace SixLabors.ImageSharp.Tests.Formats.Jpg namespace SixLabors.ImageSharp.Tests.Formats.Jpg
{ {
public class DoubleBufferedStreamReaderTests public class DoubleBufferedStreamReaderTests
{ {
private MemoryManager manager = Configuration.Default.MemoryManager;
[Fact] [Fact]
public void DoubleBufferedStreamReaderCanReadSingleByteFromOrigin() public void DoubleBufferedStreamReaderCanReadSingleByteFromOrigin()
{ {
using (MemoryStream stream = CreateTestStream()) using (MemoryStream stream = CreateTestStream())
{ {
byte[] expected = stream.ToArray(); byte[] expected = stream.ToArray();
var reader = new DoubleBufferedStreamReader(stream); var reader = new DoubleBufferedStreamReader(this.manager, stream);
Assert.Equal(expected[0], reader.ReadByte()); Assert.Equal(expected[0], reader.ReadByte());
@ -32,7 +35,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
using (MemoryStream stream = CreateTestStream()) using (MemoryStream stream = CreateTestStream())
{ {
byte[] expected = stream.ToArray(); byte[] expected = stream.ToArray();
var reader = new DoubleBufferedStreamReader(stream); var reader = new DoubleBufferedStreamReader(this.manager, stream);
for (int i = 0; i < expected.Length; i++) for (int i = 0; i < expected.Length; i++)
{ {
@ -64,7 +67,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
{ {
byte[] buffer = new byte[2]; byte[] buffer = new byte[2];
byte[] expected = stream.ToArray(); byte[] expected = stream.ToArray();
var reader = new DoubleBufferedStreamReader(stream); var reader = new DoubleBufferedStreamReader(this.manager, stream);
Assert.Equal(2, reader.Read(buffer, 0, 2)); Assert.Equal(2, reader.Read(buffer, 0, 2));
Assert.Equal(expected[0], buffer[0]); Assert.Equal(expected[0], buffer[0]);
@ -83,7 +86,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
{ {
byte[] buffer = new byte[2]; byte[] buffer = new byte[2];
byte[] expected = stream.ToArray(); byte[] expected = stream.ToArray();
var reader = new DoubleBufferedStreamReader(stream); var reader = new DoubleBufferedStreamReader(this.manager, stream);
for (int i = 0, o = 0; i < expected.Length / 2; i++, o += 2) for (int i = 0, o = 0; i < expected.Length / 2; i++, o += 2)
{ {

Loading…
Cancel
Save