From: notaz Date: Wed, 8 Aug 2007 20:57:35 +0000 (+0000) Subject: A_SN's curve X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=55a951ddbf509c36e4c357f3af050507a33d7e02;p=libpicofe.git A_SN's curve git-svn-id: file:///home/notaz/opt/svn/PicoDrive/platform@220 be3aeb3a-fb24-0410-a615-afba39da0efa --- diff --git a/gp2x/cpuctrl.c b/gp2x/cpuctrl.c index 9940fd5..b5b4736 100644 --- a/gp2x/cpuctrl.c +++ b/gp2x/cpuctrl.c @@ -255,25 +255,46 @@ void set_RAM_Timings(int tRC, int tRAS, int tWR, int tMRD, int tRFC, int tRP, in } -void set_gamma(int g100) +void set_gamma(int g100, int A_SNs_curve) { float gamma = (float) g100 / 100; int i; - //printf ("set gamma = %f\r\n",gamma); gamma = 1/gamma; - //enable gamma - MEM_REG[0x2880>>1]&=~(1<<12); + //enable gamma + MEM_REG[0x2880>>1]&=~(1<<12); - MEM_REG[0x295C>>1]=0; - for(i=0; i<256; i++) - { + MEM_REG[0x295C>>1]=0; + for(i=0; i<256; i++) + { unsigned char g; - unsigned short s; - g =(unsigned char)(255.0*pow(i/255.0,gamma)); - s = (g<<8) | g; + unsigned short s; + const unsigned short grey50=143, grey75=177, grey25=97; + float blah; + + if (A_SNs_curve) + { + // The next formula is all about gaussian interpolation + blah = (( -128 * exp(-powf((float) i/64.0f + 2.0f , 2.0f))) + + ( -64 * exp(-powf((float) i/64.0f + 1.0f , 2.0f))) + + (grey25 * exp(-powf((float) i/64.0f - 1.0f , 2.0f))) + + (grey50 * exp(-powf((float) i/64.0f - 2.0f , 2.0f))) + + (grey75 * exp(-powf((float) i/64.0f - 3.0f , 2.0f))) + + ( 256 * exp(-powf((float) i/64.0f - 4.0f , 2.0f))) + + ( 320 * exp(-powf((float) i/64.0f - 5.0f , 2.0f))) + + ( 384 * exp(-powf((float) i/64.0f - 6.0f , 2.0f)))) / (1.772637f); + blah += 0.5f; + } + else + { + blah = i; + } + + g = (unsigned char)(255.0*pow(blah/255.0,gamma)); + //printf("%d : %d\n", i, g); + s = (g<<8) | g; MEM_REG[0x295E>>1]= s; - MEM_REG[0x295E>>1]= g; - } + MEM_REG[0x295E>>1]= g; + } } diff --git a/gp2x/cpuctrl.h b/gp2x/cpuctrl.h index eb2dc0a..b9b2328 100644 --- a/gp2x/cpuctrl.h +++ b/gp2x/cpuctrl.h @@ -11,7 +11,7 @@ extern void set_DCLK_Div(unsigned short div); /* 0 to 7 divider (freq=FCLK/(1+di //extern void Disable_940(void); /* 940t down */ extern void set_RAM_Timings(int tRC, int tRAS, int tWR, int tMRD, int tRFC, int tRP, int tRCD); -extern void set_gamma(int g100); +extern void set_gamma(int g100, int A_SNs_curve); typedef enum { diff --git a/gp2x/emu.c b/gp2x/emu.c index 36d956a..0e1246c 100644 --- a/gp2x/emu.c +++ b/gp2x/emu.c @@ -613,7 +613,7 @@ void emu_Deinit(void) // restore gamma if (gp2x_old_gamma != 100) - set_gamma(100); + set_gamma(100, 0); } @@ -1079,10 +1079,10 @@ void emu_Loop(void) printf(" done\n"); } - if (gp2x_old_gamma != currentConfig.gamma) { - set_gamma(currentConfig.gamma); + if (gp2x_old_gamma != currentConfig.gamma || (EmuOpt_old&0x1000) != (currentConfig.EmuOpt&0x1000)) { + set_gamma(currentConfig.gamma, !!(currentConfig.EmuOpt&0x1000)); gp2x_old_gamma = currentConfig.gamma; - printf("updated gamma to %i\n", currentConfig.gamma); + printf("updated gamma to %i, A_SN's curve: %i\n", currentConfig.gamma, !!(currentConfig.EmuOpt&0x1000)); } if ((EmuOpt_old&0x2000) != (currentConfig.EmuOpt&0x2000)) { diff --git a/linux/gp2x.c b/linux/gp2x.c index c8c9564..ec8b10e 100644 --- a/linux/gp2x.c +++ b/linux/gp2x.c @@ -381,7 +381,7 @@ void set_RAM_Timings(int tRC, int tRAS, int tWR, int tMRD, int tRFC, int tRP, in { } -void set_gamma(int g100) +void set_gamma(int g100, int A_SNs_curve) { }