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 namespace UglyToad.PdfPig.IO
{ {
using System;
using System.IO; using System.IO;
internal class StreamWrapper : Stream internal class StreamWrapper : Stream
@ -36,6 +37,13 @@
Stream.Write(buffer, offset, count); 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 CanRead => Stream.CanRead;
public override bool CanSeek => Stream.CanSeek; public override bool CanSeek => Stream.CanSeek;

View File

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

View File

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

View File

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

View File

@ -31,10 +31,10 @@
public override void Flush() => inner.Flush(); public override void Flush() => inner.Flush();
public void WriteChunkHeader(byte[] header) public void WriteChunkHeader(ReadOnlySpan<byte> header)
{ {
written.Clear(); written.Clear();
Write(header, 0, header.Length); Write(header);
} }
public void WriteChunkLength(int length) public void WriteChunkLength(int length)
@ -54,6 +54,20 @@
inner.Write(buffer, offset, count); 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() public void WriteCrc()
{ {
var result = (int)Crc32.Calculate(written); var result = (int)Crc32.Calculate(written);