20 const std::vector<Tile8PixelData>& tile8_pixels) {
21 std::vector<uint8_t> tile16_pixels(kTile16PixelCount, 0);
23 for (
int quadrant = 0; quadrant < 4; ++quadrant) {
25 const int quadrant_x = quadrant % 2;
26 const int quadrant_y = quadrant / 2;
27 const int tile8_id = tile_info.
id_;
29 if (tile8_id < 0 || tile8_id >=
static_cast<int>(tile8_pixels.size())) {
37 const uint8_t palette_index =
38 static_cast<uint8_t
>(tile_info.
palette_ & 0x07);
40 for (
int ty = 0; ty < kTile8Size; ++ty) {
41 for (
int tx = 0; tx < kTile8Size; ++tx) {
42 const int src_x = x_flip ? (kTile8Size - 1 - tx) : tx;
43 const int src_y = y_flip ? (kTile8Size - 1 - ty) : ty;
44 const int src_index = src_y * kTile8Size + src_x;
46 const int dst_x = (quadrant_x * kTile8Size) + tx;
47 const int dst_y = (quadrant_y * kTile8Size) + ty;
48 const int dst_index = dst_y * kTile16Size + dst_x;
51 src_index >=
static_cast<int>(source_tile8.size()) ||
52 dst_index < 0 || dst_index >= kTile16PixelCount) {
56 const uint8_t pixel = source_tile8[
static_cast<size_t>(src_index)];
57 tile16_pixels[dst_index] = (pixel & 0x0F) + (palette_index * 0x10);
67 const std::vector<gfx::Bitmap>& tile8_bitmaps) {
68 std::vector<uint8_t> tile16_pixels(kTile16PixelCount, 0);
70 for (
int quadrant = 0; quadrant < 4; ++quadrant) {
72 const int quadrant_x = quadrant % 2;
73 const int quadrant_y = quadrant / 2;
74 const int tile8_id = tile_info.
id_;
76 if (tile8_id < 0 || tile8_id >=
static_cast<int>(tile8_bitmaps.size())) {
80 const gfx::Bitmap& source_tile8 = tile8_bitmaps[tile8_id];
81 if (!source_tile8.
is_active() || source_tile8.
data() ==
nullptr) {
87 const uint8_t palette_index =
88 static_cast<uint8_t
>(tile_info.
palette_ & 0x07);
90 for (
int ty = 0; ty < kTile8Size; ++ty) {
91 for (
int tx = 0; tx < kTile8Size; ++tx) {
92 const int src_x = x_flip ? (kTile8Size - 1 - tx) : tx;
93 const int src_y = y_flip ? (kTile8Size - 1 - ty) : ty;
94 const int src_index = src_y * kTile8Size + src_x;
96 const int dst_x = (quadrant_x * kTile8Size) + tx;
97 const int dst_y = (quadrant_y * kTile8Size) + ty;
98 const int dst_index = dst_y * kTile16Size + dst_x;
101 src_index >=
static_cast<int>(source_tile8.
size()) ||
102 dst_index < 0 || dst_index >= kTile16PixelCount) {
106 const uint8_t pixel = source_tile8.
data()[src_index];
107 tile16_pixels[dst_index] = (pixel & 0x0F) + (palette_index * 0x10);
112 return tile16_pixels;
117 const std::vector<Tile8PixelData>& tile8_pixels,
119 if (!output_bitmap) {
120 return absl::InvalidArgumentError(
"Output bitmap pointer is null");
122 if (tile8_pixels.empty()) {
123 return absl::FailedPreconditionError(
"Tile8 bitmap source is empty");
127 output_bitmap->
Create(kTile16Size, kTile16Size, 8, pixels);
128 return absl::OkStatus();
132 const gfx::Tile16& tile_data,
const std::vector<gfx::Bitmap>& tile8_bitmaps,
134 if (!output_bitmap) {
135 return absl::InvalidArgumentError(
"Output bitmap pointer is null");
137 if (tile8_bitmaps.empty()) {
138 return absl::FailedPreconditionError(
"Tile8 bitmap source is empty");
142 output_bitmap->
Create(kTile16Size, kTile16Size, 8, pixels);
143 return absl::OkStatus();
164 const int tiles_per_row = std::max(1,
destination->width() / kTile16Size);
165 const int tile_x = (tile_id % tiles_per_row) * kTile16Size;
166 const int tile_y = (tile_id / tiles_per_row) * kTile16Size;
168 for (
int ty = 0; ty < kTile16Size; ++ty) {
169 for (
int tx = 0; tx < kTile16Size; ++tx) {
170 const int src_index = ty * kTile16Size + tx;
171 const int dst_index =
172 (tile_y + ty) *
destination->width() + (tile_x + tx);
173 if (src_index <
static_cast<int>(source_bitmap.
size()) &&
174 dst_index <
static_cast<int>(
destination->size())) {
void Create(int width, int height, int depth, std::span< uint8_t > data)
Create a bitmap with the given dimensions and data.