using Aseprite.Chunks; using System.Collections.Generic; using System.IO; using UnityEngine; namespace Aseprite { public class Frame { public AseFile File = null; public uint Length { get; private set; } public ushort MagicNumber { get; private set; } public ushort OldChunksCount { get; private set; } public uint ChunksCount { get; private set; } public ushort FrameDuration { get; private set; } public List Chunks { get; private set; } private bool useNewChunkCount = true; public uint GetChunkCount() { if (useNewChunkCount) return ChunksCount; else return OldChunksCount; } public Frame(AseFile file, BinaryReader reader) { File = file; Length = reader.ReadUInt32(); MagicNumber = reader.ReadUInt16(); OldChunksCount = reader.ReadUInt16(); FrameDuration = reader.ReadUInt16(); reader.ReadBytes(2); // For Future ChunksCount = reader.ReadUInt32(); if (ChunksCount == 0) useNewChunkCount = false; Chunks = new List(); for (int i = 0; i < GetChunkCount(); i++) { Chunk chunk = Chunk.ReadChunk(this, reader); if (chunk != null) Chunks.Add(chunk); } } public T GetChunk() where T : Chunk { for (int i = 0; i < Chunks.Count; i++) { if (Chunks[i] is T) { return (T)Chunks[i]; } } return null; } public T GetCelChunk(int layerIndex) where T : CelChunk { for (int i = 0; i < Chunks.Count; i++) { if (Chunks[i] is T && (Chunks[i] as CelChunk).LayerIndex == layerIndex) { return (T)Chunks[i]; } } return null; } public List GetChunks() where T : Chunk { List chunks = new List(); for (int i = 0; i < Chunks.Count; i++) { if (Chunks[i] is T) { chunks.Add((T)Chunks[i]); } } return chunks; } } }