/// <summary> /// Constructor which takes an existing APNGChunk object and /// verifies that its type matches that which is expected /// </summary> /// <param name="chunk">The APNGChunk to copy</param> /// <param name="expectedType">The input APNGChunk expected type</param> public APNGChunk(APNGChunk chunk, String expectedType) { // Copy the existing chunks members chunkLength = chunk.chunkLength; chunkType = chunk.chunkType; chunkData = chunk.chunkData; chunkCRC = chunk.chunkCRC; // Verify the chunk type is as expected if (ChunkType != expectedType) { throw new ArgumentException( String.Format("Specified chunk type is not {0} as expected", expectedType)); } // Parse the chunk's data ParseData(chunkData); }
/// <summary> /// Attempts to load an APNG from the specified file name /// </summary> /// <param name="filename">Name of the APNG file to load</param> public void Load(string filename) { chunks = new List <APNGChunk>(); pngs = new List <PNG>(); // Open the file for reading Stream stream = File.OpenRead(filename); // Create a new header (should be 1 per file) and // read it from the stream APNGHeader header = new APNGHeader(); try { header.Read(stream); } catch (Exception) { stream.Close(); throw; } APNGChunk chunk; PNG png = null; // Read chunks from the stream until we reach the MEND chunk do { // Read a generic Chunk chunk = new APNGChunk(); try { chunk.Read(stream); } catch (Exception) { stream.Close(); throw; } // Take a look at the chunk type and decide what derived class to // use to create a specific chunk switch (chunk.ChunkType) { case acTLChunk.NAME: if (headerChunk != null) { throw new ApplicationException(String.Format( "Only one chunk of type {0} is allowed", chunk.ChunkType)); } chunk = headerChunk = new acTLChunk(chunk); break; case MENDChunk.NAME: chunk = new MENDChunk(chunk); break; case TERMChunk.NAME: chunk = new TERMChunk(chunk); break; case BACKChunk.NAME: chunk = new BACKChunk(chunk); break; case BKGDChunk.NAME: chunk = new BKGDChunk(chunk); break; case fcTLChunk.NAME: // This is the beginning of a new embedded PNG chunk = new fcTLChunk(chunk); png = new PNG(); png.FCTL = chunk as fcTLChunk; png.IHDR = ihdrChunk; pngs.Add(png); break; case IHDRChunk.NAME: chunk = new IHDRChunk(chunk); ihdrChunk = chunk as IHDRChunk; break; case IDATChunk.NAME: chunk = new IDATChunk(chunk); if (png != null) { png.IDAT = chunk as IDATChunk; } break; case fdATChunk.NAME: chunk = new fdATChunk(chunk); if (png != null) { chunk.ChunkType = IDATChunk.NAME; png.IDAT = new IDATChunk(chunk); } break; case IENDChunk.NAME: chunk = new IENDChunk(chunk); for (int i = 0; i < pngs.Count; i++) { pngs[i].IEND = chunk as IENDChunk; } break; default: break; } // Add the chunk to our list of chunks chunks.Add(chunk); }while (chunk.ChunkType != IENDChunk.NAME); }
/// <summary> /// Constructor /// </summary> /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param> public fdATChunk(APNGChunk chunk) : base(chunk, NAME) { }
///// <summary> ///// The APNG frame rate ///// </summary> //private uint ticksPerSecond; ///// <summary> ///// The APNG layer count ///// </summary> //private uint nominalLayerCount; ///// <summary> ///// The APNG frame count ///// </summary> //private uint nominalFrameCount; ///// <summary> ///// The APNG play time ///// </summary> //private uint nominalPlayTime; ///// <summary> ///// The APNG simplicity profile ///// </summary> //private uint simplicityProfile; /// <summary> /// Constructor /// </summary> /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param> public acTLChunk(APNGChunk chunk) : base(chunk, NAME) { }
/// <summary> /// Constructor /// </summary> /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param> public IENDChunk(APNGChunk chunk) : base(chunk, NAME) { }
/// <summary> /// Constructor /// </summary> /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param> public IHDRChunk(APNGChunk chunk) : base(chunk, NAME) { }
/// <summary> /// Constructor /// </summary> /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param> public BACKChunk(APNGChunk chunk) : base(chunk, NAME) { }
/// <summary> /// Constructor /// </summary> /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param> public BKGDChunk(APNGChunk chunk) : base(chunk, NAME) { }
/// <summary> /// Constructor /// </summary> /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param> public TERMChunk(APNGChunk chunk) : base(chunk, NAME) { }