using System.Collections.Generic; using System.IO; namespace Developpez.Dotnet.Windows.Behaviors.Gif { internal class GifFile { public GifHeader Header { get; private set; } public GifColor[] GlobalColorTable { get; set; } public IList Frames { get; set; } public IList Extensions { 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); } private void ReadFrames(Stream stream, bool metadataOnly) { List frames = new List(); List controlExtensions = new List(); List specialExtensions = new List(); while (true) { var block = GifBlock.ReadBlock(stream, controlExtensions, metadataOnly); if (block.Kind == GifBlockKind.GraphicRendering) controlExtensions = new List(); 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; default: // Just ignore plain text extensions, as most software don't support them. break; } } else if (block is GifTrailer) { break; } } this.Frames = frames.AsReadOnly(); this.Extensions = specialExtensions.AsReadOnly(); } } }