28#include <unordered_set>
45 metatileizer.metatileize(
49 "failed to metatileize input layer images for " + tileset.
name(),
50 std::unique_ptr<Tileset>);
81 format_->
format(
"({})", num_tiles_primary.source()),
84 diag_->
warn(
"test-warning", std::vector{std::string{
"foo"}, std::string{
"bar"}, std::string{
"baz"}});
85 diag_->
warn_note(
"test-warning", std::vector{std::string{
"foo"}, std::string{
"bar"}, std::string{
"baz"}});
86 diag_->
err(
"test-error", std::vector{std::string{
"foo"}, std::string{
"bar"}, std::string{
"baz"}});
90 if (metatiles.size() > num_metatiles_primary.value()) {
92 "too many input metatiles: found '{}' > '{}' (num_metatiles_primary)",
98 std::vector<PixelTile<Rgba32>> tiles{};
100 for (
const auto &metatile : metatiles) {
101 const auto decomposed = metatile.decompose();
102 for (
const auto &pixel_tile : decomposed) {
103 tiles.push_back(pixel_tile);
111 PT_TRY_CALL_CHAIN_ERR(validator.validate_alpha_channels(tiles),
"tile validation error", std::unique_ptr<Tileset>);
113 validator.validate_unique_color_count(tiles, extrinsic_transparency.value()),
114 "tile validation error",
115 std::unique_ptr<Tileset>);
117 validator.generate_precision_loss_warnings(tiles),
"tile validation error", std::unique_ptr<Tileset>);
131 auto new_porytiles_component = std::make_unique<PorytilesTilesetComponent>(tileset.
porytiles_component());
141 auto new_porymap_component = std::make_unique<PorymapTilesetComponent>();
145 pal.set(extrinsic_transparency.value(), 0);
147 new_porymap_component->tiles_png(tiles_png);
149 new_porymap_component->set_pal(pal, i);
156 new_porymap_component->push_back_tilemap_entry(
TilemapEntry{1, 1,
false,
false});
157 new_porymap_component->push_back_tilemap_entry(
TilemapEntry{1, 1,
true,
true});
161 new_porymap_component->push_back_attribute(attr);
165 std::make_unique<Tileset>(tileset.
name(), std::move(new_porytiles_component), std::move(new_porymap_component));
192 metatileizer.metatileize(
196 "failed to metatileize input layer images for " + tileset.
name(),
197 std::unique_ptr<Tileset>);
198 if (porytiles_metatiles.size() > num_metatiles_primary) {
202 std::vector<PixelTile<Rgba32>> porytiles_pixel_rgba = metatile::decompose(porytiles_metatiles);
203 std::vector<CanonicalPixelTile<Rgba32>> porytiles_canonical_pixel_rgba =
204 transform<CanonicalPixelTile<Rgba32>>(porytiles_pixel_rgba);
211 validator.validate_alpha_channels(porytiles_pixel_rgba),
"tile validation error", std::unique_ptr<Tileset>);
213 validator.validate_unique_color_count(porytiles_pixel_rgba, extrinsic_transparency.value()),
214 "tile validation error",
215 std::unique_ptr<Tileset>);
217 validator.generate_precision_loss_warnings(porytiles_pixel_rgba),
218 "tile validation error",
219 std::unique_ptr<Tileset>);
225 "failed to triple-layerize Porymap component for tileset " + tileset.
name(),
226 std::unique_ptr<Tileset>);
229 metatile_decompiler.decompile_metatiles(
231 "failed to decompile Porymap component for tileset " + tileset.
name(),
232 std::unique_ptr<Tileset>);
238 std::vector<PixelTile<Rgba32>> porymap_pixel_rgba = metatile::decompose(porymap_metatiles);
239 std::vector<CanonicalPixelTile<Rgba32>> porymap_canonical_pixel_rgba =
240 transform<CanonicalPixelTile<Rgba32>>(porymap_pixel_rgba);
248 ColorIndexMap color_index_map{porytiles_pixel_rgba, extrinsic_transparency.value()};
249 std::size_t color_count = color_index_map.
size();
250 std::size_t color_count_limit = num_pals_primary.value() * (
pal::max_size - 1);
251 if (color_count > color_count_limit) {
253 "color-limit-exceeded",
255 "too many unique colors ({}) in Porytiles component for tileset '{}'",
259 std::vector<std::string> note_text;
260 note_text.push_back(format_->
format(
262 note_text.push_back(format_->format(
265 FormatParam{num_pals_primary.value(), Style::bold}));
266 note_text.push_back(format_->format(
"Source: {}", num_pals_primary.source()));
268 if (!num_pals_primary.source_details().empty()) {
269 note_text.emplace_back(
"");
270 std::ranges::copy(num_pals_primary.source_details(), std::back_inserter(note_text));
272 note_text.emplace_back(
"");
273 note_text.push_back(format_->format(
274 "Color limit definition: {} * {}: {} * {}: {}",
275 FormatParam{num_pals_primary.name(), Style::bold},
276 FormatParam{
"nontransparent_colors_per_pal", Style::bold},
277 FormatParam{num_pals_primary.value(), Style::bold},
278 FormatParam{(pal::max_size - 1), Style::bold},
279 FormatParam{color_count_limit, Style::bold}));
281 diag_->note(
"color-limit-exceeded", note_text);
300 std::vector<unsigned int> pal_indexes;
301 std::vector<Palette<Rgba32>> porymap_pals{};
302 porymap_pals.reserve(num_pals_primary.value());
303 for (
unsigned int i = 0; i < num_pals_primary.value(); i++) {
304 porymap_pals.push_back(tileset.porymap_component().pals()[i]);
307 panic(
"TODO: finish implementation");
#define PT_TRY_ASSIGN_CHAIN_ERR(var, expr, msg, return_type)
Unwraps a ChainableResult, chaining a new error message on failure.
#define PT_TRY_CALL_CHAIN_ERR(expr, msg, return_type)
Unwraps a void ChainableResult, chaining a new error message on failure.
A result type that maintains a chainable sequence of errors for debugging and error reporting.
A bidirectional mapping between pixel color values and sequential integer indices.
std::size_t size() const
Returns the number of unique colors in the mapping.
A template for two-dimensional images with arbitrarily typed pixel values.
A palette container for colors that support transparency checking.
const std::array< Palette< Rgba32 >, pal::num_pals > & pals() const
ChainableResult< tileset::LayerMode > detect_layer_mode() const
const Image< IndexPixel > & tiles_png() const
const std::vector< MetatileAttribute > & metatile_attributes_bin() const
const Image< Rgba32 > & middle() const
const Image< Rgba32 > & top() const
const Image< Rgba32 > & bottom() const
ChainableResult< std::unique_ptr< Tileset > > compile_patch_tiles_fixed_pals_fixed(const Tileset &tileset)
ChainableResult< std::unique_ptr< Tileset > > compile(const Tileset &tileset)
virtual std::string format(const std::string &format_str, const std::vector< FormatParam > ¶ms) const
Formats a string with styled parameters using fmtlib syntax.
A collection of tile validation functions for compilation operations.
Represents a tilemap entry referencing a tile with palette and flip attributes.
A complete tileset containing both Porytiles and Porymap components.
const PorytilesTilesetComponent & porytiles_component() const
const PorymapTilesetComponent & porymap_component() const
const std::string & name() const
void err(const std::string &tag, const std::string &msg) const
Display a tagged error message.
void warn(const std::string &tag, const std::string &msg) const
Display a tagged warning message.
void note(const std::string &tag, const std::string &msg) const
Display a tagged informational note message.
void warn_note(const std::string &tag, const std::string &msg) const
Display a note message with a warning tag.
constexpr std::size_t max_size
constexpr std::size_t num_pals
constexpr Rgba32 rgba_red
void panic(const StringViewSourceLoc &s)
Unconditionally terminates the program with a panic message.
@ bold
Bold text formatting.
#define PT_UNWRAP_SCOPED_CONFIG(ptr, config, tileset, return_type)
Unwraps a scoped config value from a DomainConfig, AppConfig, or InfraConfig object,...