1
/* The GIMP -- an image manipulation program
2
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
#include <string.h> /* memcpy, strcpy, strlen */
25
#include "libgimp/gimp.h"
27
#include "siod/siod.h"
29
#include "script-fu-types.h"
31
#include "script-fu-console.h"
32
#include "script-fu-interface.h"
33
#include "script-fu-scripts.h"
34
#include "script-fu-server.h"
36
#include "siod-wrapper.h"
38
static int siod_console_mode;
40
/* global variables declared by the scheme interpreter */
41
extern FILE * siod_output;
42
extern int siod_verbose_level;
43
extern gchar siod_err_msg[];
44
extern void * siod_output_routine;
45
extern LISP repl_return_val;
48
/* defined in regex.c. not exported by regex.h */
49
extern void init_regex (void);
51
/* defined in siodp.h but this file cannot be imported... */
52
extern long nlength (LISP obj);
53
extern LISP leval_define (LISP args, LISP env);
56
/* wrapper functions */
58
siod_get_output_file (void)
64
siod_set_output_file (FILE *file)
70
siod_set_console_mode (int flag)
72
siod_console_mode = flag;
76
siod_get_verbose_level (void)
78
return siod_verbose_level;
83
siod_set_verbose_level (gint verbose_level)
85
siod_verbose_level = verbose_level;
89
siod_print_welcome (void)
95
siod_interpret_string (const gchar *expr)
97
return repl_c_string ((char *)expr, 0, 0, 1);
101
siod_get_error_msg (void)
107
siod_get_success_msg (void)
109
if (TYPEP (repl_return_val, tc_string))
110
return get_c_string (repl_return_val);
116
siod_output_string (FILE *fp,
123
va_start (args, format);
124
buf = g_strdup_vprintf (format, args);
127
if (siod_console_mode && fp == stdout)
129
script_fu_output_to_console (buf);
141
static void init_constants (void);
142
static void init_procedures (void);
144
static gboolean register_scripts = FALSE;
147
siod_init (gboolean local_register_scripts)
160
register_scripts = local_register_scripts;
161
siod_output_routine = siod_output_string;
163
/* init the interpreter */
164
process_cla (G_N_ELEMENTS (siod_argv), siod_argv, 1);
170
/* register in the interpreter the gimp functions and types. */
176
static void convert_string (gchar *str);
177
static gint sputs_fcn (gchar *st,
179
static LISP lprin1s (LISP exp,
181
static LISP marshall_proc_db_call (LISP a);
182
static LISP script_fu_register_call (LISP a);
183
static LISP script_fu_menu_register_call (LISP a);
184
static LISP script_fu_quit_call (LISP a);
188
* Below can be found the functions responsible for registering the
189
* gimp functions and types against the scheme interpreter.
194
init_procedures (void)
202
gchar *proc_copyright;
204
GimpPDBProcType proc_type;
207
GimpParamDef *params;
208
GimpParamDef *return_vals;
212
/* register the database execution procedure */
213
init_lsubr ("gimp-proc-db-call", marshall_proc_db_call);
214
init_lsubr ("script-fu-register", script_fu_register_call);
215
init_lsubr ("script-fu-menu-register", script_fu_menu_register_call);
216
init_lsubr ("script-fu-quit", script_fu_quit_call);
218
gimp_procedural_db_query (".*", ".*", ".*", ".*", ".*", ".*", ".*",
219
&num_procs, &proc_list);
221
/* Register each procedure as a scheme func */
222
for (i = 0; i < num_procs; i++)
224
proc_name = g_strdup (proc_list[i]);
226
/* lookup the procedure */
227
if (gimp_procedural_db_proc_info (proc_name,
234
&nparams, &nreturn_vals,
235
¶ms, &return_vals))
241
/* convert the names to scheme-like naming conventions */
242
convert_string (proc_name);
244
/* create a new scheme func that calls gimp-proc-db-call */
245
for (j = 0; j < nparams; j++)
247
arg_name = g_strdup (params[j].name);
248
convert_string (arg_name);
249
args = cons (cintern (arg_name), args);
250
code = cons (cintern (arg_name), code);
253
/* reverse the list */
254
args = nreverse (args);
255
code = nreverse (code);
257
/* set the scheme-based procedure name */
258
args = cons (cintern (proc_name), args);
260
/* set the acture pdb procedure name */
261
code = cons (cons (cintern ("quote"),
262
cons (cintern (proc_list[i]), NIL)),
264
code = cons (cintern ("gimp-proc-db-call"), code);
266
leval_define (cons (args, cons (code, NIL)), NIL);
268
/* free the queried information */
271
g_free (proc_author);
272
g_free (proc_copyright);
274
gimp_destroy_paramdefs (params, nparams);
275
gimp_destroy_paramdefs (return_vals, nreturn_vals);
283
init_constants (void)
285
const gchar **enum_type_names;
286
gint n_enum_type_names;
290
setvar (cintern ("gimp-directory"),
291
strcons (-1, (gchar *) gimp_directory ()), NIL);
293
setvar (cintern ("gimp-data-directory"),
294
strcons (-1, (gchar *) gimp_data_directory ()), NIL);
296
setvar (cintern ("gimp-plug-in-directory"),
297
strcons (-1, (gchar *) gimp_plug_in_directory ()), NIL);
299
setvar (cintern ("gimp-locale-directory"),
300
strcons (-1, (gchar *) gimp_locale_directory ()), NIL);
302
setvar (cintern ("gimp-sysconf-directory"),
303
strcons (-1, (gchar *) gimp_sysconf_directory ()), NIL);
305
enum_type_names = gimp_enums_get_type_names (&n_enum_type_names);
307
for (i = 0; i < n_enum_type_names; i++)
309
const gchar *enum_name = enum_type_names[i];
310
GType enum_type = g_type_from_name (enum_name);
311
GEnumClass *enum_class = g_type_class_ref (enum_type);
314
for (value = enum_class->values; value->value_name; value++)
316
if (! strncmp ("GIMP_", value->value_name, 5))
320
scheme_name = g_strdup (value->value_name + 5);
321
convert_string (scheme_name);
323
setvar (rintern (scheme_name), flocons (value->value), NIL);
325
g_free (scheme_name);
329
g_type_class_unref (enum_class);
332
for (unit = GIMP_UNIT_PIXEL;
333
unit < gimp_unit_get_number_of_built_in_units ();
339
tmp = g_ascii_strup (gimp_unit_get_singular (unit), -1);
340
scheme_name = g_strconcat ("UNIT-", tmp, NULL);
343
setvar (rintern (scheme_name), flocons (unit), NIL);
345
g_free (scheme_name);
348
/* These are for backwards compatibility; they should be removed sometime */
349
setvar (cintern ("gimp-dir"),
350
strcons (-1, (gchar *) gimp_directory ()), NIL);
352
setvar (cintern ("gimp-data-dir"),
353
strcons (-1, (gchar *) gimp_data_directory ()), NIL);
355
setvar (cintern ("gimp-plugin-dir"),
356
strcons (-1, (gchar *) gimp_plug_in_directory ()), NIL);
358
setvar (cintern ("NORMAL"), flocons (GIMP_NORMAL_MODE), NIL);
359
setvar (cintern ("DISSOLVE"), flocons (GIMP_DISSOLVE_MODE), NIL);
360
setvar (cintern ("BEHIND"), flocons (GIMP_BEHIND_MODE), NIL);
361
setvar (cintern ("MULTIPLY"), flocons (GIMP_MULTIPLY_MODE), NIL);
362
setvar (cintern ("SCREEN"), flocons (GIMP_SCREEN_MODE), NIL);
363
setvar (cintern ("OVERLAY"), flocons (GIMP_OVERLAY_MODE), NIL);
364
setvar (cintern ("DIFFERENCE"), flocons (GIMP_DIFFERENCE_MODE), NIL);
365
setvar (cintern ("ADDITION"), flocons (GIMP_ADDITION_MODE), NIL);
366
setvar (cintern ("SUBTRACT"), flocons (GIMP_SUBTRACT_MODE), NIL);
367
setvar (cintern ("DARKEN-ONLY"), flocons (GIMP_DARKEN_ONLY_MODE), NIL);
368
setvar (cintern ("LIGHTEN-ONLY"), flocons (GIMP_LIGHTEN_ONLY_MODE), NIL);
369
setvar (cintern ("HUE"), flocons (GIMP_HUE_MODE), NIL);
370
setvar (cintern ("SATURATION"), flocons (GIMP_SATURATION_MODE), NIL);
371
setvar (cintern ("COLOR"), flocons (GIMP_COLOR_MODE), NIL);
372
setvar (cintern ("VALUE"), flocons (GIMP_VALUE_MODE), NIL);
373
setvar (cintern ("DIVIDE"), flocons (GIMP_DIVIDE_MODE), NIL);
375
setvar (cintern ("BLUR"), flocons (GIMP_BLUR_CONVOLVE), NIL);
376
setvar (cintern ("SHARPEN"), flocons (GIMP_SHARPEN_CONVOLVE), NIL);
378
setvar (cintern ("WHITE-MASK"), flocons (GIMP_ADD_WHITE_MASK), NIL);
379
setvar (cintern ("BLACK-MASK"), flocons (GIMP_ADD_BLACK_MASK), NIL);
380
setvar (cintern ("ALPHA-MASK"), flocons (GIMP_ADD_ALPHA_MASK), NIL);
382
setvar (cintern ("ADD"), flocons (GIMP_CHANNEL_OP_ADD), NIL);
383
setvar (cintern ("SUB"), flocons (GIMP_CHANNEL_OP_SUBTRACT), NIL);
384
setvar (cintern ("REPLACE"), flocons (GIMP_CHANNEL_OP_REPLACE), NIL);
385
setvar (cintern ("INTERSECT"), flocons (GIMP_CHANNEL_OP_INTERSECT), NIL);
387
setvar (cintern ("FG-BG-RGB"), flocons (GIMP_FG_BG_RGB_MODE), NIL);
388
setvar (cintern ("FG-BG-HSV"), flocons (GIMP_FG_BG_HSV_MODE), NIL);
389
setvar (cintern ("FG-TRANS"), flocons (GIMP_FG_TRANSPARENT_MODE), NIL);
390
setvar (cintern ("CUSTOM"), flocons (GIMP_CUSTOM_MODE), NIL);
392
setvar (cintern ("FG-IMAGE-FILL"), flocons (GIMP_FOREGROUND_FILL), NIL);
393
setvar (cintern ("BG-IMAGE-FILL"), flocons (GIMP_BACKGROUND_FILL), NIL);
394
setvar (cintern ("WHITE-IMAGE-FILL"), flocons (GIMP_WHITE_FILL), NIL);
395
setvar (cintern ("TRANS-IMAGE-FILL"), flocons (GIMP_TRANSPARENT_FILL), NIL);
397
setvar (cintern ("APPLY"), flocons (GIMP_MASK_APPLY), NIL);
398
setvar (cintern ("DISCARD"), flocons (GIMP_MASK_DISCARD), NIL);
400
setvar (cintern ("HARD"), flocons (GIMP_BRUSH_HARD), NIL);
401
setvar (cintern ("SOFT"), flocons (GIMP_BRUSH_SOFT), NIL);
403
setvar (cintern ("CONTINUOUS"), flocons (GIMP_PAINT_CONSTANT), NIL);
404
setvar (cintern ("INCREMENTAL"), flocons (GIMP_PAINT_INCREMENTAL), NIL);
406
setvar (cintern ("HORIZONTAL"), flocons (GIMP_ORIENTATION_HORIZONTAL), NIL);
407
setvar (cintern ("VERTICAL"), flocons (GIMP_ORIENTATION_VERTICAL), NIL);
408
setvar (cintern ("UNKNOWN"), flocons (GIMP_ORIENTATION_UNKNOWN), NIL);
410
setvar (cintern ("LINEAR"), flocons (GIMP_GRADIENT_LINEAR), NIL);
411
setvar (cintern ("BILINEAR"), flocons (GIMP_GRADIENT_BILINEAR), NIL);
412
setvar (cintern ("RADIAL"), flocons (GIMP_GRADIENT_RADIAL), NIL);
413
setvar (cintern ("SQUARE"), flocons (GIMP_GRADIENT_SQUARE), NIL);
414
setvar (cintern ("CONICAL-SYMMETRIC"), flocons (GIMP_GRADIENT_CONICAL_SYMMETRIC), NIL);
415
setvar (cintern ("CONICAL-ASYMMETRIC"), flocons (GIMP_GRADIENT_CONICAL_ASYMMETRIC), NIL);
416
setvar (cintern ("SHAPEBURST-ANGULAR"), flocons (GIMP_GRADIENT_SHAPEBURST_ANGULAR), NIL);
417
setvar (cintern ("SHAPEBURST-SPHERICAL"), flocons (GIMP_GRADIENT_SHAPEBURST_SPHERICAL), NIL);
418
setvar (cintern ("SHAPEBURST-DIMPLED"), flocons (GIMP_GRADIENT_SHAPEBURST_DIMPLED), NIL);
419
setvar (cintern ("SPIRAL-CLOCKWISE"), flocons (GIMP_GRADIENT_SPIRAL_CLOCKWISE), NIL);
420
setvar (cintern ("SPIRAL-ANTICLOCKWISE"), flocons (GIMP_GRADIENT_SPIRAL_ANTICLOCKWISE), NIL);
422
setvar (cintern ("VALUE-LUT"), flocons (GIMP_HISTOGRAM_VALUE), NIL);
423
setvar (cintern ("RED-LUT"), flocons (GIMP_HISTOGRAM_RED), NIL);
424
setvar (cintern ("GREEN-LUT"), flocons (GIMP_HISTOGRAM_GREEN), NIL);
425
setvar (cintern ("BLUE-LUT"), flocons (GIMP_HISTOGRAM_BLUE), NIL);
426
setvar (cintern ("ALPHA-LUT"), flocons (GIMP_HISTOGRAM_ALPHA), NIL);
428
/* Useful misc stuff */
429
setvar (cintern ("TRUE"), flocons (TRUE), NIL);
430
setvar (cintern ("FALSE"), flocons (FALSE), NIL);
432
/* Script-fu types */
433
setvar (cintern ("SF-IMAGE"), flocons (SF_IMAGE), NIL);
434
setvar (cintern ("SF-DRAWABLE"), flocons (SF_DRAWABLE), NIL);
435
setvar (cintern ("SF-LAYER"), flocons (SF_LAYER), NIL);
436
setvar (cintern ("SF-CHANNEL"), flocons (SF_CHANNEL), NIL);
437
setvar (cintern ("SF-COLOR"), flocons (SF_COLOR), NIL);
438
setvar (cintern ("SF-TOGGLE"), flocons (SF_TOGGLE), NIL);
439
setvar (cintern ("SF-VALUE"), flocons (SF_VALUE), NIL);
440
setvar (cintern ("SF-STRING"), flocons (SF_STRING), NIL);
441
setvar (cintern ("SF-FILENAME"), flocons (SF_FILENAME), NIL);
442
setvar (cintern ("SF-DIRNAME"), flocons (SF_DIRNAME), NIL);
443
setvar (cintern ("SF-ADJUSTMENT"), flocons (SF_ADJUSTMENT), NIL);
444
setvar (cintern ("SF-FONT"), flocons (SF_FONT), NIL);
445
setvar (cintern ("SF-PATTERN"), flocons (SF_PATTERN), NIL);
446
setvar (cintern ("SF-BRUSH"), flocons (SF_BRUSH), NIL);
447
setvar (cintern ("SF-GRADIENT"), flocons (SF_GRADIENT), NIL);
448
setvar (cintern ("SF-OPTION"), flocons (SF_OPTION), NIL);
449
setvar (cintern ("SF-PALETTE"), flocons (SF_PALETTE), NIL);
450
setvar (cintern ("SF-TEXT"), flocons (SF_TEXT), NIL);
452
/* for SF_ADJUSTMENT */
453
setvar (cintern ("SF-SLIDER"), flocons (SF_SLIDER), NIL);
454
setvar (cintern ("SF-SPINNER"), flocons (SF_SPINNER), NIL);
458
convert_string (gchar *str)
462
if (*str == '_') *str = '-';
468
sputs_fcn (gchar *st,
471
strcpy (*((gchar**)dest), st);
472
*((gchar**)dest) += strlen (st);
481
struct gen_printio s;
484
s.puts_fcn = sputs_fcn;
485
s.cb_argument = &dest;
494
marshall_proc_db_call (LISP a)
497
GimpParam *values = NULL;
503
gchar *proc_copyright;
505
GimpPDBProcType proc_type;
508
GimpParamDef *params;
509
GimpParamDef *return_vals;
510
gchar error_str[256];
513
LISP intermediate_val;
514
LISP return_val = NIL;
519
/* Save a in case it is needed for an error message. */
522
/* Make sure there are arguments */
524
return my_err ("Procedure database argument marshaller was called with no arguments. "
525
"The procedure to be executed and the arguments it requires "
526
"(possibly none) must be specified.", NIL);
528
/* Derive the pdb procedure name from the argument
529
or first argument of a list */
530
if (TYPEP (a, tc_cons))
531
proc_name = g_strdup (get_c_string (car (a)));
533
proc_name = g_strdup (get_c_string (a));
535
/* report the current command */
536
script_fu_interface_report_cc (proc_name);
538
/* Attempt to fetch the procedure from the database */
539
if (! gimp_procedural_db_proc_info (proc_name,
546
&nparams, &nreturn_vals,
547
¶ms, &return_vals))
549
convert_string (proc_name);
550
g_snprintf (error_str, sizeof (error_str),
551
"Invalid procedure name %s specified", proc_name);
552
return my_err (error_str, NIL);
555
/* Free the name and the description which are of no use here. */
556
for (i = 0; i < nparams; i++)
558
g_free (params[i].name);
559
g_free (params[i].description);
561
for (i = 0; i < nreturn_vals; i++)
563
g_free (return_vals[i].name);
564
g_free (return_vals[i].description);
567
/* Check the supplied number of arguments */
568
if ((nlength (a) - 1) != nparams)
570
convert_string (proc_name);
571
g_snprintf (error_str, sizeof (error_str),
572
"Invalid arguments supplied to %s -- "
573
"(# args: %ld, expecting: %d)",
574
proc_name, (nlength (a) - 1), nparams);
575
return my_err (error_str, NIL);
578
/* Marshall the supplied arguments */
580
args = g_new (GimpParam, nparams);
585
for (i = 0; i < nparams; i++)
587
switch (params[i].type)
590
if (!TYPEP (car (a), tc_flonum))
594
args[i].type = GIMP_PDB_INT32;
595
args[i].data.d_int32 = get_c_long (car (a));
600
if (!TYPEP (car (a), tc_flonum))
604
args[i].type = GIMP_PDB_INT16;
605
args[i].data.d_int16 = (gint16) get_c_long (car (a));
610
if (!TYPEP (car (a), tc_flonum))
614
args[i].type = GIMP_PDB_INT8;
615
args[i].data.d_int8 = (gint8) get_c_long (car (a));
620
if (!TYPEP (car (a), tc_flonum))
624
args[i].type = GIMP_PDB_FLOAT;
625
args[i].data.d_float = get_c_double (car (a));
629
case GIMP_PDB_STRING:
630
if (!TYPEP (car (a), tc_string))
634
args[i].type = GIMP_PDB_STRING;
635
args[i].data.d_string = get_c_string (car (a));
639
case GIMP_PDB_INT32ARRAY:
640
if (!TYPEP (car (a), tc_long_array))
644
gint n_elements = args[i - 1].data.d_int32;
647
if ((n_elements < 0) || (n_elements > nlength (list)))
649
convert_string (proc_name);
650
g_snprintf (error_str, sizeof (error_str),
651
"INT32 array (argument %d) for function %s has "
652
"incorrect length (got %ld, expected %d)",
653
i + 1, proc_name, nlength (list), n_elements);
654
return my_err (error_str, NIL);
657
args[i].type = GIMP_PDB_INT32ARRAY;
658
args[i].data.d_int32array = (gint32 *)
659
list->storage_as.long_array.data;
663
case GIMP_PDB_INT16ARRAY:
664
if (!TYPEP (car (a), tc_long_array))
668
gint n_elements = args[i - 1].data.d_int32;
671
if ((n_elements < 0) || (n_elements > nlength (list)))
673
convert_string (proc_name);
674
g_snprintf (error_str, sizeof (error_str),
675
"INT16 array (argument %d) for function %s has "
676
"incorrect length (got %ld, expected %d)",
677
i + 1, proc_name, nlength (list), n_elements);
678
return my_err (error_str, NIL);
681
args[i].type = GIMP_PDB_INT16ARRAY;
682
args[i].data.d_int16array = (gint16 *)
683
list->storage_as.long_array.data;
687
case GIMP_PDB_INT8ARRAY:
688
if (!TYPEP (car (a), tc_byte_array))
692
gint n_elements = args[i - 1].data.d_int32;
695
if ((n_elements < 0) || (n_elements > nlength (list)))
697
convert_string (proc_name);
698
g_snprintf (error_str, sizeof (error_str),
699
"INT8 array (argument %d) for function %s has "
700
"incorrect length (got %ld, expected %d)",
701
i + 1, proc_name, nlength (list), n_elements);
702
return my_err (error_str, NIL);
705
args[i].type = GIMP_PDB_INT8ARRAY;
706
args[i].data.d_int8array = (gint8 *) list->storage_as.string.data;
710
case GIMP_PDB_FLOATARRAY:
711
if (!TYPEP (car (a), tc_double_array))
715
gint n_elements = args[i - 1].data.d_int32;
718
if ((n_elements < 0) || (n_elements > nlength (list)))
720
convert_string (proc_name);
721
g_snprintf (error_str, sizeof (error_str),
722
"FLOAT array (argument %d) for function %s has "
723
"incorrect length (got %ld, expected %d)",
724
i + 1, proc_name, nlength (list), n_elements);
725
return my_err (error_str, NIL);
728
args[i].type = GIMP_PDB_FLOATARRAY;
729
args[i].data.d_floatarray = list->storage_as.double_array.data;
733
case GIMP_PDB_STRINGARRAY:
734
if (!TYPEP (car (a), tc_cons))
738
gint n_elements = args[i - 1].data.d_int32;
742
if ((n_elements < 0) || (n_elements > nlength (list)))
744
convert_string (proc_name);
745
g_snprintf (error_str, sizeof (error_str),
746
"String array (argument %d) for function %s has "
747
"incorrect length (got %ld, expected %d)",
748
i + 1, proc_name, nlength (list), n_elements);
749
return my_err (error_str, NIL);
752
args[i].type = GIMP_PDB_STRINGARRAY;
753
args[i].data.d_stringarray = g_new0 (gchar *, n_elements);
755
for (j = 0; j < n_elements; j++)
757
args[i].data.d_stringarray[j] = get_c_string (car (list));
764
if (!TYPEP (car (a), tc_cons))
771
args[i].type = GIMP_PDB_COLOR;
772
color_list = car (a);
773
r = CLAMP (get_c_long (car (color_list)), 0, 255);
774
color_list = cdr (color_list);
775
g = CLAMP (get_c_long (car (color_list)), 0, 255);
776
color_list = cdr (color_list);
777
b = CLAMP (get_c_long (car (color_list)), 0, 255);
779
gimp_rgba_set_uchar (&args[i].data.d_color, r, g, b, 255);
783
case GIMP_PDB_REGION:
784
return my_err ("Regions are currently unsupported as arguments",
788
case GIMP_PDB_DISPLAY:
789
if (!TYPEP (car (a), tc_flonum))
793
args[i].type = GIMP_PDB_DISPLAY;
794
args[i].data.d_int32 = get_c_long (car (a));
799
if (!TYPEP (car (a), tc_flonum))
803
args[i].type = GIMP_PDB_IMAGE;
804
args[i].data.d_int32 = get_c_long (car (a));
809
if (!TYPEP (car (a), tc_flonum))
813
args[i].type = GIMP_PDB_LAYER;
814
args[i].data.d_int32 = get_c_long (car (a));
818
case GIMP_PDB_CHANNEL:
819
if (!TYPEP (car (a), tc_flonum))
823
args[i].type = GIMP_PDB_CHANNEL;
824
args[i].data.d_int32 = get_c_long (car (a));
828
case GIMP_PDB_DRAWABLE:
829
if (!TYPEP (car (a), tc_flonum))
833
args[i].type = GIMP_PDB_DRAWABLE;
834
args[i].data.d_int32 = get_c_long (car (a));
838
case GIMP_PDB_SELECTION:
839
if (!TYPEP (car (a), tc_flonum))
843
args[i].type = GIMP_PDB_SELECTION;
844
args[i].data.d_int32 = get_c_long (car (a));
848
case GIMP_PDB_BOUNDARY:
849
return my_err ("Boundaries are currently unsupported as arguments",
854
return my_err ("Paths are currently unsupported as arguments",
858
case GIMP_PDB_PARASITE:
859
if (!TYPEP (car (a), tc_cons))
863
args[i].type = GIMP_PDB_PARASITE;
866
intermediate_val = car (a);
868
if (!TYPEP (car (intermediate_val), tc_string))
874
args[i].data.d_parasite.name =
875
get_c_string (car (intermediate_val));
877
/* parasite->flags */
878
intermediate_val = cdr (intermediate_val);
880
if (!TYPEP (car (intermediate_val), tc_flonum))
886
args[i].data.d_parasite.flags =
887
get_c_long (car (intermediate_val));
890
intermediate_val = cdr (intermediate_val);
892
if (!TYPEP (car (intermediate_val), tc_string) &&
893
!TYPEP (car (intermediate_val), tc_byte_array))
899
args[i].data.d_parasite.size =
900
(car (intermediate_val))->storage_as.string.dim;
903
args[i].data.d_parasite.data =
904
(car (intermediate_val))->storage_as.string.data;
908
case GIMP_PDB_STATUS:
909
return my_err ("Status is for return types, not arguments", car (a));
913
convert_string (proc_name);
914
g_snprintf (error_str, sizeof (error_str),
915
"Argument %d for %s is an unknown type",
917
return my_err (error_str, NIL);
928
values = gimp_run_procedure2 (proc_name, &nvalues, nparams, args);
932
g_snprintf (error_str, sizeof (error_str),
933
"Invalid type for argument %d to %s", i + 1, proc_name);
934
return my_err (error_str, NIL);
937
/* Check the return status */
941
"Procedural database execution did not return a status:\n ");
942
lprin1s (a_saved, error_str + strlen (error_str));
944
return my_err (error_str, NIL);
947
switch (values[0].data.d_status)
949
case GIMP_PDB_EXECUTION_ERROR:
951
"Procedural database execution failed:\n ");
952
lprin1s (a_saved, error_str + strlen (error_str));
953
return my_err (error_str, NIL);
956
case GIMP_PDB_CALLING_ERROR:
958
"Procedural database execution failed on invalid input arguments:\n ");
959
lprin1s (a_saved, error_str + strlen (error_str));
960
return my_err (error_str, NIL);
963
case GIMP_PDB_SUCCESS:
966
for (i = 0; i < nvalues - 1; i++)
968
switch (return_vals[i].type)
971
return_val = cons (flocons (values[i + 1].data.d_int32),
976
return_val = cons (flocons (values[i + 1].data.d_int32),
981
return_val = cons (flocons (values[i + 1].data.d_int32),
986
return_val = cons (flocons (values[i + 1].data.d_float),
990
case GIMP_PDB_STRING:
991
string = values[i + 1].data.d_string;
994
string_len = strlen (string);
995
return_val = cons (strcons (string_len, string), return_val);
998
case GIMP_PDB_INT32ARRAY:
1003
array = arcons (tc_long_array, values[i].data.d_int32, 0);
1004
for (j = 0; j < values[i].data.d_int32; j++)
1006
array->storage_as.long_array.data[j] =
1007
values[i + 1].data.d_int32array[j];
1009
return_val = cons (array, return_val);
1013
case GIMP_PDB_INT16ARRAY:
1018
array = arcons (tc_long_array, values[i].data.d_int32, 0);
1019
for (j = 0; j < values[i].data.d_int32; j++)
1021
array->storage_as.long_array.data[j] =
1022
values[i + 1].data.d_int16array[j];
1024
return_val = cons (array, return_val);
1028
case GIMP_PDB_INT8ARRAY:
1033
array = arcons (tc_byte_array, values[i].data.d_int32, 0);
1034
for (j = 0; j < values[i].data.d_int32; j++)
1036
array->storage_as.string.data[j] =
1037
values[i + 1].data.d_int8array[j];
1039
return_val = cons (array, return_val);
1043
case GIMP_PDB_FLOATARRAY:
1048
array = arcons (tc_double_array, values[i].data.d_int32, 0);
1049
for (j = 0; j < values[i].data.d_int32; j++)
1051
array->storage_as.double_array.data[j] =
1052
values[i + 1].data.d_floatarray[j];
1054
return_val = cons (array, return_val);
1058
case GIMP_PDB_STRINGARRAY:
1063
for (j = 0; j < values[i].data.d_int32; j++)
1065
string = (values[i + 1].data.d_stringarray)[j];
1069
string_len = strlen (string);
1070
array = cons (strcons (string_len, string), array);
1074
array = cons (strcons (0, ""), array);
1078
return_val = cons (nreverse (array), return_val);
1082
case GIMP_PDB_COLOR:
1086
gimp_rgb_get_uchar (&values[i + 1].data.d_color, &r, &g, &b);
1088
intermediate_val = cons (flocons (r),
1092
return_val = cons (intermediate_val, return_val);
1096
case GIMP_PDB_REGION:
1097
return my_err ("Regions are currently unsupported as return values", NIL);
1100
case GIMP_PDB_DISPLAY:
1101
return_val = cons (flocons (values[i + 1].data.d_int32),
1105
case GIMP_PDB_IMAGE:
1106
return_val = cons (flocons (values[i + 1].data.d_int32),
1110
case GIMP_PDB_LAYER:
1111
return_val = cons (flocons (values[i + 1].data.d_int32),
1115
case GIMP_PDB_CHANNEL:
1116
return_val = cons (flocons (values[i + 1].data.d_int32),
1120
case GIMP_PDB_DRAWABLE:
1121
return_val = cons (flocons (values[i + 1].data.d_int32),
1125
case GIMP_PDB_SELECTION:
1126
return_val = cons (flocons (values[i + 1].data.d_int32),
1130
case GIMP_PDB_BOUNDARY:
1131
return my_err ("Boundaries are currently unsupported as return values", NIL);
1135
return my_err ("Paths are currently unsupported as return values", NIL);
1138
case GIMP_PDB_PARASITE:
1140
LISP name, flags, data;
1142
if (values[i + 1].data.d_parasite.name == NULL)
1144
return_val = my_err("Error: null parasite", NIL);
1148
string_len = strlen (values[i + 1].data.d_parasite.name);
1149
name = strcons (string_len,
1150
values[i + 1].data.d_parasite.name);
1152
flags = flocons (values[i + 1].data.d_parasite.flags);
1153
data = arcons (tc_byte_array,
1154
values[i + 1].data.d_parasite.size, 0);
1155
memcpy(data->storage_as.string.data,
1156
values[i + 1].data.d_parasite.data,
1157
values[i + 1].data.d_parasite.size);
1159
intermediate_val = cons (name,
1160
cons(flags, cons(data, NIL)));
1161
return_val = cons (intermediate_val, return_val);
1166
case GIMP_PDB_STATUS:
1167
return my_err ("Procedural database execution returned multiple status values", NIL);
1171
return my_err ("Unknown return type", NIL);
1176
case GIMP_PDB_PASS_THROUGH:
1177
case GIMP_PDB_CANCEL: /* should we do something here? */
1181
/* free the proc name */
1184
/* free up the executed procedure return values */
1185
gimp_destroy_params (values, nvalues);
1187
/* free up arguments and values */
1190
/* free the query information */
1191
g_free (proc_blurb);
1193
g_free (proc_author);
1194
g_free (proc_copyright);
1197
g_free (return_vals);
1199
/* reverse the return values */
1200
return_val = nreverse (return_val);
1202
/* if we're in server mode, listen for additional commands for 10 ms */
1203
if (script_fu_server_get_mode ())
1204
script_fu_server_listen (10);
1206
#ifdef GDK_WINDOWING_WIN32
1207
/* This seems to help a lot on Windoze. */
1208
while (gtk_events_pending ())
1209
gtk_main_iteration ();
1216
script_fu_register_call (LISP a)
1218
if (register_scripts)
1219
return script_fu_add_script (a);
1225
script_fu_menu_register_call (LISP a)
1227
if (register_scripts)
1228
return script_fu_add_menu (a);
1234
script_fu_quit_call (LISP a)
1236
script_fu_server_quit ();