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

Reply via email to