pdb, app, libgimp: add gimp_image_get_effective_color_profile()

which returns the profile that is actually used for the image. And
some cleanup and fixes in image_color_profile.pdb.
This commit is contained in:
Michael Natterer 2015-06-07 01:38:50 +02:00
parent acb76a4d2a
commit 16749cd395
8 changed files with 265 additions and 35 deletions

View file

@ -106,23 +106,72 @@ image_set_color_profile_invoker (GimpProcedure *procedure,
if (success)
{
GimpColorProfile profile;
profile = gimp_color_profile_open_from_data (color_profile, num_bytes, error);
if (profile)
if (color_profile)
{
success = gimp_image_set_color_profile (image, profile, error);
gimp_color_profile_close (profile);
GimpColorProfile profile;
profile = gimp_color_profile_open_from_data (color_profile, num_bytes,
error);
if (profile)
{
success = gimp_image_set_color_profile (image, profile, error);
gimp_color_profile_close (profile);
}
else
success = FALSE;
}
else
success = FALSE;
{
success = gimp_image_set_color_profile (image, NULL, error);
}
}
return gimp_procedure_get_return_values (procedure, success,
error ? *error : NULL);
}
static GimpValueArray *
image_get_effective_color_profile_invoker (GimpProcedure *procedure,
Gimp *gimp,
GimpContext *context,
GimpProgress *progress,
const GimpValueArray *args,
GError **error)
{
gboolean success = TRUE;
GimpValueArray *return_vals;
GimpImage *image;
gint32 num_bytes = 0;
guint8 *profile_data = NULL;
image = gimp_value_get_image (gimp_value_array_index (args, 0), gimp);
if (success)
{
GimpColorProfile profile;
gsize length;
profile = gimp_color_managed_get_color_profile (GIMP_COLOR_MANAGED (image));
profile_data = gimp_color_profile_save_to_data (profile, &length, NULL);
num_bytes = length;
gimp_color_profile_close (profile);
}
return_vals = gimp_procedure_get_return_values (procedure, success,
error ? *error : NULL);
if (success)
{
g_value_set_int (gimp_value_array_index (return_vals, 1), num_bytes);
gimp_value_take_int8array (gimp_value_array_index (return_vals, 2), profile_data, num_bytes);
}
return return_vals;
}
void
register_image_color_profile_procs (GimpPDB *pdb)
{
@ -137,7 +186,7 @@ register_image_color_profile_procs (GimpPDB *pdb)
gimp_procedure_set_static_strings (procedure,
"gimp-image-get-color-profile",
"Returns the image's color profile",
"This procedure returns the image's color profile.",
"This procedure returns the image's color profile, or NULL if the image has no color profile assigned.",
"Michael Natterer <mitch@gimp.org>",
"Michael Natterer",
"2015",
@ -171,7 +220,7 @@ register_image_color_profile_procs (GimpPDB *pdb)
gimp_procedure_set_static_strings (procedure,
"gimp-image-set-color-profile",
"Sets the image's color profile",
"This procedure sets the image's color profile.",
"This procedure sets the image's color profile, or unsets it if NULL is passed as 'color_profile'.",
"Michael Natterer <mitch@gimp.org>",
"Michael Natterer",
"2015",
@ -195,4 +244,38 @@ register_image_color_profile_procs (GimpPDB *pdb)
GIMP_PARAM_READWRITE));
gimp_pdb_register_procedure (pdb, procedure);
g_object_unref (procedure);
/*
* gimp-image-get-effective-color-profile
*/
procedure = gimp_procedure_new (image_get_effective_color_profile_invoker);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-image-get-effective-color-profile");
gimp_procedure_set_static_strings (procedure,
"gimp-image-get-effective-color-profile",
"Returns the color profile that is used for the image",
"This procedure returns the color profile that is actually used for this image, which is the profile returned by 'gimp-image-get-color-profile' if the image has a profile assigned, or the default RGB profile from preferences if no profile is assigned to the image. If there is no default RGB profile configured in preferences either, a generated default RGB profile is returned.",
"Michael Natterer <mitch@gimp.org>",
"Michael Natterer",
"2015",
NULL);
gimp_procedure_add_argument (procedure,
gimp_param_spec_image_id ("image",
"image",
"The image",
pdb->gimp, FALSE,
GIMP_PARAM_READWRITE));
gimp_procedure_add_return_value (procedure,
gimp_param_spec_int32 ("num-bytes",
"num bytes",
"Number of bytes in the color_profile array",
0, G_MAXINT32, 0,
GIMP_PARAM_READWRITE));
gimp_procedure_add_return_value (procedure,
gimp_param_spec_int8_array ("profile-data",
"profile data",
"The image's serialized color profile. The returned value must be freed with g_free()",
GIMP_PARAM_READWRITE));
gimp_pdb_register_procedure (pdb, procedure);
g_object_unref (procedure);
}

View file

@ -28,7 +28,7 @@
#include "internal-procs.h"
/* 757 procedures registered total */
/* 758 procedures registered total */
void
internal_procs_init (GimpPDB *pdb)

View file

@ -406,6 +406,7 @@ EXPORTS
gimp_image_get_colormap
gimp_image_get_component_active
gimp_image_get_component_visible
gimp_image_get_effective_color_profile
gimp_image_get_exported_uri
gimp_image_get_filename
gimp_image_get_floating_sel

View file

@ -29,7 +29,8 @@
*
* Returns the image's color profile
*
* This procedure returns the image's color profile.
* This procedure returns the image's color profile, or NULL if the
* image has no color profile assigned.
*
* Returns: The image's color profile. The returned value
* must be freed with gimp_color_profile_close().
@ -94,3 +95,42 @@ gimp_image_set_color_profile (gint32 image_ID,
return success;
}
/**
* gimp_image_get_effective_color_profile:
* @image_ID: The image.
*
* Returns the color profile that is used for the image.
*
* This procedure returns the color profile that is actually used for
* this image, which is the profile returned by
* gimp_image_get_color_profile() if the image has a profile assigned,
* or the default RGB profile from preferences if no profile is
* assigned to the image. If there is no default RGB profile configured
* in preferences either, a generated default RGB profile is returned.
*
* Returns: The color profile. The returned value
* must be freed with gimp_color_profile_close().
*
* Since: 2.10
**/
GimpColorProfile
gimp_image_get_effective_color_profile (gint32 image_ID)
{
guint8 *data;
gint length;
data = _gimp_image_get_effective_color_profile (image_ID, &length);
if (data)
{
GimpColorProfile profile;
profile = gimp_color_profile_open_from_data (data, length, NULL);
g_free (data);
return profile;
}
return NULL;
}

View file

@ -30,10 +30,11 @@ G_BEGIN_DECLS
/* For information look into the C source or the html documentation */
GimpColorProfile gimp_image_get_color_profile (gint32 image_ID);
gboolean gimp_image_set_color_profile (gint32 image_ID,
GimpColorProfile profile);
GimpColorProfile gimp_image_get_color_profile (gint32 image_ID);
gboolean gimp_image_set_color_profile (gint32 image_ID,
GimpColorProfile profile);
GimpColorProfile gimp_image_get_effective_color_profile (gint32 image_ID);
G_END_DECLS

View file

@ -43,7 +43,8 @@
*
* Returns the image's color profile
*
* This procedure returns the image's color profile.
* This procedure returns the image's color profile, or NULL if the
* image has no color profile assigned.
*
* Returns: The image's serialized color profile. The returned value
* must be freed with g_free().
@ -87,7 +88,8 @@ _gimp_image_get_color_profile (gint32 image_ID,
*
* Sets the image's color profile
*
* This procedure sets the image's color profile.
* This procedure sets the image's color profile, or unsets it if NULL
* is passed as 'color_profile'.
*
* Returns: TRUE on success.
*
@ -115,3 +117,51 @@ _gimp_image_set_color_profile (gint32 image_ID,
return success;
}
/**
* _gimp_image_get_effective_color_profile:
* @image_ID: The image.
* @num_bytes: Number of bytes in the color_profile array.
*
* Returns the color profile that is used for the image
*
* This procedure returns the color profile that is actually used for
* this image, which is the profile returned by
* gimp_image_get_color_profile() if the image has a profile assigned,
* or the default RGB profile from preferences if no profile is
* assigned to the image. If there is no default RGB profile configured
* in preferences either, a generated default RGB profile is returned.
*
* Returns: The image's serialized color profile. The returned value
* must be freed with g_free().
*
* Since: 2.10
**/
guint8 *
_gimp_image_get_effective_color_profile (gint32 image_ID,
gint *num_bytes)
{
GimpParam *return_vals;
gint nreturn_vals;
guint8 *profile_data = NULL;
return_vals = gimp_run_procedure ("gimp-image-get-effective-color-profile",
&nreturn_vals,
GIMP_PDB_IMAGE, image_ID,
GIMP_PDB_END);
*num_bytes = 0;
if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
{
*num_bytes = return_vals[1].data.d_int32;
profile_data = g_new (guint8, *num_bytes);
memcpy (profile_data,
return_vals[2].data.d_int8array,
*num_bytes * sizeof (guint8));
}
gimp_destroy_params (return_vals, nreturn_vals);
return profile_data;
}

View file

@ -32,11 +32,13 @@ G_BEGIN_DECLS
/* For information look into the C source or the html documentation */
G_GNUC_INTERNAL guint8* _gimp_image_get_color_profile (gint32 image_ID,
gint *num_bytes);
G_GNUC_INTERNAL gboolean _gimp_image_set_color_profile (gint32 image_ID,
gint num_bytes,
const guint8 *color_profile);
G_GNUC_INTERNAL guint8* _gimp_image_get_color_profile (gint32 image_ID,
gint *num_bytes);
G_GNUC_INTERNAL gboolean _gimp_image_set_color_profile (gint32 image_ID,
gint num_bytes,
const guint8 *color_profile);
G_GNUC_INTERNAL guint8* _gimp_image_get_effective_color_profile (gint32 image_ID,
gint *num_bytes);
G_END_DECLS

View file

@ -20,7 +20,8 @@ sub image_get_color_profile {
$blurb = "Returns the image's color profile";
$help = <<'HELP';
This procedure returns the image's color profile.
This procedure returns the image's color profile, or NULL if the image
has no color profile assigned.
HELP
&mitch_pdb_misc('2015', '2.10');
@ -38,7 +39,6 @@ HELP
);
%invoke = (
headers => [ qw("core/gimpimage-profile.h") ],
code => <<'CODE'
{
GimpColorProfile profile;
@ -63,7 +63,8 @@ sub image_set_color_profile {
$blurb = "Sets the image's color profile";
$help = <<'HELP';
This procedure sets the image's color profile.
This procedure sets the image's color profile, or unsets it if NULL is
passed as 'color_profile'.
HELP
&mitch_pdb_misc('2015', '2.10');
@ -78,20 +79,70 @@ HELP
);
%invoke = (
headers => [ qw("core/gimpimage-profile.h") ],
code => <<'CODE'
{
if (color_profile)
{
GimpColorProfile profile;
profile = gimp_color_profile_open_from_data (color_profile, num_bytes,
error);
if (profile)
{
success = gimp_image_set_color_profile (image, profile, error);
gimp_color_profile_close (profile);
}
else
success = FALSE;
}
else
{
success = gimp_image_set_color_profile (image, NULL, error);
}
}
CODE
);
}
sub image_get_effective_color_profile {
$blurb = "Returns the color profile that is used for the image";
$help = <<'HELP';
This procedure returns the color profile that is actually used for
this image, which is the profile returned by
gimp_image_get_color_profile() if the image has a profile assigned, or
the default RGB profile from preferences if no profile is assigned to
the image. If there is no default RGB profile configured in
preferences either, a generated default RGB profile is returned.
HELP
&mitch_pdb_misc('2015', '2.10');
@inargs = (
{ name => 'image', type => 'image',
desc => 'The image' }
);
@outargs = (
{ name => 'profile_data', type => 'int8array', wrap => 1,
desc => "The image's serialized color profile. The returned value must be freed with g_free()",
array => { name => 'num_bytes',
desc => 'Number of bytes in the color_profile array' } }
);
%invoke = (
code => <<'CODE'
{
GimpColorProfile profile;
gsize length;
profile = gimp_color_profile_open_from_data (color_profile, num_bytes, error);
profile = gimp_color_managed_get_color_profile (GIMP_COLOR_MANAGED (image));
if (profile)
{
success = gimp_image_set_color_profile (image, profile, error);
gimp_color_profile_close (profile);
}
else
success = FALSE;
profile_data = gimp_color_profile_save_to_data (profile, &length, NULL);
num_bytes = length;
gimp_color_profile_close (profile);
}
CODE
);
@ -99,10 +150,12 @@ CODE
@headers = qw(<cairo.h>
"libgimpcolor/gimpcolor.h"
"core/gimpimage-profile.h"
"gimp-intl.h");
@procs = qw(image_get_color_profile
image_set_color_profile);
image_set_color_profile
image_get_effective_color_profile);
%exports = (app => [@procs], lib => [@procs]);