diff --git a/.clang-format b/.clang-format index db481b97..24714372 100644 --- a/.clang-format +++ b/.clang-format @@ -42,6 +42,8 @@ EmptyLineBeforeAccessModifier: Leave FixNamespaceComments: false IncludeBlocks: Regroup IncludeCategories: + - Regex: '^"platform\.hpp"$' + Priority: -1 - Regex: '^ #include #include @@ -12,7 +14,6 @@ #include #include "helpers.hpp" // assume -#include "platform.hpp" class File { std::variant _file; diff --git a/include/gfx/pal_spec.hpp b/include/gfx/pal_spec.hpp index d19d7fe3..6cf3dcd8 100644 --- a/include/gfx/pal_spec.hpp +++ b/include/gfx/pal_spec.hpp @@ -4,8 +4,12 @@ #define RGBDS_GFX_PAL_SPEC_HPP #include +#include + +#include "gfx/png.hpp" void parseInlinePalSpec(char const * const rawArg); +void parseEmbeddedPalSpec(Png const &png); void parseExternalPalSpec(char const *arg); void parseDmgPalSpec(char const * const rawArg); void parseBackgroundPalSpec(char const *arg); diff --git a/include/gfx/process.hpp b/include/gfx/process.hpp index d0105ff2..afa5955e 100644 --- a/include/gfx/process.hpp +++ b/include/gfx/process.hpp @@ -3,7 +3,9 @@ #ifndef RGBDS_GFX_PROCESS_HPP #define RGBDS_GFX_PROCESS_HPP +#include "gfx/png.hpp" + void processPalettes(); -void process(); +void process(Png &&png); #endif // RGBDS_GFX_PROCESS_HPP diff --git a/include/platform.hpp b/include/platform.hpp index 89f19aaf..ab7d4fc6 100644 --- a/include/platform.hpp +++ b/include/platform.hpp @@ -3,6 +3,12 @@ #ifndef RGBDS_PLATFORM_HPP #define RGBDS_PLATFORM_HPP +// MingGW and Cygwin may need POSIX functions which are not standard C explicitly enabled +// Make sure to keep this before any system header! +#if (defined(__MINGW32__) || defined(__CYGWIN__)) && !defined(_POSIX_C_SOURCE) + #define _POSIX_C_SOURCE 200809L +#endif + // MSVC doesn't have str(n)casecmp, use a suitable replacement #ifdef _MSC_VER #include // IWYU pragma: export @@ -55,17 +61,6 @@ #define setmode(fd, mode) (0) #endif -// Windows has 32-bit `long`, which limits `fseek` and `ftell` to 2 GiB -#if defined(_MSC_VER) || defined(__MINGW32__) - #define fseek _fseeki64 - #define ftell _ftelli64 -#endif - -// MingGW and Cygwin may need POSIX functions which are not standard C explicitly enabled -#if (defined(__MINGW32__) || defined(__CYGWIN__)) && !defined(_POSIX_C_SOURCE) - #define _POSIX_C_SOURCE 200809L -#endif - // Apple has deprecated `sprintf` since Xcode 14 (for macOS 13), but we use it solely in // contexts where both the size of the buffer *and* max size of the printed string are // known statically, which GCC thus checks for. diff --git a/src/asm/fstack.cpp b/src/asm/fstack.cpp index 7d363bc8..e00cc695 100644 --- a/src/asm/fstack.cpp +++ b/src/asm/fstack.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" // strncasecmp + #include "asm/fstack.hpp" #include @@ -22,7 +24,6 @@ #include "helpers.hpp" #include "itertools.hpp" // reversed #include "linkdefs.hpp" -#include "platform.hpp" // strncasecmp #include "verbosity.hpp" #include "asm/intern.hpp" diff --git a/src/asm/lexer.cpp b/src/asm/lexer.cpp index 2f560217..35d6ce44 100644 --- a/src/asm/lexer.cpp +++ b/src/asm/lexer.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "asm/lexer.hpp" #include @@ -27,7 +29,6 @@ #include #include "helpers.hpp" -#include "platform.hpp" #include "style.hpp" #include "util.hpp" #include "verbosity.hpp" diff --git a/src/asm/main.cpp b/src/asm/main.cpp index 712d81e7..a7896c0f 100644 --- a/src/asm/main.cpp +++ b/src/asm/main.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "asm/main.hpp" #include @@ -23,8 +25,7 @@ #include "diagnostics.hpp" #include "helpers.hpp" #include "parser.hpp" // Generated from parser.y -#include "platform.hpp" -#include "style.hpp" // style_Parse +#include "style.hpp" // style_Parse #include "usage.hpp" #include "util.hpp" // UpperMap #include "verbosity.hpp" diff --git a/src/asm/output.cpp b/src/asm/output.cpp index f635c9e5..405d7ae0 100644 --- a/src/asm/output.cpp +++ b/src/asm/output.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "asm/output.hpp" #include @@ -16,7 +18,6 @@ #include "helpers.hpp" // assume, Defer #include "linkdefs.hpp" -#include "platform.hpp" #include "util.hpp" // xfclose #include "asm/charmap.hpp" diff --git a/src/asm/section.cpp b/src/asm/section.cpp index 5d784466..4e0f081b 100644 --- a/src/asm/section.cpp +++ b/src/asm/section.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" // fseek + #include "asm/section.hpp" #include @@ -21,8 +23,7 @@ #include "helpers.hpp" #include "itertools.hpp" // InsertionOrderedMap #include "linkdefs.hpp" -#include "platform.hpp" // fseek -#include "util.hpp" // xfclose, seekSize +#include "util.hpp" // xfclose, seekSize #include "asm/fstack.hpp" #include "asm/lexer.hpp" diff --git a/src/backtrace.cpp b/src/backtrace.cpp index c113ca7c..245a2fc4 100644 --- a/src/backtrace.cpp +++ b/src/backtrace.cpp @@ -1,12 +1,13 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" // strcasecmp + #include "backtrace.hpp" #include #include -#include "platform.hpp" // strcasecmp -#include "util.hpp" // parseWholeNumber +#include "util.hpp" // parseWholeNumber Tracing tracing; diff --git a/src/fix/fix.cpp b/src/fix/fix.cpp index 05a2e58b..9cf7d613 100644 --- a/src/fix/fix.cpp +++ b/src/fix/fix.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "fix/fix.hpp" #include @@ -14,7 +16,6 @@ #include "diagnostics.hpp" #include "helpers.hpp" -#include "platform.hpp" #include "util.hpp" // xclose, xfclose #include "fix/main.hpp" diff --git a/src/fix/main.cpp b/src/fix/main.cpp index bfdcbd84..2d93b7ce 100644 --- a/src/fix/main.cpp +++ b/src/fix/main.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "fix/main.hpp" #include @@ -15,7 +17,6 @@ #include "cli.hpp" #include "diagnostics.hpp" #include "helpers.hpp" -#include "platform.hpp" #include "style.hpp" #include "usage.hpp" #include "util.hpp" diff --git a/src/fix/mbc.cpp b/src/fix/mbc.cpp index 5546b8c2..db8815cb 100644 --- a/src/fix/mbc.cpp +++ b/src/fix/mbc.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" // strcasecmp + #include "fix/mbc.hpp" #include @@ -10,8 +12,7 @@ #include #include -#include "helpers.hpp" // unreachable_ -#include "platform.hpp" // strcasecmp +#include "helpers.hpp" // unreachable_ #include "util.hpp" #include "fix/warning.hpp" diff --git a/src/gfx/main.cpp b/src/gfx/main.cpp index b807e12f..38dfc388 100644 --- a/src/gfx/main.cpp +++ b/src/gfx/main.cpp @@ -1,10 +1,13 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "gfx/main.hpp" #include #include #include +#include #include #include #include @@ -18,7 +21,6 @@ #include "diagnostics.hpp" #include "file.hpp" #include "helpers.hpp" -#include "platform.hpp" #include "style.hpp" // style_Parse #include "usage.hpp" #include "util.hpp" @@ -479,6 +481,7 @@ static void parseArg(int ch, char *arg) { // LCOV_EXCL_START static void verboseOutputConfig() { usage.printVersion(true); + fprintf(stderr, "Using libpng %s\n", png_get_libpng_ver(nullptr)); printVVVVVVerbosity(); @@ -524,12 +527,18 @@ static void verboseOutputConfig() { break; case Options::INLINE: case Options::EXTERNAL: - fputs("\tExplicit palette spec\n\t[\n", stderr); + case Options::EMBEDDED: + if (options.palSpecType == Options::EMBEDDED) { + fputs("\tEmbedded palette spec from PNG indexed PLTE chunk\n", stderr); + } else { + fputs("\tExplicit palette spec\n", stderr); + } + fputs("\t[\n", stderr); for (auto const &pal : options.palSpec) { fputs("\t\t", stderr); for (auto const &color : pal) { if (color.has_value()) { - fprintf(stderr, "#%06x, ", color->toCSS() >> 8); + fprintf(stderr, "#%08x, ", color->toCSS()); } else { fputs("#none, ", stderr); } @@ -538,9 +547,6 @@ static void verboseOutputConfig() { } fputs("\t]\n", stderr); break; - case Options::EMBEDDED: - fputs("\tEmbedded palette spec from PNG indexed PLTE chunk\n", stderr); - break; case Options::DMG: fprintf(stderr, "\tDMG palette spec $%02" PRIx8 "\n", options.palSpecDmg); break; @@ -671,13 +677,32 @@ int main(int argc, char *argv[]) { autoOutPath(localOptions.autoPalettes, options.palettes, ".pal"); autoOutPath(localOptions.autoPalmap, options.palmap, ".palmap"); + // Read the input image now since it may be needed for parsing an embedded palette spec + bool useInputImage = !options.input.empty() && !localOptions.reverse; + Png png; + if (useInputImage) { + if (File image; + image.open(options.input, std::ios_base::in | std::ios_base::binary) == nullptr) { + fatal( + "Failed to open PNG image (\"%s\"): %s", image.c_str(options.input), strerror(errno) + ); + } else { + png = Png(image.c_str(options.input), *image); + } + } + // Execute deferred pal spec parsing, now that all other params are known. // Do not parse pal specs if `options.nbColorsPerPal` is invalid. if (options.nbColorsPerPal > 0 && options.nbColorsPerPal <= 4) { switch (options.palSpecType) { case Options::NO_SPEC: + assume(!localOptions.palSpec); + break; case Options::EMBEDDED: assume(!localOptions.palSpec); + if (useInputImage) { + parseEmbeddedPalSpec(png); + } break; case Options::INLINE: assume(localOptions.palSpec); @@ -703,7 +728,7 @@ int main(int argc, char *argv[]) { if (localOptions.reverse) { reverse(); } else { - process(); + process(std::move(png)); } } else if (!options.palettes.empty() && options.hasExplicitPalSpec() && !localOptions.reverse) { processPalettes(); diff --git a/src/gfx/pal_spec.cpp b/src/gfx/pal_spec.cpp index 045881c4..f667b36a 100644 --- a/src/gfx/pal_spec.cpp +++ b/src/gfx/pal_spec.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "gfx/pal_spec.hpp" #include @@ -20,8 +22,8 @@ #include #include "diagnostics.hpp" +#include "file.hpp" #include "helpers.hpp" -#include "platform.hpp" #include "util.hpp" // UpperMap, parseDigit #include "gfx/main.hpp" @@ -174,6 +176,28 @@ void parseInlinePalSpec(char const * const rawArg) { } } +void parseEmbeddedPalSpec(Png const &png) { + // Generate a palette spec from one palette's length of colors in the embedded palette + if (png.palette.empty()) { + error("\"-c embedded\" was given, but the PNG does not have an embedded palette"); + return; + } + + // Ignore extraneous colors if they are unused + size_t nbColors = png.palette.size(); + if (nbColors > options.maxOpaqueColors()) { + nbColors = options.maxOpaqueColors(); + } + + // Fill in the palette spec + options.palSpec.clear(); + auto &palette = options.palSpec.emplace_back(); + assume(nbColors <= palette.size()); + for (size_t i = 0; i < nbColors; ++i) { + palette[i] = png.palette[i]; + } +} + // Appends the first line read from `file` to the end of the provided `buffer`. // Returns true if a line was read. [[nodiscard]] diff --git a/src/gfx/process.cpp b/src/gfx/process.cpp index 318445ec..5cee407a 100644 --- a/src/gfx/process.cpp +++ b/src/gfx/process.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include @@ -77,8 +76,8 @@ public: }; struct Image { - Png png{}; - ImagePalette colors{}; + Png png; + ImagePalette colors; Rgba &pixel(uint32_t x, uint32_t y) { return png.pixels[y * png.width + x]; } Rgba const &pixel(uint32_t x, uint32_t y) const { return png.pixels[y * png.width + x]; } @@ -127,14 +126,7 @@ struct Image { return {GrayscaleResult::GRAY_OK, std::nullopt}; } - explicit Image(std::string const &path) { - File input; - if (input.open(path, std::ios_base::in | std::ios_base::binary) == nullptr) { - fatal("Failed to open input image (\"%s\"): %s", input.c_str(path), strerror(errno)); - } - - png = Png(input.c_str(path), *input); - + explicit Image(Png &&png_) : png(std::move(png_)), colors() { // Validate input slice if (options.inputSlice.width == 0 && png.width % 8 != 0) { fatal("Image width (%" PRIu32 " pixels) is not a multiple of 8", png.width); @@ -332,28 +324,6 @@ struct AttrmapEntry { } }; -static void generatePalSpec(Image const &image) { - // Generate a palette spec from the first few colors in the embedded palette - std::vector const &embPal = image.png.palette; - if (embPal.empty()) { - fatal("\"-c embedded\" was given, but the PNG does not have an embedded palette"); - } - - // Ignore extraneous colors if they are unused - size_t nbColors = embPal.size(); - if (nbColors > options.maxOpaqueColors()) { - nbColors = options.maxOpaqueColors(); - } - - // Fill in the palette spec - options.palSpec.clear(); - auto &palette = options.palSpec.emplace_back(); - assume(nbColors <= palette.size()); - for (size_t i = 0; i < nbColors; ++i) { - palette[i] = embPal[i]; - } -} - static std::pair, std::vector> generatePalettes(std::vector const &colorSets, Image const &image) { // Run a "pagination" problem solver @@ -450,7 +420,7 @@ static std::pair, std::vector> if (i + skipFirst >= options.nbColorsPerPal) { error( "Each palette spec can only contain up to %" PRIu8 - " color%s plus the implict transparent color", + " color%s plus the implicit transparent color", options.nbColorsPerPal - 1, options.nbColorsPerPal - 1 == 1 ? "" : "s" ); @@ -992,8 +962,6 @@ static void } void processPalettes() { - verbosePrint(VERB_CONFIG, "Using libpng %s\n", png_get_libpng_ver(nullptr)); - std::vector colorSets; std::vector palettes; std::tie(std::ignore, palettes) = makePalsAsSpecified(colorSets); @@ -1001,11 +969,9 @@ void processPalettes() { outputPalettes(palettes); } -void process() { - verbosePrint(VERB_CONFIG, "Using libpng %s\n", png_get_libpng_ver(nullptr)); - +void process(Png &&png) { verbosePrint(VERB_NOTICE, "Reading tiles...\n"); - Image image(options.input); // This also sets `hasTransparentPixels` as a side effect + Image image(std::move(png)); // This also sets `hasTransparentPixels` as a side effect // LCOV_EXCL_START verboseDo(VERB_INFO, [&]() { @@ -1195,9 +1161,6 @@ continue_visiting_tiles:; fatal("Image does not contain any colors"); } - if (options.palSpecType == Options::EMBEDDED) { - generatePalSpec(image); - } auto [mappings, palettes] = options.palSpecType == Options::NO_SPEC || options.palSpecType == Options::DMG ? generatePalettes(colorSets, image) diff --git a/src/gfx/reverse.cpp b/src/gfx/reverse.cpp index 8a353108..617504e4 100644 --- a/src/gfx/reverse.cpp +++ b/src/gfx/reverse.cpp @@ -107,8 +107,6 @@ static void printPalette(std::array, 4> const &palette) { } void reverse() { - verbosePrint(VERB_CONFIG, "Using libpng %s\n", png_get_libpng_ver(nullptr)); - // Check for weird flag combinations if (options.output.empty()) { @@ -205,6 +203,7 @@ void reverse() { {grayColors[0], grayColors[1], grayColors[2], grayColors[3]} }; // If a palette file or palette spec is used as input, it overrides the default colors. + bool grayscale = false; if (!options.palettes.empty()) { File file; if (!file.open(options.palettes, std::ios::in | std::ios::binary)) { @@ -280,11 +279,15 @@ void reverse() { for (size_t i = 0; i < palettes[0].size(); ++i) { palettes[0][i] = grayColors[options.dmgValue(i)]; } + grayscale = true; } else if (options.palSpecType == Options::EMBEDDED) { warnx("An embedded palette was requested, but no palette file was specified; ignoring " "request"); + grayscale = true; } else if (options.hasExplicitPalSpec()) { palettes = std::move(options.palSpec); // We won't be using it again. + } else { + grayscale = true; } std::optional> attrmap; @@ -497,10 +500,10 @@ void reverse() { } png_set_write_fn(png, &pngFile, writePng, flushPng); - int pngColorType = options.palettes.empty() ? PNG_COLOR_TYPE_GRAY - : palettes.size() == 1 ? PNG_COLOR_TYPE_PALETTE - : PNG_COLOR_TYPE_RGB_ALPHA; - int pngDepth = options.palettes.empty() ? options.bitDepth : 8; + int pngColorType = grayscale ? PNG_COLOR_TYPE_GRAY + : palettes.size() == 1 ? PNG_COLOR_TYPE_PALETTE + : PNG_COLOR_TYPE_RGB_ALPHA; + int pngDepth = grayscale ? options.bitDepth : 8; png_set_IHDR( png, @@ -531,17 +534,21 @@ void reverse() { png_byte pngTrans[4] = {}; int nbPngColors = 0, nbPngTrans = 0; for (auto const &color : palettes[0]) { - if (!color.has_value()) { - continue; + if (color.has_value()) { + pngPalette[nbPngColors].red = color->red; + pngPalette[nbPngColors].green = color->green; + pngPalette[nbPngColors].blue = color->blue; + pngTrans[nbPngColors] = color->alpha; + if (color->alpha < 255) { + nbPngTrans = nbPngColors; + } + } else { + pngPalette[nbPngColors].red = 255; + pngPalette[nbPngColors].green = 255; + pngPalette[nbPngColors].blue = 255; + pngTrans[nbPngColors] = 255; } - pngPalette[nbPngColors].red = color->red; - pngPalette[nbPngColors].green = color->green; - pngPalette[nbPngColors].blue = color->blue; - pngTrans[nbPngColors] = color->alpha; ++nbPngColors; - if (color->alpha < 255) { - nbPngTrans = nbPngColors; - } } png_set_PLTE(png, pngInfo, pngPalette, nbPngColors); if (nbPngTrans > 0) { diff --git a/src/link/assign.cpp b/src/link/assign.cpp index e3c7c47b..0b985ece 100644 --- a/src/link/assign.cpp +++ b/src/link/assign.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "link/assign.hpp" #include @@ -16,7 +18,6 @@ #include "helpers.hpp" #include "itertools.hpp" #include "linkdefs.hpp" -#include "platform.hpp" #include "verbosity.hpp" #include "link/main.hpp" diff --git a/src/link/object.cpp b/src/link/object.cpp index 8dfd7387..0ddb97d8 100644 --- a/src/link/object.cpp +++ b/src/link/object.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "link/object.hpp" #include @@ -18,7 +20,6 @@ #include "helpers.hpp" #include "linkdefs.hpp" -#include "platform.hpp" #include "util.hpp" // xfclose #include "verbosity.hpp" #include "version.hpp" diff --git a/src/link/output.cpp b/src/link/output.cpp index 47106466..837e52b2 100644 --- a/src/link/output.cpp +++ b/src/link/output.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "link/output.hpp" #include @@ -19,7 +21,6 @@ #include "extern/utf8decoder.hpp" #include "helpers.hpp" #include "linkdefs.hpp" -#include "platform.hpp" #include "util.hpp" #include "link/main.hpp" diff --git a/src/link/sdas_obj.cpp b/src/link/sdas_obj.cpp index 26562bec..65fe12e7 100644 --- a/src/link/sdas_obj.cpp +++ b/src/link/sdas_obj.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "link/sdas_obj.hpp" #include @@ -14,7 +16,6 @@ #include "helpers.hpp" // assume, literal_strlen #include "linkdefs.hpp" -#include "platform.hpp" #include "util.hpp" // parseWholeNumber #include "link/fstack.hpp" diff --git a/src/style.cpp b/src/style.cpp index 55d15a98..83bd27dc 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -3,14 +3,14 @@ // This implementation was based on https://github.com/agauniyal/rang/ // and adapted for RGBDS. +#include "platform.hpp" // isatty, strcasecmp + #include "style.hpp" #include #include // getenv #include -#include "platform.hpp" // isatty, strcasecmp - #if !STYLE_ANSI // clang-format off: maintain `include` order #define WIN32_LEAN_AND_MEAN // Include less from `windows.h` diff --git a/src/usage.cpp b/src/usage.cpp index 4bc4849d..9dc95513 100644 --- a/src/usage.cpp +++ b/src/usage.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "usage.hpp" #include @@ -8,7 +10,6 @@ #include "diagnostics.hpp" // vfatalx #include "helpers.hpp" -#include "platform.hpp" #include "style.hpp" #include "util.hpp" // parseWholeNumber #include "version.hpp" diff --git a/src/util.cpp b/src/util.cpp index 48d73f8a..4a7e6cd5 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MIT +#include "platform.hpp" + #include "util.hpp" #include @@ -9,7 +11,6 @@ #include // strspn #include "helpers.hpp" // assume -#include "platform.hpp" int xfclose(FILE *file) { if (file == stdin || file == stdout || file == stderr) { diff --git a/test/gfx/alpha_embedded.err b/test/gfx/alpha_embedded.err deleted file mode 100644 index eb832e43..00000000 --- a/test/gfx/alpha_embedded.err +++ /dev/null @@ -1,4 +0,0 @@ -error: Failed to fit tile colors [GB:07,09,05; GB:12,14,05; GB:20,21,06] in specified palettes -note: The following palette was specified: - - [GB:20,21,06; GB:12,14,05] -Conversion aborted after 1 error diff --git a/test/gfx/alpha_embedded.out.2bpp b/test/gfx/alpha_embedded.out.2bpp new file mode 100644 index 00000000..53d788a0 Binary files /dev/null and b/test/gfx/alpha_embedded.out.2bpp differ diff --git a/test/gfx/alpha_embedded.out.pal b/test/gfx/alpha_embedded.out.pal new file mode 100644 index 00000000..7067c369 Binary files /dev/null and b/test/gfx/alpha_embedded.out.pal differ diff --git a/test/gfx/implicit-overflow.err b/test/gfx/implicit-overflow.err index 7db00eb7..b952b260 100644 --- a/test/gfx/implicit-overflow.err +++ b/test/gfx/implicit-overflow.err @@ -1,2 +1,2 @@ -error: Each palette spec can only contain up to 1 color plus the implict transparent color +error: Each palette spec can only contain up to 1 color plus the implicit transparent color Conversion aborted after 1 error diff --git a/test/gfx/middle_transparent_embedded.err b/test/gfx/middle_transparent_embedded.err new file mode 100644 index 00000000..a15e6782 --- /dev/null +++ b/test/gfx/middle_transparent_embedded.err @@ -0,0 +1,2 @@ +error: Each palette spec can only contain up to 3 colors plus the implicit transparent color +Conversion aborted after 1 error diff --git a/test/gfx/middle_transparent_embedded.flags b/test/gfx/middle_transparent_embedded.flags new file mode 100644 index 00000000..3f89189c --- /dev/null +++ b/test/gfx/middle_transparent_embedded.flags @@ -0,0 +1 @@ +-c embedded diff --git a/test/gfx/middle_transparent_embedded.png b/test/gfx/middle_transparent_embedded.png new file mode 100644 index 00000000..8550ee94 Binary files /dev/null and b/test/gfx/middle_transparent_embedded.png differ diff --git a/test/gfx/middle_transparent_gbc_spec.err b/test/gfx/middle_transparent_gbc_spec.err new file mode 100644 index 00000000..a15e6782 --- /dev/null +++ b/test/gfx/middle_transparent_gbc_spec.err @@ -0,0 +1,2 @@ +error: Each palette spec can only contain up to 3 colors plus the implicit transparent color +Conversion aborted after 1 error diff --git a/test/gfx/middle_transparent_gbc_spec.flags b/test/gfx/middle_transparent_gbc_spec.flags new file mode 100644 index 00000000..ee846ac1 --- /dev/null +++ b/test/gfx/middle_transparent_gbc_spec.flags @@ -0,0 +1 @@ +-c gbc:middle_transparent_gbc_spec.pal diff --git a/test/gfx/middle_transparent_gbc_spec.pal b/test/gfx/middle_transparent_gbc_spec.pal new file mode 100644 index 00000000..60d295fc Binary files /dev/null and b/test/gfx/middle_transparent_gbc_spec.pal differ diff --git a/test/gfx/middle_transparent_gbc_spec.png b/test/gfx/middle_transparent_gbc_spec.png new file mode 100644 index 00000000..8550ee94 Binary files /dev/null and b/test/gfx/middle_transparent_gbc_spec.png differ diff --git a/test/gfx/middle_transparent_png_spec.err b/test/gfx/middle_transparent_png_spec.err new file mode 100644 index 00000000..a15e6782 --- /dev/null +++ b/test/gfx/middle_transparent_png_spec.err @@ -0,0 +1,2 @@ +error: Each palette spec can only contain up to 3 colors plus the implicit transparent color +Conversion aborted after 1 error diff --git a/test/gfx/middle_transparent_png_spec.flags b/test/gfx/middle_transparent_png_spec.flags new file mode 100644 index 00000000..bbc4097d --- /dev/null +++ b/test/gfx/middle_transparent_png_spec.flags @@ -0,0 +1 @@ +-c png:middle_transparent_png_spec.pal.png diff --git a/test/gfx/middle_transparent_png_spec.pal.png b/test/gfx/middle_transparent_png_spec.pal.png new file mode 100644 index 00000000..0e8829de Binary files /dev/null and b/test/gfx/middle_transparent_png_spec.pal.png differ diff --git a/test/gfx/middle_transparent_png_spec.png b/test/gfx/middle_transparent_png_spec.png new file mode 100644 index 00000000..8550ee94 Binary files /dev/null and b/test/gfx/middle_transparent_png_spec.png differ diff --git a/test/gfx/reverse_inline_palette.2bpp b/test/gfx/reverse_inline_palette.2bpp new file mode 100644 index 00000000..a38193d0 --- /dev/null +++ b/test/gfx/reverse_inline_palette.2bpp @@ -0,0 +1 @@ +U3U3U3U3U3U3U3U3 \ No newline at end of file diff --git a/test/gfx/reverse_inline_palette.flags b/test/gfx/reverse_inline_palette.flags new file mode 100644 index 00000000..75e5e5f1 --- /dev/null +++ b/test/gfx/reverse_inline_palette.flags @@ -0,0 +1 @@ +-c #ff0000,#00ff00,#0000ff,#ffffff