Author: post
Date: 2010-04-11 11:46:55 +0200 (Sun, 11 Apr 2010)
New Revision: 3354
Modified:
trunk/plugins/dcp/dcp-sse2.c
trunk/plugins/dcp/dcp.c
Log:
Make contrast slider do highlight compression when contrast < 1.0, much more
useful.
Modified: trunk/plugins/dcp/dcp-sse2.c
===================================================================
--- trunk/plugins/dcp/dcp-sse2.c 2010-04-10 21:17:11 UTC (rev 3353)
+++ trunk/plugins/dcp/dcp-sse2.c 2010-04-11 09:46:55 UTC (rev 3354)
@@ -22,6 +22,7 @@
#ifdef __SSE2__
#include <emmintrin.h>
+#include <math.h> /* powf() */
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
/* We ignore this pragma, because we are casting a pointer from float to int
to pass a float using */
@@ -589,7 +590,12 @@
_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);
- gboolean do_contrast = (ABS(1.0f - dcp->contrast) > 0.001f);
+ 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));
+ float __recover_radius = 0.5 * exposure_simple;
+ SETFLOAT4_SAME(_inv_recover_radius, 1.0f / __recover_radius);
+ SETFLOAT4_SAME(_recover_radius, 1.0 - __recover_radius);
int xfer[4] __attribute__ ((aligned (16)));
SETFLOAT4_SAME(_min_cam, 1.0);
@@ -599,10 +605,11 @@
SETFLOAT4_SAME(_exposure_slope, dcp->exposure_slope);
SETFLOAT4_SAME(_exposure_qscale, dcp->exposure_qscale);
SETFLOAT4_SAME(_contrast, dcp->contrast);
+ SETFLOAT4_SAME(_inv_contrast, 1.0f - dcp->contrast);
SETFLOAT4_SAME(_cm_r, dcp->channelmixer_red);
SETFLOAT4_SAME(_cm_g, dcp->channelmixer_green);
SETFLOAT4_SAME(_cm_b, dcp->channelmixer_blue);
- SETFLOAT4_SAME(_contr_base, MIN(0.5, dcp->contrast * 0.5));
+ SETFLOAT4_SAME(_contr_base, 0.5f);
if (dcp->use_profile)
{
@@ -727,6 +734,7 @@
__m128 six_masked_lt = _mm_and_ps(six_ps, h_mask_lt);
h = _mm_sub_ps(h, six_masked_gt);
h = _mm_add_ps(h, six_masked_lt);
+ __m128 v_stored = v;
HSVtoRGB_SSE(&h, &s, &v);
r = h; g = s; b = v;
@@ -791,7 +799,25 @@
g = _mm_mul_ps(g,g);
b = _mm_mul_ps(b,b);
}
+ else if (do_highrec)
+ {
+ max_val = _mm_load_ps(_ones_ps);
+ __m128 inv_contrast =
_mm_load_ps(_inv_contrast);
+ __m128 recover_radius =
_mm_load_ps(_recover_radius);
+ __m128 inv_recover_radius =
_mm_load_ps(_inv_recover_radius);
+ /* Distance from 1.0 - radius */
+ __m128 dist = _mm_sub_ps(v_stored,
recover_radius);
+ /* Scale so distance is normalized, clamp */
+ __m128 dist_scaled = _mm_min_ps(max_val,
_mm_mul_ps(dist, inv_recover_radius));
+
+ __m128 mul_val = _mm_sub_ps(max_val,
_mm_mul_ps(dist_scaled, inv_contrast));
+
+ r = _mm_mul_ps(r, mul_val);
+ g = _mm_mul_ps(g, mul_val);
+ b = _mm_mul_ps(b, mul_val);
+ }
+
/* Convert to HSV */
RGBtoHSV_SSE2(&r, &g, &b);
h = r; s = g; v = b;
Modified: trunk/plugins/dcp/dcp.c
===================================================================
--- trunk/plugins/dcp/dcp.c 2010-04-10 21:17:11 UTC (rev 3353)
+++ trunk/plugins/dcp/dcp.c 2010-04-11 09:46:55 UTC (rev 3354)
@@ -387,7 +387,7 @@
ThreadInfo* t = _thread_info;
RS_IMAGE16 *tmp = t->tmp;
- if (tmp->pixelsize == 4 && (rs_detect_cpu_features() &
RS_CPU_FLAG_SSE2))
+ if (t->start_y && tmp->pixelsize == 4 && (rs_detect_cpu_features() &
RS_CPU_FLAG_SSE2))
{
if (render_SSE2(t))
{
@@ -883,8 +883,14 @@
gfloat h, s, v;
gfloat r, g, b;
RS_VECTOR3 pix;
- gboolean do_contrast = (ABS(1.0f - dcp->contrast) > 0.001f);
- float contr_base = MIN(0.5, dcp->contrast * 0.5);
+ gboolean do_contrast = (dcp->contrast > 1.001f);
+ gboolean do_highrec = (dcp->contrast < 0.999f);
+ float contr_base = 0.5;
+ float exposure_simple = MAX(1.0, powf(2.0f, dcp->exposure));
+ float recover_radius = 0.5 * exposure_simple;
+ float inv_recover_radius = 1.0f / recover_radius;
+ recover_radius = 1.0 - recover_radius;
+
RS_VECTOR3 clip;
if (dcp->use_profile)
@@ -972,7 +978,18 @@
b = MAX((sqrtf(b) - contr_base) * dcp->contrast
+ contr_base, 0.0f);
b *= b;
}
+ else if (do_highrec)
+ {
+ /* Distance from 1.0 - radius */
+ float dist = v - recover_radius;
+ /* Scale so distance is normalized, clamp */
+ float dist_scaled = MIN(1.0, dist *
inv_recover_radius);
+ float mul_val = 1.0 - dist_scaled * (1.0 -
dcp->contrast);
+ r = r * mul_val;
+ g = g * mul_val;
+ b = b * mul_val;
+ }
/* To HSV */
r = MIN(r, 1.0f);
g = MIN(g, 1.0f);
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit