Use our own version of PI, since M_PI isn't defined everywhere. Fixes #630.

Also, consistently use float instead of mixing float and double (compiler complains otherwise).
This commit is contained in:
Stephen Anthony 2020-05-08 02:12:58 -02:30
parent 754cd90f90
commit 2770845f6b
1 changed files with 36 additions and 34 deletions

View File

@ -1120,45 +1120,46 @@ void Console::loadUserPalette()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Console::generateCustomPalette(int type) void Console::generateCustomPalette(int type)
{ {
const int NUM_CHROMA = 16; constexpr int NUM_CHROMA = 16;
const int NUM_LUMA = 8; constexpr int NUM_LUMA = 8;
const double SATURATION = 0.25; constexpr float SATURATION = 0.25F;
double color[NUM_CHROMA][2] = {{0.0}}; float color[NUM_CHROMA][2] = {{0.0F}};
if(type == 0) if(type == 0)
{ {
// YIQ is YUV shifted by 33° // YIQ is YUV shifted by 33°
const double offset = 33 * (2 * M_PI / 360); constexpr float offset = 33 * (2 * BSPF::PI_f / 360);
const double shift = myOSystem.settings().getFloat("phase_ntsc") * (2 * M_PI / 360); const float shift = myOSystem.settings().getFloat("phase_ntsc") *
(2 * BSPF::PI_f / 360);
// color 0 is grayscale // color 0 is grayscale
for(int chroma = 1; chroma < NUM_CHROMA; chroma++) for(int chroma = 1; chroma < NUM_CHROMA; chroma++)
{ {
color[chroma][0] = SATURATION * sin(offset + shift * (chroma - 1)); color[chroma][0] = SATURATION * sin(offset + shift * (chroma - 1));
color[chroma][1] = SATURATION * sin(offset + shift * (chroma - 1 - M_PI)); color[chroma][1] = SATURATION * sin(offset + shift * (chroma - 1 - BSPF::PI_f));
} }
for(int chroma = 0; chroma < NUM_CHROMA; chroma++) for(int chroma = 0; chroma < NUM_CHROMA; chroma++)
{ {
const double I = color[chroma][0]; const float I = color[chroma][0];
const double Q = color[chroma][1]; const float Q = color[chroma][1];
for(int luma = 0; luma < NUM_LUMA; luma++) for(int luma = 0; luma < NUM_LUMA; luma++)
{ {
const double Y = 0.05 + luma / 8.24; // 0.05..~0.90 const float Y = 0.05F + luma / 8.24F; // 0.05..~0.90
double R = Y + 0.956 * I + 0.621 * Q; float R = Y + 0.956F * I + 0.621F * Q;
double G = Y - 0.272 * I - 0.647 * Q; float G = Y - 0.272F * I - 0.647F * Q;
double B = Y - 1.106 * I + 1.703 * Q; float B = Y - 1.106F * I + 1.703F * Q;
if(R < 0) R = 0; if(R < 0) R = 0;
if(G < 0) G = 0; if(G < 0) G = 0;
if(B < 0) B = 0; if(B < 0) B = 0;
R = pow(R, 0.9); R = powf(R, 0.9F);
G = pow(G, 0.9); G = powf(G, 0.9F);
B = pow(B, 0.9); B = powf(B, 0.9F);
if(R > 1) R = 1; if(R > 1) R = 1;
if(G > 1) G = 1; if(G > 1) G = 1;
@ -1174,47 +1175,48 @@ void Console::generateCustomPalette(int type)
} }
else else
{ {
const double offset = 180 * (2 * M_PI / 360); constexpr float offset = 180 * (2 * BSPF::PI_f / 360);
const double shift = myOSystem.settings().getFloat("phase_pal") * (2 * M_PI / 360); float shift = myOSystem.settings().getFloat("phase_pal") *
const double fixedShift = 22.5 * (2 * M_PI / 360); (2 * BSPF::PI_f / 360);
constexpr float fixedShift = 22.5F * (2 * BSPF::PI_f / 360);
// colors 0, 1, 14 and 15 are grayscale // colors 0, 1, 14 and 15 are grayscale
for(int chroma = 2; chroma < NUM_CHROMA - 2; chroma++) for(int chroma = 2; chroma < NUM_CHROMA - 2; chroma++)
{ {
int idx = NUM_CHROMA - 1 - chroma; int idx = NUM_CHROMA - 1 - chroma;
color[idx][0] = SATURATION * sin(offset - fixedShift * chroma); color[idx][0] = SATURATION * sinf(offset - fixedShift * chroma);
if ((idx & 1) == 0) if ((idx & 1) == 0)
color[idx][1] = SATURATION * sin(offset - shift * (chroma - 3.5) / 2.F); color[idx][1] = SATURATION * sinf(offset - shift * (chroma - 3.5F) / 2.F);
else else
color[idx][1] = SATURATION * -sin(offset - shift * chroma / 2.F); color[idx][1] = SATURATION * -sinf(offset - shift * chroma / 2.F);
} }
for(int chroma = 0; chroma < NUM_CHROMA; chroma++) for(int chroma = 0; chroma < NUM_CHROMA; chroma++)
{ {
const double U = color[chroma][0]; const float U = color[chroma][0];
const double V = color[chroma][1]; const float V = color[chroma][1];
for(int luma = 0; luma < NUM_LUMA; luma++) for(int luma = 0; luma < NUM_LUMA; luma++)
{ {
const double Y = 0.05 + luma / 8.24; // 0.05..~0.90 const float Y = 0.05F + luma / 8.24F; // 0.05..~0.90
// Most sources // Most sources
double R = Y + 1.403 * V; float R = Y + 1.403F * V;
double G = Y - 0.344 * U - 0.714 * V; float G = Y - 0.344F * U - 0.714F * V;
double B = Y + 1.770 * U; float B = Y + 1.770F * U;
// German Wikipedia, huh??? // German Wikipedia, huh???
//double B = Y + 1 / 0.493 * U; //float B = Y + 1 / 0.493 * U;
//double R = Y + 1 / 0.877 * V; //float R = Y + 1 / 0.877 * V;
//double G = 1.704 * Y - 0.590 * R - 0.194 * B; //float G = 1.704 * Y - 0.590 * R - 0.194 * B;
if(R < 0) R = 0.0; if(R < 0) R = 0.0;
if(G < 0) G = 0.0; if(G < 0) G = 0.0;
if(B < 0) B = 0.0; if(B < 0) B = 0.0;
R = pow(R, 1.2); R = powf(R, 1.2);
G = pow(G, 1.2); G = powf(G, 1.2);
B = pow(B, 1.2); B = powf(B, 1.2);
if(R > 1) R = 1; if(R > 1) R = 1;
if(G > 1) G = 1; if(G > 1) G = 1;