Author: post
Date: 2009-12-31 16:52:04 +0100 (Thu, 31 Dec 2009)
New Revision: 2957

Modified:
   branches/rawstudio-ng-color/plugins/dcp/dcp-sse2.c
   branches/rawstudio-ng-color/plugins/dcp/dcp-sse4.c
   branches/rawstudio-ng-color/plugins/dcp/dcp.c
Log:
DCP: Avoid sqrt(0) in contrast. Clamp S/V when entering huesatmap to ensure no 
out-of-buffer reads. Disable SSE2 debug visualization.

Modified: branches/rawstudio-ng-color/plugins/dcp/dcp-sse2.c
===================================================================
--- branches/rawstudio-ng-color/plugins/dcp/dcp-sse2.c  2009-12-31 15:17:52 UTC 
(rev 2956)
+++ branches/rawstudio-ng-color/plugins/dcp/dcp-sse2.c  2009-12-31 15:52:04 UTC 
(rev 2957)
@@ -224,11 +224,17 @@
 static void
 huesat_map_SSE2(RSHuesatMap *map, const PrecalcHSM* precalc, __m128 *_h, 
__m128 *_s, __m128 *_v)
 {
-       g_assert(RS_IS_HUESAT_MAP(map));
-
+       __m128 zero_ps = _mm_setzero_ps();
+       __m128 ones_ps = _mm_load_ps(_ones_ps);
+       
        __m128 h = *_h;
        __m128 s = *_s;
        __m128 v = *_v;
+       
+       /* Clamp - H must be pre-clamped*/
+       s =  _mm_min_ps(_mm_max_ps(s, zero_ps),ones_ps);
+       v =  _mm_min_ps(_mm_max_ps(v, zero_ps),ones_ps);
+       
        gint xfer_0[4] __attribute__ ((aligned (16)));
        gint xfer_1[4] __attribute__ ((aligned (16)));
 
@@ -416,7 +422,7 @@
        }
 
        __m128 mul_hue = _mm_load_ps(_mul_hue_ps);
-       __m128 ones_ps = _mm_load_ps(_ones_ps);
+       ones_ps = _mm_load_ps(_ones_ps);
        hueShift = _mm_mul_ps(hueShift, mul_hue);
        s = _mm_min_ps(ones_ps, _mm_mul_ps(s, satScale));
        v = _mm_min_ps(ones_ps, _mm_mul_ps(v, valScale));
@@ -727,6 +733,9 @@
                                __m128 half_ps = _mm_load_ps(_half_ps);
                                __m128 contrast = _mm_load_ps(_contrast);
                                min_val = _mm_load_ps(_very_small_ps);
+                               r = _mm_max_ps(r, min_val);
+                               g = _mm_max_ps(g, min_val);
+                               b = _mm_max_ps(b, min_val);
                                r = _mm_add_ps(_mm_mul_ps(contrast, 
_mm_sub_ps(_mm_sqrt_ps(r), half_ps)), half_ps);
                                g = _mm_add_ps(_mm_mul_ps(contrast, 
_mm_sub_ps(_mm_sqrt_ps(g), half_ps)), half_ps);
                                b = _mm_add_ps(_mm_mul_ps(contrast, 
_mm_sub_ps(_mm_sqrt_ps(b), half_ps)), half_ps);

Modified: branches/rawstudio-ng-color/plugins/dcp/dcp-sse4.c
===================================================================
--- branches/rawstudio-ng-color/plugins/dcp/dcp-sse4.c  2009-12-31 15:17:52 UTC 
(rev 2956)
+++ branches/rawstudio-ng-color/plugins/dcp/dcp-sse4.c  2009-12-31 15:52:04 UTC 
(rev 2957)
@@ -228,11 +228,16 @@
 static void
 huesat_map_SSE4(RSHuesatMap *map, const PrecalcHSM* precalc, __m128 *_h, 
__m128 *_s, __m128 *_v)
 {
-       g_assert(RS_IS_HUESAT_MAP(map));
-
+       __m128 zero_ps = _mm_setzero_ps();
+       __m128 ones_ps = _mm_load_ps(_ones_ps);
+       
        __m128 h = *_h;
        __m128 s = *_s;
        __m128 v = *_v;
+       
+       /* Clamp - H must be pre-clamped*/
+       s =  _mm_min_ps(_mm_max_ps(s, zero_ps),ones_ps);
+       v =  _mm_min_ps(_mm_max_ps(v, zero_ps),ones_ps);
 
        const RS_VECTOR3 *tableBase = map->deltas;
 
@@ -453,7 +458,7 @@
        }
 
        __m128 mul_hue = _mm_load_ps(_mul_hue_ps);
-       __m128 ones_ps = _mm_load_ps(_ones_ps);
+       ones_ps = _mm_load_ps(_ones_ps);
        hueShift = _mm_mul_ps(hueShift, mul_hue);
        s = _mm_min_ps(ones_ps, _mm_mul_ps(s, satScale));
        v = _mm_min_ps(ones_ps, _mm_mul_ps(v, valScale));

Modified: branches/rawstudio-ng-color/plugins/dcp/dcp.c
===================================================================
--- branches/rawstudio-ng-color/plugins/dcp/dcp.c       2009-12-31 15:17:52 UTC 
(rev 2956)
+++ branches/rawstudio-ng-color/plugins/dcp/dcp.c       2009-12-31 15:52:04 UTC 
(rev 2957)
@@ -317,7 +317,7 @@
        ThreadInfo* t = _thread_info;
        RS_IMAGE16 *tmp = t->tmp;
 
-       if (t->start_y && tmp->pixelsize == 4  && (rs_detect_cpu_features() & 
RS_CPU_FLAG_SSE2))
+       if (tmp->pixelsize == 4  && (rs_detect_cpu_features() & 
RS_CPU_FLAG_SSE2))
        {
                if (render_SSE2(t))
                {
@@ -1066,7 +1066,7 @@
        /* ProfileToneCurve */
        dcp->tone_curve = rs_dcp_file_get_tonecurve(dcp_file);
        if (!dcp->tone_curve)
-               dcp->tone_curve = rs_spline_new(adobe_default_table, 
adobe_default_table_size, NATURAL);
+               dcp->tone_curve = rs_spline_new(adobe_default_table, 
adobe_default_table_size / 2, NATURAL);
        if (dcp->tone_curve)
                dcp->tone_curve_lut = rs_spline_sample(dcp->tone_curve, NULL, 
65536);
        /* FIXME: Free these at some point! */


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

Reply via email to