diff --git a/ChangeLog b/ChangeLog index 9c9665a995..9add503e28 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-04-04 Sven Neumann + + * app/pdb/gimppdb-utils.[ch]: added utility functions to check the + image base type. + + * tools/pdbgen/pdb/convert.pdb: use it so that we get a proper + error set on failure. + + * app/pdb/convert_cmds.c: regenerated. + 2008-04-04 Sven Neumann * app/core/gimpimage-convert.[ch] diff --git a/app/pdb/convert_cmds.c b/app/pdb/convert_cmds.c index 8621e1dca4..d0325862c2 100644 --- a/app/pdb/convert_cmds.c +++ b/app/pdb/convert_cmds.c @@ -53,12 +53,16 @@ image_convert_rgb_invoker (GimpProcedure *procedure, if (success) { - if (gimp_image_base_type (image) != GIMP_RGB) - success = gimp_image_convert (image, GIMP_RGB, - 0, 0, FALSE, FALSE, 0, NULL, - NULL, error); + if (gimp_pdb_image_is_not_base_type (image, GIMP_RGB, error)) + { + success = gimp_image_convert (image, GIMP_RGB, + 0, 0, FALSE, FALSE, 0, NULL, + NULL, error); + } else - success = FALSE; + { + success = FALSE; + } } return gimp_procedure_get_return_values (procedure, success); @@ -79,12 +83,16 @@ image_convert_grayscale_invoker (GimpProcedure *procedure, if (success) { - if (gimp_image_base_type (image) != GIMP_GRAY) - success = gimp_image_convert (image, GIMP_GRAY, - 0, 0, FALSE, FALSE, 0, NULL, - NULL, error); + if (gimp_pdb_image_is_not_base_type (image, GIMP_GRAY, error)) + { + success = gimp_image_convert (image, GIMP_GRAY, + 0, 0, FALSE, FALSE, 0, NULL, + NULL, error); + } else - success = FALSE; + { + success = FALSE; + } } return gimp_procedure_get_return_values (procedure, success); @@ -117,9 +125,9 @@ image_convert_indexed_invoker (GimpProcedure *procedure, if (success) { - GimpPalette *palette = NULL; + GimpPalette *pal = NULL; - if (gimp_image_base_type (image) != GIMP_INDEXED) + if (gimp_pdb_image_is_not_base_type (image, GIMP_INDEXED, error)) { switch (palette_type) { @@ -129,12 +137,12 @@ image_convert_indexed_invoker (GimpProcedure *procedure, break; case GIMP_CUSTOM_PALETTE: - palette = gimp_pdb_get_palette (gimp, palette, FALSE, error); - if (! palette) + pal = gimp_pdb_get_palette (gimp, palette, FALSE, error); + if (! pal) { success = FALSE; } - else if (palette->n_colors > MAXNUMCOLORS) + else if (pal->n_colors > MAXNUMCOLORS) { g_set_error (error, GIMP_PDB_ERROR, GIMP_PDB_INVALID_ARGUMENT, _("Cannot convert to a palette " @@ -156,7 +164,7 @@ image_convert_indexed_invoker (GimpProcedure *procedure, success = gimp_image_convert (image, GIMP_INDEXED, num_cols, dither_type, alpha_dither, remove_unused, - palette_type, palette, + palette_type, pal, NULL, error); } diff --git a/app/pdb/gimppdb-utils.c b/app/pdb/gimppdb-utils.c index 95834ea24c..d3da18e63e 100644 --- a/app/pdb/gimppdb-utils.c +++ b/app/pdb/gimppdb-utils.c @@ -29,6 +29,7 @@ #include "core/gimpcontainer.h" #include "core/gimpdatafactory.h" #include "core/gimpdrawable.h" +#include "core/gimpimage.h" #include "core/gimpitem.h" #include "text/gimptextlayer.h" @@ -333,6 +334,66 @@ gimp_pdb_layer_is_text_layer (GimpLayer *layer, return gimp_pdb_item_is_attached (GIMP_ITEM (layer), error); } +static const gchar * +gimp_pdb_enum_value_get_nick (GType enum_type, + gint value) +{ + GEnumClass *enum_class; + GEnumValue *enum_value; + const gchar *nick; + + enum_class = g_type_class_ref (enum_type); + enum_value = g_enum_get_value (enum_class, value); + + nick = enum_value->value_nick; + + g_type_class_unref (enum_class); + + return nick; +} + +gboolean +gimp_pdb_image_is_base_type (GimpImage *image, + GimpImageBaseType type, + GError **error) +{ + g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + if (gimp_image_base_type (image) == type) + return TRUE; + + g_set_error (error, GIMP_PDB_ERROR, GIMP_PDB_INVALID_ARGUMENT, + _("Image '%s' (%d) is of type %s, " + "but an image of type %s is expected"), + gimp_object_get_name (GIMP_OBJECT (image)), + gimp_image_get_ID (image), + gimp_pdb_enum_value_get_nick (GIMP_TYPE_IMAGE_BASE_TYPE, + gimp_image_base_type (image)), + gimp_pdb_enum_value_get_nick (GIMP_TYPE_IMAGE_BASE_TYPE, type)); + + return FALSE; +} + +gboolean +gimp_pdb_image_is_not_base_type (GimpImage *image, + GimpImageBaseType type, + GError **error) +{ + g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + if (gimp_image_base_type (image) != type) + return TRUE; + + g_set_error (error, GIMP_PDB_ERROR, GIMP_PDB_INVALID_ARGUMENT, + _("Image '%s' (%d) is already of type %s"), + gimp_object_get_name (GIMP_OBJECT (image)), + gimp_image_get_ID (image), + gimp_pdb_enum_value_get_nick (GIMP_TYPE_IMAGE_BASE_TYPE, type)); + + return FALSE; +} GimpStroke * gimp_pdb_get_vectors_stroke (GimpVectors *vectors, diff --git a/app/pdb/gimppdb-utils.h b/app/pdb/gimppdb-utils.h index 5b0b7e1fd4..31c9471eba 100644 --- a/app/pdb/gimppdb-utils.h +++ b/app/pdb/gimppdb-utils.h @@ -20,43 +20,49 @@ #define __GIMP_PDB_UTILS_H__ -GimpBrush * gimp_pdb_get_brush (Gimp *gimp, - const gchar *name, - gboolean writable, - GError **error); -GimpBrush * gimp_pdb_get_generated_brush (Gimp *gimp, - const gchar *name, - gboolean writable, - GError **error); -GimpPattern * gimp_pdb_get_pattern (Gimp *gimp, - const gchar *name, - GError **error); -GimpGradient * gimp_pdb_get_gradient (Gimp *gimp, - const gchar *name, - gboolean writable, - GError **error); -GimpPalette * gimp_pdb_get_palette (Gimp *gimp, - const gchar *name, - gboolean writable, - GError **error); -GimpFont * gimp_pdb_get_font (Gimp *gimp, - const gchar *name, - GError **error); -GimpBuffer * gimp_pdb_get_buffer (Gimp *gimp, - const gchar *name, - GError **error); -GimpPaintInfo * gimp_pdb_get_paint_info (Gimp *gimp, - const gchar *name, - GError **error); +GimpBrush * gimp_pdb_get_brush (Gimp *gimp, + const gchar *name, + gboolean writable, + GError **error); +GimpBrush * gimp_pdb_get_generated_brush (Gimp *gimp, + const gchar *name, + gboolean writable, + GError **error); +GimpPattern * gimp_pdb_get_pattern (Gimp *gimp, + const gchar *name, + GError **error); +GimpGradient * gimp_pdb_get_gradient (Gimp *gimp, + const gchar *name, + gboolean writable, + GError **error); +GimpPalette * gimp_pdb_get_palette (Gimp *gimp, + const gchar *name, + gboolean writable, + GError **error); +GimpFont * gimp_pdb_get_font (Gimp *gimp, + const gchar *name, + GError **error); +GimpBuffer * gimp_pdb_get_buffer (Gimp *gimp, + const gchar *name, + GError **error); +GimpPaintInfo * gimp_pdb_get_paint_info (Gimp *gimp, + const gchar *name, + GError **error); -gboolean gimp_pdb_item_is_attached (GimpItem *item, - GError **error); -gboolean gimp_pdb_layer_is_text_layer (GimpLayer *layer, - GError **error); +gboolean gimp_pdb_item_is_attached (GimpItem *item, + GError **error); +gboolean gimp_pdb_layer_is_text_layer (GimpLayer *layer, + GError **error); +gboolean gimp_pdb_image_is_base_type (GimpImage *image, + GimpImageBaseType type, + GError **error); +gboolean gimp_pdb_image_is_not_base_type (GimpImage *image, + GimpImageBaseType type, + GError **error); -GimpStroke * gimp_pdb_get_vectors_stroke (GimpVectors *vectors, - gint stroke_ID, - GError **error); +GimpStroke * gimp_pdb_get_vectors_stroke (GimpVectors *vectors, + gint stroke_ID, + GError **error); #endif /* __GIMP_PDB_UTILS_H__ */ diff --git a/tools/pdbgen/pdb/convert.pdb b/tools/pdbgen/pdb/convert.pdb index 68c872e906..46b247e764 100644 --- a/tools/pdbgen/pdb/convert.pdb +++ b/tools/pdbgen/pdb/convert.pdb @@ -36,12 +36,16 @@ HELP %invoke = ( code => <<'CODE' { - if (gimp_image_base_type (image) != GIMP_RGB) - success = gimp_image_convert (image, GIMP_RGB, - 0, 0, FALSE, FALSE, 0, NULL, - NULL, error); + if (gimp_pdb_image_is_not_base_type (image, GIMP_RGB, error)) + { + success = gimp_image_convert (image, GIMP_RGB, + 0, 0, FALSE, FALSE, 0, NULL, + NULL, error); + } else - success = FALSE; + { + success = FALSE; + } } CODE ); @@ -66,12 +70,16 @@ HELP %invoke = ( code => <<'CODE' { - if (gimp_image_base_type (image) != GIMP_GRAY) - success = gimp_image_convert (image, GIMP_GRAY, - 0, 0, FALSE, FALSE, 0, NULL, - NULL, error); + if (gimp_pdb_image_is_not_base_type (image, GIMP_GRAY, error)) + { + success = gimp_image_convert (image, GIMP_GRAY, + 0, 0, FALSE, FALSE, 0, NULL, + NULL, error); + } else - success = FALSE; + { + success = FALSE; + } } CODE ); @@ -121,9 +129,9 @@ HELP %invoke = ( code => <<'CODE' { - GimpPalette *palette = NULL; + GimpPalette *pal = NULL; - if (gimp_image_base_type (image) != GIMP_INDEXED) + if (gimp_pdb_image_is_not_base_type (image, GIMP_INDEXED, error)) { switch (palette_type) { @@ -133,12 +141,12 @@ HELP break; case GIMP_CUSTOM_PALETTE: - palette = gimp_pdb_get_palette (gimp, palette, FALSE, error); - if (! palette) + pal = gimp_pdb_get_palette (gimp, palette, FALSE, error); + if (! pal) { success = FALSE; } - else if (palette->n_colors > MAXNUMCOLORS) + else if (pal->n_colors > MAXNUMCOLORS) { g_set_error (error, GIMP_PDB_ERROR, GIMP_PDB_INVALID_ARGUMENT, _("Cannot convert to a palette " @@ -160,7 +168,7 @@ HELP success = gimp_image_convert (image, GIMP_INDEXED, num_cols, dither_type, alpha_dither, remove_unused, - palette_type, palette, + palette_type, pal, NULL, error); } CODE