Author: post
Date: 2010-08-29 11:54:13 +0200 (Sun, 29 Aug 2010)
New Revision: 3517

Modified:
   trunk/plugins/dcp/dcp-sse2.c
   trunk/plugins/dcp/dcp-sse4.c
   trunk/plugins/dcp/dcp.c
Log:
Apply curved saturation, when we ADD saturation. This boosts medium value 
saturation, and avoids too easily over-saturated areas.

Modified: trunk/plugins/dcp/dcp-sse2.c
===================================================================
--- trunk/plugins/dcp/dcp-sse2.c        2010-08-29 08:08:03 UTC (rev 3516)
+++ trunk/plugins/dcp/dcp-sse2.c        2010-08-29 09:54:13 UTC (rev 3517)
@@ -589,7 +589,11 @@
        int _mm_rounding = _MM_GET_ROUNDING_MODE();
        _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN);
        __m128 hue_add = _mm_set_ps(dcp->hue, dcp->hue, dcp->hue, dcp->hue);
-       __m128 sat = _mm_set_ps(dcp->saturation, dcp->saturation, 
dcp->saturation, dcp->saturation);
+       __m128 sat;
+       if (dcp->saturation > 1.0)
+               sat = _mm_set_ps(dcp->saturation-1.0f, dcp->saturation-1.0f, 
dcp->saturation-1.0f, dcp->saturation-1.0f);
+       else 
+               sat = _mm_set_ps(dcp->saturation, dcp->saturation, 
dcp->saturation, dcp->saturation);
        gboolean do_contrast = (dcp->contrast > 1.001f);
        gboolean do_highrec = (dcp->contrast < 0.999f);
        float exposure_simple = MAX(1.0, powf(2.0f, dcp->exposure));
@@ -721,7 +725,18 @@
                        /* Saturation */
                        __m128 max_val = _mm_load_ps(_ones_ps);
                        __m128 min_val = _mm_load_ps(_very_small_ps);
-                       s = _mm_max_ps(min_val, _mm_min_ps(max_val, 
_mm_mul_ps(s, sat)));
+                       if (dcp->saturation > 1.0)
+                       {
+                               __m128 two_ps = _mm_load_ps(_two_ps);
+                               __m128 ones_ps = _mm_load_ps(_ones_ps);
+                               /*  out = (sat) * (x*2-x^2.0) + ((1.0-sat)*x) */
+                               __m128 s_curved = _mm_mul_ps(sat, 
_mm_sub_ps(_mm_mul_ps(s, two_ps), _mm_mul_ps(s,s)));
+                               s = _mm_min_ps(max_val, _mm_add_ps(s_curved, 
_mm_mul_ps(s, _mm_sub_ps(ones_ps, sat))));
+                       } 
+                       else
+                       {
+                               s = _mm_max_ps(min_val, _mm_min_ps(max_val, 
_mm_mul_ps(s, sat)));
+                       }
 
                        /* Hue */
                        __m128 six_ps = _mm_load_ps(_six_ps);

Modified: trunk/plugins/dcp/dcp-sse4.c
===================================================================
--- trunk/plugins/dcp/dcp-sse4.c        2010-08-29 08:08:03 UTC (rev 3516)
+++ trunk/plugins/dcp/dcp-sse4.c        2010-08-29 09:54:13 UTC (rev 3517)
@@ -496,7 +496,11 @@
        gboolean do_contrast = (dcp->contrast > 1.001f);
        gboolean do_highrec = (dcp->contrast < 0.999f);
        __m128 hue_add = _mm_set_ps(dcp->hue, dcp->hue, dcp->hue, dcp->hue);
-       __m128 sat = _mm_set_ps(dcp->saturation, dcp->saturation, 
dcp->saturation, dcp->saturation);
+       __m128 sat;
+       if (dcp->saturation > 1.0)
+               sat = _mm_set_ps(dcp->saturation-1.0f, dcp->saturation-1.0f, 
dcp->saturation-1.0f, dcp->saturation-1.0f);
+       else 
+               sat = _mm_set_ps(dcp->saturation, dcp->saturation, 
dcp->saturation, dcp->saturation);
        float exposure_simple = MAX(1.0, powf(2.0f, dcp->exposure));
        float __recover_radius = 0.5 * exposure_simple;
        SETFLOAT4_SAME(_inv_recover_radius, 1.0f / __recover_radius);
@@ -604,10 +608,20 @@
                                huesat_map_SSE4(dcp->huesatmap, 
dcp->huesatmap_precalc, &h, &s, &v);
                        }
 
-                       /* Saturation */
                        __m128 max_val = _mm_load_ps(_ones_ps);
                        __m128 min_val = _mm_load_ps(_very_small_ps);
-                       s = _mm_max_ps(min_val, _mm_min_ps(max_val, 
_mm_mul_ps(s, sat)));
+                       if (dcp->saturation > 1.0)
+                       {
+                               __m128 two_ps = _mm_load_ps(_two_ps);
+                               __m128 ones_ps = _mm_load_ps(_ones_ps);
+                               /*  out = (sat) * (x*2-x^2.0) + ((1.0-sat)*x) */
+                               __m128 s_curved = _mm_mul_ps(sat, 
_mm_sub_ps(_mm_mul_ps(s, two_ps), _mm_mul_ps(s,s)));
+                               s = _mm_min_ps(max_val, _mm_add_ps(s_curved, 
_mm_mul_ps(s, _mm_sub_ps(ones_ps, sat))));
+                       } 
+                       else
+                       {
+                               s = _mm_max_ps(min_val, _mm_min_ps(max_val, 
_mm_mul_ps(s, sat)));
+                       }
 
                        /* Hue */
                        __m128 six_ps = _mm_load_ps(_six_ps);

Modified: trunk/plugins/dcp/dcp.c
===================================================================
--- trunk/plugins/dcp/dcp.c     2010-08-29 08:08:03 UTC (rev 3516)
+++ trunk/plugins/dcp/dcp.c     2010-08-29 09:54:13 UTC (rev 3517)
@@ -1000,8 +1000,19 @@
                                huesat_map(dcp->huesatmap, &h, &s, &v);
 
                        /* Saturation */
-                       s *= dcp->saturation;
-                       s = MIN(s, 1.0);
+                       if (dcp->saturation > 1.0)
+                       {
+                               /* Apply curved saturation, when we add 
saturation */
+                               float sat_val = dcp->saturation - 1.0f;
+                               
+                               s = (sat_val * (s * 2.0f - (s * s))) + ((1.0f - 
sat_val) * s);
+                               s = MIN(s, 1.0);
+                       }
+                       else
+                       {
+                               s *= dcp->saturation;
+                               s = MIN(s, 1.0);
+                       }
 
                        /* Hue */
                        h += dcp->hue;


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

Reply via email to