Commit 16749cd3 authored by Michael Natterer's avatar Michael Natterer 😴

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.
parent acb76a4d
......@@ -106,23 +106,72 @@ image_set_color_profile_invoker (GimpProcedure *procedure,
if (success)
{
GimpColorProfile profile;
if (color_profile)
{
GimpColorProfile profile;
profile = gimp_color_profile_open_from_data (color_profile, num_bytes, error);
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);
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);
}
......@@ -28,7 +28,7 @@
#include "internal-procs.h"
/* 757 procedures registered total */
/* 758 procedures registered total */
void
internal_procs_init (GimpPDB *pdb)
......
......@@ -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
......
......@@ -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;
}
......@@ -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
......
......@@ -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;
}
......@@ -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
......
......@@ -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'
{
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);
}
}
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_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);
}
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]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment