13 int tile_size,
int num_tiles,
SnesPalette &palette) {
45 int tile_x = (tile_id % tiles_per_row) * tilemap.
tile_size.
x;
46 int tile_y = (tile_id / tiles_per_row) * tilemap.
tile_size.
y;
49 int tile_data_offset = 0;
61 int tile_x = (tile_id % tiles_per_row) * tilemap.
tile_size.
x;
62 int tile_y = (tile_id / tiles_per_row) * tilemap.
tile_size.
y;
65 int tile_data_offset = 0;
72 const std::vector<uint8_t> &data,
int tile_id,
int sheet_offset) {
73 const int tile_width = 8;
74 const int tile_height = 8;
75 const int buffer_width = 128;
76 const int sheet_height = 32;
78 const int tiles_per_row = buffer_width / tile_width;
79 const int rows_per_sheet = sheet_height / tile_height;
80 const int tiles_per_sheet = tiles_per_row * rows_per_sheet;
82 int sheet = (tile_id / tiles_per_sheet) % 4 + sheet_offset;
83 int position_in_sheet = tile_id % tiles_per_sheet;
84 int row_in_sheet = position_in_sheet / tiles_per_row;
85 int column_in_sheet = position_in_sheet % tiles_per_row;
87 assert(sheet >= sheet_offset && sheet <= sheet_offset + 3);
89 std::vector<uint8_t> tile_data(tile_width * tile_height);
90 for (
int y = 0; y < tile_height; ++y) {
91 for (
int x = 0; x < tile_width; ++x) {
92 int src_x = column_in_sheet * tile_width + x;
93 int src_y = (sheet * sheet_height) + (row_in_sheet * tile_height) + y;
95 int src_index = (src_y * buffer_width) + src_x;
96 int dest_index = y * tile_width + x;
97 tile_data[dest_index] = data[src_index];
106 for (
int y = 0; y < 4; ++y) {
107 for (
int x = 0; x < 8; ++x) {
108 std::swap(tile_data[y * 8 + x], tile_data[(7 - y) * 8 + x]);
114 for (
int y = 0; y < 8; ++y) {
115 for (
int x = 0; x < 4; ++x) {
116 std::swap(tile_data[y * 8 + x], tile_data[y * 8 + (7 - x)]);
122 const TileInfo &tile_info,
int base_x,
int base_y,
124 std::vector<uint8_t> tile_data =
134 for (
int y = 0; y < 8; ++y) {
135 for (
int x = 0; x < 8; ++x) {
136 int src_index = y * 8 + x;
137 int dest_x = base_x + x;
138 int dest_y = base_y + y;
139 int dest_index = (dest_y * tilemap.
atlas.
width()) + dest_x;
149 int sheet_offset,
int tile_id) {
152 int tile16_row = tile_id / tiles_per_row;
153 int tile16_column = tile_id % tiles_per_row;
154 int base_x = tile16_column * tilemap.
tile_size.
x;
155 int base_y = tile16_row * tilemap.
tile_size.
y;
158 ComposeAndPlaceTilePart(tilemap, data, top_left, base_x, base_y,
160 ComposeAndPlaceTilePart(tilemap, data, top_right, base_x + 8, base_y,
162 ComposeAndPlaceTilePart(tilemap, data, bottom_left, base_x, base_y + 8,
164 ComposeAndPlaceTilePart(tilemap, data, bottom_right, base_x + 8, base_y + 8,
167 tilemap.
tile_info[tile_id] = {top_left, top_right, bottom_left, bottom_right};
174 int num_tiles = tilemap.
tile_info.size();
176 int tile16_row = num_tiles / tiles_per_row;
177 int tile16_column = num_tiles % tiles_per_row;
178 int base_x = tile16_column * tilemap.
tile_size.
x;
179 int base_y = tile16_row * tilemap.
tile_size.
y;
181 ComposeAndPlaceTilePart(tilemap, data, top_left, base_x, base_y,
183 ComposeAndPlaceTilePart(tilemap, data, top_right, base_x + 8, base_y,
185 ComposeAndPlaceTilePart(tilemap, data, bottom_left, base_x, base_y + 8,
187 ComposeAndPlaceTilePart(tilemap, data, bottom_right, base_x + 8, base_y + 8,
190 tilemap.
tile_info.push_back({top_left, top_right, bottom_left, bottom_right});
195 std::vector<uint8_t> data(tile_size * tile_size);
197 int index = tile_id * tile_size * tile_size;
200 for (
int ty = 0; ty < tile_size; ty++) {
201 for (
int tx = 0; tx < tile_size; tx++) {
204 .
vector()[(tile_id % 8 * tile_size) +
205 (tile_id / 8 * tile_size * width) + ty * width + tx];
206 data[ty * tile_size + tx] = value;
void UpdateBitmap(gfx::Bitmap *bitmap)
void RenderBitmap(gfx::Bitmap *bitmap)
Represents a bitmap image.
const SnesPalette & palette() const
void WriteToPixel(int position, uint8_t value)
Write a value to a pixel at the given position.
const std::vector< uint8_t > & vector() const
void set_data(const std::vector< uint8_t > &data)
void SetPalette(const SnesPalette &palette)
Set the palette for the bitmap.
void Get16x16Tile(int tile_x, int tile_y, std::vector< uint8_t > &tile_data, int &tile_data_offset)
Extract a 16x16 tile from the bitmap.
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
SNES 16-bit tile metadata container.
void ComposeAndPlaceTilePart(Tilemap &tilemap, const std::vector< uint8_t > &data, const TileInfo &tile_info, int base_x, int base_y, int sheet_offset)
void MirrorTileDataVertically(std::vector< uint8_t > &tile_data)
void MirrorTileDataHorizontally(std::vector< uint8_t > &tile_data)
Contains classes for handling graphical data.
Tilemap CreateTilemap(std::vector< uint8_t > &data, int width, int height, int tile_size, int num_tiles, SnesPalette &palette)
void UpdateTilemap(Tilemap &tilemap, const std::vector< uint8_t > &data)
void ModifyTile16(Tilemap &tilemap, const std::vector< uint8_t > &data, const TileInfo &top_left, const TileInfo &top_right, const TileInfo &bottom_left, const TileInfo &bottom_right, int sheet_offset, int tile_id)
void UpdateTile16(Tilemap &tilemap, int tile_id)
void RenderTile16(Tilemap &tilemap, int tile_id)
std::vector< uint8_t > GetTilemapData(Tilemap &tilemap, int tile_id)
std::vector< uint8_t > FetchTileDataFromGraphicsBuffer(const std::vector< uint8_t > &data, int tile_id, int sheet_offset)
void RenderTile(Tilemap &tilemap, int tile_id)
void ComposeTile16(Tilemap &tilemap, const std::vector< uint8_t > &data, const TileInfo &top_left, const TileInfo &top_right, const TileInfo &bottom_left, const TileInfo &bottom_right, int sheet_offset)
Main namespace for the application.
absl::flat_hash_map< int, Bitmap > tile_bitmaps
std::vector< std::array< gfx::TileInfo, 4 > > tile_info