[gimp/gimp-2-10] pdb, libgimp, app: add gimp_drawable_get_thumbnail_format()



commit 44d8580f46ccf015000e729116461f18196d0129
Author: Michael Natterer <mitch gimp org>
Date:   Wed Jul 10 15:10:03 2019 +0200

    pdb, libgimp, app: add gimp_drawable_get_thumbnail_format()
    
    so plug-ins can allocate buffers and stuff before getting the actual
    thumbnail data.
    
    (cherry picked from commit fc89dfb09beed19620dc168d5c8855510841e23f)

 app/pdb/drawable-cmds.c    |  61 +++++++++++++++++++
 app/pdb/internal-procs.c   |   2 +-
 libgimp/gimp.def           |   1 +
 libgimp/gimpdrawable.c     |  21 +++++++
 libgimp/gimpdrawable.h     |   1 +
 libgimp/gimpdrawable_pdb.c |  34 +++++++++++
 libgimp/gimpdrawable_pdb.h | 145 +++++++++++++++++++++++----------------------
 pdb/groups/drawable.pdb    |  33 +++++++++++
 8 files changed, 225 insertions(+), 73 deletions(-)
---
diff --git a/app/pdb/drawable-cmds.c b/app/pdb/drawable-cmds.c
index 63ca658abc..9a25f3d267 100644
--- a/app/pdb/drawable-cmds.c
+++ b/app/pdb/drawable-cmds.c
@@ -86,6 +86,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,
@@ -1014,6 +1044,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 <mitch gimp org>",
+                                     "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 c17b0ccd43..569a2c2132 100644
--- a/app/pdb/internal-procs.c
+++ b/app/pdb/internal-procs.c
@@ -28,7 +28,7 @@
 #include "internal-procs.h"
 
 
-/* 842 procedures registered total */
+/* 843 procedures registered total */
 
 void
 internal_procs_init (GimpPDB *pdb)
diff --git a/libgimp/gimp.def b/libgimp/gimp.def
index a37171c1ca..4a0b694e68 100644
--- a/libgimp/gimp.def
+++ b/libgimp/gimp.def
@@ -240,6 +240,7 @@ EXPORTS
        gimp_drawable_get_tattoo
        gimp_drawable_get_thumbnail
        gimp_drawable_get_thumbnail_data
+       gimp_drawable_get_thumbnail_format
        gimp_drawable_get_tile
        gimp_drawable_get_tile2
        gimp_drawable_get_visible
diff --git a/libgimp/gimpdrawable.c b/libgimp/gimpdrawable.c
index d9ebf4ba41..5ea107926b 100644
--- a/libgimp/gimpdrawable.c
+++ b/libgimp/gimpdrawable.c
@@ -799,3 +799,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 9d6ae0401a..7d7aaec743 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 afbcef4b97..72da2b2d18 100644
--- a/libgimp/gimpdrawable_pdb.c
+++ b/libgimp/gimpdrawable_pdb.c
@@ -68,6 +68,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 f959c829d0..ce289b2229 100644
--- a/libgimp/gimpdrawable_pdb.h
+++ b/libgimp/gimpdrawable_pdb.h
@@ -32,79 +32,80 @@ 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);
+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);
 GIMP_DEPRECATED
-gboolean                 gimp_drawable_set_image          (gint32                      drawable_ID,
-                                                           gint32                      image_ID);
-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);
+gboolean                 gimp_drawable_set_image             (gint32                      drawable_ID,
+                                                              gint32                      image_ID);
+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 f5028953c2..b36c28cfc0 100644
--- a/pdb/groups/drawable.pdb
+++ b/pdb/groups/drawable.pdb
@@ -296,6 +296,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.";
@@ -1002,6 +1034,7 @@ CODE
               "gimp-intl.h");
 
 @procs = qw(drawable_get_format
+            drawable_get_thumbnail_format
             drawable_type
             drawable_type_with_alpha
             drawable_has_alpha


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]