Author: post
Date: 2010-02-03 22:33:30 +0100 (Wed, 03 Feb 2010)
New Revision: 3157

Modified:
   trunk/plugins/dcp/dcp.c
Log:
DCP: Add gamma-corrected curve, and don't calculate curve if it is flat.

Modified: trunk/plugins/dcp/dcp.c
===================================================================
--- trunk/plugins/dcp/dcp.c     2010-02-03 17:56:05 UTC (rev 3156)
+++ trunk/plugins/dcp/dcp.c     2010-02-03 21:33:30 UTC (rev 3157)
@@ -183,15 +183,35 @@
                        if (knots)
                        {
                                dcp->nknots = nknots;
-                               RSSpline *spline = rs_spline_new(knots, 
dcp->nknots, NATURAL);
-                               rs_spline_sample(spline, dcp->curve_samples, 
65536);
-                               g_object_unref(spline);
+                               dcp->curve_is_flat = FALSE;
+                               if (nknots == 2)
+                                       if (ABS(knots[0]) < 0.0001 && 
ABS(knots[1]) < 0.0001)
+                                               if (ABS(1.0 - knots[2]) < 
0.0001 && ABS(1.0 - knots[3]) < 0.0001)
+                                                       dcp->curve_is_flat = 
TRUE;
+
+                               if (!dcp->curve_is_flat)
+                               {
+                                       gfloat sampled[65536];
+                                       RSSpline *spline = rs_spline_new(knots, 
dcp->nknots, NATURAL);
+                                       rs_spline_sample(spline, sampled, 
sizeof(sampled) / sizeof(gfloat));
+                                       g_object_unref(spline);
+                                       for (i = 0; i < 65536; i++)
+                                       {
+                                               gfloat value = (gfloat)i * (1.0 
/ 65535.0f);
+                                               /* Gamma correct value */
+                                               value = powf(value, 1.0f / 
2.2f);
+                                               
+                                               /*Lookup curve corrected value 
*/
+                                               value = sampled[(int)(value * 
65535.0f + 0.49999f)];
+
+                                               /* Convert from gamma 2.2 back 
to linear */
+                                               value = powf(value, 2.2f);
+
+                                               /* Store in table */
+                                               dcp->curve_samples[i] = value;
+                                       }
+                               }
                        }
-                       dcp->curve_is_flat = FALSE;
-                       if (nknots == 2)
-                               if (ABS(knots[0]) < 0.0001 && ABS(knots[1]) < 
0.0001)
-                                       if (ABS(1.0 - knots[2]) < 0.0001 && 
ABS(1.0 - knots[3]) < 0.0001)
-                                               dcp->curve_is_flat = TRUE;
                        if (knots)
                                g_free(knots);
                }


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to