diff --git a/app/pdb/drawable-cmds.c b/app/pdb/drawable-cmds.c index 861f3bcbdd..aacea52332 100644 --- a/app/pdb/drawable-cmds.c +++ b/app/pdb/drawable-cmds.c @@ -90,6 +90,36 @@ drawable_get_format_invoker (GimpProcedure *procedure, return return_vals; } +static GimpValueArray * +drawable_get_thumbnail_format_invoker (GimpProcedure *procedure, + Gimp *gimp, + GimpContext *context, + GimpProgress *progress, + const GimpValueArray *args, + GError **error) +{ + gboolean success = TRUE; + GimpValueArray *return_vals; + GimpDrawable *drawable; + gchar *format = NULL; + + drawable = gimp_value_get_drawable (gimp_value_array_index (args, 0), gimp); + + if (success) + { + format = g_strdup (babl_format_get_encoding (gimp_drawable_get_preview_format (drawable))); + + } + + return_vals = gimp_procedure_get_return_values (procedure, success, + error ? *error : NULL); + + if (success) + g_value_take_string (gimp_value_array_index (return_vals, 1), format); + + return return_vals; +} + static GimpValueArray * drawable_type_invoker (GimpProcedure *procedure, Gimp *gimp, @@ -994,6 +1024,37 @@ register_drawable_procs (GimpPDB *pdb) gimp_pdb_register_procedure (pdb, procedure); g_object_unref (procedure); + /* + * gimp-drawable-get-thumbnail-format + */ + procedure = gimp_procedure_new (drawable_get_thumbnail_format_invoker); + gimp_object_set_static_name (GIMP_OBJECT (procedure), + "gimp-drawable-get-thumbnail-format"); + gimp_procedure_set_static_strings (procedure, + "gimp-drawable-get-thumbnail-format", + "Returns the drawable's thumbnail Babl format", + "This procedure returns the drawable's thumbnail Babl format.\n" + "Thumbnails are always 8-bit images, see 'gimp-drawable-thumbnail' and 'gimp-drawable-sub-thmbnail'.", + "Michael Natterer ", + "Michael Natterer", + "2019", + NULL); + gimp_procedure_add_argument (procedure, + gimp_param_spec_drawable_id ("drawable", + "drawable", + "The drawable", + pdb->gimp, FALSE, + GIMP_PARAM_READWRITE)); + gimp_procedure_add_return_value (procedure, + gimp_param_spec_string ("format", + "format", + "The drawable's thumbnail Babl format", + FALSE, FALSE, FALSE, + NULL, + GIMP_PARAM_READWRITE)); + gimp_pdb_register_procedure (pdb, procedure); + g_object_unref (procedure); + /* * gimp-drawable-type */ diff --git a/app/pdb/internal-procs.c b/app/pdb/internal-procs.c index 756455f1cb..271e2f7741 100644 --- a/app/pdb/internal-procs.c +++ b/app/pdb/internal-procs.c @@ -28,7 +28,7 @@ #include "internal-procs.h" -/* 734 procedures registered total */ +/* 735 procedures registered total */ void internal_procs_init (GimpPDB *pdb) diff --git a/libgimp/gimp.def b/libgimp/gimp.def index 1282c91a90..bc83801eab 100644 --- a/libgimp/gimp.def +++ b/libgimp/gimp.def @@ -212,6 +212,7 @@ EXPORTS gimp_drawable_get_sub_thumbnail_data gimp_drawable_get_thumbnail gimp_drawable_get_thumbnail_data + gimp_drawable_get_thumbnail_format gimp_drawable_get_tile gimp_drawable_has_alpha gimp_drawable_height diff --git a/libgimp/gimpdrawable.c b/libgimp/gimpdrawable.c index 10758a6a92..8edcb97dd5 100644 --- a/libgimp/gimpdrawable.c +++ b/libgimp/gimpdrawable.c @@ -437,3 +437,24 @@ gimp_drawable_get_format (gint32 drawable_ID) return format; } +/** + * gimp_drawable_get_thumbnail_format: + * @drawable_ID: the ID of the #GimpDrawable to get the thumbnail format for. + * + * Returns the #Babl thumbnail format of the drawable. + * + * Return value: The #Babl thumbnail format. + * + * Since: 2.10.14 + */ +const Babl * +gimp_drawable_get_thumbnail_format (gint32 drawable_ID) +{ + const Babl *format = NULL; + gchar *format_str = _gimp_drawable_get_thumbnail_format (drawable_ID); + + if (format_str) + format = babl_format (format_str); + + return format; +} diff --git a/libgimp/gimpdrawable.h b/libgimp/gimpdrawable.h index 66bf24630b..41623e7627 100644 --- a/libgimp/gimpdrawable.h +++ b/libgimp/gimpdrawable.h @@ -46,6 +46,7 @@ GeglBuffer * gimp_drawable_get_buffer (gint32 drawable_ID) GeglBuffer * gimp_drawable_get_shadow_buffer (gint32 drawable_ID); const Babl * gimp_drawable_get_format (gint32 drawable_ID); +const Babl * gimp_drawable_get_thumbnail_format (gint32 drawable_ID); GIMP_DEPRECATED_FOR(gimp_drawable_get_buffer) GimpDrawable * gimp_drawable_get (gint32 drawable_ID); diff --git a/libgimp/gimpdrawable_pdb.c b/libgimp/gimpdrawable_pdb.c index 4ebba8f7e7..1a9fd17cc4 100644 --- a/libgimp/gimpdrawable_pdb.c +++ b/libgimp/gimpdrawable_pdb.c @@ -71,6 +71,40 @@ _gimp_drawable_get_format (gint32 drawable_ID) return format; } +/** + * _gimp_drawable_get_thumbnail_format: + * @drawable_ID: The drawable. + * + * Returns the drawable's thumbnail Babl format + * + * This procedure returns the drawable's thumbnail Babl format. + * Thumbnails are always 8-bit images, see gimp_drawable_thumbnail() + * and gimp_drawable_sub_thmbnail(). + * + * Returns: The drawable's thumbnail Babl format. + * + * Since: 2.10.14 + **/ +gchar * +_gimp_drawable_get_thumbnail_format (gint32 drawable_ID) +{ + GimpParam *return_vals; + gint nreturn_vals; + gchar *format = NULL; + + return_vals = gimp_run_procedure ("gimp-drawable-get-thumbnail-format", + &nreturn_vals, + GIMP_PDB_DRAWABLE, drawable_ID, + GIMP_PDB_END); + + if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS) + format = g_strdup (return_vals[1].data.d_string); + + gimp_destroy_params (return_vals, nreturn_vals); + + return format; +} + /** * gimp_drawable_type: * @drawable_ID: The drawable. diff --git a/libgimp/gimpdrawable_pdb.h b/libgimp/gimpdrawable_pdb.h index 0bb6880001..9e69457d03 100644 --- a/libgimp/gimpdrawable_pdb.h +++ b/libgimp/gimpdrawable_pdb.h @@ -32,76 +32,77 @@ G_BEGIN_DECLS /* For information look into the C source or the html documentation */ -G_GNUC_INTERNAL gchar* _gimp_drawable_get_format (gint32 drawable_ID); -GimpImageType gimp_drawable_type (gint32 drawable_ID); -GimpImageType gimp_drawable_type_with_alpha (gint32 drawable_ID); -gboolean gimp_drawable_has_alpha (gint32 drawable_ID); -gboolean gimp_drawable_is_rgb (gint32 drawable_ID); -gboolean gimp_drawable_is_gray (gint32 drawable_ID); -gboolean gimp_drawable_is_indexed (gint32 drawable_ID); -gint gimp_drawable_bpp (gint32 drawable_ID); -gint gimp_drawable_width (gint32 drawable_ID); -gint gimp_drawable_height (gint32 drawable_ID); -gboolean gimp_drawable_offsets (gint32 drawable_ID, - gint *offset_x, - gint *offset_y); -gboolean gimp_drawable_mask_bounds (gint32 drawable_ID, - gint *x1, - gint *y1, - gint *x2, - gint *y2); -gboolean gimp_drawable_mask_intersect (gint32 drawable_ID, - gint *x, - gint *y, - gint *width, - gint *height); -gboolean gimp_drawable_merge_shadow (gint32 drawable_ID, - gboolean undo); -gboolean gimp_drawable_free_shadow (gint32 drawable_ID); -gboolean gimp_drawable_update (gint32 drawable_ID, - gint x, - gint y, - gint width, - gint height); -guint8* gimp_drawable_get_pixel (gint32 drawable_ID, - gint x_coord, - gint y_coord, - gint *num_channels); -gboolean gimp_drawable_set_pixel (gint32 drawable_ID, - gint x_coord, - gint y_coord, - gint num_channels, - const guint8 *pixel); -gboolean gimp_drawable_fill (gint32 drawable_ID, - GimpFillType fill_type); -gboolean gimp_drawable_offset (gint32 drawable_ID, - gboolean wrap_around, - GimpOffsetType fill_type, - gint offset_x, - gint offset_y); -G_GNUC_INTERNAL gboolean _gimp_drawable_thumbnail (gint32 drawable_ID, - gint width, - gint height, - gint *actual_width, - gint *actual_height, - gint *bpp, - gint *thumbnail_data_count, - guint8 **thumbnail_data); -G_GNUC_INTERNAL gboolean _gimp_drawable_sub_thumbnail (gint32 drawable_ID, - gint src_x, - gint src_y, - gint src_width, - gint src_height, - gint dest_width, - gint dest_height, - gint *width, - gint *height, - gint *bpp, - gint *thumbnail_data_count, - guint8 **thumbnail_data); -gboolean gimp_drawable_foreground_extract (gint32 drawable_ID, - GimpForegroundExtractMode mode, - gint32 mask_ID); +G_GNUC_INTERNAL gchar* _gimp_drawable_get_format (gint32 drawable_ID); +G_GNUC_INTERNAL gchar* _gimp_drawable_get_thumbnail_format (gint32 drawable_ID); +GimpImageType gimp_drawable_type (gint32 drawable_ID); +GimpImageType gimp_drawable_type_with_alpha (gint32 drawable_ID); +gboolean gimp_drawable_has_alpha (gint32 drawable_ID); +gboolean gimp_drawable_is_rgb (gint32 drawable_ID); +gboolean gimp_drawable_is_gray (gint32 drawable_ID); +gboolean gimp_drawable_is_indexed (gint32 drawable_ID); +gint gimp_drawable_bpp (gint32 drawable_ID); +gint gimp_drawable_width (gint32 drawable_ID); +gint gimp_drawable_height (gint32 drawable_ID); +gboolean gimp_drawable_offsets (gint32 drawable_ID, + gint *offset_x, + gint *offset_y); +gboolean gimp_drawable_mask_bounds (gint32 drawable_ID, + gint *x1, + gint *y1, + gint *x2, + gint *y2); +gboolean gimp_drawable_mask_intersect (gint32 drawable_ID, + gint *x, + gint *y, + gint *width, + gint *height); +gboolean gimp_drawable_merge_shadow (gint32 drawable_ID, + gboolean undo); +gboolean gimp_drawable_free_shadow (gint32 drawable_ID); +gboolean gimp_drawable_update (gint32 drawable_ID, + gint x, + gint y, + gint width, + gint height); +guint8* gimp_drawable_get_pixel (gint32 drawable_ID, + gint x_coord, + gint y_coord, + gint *num_channels); +gboolean gimp_drawable_set_pixel (gint32 drawable_ID, + gint x_coord, + gint y_coord, + gint num_channels, + const guint8 *pixel); +gboolean gimp_drawable_fill (gint32 drawable_ID, + GimpFillType fill_type); +gboolean gimp_drawable_offset (gint32 drawable_ID, + gboolean wrap_around, + GimpOffsetType fill_type, + gint offset_x, + gint offset_y); +G_GNUC_INTERNAL gboolean _gimp_drawable_thumbnail (gint32 drawable_ID, + gint width, + gint height, + gint *actual_width, + gint *actual_height, + gint *bpp, + gint *thumbnail_data_count, + guint8 **thumbnail_data); +G_GNUC_INTERNAL gboolean _gimp_drawable_sub_thumbnail (gint32 drawable_ID, + gint src_x, + gint src_y, + gint src_width, + gint src_height, + gint dest_width, + gint dest_height, + gint *width, + gint *height, + gint *bpp, + gint *thumbnail_data_count, + guint8 **thumbnail_data); +gboolean gimp_drawable_foreground_extract (gint32 drawable_ID, + GimpForegroundExtractMode mode, + gint32 mask_ID); G_END_DECLS diff --git a/pdb/groups/drawable.pdb b/pdb/groups/drawable.pdb index a16d943c87..833e50dfb5 100644 --- a/pdb/groups/drawable.pdb +++ b/pdb/groups/drawable.pdb @@ -307,6 +307,38 @@ CODE ); } +sub drawable_get_thumbnail_format { + $blurb = "Returns the drawable's thumbnail Babl format"; + + $help = <<'HELP'; +This procedure returns the drawable's thumbnail Babl format. + +Thumbnails are always 8-bit images, see gimp_drawable_thumbnail() and +gimp_drawable_sub_thmbnail(). +HELP + + &mitch_pdb_misc('2019', '2.10.14'); + + @inargs = ( + { name => 'drawable', type => 'drawable', + desc => 'The drawable' } + ); + + @outargs = ( + { name => 'format', type => 'string', wrap => 1, + desc => "The drawable's thumbnail Babl format" } + ); + + %invoke = ( + code => <<'CODE' +{ + format = g_strdup (babl_format_get_encoding (gimp_drawable_get_preview_format (drawable))); + +} +CODE + ); +} + sub drawable_type { $blurb = "Returns the drawable's type."; $help = "This procedure returns the drawable's type."; @@ -994,6 +1026,7 @@ CODE "gimp-intl.h"); @procs = qw(drawable_get_format + drawable_get_thumbnail_format drawable_type drawable_type_with_alpha drawable_has_alpha