27[[nodiscard]]
constexpr std::pair<std::size_t, std::size_t>
index_to_row_col(std::size_t index)
82template <SupportsTransparency PixelType>
89 explicit PixelTile(std::array<PixelType, tile::size_pix>
pix) : pix_{std::move(
pix)} {}
103 requires requires(const PixelType &p) { p.is_transparent(); }
105 return is_transparent_impl([](
const PixelType &pixel) {
return pixel.is_transparent(); });
120 requires requires(
const PixelType &p) { p.is_transparent(p); }
122 return is_transparent_impl([&extrinsic](
const PixelType &pixel) {
return pixel.is_transparent(extrinsic); });
147 requires requires(
const PixelType &p) { p.is_transparent(); }
149 return equals_ignoring_transparency_impl(other, [](
const PixelType &pixel) {
return pixel.is_transparent(); });
175 requires requires(
const PixelType &p) { p.is_transparent(p); }
177 return equals_ignoring_transparency_impl(
178 other, [&extrinsic](
const PixelType &pixel) {
return pixel.is_transparent(extrinsic); });
181 [[nodiscard]] PixelType
at(std::size_t i)
const
184 panic(
"index out of bounds: " + std::to_string(i));
189 [[nodiscard]] PixelType
at(std::size_t row, std::size_t col)
const
192 panic(
"row index out of bounds: " + std::to_string(row));
195 panic(
"col index out of bounds: " + std::to_string(col));
200 void set(std::size_t i,
const PixelType &p)
203 panic(
"index out of bounds: " + std::to_string(i));
208 void set(std::size_t row, std::size_t col,
const PixelType &p)
211 panic(
"row index out of bounds: " + std::to_string(row));
214 panic(
"col index out of bounds: " + std::to_string(col));
237 flipped_tile.set(row, col,
at(src_row, src_col));
258 requires requires(const PixelType &p) { p.is_transparent(); }
260 return unique_nontransparent_colors_impl([](
const PixelType &pixel) {
return pixel.is_transparent(); });
282 requires requires(
const PixelType &p) { p.is_transparent(p); }
284 return unique_nontransparent_colors_impl(
285 [&extrinsic](
const PixelType &pixel) {
return pixel.is_transparent(extrinsic); });
288 [[nodiscard]]
const std::array<PixelType, tile::size_pix> &
pix()
const
306 template <
typename TransparencyPredicate>
307 [[nodiscard]]
bool is_transparent_impl(TransparencyPredicate is_transparent_pred)
const
309 return std::ranges::all_of(
pix(), is_transparent_pred);
325 template <
typename TransparencyPredicate>
327 equals_ignoring_transparency_impl(
const PixelTile &other, TransparencyPredicate is_transparent_pred)
const
330 const auto &pixel1 = pix_.at(i);
331 const auto &pixel2 = other.pix_.at(i);
333 if (is_transparent_pred(pixel1) && is_transparent_pred(pixel2)) {
336 if (pixel1 != pixel2) {
355 template <
typename TransparencyPredicate>
356 [[nodiscard]] std::set<PixelType> unique_nontransparent_colors_impl(TransparencyPredicate is_transparent_pred)
const
358 std::set<PixelType> colors;
359 for (
const auto &pixel : pix_) {
360 if (!is_transparent_pred(pixel)) {
361 colors.insert(pixel);
367 std::array<PixelType, tile::size_pix> pix_;
An 8x8 tile backed by literal-array-based per-pixel storage of an arbitrary pixel type.
PixelTile flip(bool h_flip, bool v_flip) const
Creates a flipped copy of this PixelTile.
virtual ~PixelTile()=default
void set(std::size_t row, std::size_t col, const PixelType &p)
PixelType at(std::size_t row, std::size_t col) const
void set(std::size_t i, const PixelType &p)
auto operator<=>(const PixelTile &) const =default
std::set< PixelType > unique_nontransparent_colors(const PixelType &extrinsic) const
Returns the set of unique non-transparent colors present in this PixelTile.
const std::array< PixelType, tile::size_pix > & pix() const
bool equals_ignoring_transparency(const PixelTile &other, const PixelType &extrinsic) const
Compares this PixelTile with another, treating all transparent pixels as equal.
PixelType at(std::size_t i) const
bool is_transparent(const PixelType &extrinsic) const
Checks if this entire PixelTile is transparent.
bool equals_ignoring_transparency(const PixelTile &other) const
Compares this PixelTile with another, treating all transparent pixels as equal.
bool is_transparent() const
Checks if this entire PixelTile is transparent (intrinsic transparency only).
std::set< PixelType > unique_nontransparent_colors() const
Returns the set of unique non-transparent colors present in this PixelTile (intrinsic transparency on...
PixelTile(std::array< PixelType, tile::size_pix > pix)
constexpr std::size_t row_col_to_index(std::size_t row, std::size_t col)
Converts row and column coordinates to a linear index.
constexpr std::size_t size_pix
constexpr std::size_t side_length_pix
constexpr std::pair< std::size_t, std::size_t > index_to_row_col(std::size_t index)
Converts a linear index to row and column coordinates.
void panic(const StringViewSourceLoc &s)
Unconditionally terminates the program with a panic message.