yaze 0.2.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
tilesheet.h
Go to the documentation of this file.
1#ifndef YAZE_APP_GFX_TILESHEET_H
2#define YAZE_APP_GFX_TILESHEET_H
3
4#include <memory>
5#include <vector>
6
7#include "app/gfx/bitmap.h"
9#include "app/gfx/snes_tile.h"
10
11namespace yaze {
12namespace gfx {
13
14enum class TileType { Tile8, Tile16 };
15
17 std::array<TileInfo, 4> tiles;
18};
19
28class Tilesheet {
29 public:
30 Tilesheet() = default;
31 Tilesheet(std::shared_ptr<Bitmap> bitmap, int tileWidth, int tileHeight,
33 : bitmap_(std::move(bitmap)),
34 tile_width_(tileWidth),
35 tile_height_(tileHeight),
37
38 void Init(int width, int height, TileType tile_type);
39
40 void ComposeTile16(const std::vector<uint8_t>& graphics_buffer,
41 const TileInfo& top_left, const TileInfo& top_right,
42 const TileInfo& bottom_left, const TileInfo& bottom_right,
43 int sheet_offset = 0);
44 void ModifyTile16(const std::vector<uint8_t>& graphics_buffer,
45 const TileInfo& top_left, const TileInfo& top_right,
46 const TileInfo& bottom_left, const TileInfo& bottom_right,
47 int tile_id, int sheet_offset = 0);
48
49 void ComposeAndPlaceTilePart(const std::vector<uint8_t>& graphics_buffer,
50 const TileInfo& tile_info, int baseX, int baseY);
51
52 // Extracts a tile from the tilesheet
53 Bitmap GetTile(int tileX, int tileY, int bmp_width, int bmp_height) {
54 std::vector<uint8_t> tileData(tile_width_ * tile_height_);
55 int tile_data_offset = 0;
56 bitmap_->Get8x8Tile(CalculateTileIndex(tileX, tileY), tileX, tileY,
57 tileData, tile_data_offset);
58 return Bitmap(bmp_width, bmp_height, bitmap_->depth(), tileData);
59 }
60
61 Bitmap GetTile16(int tile_id) {
62 int tiles_per_row = bitmap_->width() / tile_width_;
63 int tile_x = (tile_id % tiles_per_row) * tile_width_;
64 int tile_y = (tile_id / tiles_per_row) * tile_height_;
65 std::vector<uint8_t> tile_data(tile_width_ * tile_height_, 0x00);
66 int tile_data_offset = 0;
67 bitmap_->Get16x16Tile(tile_x, tile_y, tile_data, tile_data_offset);
68 return Bitmap(16, 16, bitmap_->depth(), tile_data);
69 }
70
71 // Copy a tile within the tilesheet
72 void CopyTile(int srcX, int srcY, int destX, int destY, bool mirror_x = false,
73 bool mirror_y = false) {
74 auto src_tile = GetTile(srcX, srcY, tile_width_, tile_height_);
75 auto dest_tile_data = src_tile.vector();
76 MirrorTileData(dest_tile_data, mirror_x, mirror_y);
77 WriteTile(destX, destY, dest_tile_data);
78 }
79
80 auto bitmap() const { return bitmap_; }
81 auto mutable_bitmap() { return bitmap_; }
82 auto num_tiles() const { return num_tiles_; }
83 auto tile_width() const { return tile_width_; }
84 auto tile_height() const { return tile_height_; }
86 auto palette() const { return palette_; }
87 auto tile_type() const { return tile_type_; }
88 auto tile_info() const { return tile_info_; }
89 auto mutable_tile_info() { return tile_info_; }
90 void clear() {
91 palette_.clear();
92 internal_data_.clear();
93 tile_info_.clear();
94 bitmap_.reset();
95 num_tiles_ = 0;
96 }
97
98 private:
99 int CalculateTileIndex(int x, int y) {
100 return y * (bitmap_->width() / tile_width_) + x;
101 }
102
103 std::vector<uint8_t> FetchTileDataFromGraphicsBuffer(
104 const std::vector<uint8_t>& graphics_buffer, int tile_id);
105
106 void MirrorTileDataVertically(std::vector<uint8_t>& tileData);
107 void MirrorTileDataHorizontally(std::vector<uint8_t>& tileData);
108 void MirrorTileData(std::vector<uint8_t>& tileData, bool mirror_x,
109 bool mirror_y);
110
111 void WriteTile(int x, int y, const std::vector<uint8_t>& tileData) {
112 int tileDataOffset = 0;
113 bitmap_->Get8x8Tile(CalculateTileIndex(x, y), x, y,
114 const_cast<std::vector<uint8_t>&>(tileData),
115 tileDataOffset);
116 }
117
118 int num_tiles_ = 0;
119 int tile_width_ = 0;
122
125 std::vector<uint8_t> internal_data_;
126 std::vector<InternalTile16> tile_info_;
127 std::shared_ptr<Bitmap> bitmap_;
128};
129
130absl::StatusOr<Tilesheet> CreateTilesheetFromGraphicsBuffer(
131 const uint8_t* graphics_buffer, int width, int height, TileType tile_type,
132 int sheet_id);
133
134} // namespace gfx
135} // namespace yaze
136
137#endif // YAZE_APP_GFX_TILESHEET_H
Represents a bitmap image.
Definition bitmap.h:66
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
Tile composition of four 8x8 tiles.
Definition snes_tile.h:129
SNES 16-bit tile metadata container.
Definition snes_tile.h:49
void ComposeTile16(const std::vector< uint8_t > &graphics_buffer, const TileInfo &top_left, const TileInfo &top_right, const TileInfo &bottom_left, const TileInfo &bottom_right, int sheet_offset=0)
Definition tilesheet.cc:59
auto bitmap() const
Definition tilesheet.h:80
auto tile_height() const
Definition tilesheet.h:84
auto palette() const
Definition tilesheet.h:86
std::vector< uint8_t > internal_data_
Definition tilesheet.h:125
void CopyTile(int srcX, int srcY, int destX, int destY, bool mirror_x=false, bool mirror_y=false)
Definition tilesheet.h:72
Bitmap GetTile16(int tile_id)
Definition tilesheet.h:61
std::shared_ptr< Bitmap > bitmap_
Definition tilesheet.h:127
void MirrorTileDataVertically(std::vector< uint8_t > &tileData)
Definition tilesheet.cc:173
std::vector< uint8_t > FetchTileDataFromGraphicsBuffer(const std::vector< uint8_t > &graphics_buffer, int tile_id)
Definition tilesheet.cc:135
std::vector< InternalTile16 > tile_info_
Definition tilesheet.h:126
Tilesheet(std::shared_ptr< Bitmap > bitmap, int tileWidth, int tileHeight, TileType tile_type)
Definition tilesheet.h:31
auto tile_type() const
Definition tilesheet.h:87
auto tile_width() const
Definition tilesheet.h:83
auto set_palette(gfx::SnesPalette &palette)
Definition tilesheet.h:85
void ComposeAndPlaceTilePart(const std::vector< uint8_t > &graphics_buffer, const TileInfo &tile_info, int baseX, int baseY)
Definition tilesheet.cc:108
void MirrorTileDataHorizontally(std::vector< uint8_t > &tileData)
Definition tilesheet.cc:185
void ModifyTile16(const std::vector< uint8_t > &graphics_buffer, const TileInfo &top_left, const TileInfo &top_right, const TileInfo &bottom_left, const TileInfo &bottom_right, int tile_id, int sheet_offset=0)
Definition tilesheet.cc:84
SnesPalette palette_
Definition tilesheet.h:124
void Init(int width, int height, TileType tile_type)
Definition tilesheet.cc:46
Bitmap GetTile(int tileX, int tileY, int bmp_width, int bmp_height)
Definition tilesheet.h:53
auto num_tiles() const
Definition tilesheet.h:82
void WriteTile(int x, int y, const std::vector< uint8_t > &tileData)
Definition tilesheet.h:111
void MirrorTileData(std::vector< uint8_t > &tileData, bool mirror_x, bool mirror_y)
Definition tilesheet.cc:197
int CalculateTileIndex(int x, int y)
Definition tilesheet.h:99
auto tile_info() const
Definition tilesheet.h:88
Contains classes for handling graphical data.
Definition bitmap.cc:16
absl::StatusOr< Tilesheet > CreateTilesheetFromGraphicsBuffer(const uint8_t *graphics_buffer, int width, int height, TileType tile_type, int sheet_id)
Definition tilesheet.cc:12
Main namespace for the application.
Definition controller.cc:18
std::array< TileInfo, 4 > tiles
Definition tilesheet.h:17