mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-03-19 16:06:35 +08:00
项目结构调整
This commit is contained in:
86
Others/WpfAnimatedGif/Decoding/GifFile.cs
Normal file
86
Others/WpfAnimatedGif/Decoding/GifFile.cs
Normal file
@@ -0,0 +1,86 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user