Kevin Cozens a écrit :
> Laurent G. wrote:
>> I have been fighting the evening long, trying to give data through such
>> an array.
> [snip]
>> I followed the "trick" of inserting an int32 before the array in args,
>> but I keep getting my plugin to explode gimp on my calling to my simple
>> procedure, at least while calling from python console. I can not figure
>> out where I made the first mistake. So if I could compare my code with a
>> working one, I could detect my error(s).
> 
> It would be better if you could post your script somewhere so it can be
> looked at. It should not be possible for a script or plug-in to "explode
> GIMP". If your script is able to do that, having the script available
> for review will allow the problem to be fixed so that other scripts
> won't be able to break GIMP.
> 
> If you are passing an array to GIMP the argument right before you pass
> the array is used to tell GIMP the number of items in the array. It is
> assumed that the array contains at least that number of items in it. If
> you are telling GIMP that the array has 10 items in it (for example) but
> you have not put at least 10 items in to the array before passing it to
> GIMP you are going to run in to problems.
> 


Hi
I don't know why it blows, but
1) Monkey-trying, I got it to work
2) I got the minimum meaningful difference between success and failure :

I used the plugin template.
So here we are:

static void
query (void)
{
        gchar *help_path;
        gchar *help_uri;

        static GimpParamDef cc_in_args[] =
        {
                { GIMP_PDB_INT32,    "run_mode",   "Interactive, 
non-interactive"    },
                { GIMP_PDB_IMAGE,    "image",      "Input image"                
     },
                { GIMP_PDB_DRAWABLE, "drawable",   "Input drawable"             
     },
        };
        static GimpParamDef cc_out_args[] =
        {
                { GIMP_PDB_STATUS,    "status","Status" },
                { GIMP_PDB_INT32,     "nb_used_colors","Number of colors with 
at least
one pixel" },
                //{ GIMP_PDB_INT32,     "next_array_size","Number of entries in 
next
(256)" },
                { GIMP_PDB_INT32ARRAY,"n_pix_by_cmap_entries","Number of pixels 
by
colormap entry"},
        };

        gimp_plugin_domain_register (PLUGIN_NAME, LOCALEDIR);

        help_path = g_build_filename (DATADIR, "help", NULL);
        help_uri = g_filename_to_uri (help_path, NULL, NULL);
        g_free (help_path);

        gimp_plugin_help_register ("http://gna.org/boundary_shrinker/help";,
                                                           help_uri);

        gimp_install_procedure (ALIEN_PROCEDURE_NAME,
                                                        "Counts number of pixel 
for each colormap entries",
                                                        "No help yet",
                                                        "Laurent G. <[EMAIL 
PROTECTED]>",
                                                        "Laurent G. <[EMAIL 
PROTECTED]>",
                                                        "2007-2007",
                                                        N_("Indexed Colors 
Usage"),
                                                        "INDEXED",
                                                        GIMP_PLUGIN,
                                                        G_N_ELEMENTS 
(cc_in_args), G_N_ELEMENTS (cc_out_args),
                                                        cc_in_args, 
cc_out_args);
}

static void run (const gchar      *name,
                                 gint              n_params,
                                 const GimpParam  *param,
                                 gint             *nreturn_vals,
                                 GimpParam       **return_vals)
{
        static GimpParam   values[4];
        GimpDrawable      *drawable;
        gint32             image_ID;
        GimpRunMode        run_mode;
        GimpPDBStatusType  status = GIMP_PDB_SUCCESS;

        *return_vals  = values;

        /*  Initialize i18n support  */
        bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
#ifdef HAVE_BIND_TEXTDOMAIN_CODESET
        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
#endif
        textdomain (GETTEXT_PACKAGE);

        run_mode = param[0].data.d_int32;
        image_ID = param[1].data.d_int32;
        drawable = gimp_drawable_get(param[2].data.d_drawable);

        if (strcmp (name, ALIEN_PROCEDURE_NAME) == 0)
        {
                static gint32 colors_usage[256];
                //gint32 *colors_usage = g_new(gint32, 256);
                *nreturn_vals = 4;
                values[1].type = GIMP_PDB_INT32;
                values[2].type = GIMP_PDB_INT32;
                values[3].type = GIMP_PDB_INT32ARRAY;

                values[2].data.d_int32 = 256L;
                values[3].data.d_int32array = colors_usage;
                gint32 nb_used = 0;

                count_pixels(image_ID, drawable, &nb_used, colors_usage);

                values[1].data.d_int32 = nb_used;
        }
        else
        {
                status = GIMP_PDB_CALLING_ERROR;
        }

        values[0].type = GIMP_PDB_STATUS;
        values[0].data.d_status = status;
        printf("status:%d\n", values[0].data.d_status);
}

/* python code to call it
image = gimp.image_list()[0]
drawable = pdb.gimp_image_get_active_drawable(image)
nb_used_colors, next_array_size, n_pix_by_cmap_entries =
pdb.n_pixels_by_cmap_entries(image, drawable)
nb_used_colors, next_array_size, n_pix_by_cmap_entries
*/

To have it work, I had to give length of the array just before the
array, but what I missed (on don't blame me  ;-)  ) is that one has to do
this addition in the run part, but not in the query part. The key
difference between success and blow is the c++-style commentary stating
"next_array_size" in  cc_out_args.

Hope this helps. Regards

Laurent G.

_______________________________________________
Gimp-developer mailing list
Gimp-developer@lists.XCF.Berkeley.EDU
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer

Reply via email to