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)); } }
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)); }