Browse Source

Eliminate allocation reading BMP header

af/merge-core
Jason Nelson 8 years ago
parent
commit
337aa3e8c5
  1. 13
      src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs
  2. 5
      src/ImageSharp/Formats/Bmp/BmpInfoHeader.cs

13
src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. // Licensed under the Apache License, Version 2.0.
using System; using System;
using System.Buffers.Binary;
using System.IO; using System.IO;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Memory;
@ -473,12 +474,14 @@ namespace SixLabors.ImageSharp.Formats.Bmp
/// </summary> /// </summary>
private void ReadInfoHeader() private void ReadInfoHeader()
{ {
#if NETCOREAPP2_1
Span<byte> buffer = stackalloc byte[BmpInfoHeader.MaxHeaderSize];
#else
byte[] buffer = new byte[BmpInfoHeader.MaxHeaderSize]; byte[] buffer = new byte[BmpInfoHeader.MaxHeaderSize];
#endif
this.stream.Read(buffer, 0, BmpInfoHeader.HeaderSizeSize); // read the header size
// read header size int headerSize = BinaryPrimitives.ReadInt32LittleEndian(buffer);
this.stream.Read(buffer, 0, BmpInfoHeader.HeaderSizeSize);
int headerSize = BitConverter.ToInt32(buffer, 0);
if (headerSize < BmpInfoHeader.CoreSize) if (headerSize < BmpInfoHeader.CoreSize)
{ {
throw new NotSupportedException($"ImageSharp does not support this BMP file. HeaderSize: {headerSize}."); throw new NotSupportedException($"ImageSharp does not support this BMP file. HeaderSize: {headerSize}.");
@ -502,7 +505,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp
else if (headerSize >= BmpInfoHeader.Size) else if (headerSize >= BmpInfoHeader.Size)
{ {
// >= 40 bytes // >= 40 bytes
this.infoHeader = BmpInfoHeader.Parse(buffer.AsSpan(0, 40)); this.infoHeader = BmpInfoHeader.Parse(buffer);
} }
else else
{ {

5
src/ImageSharp/Formats/Bmp/BmpInfoHeader.cs

@ -132,6 +132,11 @@ namespace SixLabors.ImageSharp.Formats.Bmp
/// <seealso href="https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376.aspx"/> /// <seealso href="https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376.aspx"/>
public static BmpInfoHeader Parse(ReadOnlySpan<byte> data) public static BmpInfoHeader Parse(ReadOnlySpan<byte> data)
{ {
if (data.Length != Size)
{
throw new ArgumentException(nameof(data), $"Must be 40 bytes. Was {data.Length} bytes.");
}
return MemoryMarshal.Cast<byte, BmpInfoHeader>(data)[0]; return MemoryMarshal.Cast<byte, BmpInfoHeader>(data)[0];
} }

Loading…
Cancel
Save