Spanify PngBuilder

This commit is contained in:
Jason Nelson 2024-04-01 19:56:27 -07:00 committed by BobLd
parent 435da86a25
commit 775d1343ae
5 changed files with 35 additions and 11 deletions

View File

@ -1,5 +1,6 @@
namespace UglyToad.PdfPig.IO
{
using System;
using System.IO;
internal class StreamWrapper : Stream
@ -36,6 +37,13 @@
Stream.Write(buffer, offset, count);
}
#if NET6_0_OR_GREATER
public override void Write(ReadOnlySpan<byte> buffer)
{
Stream.Write(buffer);
}
#endif
public override bool CanRead => Stream.CanRead;
public override bool CanSeek => Stream.CanSeek;

View File

@ -1,8 +1,10 @@
namespace UglyToad.PdfPig.Images.Png
{
using System;
internal readonly struct HeaderValidationResult
{
public static readonly byte[] ExpectedHeader = {
public static ReadOnlySpan<byte> ExpectedHeader => [
137,
80,
78,
@ -11,7 +13,7 @@
10,
26,
10
};
];
public int Byte1 { get; }

View File

@ -8,9 +8,9 @@
/// </summary>
internal readonly struct ImageHeader
{
internal static readonly byte[] HeaderBytes = {
internal static ReadOnlySpan<byte> HeaderBytes => [
73, 72, 68, 82
};
];
private static readonly IReadOnlyDictionary<ColorType, HashSet<byte>> PermittedBitDepths = new Dictionary<ColorType, HashSet<byte>>
{

View File

@ -80,7 +80,7 @@
/// </summary>
public void Save(Stream outputStream)
{
outputStream.Write(HeaderValidationResult.ExpectedHeader, 0, HeaderValidationResult.ExpectedHeader.Length);
outputStream.Write(HeaderValidationResult.ExpectedHeader);
var stream = new PngStreamWriteHelper(outputStream);
@ -106,12 +106,12 @@
var imageData = Compress(rawData);
stream.WriteChunkLength(imageData.Length);
stream.WriteChunkHeader("IDAT"u8.ToArray());
stream.Write(imageData, 0, imageData.Length);
stream.WriteChunkHeader("IDAT"u8);
stream.Write(imageData);
stream.WriteCrc();
stream.WriteChunkLength(0);
stream.WriteChunkHeader("IEND"u8.ToArray());
stream.WriteChunkHeader("IEND"u8);
stream.WriteCrc();
}
@ -156,4 +156,4 @@
}
}
}
}
}

View File

@ -31,10 +31,10 @@
public override void Flush() => inner.Flush();
public void WriteChunkHeader(byte[] header)
public void WriteChunkHeader(ReadOnlySpan<byte> header)
{
written.Clear();
Write(header, 0, header.Length);
Write(header);
}
public void WriteChunkLength(int length)
@ -54,6 +54,20 @@
inner.Write(buffer, offset, count);
}
#if NET8_0_OR_GREATER
public override void Write(ReadOnlySpan<byte> buffer)
{
written.AddRange(buffer);
inner.Write(buffer);
}
#else
public void Write(ReadOnlySpan<byte> buffer)
{
written.AddRange(buffer.ToArray());
inner.Write(buffer);
}
#endif
public void WriteCrc()
{
var result = (int)Crc32.Calculate(written);