mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
Add compatibility hack for unused colors in indexed PNGs
This commit is contained in:
@@ -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 */
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user