using System;
using System.IO;
using UnityEngine;
namespace UnityEditor.U2D.Aseprite
{
///
/// Aseprite Chunk Types.
///
public enum ChunkTypes
{
/// Default type
None = 0,
/// Old palette data
OldPalette = 0x0004,
/// Second old palette data - Not in use
OldPalette2 = 0x0011,
/// Layer data
Layer = 0x2004,
/// Cell data
Cell = 0x2005,
/// Extra cell data - Not in use
CellExtra = 0x2006,
/// Color profile data
ColorProfile = 0x2007,
/// External files data - Not in use
ExternalFiles = 0x2008,
/// Mask data - Not in use
Mask = 0x2016,
/// Path data - Not in use
Path = 0x2017,
/// Tag data
Tags = 0x2018,
/// Palette data
Palette = 0x2019,
/// User data
UserData = 0x2020,
/// Slice data - Not in use
Slice = 0x2022,
/// Tile set data - Not in use
Tileset = 0x2023
}
///
/// The header of each chunk.
///
public class ChunkHeader
{
///
/// The stride of the chunk header in bytes.
///
public const int stride = 6;
///
/// The size of the chunk in bytes.
///
public uint chunkSize { get; private set; }
///
/// The type of the chunk.
///
public ChunkTypes chunkType { get; private set; }
internal void Read(BinaryReader reader)
{
chunkSize = reader.ReadUInt32();
chunkType = (ChunkTypes)reader.ReadUInt16();
}
}
///
/// Base class for all chunks.
///
public abstract class BaseChunk : IDisposable
{
///
/// The type of the chunk.
///
public virtual ChunkTypes chunkType => ChunkTypes.None;
///
/// The size of the chunk in bytes.
///
protected readonly uint m_ChunkSize;
///
/// Constructor.
///
/// The size of the chunk in bytes.
protected BaseChunk(uint chunkSize)
{
m_ChunkSize = chunkSize;
}
internal bool Read(BinaryReader reader)
{
var bytes = reader.ReadBytes((int)m_ChunkSize - ChunkHeader.stride);
using var memoryStream = new MemoryStream(bytes);
using var chunkReader = new BinaryReader(memoryStream);
try
{
InternalRead(chunkReader);
}
catch (Exception e)
{
Debug.LogError($"Failed to read a chunk of type: {chunkType}. Skipping the chunk. \nException: {e}");
return false;
}
return true;
}
///
/// Implement this method to read the chunk data.
///
/// The active binary reader of the file.
protected abstract void InternalRead(BinaryReader reader);
///
/// Implement this method to dispose of the chunk data.
///
public virtual void Dispose() { }
}
}