コード例 #1
0
ファイル: CellChunk.cs プロジェクト: CodyAWard/aseprite_sharp
        public static CellChunk Read(AsepriteStreamReader reader, ColorDepth colorDepth)
        {
            // WORD Layer index(see NOTE.2)
            var layerIndex = reader.WORD();
            // SHORT X position
            var xPosition = reader.SHORT();
            // SHORT       Y position
            var yPosition = reader.SHORT();
            // BYTE Opacity level
            var opacityLevel = reader.BYTE();
            // WORD        Cel type
            var cellType = reader.WORD();

            // BYTE[7]     For future(set to zero)
            reader.BYTES(7);
            // +For cel type = 0(Raw Cel)
            if (cellType == 0)
            {
                //   WORD Width in pixels
                var width = reader.WORD();
                //   WORD Height in pixels
                var height = reader.WORD();
                //   PIXEL[]   Raw pixel data: row by row from top to bottom,
                //             for each scanline read pixels from left to right.
                var depthModifier = 0;
                if (colorDepth == ColorDepth.RGBA)
                {
                    depthModifier = 4;
                }
                else if (colorDepth == ColorDepth.Grayscale)
                {
                    depthModifier = 2;
                }
                else if (colorDepth == ColorDepth.Indexed)
                {
                    depthModifier = 1;
                }

                var pixels = reader.BYTES(width * height * depthModifier);

                return(new CellChunk(layerIndex, xPosition, yPosition, opacityLevel, cellType,
                                     width, height, pixels));
            }
            // + For cel type = 1(Linked Cel)
            else if (cellType == 1)
            {
                //   WORD      Frame position to link with
                var linkedFramePosition = reader.WORD();
                return(new CellChunk(layerIndex, xPosition, yPosition, opacityLevel, cellType,
                                     linkedFramePosition));
            }
            // + For cel type = 2(Compressed Image)
            else if (cellType == 2)
            {
                //   WORD      Width in pixels
                var width = reader.WORD();
                //   WORD      Height in pixels
                var height = reader.WORD();
                //   BYTE[]    "Raw Cel" data compressed with ZLIB method
                var depthModifier = 0;
                if (colorDepth == ColorDepth.RGBA)
                {
                    depthModifier = 4;
                }
                else if (colorDepth == ColorDepth.Grayscale)
                {
                    depthModifier = 2;
                }
                else if (colorDepth == ColorDepth.Indexed)
                {
                    depthModifier = 1;
                }

                var count  = width * height * depthModifier;
                var pixels = new byte[count];
                reader.DEFLATE(pixels);

                return(new CellChunk(layerIndex, xPosition, yPosition, opacityLevel, cellType, width, height, pixels));
            }
            else
            {
                return(new CellChunk(layerIndex, xPosition, yPosition, opacityLevel, cellType));
            }
        }
コード例 #2
0
ファイル: Header.cs プロジェクト: CodyAWard/aseprite_sharp
        public static Header Read(AsepriteStreamReader reader)
        {
            // DWORD       File size
            var fileSize = reader.DWORD();
            // WORD        Magic number (0xA5E0)
            var magicNumber = reader.WORD();

            if (magicNumber != 0xA5E0)
            {
                throw new System.Exception("Invalid Format");
            }
            // WORD        Frames
            var frames = reader.WORD();
            // WORD        Width in pixels
            var width = reader.WORD();
            // WORD        Height in pixels
            var height = reader.WORD();
            // WORD        Color depth (bits per pixel)
            //               32 bpp = RGBA
            //               16 bpp = Grayscale
            //               8 bpp = Indexed
            var colorDepth = (ColorDepth)reader.WORD();
            // DWORD       Flags:
            //               1 = Layer opacity has valid value
            var layerOpacityHasValidValue = reader.FLAG(reader.DWORD(), 1);

            // WORD        Speed (milliseconds between frame, like in FLC files)
            //             DEPRECATED: You should use the frame duration field
            //             from each frame header
            reader.WORD();
            // DWORD       Set be 0
            reader.DWORD();
            // DWORD       Set be 0
            reader.DWORD();
            // BYTE        Palette entry (index) which represent transparent color
            //             in all non-background layers (only for Indexed sprites).
            var transparentIndex = reader.BYTE();

            // BYTE[3]     Ignore these bytes
            reader.BYTES(3);
            // WORD        Number of colors (0 means 256 for old sprites)
            reader.WORD();
            // BYTE        Pixel width (pixel ratio is "pixel width/pixel height").
            //             If this or pixel height field is zero, pixel ratio is 1:1
            var pixelWidth = reader.BYTE();
            // BYTE        Pixel height
            var  pixelHeight = reader.BYTE();
            byte pixelRatio  = 1;

            if (pixelHeight > 0 && pixelWidth > 0)
            {
                pixelRatio = (byte)(pixelWidth / pixelHeight);
            }
            // SHORT       X position of the grid
            var xPos = reader.SHORT();
            // SHORT       Y position of the grid
            var yPos = reader.SHORT();
            // WORD        Grid width (zero if there is no grid, grid size
            //             is 16x16 on Aseprite by default)
            var gridWidth = reader.WORD();
            // WORD        Grid height (zero if there is no grid)
            var gridHeight = reader.WORD();

            // BYTE[84]    For future (set to zero)
            reader.BYTES(84);

            return(new Header(
                       fileSize,
                       frames,
                       width,
                       height,
                       colorDepth,
                       layerOpacityHasValidValue,
                       transparentIndex,
                       pixelWidth,
                       pixelHeight,
                       pixelRatio,
                       xPos,
                       yPos,
                       gridWidth,
                       gridHeight));
        }