Porytiles
Loading...
Searching...
No Matches
tiles_png_workspace.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <map>
4#include <optional>
5#include <vector>
6
13
14namespace porytiles {
15
23enum class ExportFlipMode {
33
43};
44
52enum class ExportTrimMode {
61
70};
71
91 public:
108 explicit TilesPngWorkspace(std::size_t capacity);
109
142 explicit TilesPngWorkspace(const Image<IndexPixel> &img, std::size_t capacity);
143
162 [[nodiscard]] static TilesPngWorkspace for_secondary(
163 const Image<IndexPixel> &primary_tiles_png, std::size_t primary_tile_count, std::size_t total_capacity);
164
180 [[nodiscard]] static TilesPngWorkspace
181 for_standalone_secondary(std::size_t primary_tile_count, std::size_t total_capacity);
182
211 [[nodiscard]] std::size_t insert_tile(const CanonicalPixelTile<IndexPixel> &tile);
212
234 [[nodiscard]] std::optional<std::size_t> first_occurrence_of(const CanonicalPixelTile<IndexPixel> &tile) const;
235
257 [[nodiscard]] std::optional<std::size_t> first_occurrence_of_by_color(
258 const CanonicalPixelTile<IndexPixel> &tile, const Palette<Rgba32, pal::max_size> &palette) const;
259
276 [[nodiscard]] CanonicalPixelTile<IndexPixel> tile_at(std::size_t index) const;
277
306 [[nodiscard]] Image<IndexPixel> export_image(
309
326 std::size_t primary_tile_count,
329
344 [[nodiscard]] bool at_capacity() const;
345
367 void reserve_anim_slots(std::size_t anim_tile_count, std::size_t start_offset = 1);
368
384 void place_anim_tile(std::size_t reserved_index, const CanonicalPixelTile<IndexPixel> &tile);
385
396 [[nodiscard]] std::size_t anim_start_offset() const
397 {
398 return anim_start_offset_;
399 }
400
410 [[nodiscard]] std::size_t anim_end_offset() const
411 {
412 return anim_end_offset_;
413 }
414
420 [[nodiscard]] bool has_anim_slots() const
421 {
422 return anim_end_offset_ > anim_start_offset_;
423 }
424
436 [[nodiscard]] std::optional<std::size_t> find_contiguous_transparent_slots(std::size_t count) const;
437
459 [[nodiscard]] std::optional<std::size_t> find_existing_contiguous_tiles_by_color(
460 const std::vector<CanonicalPixelTile<IndexPixel>> &tiles,
461 const std::vector<const Palette<Rgba32, pal::max_size> *> &palettes) const;
462
476 void place_tiles_at(std::size_t start_index, const std::vector<CanonicalPixelTile<IndexPixel>> &tiles);
477
487 [[nodiscard]] std::size_t capacity() const
488 {
489 return capacity_;
490 }
491
492 private:
501 void advance_cursor_to_next_transparent();
502
503 std::vector<CanonicalPixelTile<IndexPixel>> tiles_;
504 std::map<PixelTile<IndexPixel>, std::vector<std::size_t>> canonical_forms_;
505 std::size_t cursor_;
506 std::size_t capacity_;
507 std::size_t anim_start_offset_{1}; // First index in anim region (defaults to 1 for primary tilesets)
508 std::size_t anim_end_offset_{1}; // First index after anim region (defaults to 1, i.e. no animations)
509};
510
511} // namespace porytiles
A PixelTile representation that stores the canonical (lexicographically minimal) orientation among al...
A template for two-dimensional images with arbitrarily typed pixel values.
Definition image.hpp:23
A generic palette container for colors that support transparency checking.
Definition palette.hpp:47
A workspace for managing canonical IndexPixel tiles destined for tiles.png output.
bool at_capacity() const
Checks if the workspace has reached capacity and can no longer accept new tile insertions.
std::optional< std::size_t > find_contiguous_transparent_slots(std::size_t count) const
Finds the first contiguous run of transparent tiles that can accommodate the requested count.
Image< IndexPixel > export_secondary_image(std::size_t primary_tile_count, ExportFlipMode flip_mode=ExportFlipMode::canonical, ExportTrimMode trim_mode=ExportTrimMode::trim_trailing_transparent) const
Exports only the secondary portion of the workspace (tiles from primary_tile_count onward).
std::size_t capacity() const
Returns the maximum number of tiles this workspace can hold.
CanonicalPixelTile< IndexPixel > tile_at(std::size_t index) const
Retrieves the canonical tile at the specified index in the workspace.
std::size_t anim_start_offset() const
Returns the starting absolute index for animation tiles.
static TilesPngWorkspace for_secondary(const Image< IndexPixel > &primary_tiles_png, std::size_t primary_tile_count, std::size_t total_capacity)
Creates a workspace pre-loaded with primary tiles for secondary tileset compilation.
std::optional< std::size_t > first_occurrence_of_by_color(const CanonicalPixelTile< IndexPixel > &tile, const Palette< Rgba32, pal::max_size > &palette) const
Finds the first occurrence of a tile using color-equivalence comparison.
void place_tiles_at(std::size_t start_index, const std::vector< CanonicalPixelTile< IndexPixel > > &tiles)
Places tiles at specific positions for patch mode animation placement.
std::optional< std::size_t > find_existing_contiguous_tiles_by_color(const std::vector< CanonicalPixelTile< IndexPixel > > &tiles, const std::vector< const Palette< Rgba32, pal::max_size > * > &palettes) const
Checks if a sequence of tiles already exists contiguously using color-equivalence comparison.
std::size_t anim_end_offset() const
Returns the ending absolute index for animation tiles (exclusive).
bool has_anim_slots() const
Returns whether animation slots have been reserved.
std::optional< std::size_t > first_occurrence_of(const CanonicalPixelTile< IndexPixel > &tile) const
Finds the first occurrence index of a given canonical tile in the workspace.
static TilesPngWorkspace for_standalone_secondary(std::size_t primary_tile_count, std::size_t total_capacity)
Creates a workspace for standalone secondary compilation with no paired primary.
void place_anim_tile(std::size_t reserved_index, const CanonicalPixelTile< IndexPixel > &tile)
Places an animation keyframe tile at a specific reserved index.
void reserve_anim_slots(std::size_t anim_tile_count, std::size_t start_offset=1)
Reserves contiguous slots for animation keyframe tiles starting at start_offset.
std::size_t insert_tile(const CanonicalPixelTile< IndexPixel > &tile)
Attempts to insert a non-transparent tile into the workspace at the current cursor position.
Image< IndexPixel > export_image(ExportFlipMode flip_mode=ExportFlipMode::canonical, ExportTrimMode trim_mode=ExportTrimMode::trim_trailing_transparent) const
Exports the workspace tiles to an Image<IndexPixel> in tiles.png format.
ExportTrimMode
Defines how trailing transparent tiles should be handled during image export.
@ include_trailing_transparent
Include all tiles up to workspace capacity, even if trailing tiles are transparent.
@ trim_trailing_transparent
Trim trailing transparent tiles from the exported image.
ExportFlipMode
Defines whether flip transformations should be applied during image export.
@ original
Export tiles in original form by applying stored flip transformations.
@ canonical
Export tiles in canonical form without applying flip transformations.