Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param>
 public fdATChunk(APNGChunk chunk)
     : base(chunk, NAME)
 {
 }
Beispiel #4
0
        ///// <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)
        {
        }
Beispiel #5
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param>
 public IENDChunk(APNGChunk chunk)
     : base(chunk, NAME)
 {
 }
Beispiel #6
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param>
 public IHDRChunk(APNGChunk chunk)
     : base(chunk, NAME)
 {
 }
Beispiel #7
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param>
 public BACKChunk(APNGChunk chunk)
     : base(chunk, NAME)
 {
 }
Beispiel #8
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param>
 public BKGDChunk(APNGChunk chunk)
     : base(chunk, NAME)
 {
 }
Beispiel #9
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="chunk">The APNG chunk containing the data for this specific chunk</param>
 public TERMChunk(APNGChunk chunk)
     : base(chunk, NAME)
 {
 }