[gimp] pdb/libgimp: export gimp-image-new-with-precision
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] pdb/libgimp: export gimp-image-new-with-precision
- Date: Wed, 2 May 2012 16:45:59 +0000 (UTC)
commit 8918fd338b52fc4ad3d03cc2a5c24a6687be26f4
Author: Michael Natterer <mitch gimp org>
Date: Wed Apr 25 20:39:23 2012 +0200
pdb/libgimp: export gimp-image-new-with-precision
And switch on precision awareness of a plug-in in the core when
possible, instead of in the libgimp wrappers.
app/pdb/convert-cmds.c | 6 +++
app/pdb/drawable-cmds.c | 3 +
app/pdb/image-cmds.c | 97 +++++++++++++++++++++++++++++++++++++++++
app/pdb/internal-procs.c | 2 +-
libgimp/gimp.def | 1 +
libgimp/gimpdrawable.c | 2 -
libgimp/gimpimage_pdb.c | 45 +++++++++++++++++++
libgimp/gimpimage_pdb.h | 4 ++
tools/pdbgen/pdb/convert.pdb | 8 +++-
tools/pdbgen/pdb/drawable.pdb | 3 +
tools/pdbgen/pdb/image.pdb | 54 ++++++++++++++++++++++-
11 files changed, 219 insertions(+), 6 deletions(-)
---
diff --git a/app/pdb/convert-cmds.c b/app/pdb/convert-cmds.c
index a2f7c4c..579bcf5 100644
--- a/app/pdb/convert-cmds.c
+++ b/app/pdb/convert-cmds.c
@@ -23,11 +23,14 @@
#include "pdb-types.h"
+#include "core/gimp.h"
#include "core/gimpimage-convert.h"
#include "core/gimpimage.h"
#include "core/gimpitemstack.h"
#include "core/gimppalette.h"
#include "core/gimpparamspecs.h"
+#include "plug-in/gimpplugin.h"
+#include "plug-in/gimppluginmanager.h"
#include "gimppdb.h"
#include "gimppdberror.h"
@@ -233,6 +236,9 @@ image_convert_precision_invoker (GimpProcedure *procedure,
if (success)
{
+ if (gimp->plug_in_manager->current_plug_in)
+ gimp_plug_in_enable_precision (gimp->plug_in_manager->current_plug_in);
+
if (gimp_pdb_image_is_not_base_type (image, GIMP_INDEXED, error) &&
gimp_pdb_image_is_not_precision (image, precision, error))
{
diff --git a/app/pdb/drawable-cmds.c b/app/pdb/drawable-cmds.c
index cc047c6..8994e31 100644
--- a/app/pdb/drawable-cmds.c
+++ b/app/pdb/drawable-cmds.c
@@ -64,6 +64,9 @@ drawable_get_format_invoker (GimpProcedure *procedure,
if (success)
{
+ if (gimp->plug_in_manager->current_plug_in)
+ gimp_plug_in_enable_precision (gimp->plug_in_manager->current_plug_in);
+
format = g_strdup (babl_get_name (gimp_drawable_get_format (drawable)));
}
diff --git a/app/pdb/image-cmds.c b/app/pdb/image-cmds.c
index a5eb078..ce3bb25 100644
--- a/app/pdb/image-cmds.c
+++ b/app/pdb/image-cmds.c
@@ -53,6 +53,8 @@
#include "core/gimpselection.h"
#include "core/gimptempbuf.h"
#include "core/gimpunit.h"
+#include "plug-in/gimpplugin.h"
+#include "plug-in/gimppluginmanager.h"
#include "vectors/gimpvectors.h"
#include "gimppdb.h"
@@ -169,6 +171,52 @@ image_new_invoker (GimpProcedure *procedure,
}
static GValueArray *
+image_new_with_precision_invoker (GimpProcedure *procedure,
+ Gimp *gimp,
+ GimpContext *context,
+ GimpProgress *progress,
+ const GValueArray *args,
+ GError **error)
+{
+ gboolean success = TRUE;
+ GValueArray *return_vals;
+ gint32 width;
+ gint32 height;
+ gint32 type;
+ gint32 precision;
+ GimpImage *image = NULL;
+
+ width = g_value_get_int (&args->values[0]);
+ height = g_value_get_int (&args->values[1]);
+ type = g_value_get_enum (&args->values[2]);
+ precision = g_value_get_enum (&args->values[3]);
+
+ if (success)
+ {
+ if (gimp->plug_in_manager->current_plug_in)
+ gimp_plug_in_enable_precision (gimp->plug_in_manager->current_plug_in);
+
+ if (type != GIMP_INDEXED || precision == GIMP_PRECISION_U8)
+ {
+ image = gimp_create_image (gimp, width, height, type,
+ precision, FALSE);
+ if (! image)
+ success = FALSE;
+ }
+ else
+ success = FALSE;
+ }
+
+ return_vals = gimp_procedure_get_return_values (procedure, success,
+ error ? *error : NULL);
+
+ if (success)
+ gimp_value_set_image (&return_vals->values[1], image);
+
+ return return_vals;
+}
+
+static GValueArray *
image_duplicate_invoker (GimpProcedure *procedure,
Gimp *gimp,
GimpContext *context,
@@ -2884,6 +2932,55 @@ register_image_procs (GimpPDB *pdb)
g_object_unref (procedure);
/*
+ * gimp-image-new-with-precision
+ */
+ procedure = gimp_procedure_new (image_new_with_precision_invoker);
+ gimp_object_set_static_name (GIMP_OBJECT (procedure),
+ "gimp-image-new-with-precision");
+ gimp_procedure_set_static_strings (procedure,
+ "gimp-image-new-with-precision",
+ "Creates a new image with the specified width, height, type and precision.",
+ "Creates a new image, undisplayed with the specified extents, type and precision. Indexed images can only be created at GIMP_PRECISION_U8 precision. See 'gimp-image-new' for further details.",
+ "Michael Natterer <mitch gimp org>",
+ "Michael Natterer",
+ "2012",
+ NULL);
+ gimp_procedure_add_argument (procedure,
+ gimp_param_spec_int32 ("width",
+ "width",
+ "The width of the image",
+ 1, GIMP_MAX_IMAGE_SIZE, 1,
+ GIMP_PARAM_READWRITE));
+ gimp_procedure_add_argument (procedure,
+ gimp_param_spec_int32 ("height",
+ "height",
+ "The height of the image",
+ 1, GIMP_MAX_IMAGE_SIZE, 1,
+ GIMP_PARAM_READWRITE));
+ gimp_procedure_add_argument (procedure,
+ g_param_spec_enum ("type",
+ "type",
+ "The type of image",
+ GIMP_TYPE_IMAGE_BASE_TYPE,
+ GIMP_RGB,
+ GIMP_PARAM_READWRITE));
+ gimp_procedure_add_argument (procedure,
+ g_param_spec_enum ("precision",
+ "precision",
+ "The precision",
+ GIMP_TYPE_PRECISION,
+ GIMP_PRECISION_U8,
+ GIMP_PARAM_READWRITE));
+ gimp_procedure_add_return_value (procedure,
+ gimp_param_spec_image_id ("image",
+ "image",
+ "The ID of the newly created image",
+ pdb->gimp, FALSE,
+ GIMP_PARAM_READWRITE));
+ gimp_pdb_register_procedure (pdb, procedure);
+ g_object_unref (procedure);
+
+ /*
* gimp-image-duplicate
*/
procedure = gimp_procedure_new (image_duplicate_invoker);
diff --git a/app/pdb/internal-procs.c b/app/pdb/internal-procs.c
index e820dff..f829424 100644
--- a/app/pdb/internal-procs.c
+++ b/app/pdb/internal-procs.c
@@ -28,7 +28,7 @@
#include "internal-procs.h"
-/* 671 procedures registered total */
+/* 672 procedures registered total */
void
internal_procs_init (GimpPDB *pdb)
diff --git a/libgimp/gimp.def b/libgimp/gimp.def
index 6c5fd9e..30e2933 100644
--- a/libgimp/gimp.def
+++ b/libgimp/gimp.def
@@ -444,6 +444,7 @@ EXPORTS
gimp_image_merge_down
gimp_image_merge_visible_layers
gimp_image_new
+ gimp_image_new_with_precision
gimp_image_parasite_attach
gimp_image_parasite_detach
gimp_image_parasite_find
diff --git a/libgimp/gimpdrawable.c b/libgimp/gimpdrawable.c
index 9da4c24..18eeda2 100644
--- a/libgimp/gimpdrawable.c
+++ b/libgimp/gimpdrawable.c
@@ -744,8 +744,6 @@ gimp_drawable_get_format (gint32 drawable_ID)
if (format_str)
{
- gimp_plugin_enable_precision ();
-
if (gimp_drawable_is_indexed (drawable_ID))
{
gint32 image_ID = gimp_item_get_image (drawable_ID);
diff --git a/libgimp/gimpimage_pdb.c b/libgimp/gimpimage_pdb.c
index 6ee0c0f..ea7191e 100644
--- a/libgimp/gimpimage_pdb.c
+++ b/libgimp/gimpimage_pdb.c
@@ -152,6 +152,51 @@ gimp_image_new (gint width,
}
/**
+ * gimp_image_new_with_precision:
+ * @width: The width of the image.
+ * @height: The height of the image.
+ * @type: The type of image.
+ * @precision: The precision.
+ *
+ * Creates a new image with the specified width, height, type and
+ * precision.
+ *
+ * Creates a new image, undisplayed with the specified extents, type
+ * and precision. Indexed images can only be created at
+ * GIMP_PRECISION_U8 precision. See gimp_image_new() for further
+ * details.
+ *
+ * Returns: The ID of the newly created image.
+ *
+ * Since: GIMP 2.10
+ **/
+gint32
+gimp_image_new_with_precision (gint width,
+ gint height,
+ GimpImageBaseType type,
+ GimpPrecision precision)
+{
+ GimpParam *return_vals;
+ gint nreturn_vals;
+ gint32 image_ID = -1;
+
+ return_vals = gimp_run_procedure ("gimp-image-new-with-precision",
+ &nreturn_vals,
+ GIMP_PDB_INT32, width,
+ GIMP_PDB_INT32, height,
+ GIMP_PDB_INT32, type,
+ GIMP_PDB_INT32, precision,
+ GIMP_PDB_END);
+
+ if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
+ image_ID = return_vals[1].data.d_image;
+
+ gimp_destroy_params (return_vals, nreturn_vals);
+
+ return image_ID;
+}
+
+/**
* gimp_image_duplicate:
* @image_ID: The image.
*
diff --git a/libgimp/gimpimage_pdb.h b/libgimp/gimpimage_pdb.h
index 3f48a62..771e363 100644
--- a/libgimp/gimpimage_pdb.h
+++ b/libgimp/gimpimage_pdb.h
@@ -37,6 +37,10 @@ gint* gimp_image_list (gint
gint32 gimp_image_new (gint width,
gint height,
GimpImageBaseType type);
+gint32 gimp_image_new_with_precision (gint width,
+ gint height,
+ GimpImageBaseType type,
+ GimpPrecision precision);
gint32 gimp_image_duplicate (gint32 image_ID);
gboolean gimp_image_delete (gint32 image_ID);
GimpImageBaseType gimp_image_base_type (gint32 image_ID);
diff --git a/tools/pdbgen/pdb/convert.pdb b/tools/pdbgen/pdb/convert.pdb
index 419680e..30ba8ad 100644
--- a/tools/pdbgen/pdb/convert.pdb
+++ b/tools/pdbgen/pdb/convert.pdb
@@ -240,6 +240,9 @@ HELP
%invoke = (
code => <<'CODE'
{
+ if (gimp->plug_in_manager->current_plug_in)
+ gimp_plug_in_enable_precision (gimp->plug_in_manager->current_plug_in);
+
if (gimp_pdb_image_is_not_base_type (image, GIMP_INDEXED, error) &&
gimp_pdb_image_is_not_precision (image, precision, error))
{
@@ -254,10 +257,13 @@ CODE
);
}
- headers = qw("core/gimpimage.h"
+ headers = qw("core/gimp.h"
+ "core/gimpimage.h"
"core/gimpimage-convert.h"
"core/gimpitemstack.h"
"core/gimppalette.h"
+ "plug-in/gimpplugin.h"
+ "plug-in/gimppluginmanager.h"
"gimppdberror.h"
"gimppdb-utils.h"
"gimp-intl.h");
diff --git a/tools/pdbgen/pdb/drawable.pdb b/tools/pdbgen/pdb/drawable.pdb
index 8e098e5..6648a43 100644
--- a/tools/pdbgen/pdb/drawable.pdb
+++ b/tools/pdbgen/pdb/drawable.pdb
@@ -283,6 +283,9 @@ sub drawable_get_format {
%invoke = (
code => <<'CODE'
{
+ if (gimp->plug_in_manager->current_plug_in)
+ gimp_plug_in_enable_precision (gimp->plug_in_manager->current_plug_in);
+
format = g_strdup (babl_get_name (gimp_drawable_get_format (drawable)));
}
CODE
diff --git a/tools/pdbgen/pdb/image.pdb b/tools/pdbgen/pdb/image.pdb
index 84140bd..0f7ab4f 100644
--- a/tools/pdbgen/pdb/image.pdb
+++ b/tools/pdbgen/pdb/image.pdb
@@ -123,6 +123,53 @@ CODE
);
}
+sub image_new_with_precision {
+ $blurb = 'Creates a new image with the specified width, height, type and precision.';
+
+ $help = <<'HELP';
+Creates a new image, undisplayed with the specified extents, type
+and precision. Indexed images can only be created at GIMP_PRECISION_U8
+precision. See gimp_image_new() for further details.
+HELP
+
+ &mitch_pdb_misc('2012', '2.10');
+
+ @inargs = (
+ { name => 'width', type => '1 <= int32 <= GIMP_MAX_IMAGE_SIZE',
+ desc => 'The width of the image' },
+ { name => 'height', type => '1 <= int32 <= GIMP_MAX_IMAGE_SIZE',
+ desc => 'The height of the image' },
+ { name => 'type', type => 'enum GimpImageBaseType',
+ desc => 'The type of image' },
+ { name => 'precision', type => 'enum GimpPrecision',
+ desc => 'The precision' }
+ );
+
+ @outargs = (
+ { name => 'image', type => 'image',
+ desc => 'The ID of the newly created image' }
+ );
+
+ %invoke = (
+ code => <<'CODE'
+{
+ if (gimp->plug_in_manager->current_plug_in)
+ gimp_plug_in_enable_precision (gimp->plug_in_manager->current_plug_in);
+
+ if (type != GIMP_INDEXED || precision == GIMP_PRECISION_U8)
+ {
+ image = gimp_create_image (gimp, width, height, type,
+ precision, FALSE);
+ if (! image)
+ success = FALSE;
+ }
+ else
+ success = FALSE;
+}
+CODE
+ );
+}
+
sub image_duplicate {
$blurb = 'Duplicate the specified image';
@@ -2897,6 +2944,8 @@ CODE
"core/gimpprogress.h"
"core/gimptempbuf.h"
"core/gimpunit.h"
+ "plug-in/gimpplugin.h"
+ "plug-in/gimppluginmanager.h"
"gimppdbcontext.h"
"gimppdberror.h"
"gimppdb-utils.h"
@@ -2904,7 +2953,8 @@ CODE
@procs = qw(image_is_valid
image_list
- image_new image_duplicate image_delete
+ image_new image_new_with_precision
+ image_duplicate image_delete
image_base_type
image_width image_height
image_free_shadow
@@ -2961,7 +3011,7 @@ CODE
# image_add_layer_mask and image_remove_layer_mask.
# If adding or removing functions, make sure the range below is
# updated correctly!
-%exports = (app => [ procs], lib => [ procs[0 42,45..83]]);
+%exports = (app => [ procs], lib => [ procs[0 43,46..84]]);
$desc = 'Image';
$doc_title = 'gimpimage';
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]