mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-03-03 00:00:57 +08:00
87 lines
2.8 KiB
C#
87 lines
2.8 KiB
C#
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
|
|
namespace WpfAnimatedGif.Decoding
|
|
{
|
|
internal class GifFile
|
|
{
|
|
public GifHeader Header { get; private set; }
|
|
public GifColor[] GlobalColorTable { get; set; }
|
|
public IList<GifFrame> Frames { get; set; }
|
|
public IList<GifExtension> Extensions { get; set; }
|
|
public ushort RepeatCount { get; set; }
|
|
|
|
private GifFile()
|
|
{
|
|
}
|
|
|
|
internal static GifFile ReadGifFile(Stream stream, bool metadataOnly)
|
|
{
|
|
var file = new GifFile();
|
|
file.Read(stream, metadataOnly);
|
|
return file;
|
|
}
|
|
|
|
private void Read(Stream stream, bool metadataOnly)
|
|
{
|
|
Header = GifHeader.ReadHeader(stream);
|
|
|
|
if (Header.LogicalScreenDescriptor.HasGlobalColorTable)
|
|
{
|
|
GlobalColorTable = GifHelpers.ReadColorTable(stream, Header.LogicalScreenDescriptor.GlobalColorTableSize);
|
|
}
|
|
ReadFrames(stream, metadataOnly);
|
|
|
|
var netscapeExtension =
|
|
Extensions
|
|
.OfType<GifApplicationExtension>()
|
|
.FirstOrDefault(GifHelpers.IsNetscapeExtension);
|
|
|
|
if (netscapeExtension != null)
|
|
RepeatCount = GifHelpers.GetRepeatCount(netscapeExtension);
|
|
else
|
|
RepeatCount = 1;
|
|
}
|
|
|
|
private void ReadFrames(Stream stream, bool metadataOnly)
|
|
{
|
|
List<GifFrame> frames = new List<GifFrame>();
|
|
List<GifExtension> controlExtensions = new List<GifExtension>();
|
|
List<GifExtension> specialExtensions = new List<GifExtension>();
|
|
while (true)
|
|
{
|
|
var block = GifBlock.ReadBlock(stream, controlExtensions, metadataOnly);
|
|
|
|
if (block.Kind == GifBlockKind.GraphicRendering)
|
|
controlExtensions = new List<GifExtension>();
|
|
|
|
if (block is GifFrame)
|
|
{
|
|
frames.Add((GifFrame)block);
|
|
}
|
|
else if (block is GifExtension)
|
|
{
|
|
var extension = (GifExtension)block;
|
|
switch (extension.Kind)
|
|
{
|
|
case GifBlockKind.Control:
|
|
controlExtensions.Add(extension);
|
|
break;
|
|
case GifBlockKind.SpecialPurpose:
|
|
specialExtensions.Add(extension);
|
|
break;
|
|
}
|
|
}
|
|
else if (block is GifTrailer)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
this.Frames = frames.AsReadOnly();
|
|
this.Extensions = specialExtensions.AsReadOnly();
|
|
}
|
|
}
|
|
}
|