Author: post
Date: 2009-12-31 03:00:04 +0100 (Thu, 31 Dec 2009)
New Revision: 2944

Modified:
   branches/rawstudio-ng-color/plugins/dcp/dcp-sse.c
   branches/rawstudio-ng-color/plugins/dcp/dcp.c
Log:
Clamp in Prophoto RGB instead of in HSV mode in C mode. Skip contrast, if set 
at neutral.

Modified: branches/rawstudio-ng-color/plugins/dcp/dcp-sse.c
===================================================================
--- branches/rawstudio-ng-color/plugins/dcp/dcp-sse.c   2009-12-31 01:55:43 UTC 
(rev 2943)
+++ branches/rawstudio-ng-color/plugins/dcp/dcp-sse.c   2009-12-31 02:00:04 UTC 
(rev 2944)
@@ -562,6 +562,7 @@
 
        __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);
 
        int xfer[4] __attribute__ ((aligned (16)));
        SETFLOAT4(_min_cam, 0.0f, dcp->camera_white.z, dcp->camera_white.y, 
dcp->camera_white.x);
@@ -684,6 +685,8 @@
                        r = h; g = s; b = v;
                        
                        /* Exposure */
+                       /* y = x - (dcp->exposure_black - 
dcp->exposure_radius);        */
+                       /* x = dcp->exposure_qscale * y * y;                    
                        */
                        __m128 black_minus_radius = 
_mm_load_ps(_black_minus_radius);
                        __m128 y_r = _mm_sub_ps(r, black_minus_radius);
                        __m128 y_g = _mm_sub_ps(g, black_minus_radius);
@@ -694,12 +697,14 @@
                        y_g = _mm_mul_ps(exposure_qscale,_mm_mul_ps(y_g, y_g));
                        y_b = _mm_mul_ps(exposure_qscale,_mm_mul_ps(y_b, y_b));
 
+                       /* if (x >= dcp->exposure_black + dcp->exposure_radius) 
                */
+                       /*              x =  (x - dcp->exposure_black) * 
dcp->exposure_slope;   */                      
                        __m128 exposure_slope = _mm_load_ps(_exposure_slope);
                        __m128 exposure_black = _mm_load_ps(_exposure_black);
                        __m128 y2_r = _mm_mul_ps(exposure_slope, _mm_sub_ps(r, 
exposure_black));
                        __m128 y2_g = _mm_mul_ps(exposure_slope, _mm_sub_ps(g, 
exposure_black));
                        __m128 y2_b = _mm_mul_ps(exposure_slope, _mm_sub_ps(b, 
exposure_black));
-                       
+                                               
                        __m128 black_plus_radius = 
_mm_load_ps(_black_plus_radius);
                        __m128 r_mask = _mm_cmpgt_ps(r, black_plus_radius);
                        __m128 g_mask = _mm_cmpgt_ps(g, black_plus_radius);
@@ -721,18 +726,21 @@
                        b = _mm_andnot_ps(b_mask, y_b);
 
                        /* Contrast in gamma 2.0 */
-                       __m128 half_ps = _mm_load_ps(_half_ps);
-                       __m128 contrast = _mm_load_ps(_contrast);
-                       min_val = _mm_load_ps(_very_small_ps);
-                       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);
-                       r = _mm_max_ps(r, min_val);
-                       g = _mm_max_ps(g, min_val);
-                       b = _mm_max_ps(b, min_val);
-                       r = _mm_mul_ps(r,r);
-                       g = _mm_mul_ps(g,g);
-                       b = _mm_mul_ps(b,b);
+                       if (do_contrast)
+                       {
+                               __m128 half_ps = _mm_load_ps(_half_ps);
+                               __m128 contrast = _mm_load_ps(_contrast);
+                               min_val = _mm_load_ps(_very_small_ps);
+                               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);
+                               r = _mm_max_ps(r, min_val);
+                               g = _mm_max_ps(g, min_val);
+                               b = _mm_max_ps(b, min_val);
+                               r = _mm_mul_ps(r,r);
+                               g = _mm_mul_ps(g,g);
+                               b = _mm_mul_ps(b,b);
+                       }
 
                        /* Convert to HSV */
                        RGBtoHSV_SSE(&r, &g, &b);
@@ -1251,7 +1259,8 @@
        __m128 p1f, p2f, p3f, p4f;
        __m128 r, g, b, r2, g2, b2;
        __m128i zero;
-
+       
+       gboolean do_contrast = (ABS(1.0f - dcp->contrast) > 0.001f);
        __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);
 
@@ -1409,18 +1418,21 @@
                        b = _mm_andnot_ps(b_mask, y_b);
 
                        /* Contrast in gamma 2.0 */
-                       __m128 half_ps = _mm_load_ps(_half_ps);
-                       __m128 contrast = _mm_load_ps(_contrast);
-                       min_val = _mm_load_ps(_very_small_ps);
-                       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);
-                       r = _mm_max_ps(r, min_val);
-                       g = _mm_max_ps(g, min_val);
-                       b = _mm_max_ps(b, min_val);
-                       r = _mm_mul_ps(r,r);
-                       g = _mm_mul_ps(g,g);
-                       b = _mm_mul_ps(b,b);
+                       if (do_contrast)
+                       {
+                               __m128 half_ps = _mm_load_ps(_half_ps);
+                               __m128 contrast = _mm_load_ps(_contrast);
+                               min_val = _mm_load_ps(_very_small_ps);
+                               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);
+                               r = _mm_max_ps(r, min_val);
+                               g = _mm_max_ps(g, min_val);
+                               b = _mm_max_ps(b, min_val);
+                               r = _mm_mul_ps(r,r);
+                               g = _mm_mul_ps(g,g);
+                               b = _mm_mul_ps(b,b);
+                       }
 
                        /* Convert to HSV */
                        RGBtoHSV_SSE4(&r, &g, &b);

Modified: branches/rawstudio-ng-color/plugins/dcp/dcp.c
===================================================================
--- branches/rawstudio-ng-color/plugins/dcp/dcp.c       2009-12-31 01:55:43 UTC 
(rev 2943)
+++ branches/rawstudio-ng-color/plugins/dcp/dcp.c       2009-12-31 02:00:04 UTC 
(rev 2944)
@@ -761,7 +761,8 @@
        gfloat h, s, v;
        gfloat r, g, b;
        RS_VECTOR3 pix;
-
+       gboolean do_contrast = (ABS(1.0f - dcp->contrast) > 0.001f);
+       
        for(y = t->start_y ; y < t->end_y; y++)
        {
                for(x=t->start_x; x < image->w; x++)
@@ -815,14 +816,21 @@
                        b = exposure_ramp(dcp, b);
                        
                        /* Contrast in gamma 2.0 */
-                       r = MAX((sqrtf(r) - 0.5) * dcp->contrast + 0.5, 0.0f);
-                       r *= r;
-                       g = MAX((sqrtf(g) - 0.5) * dcp->contrast + 0.5, 0.0f);
-                       g *= g;
-                       b = MAX((sqrtf(b) - 0.5) * dcp->contrast + 0.5, 0.0f);
-                       b *= b;
+                       if (do_contrast)
+                       {
+                               r = MAX((sqrtf(r) - 0.5) * dcp->contrast + 0.5, 
0.0f);
+                               r *= r;
+                               g = MAX((sqrtf(g) - 0.5) * dcp->contrast + 0.5, 
0.0f);
+                               g *= g;
+                               b = MAX((sqrtf(b) - 0.5) * dcp->contrast + 0.5, 
0.0f);
+                               b *= b;
+                       }
 
                        /* To HSV */
+                       r = MIN(r, 1.0f);
+                       g = MIN(g, 1.0f);
+                       b = MIN(b, 1.0f);
+                       
                        RGBtoHSV(r, g, b, &h, &s, &v);
 
                        /* Curve */


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

Reply via email to