A_SN's curve
authornotaz <notasas@gmail.com>
Wed, 8 Aug 2007 20:57:35 +0000 (20:57 +0000)
committernotaz <notasas@gmail.com>
Wed, 8 Aug 2007 20:57:35 +0000 (20:57 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@220 be3aeb3a-fb24-0410-a615-afba39da0efa

platform/gp2x/cpuctrl.c
platform/gp2x/cpuctrl.h
platform/gp2x/emu.c
platform/linux/gp2x.c

index 9940fd5..b5b4736 100644 (file)
@@ -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;
+       }
 }
 
index eb2dc0a..b9b2328 100644 (file)
@@ -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
 {
index 36d956a..0e1246c 100644 (file)
@@ -613,7 +613,7 @@ void emu_Deinit(void)
 \r
        // restore gamma\r
        if (gp2x_old_gamma != 100)\r
-               set_gamma(100);\r
+               set_gamma(100, 0);\r
 }\r
 \r
 \r
@@ -1079,10 +1079,10 @@ void emu_Loop(void)
                printf(" done\n");\r
        }\r
 \r
-       if (gp2x_old_gamma != currentConfig.gamma) {\r
-               set_gamma(currentConfig.gamma);\r
+       if (gp2x_old_gamma != currentConfig.gamma || (EmuOpt_old&0x1000) != (currentConfig.EmuOpt&0x1000)) {\r
+               set_gamma(currentConfig.gamma, !!(currentConfig.EmuOpt&0x1000));\r
                gp2x_old_gamma = currentConfig.gamma;\r
-               printf("updated gamma to %i\n", currentConfig.gamma);\r
+               printf("updated gamma to %i, A_SN's curve: %i\n", currentConfig.gamma, !!(currentConfig.EmuOpt&0x1000));\r
        }\r
 \r
        if ((EmuOpt_old&0x2000) != (currentConfig.EmuOpt&0x2000)) {\r
index c8c9564..ec8b10e 100644 (file)
@@ -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)
 {
 }