124 lines
3.6 KiB
C#
124 lines
3.6 KiB
C#
using System;
|
|
using System.IO;
|
|
using UnityEngine;
|
|
|
|
namespace UnityEditor.U2D.Aseprite
|
|
{
|
|
/// <summary>
|
|
/// Aseprite Chunk Types.
|
|
/// </summary>
|
|
public enum ChunkTypes
|
|
{
|
|
/// <summary>Default type</summary>
|
|
None = 0,
|
|
/// <summary>Old palette data</summary>
|
|
OldPalette = 0x0004,
|
|
/// <summary>Second old palette data - Not in use</summary>
|
|
OldPalette2 = 0x0011,
|
|
/// <summary>Layer data</summary>
|
|
Layer = 0x2004,
|
|
/// <summary>Cell data</summary>
|
|
Cell = 0x2005,
|
|
/// <summary>Extra cell data - Not in use</summary>
|
|
CellExtra = 0x2006,
|
|
/// <summary>Color profile data</summary>
|
|
ColorProfile = 0x2007,
|
|
/// <summary>External files data - Not in use</summary>
|
|
ExternalFiles = 0x2008,
|
|
/// <summary>Mask data - Not in use</summary>
|
|
Mask = 0x2016,
|
|
/// <summary>Path data - Not in use</summary>
|
|
Path = 0x2017,
|
|
/// <summary>Tag data</summary>
|
|
Tags = 0x2018,
|
|
/// <summary>Palette data</summary>
|
|
Palette = 0x2019,
|
|
/// <summary>User data</summary>
|
|
UserData = 0x2020,
|
|
/// <summary>Slice data - Not in use</summary>
|
|
Slice = 0x2022,
|
|
/// <summary>Tile set data - Not in use</summary>
|
|
Tileset = 0x2023
|
|
}
|
|
|
|
/// <summary>
|
|
/// The header of each chunk.
|
|
/// </summary>
|
|
public class ChunkHeader
|
|
{
|
|
/// <summary>
|
|
/// The stride of the chunk header in bytes.
|
|
/// </summary>
|
|
public const int stride = 6;
|
|
/// <summary>
|
|
/// The size of the chunk in bytes.
|
|
/// </summary>
|
|
public uint chunkSize { get; private set; }
|
|
/// <summary>
|
|
/// The type of the chunk.
|
|
/// </summary>
|
|
public ChunkTypes chunkType { get; private set; }
|
|
|
|
internal void Read(BinaryReader reader)
|
|
{
|
|
chunkSize = reader.ReadUInt32();
|
|
chunkType = (ChunkTypes)reader.ReadUInt16();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Base class for all chunks.
|
|
/// </summary>
|
|
public abstract class BaseChunk : IDisposable
|
|
{
|
|
/// <summary>
|
|
/// The type of the chunk.
|
|
/// </summary>
|
|
public virtual ChunkTypes chunkType => ChunkTypes.None;
|
|
|
|
/// <summary>
|
|
/// The size of the chunk in bytes.
|
|
/// </summary>
|
|
protected readonly uint m_ChunkSize;
|
|
|
|
/// <summary>
|
|
/// Constructor.
|
|
/// </summary>
|
|
/// <param name="chunkSize">The size of the chunk in bytes.</param>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Implement this method to read the chunk data.
|
|
/// </summary>
|
|
/// <param name="reader">The active binary reader of the file.</param>
|
|
protected abstract void InternalRead(BinaryReader reader);
|
|
|
|
/// <summary>
|
|
/// Implement this method to dispose of the chunk data.
|
|
/// </summary>
|
|
public virtual void Dispose() { }
|
|
}
|
|
}
|