Author: abrander
Date: 2010-02-13 02:14:38 +0100 (Sat, 13 Feb 2010)
New Revision: 3199
Modified:
trunk/plugins/colorspace-transform/colorspace_transform.c
trunk/plugins/dcp/dcp-sse2.c
trunk/plugins/dcp/dcp.c
trunk/plugins/dcp/dcp.h
Log:
Enabled RSDcp and RSColorspaceTransform to premultiply in beautiful harmony.
Modified: trunk/plugins/colorspace-transform/colorspace_transform.c
===================================================================
--- trunk/plugins/colorspace-transform/colorspace_transform.c 2010-02-13
00:45:34 UTC (rev 3198)
+++ trunk/plugins/colorspace-transform/colorspace_transform.c 2010-02-13
01:14:38 UTC (rev 3199)
@@ -110,6 +110,7 @@
{
/* Image was converted */
response = rs_filter_response_clone(previous_response);
+ rs_filter_param_set_boolean(RS_FILTER_PARAM(response),
"is-premultiplied", TRUE);
g_object_unref(previous_response);
rs_filter_response_set_image(response, output);
g_object_unref(output);
Modified: trunk/plugins/dcp/dcp-sse2.c
===================================================================
--- trunk/plugins/dcp/dcp-sse2.c 2010-02-13 00:45:34 UTC (rev 3198)
+++ trunk/plugins/dcp/dcp-sse2.c 2010-02-13 01:14:38 UTC (rev 3199)
@@ -593,7 +593,7 @@
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);
+ SETFLOAT4_SAME(_min_cam, 1.0);
SETFLOAT4_SAME(_black_minus_radius, dcp->exposure_black -
dcp->exposure_radius);
SETFLOAT4_SAME(_black_plus_radius, dcp->exposure_black +
dcp->exposure_radius);
SETFLOAT4_SAME(_exposure_black, dcp->exposure_black);
@@ -604,6 +604,25 @@
SETFLOAT4_SAME(_cm_g, dcp->channelmixer_green);
SETFLOAT4_SAME(_cm_b, dcp->channelmixer_blue);
+ if (dcp->use_profile)
+ {
+ _min_cam[0] = dcp->camera_white.x;
+ _min_cam[1] = dcp->camera_white.y;
+ _min_cam[2] = dcp->camera_white.z;
+ _min_cam[3] = 0.0;
+ }
+ else if (!t->dcp->is_premultiplied)
+ {
+ _min_cam[0] = 1.0 / MAX(dcp->pre_mul.R, 0.1);
+ _min_cam[1] = 1.0 / MAX(dcp->pre_mul.G, 0.1);
+ _min_cam[2] = 1.0 / MAX(dcp->pre_mul.B, 0.1);
+ _min_cam[3] = 0.0;
+
+ _cm_r[0] = _cm_r[1] = _cm_r[2] = _cm_r[3] *= dcp->pre_mul.R;
+ _cm_g[0] = _cm_g[1] = _cm_g[2] = _cm_g[3] *= dcp->pre_mul.G;
+ _cm_b[0] = _cm_b[1] = _cm_b[2] = _cm_b[3] *= dcp->pre_mul.B;
+ }
+
float cam_prof[4*4*3] __attribute__ ((aligned (16)));
for (x = 0; x < 4; x++ ) {
cam_prof[x] = dcp->camera_to_prophoto.coeff[0][0] *
dcp->channelmixer_red;
Modified: trunk/plugins/dcp/dcp.c
===================================================================
--- trunk/plugins/dcp/dcp.c 2010-02-13 00:45:34 UTC (rev 3198)
+++ trunk/plugins/dcp/dcp.c 2010-02-13 01:14:38 UTC (rev 3199)
@@ -431,6 +431,9 @@
rs_filter_param_set_object(RS_FILTER_PARAM(response), "colorspace",
klass->prophoto);
g_object_unref(previous_response);
+ dcp->is_premultiplied = FALSE;
+ rs_filter_param_get_boolean(RS_FILTER_PARAM(response),
"is-premultiplied", &dcp->is_premultiplied);
+
output = rs_image16_copy(input, TRUE);
g_object_unref(input);
@@ -859,7 +862,21 @@
gfloat r, g, b;
RS_VECTOR3 pix;
gboolean do_contrast = (ABS(1.0f - dcp->contrast) > 0.001f);
-
+ RS_VECTOR3 clip;
+
+ if (dcp->use_profile)
+ {
+ clip.R = dcp->camera_white.R;
+ clip.G = dcp->camera_white.G;
+ clip.B = dcp->camera_white.B;
+ }
+ else if (!t->dcp->is_premultiplied)
+ {
+ clip.R = 1.0 / MAX(dcp->pre_mul.R, 0.1);
+ clip.G = 1.0 / MAX(dcp->pre_mul.G, 0.1);
+ clip.B = 1.0 / MAX(dcp->pre_mul.B, 0.1);
+ }
+
for(y = t->start_y ; y < t->end_y; y++)
{
for(x=t->start_x; x < image->w; x++)
@@ -873,9 +890,9 @@
if (dcp->use_profile)
{
- r = MIN(dcp->camera_white.x, r);
- g = MIN(dcp->camera_white.y, g);
- b = MIN(dcp->camera_white.z, b);
+ r = MIN(clip.R, r);
+ g = MIN(clip.G, g);
+ b = MIN(clip.B, b);
pix.R = r;
pix.G = g;
@@ -886,7 +903,17 @@
g = pix.G;
b = pix.B;
}
+ else if (!t->dcp->is_premultiplied)
+ {
+ r = MIN(clip.R, r);
+ g = MIN(clip.G, g);
+ b = MIN(clip.B, b);
+ r *= dcp->pre_mul.R;
+ g *= dcp->pre_mul.G;
+ b *= dcp->pre_mul.B;
+ }
+
r = CLAMP(r * dcp->channelmixer_red, 0.0, 1.0);
g = CLAMP(g * dcp->channelmixer_green, 0.0, 1.0);
b = CLAMP(b * dcp->channelmixer_blue, 0.0, 1.0);
Modified: trunk/plugins/dcp/dcp.h
===================================================================
--- trunk/plugins/dcp/dcp.h 2010-02-13 00:45:34 UTC (rev 3198)
+++ trunk/plugins/dcp/dcp.h 2010-02-13 01:14:38 UTC (rev 3199)
@@ -56,6 +56,7 @@
gfloat channelmixer_blue;
RS_VECTOR3 pre_mul;
+ gboolean is_premultiplied;
RS_xy_COORD white_xy;
gint nknots;
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit