Support rgbgfx -c dmg to imply -c dmg=e4

Fixes #1776
This commit is contained in:
Rangi42
2025-08-05 14:18:25 -04:00
parent 504a45a4ed
commit a3983b7b0f
5 changed files with 21 additions and 3 deletions

View File

@@ -3,9 +3,12 @@
#ifndef RGBDS_GFX_PAL_SPEC_HPP #ifndef RGBDS_GFX_PAL_SPEC_HPP
#define RGBDS_GFX_PAL_SPEC_HPP #define RGBDS_GFX_PAL_SPEC_HPP
#include <stdint.h>
void parseInlinePalSpec(char const * const rawArg); void parseInlinePalSpec(char const * const rawArg);
void parseExternalPalSpec(char const *arg); void parseExternalPalSpec(char const *arg);
void parseDmgPalSpec(char const * const rawArg); void parseDmgPalSpec(char const * const rawArg);
void parseDmgPalSpec(uint8_t palSpecDmg);
void parseBackgroundPalSpec(char const *arg); void parseBackgroundPalSpec(char const *arg);

View File

@@ -178,6 +178,13 @@ the low two bits 0-1 specify which gray shade goes in color index 0,
the next two bits 2-3 specify which gray shade goes in color index 1, the next two bits 2-3 specify which gray shade goes in color index 1,
and so on. and so on.
Gray shade 0 is the lightest (white), 3 is the darkest (black). Gray shade 0 is the lightest (white), 3 is the darkest (black).
If
.Ar pal_spec
is the case-insensitive word
.Cm dmg ,
then it acts like
.Cm dmg=E4 ,
i.e. the darkest gray will end up in color index 0, and so on.
The same gray shade cannot go in two color indexes. The same gray shade cannot go in two color indexes.
To specify a DMG palette, the input PNG must have all its colors in shades of gray, without any transparent colors. To specify a DMG palette, the input PNG must have all its colors in shades of gray, without any transparent colors.
.It Sy automatic palette generation .It Sy automatic palette generation

View File

@@ -322,6 +322,9 @@ static char *parseArgv(int argc, char *argv[]) {
options.palSpecType = Options::EMBEDDED; options.palSpecType = Options::EMBEDDED;
} else if (strcasecmp(musl_optarg, "auto") == 0) { } else if (strcasecmp(musl_optarg, "auto") == 0) {
options.palSpecType = Options::NO_SPEC; options.palSpecType = Options::NO_SPEC;
} else if (strcasecmp(musl_optarg, "dmg") == 0) {
options.palSpecType = Options::DMG;
parseDmgPalSpec(0xE4); // Same darkest-first order as `sortGrayscale`
} else if (strncasecmp(musl_optarg, "dmg=", literal_strlen("dmg=")) == 0) { } else if (strncasecmp(musl_optarg, "dmg=", literal_strlen("dmg=")) == 0) {
options.palSpecType = Options::DMG; options.palSpecType = Options::DMG;
parseDmgPalSpec(&musl_optarg[literal_strlen("dmg=")]); parseDmgPalSpec(&musl_optarg[literal_strlen("dmg=")]);

View File

@@ -692,7 +692,11 @@ void parseDmgPalSpec(char const * const rawArg) {
return; return;
} }
options.palSpecDmg = toHex(arg[0], arg[1]); parseDmgPalSpec(toHex(arg[0], arg[1]));
}
void parseDmgPalSpec(uint8_t palSpecDmg) {
options.palSpecDmg = palSpecDmg;
// Map gray shades to their DMG color indexes for fast lookup by `Rgba::grayIndex` // Map gray shades to their DMG color indexes for fast lookup by `Rgba::grayIndex`
for (uint8_t i = 0; i < 4; ++i) { for (uint8_t i = 0; i < 4; ++i) {

View File

@@ -1,2 +1,3 @@
# Override embedded with DMG
-c embedded -c embedded
-c DMG=E4 -c DMG