Author: post
Date: 2010-02-04 20:31:47 +0100 (Thu, 04 Feb 2010)
New Revision: 3160
Modified:
trunk/plugins/dcp/dcp.c
Log:
Interpolate curve values to avoid unneeded posterization accumulation.
Modified: trunk/plugins/dcp/dcp.c
===================================================================
--- trunk/plugins/dcp/dcp.c 2010-02-03 23:00:39 UTC (rev 3159)
+++ trunk/plugins/dcp/dcp.c 2010-02-04 19:31:47 UTC (rev 3160)
@@ -191,10 +191,12 @@
if (!dcp->curve_is_flat)
{
- gfloat sampled[65536];
+ gfloat sampled[65537];
RSSpline *spline = rs_spline_new(knots,
dcp->nknots, NATURAL);
rs_spline_sample(spline, sampled,
sizeof(sampled) / sizeof(gfloat));
g_object_unref(spline);
+ /* Create extra entry */
+ sampled[65536] = sampled[65535];
for (i = 0; i < 65536; i++)
{
gfloat value = (gfloat)i * (1.0
/ 65535.0f);
@@ -202,7 +204,11 @@
value = powf(value, 1.0f /
2.2f);
/*Lookup curve corrected value
*/
- value = sampled[(int)(value *
65535.0f + 0.49999f)];
+ gfloat lookup = (int)(value *
65535.0f);
+ gfloat v0 =
sampled[(int)lookup];
+ gfloat v1 =
sampled[(int)lookup+1];
+ lookup -= (gfloat)(gint)lookup;
+ value = v0 * (1.0f-lookup) + v1
* lookup;
/* Convert from gamma 2.2 back
to linear */
value = powf(value, 2.2f);
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit