public CharsetEditor(StudioCore Core)
        {
            this.Core         = Core;
            DocumentInfo.Type = ProjectElement.ElementType.CHARACTER_SET;
            DocumentInfo.UndoManager.MainForm = Core.MainForm;
            m_IsSaveable = true;
            InitializeComponent();
            characterEditor.Core = Core;

            GR.Image.DPIHandler.ResizeControlsForDPI(this);

            characterEditor.UndoManager = DocumentInfo.UndoManager;
            characterEditor.Core        = Core;

            for (int i = 0; i < 256; ++i)
            {
                PaletteManager.ApplyPalette(m_Charset.Characters[i].Tile.Image);
            }

            comboExportRange.Items.Add("All");
            comboExportRange.Items.Add("Selection");
            comboExportRange.Items.Add("Range");
            comboExportRange.SelectedIndex = 0;

            checkExportToDataIncludeRes.Checked = true;
            checkExportToDataWrap.Checked       = true;

            CreateDefaultUppercaseCharset();

            Modified = false;
        }
示例#2
0
        public override bool HandleExport(ExportSpriteInfo Info, TextBox EditOutput, DocumentInfo DocInfo)
        {
            System.Windows.Forms.SaveFileDialog saveDlg = new System.Windows.Forms.SaveFileDialog();

            saveDlg.Title  = "Export Sprites to Image";
            saveDlg.Filter = Core.MainForm.FilterString(RetroDevStudio.Types.Constants.FILEFILTER_IMAGE_FILES);
            if (saveDlg.ShowDialog() != System.Windows.Forms.DialogResult.OK)
            {
                return(false);
            }

            GR.Image.MemoryImage targetImg = new GR.Image.MemoryImage(Info.Project.Sprites[0].Tile.Width * 4, ((Info.Project.TotalNumberOfSprites + 3) / 4) * Info.Project.Sprites[0].Tile.Height, Info.Project.Sprites[0].Tile.Image.PixelFormat);
            PaletteManager.ApplyPalette(targetImg);

            List <int> exportIndices = Info.ExportIndices;

            foreach (int i in exportIndices)
            {
                Info.Project.Sprites[i].Tile.Image.DrawTo(targetImg,
                                                          (i % 4) * Info.Project.Sprites[i].Tile.Width,
                                                          (i / 4) * Info.Project.Sprites[i].Tile.Height);
            }

            System.Drawing.Bitmap bmpTarget = targetImg.GetAsBitmap();
            bmpTarget.Save(saveDlg.FileName, System.Drawing.Imaging.ImageFormat.Png);
            return(true);
        }
        public SpritePadProject()
        {
            for (int i = 0; i < 256; ++i)
            {
                Sprites.Add(new SpriteData());

                PaletteManager.ApplyPalette(Sprites[i].Image);
            }
        }
 public SpriteProject()
 {
     Colors.Palette = PaletteManager.PaletteFromMachine(MachineType.C64);
     Colors.Palettes.Add(Colors.Palette);
     for (int i = 0; i < TotalNumberOfSprites; ++i)
     {
         Sprites.Add(new SpriteData(Colors));
         PaletteManager.ApplyPalette(Sprites[i].Tile.Image);
     }
 }
        public void PaintHexData(HexBox Box, Graphics graphics, long _startByte, long intern_endByte, Rectangle _recHex)
        {
            //graphics.FillRectangle( new SolidBrush( Color.Beige ), _recHex );

            if (Box.BytesPerLine == 8)
            {
                int        spriteSize      = (int)(Box.CharSize.Height * 8) - 2;
                ByteBuffer spriteData      = new ByteBuffer(64);
                int        firstSprite     = (int)(_startByte / 64);
                int        firstTrueByte   = firstSprite * 64;
                int        firstLineOffset = (int)(_startByte - firstTrueByte) / 8;
                int        lastTrueByte    = (int)(intern_endByte - _startByte) + firstTrueByte;
                int        lastSprite      = (int)lastTrueByte / 64;
                if (lastSprite * 64 > intern_endByte)
                {
                    ++lastSprite;
                }

                var oldClip = graphics.Clip;
                graphics.SetClip(_recHex);

                for (int j = firstSprite; j <= lastSprite; ++j)
                {
                    for (int i = 0; i < 64; ++i)
                    {
                        spriteData.SetU8At(i, Box.ByteProvider.ReadByte(firstTrueByte + (j - firstSprite) * 64 + i));
                    }
                    using (GR.Image.FastImage spriteImage = new GR.Image.FastImage(24, 21, System.Drawing.Imaging.PixelFormat.Format8bppIndexed))
                    {
                        spriteImage.Box(0, 0, 24, 21, 1);
                        PaletteManager.ApplyPalette(spriteImage);

                        if (MultiColor)
                        {
                            SpriteDisplayer.DisplayMultiColorSprite(spriteData, ConstantData.Palette, 24, 21, BackgroundColor, MultiColor1, MultiColor2, CustomColor, spriteImage, 0, 0);
                        }
                        else
                        {
                            SpriteDisplayer.DisplayHiResSprite(spriteData, ConstantData.Palette, 24, 21, BackgroundColor, CustomColor, spriteImage, 0, 0);
                        }

                        int offsetY = (int)(Box.CharSize.Height * (j - firstSprite) * 8 + (Box.CharSize.Height * 8 - spriteSize) / 2) - (int)(Box.CharSize.Height * firstLineOffset);

                        using (System.Drawing.Image img = spriteImage.GetAsBitmap())
                        {
                            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
                            graphics.DrawImage(img, new Rectangle(_recHex.Left, _recHex.Top + offsetY, spriteSize, spriteSize));
                        }
                    }
                }

                graphics.Clip = oldClip;
            }
        }
        public GraphicScreenProject()
        {
            PaletteManager.ApplyPalette(Image);

            for (int i = 0; i < 16; ++i)
            {
                ColorMapping.Add(i, new List <ColorMappingTarget> {
                    ColorMappingTarget.ANY
                });
            }
        }
示例#7
0
        public GraphicScreenProject()
        {
            PaletteManager.ApplyPalette(Image);

            for (int i = 0; i < 16; ++i)
            {
                ColorMapping.Add(i, new List <ColorMappingTarget> {
                    ColorMappingTarget.ANY
                });
            }
            Colors.Palette = PaletteManager.PaletteFromMachine(MachineType.C64);
        }
示例#8
0
        public void PaintHexData(HexBox Box, Graphics graphics, long _startByte, long intern_endByte, Rectangle _recHex)
        {
            //if ( Box.BytesPerLine == 8 )
            {
                var oldClip = graphics.Clip;
                graphics.SetClip(_recHex);

                GR.Image.FastImage charImage = new GR.Image.FastImage(8, 8, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
                PaletteManager.ApplyPalette(charImage);

                for (int i = 0; i < intern_endByte - _startByte; ++i)
                {
                    byte character    = Box.ByteProvider.ReadByte(_startByte + i);
                    int  displayColor = 0;
                    int  bgColor      = 1;

                    if ((_startByte + i >= Box.SelectionStart) &&
                        (_startByte + i < Box.SelectionStart + Box.SelectionLength))
                    {
                        displayColor = 1;
                        bgColor      = 14;
                    }

                    switch (Mode)
                    {
                    case PETSCIIDisplay.UPPER_CASE:
                        CharacterDisplayer.DisplayHiResChar(ConstantData.UpperCaseCharsetC64.SubBuffer(character * 8, 8),
                                                            ConstantData.Palette,
                                                            bgColor, displayColor,
                                                            charImage, 0, 0);
                        break;

                    case PETSCIIDisplay.LOWER_CASE:
                        CharacterDisplayer.DisplayHiResChar(ConstantData.LowerCaseCharsetC64.SubBuffer(character * 8, 8),
                                                            ConstantData.Palette,
                                                            bgColor, displayColor,
                                                            charImage, 0, 0);
                        break;
                    }

                    charImage.DrawToHDC(graphics.GetHdc(),
                                        new Rectangle(_recHex.Left + (int)Box.CharSize.Width * (i % 8),
                                                      (int)(_recHex.Top + (i / 8) * (int)Box.CharSize.Height + (Box.CharSize.Height - Box.CharSize.Width) / 2),
                                                      (int)Box.CharSize.Width,
                                                      (int)Box.CharSize.Width));
                    graphics.ReleaseHdc();
                }
                charImage.Dispose();

                graphics.Clip = oldClip;
            }
        }
示例#9
0
        public void PaintHexData(HexBox Box, Graphics graphics, long _startByte, long intern_endByte, Rectangle _recHex)
        {
            if (Box.BytesPerLine == 8)
            {
                var oldClip = graphics.Clip;
                graphics.SetClip(_recHex);

                int        boxSize  = (int)Box.CharSize.Height - 2;
                ByteBuffer charData = new ByteBuffer(8);
                for (int j = 0; j < (intern_endByte - _startByte) / 8; ++j)
                {
                    for (int i = 0; i < 8; ++i)
                    {
                        charData.SetU8At(i, Box.ByteProvider.ReadByte(_startByte + j * 8 + i));
                    }
                    using (GR.Image.FastImage charImage = new GR.Image.FastImage(8, 8, System.Drawing.Imaging.PixelFormat.Format8bppIndexed))
                    {
                        PaletteManager.ApplyPalette(charImage);

                        switch (Mode)
                        {
                        case TextMode.COMMODORE_40_X_25_HIRES:
                            CharacterDisplayer.DisplayHiResChar(charData, ConstantData.Palette, BackgroundColor, CustomColor, charImage, 0, 0);
                            break;

                        case TextMode.COMMODORE_40_X_25_MULTICOLOR:
                            CharacterDisplayer.DisplayMultiColorChar(charData, ConstantData.Palette, BackgroundColor, CustomColor, MultiColor1, MultiColor2, charImage, 0, 0);
                            break;

                        case TextMode.COMMODORE_40_X_25_ECM:
                            // TODO - not correct
                            CharacterDisplayer.DisplayHiResChar(charData, ConstantData.Palette, BackgroundColor, CustomColor, charImage, 0, 0);
                            break;

                        default:
                            Debug.Log("PaintHexData: Missing mode displayer");
                            break;
                        }

                        charImage.DrawToHDC(graphics.GetHdc(),
                                            new Rectangle(_recHex.Left, (int)(_recHex.Top + Box.CharSize.Height * j + (Box.CharSize.Height - boxSize) / 2), boxSize, boxSize));
                        graphics.ReleaseHdc();
                    }
                }

                graphics.Clip = oldClip;
            }
        }
        public CharsetEditor(StudioCore Core)
        {
            this.Core         = Core;
            DocumentInfo.Type = ProjectElement.ElementType.CHARACTER_SET;
            DocumentInfo.UndoManager.MainForm = Core.MainForm;
            m_IsSaveable = true;
            InitializeComponent();
            characterEditor.Core = Core;

            GR.Image.DPIHandler.ResizeControlsForDPI(this);

            characterEditor.UndoManager = DocumentInfo.UndoManager;
            characterEditor.Core        = Core;

            for (int i = 0; i < 256; ++i)
            {
                PaletteManager.ApplyPalette(m_Charset.Characters[i].Tile.Image);
            }

            comboExportRange.Items.Add("All");
            comboExportRange.Items.Add("Selection");
            comboExportRange.Items.Add("Range");
            comboExportRange.SelectedIndex = 0;

            comboExportMethod.Items.Add(new GR.Generic.Tupel <string, Type>("as assembly", typeof(ExportCharsetAsAssembly)));
            comboExportMethod.Items.Add(new GR.Generic.Tupel <string, Type>("to binary file", typeof(ExportCharsetAsBinaryFile)));
            comboExportMethod.Items.Add(new GR.Generic.Tupel <string, Type>("to image file", typeof(ExportCharsetAsImageFile)));
            comboExportMethod.Items.Add(new GR.Generic.Tupel <string, Type>("to image (clipboard)", typeof(ExportCharsetAsImage)));
            comboExportMethod.Items.Add(new GR.Generic.Tupel <string, Type>("as BASIC DATA statements", typeof(ExportCharsetAsBASICData)));
            comboExportMethod.Items.Add(new GR.Generic.Tupel <string, Type>("as BASIC CHARDEF statements", typeof(ExportCharsetAsBASICChardef)));
            comboExportMethod.SelectedIndex = 0;
            m_DefaultOutputFont             = editDataExport.Font;

            comboImportMethod.Items.Add(new GR.Generic.Tupel <string, Type>("from character set/binary file", typeof(ImportCharsetFromBinaryFile)));
            comboImportMethod.Items.Add(new GR.Generic.Tupel <string, Type>("from image file", typeof(ImportCharsetFromImageFile)));
            comboImportMethod.Items.Add(new GR.Generic.Tupel <string, Type>("from assembly", typeof(ImportCharsetFromASM)));
            comboImportMethod.Items.Add(new GR.Generic.Tupel <string, Type>("from BASIC DATA statements", typeof(ImportCharsetFromBASICDATA)));
            comboImportMethod.Items.Add(new GR.Generic.Tupel <string, Type>("set default character sets", typeof(ImportCharsetFromDefault)));
            comboImportMethod.SelectedIndex = 0;

            CreateDefaultUppercaseCharset();

            Modified = false;
        }
示例#11
0
        public override bool HandleExport(ExportCharsetInfo Info, TextBox EditOutput, DocumentInfo DocInfo)
        {
            GR.Image.MemoryImage targetImg = new GR.Image.MemoryImage(128, 128, Info.Charset.Characters[0].Tile.Image.PixelFormat);
            PaletteManager.ApplyPalette(targetImg);

            List <int> exportIndices = Info.ExportIndices;

            foreach (int i in exportIndices)
            {
                Info.Charset.Characters[i].Tile.Image.DrawTo(targetImg, (i % 16) * 8, (i / 16) * 8);
            }

            System.Drawing.Bitmap bmpTarget = targetImg.GetAsBitmap();

            Clipboard.SetImage(bmpTarget);
            bmpTarget.Dispose();

            return(true);
        }
        public override bool HandleExport(ExportSpriteInfo Info, TextBox EditOutput, DocumentInfo DocInfo)
        {
            GR.Image.MemoryImage targetImg = new GR.Image.MemoryImage(Info.Project.Sprites[0].Tile.Width * 4, ((Info.Project.TotalNumberOfSprites + 3) / 4) * Info.Project.Sprites[0].Tile.Height, Info.Project.Sprites[0].Tile.Image.PixelFormat);
            PaletteManager.ApplyPalette(targetImg);

            List <int> exportIndices = Info.ExportIndices;

            foreach (int i in exportIndices)
            {
                Info.Project.Sprites[i].Tile.Image.DrawTo(targetImg,
                                                          (i % 4) * Info.Project.Sprites[i].Tile.Width,
                                                          (i / 4) * Info.Project.Sprites[i].Tile.Height);
            }

            var bmpTarget = targetImg.GetAsBitmap();

            Clipboard.SetImage(bmpTarget);
            bmpTarget.Dispose();

            return(true);
        }
        private void btnExportCharsetToImage_Click(object sender, EventArgs e)
        {
            System.Windows.Forms.SaveFileDialog saveDlg = new System.Windows.Forms.SaveFileDialog();

            saveDlg.Title  = "Export Characters to Image";
            saveDlg.Filter = Core.MainForm.FilterString(C64Studio.Types.Constants.FILEFILTER_IMAGE_FILES);
            if (saveDlg.ShowDialog() != System.Windows.Forms.DialogResult.OK)
            {
                return;
            }

            GR.Image.MemoryImage targetImg = new GR.Image.MemoryImage(128, 128, m_Charset.Characters[0].Tile.Image.PixelFormat);
            PaletteManager.ApplyPalette(targetImg);

            List <int> exportIndices = ListOfExportIndices();

            foreach (int i in exportIndices)
            {
                m_Charset.Characters[i].Tile.Image.DrawTo(targetImg, (i % 16) * 8, (i / 16) * 8);
            }
            System.Drawing.Bitmap bmpTarget = targetImg.GetAsBitmap();
            bmpTarget.Save(saveDlg.FileName, System.Drawing.Imaging.ImageFormat.Png);
        }
示例#14
0
        public static GR.Image.MemoryImage BitmapFromKoala(GR.Memory.ByteBuffer koala)
        {
            byte fullValue;
            byte value;
            byte currentColor;

            int xCooBase = 0;
            int yCooBase = 0;

            GR.Image.MemoryImage Image = new GR.Image.MemoryImage(320, 200, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);

            // Set the palette to the C64 one
            PaletteManager.ApplyPalette(Image);

            if (koala.Length >= 10002)
            {
                // Last Byte is Background Color and global
                Byte backgroundColor = koala.ByteAt(10002);

                for (int y = 0; y < 1000; y++)
                {
                    // koala has 3 colors which can be selected for ech "cell" (8x8 pixel)
                    byte lowerNibbleColor = (byte)(((((koala.ByteAt(y + 8002)) << 4) & 0xFF) >> 4));
                    byte upperNibbleColor = (byte)(koala.ByteAt(y + 8002) >> 4);
                    byte colorRamColor    = koala.ByteAt(y + 9002);

                    for (int x = 0; x < 8; x++)
                    {
                        fullValue = koala.ByteAt((8 * y) + x + 2);

                        for (int z = 0; z < 4; z++)
                        {
                            value = (byte)(((fullValue << (z * 2)) & 0xFF) >> 6);

                            switch (value)
                            {
                            case 0:
                                currentColor = backgroundColor;
                                break;

                            case 1:
                                currentColor = upperNibbleColor;
                                break;

                            case 2:
                                currentColor = lowerNibbleColor;
                                break;

                            default:
                                currentColor = colorRamColor;
                                break;
                            }
                            Image.SetPixel(((xCooBase * 4) * 2 + (z * 2)), yCooBase * 8 + x, currentColor);
                            // koala is doublepixel, so we repeat it for the right neighbour
                            Image.SetPixel(((xCooBase * 4) * 2 + (z * 2) + 1), yCooBase * 8 + x, currentColor);
                        }
                    }

                    xCooBase++;
                    if (xCooBase == 40)
                    {
                        xCooBase = 0;
                        yCooBase++;
                    }
                }
            }
            return(Image);
        }
        public bool ReadFromBuffer(GR.Memory.ByteBuffer DataIn)
        {
            if (DataIn == null)
            {
                return(false);
            }
            SpriteLayers.Clear();

            GR.IO.MemoryReader memIn = DataIn.MemoryReader();

            GR.Memory.ByteBuffer header = new GR.Memory.ByteBuffer();

            if (memIn.ReadBlock(header, 9) != 9)
            {
                return(false);
            }
            if ((header.ByteAt(0) != 0x53) ||
                (header.ByteAt(1) != 0x50) ||
                (header.ByteAt(2) != 0x44))
            {
                // no SPD
                return(false);
            }

            NumSprites = header.ByteAt(4) + 1;
            int numAnims = header.ByteAt(5) + 1;

            BackgroundColor = header.ByteAt(6);
            MultiColor1     = header.ByteAt(7);
            MultiColor2     = header.ByteAt(8);

            Sprites = new List <SpriteData>();

            GR.Memory.ByteBuffer tempData = new GR.Memory.ByteBuffer();
            for (int i = 0; i < NumSprites; ++i)
            {
                Sprites.Add(new SpriteData());
                PaletteManager.ApplyPalette(Sprites[i].Image);

                tempData.Clear();
                memIn.ReadBlock(tempData, 63);
                tempData.CopyTo(Sprites[i].Data, 0, 63);

                Sprites[i].Color      = memIn.ReadUInt8();
                Sprites[i].Multicolor = (((Sprites[i].Color) & 0x80) != 0);
                Sprites[i].Color     &= 0x0f;
            }

            if (numAnims > 0)
            {
                GR.Memory.ByteBuffer animFrom       = new GR.Memory.ByteBuffer();
                GR.Memory.ByteBuffer animTo         = new GR.Memory.ByteBuffer();
                GR.Memory.ByteBuffer animNumFrames  = new GR.Memory.ByteBuffer();
                GR.Memory.ByteBuffer animAttributes = new GR.Memory.ByteBuffer();

                memIn.ReadBlock(animFrom, (uint)numAnims);
                memIn.ReadBlock(animTo, (uint)numAnims);
                memIn.ReadBlock(animNumFrames, (uint)numAnims);
                memIn.ReadBlock(animAttributes, (uint)numAnims);
            }
            UsedSprites = (uint)NumSprites;
            return(true);
        }
        public bool ReadFromBuffer(GR.Memory.ByteBuffer DataIn)
        {
            if (DataIn == null)
            {
                return(false);
            }
            SpriteLayers.Clear();
            Sprites.Clear();

            GR.IO.MemoryReader memIn = DataIn.MemoryReader();

            uint Version = memIn.ReadUInt32();

            if (Version == 2)
            {
                Colors.Palettes.Clear();

                GR.IO.FileChunk chunkMain = new GR.IO.FileChunk();

                while (chunkMain.ReadFromStream(memIn))
                {
                    switch (chunkMain.Type)
                    {
                    case FileChunkConstants.SPRITESET_PROJECT:
                    {
                        var chunkReader = chunkMain.MemoryReader();

                        GR.IO.FileChunk subChunk = new GR.IO.FileChunk();

                        while (subChunk.ReadFromStream(chunkReader))
                        {
                            var subChunkReader = subChunk.MemoryReader();

                            switch (subChunk.Type)
                            {
                            case FileChunkConstants.SPRITESET_INFO:
                                TotalNumberOfSprites = subChunkReader.ReadInt32();
                                Name              = subChunkReader.ReadString();
                                ExportFilename    = subChunkReader.ReadString();
                                ExportStartIndex  = subChunkReader.ReadInt32();
                                ExportSpriteCount = subChunkReader.ReadInt32();
                                break;

                            case FileChunkConstants.MULTICOLOR_DATA:
                                Mode = (SpriteProjectMode)subChunkReader.ReadInt32();
                                Colors.BackgroundColor = subChunkReader.ReadInt32();
                                Colors.MultiColor1     = subChunkReader.ReadInt32();
                                Colors.MultiColor2     = subChunkReader.ReadInt32();
                                Colors.ActivePalette   = 0;
                                break;

                            case FileChunkConstants.PALETTE:
                                Colors.Palettes.Add(Palette.Read(subChunkReader));
                                break;

                            case FileChunkConstants.SPRITESET_SPRITE:
                            {
                                var sprite = new SpriteData(new ColorSettings(Colors));

                                sprite.Mode             = (SpriteMode)subChunkReader.ReadInt32();
                                sprite.Tile.Mode        = (GraphicTileMode)subChunkReader.ReadInt32();
                                sprite.Tile.CustomColor = subChunkReader.ReadInt32();
                                sprite.Tile.Width       = subChunkReader.ReadInt32();
                                sprite.Tile.Height      = subChunkReader.ReadInt32();
                                int dataLength = subChunkReader.ReadInt32();
                                sprite.Tile.Data = new GR.Memory.ByteBuffer();
                                subChunkReader.ReadBlock(sprite.Tile.Data, (uint)dataLength);
                                if (sprite.Tile.CustomColor == -1)
                                {
                                    sprite.Tile.CustomColor = 1;
                                }

                                sprite.Tile.Colors.ActivePalette = subChunkReader.ReadInt32();
                                sprite.Tile.Image = new GR.Image.MemoryImage(sprite.Tile.Width, sprite.Tile.Height, GR.Drawing.PixelFormat.Format32bppRgb);

                                Sprites.Add(sprite);
                            }
                            break;

                            case FileChunkConstants.SPRITESET_LAYER:
                            {
                                Layer layer = new Layer();

                                SpriteLayers.Add(layer);

                                GR.IO.FileChunk subChunkL = new GR.IO.FileChunk();

                                while (subChunkL.ReadFromStream(subChunkReader))
                                {
                                    var subChunkReaderL = subChunkL.MemoryReader();

                                    if (subChunkL.Type == FileChunkConstants.SPRITESET_LAYER_ENTRY)
                                    {
                                        LayerSprite sprite = new LayerSprite();

                                        sprite.Index   = subChunkReaderL.ReadInt32();
                                        sprite.Color   = subChunkReaderL.ReadInt32();
                                        sprite.X       = subChunkReaderL.ReadInt32();
                                        sprite.Y       = subChunkReaderL.ReadInt32();
                                        sprite.ExpandX = (subChunkReaderL.ReadInt32() != 0);
                                        sprite.ExpandY = (subChunkReaderL.ReadInt32() != 0);

                                        layer.Sprites.Add(sprite);
                                    }
                                    else if (subChunkL.Type == FileChunkConstants.SPRITESET_LAYER_INFO)
                                    {
                                        layer.Name            = subChunkReaderL.ReadString();
                                        layer.BackgroundColor = subChunkReaderL.ReadInt32();
                                        layer.DelayMS         = subChunkReaderL.ReadInt32();
                                    }
                                }
                            }
                            break;
                            }
                        }
                    }
                    break;

                    default:
                        Debug.Log("SpriteProject.ReadFromBuffer unexpected chunk type " + chunkMain.Type.ToString("X"));
                        return(false);
                    }
                }

                return(true);
            }

            int numSprites = 256;

            if (Version >= 1)
            {
                numSprites = memIn.ReadInt32();
            }
            Sprites = new List <SpriteData>();
            for (int i = 0; i < numSprites; ++i)
            {
                Sprites.Add(new SpriteData(Colors));
                PaletteManager.ApplyPalette(Sprites[i].Tile.Image);
            }

            string name = memIn.ReadString();

            for (int i = 0; i < numSprites; ++i)
            {
                Sprites[i].Tile.CustomColor = memIn.ReadInt32();
            }
            for (int i = 0; i < numSprites; ++i)
            {
                Sprites[i].Mode      = (SpriteMode)memIn.ReadUInt8();
                Sprites[i].Tile.Mode = Lookup.GraphicTileModeFromSpriteMode(Sprites[i].Mode);
            }
            Colors.BackgroundColor = memIn.ReadInt32();
            Colors.MultiColor1     = memIn.ReadInt32();
            Colors.MultiColor2     = memIn.ReadInt32();

            bool genericMultiColor = (memIn.ReadUInt32() != 0);

            for (int i = 0; i < numSprites; ++i)
            {
                GR.Memory.ByteBuffer tempBuffer = new GR.Memory.ByteBuffer();

                memIn.ReadBlock(tempBuffer, 64);
                tempBuffer.CopyTo(Sprites[i].Tile.Data, 0, 63);
            }

            ExportSpriteCount = memIn.ReadInt32();

            ExportFilename = memIn.ReadString();
            string exportPathSpriteFile = memIn.ReadString();

            for (int i = 0; i < numSprites; ++i)
            {
                string desc = memIn.ReadString();
            }
            int spriteTestCount = memIn.ReadInt32();

            for (int i = 0; i < spriteTestCount; ++i)
            {
                int  spriteIndex      = memIn.ReadInt32();
                byte spriteColor      = memIn.ReadUInt8();
                bool spriteMultiColor = (memIn.ReadUInt8() != 0);
                int  spriteX          = memIn.ReadInt32();
                int  spriteY          = memIn.ReadInt32();
            }

            GR.IO.FileChunk chunk = new GR.IO.FileChunk();

            while (chunk.ReadFromStream(memIn))
            {
                switch (chunk.Type)
                {
                case FileChunkConstants.SPRITESET_LAYER:
                {
                    Layer layer = new Layer();

                    SpriteLayers.Add(layer);

                    var chunkReader = chunk.MemoryReader();

                    GR.IO.FileChunk subChunk = new GR.IO.FileChunk();

                    while (subChunk.ReadFromStream(chunkReader))
                    {
                        var subChunkReader = subChunk.MemoryReader();

                        if (subChunk.Type == FileChunkConstants.SPRITESET_LAYER_ENTRY)
                        {
                            LayerSprite sprite = new LayerSprite();

                            sprite.Index   = subChunkReader.ReadInt32();
                            sprite.Color   = subChunkReader.ReadUInt8();
                            sprite.X       = subChunkReader.ReadInt32();
                            sprite.Y       = subChunkReader.ReadInt32();
                            sprite.ExpandX = (subChunkReader.ReadUInt8() != 0);
                            sprite.ExpandY = (subChunkReader.ReadUInt8() != 0);

                            layer.Sprites.Add(sprite);
                        }
                        else if (subChunk.Type == FileChunkConstants.SPRITESET_LAYER_INFO)
                        {
                            layer.Name            = subChunkReader.ReadString();
                            layer.BackgroundColor = subChunkReader.ReadUInt8();
                            layer.DelayMS         = subChunkReader.ReadInt32();
                        }
                    }
                }
                break;
                }
            }

            while (Sprites.Count > 256)
            {
                Sprites.RemoveAt(256);
            }

            return(true);
        }