public AseCelChunk(AseFrame frame, AseReader reader, int size) : base(frame) { // Keep track of read position var pos = reader.Position; LayerIndex = reader.ReadWORD(); PositionX = reader.ReadSHORT(); PositionY = reader.ReadSHORT(); Opacity = reader.ReadBYTE(); CelType = (CelType)reader.ReadWORD(); // Ignore next 7 bytes reader.ReadBYTEs(7); if (CelType == CelType.Raw) { Width = reader.ReadWORD(); Height = reader.ReadWORD(); var bytesRead = reader.Position - pos; PixelBytes = reader.ReadBYTEs(size - bytesRead); } else if (CelType == CelType.Linked) { FramePositionLink = reader.ReadWORD(); // Get a reference to our linked cell. It should be in a previous frame with a matching layer index. Debug.Assert(Frame.AseFile.Frames.Count > FramePositionLink); LinkedCel = Frame.AseFile.Frames[FramePositionLink].Chunks.OfType <AseCelChunk>().FirstOrDefault(c => c.LayerIndex == LayerIndex); Debug.Assert(LinkedCel != null); } else if (CelType == CelType.CompressedImage) { Width = reader.ReadWORD(); Height = reader.ReadWORD(); var bytesRead = reader.Position - pos; var compressed = reader.ReadBYTEs(size - bytesRead); PixelBytes = ZlibDeflate(compressed); } }