Author: post
Date: 2010-04-01 23:40:09 +0200 (Thu, 01 Apr 2010)
New Revision: 3305
Modified:
trunk/plugins/colorspace-transform/colorspace_transform.c
Log:
Apply pre-multiplier on all configurations. Sets the "is-premultiplied" flag,
so it doesn't get applied multiple times.
Modified: trunk/plugins/colorspace-transform/colorspace_transform.c
===================================================================
--- trunk/plugins/colorspace-transform/colorspace_transform.c 2010-04-01
20:34:20 UTC (rev 3304)
+++ trunk/plugins/colorspace-transform/colorspace_transform.c 2010-04-01
21:40:09 UTC (rev 3305)
@@ -27,6 +27,8 @@
struct _RSColorspaceTransform {
RSFilter parent;
+ gfloat premul[4];
+ gboolean has_premul;
RSCmm *cmm;
};
@@ -88,6 +90,7 @@
RSFilterResponse *response;
RS_IMAGE16 *input;
RS_IMAGE16 *output = NULL;
+ int i;
previous_response = rs_filter_get_image(filter->previous, request);
input = rs_filter_response_get_image(previous_response);
@@ -97,21 +100,27 @@
RSColorSpace *input_space =
rs_filter_param_get_object_with_type(RS_FILTER_PARAM(previous_response),
"colorspace", RS_TYPE_COLOR_SPACE);
RSColorSpace *output_space =
rs_filter_param_get_object_with_type(RS_FILTER_PARAM(request), "colorspace",
RS_TYPE_COLOR_SPACE);
+ for( i = 0; i < 4; i++)
+ colorspace_transform->premul[i] = 1.0f;
if (input_space && output_space && (input_space != output_space))
{
- gfloat premul[4] = { 1.0, 1.0, 1.0, 1.0 };
- rs_filter_param_get_float4(RS_FILTER_PARAM(request), "premul",
premul);
- rs_cmm_set_premul(colorspace_transform->cmm, premul);
+ gboolean is_premultiplied = FALSE;
+ rs_filter_param_get_boolean(RS_FILTER_PARAM(previous_response),
"is-premultiplied", &is_premultiplied);
+ if (!is_premultiplied)
+ if ((colorspace_transform->has_premul =
rs_filter_param_get_float4(RS_FILTER_PARAM(request), "premul",
colorspace_transform->premul)))
+ rs_cmm_set_premul(colorspace_transform->cmm,
colorspace_transform->premul);
+
output = rs_image16_copy(input, FALSE);
if (convert_colorspace16(colorspace_transform, input, output,
input_space, output_space))
{
/* 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);
+ if (colorspace_transform->has_premul)
+
rs_filter_param_set_boolean(RS_FILTER_PARAM(response), "is-premultiplied",
TRUE);
rs_filter_response_set_image(response, output);
g_object_unref(output);
g_object_unref(input);
@@ -141,6 +150,7 @@
RS_IMAGE16 *input;
GdkPixbuf *output = NULL;
GdkRectangle *roi;
+ int i;
previous_response = rs_filter_get_image(filter->previous, request);
input = rs_filter_response_get_image(previous_response);
@@ -151,13 +161,27 @@
RSColorSpace *input_space =
rs_filter_param_get_object_with_type(RS_FILTER_PARAM(previous_response),
"colorspace", RS_TYPE_COLOR_SPACE);
RSColorSpace *output_space =
rs_filter_param_get_object_with_type(RS_FILTER_PARAM(request), "colorspace",
RS_TYPE_COLOR_SPACE);
+ response = rs_filter_response_clone(previous_response);
+ g_object_unref(previous_response);
+
+ for( i = 0; i < 4; i++)
+ colorspace_transform->premul[i] = 1.0f;
+
+ gboolean is_premultiplied = FALSE;
+ rs_filter_param_get_boolean(RS_FILTER_PARAM(response),
"is-premultiplied", &is_premultiplied);
+
+ if (!is_premultiplied)
+ if ((colorspace_transform->has_premul =
rs_filter_param_get_float4(RS_FILTER_PARAM(request), "premul",
colorspace_transform->premul)))
+ rs_cmm_set_premul(colorspace_transform->cmm,
colorspace_transform->premul);
+
+ if (colorspace_transform->has_premul)
+ rs_filter_param_set_boolean(RS_FILTER_PARAM(response),
"is-premultiplied", TRUE);
+
#if 0
printf("\033[33m8 input_space: %s\033[0m\n", (input_space) ?
G_OBJECT_TYPE_NAME(input_space) : "none");
printf("\033[33m8 output_space: %s\n\033[0m", (output_space) ?
G_OBJECT_TYPE_NAME(output_space) : "none");
#endif
- response = rs_filter_response_clone(previous_response);
- g_object_unref(previous_response);
output = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, input->w,
input->h);
/* Process output */
@@ -275,7 +299,7 @@
g_assert(RS_IS_COLOR_SPACE(output_space));
/* If input/output-image doesn't differ, return no transformation
needed */
- if (input_space == output_space)
+ if (input_space == output_space && !colorspace_transform->has_premul)
return FALSE;
/* A few sanity checks */
@@ -299,10 +323,14 @@
/* If we get here, we can transform using simple vector math */
else
{
+ RS_VECTOR3 vec =
{{colorspace_transform->premul[0]},{colorspace_transform->premul[1]},{colorspace_transform->premul[2]}};
+ const RS_MATRIX3 mul_vec = vector3_as_diagonal(&vec);
const RS_MATRIX3 a =
rs_color_space_get_matrix_from_pcs(input_space);
+ RS_MATRIX3 a_premul;
+ matrix3_multiply(&a, &mul_vec, &a_premul);
const RS_MATRIX3 b =
rs_color_space_get_matrix_to_pcs(output_space);
RS_MATRIX3 mat;
- matrix3_multiply(&b, &a, &mat);
+ matrix3_multiply(&b, &a_premul, &mat);
transform16_c(
GET_PIXEL(input_image, 0, 0),
@@ -410,12 +438,16 @@
/* If we get here, we can transform using simple vector math and a
lookup table */
else
{
+ const RS_VECTOR3 vec =
{{colorspace_transform->premul[0]},{colorspace_transform->premul[1]},{colorspace_transform->premul[2]}};
+ const RS_MATRIX3 mul_vec = vector3_as_diagonal(&vec);
const RS_MATRIX3 a =
rs_color_space_get_matrix_from_pcs(input_space);
+ RS_MATRIX3 a_premul;
+ matrix3_multiply(&a, &mul_vec, &a_premul);
const RS_MATRIX3 b =
rs_color_space_get_matrix_to_pcs(output_space);
-
RS_MATRIX3 mat;
- matrix3_multiply(&b, &a, &mat);
+ matrix3_multiply(&b, &a_premul, &mat);
+
gint i;
guint y_offset, y_per_thread, threaded_h;
const guint threads = rs_get_number_of_processor_cores();
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit