From 7ee8ca0bb24918f16d3b6510169ba183193b062b Mon Sep 17 00:00:00 2001 From: punkrockguy318 Date: Sun, 13 Sep 2015 18:32:42 +0000 Subject: [PATCH] convert newlines to unix for sake of consistency --- trunk/src/palette.cpp | 876 +++++++++++++++++++++--------------------- 1 file changed, 438 insertions(+), 438 deletions(-) diff --git a/trunk/src/palette.cpp b/trunk/src/palette.cpp index 29fc80ca..2bc02803 100644 --- a/trunk/src/palette.cpp +++ b/trunk/src/palette.cpp @@ -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 -#include -#include -#include - -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 +#include +#include +#include + +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(32768*1.239), - static_cast(32768*.794), - static_cast(32768*1.019), - static_cast(32768*.905), - static_cast(32768*1.023), - static_cast(32768*.741), - static_cast(32768*.75) - }; - static uint16 gtmul[]={ - static_cast(32768*.915), - static_cast(32768*1.086), - static_cast(32768*.98), - static_cast(32768*1.026), - static_cast(32768*.908), - static_cast(32768*.987), - static_cast(32768*.75) - }; - static uint16 btmul[]={ - static_cast(32768*.743), - static_cast(32768*.882), - static_cast(32768*.653), - static_cast(32768*1.277), - static_cast(32768*.979), - static_cast(32768*.101), - static_cast(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=-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(32768*1.239), + static_cast(32768*.794), + static_cast(32768*1.019), + static_cast(32768*.905), + static_cast(32768*1.023), + static_cast(32768*.741), + static_cast(32768*.75) + }; + static uint16 gtmul[]={ + static_cast(32768*.915), + static_cast(32768*1.086), + static_cast(32768*.98), + static_cast(32768*1.026), + static_cast(32768*.908), + static_cast(32768*.987), + static_cast(32768*.75) + }; + static uint16 btmul[]={ + static_cast(32768*.743), + static_cast(32768*.882), + static_cast(32768*.653), + static_cast(32768*1.277), + static_cast(32768*.979), + static_cast(32768*.101), + static_cast(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=-6;x2--) + { + XBaf[x-256*x2]=0x85; + } + } + for(;x<256;x+=2) + { + for(x2=2;x2>=-2;x2--) + XBaf[x-256*x2]=0x85; + } +}