public Bitmap GetTileImage(int index) { if (tileImagesCache[index] != null) { return(tileImagesCache[index]); } Bitmap image = new Bitmap(16, 16); Graphics g = Graphics.FromImage(image); for (int y = 0; y < 2; y++) { for (int x = 0; x < 2; x++) { int tileIndex = GetSubTileIndex(index, x, y); int flags = GetSubTileFlags(index, x, y); int tileOffset = 0x1000 + ((sbyte)tileIndex) * 16; byte[] src = new byte[16]; Array.Copy(graphicsState.VramBuffer[1], tileOffset, src, 0, 16); Bitmap subImage = GbGraphics.TileToBitmap(src, GraphicsState.GetBackgroundPalettes()[flags & 7], flags); g.DrawImageUnscaled(subImage, x * 8, y * 8); } } g.Dispose(); // if (fullCachedImageData == null) // fullCachedImageData = fullCachedImage.LockBits( // new Rectangle(0, 0, fullCachedImage.Width, fullCachedImage.Height), // ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); // GbGraphics.QuickDraw(fullCachedImageData, image, (index%16)*16, (index/16)*16); g = Graphics.FromImage(fullCachedImage); g.DrawImageUnscaled(image, (index % 16) * 16, (index / 16) * 16); g.Dispose(); tileImagesCache[index] = image; return(image); }