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. <lauranger@xxxxxxx>", "Laurent G. <lauranger@xxxxxxx>", "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@xxxxxxxxxxxxxxxxxxxxxx https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer