Skip to content

Instantly share code, notes, and snippets.

@jmcd
Created April 13, 2022 16:21
Show Gist options
  • Save jmcd/db2c3ff254ec9be701ccf04a46d5732a to your computer and use it in GitHub Desktop.
Save jmcd/db2c3ff254ec9be701ccf04a46d5732a to your computer and use it in GitHub Desktop.
namespace RomTile;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
internal static class Program
{
private const int TileWidth = 8;
private const int TileHeight = 8;
private const int NumberOfPixelsInATile = TileWidth * TileHeight;
private const int NumberOfTilesAcross = 32;
private static readonly Rgba32[] Palette =
{
new(0x09, 0x18, 0x20),
new(0x35, 0x67, 0x56),
new(0x88, 0xC0, 0x70),
new(0xE0, 0xF8, 0xD0),
};
private static void Main(string[] args)
{
var rom = File.ReadAllBytes(args[0]);
var numberOfPixelsInRom = rom.Length / 2 * TileWidth;
var numberOfTilesInRom = numberOfPixelsInRom / NumberOfPixelsInATile;
var numberOfTilesTall = (int)Math.Ceiling((double)numberOfTilesInRom / NumberOfTilesAcross);
var image = new Image<Rgba32>(NumberOfTilesAcross * TileWidth, numberOfTilesTall * TileHeight);
var pixelCount = 0;
for (var i = 0; i < rom.Length; i += 2)
{
var b0 = rom[i];
var b1 = rom[i + 1];
var pixelLine = new int[TileWidth];
for (var j = pixelLine.Length - 1; j >= 0; j--)
{
var mask = 1 << j;
var p = 2 * ((b1 & mask) == 0 ? 0 : 1) + ((b0 & mask) == 0 ? 0 : 1);
pixelLine[pixelLine.Length - 1 - j] = p;
var indexOfPixelInTile = pixelCount % NumberOfPixelsInATile;
var tileIndex = pixelCount / NumberOfPixelsInATile;
var yInTile = indexOfPixelInTile / TileWidth;
var xInTile = indexOfPixelInTile % TileWidth;
var y0 = tileIndex / NumberOfTilesAcross * TileHeight;
var x0 = tileIndex % NumberOfTilesAcross * TileWidth;
var x = x0 + xInTile;
var y = y0 + yInTile;
image[x, y] = Palette[p];
pixelCount += 1;
}
}
image.SaveAsPng("/tmp/tiles.png");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment