Author: post
Date: 2010-01-16 14:28:11 +0100 (Sat, 16 Jan 2010)
New Revision: 3008
Modified:
branches/rawstudio-ng-color/plugins/colorspace-transform/colorspace_transform.c
Log:
Disallow inplace 16 bit conversion(not used anyway), instead allow transform to
return without copying the image, if no transform is needed.
Modified:
branches/rawstudio-ng-color/plugins/colorspace-transform/colorspace_transform.c
===================================================================
---
branches/rawstudio-ng-color/plugins/colorspace-transform/colorspace_transform.c
2010-01-16 13:15:43 UTC (rev 3007)
+++
branches/rawstudio-ng-color/plugins/colorspace-transform/colorspace_transform.c
2010-01-16 13:28:11 UTC (rev 3008)
@@ -50,7 +50,7 @@
static RSFilterResponse *get_image(RSFilter *filter, const RSFilterRequest
*request);
static RSFilterResponse *get_image8(RSFilter *filter, const RSFilterRequest
*request);
-static void convert_colorspace16(RSColorspaceTransform *colorspace_transform,
RS_IMAGE16 *input_image, RS_IMAGE16 *output_image, RSColorSpace *input_space,
RSColorSpace *output_space);
+static gboolean convert_colorspace16(RSColorspaceTransform
*colorspace_transform, RS_IMAGE16 *input_image, RS_IMAGE16 *output_image,
RSColorSpace *input_space, RSColorSpace *output_space);
static void convert_colorspace8(RSColorspaceTransform *colorspace_transform,
RS_IMAGE16 *input_image, GdkPixbuf *output_image, RSColorSpace *input_space,
RSColorSpace *output_space);
static RSFilterClass *rs_colorspace_transform_parent_class = NULL;
@@ -98,22 +98,29 @@
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);
printf("\033[33m16 input_space: %s\033[0m\n", (input_space) ?
G_OBJECT_TYPE_NAME(input_space) : "none");
printf("\033[33m16 output_space: %s\n\033[0m", (output_space) ?
G_OBJECT_TYPE_NAME(output_space) : "none");
if (input_space && output_space)
{
- g_object_unref(previous_response);
output = rs_image16_copy(input, FALSE);
- convert_colorspace16(colorspace_transform, input, output,
input_space, output_space);
-
- rs_filter_response_set_image(response, output);
- g_object_unref(output);
- g_object_unref(input);
-
- return response;
+ if (convert_colorspace16(colorspace_transform, input, output,
input_space, output_space))
+ {
+ /* Image was converted */
+ response = rs_filter_response_clone(previous_response);
+ g_object_unref(previous_response);
+ rs_filter_response_set_image(response, output);
+ g_object_unref(output);
+ g_object_unref(input);
+ return response;
+ } else
+ {
+ /* No conversion was needed */
+ g_object_unref(input);
+ g_object_unref(output);
+ return previous_response;
+ }
}
else
{
@@ -247,36 +254,24 @@
}
}
-static void
+static gboolean
convert_colorspace16(RSColorspaceTransform *colorspace_transform, RS_IMAGE16
*input_image, RS_IMAGE16 *output_image, RSColorSpace *input_space, RSColorSpace
*output_space)
{
g_assert(RS_IS_IMAGE16(input_image));
- g_assert(RS_IS_IMAGE16(output_image) || (output_image == NULL));
+ g_assert(RS_IS_IMAGE16(output_image));
g_assert(RS_IS_COLOR_SPACE(input_space));
g_assert(RS_IS_COLOR_SPACE(output_space));
- /* Do the transformation inplace if needed */
- if (output_image == NULL)
- output_image = input_image;
+ /* If input/output-image doesn't differ, return no transformation
needed */
+ if (input_space == output_space)
+ return FALSE;
- /* If both input/output images and colorspace are the same, return
immediately */
- if ((input_image == output_image) && (input_space == output_space))
- return;
-
/* A few sanity checks */
g_assert(input_image->w == output_image->w);
g_assert(input_image->h == output_image->h);
- /* If input/output-image differ, but colorspace is the same, do a
simple copy */
- if (input_space == output_space)
- {
- /* FIXME: Do some sanity checking! */
- /* FIXME: Don't assume images have same pitch! */
- memcpy(output_image->pixels, input_image->pixels,
input_image->rowstride*input_image->h*2);
- }
-
/* If a CMS is needed, do the transformation using LCMS */
- else if (RS_COLOR_SPACE_REQUIRES_CMS(input_space) ||
RS_COLOR_SPACE_REQUIRES_CMS(output_space))
+ if (RS_COLOR_SPACE_REQUIRES_CMS(input_space) ||
RS_COLOR_SPACE_REQUIRES_CMS(output_space))
{
const RSIccProfile *i, *o;
@@ -304,6 +299,7 @@
input_image->pixelsize,
&mat);
}
+ return TRUE;
}
static void
@@ -315,10 +311,8 @@
g_assert(RS_IS_COLOR_SPACE(output_space));
/* A few sanity checks */
- if (input_image->w != gdk_pixbuf_get_width(output_image))
- return;
- if (input_image->h != gdk_pixbuf_get_height(output_image))
- return;
+ g_assert(input_image->w == gdk_pixbuf_get_width(output_image));
+ g_assert(input_image->h == gdk_pixbuf_get_height(output_image));
/* If a CMS is needed, do the transformation using LCMS */
if (RS_COLOR_SPACE_REQUIRES_CMS(input_space) ||
RS_COLOR_SPACE_REQUIRES_CMS(output_space))
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit