convert newlines to unix for sake of consistency
This commit is contained in:
parent
2bb7eb0696
commit
7ee8ca0bb2
|
@ -1,79 +1,79 @@
|
|||
/* FCE Ultra - NES/Famicom Emulator
|
||||
*
|
||||
* Copyright notice for this file:
|
||||
* Copyright (C) 2002,2003 Xodnizel
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
|
||||
#include "types.h"
|
||||
#include "file.h"
|
||||
#include "fceu.h"
|
||||
#include "driver.h"
|
||||
#include "boards/mapinc.h"
|
||||
#ifdef _S9XLUA_H
|
||||
#include "fceulua.h"
|
||||
#endif
|
||||
|
||||
#include "palette.h"
|
||||
#include "palettes/palettes.h"
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265358979323846
|
||||
#endif
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
|
||||
bool force_grayscale = false;
|
||||
|
||||
pal palette_game[64*8]; //custom palette for an individual game. (formerly palettei)
|
||||
pal palette_user[64*8]; //user's overridden palette (formerly palettec)
|
||||
pal palette_ntsc[64*8]; //mathematically generated NTSC palette (formerly paletten)
|
||||
|
||||
static bool palette_game_available; //whether palette_game is available
|
||||
static bool palette_user_available; //whether palette_user is available
|
||||
|
||||
//ntsc parameters:
|
||||
bool ntsccol_enable = false; //whether NTSC palette is selected
|
||||
static int ntsctint = 46+10;
|
||||
static int ntschue = 72;
|
||||
|
||||
//the default basic palette
|
||||
int default_palette_selection = 0;
|
||||
|
||||
//library of default palettes
|
||||
static pal *default_palette[8]=
|
||||
{
|
||||
palette,
|
||||
rp2c04001,
|
||||
rp2c04002,
|
||||
rp2c04003,
|
||||
rp2c05004,
|
||||
};
|
||||
|
||||
static void CalculatePalette(void);
|
||||
static void ChoosePalette(void);
|
||||
static void WritePalette(void);
|
||||
|
||||
//points to the actually selected current palette
|
||||
pal *palo;
|
||||
|
||||
/* FCE Ultra - NES/Famicom Emulator
|
||||
*
|
||||
* Copyright notice for this file:
|
||||
* Copyright (C) 2002,2003 Xodnizel
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
|
||||
#include "types.h"
|
||||
#include "file.h"
|
||||
#include "fceu.h"
|
||||
#include "driver.h"
|
||||
#include "boards/mapinc.h"
|
||||
#ifdef _S9XLUA_H
|
||||
#include "fceulua.h"
|
||||
#endif
|
||||
|
||||
#include "palette.h"
|
||||
#include "palettes/palettes.h"
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265358979323846
|
||||
#endif
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
|
||||
bool force_grayscale = false;
|
||||
|
||||
pal palette_game[64*8]; //custom palette for an individual game. (formerly palettei)
|
||||
pal palette_user[64*8]; //user's overridden palette (formerly palettec)
|
||||
pal palette_ntsc[64*8]; //mathematically generated NTSC palette (formerly paletten)
|
||||
|
||||
static bool palette_game_available; //whether palette_game is available
|
||||
static bool palette_user_available; //whether palette_user is available
|
||||
|
||||
//ntsc parameters:
|
||||
bool ntsccol_enable = false; //whether NTSC palette is selected
|
||||
static int ntsctint = 46+10;
|
||||
static int ntschue = 72;
|
||||
|
||||
//the default basic palette
|
||||
int default_palette_selection = 0;
|
||||
|
||||
//library of default palettes
|
||||
static pal *default_palette[8]=
|
||||
{
|
||||
palette,
|
||||
rp2c04001,
|
||||
rp2c04002,
|
||||
rp2c04003,
|
||||
rp2c05004,
|
||||
};
|
||||
|
||||
static void CalculatePalette(void);
|
||||
static void ChoosePalette(void);
|
||||
static void WritePalette(void);
|
||||
|
||||
//points to the actually selected current palette
|
||||
pal *palo;
|
||||
|
||||
static float rtmul[] = { 1.239f, 0.794f, 1.019f, 0.905f, 1.023f, 0.741f, 0.75f };
|
||||
static float gtmul[] = { 0.915f, 1.086f, 0.98f, 1.026f, 0.908f, 0.987f, 0.75f };
|
||||
static float btmul[] = { 0.743f, 0.882f, 0.653f, 1.277f, 0.979f, 0.101f, 0.75f };
|
||||
|
@ -93,10 +93,10 @@ static void ApplyDeemphasis(u8& r, u8& g, u8& b, int deemph_bits)
|
|||
g = (u8)ng;
|
||||
b = (u8)nb;
|
||||
}
|
||||
|
||||
static void ApplyDeemphasisComplete(pal* pal512)
|
||||
{
|
||||
//for each deemph level beyond 0
|
||||
|
||||
static void ApplyDeemphasisComplete(pal* pal512)
|
||||
{
|
||||
//for each deemph level beyond 0
|
||||
for(int i=1,idx=64;i<8;i++)
|
||||
{
|
||||
//for each palette entry
|
||||
|
@ -104,363 +104,363 @@ static void ApplyDeemphasisComplete(pal* pal512)
|
|||
{
|
||||
pal512[idx] = pal512[p];
|
||||
ApplyDeemphasis(pal512[idx].r,pal512[idx].g,pal512[idx].b,i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FCEUI_SetUserPalette(uint8 *pal, int nEntries)
|
||||
{
|
||||
if(!pal)
|
||||
{
|
||||
palette_user_available = false;
|
||||
return;
|
||||
}
|
||||
|
||||
palette_user_available = true;
|
||||
memcpy(palette_user,pal,nEntries*3);
|
||||
|
||||
//if palette is incomplete, generate deemph entries
|
||||
if(nEntries != 512)
|
||||
ApplyDeemphasisComplete(palette_user);
|
||||
|
||||
FCEU_ResetPalette();
|
||||
}
|
||||
|
||||
void FCEU_LoadGamePalette(void)
|
||||
{
|
||||
palette_game_available = false;
|
||||
std::string path = FCEU_MakeFName(FCEUMKF_PALETTE,0,0);
|
||||
FILE* fp = FCEUD_UTF8fopen(path,"rb");
|
||||
if(fp)
|
||||
{
|
||||
int readed = fread(palette_game,1,64*8*3,fp);
|
||||
int nEntries = readed/3;
|
||||
fclose(fp);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FCEUI_SetUserPalette(uint8 *pal, int nEntries)
|
||||
{
|
||||
if(!pal)
|
||||
{
|
||||
palette_user_available = false;
|
||||
return;
|
||||
}
|
||||
|
||||
palette_user_available = true;
|
||||
memcpy(palette_user,pal,nEntries*3);
|
||||
|
||||
//if palette is incomplete, generate deemph entries
|
||||
if(nEntries != 512)
|
||||
ApplyDeemphasisComplete(palette_user);
|
||||
|
||||
FCEU_ResetPalette();
|
||||
}
|
||||
|
||||
void FCEU_LoadGamePalette(void)
|
||||
{
|
||||
palette_game_available = false;
|
||||
std::string path = FCEU_MakeFName(FCEUMKF_PALETTE,0,0);
|
||||
FILE* fp = FCEUD_UTF8fopen(path,"rb");
|
||||
if(fp)
|
||||
{
|
||||
int readed = fread(palette_game,1,64*8*3,fp);
|
||||
int nEntries = readed/3;
|
||||
fclose(fp);
|
||||
|
||||
//if palette is incomplete, generate deemph entries
|
||||
if(nEntries != 512)
|
||||
ApplyDeemphasisComplete(palette_game);
|
||||
|
||||
palette_game_available = true;
|
||||
}
|
||||
|
||||
//not sure whether this is needed
|
||||
FCEU_ResetPalette();
|
||||
}
|
||||
|
||||
void FCEUI_SetNTSCTH(bool en, int tint, int hue)
|
||||
{
|
||||
ntsctint=tint;
|
||||
ntschue=hue;
|
||||
ntsccol_enable = en;
|
||||
FCEU_ResetPalette();
|
||||
}
|
||||
|
||||
//this prepares the 'deemph' palette which was a horrible idea to jam a single deemph palette into 0xC0-0xFF of the 8bpp palette.
|
||||
//its needed for GUI and lua and stuff, so we're leaving it, despite having a newer codepath for applying deemph
|
||||
static uint8 lastd=0;
|
||||
void SetNESDeemph_OldHacky(uint8 d, int force)
|
||||
{
|
||||
static uint16 rtmul[]={
|
||||
static_cast<uint16>(32768*1.239),
|
||||
static_cast<uint16>(32768*.794),
|
||||
static_cast<uint16>(32768*1.019),
|
||||
static_cast<uint16>(32768*.905),
|
||||
static_cast<uint16>(32768*1.023),
|
||||
static_cast<uint16>(32768*.741),
|
||||
static_cast<uint16>(32768*.75)
|
||||
};
|
||||
static uint16 gtmul[]={
|
||||
static_cast<uint16>(32768*.915),
|
||||
static_cast<uint16>(32768*1.086),
|
||||
static_cast<uint16>(32768*.98),
|
||||
static_cast<uint16>(32768*1.026),
|
||||
static_cast<uint16>(32768*.908),
|
||||
static_cast<uint16>(32768*.987),
|
||||
static_cast<uint16>(32768*.75)
|
||||
};
|
||||
static uint16 btmul[]={
|
||||
static_cast<uint16>(32768*.743),
|
||||
static_cast<uint16>(32768*.882),
|
||||
static_cast<uint16>(32768*.653),
|
||||
static_cast<uint16>(32768*1.277),
|
||||
static_cast<uint16>(32768*.979),
|
||||
static_cast<uint16>(32768*.101),
|
||||
static_cast<uint16>(32768*.75)
|
||||
};
|
||||
|
||||
uint32 r,g,b;
|
||||
int x;
|
||||
|
||||
/* If it's not forced(only forced when the palette changes),
|
||||
don't waste cpu time if the same deemphasis bits are set as the last call.
|
||||
*/
|
||||
if(!force)
|
||||
{
|
||||
if(d==lastd)
|
||||
return;
|
||||
}
|
||||
else /* Only set this when palette has changed. */
|
||||
{
|
||||
#ifdef _S9XLUA_H
|
||||
FCEU_LuaUpdatePalette();
|
||||
#endif
|
||||
|
||||
r=rtmul[6];
|
||||
g=rtmul[6];
|
||||
b=rtmul[6];
|
||||
|
||||
for(x=0;x<0x40;x++)
|
||||
{
|
||||
uint32 m,n,o;
|
||||
m=palo[x].r;
|
||||
n=palo[x].g;
|
||||
o=palo[x].b;
|
||||
m=(m*r)>>15;
|
||||
n=(n*g)>>15;
|
||||
o=(o*b)>>15;
|
||||
if(m>0xff) m=0xff;
|
||||
if(n>0xff) n=0xff;
|
||||
if(o>0xff) o=0xff;
|
||||
FCEUD_SetPalette(x|0xC0,m,n,o);
|
||||
}
|
||||
}
|
||||
if(!d) return; /* No deemphasis, so return. */
|
||||
|
||||
r=rtmul[d-1];
|
||||
g=gtmul[d-1];
|
||||
b=btmul[d-1];
|
||||
|
||||
for(x=0;x<0x40;x++)
|
||||
{
|
||||
uint32 m,n,o;
|
||||
|
||||
m=palo[x].r;
|
||||
n=palo[x].g;
|
||||
o=palo[x].b;
|
||||
m=(m*r)>>15;
|
||||
n=(n*g)>>15;
|
||||
o=(o*b)>>15;
|
||||
if(m>0xff) m=0xff;
|
||||
if(n>0xff) n=0xff;
|
||||
if(o>0xff) o=0xff;
|
||||
|
||||
FCEUD_SetPalette(x|0x40,m,n,o);
|
||||
}
|
||||
|
||||
lastd=d;
|
||||
#ifdef _S9XLUA_H
|
||||
FCEU_LuaUpdatePalette();
|
||||
#endif
|
||||
}
|
||||
|
||||
// Converted from Kevin Horton's qbasic palette generator.
|
||||
static void CalculatePalette(void)
|
||||
{
|
||||
//PRECONDITION: ntsc palette is enabled
|
||||
if(!ntsccol_enable)
|
||||
return;
|
||||
|
||||
int x,z;
|
||||
int r,g,b;
|
||||
double s,luma,theta;
|
||||
static uint8 cols[16]={0,24,21,18,15,12,9,6,3,0,33,30,27,0,0,0};
|
||||
static uint8 br1[4]={6,9,12,12};
|
||||
static double br2[4]={.29,.45,.73,.9};
|
||||
static double br3[4]={0,.24,.47,.77};
|
||||
|
||||
for(x=0;x<=3;x++)
|
||||
for(z=0;z<16;z++)
|
||||
{
|
||||
s=(double)ntsctint/128;
|
||||
luma=br2[x];
|
||||
if(z==0) {s=0;luma=((double)br1[x])/12;}
|
||||
|
||||
if(z>=13)
|
||||
{
|
||||
s=luma=0;
|
||||
if(z==13)
|
||||
luma=br3[x];
|
||||
}
|
||||
|
||||
theta=(double)M_PI*(double)(((double)cols[z]*10+ (((double)ntschue/2)+300) )/(double)180);
|
||||
r=(int)((luma+s*sin(theta))*256);
|
||||
g=(int)((luma-(double)27/53*s*sin(theta)+(double)10/53*s*cos(theta))*256);
|
||||
b=(int)((luma-s*cos(theta))*256);
|
||||
|
||||
|
||||
if(r>255) r=255;
|
||||
if(g>255) g=255;
|
||||
if(b>255) b=255;
|
||||
if(r<0) r=0;
|
||||
if(g<0) g=0;
|
||||
if(b<0) b=0;
|
||||
|
||||
palette_ntsc[(x<<4)+z].r=r;
|
||||
palette_ntsc[(x<<4)+z].g=g;
|
||||
palette_ntsc[(x<<4)+z].b=b;
|
||||
}
|
||||
|
||||
//can't call FCEU_ResetPalette(), it would be re-entrant
|
||||
//see precondition for this function
|
||||
WritePalette();
|
||||
}
|
||||
|
||||
void FCEU_ResetPalette(void)
|
||||
{
|
||||
if(GameInfo)
|
||||
{
|
||||
ChoosePalette();
|
||||
WritePalette();
|
||||
}
|
||||
}
|
||||
|
||||
static void ChoosePalette(void)
|
||||
{
|
||||
//if it's an NSF, there's NO palette? that's right, only the 'unvarying' palette will get used
|
||||
if(GameInfo->type==GIT_NSF)
|
||||
palo = NULL;
|
||||
//user palette takes priority over others
|
||||
else if(palette_user_available)
|
||||
palo = palette_user;
|
||||
//NTSC takes priority next, if it's appropriate
|
||||
else if(ntsccol_enable && !PAL && GameInfo->type!=GIT_VSUNI)
|
||||
{
|
||||
//for NTSC games, we can actually use the NTSC palette
|
||||
palo = palette_ntsc;
|
||||
CalculatePalette();
|
||||
}
|
||||
//select the game's overridden palette if available
|
||||
else if(palette_game_available)
|
||||
palo = palette_game;
|
||||
//finally, use a default built-in palette
|
||||
else
|
||||
{
|
||||
palo = default_palette[default_palette_selection];
|
||||
//need to calcualte a deemph on the fly.. sorry. maybe support otherwise later
|
||||
ApplyDeemphasisComplete(palo);
|
||||
}
|
||||
}
|
||||
|
||||
void WritePalette(void)
|
||||
{
|
||||
int x;
|
||||
|
||||
//set the 'unvarying' palettes to low < 128 palette entries
|
||||
for(x=0;x<7;x++)
|
||||
FCEUD_SetPalette(x,palette_unvarying[x].r,palette_unvarying[x].g,palette_unvarying[x].b);
|
||||
|
||||
if(GameInfo->type==GIT_NSF)
|
||||
{
|
||||
#ifdef _S9XLUA_H
|
||||
FCEU_LuaUpdatePalette();
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
//sets palette entries >= 128 with the 64 selected main colors
|
||||
for(x=0;x<64;x++)
|
||||
FCEUD_SetPalette(128+x,palo[x].r,palo[x].g,palo[x].b);
|
||||
SetNESDeemph_OldHacky(lastd,1);
|
||||
}
|
||||
}
|
||||
|
||||
void FCEUI_GetNTSCTH(int *tint, int *hue)
|
||||
{
|
||||
*tint = ntsctint;
|
||||
*hue = ntschue;
|
||||
}
|
||||
|
||||
static int controlselect=0;
|
||||
static int controllength=0;
|
||||
|
||||
void FCEUI_NTSCDEC(void)
|
||||
{
|
||||
if(ntsccol_enable && GameInfo->type!=GIT_VSUNI &&!PAL && GameInfo->type!=GIT_NSF)
|
||||
{
|
||||
int which;
|
||||
if(controlselect)
|
||||
{
|
||||
if(controllength)
|
||||
{
|
||||
which=controlselect==1?ntschue:ntsctint;
|
||||
which--;
|
||||
if(which<0) which=0;
|
||||
if(controlselect==1)
|
||||
ntschue=which;
|
||||
else ntsctint=which;
|
||||
CalculatePalette();
|
||||
}
|
||||
controllength=360;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FCEUI_NTSCINC(void)
|
||||
{
|
||||
if(ntsccol_enable && GameInfo->type!=GIT_VSUNI && !PAL && GameInfo->type!=GIT_NSF)
|
||||
if(controlselect)
|
||||
{
|
||||
if(controllength)
|
||||
{
|
||||
switch(controlselect)
|
||||
{
|
||||
case 1:ntschue++;
|
||||
if(ntschue>128) ntschue=128;
|
||||
CalculatePalette();
|
||||
break;
|
||||
case 2:ntsctint++;
|
||||
if(ntsctint>128) ntsctint=128;
|
||||
CalculatePalette();
|
||||
break;
|
||||
}
|
||||
}
|
||||
controllength=360;
|
||||
}
|
||||
}
|
||||
|
||||
void FCEUI_NTSCSELHUE(void)
|
||||
{
|
||||
if(ntsccol_enable && GameInfo->type!=GIT_VSUNI && !PAL && GameInfo->type!=GIT_NSF){controlselect=1;controllength=360;}
|
||||
}
|
||||
|
||||
void FCEUI_NTSCSELTINT(void)
|
||||
{
|
||||
if(ntsccol_enable && GameInfo->type!=GIT_VSUNI && !PAL && GameInfo->type!=GIT_NSF){controlselect=2;controllength=360;}
|
||||
}
|
||||
|
||||
void FCEU_DrawNTSCControlBars(uint8 *XBuf)
|
||||
{
|
||||
uint8 *XBaf;
|
||||
int which=0;
|
||||
int x,x2;
|
||||
|
||||
if(!controllength) return;
|
||||
controllength--;
|
||||
if(!XBuf) return;
|
||||
|
||||
if(controlselect==1)
|
||||
{
|
||||
DrawTextTrans(XBuf+128-12+180*256, 256, (uint8 *)"Hue", 0x85);
|
||||
which=ntschue<<1;
|
||||
}
|
||||
else if(controlselect==2)
|
||||
{
|
||||
DrawTextTrans(XBuf+128-16+180*256, 256, (uint8 *)"Tint", 0x85);
|
||||
which=ntsctint<<1;
|
||||
}
|
||||
|
||||
XBaf=XBuf+200*256;
|
||||
for(x=0;x<which;x+=2)
|
||||
{
|
||||
for(x2=6;x2>=-6;x2--)
|
||||
{
|
||||
XBaf[x-256*x2]=0x85;
|
||||
}
|
||||
}
|
||||
for(;x<256;x+=2)
|
||||
{
|
||||
for(x2=2;x2>=-2;x2--)
|
||||
XBaf[x-256*x2]=0x85;
|
||||
}
|
||||
}
|
||||
ApplyDeemphasisComplete(palette_game);
|
||||
|
||||
palette_game_available = true;
|
||||
}
|
||||
|
||||
//not sure whether this is needed
|
||||
FCEU_ResetPalette();
|
||||
}
|
||||
|
||||
void FCEUI_SetNTSCTH(bool en, int tint, int hue)
|
||||
{
|
||||
ntsctint=tint;
|
||||
ntschue=hue;
|
||||
ntsccol_enable = en;
|
||||
FCEU_ResetPalette();
|
||||
}
|
||||
|
||||
//this prepares the 'deemph' palette which was a horrible idea to jam a single deemph palette into 0xC0-0xFF of the 8bpp palette.
|
||||
//its needed for GUI and lua and stuff, so we're leaving it, despite having a newer codepath for applying deemph
|
||||
static uint8 lastd=0;
|
||||
void SetNESDeemph_OldHacky(uint8 d, int force)
|
||||
{
|
||||
static uint16 rtmul[]={
|
||||
static_cast<uint16>(32768*1.239),
|
||||
static_cast<uint16>(32768*.794),
|
||||
static_cast<uint16>(32768*1.019),
|
||||
static_cast<uint16>(32768*.905),
|
||||
static_cast<uint16>(32768*1.023),
|
||||
static_cast<uint16>(32768*.741),
|
||||
static_cast<uint16>(32768*.75)
|
||||
};
|
||||
static uint16 gtmul[]={
|
||||
static_cast<uint16>(32768*.915),
|
||||
static_cast<uint16>(32768*1.086),
|
||||
static_cast<uint16>(32768*.98),
|
||||
static_cast<uint16>(32768*1.026),
|
||||
static_cast<uint16>(32768*.908),
|
||||
static_cast<uint16>(32768*.987),
|
||||
static_cast<uint16>(32768*.75)
|
||||
};
|
||||
static uint16 btmul[]={
|
||||
static_cast<uint16>(32768*.743),
|
||||
static_cast<uint16>(32768*.882),
|
||||
static_cast<uint16>(32768*.653),
|
||||
static_cast<uint16>(32768*1.277),
|
||||
static_cast<uint16>(32768*.979),
|
||||
static_cast<uint16>(32768*.101),
|
||||
static_cast<uint16>(32768*.75)
|
||||
};
|
||||
|
||||
uint32 r,g,b;
|
||||
int x;
|
||||
|
||||
/* If it's not forced(only forced when the palette changes),
|
||||
don't waste cpu time if the same deemphasis bits are set as the last call.
|
||||
*/
|
||||
if(!force)
|
||||
{
|
||||
if(d==lastd)
|
||||
return;
|
||||
}
|
||||
else /* Only set this when palette has changed. */
|
||||
{
|
||||
#ifdef _S9XLUA_H
|
||||
FCEU_LuaUpdatePalette();
|
||||
#endif
|
||||
|
||||
r=rtmul[6];
|
||||
g=rtmul[6];
|
||||
b=rtmul[6];
|
||||
|
||||
for(x=0;x<0x40;x++)
|
||||
{
|
||||
uint32 m,n,o;
|
||||
m=palo[x].r;
|
||||
n=palo[x].g;
|
||||
o=palo[x].b;
|
||||
m=(m*r)>>15;
|
||||
n=(n*g)>>15;
|
||||
o=(o*b)>>15;
|
||||
if(m>0xff) m=0xff;
|
||||
if(n>0xff) n=0xff;
|
||||
if(o>0xff) o=0xff;
|
||||
FCEUD_SetPalette(x|0xC0,m,n,o);
|
||||
}
|
||||
}
|
||||
if(!d) return; /* No deemphasis, so return. */
|
||||
|
||||
r=rtmul[d-1];
|
||||
g=gtmul[d-1];
|
||||
b=btmul[d-1];
|
||||
|
||||
for(x=0;x<0x40;x++)
|
||||
{
|
||||
uint32 m,n,o;
|
||||
|
||||
m=palo[x].r;
|
||||
n=palo[x].g;
|
||||
o=palo[x].b;
|
||||
m=(m*r)>>15;
|
||||
n=(n*g)>>15;
|
||||
o=(o*b)>>15;
|
||||
if(m>0xff) m=0xff;
|
||||
if(n>0xff) n=0xff;
|
||||
if(o>0xff) o=0xff;
|
||||
|
||||
FCEUD_SetPalette(x|0x40,m,n,o);
|
||||
}
|
||||
|
||||
lastd=d;
|
||||
#ifdef _S9XLUA_H
|
||||
FCEU_LuaUpdatePalette();
|
||||
#endif
|
||||
}
|
||||
|
||||
// Converted from Kevin Horton's qbasic palette generator.
|
||||
static void CalculatePalette(void)
|
||||
{
|
||||
//PRECONDITION: ntsc palette is enabled
|
||||
if(!ntsccol_enable)
|
||||
return;
|
||||
|
||||
int x,z;
|
||||
int r,g,b;
|
||||
double s,luma,theta;
|
||||
static uint8 cols[16]={0,24,21,18,15,12,9,6,3,0,33,30,27,0,0,0};
|
||||
static uint8 br1[4]={6,9,12,12};
|
||||
static double br2[4]={.29,.45,.73,.9};
|
||||
static double br3[4]={0,.24,.47,.77};
|
||||
|
||||
for(x=0;x<=3;x++)
|
||||
for(z=0;z<16;z++)
|
||||
{
|
||||
s=(double)ntsctint/128;
|
||||
luma=br2[x];
|
||||
if(z==0) {s=0;luma=((double)br1[x])/12;}
|
||||
|
||||
if(z>=13)
|
||||
{
|
||||
s=luma=0;
|
||||
if(z==13)
|
||||
luma=br3[x];
|
||||
}
|
||||
|
||||
theta=(double)M_PI*(double)(((double)cols[z]*10+ (((double)ntschue/2)+300) )/(double)180);
|
||||
r=(int)((luma+s*sin(theta))*256);
|
||||
g=(int)((luma-(double)27/53*s*sin(theta)+(double)10/53*s*cos(theta))*256);
|
||||
b=(int)((luma-s*cos(theta))*256);
|
||||
|
||||
|
||||
if(r>255) r=255;
|
||||
if(g>255) g=255;
|
||||
if(b>255) b=255;
|
||||
if(r<0) r=0;
|
||||
if(g<0) g=0;
|
||||
if(b<0) b=0;
|
||||
|
||||
palette_ntsc[(x<<4)+z].r=r;
|
||||
palette_ntsc[(x<<4)+z].g=g;
|
||||
palette_ntsc[(x<<4)+z].b=b;
|
||||
}
|
||||
|
||||
//can't call FCEU_ResetPalette(), it would be re-entrant
|
||||
//see precondition for this function
|
||||
WritePalette();
|
||||
}
|
||||
|
||||
void FCEU_ResetPalette(void)
|
||||
{
|
||||
if(GameInfo)
|
||||
{
|
||||
ChoosePalette();
|
||||
WritePalette();
|
||||
}
|
||||
}
|
||||
|
||||
static void ChoosePalette(void)
|
||||
{
|
||||
//if it's an NSF, there's NO palette? that's right, only the 'unvarying' palette will get used
|
||||
if(GameInfo->type==GIT_NSF)
|
||||
palo = NULL;
|
||||
//user palette takes priority over others
|
||||
else if(palette_user_available)
|
||||
palo = palette_user;
|
||||
//NTSC takes priority next, if it's appropriate
|
||||
else if(ntsccol_enable && !PAL && GameInfo->type!=GIT_VSUNI)
|
||||
{
|
||||
//for NTSC games, we can actually use the NTSC palette
|
||||
palo = palette_ntsc;
|
||||
CalculatePalette();
|
||||
}
|
||||
//select the game's overridden palette if available
|
||||
else if(palette_game_available)
|
||||
palo = palette_game;
|
||||
//finally, use a default built-in palette
|
||||
else
|
||||
{
|
||||
palo = default_palette[default_palette_selection];
|
||||
//need to calcualte a deemph on the fly.. sorry. maybe support otherwise later
|
||||
ApplyDeemphasisComplete(palo);
|
||||
}
|
||||
}
|
||||
|
||||
void WritePalette(void)
|
||||
{
|
||||
int x;
|
||||
|
||||
//set the 'unvarying' palettes to low < 128 palette entries
|
||||
for(x=0;x<7;x++)
|
||||
FCEUD_SetPalette(x,palette_unvarying[x].r,palette_unvarying[x].g,palette_unvarying[x].b);
|
||||
|
||||
if(GameInfo->type==GIT_NSF)
|
||||
{
|
||||
#ifdef _S9XLUA_H
|
||||
FCEU_LuaUpdatePalette();
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
//sets palette entries >= 128 with the 64 selected main colors
|
||||
for(x=0;x<64;x++)
|
||||
FCEUD_SetPalette(128+x,palo[x].r,palo[x].g,palo[x].b);
|
||||
SetNESDeemph_OldHacky(lastd,1);
|
||||
}
|
||||
}
|
||||
|
||||
void FCEUI_GetNTSCTH(int *tint, int *hue)
|
||||
{
|
||||
*tint = ntsctint;
|
||||
*hue = ntschue;
|
||||
}
|
||||
|
||||
static int controlselect=0;
|
||||
static int controllength=0;
|
||||
|
||||
void FCEUI_NTSCDEC(void)
|
||||
{
|
||||
if(ntsccol_enable && GameInfo->type!=GIT_VSUNI &&!PAL && GameInfo->type!=GIT_NSF)
|
||||
{
|
||||
int which;
|
||||
if(controlselect)
|
||||
{
|
||||
if(controllength)
|
||||
{
|
||||
which=controlselect==1?ntschue:ntsctint;
|
||||
which--;
|
||||
if(which<0) which=0;
|
||||
if(controlselect==1)
|
||||
ntschue=which;
|
||||
else ntsctint=which;
|
||||
CalculatePalette();
|
||||
}
|
||||
controllength=360;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FCEUI_NTSCINC(void)
|
||||
{
|
||||
if(ntsccol_enable && GameInfo->type!=GIT_VSUNI && !PAL && GameInfo->type!=GIT_NSF)
|
||||
if(controlselect)
|
||||
{
|
||||
if(controllength)
|
||||
{
|
||||
switch(controlselect)
|
||||
{
|
||||
case 1:ntschue++;
|
||||
if(ntschue>128) ntschue=128;
|
||||
CalculatePalette();
|
||||
break;
|
||||
case 2:ntsctint++;
|
||||
if(ntsctint>128) ntsctint=128;
|
||||
CalculatePalette();
|
||||
break;
|
||||
}
|
||||
}
|
||||
controllength=360;
|
||||
}
|
||||
}
|
||||
|
||||
void FCEUI_NTSCSELHUE(void)
|
||||
{
|
||||
if(ntsccol_enable && GameInfo->type!=GIT_VSUNI && !PAL && GameInfo->type!=GIT_NSF){controlselect=1;controllength=360;}
|
||||
}
|
||||
|
||||
void FCEUI_NTSCSELTINT(void)
|
||||
{
|
||||
if(ntsccol_enable && GameInfo->type!=GIT_VSUNI && !PAL && GameInfo->type!=GIT_NSF){controlselect=2;controllength=360;}
|
||||
}
|
||||
|
||||
void FCEU_DrawNTSCControlBars(uint8 *XBuf)
|
||||
{
|
||||
uint8 *XBaf;
|
||||
int which=0;
|
||||
int x,x2;
|
||||
|
||||
if(!controllength) return;
|
||||
controllength--;
|
||||
if(!XBuf) return;
|
||||
|
||||
if(controlselect==1)
|
||||
{
|
||||
DrawTextTrans(XBuf+128-12+180*256, 256, (uint8 *)"Hue", 0x85);
|
||||
which=ntschue<<1;
|
||||
}
|
||||
else if(controlselect==2)
|
||||
{
|
||||
DrawTextTrans(XBuf+128-16+180*256, 256, (uint8 *)"Tint", 0x85);
|
||||
which=ntsctint<<1;
|
||||
}
|
||||
|
||||
XBaf=XBuf+200*256;
|
||||
for(x=0;x<which;x+=2)
|
||||
{
|
||||
for(x2=6;x2>=-6;x2--)
|
||||
{
|
||||
XBaf[x-256*x2]=0x85;
|
||||
}
|
||||
}
|
||||
for(;x<256;x+=2)
|
||||
{
|
||||
for(x2=2;x2>=-2;x2--)
|
||||
XBaf[x-256*x2]=0x85;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue