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