Browse Source

Add Header

pull/2899/head
Betta_Fish 1 year ago
parent
commit
aac7d3ab8a
  1. 35
      src/ImageSharp/Formats/Ani/AniDecoder.cs
  2. 35
      src/ImageSharp/Formats/Ani/AniDecoderCore.cs
  3. 34
      src/ImageSharp/Formats/Ani/AniHeader.cs
  4. 23
      src/ImageSharp/Formats/Ani/AniMetadata.cs

35
src/ImageSharp/Formats/Ani/AniDecoder.cs

@ -0,0 +1,35 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Formats.Ani;
internal sealed class AniDecoder : ImageDecoder
{
private AniDecoder()
{
}
/// <summary>
/// Gets the shared instance.
/// </summary>
public static AniDecoder Instance { get; } = new();
protected override Image<TPixel> Decode<TPixel>(DecoderOptions options, Stream stream, CancellationToken cancellationToken)
{
Guard.NotNull(options, nameof(options));
Guard.NotNull(stream, nameof(stream));
Image<TPixel> image = new AniDecoderCore(options).Decode<TPixel>(options.Configuration, stream, cancellationToken);
ScaleToTargetSize(options, image);
return image;
}
protected override Image Decode(DecoderOptions options, Stream stream, CancellationToken cancellationToken) => this.Decode<Rgba32>(options, stream, cancellationToken);
protected override ImageInfo Identify(DecoderOptions options, Stream stream, CancellationToken cancellationToken)
{
Guard.NotNull(options, nameof(options));
Guard.NotNull(stream, nameof(stream));
return new AniDecoderCore(options).Identify(options.Configuration, stream, cancellationToken);
}
}

35
src/ImageSharp/Formats/Ani/AniDecoderCore.cs

@ -0,0 +1,35 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using SixLabors.ImageSharp.Formats.Icon;
using SixLabors.ImageSharp.IO;
namespace SixLabors.ImageSharp.Formats.Ani;
internal class AniDecoderCore : ImageDecoderCore
{
public AniDecoderCore(DecoderOptions options)
: base(options)
{
}
protected override Image<TPixel> Decode<TPixel>(BufferedReadStream stream, CancellationToken cancellationToken)
{
this.ReadHeader(stream);
throw new NotImplementedException();
}
protected override ImageInfo Identify(BufferedReadStream stream, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
private void ReadHeader(Stream stream)
{
// Skip the identifier
stream.Skip(12);
Span<byte> buffer = stackalloc byte[AniHeader.Size];
_ = stream.Read(buffer);
AniHeader header = AniHeader.Parse(buffer);
}
}

34
src/ImageSharp/Formats/Ani/AniHeader.cs

@ -0,0 +1,34 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System.Runtime.InteropServices;
namespace SixLabors.ImageSharp.Formats.Ani;
[StructLayout(LayoutKind.Sequential, Pack = 1, Size = Size)]
internal readonly struct AniHeader
{
public const int Size = 36;
public ushort Frames { get; }
public ushort Steps { get; }
public ushort Width { get; }
public ushort Height { get; }
public ushort BitCount { get; }
public ushort Planes { get; }
public ushort DisplayRate { get; }
public ushort Flags { get; }
public static AniHeader Parse(in ReadOnlySpan<byte> data)
=> MemoryMarshal.Cast<byte, AniHeader>(data)[0];
public readonly unsafe void WriteTo(in Stream stream)
=> stream.Write(MemoryMarshal.Cast<AniHeader, byte>([this]));
}

23
src/ImageSharp/Formats/Ani/AniMetadata.cs

@ -0,0 +1,23 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Formats.Ani;
internal class AniMetadata : IFormatMetadata<AniMetadata>
{
public static AniMetadata FromFormatConnectingMetadata(FormatConnectingMetadata metadata) => throw new NotImplementedException();
public void AfterImageApply<TPixel>(Image<TPixel> destination)
where TPixel : unmanaged, IPixel<TPixel> => throw new NotImplementedException();
public IDeepCloneable DeepClone() => throw new NotImplementedException();
public PixelTypeInfo GetPixelTypeInfo() => throw new NotImplementedException();
public FormatConnectingMetadata ToFormatConnectingMetadata() => throw new NotImplementedException();
AniMetadata IDeepCloneable<AniMetadata>.DeepClone() => throw new NotImplementedException();
}
Loading…
Cancel
Save