Beispiel #1
0
        public AseFrame(AseFile file, AseReader reader)
        {
            AseFile = file;

            NumBytesInFrame = reader.ReadDWORD();
            MagicNumber     = reader.ReadWORD();
            NumChunks       = reader.ReadWORD();
            FrameDurationMs = reader.ReadWORD();

            // Ingore next two bytes
            reader.ReadBYTEs(2);

            // Later versions of Aseprite may overwrite our number of chunks
            var nchunks = reader.ReadDWORD();

            if (NumChunks == 0xFFFF && NumChunks < nchunks)
            {
                NumChunks = nchunks;
            }

            // Read in old and new chunks
            Chunks = Enumerable.Repeat <AseChunk>(null, (int)NumChunks).ToList();
            for (int i = 0; i < NumChunks; i++)
            {
                Chunks[i] = ReadChunk(reader);
            }

            Debug.Assert(MagicNumber == 0xF1FA);
        }
        public AseFrameTagEntry(AseReader reader)
        {
            FromFrame = reader.ReadWORD();
            ToFrame   = reader.ReadWORD();
            LoopAnimationDirection = (LoopAnimationDirection)reader.ReadBYTE();

            // Ignore next 8 bytes
            reader.ReadBYTEs(8);

            ColorRGB = reader.ReadBYTEs(3);

            // Ignore a byte
            reader.ReadBYTE();

            Name = reader.ReadSTRING();

            // "OneShot" loop hack
            if (Name.StartsWith("[") && Name.EndsWith("]"))
            {
                Name      = Name.Remove(0, 1);
                Name      = Name.Remove(Name.Length - 1, 1);
                IsOneShot = true;
            }
            else
            {
                IsOneShot = false;
            }
        }
Beispiel #3
0
        private AseChunk ReadChunk(AseReader reader)
        {
            uint      size = reader.ReadDWORD();
            ChunkType type = (ChunkType)reader.ReadWORD();

            return(ChunkFactory.ReadChunk(this, type, (int)(size - 6), reader));
        }
        public AseColorProfileChunk(AseFrame frame, AseReader reader)
            : base(frame)
        {
            ColorProfileType  = (ColorProfileType)reader.ReadWORD();
            ColorProfileFlags = (ColorProfileFlags)reader.ReadWORD();
            GammaFixed        = reader.ReadDWORD();

            // Next 8 bytes are reserved
            reader.ReadBYTEs(8);

            // fixit - what to do with color profile data?
            if (ColorProfileType == ColorProfileType.EmbeddedICC)
            {
                var length = (int)reader.ReadDWORD();
                reader.ReadBYTEs(length);
            }
        }
Beispiel #5
0
        public AseColorProfileChunk(AseFrame frame, AseReader reader)
            : base(frame)
        {
            ColorProfileType  = (ColorProfileType)reader.ReadWORD();
            ColorProfileFlags = (ColorProfileFlags)reader.ReadWORD();
            GammaFixed        = reader.ReadDWORD();

            // Next 8 bytes are reserved
            reader.ReadBYTEs(8);

            // Do we need to do anything with color profile data?
            // For now, just keep on truckin'
            if (ColorProfileType == ColorProfileType.EmbeddedICC)
            {
                var length = (int)reader.ReadDWORD();
                reader.ReadBYTEs(length);
            }
        }
Beispiel #6
0
        public AseLayerChunk(AseFrame frame, AseReader reader)
            : base(frame)
        {
            Flags      = (LayerChunkFlags)reader.ReadWORD();
            Type       = (LayerType)reader.ReadWORD();
            ChildLevel = reader.ReadWORD();

            // Ignore next two words
            reader.ReadWORD();
            reader.ReadWORD();

            BlendMode = (BlendMode)reader.ReadWORD();
            Opacity   = reader.ReadBYTE();

            if ((frame.AseFile.Header.Flags & HeaderFlags.HasLayerOpacity) == 0)
            {
                // Assume full opacity
                Opacity = 255;
            }

            // Ignore next three bytes
            reader.ReadBYTEs(3);

            Name = reader.ReadSTRING();
        }
Beispiel #7
0
        public AseHeader(AseReader reader)
        {
            FileSize    = reader.ReadDWORD();
            MagicNumber = reader.ReadWORD();
            NumFrames   = reader.ReadWORD();
            Width       = reader.ReadWORD();
            Height      = reader.ReadWORD();
            ColorDepth  = reader.ReadColorDepth();
            Flags       = (HeaderFlags)reader.ReadDWORD();
            Speed       = reader.ReadWORD();

            // Next two dwords are ignored
            reader.ReadDWORD();
            reader.ReadDWORD();

            TransparentIndex = reader.ReadBYTE();

            // Next 3 bytes are ignored
            reader.ReadBYTEs(3);

            NumColors   = reader.ReadWORD();
            PixelWidth  = reader.ReadBYTE();
            PixelHeight = reader.ReadBYTE();

            // Last 92 bytes are reserved for future use
            reader.ReadBYTEs(92);

            Debug.Assert(MagicNumber == 0xA5E0);
        }
Beispiel #8
0
        public AsePaletteEntry(AseReader reader)
        {
            Flags = reader.ReadWORD();
            Red   = reader.ReadBYTE();
            Green = reader.ReadBYTE();
            Blue  = reader.ReadBYTE();
            Alpha = reader.ReadBYTE();

            if (HasName)
            {
                Name = reader.ReadSTRING();
            }
        }
        public AseFrameTagsChunk(AseFrame frame, AseReader reader)
            : base(frame)
        {
            NumTags = reader.ReadWORD();

            // Ignore next 8 bytes
            reader.ReadBYTEs(8);

            Entries = Enumerable.Repeat <AseFrameTagEntry>(null, NumTags).ToList();
            for (int i = 0; i < (int)NumTags; i++)
            {
                Entries[i] = new AseFrameTagEntry(reader);
            }
        }
Beispiel #10
0
        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);
            }
        }