Add compatibility hack for unused colors in indexed PNGs

This commit is contained in:
ISSOtm
2022-03-09 00:00:07 +01:00
committed by Eldred Habert
parent b95c26c886
commit 20442c8a43
5 changed files with 43 additions and 25 deletions

View File

@@ -73,6 +73,8 @@ struct Palette {
decltype(colors)::iterator end(); decltype(colors)::iterator end();
decltype(colors)::const_iterator begin() const; decltype(colors)::const_iterator begin() const;
decltype(colors)::const_iterator end() const; decltype(colors)::const_iterator end() const;
uint8_t size() const;
}; };
#endif /* RGBDS_GFX_MAIN_HPP */ #endif /* RGBDS_GFX_MAIN_HPP */

View File

@@ -374,7 +374,7 @@ void Palette::addColor(uint16_t color) {
} }
uint8_t Palette::indexOf(uint16_t color) const { uint8_t Palette::indexOf(uint16_t color) const {
return std::distance(colors.begin(), std::find(colors.begin(), colors.end(), color)); return std::find(colors.begin(), colors.end(), color) - colors.begin();
} }
auto Palette::begin() -> decltype(colors)::iterator { auto Palette::begin() -> decltype(colors)::iterator {
@@ -390,3 +390,7 @@ auto Palette::begin() const -> decltype(colors)::const_iterator {
auto Palette::end() const -> decltype(colors)::const_iterator { auto Palette::end() const -> decltype(colors)::const_iterator {
return std::find(colors.begin(), colors.end(), UINT16_MAX); return std::find(colors.begin(), colors.end(), UINT16_MAX);
} }
uint8_t Palette::size() const {
return indexOf(UINT16_MAX);
}

View File

@@ -10,27 +10,56 @@
#include "gfx/convert.hpp" #include "gfx/convert.hpp"
#include "gfx/main.hpp" #include "gfx/main.hpp"
using std::swap;
namespace sorting { namespace sorting {
void indexed(std::vector<Palette> &palettes, int palSize, png_color const *palRGB, void indexed(std::vector<Palette> &palettes, int palSize, png_color const *palRGB,
png_byte *palAlpha) { png_byte *palAlpha) {
options.verbosePrint("Sorting palettes using embedded palette...\n"); options.verbosePrint("Sorting palettes using embedded palette...\n");
auto pngToRgb = [&palRGB, &palAlpha](int index) {
auto const &c = palRGB[index];
return Rgba(c.red, c.green, c.blue, palAlpha ? palAlpha[index] : 0xFF);
};
// HACK: for compatibility with old versions, add unused colors if:
// - there is only one palette, and
// - only some of the first N colors are being used
if (palettes.size() == 1) {
Palette &palette = palettes[0];
// Build our candidate array of colors
decltype(palette.colors) colors{UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX};
for (int i = 0; i < options.maxPalSize(); ++i) {
colors[i] = pngToRgb(i).cgbColor();
}
// Check that the palette only uses those colors
if (std::all_of(palette.begin(), palette.end(), [&colors](uint16_t color) {
return std::find(colors.begin(), colors.end(), color) != colors.end();
})) {
if (palette.size() != options.maxPalSize()) {
warning("Unused color in PNG embedded palette was re-added; please use `-c embedded` to get this in future versions");
}
// Overwrite the palette, and return with that (it's already sorted)
palette.colors = colors;
return;
}
}
for (Palette &pal : palettes) { for (Palette &pal : palettes) {
std::sort(pal.begin(), pal.end(), [&](uint16_t lhs, uint16_t rhs) { std::sort(pal.begin(), pal.end(), [&](uint16_t lhs, uint16_t rhs) {
// Iterate through the PNG's palette, looking for either of the two // Iterate through the PNG's palette, looking for either of the two
for (int i = 0; i < palSize; ++i) { for (int i = 0; i < palSize; ++i) {
auto const &c = palRGB[i]; uint16_t color = pngToRgb(i).cgbColor();
Rgba color(c.red, c.green, c.blue, palAlpha ? palAlpha[i] : 0xFF); if (color == Rgba::transparent) {
uint16_t cgbColor = color.cgbColor();
if (cgbColor == Rgba::transparent) {
continue; continue;
} }
// Return whether lhs < rhs // Return whether lhs < rhs
if (cgbColor == rhs) { if (color == rhs) {
return false; return false;
} }
if (cgbColor == lhs) { if (color == lhs) {
return true; return true;
} }
} }

View File

@@ -1,16 +0,0 @@
diff --git a/Makefile b/Makefile
index ca08f23f..abd2e95c 100644
--- a/Makefile
+++ b/Makefile
@@ -170,9 +170,9 @@ gfx/pokemon/girafarig/front.animated.tilemap: gfx/pokemon/girafarig/front.2bpp g
### Misc file-specific graphics rules
-gfx/pokemon/%/back.2bpp: rgbgfx += -h
+gfx/pokemon/%/back.2bpp: rgbgfx += -h -c embedded
-gfx/trainers/%.2bpp: rgbgfx += -h
+gfx/trainers/%.2bpp: rgbgfx += -h -c embedded
gfx/pokemon/egg/unused_front.2bpp: rgbgfx += -h

View File

@@ -30,8 +30,7 @@ if [ ! -d pokecrystal ]; then
fi fi
pushd pokecrystal pushd pokecrystal
git fetch git fetch
git checkout a3e31d6463e6313aed12ebc733b3f772f2fc78d7 -f git checkout a3e31d6463e6313aed12ebc733b3f772f2fc78d7
git apply ../pokecrystal.patch
make clean make clean
make -j4 compare RGBDS=../../ make -j4 compare RGBDS=../../
popd popd