plug-ins: use gimp_image_convert_color_profile() in lcms.c

This commit is contained in:
Michael Natterer
2015-06-10 02:05:14 +02:00
parent 0ceed29ce8
commit f279fd02da

View File

@ -82,28 +82,6 @@ static GimpPDBStatusType lcms_icc_apply (GimpColorConfig *config,
static gboolean lcms_image_set_profile (gint32 image,
GFile *file);
static gboolean lcms_image_apply_profile (gint32 image,
cmsHPROFILE src_profile,
cmsHPROFILE dest_profile,
GFile *file,
GimpColorRenderingIntent intent,
gboolean bpc);
static void lcms_image_transform_rgb (gint32 image,
cmsHPROFILE src_profile,
cmsHPROFILE dest_profile,
GimpColorRenderingIntent intent,
gboolean bpc);
static void lcms_layers_transform_rgb (gint *layers,
gint num_layers,
cmsHPROFILE src_profile,
cmsHPROFILE dest_profile,
GimpColorRenderingIntent intent,
gboolean bpc);
static void lcms_image_transform_indexed (gint32 image,
cmsHPROFILE src_profile,
cmsHPROFILE dest_profile,
GimpColorRenderingIntent intent,
gboolean bpc);
static gboolean lcms_icc_apply_dialog (gint32 image,
cmsHPROFILE src_profile,
@ -476,9 +454,7 @@ lcms_icc_apply (GimpColorConfig *config,
}
if (status == GIMP_PDB_SUCCESS &&
! lcms_image_apply_profile (image,
src_profile, dest_profile, file,
intent, bpc))
! gimp_image_convert_color_profile (image, dest_profile, intent, bpc))
{
status = GIMP_PDB_EXECUTION_ERROR;
}
@ -528,229 +504,6 @@ lcms_image_set_profile (gint32 image,
return TRUE;
}
static gboolean
lcms_image_apply_profile (gint32 image,
cmsHPROFILE src_profile,
cmsHPROFILE dest_profile,
GFile *file,
GimpColorRenderingIntent intent,
gboolean bpc)
{
gchar *src_label;
gchar *dest_label;
gint32 saved_selection = -1;
gimp_image_undo_group_start (image);
if (! lcms_image_set_profile (image, file))
{
gimp_image_undo_group_end (image);
return FALSE;
}
src_label = gimp_color_profile_get_label (src_profile);
dest_label = gimp_color_profile_get_label (dest_profile);
gimp_progress_init_printf (_("Converting from '%s' to '%s'"),
src_label, dest_label);
g_printerr ("lcms: converting from '%s' to '%s'\n", src_label, dest_label);
g_free (dest_label);
g_free (src_label);
if (! gimp_selection_is_empty (image))
{
saved_selection = gimp_selection_save (image);
gimp_selection_none (image);
}
switch (gimp_image_base_type (image))
{
case GIMP_RGB:
lcms_image_transform_rgb (image,
src_profile, dest_profile, intent, bpc);
break;
case GIMP_GRAY:
g_warning ("colorspace conversion not implemented for "
"grayscale images");
break;
case GIMP_INDEXED:
lcms_image_transform_indexed (image,
src_profile, dest_profile, intent, bpc);
break;
}
if (saved_selection != -1)
{
gimp_image_select_item (image, GIMP_CHANNEL_OP_REPLACE, saved_selection);
gimp_image_remove_channel (image, saved_selection);
}
gimp_progress_update (1.0);
gimp_image_undo_group_end (image);
return TRUE;
}
static void
lcms_image_transform_rgb (gint32 image,
cmsHPROFILE src_profile,
cmsHPROFILE dest_profile,
GimpColorRenderingIntent intent,
gboolean bpc)
{
gint *layers;
gint num_layers;
layers = gimp_image_get_layers (image, &num_layers);
lcms_layers_transform_rgb (layers, num_layers,
src_profile, dest_profile,
intent, bpc);
g_free (layers);
}
static void
lcms_layers_transform_rgb (gint *layers,
gint num_layers,
cmsHPROFILE src_profile,
cmsHPROFILE dest_profile,
GimpColorRenderingIntent intent,
gboolean bpc)
{
gint i;
for (i = 0; i < num_layers; i++)
{
gint32 layer_id = layers[i];
const Babl *iter_format = NULL;
cmsUInt32Number lcms_format = 0;
cmsHTRANSFORM transform;
gint *children;
gint num_children;
children = gimp_item_get_children (layer_id, &num_children);
if (children)
{
lcms_layers_transform_rgb (children, num_children,
src_profile, dest_profile,
intent, bpc);
g_free (children);
continue;
}
iter_format = gimp_color_profile_get_format (gimp_drawable_get_format (layer_id),
&lcms_format);
transform = cmsCreateTransform (src_profile, lcms_format,
dest_profile, lcms_format,
intent,
cmsFLAGS_NOOPTIMIZE |
(bpc ? cmsFLAGS_BLACKPOINTCOMPENSATION : 0));
if (transform)
{
GeglBuffer *src_buffer;
GeglBuffer *dest_buffer;
GeglBufferIterator *iter;
gint layer_width;
gint layer_height;
gint layer_bpp;
gboolean layer_alpha;
gdouble progress_start = (gdouble) i / num_layers;
gdouble progress_end = (gdouble) (i + 1) / num_layers;
gdouble range = progress_end - progress_start;
gint count = 0;
gint done = 0;
src_buffer = gimp_drawable_get_buffer (layer_id);
dest_buffer = gimp_drawable_get_shadow_buffer (layer_id);
layer_width = gegl_buffer_get_width (src_buffer);
layer_height = gegl_buffer_get_height (src_buffer);
layer_bpp = babl_format_get_bytes_per_pixel (iter_format);
layer_alpha = babl_format_has_alpha (iter_format);
iter = gegl_buffer_iterator_new (src_buffer, NULL, 0,
iter_format,
GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
gegl_buffer_iterator_add (iter, dest_buffer, NULL, 0,
iter_format,
GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
while (gegl_buffer_iterator_next (iter))
{
/* lcms doesn't touch the alpha channel, simply
* copy everything to dest before the transform
*/
if (layer_alpha)
memcpy (iter->data[1], iter->data[0],
iter->length * layer_bpp);
cmsDoTransform (transform,
iter->data[0], iter->data[1], iter->length);
}
g_object_unref (src_buffer);
g_object_unref (dest_buffer);
gimp_drawable_merge_shadow (layer_id, TRUE);
gimp_drawable_update (layer_id, 0, 0, layer_width, layer_height);
if (count++ % 32 == 0)
{
gimp_progress_update (progress_start +
(gdouble) done /
(layer_width * layer_height) * range);
}
cmsDeleteTransform (transform);
}
}
}
static void
lcms_image_transform_indexed (gint32 image,
cmsHPROFILE src_profile,
cmsHPROFILE dest_profile,
GimpColorRenderingIntent intent,
gboolean bpc)
{
cmsHTRANSFORM transform;
guchar *cmap;
gint n_cmap_bytes;
cmsUInt32Number format = TYPE_RGB_8;
cmap = gimp_image_get_colormap (image, &n_cmap_bytes);
transform = cmsCreateTransform (src_profile, format,
dest_profile, format,
intent,
cmsFLAGS_NOOPTIMIZE |
(bpc ? cmsFLAGS_BLACKPOINTCOMPENSATION : 0));
if (transform)
{
cmsDoTransform (transform, cmap, cmap, n_cmap_bytes / 3);
cmsDeleteTransform (transform);
}
else
{
g_warning ("cmsCreateTransform() failed!");
}
gimp_image_set_colormap (image, cmap, n_cmap_bytes);
}
static GtkWidget *
lcms_icc_profile_src_label_new (gint32 image,
cmsHPROFILE profile)
@ -1092,11 +845,10 @@ lcms_dialog (GimpColorConfig *config,
if (gimp_color_profile_is_rgb (dest_profile))
{
if (apply)
success = lcms_image_apply_profile (image,
src_profile, dest_profile,
file,
values->intent,
values->bpc);
success = gimp_image_convert_color_profile (image,
dest_profile,
values->intent,
values->bpc);
else
success = lcms_image_set_profile (image, file);
}