Gimp.pm 57.2 KB
Newer Older
Marc Lehmann's avatar
Marc Lehmann committed
1
2
3
4
package Gimp;

use strict 'vars';
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD %EXPORT_TAGS @EXPORT_FAIL
Marc Lehmann's avatar
Marc Lehmann committed
5
            $interface_pkg $interface_type
Marc Lehmann's avatar
Marc Lehmann committed
6
            @PREFIXES $_PROT_VERSION
Marc Lehmann's avatar
Marc Lehmann committed
7
            @gimp_gui_functions $function $basename $spawn_opts
Marc Lehmann's avatar
Marc Lehmann committed
8
            $in_quit $in_run $in_net $in_init $in_query $no_SIG
Marc Lehmann's avatar
Marc Lehmann committed
9
            $help $verbose $host $in_top);
Marc Lehmann's avatar
Marc Lehmann committed
10
use subs qw(init end lock unlock canonicalize_color);
Marc Lehmann's avatar
Marc Lehmann committed
11

Marc Lehmann's avatar
Marc Lehmann committed
12
BEGIN {
Marc Lehmann's avatar
Marc Lehmann committed
13
   $VERSION = 1.19;
Marc Lehmann's avatar
Marc Lehmann committed
14
15
16
17
18
19
20
21
   eval {
      require XSLoader;
      XSLoader::load Gimp $VERSION;
   } or do {
      require DynaLoader;
      @ISA=qw(DynaLoader);
      bootstrap Gimp $VERSION;
   }
Marc Lehmann's avatar
Marc Lehmann committed
22
}
Marc Lehmann's avatar
Marc Lehmann committed
23

Marc Lehmann's avatar
Marc Lehmann committed
24
my @_param = qw(
Marc Lehmann's avatar
Marc Lehmann committed
25
26
27
28
29
30
31
	PARAM_BOUNDARY	PARAM_CHANNEL	PARAM_COLOR	PARAM_DISPLAY	PARAM_DRAWABLE
	PARAM_END	PARAM_FLOAT	PARAM_IMAGE	PARAM_INT32	PARAM_FLOATARRAY
	PARAM_INT16	PARAM_PARASITE	PARAM_STRING	PARAM_PATH	PARAM_INT16ARRAY
	PARAM_INT8	PARAM_INT8ARRAY	PARAM_LAYER	PARAM_REGION	PARAM_STRINGARRAY
	PARAM_SELECTION	PARAM_STATUS	PARAM_INT32ARRAY
);

Marc Lehmann's avatar
Marc Lehmann committed
32
# constants that, in some earlier version, were autoloaded
Marc Lehmann's avatar
Marc Lehmann committed
33
my @_consts = (@_param,
Marc Lehmann's avatar
Marc Lehmann committed
34
#ENUM_NAME#
Marc Lehmann's avatar
Marc Lehmann committed
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
'NORMAL_CONVOL',       'NEGATIVE_CONVOL',     'ABSOLUTE_CONVOL',     'VALUE_MODE',          'COLOR_MODE',          'SCREEN_MODE',         'MULTIPLY_MODE',       
'HUE_MODE',            'OVERLAY_MODE',        'SUBTRACT_MODE',       'NORMAL_MODE',         'DISSOLVE_MODE',       'SATURATION_MODE',     'BEHIND_MODE',         
'DIFFERENCE_MODE',     'ADDITION_MODE',       'LIGHTEN_ONLY_MODE',   'DIVIDE_MODE',         'DARKEN_ONLY_MODE',    'SHADOWS',             'HIGHLIGHTS',          
'MIDTONES',            'FG_BUCKET_FILL',      'PATTERN_BUCKET_FILL', 'BG_BUCKET_FILL',      'FG_TRANS',            'FG_BG_HSV',           'FG_BG_RGB',           
'CUSTOM',              'LINEAR_INTERPOLATION','CUBIC_INTERPOLATION', 'NEAREST_NEIGHBOR_INTERPOLATION','INDEXED',             'GRAY',                'RGB',                 
'ONCE_END_COLOR',      'ONCE_FORWARD',        'LOOP_SAWTOOTH',       'ONCE_BACKWARDS',      'LOOP_TRIANGLE',       'FLATTEN_IMAGE',       'CLIP_TO_BOTTOM_LAYER',
'CLIP_TO_IMAGE',       'EXPAND_AS_NECESSARY', 'CUSTOM_PALETTE',      'REUSE_PALETTE',       'WEB_PALETTE',         'MAKE_PALETTE',        'MONO_PALETTE',        
'IMAGE_CLONE',         'PATTERN_CLONE',       'PDB_CALLING_ERROR',   'PDB_EXECUTION_ERROR', 'PDB_PASS_THROUGH',    'PDB_SUCCESS',         'RUN_WITH_LAST_VALS',  
'RUN_INTERACTIVE',     'RUN_NONINTERACTIVE',  'DODGE',               'BURN',                'POINTS',              'PIXELS',              'DODGEBURN_SHADOWS',   
'DODGEBURN_MIDTONES',  'DODGEBURN_HIGHLIGHTS','OFFSET_TRANSPARENT',  'OFFSET_BACKGROUND',   'FS_DITHER',           'NODESTRUCT_DITHER',   'NO_DITHER',           
'FSLOWBLEED_DITHER',   'FIXED_DITHER',        'CONSOLE',             'ERROR_CONSOLE',       'MESSAGE_BOX',         'REPEAT_NONE',         'REPEAT_TRIANGULAR',   
'REPEAT_SAWTOOTH',     'INTERSECT',           'ADD',                 'SUB',                 'REPLACE',             'TEMPORARY',           'EXTENSION',           
'INTERNAL',            'PLUGIN',              'BLUR_CONVOLVE',       'SHARPEN_CONVOLVE',    'CUSTOM_CONVOLVE',     'UNKNOWN',             'VERTICAL',            
'HORIZONTAL',          'YELLOW_HUES',         'MAGENTA_HUES',        'BLUE_HUES',           'GREEN_HUES',          'ALL_HUES',            'CYAN_HUES',           
'RED_HUES',            'SQUARE',              'CONICAL_SYMMETRIC',   'CONICAL_ASYMMETRIC',  'BILINEAR',            'SPIRAL_ANTICLOCKWISE','SHAPEBURST_ANGULAR',  
'LINEAR',              'SHAPEBURST_SPHERICAL','RADIAL',              'SPIRAL_CLOCKWISE',    'SHAPEBURST_DIMPLED',  'VALUE_LUT',           'ALPHA_LUT',           
'BLUE_LUT',            'GREEN_LUT',           'RED_LUT',             'INDEXED_IMAGE',       'INDEXEDA_IMAGE',      'GRAY_IMAGE',          'RGB_IMAGE',           
'GRAYA_IMAGE',         'RGBA_IMAGE',          'INCREMENTAL',         'CONTINUOUS',          'TRANS_IMAGE_FILL',    'FG_IMAGE_FILL',       'NO_IMAGE_FILL',       
'BG_IMAGE_FILL',       'WHITE_IMAGE_FILL',    'BLACK_MASK',          'ALPHA_MASK',          'WHITE_MASK',          'DISCARD',             'APPLY',               
'BLUE_CHANNEL',        'INDEXED_CHANNEL',     'GREEN_CHANNEL',       'AUXILLARY_CHANNEL',   'GRAY_CHANNEL',        'RED_CHANNEL',         'PRESSURE',            
'SOFT',                'HARD',                
Marc Lehmann's avatar
Marc Lehmann committed
56
57
#ENUM_NAME#
	'STATUS_CALLING_ERROR',		'STATUS_EXECUTION_ERROR',	'STATUS_PASS_THROUGH',
Marc Lehmann's avatar
Marc Lehmann committed
58
        'STATUS_SUCCESS',		'PARASITE_PERSISTENT',		'PARASITE_ATTACH_PARENT',
Marc Lehmann's avatar
Marc Lehmann committed
59
        'PARASITE_PARENT_PERSISTENT',	'PARASITE_ATTACH_GRANDPARENT',	'PARASITE_GRANDPARENT_PERSISTENT',
Marc Lehmann's avatar
Marc Lehmann committed
60
        'PARASITE_UNDOABLE',		'PARASITE_PARENT_UNDOABLE',	'PARASITE_GRANDPARENT_UNDOABLE',
Marc Lehmann's avatar
Marc Lehmann committed
61
	'TRACE_NONE',	'TRACE_CALL',	'TRACE_TYPE',	'TRACE_NAME',	'TRACE_DESC',	'TRACE_ALL',
Marc Lehmann's avatar
Marc Lehmann committed
62
	'COMPRESSION_NONE',		'COMPRESSION_LZW',		'COMPRESSION_PACKBITS',
Marc Lehmann's avatar
Marc Lehmann committed
63
        'WRAP',				'SMEAR',			'BLACK',
Marc Lehmann's avatar
Marc Lehmann committed
64
65

        'ADD_BLACK_MASK',		'ADD_WHITE_MASK',		'ADD_ALPHA_MASK',
Marc Lehmann's avatar
Marc Lehmann committed
66
        'ORIENTATION_HORIZONTAL',	'ORIENTATION_VERTICAL',		'ORIENTATION_UNKNOWN',
Marc Lehmann's avatar
Marc Lehmann committed
67
68
69
70
71

	'CAN_HANDLE_RGB',		'CAN_HANDLE_GRAY',		'CAN_HANDLE_INDEXED',
        'CAN_HANDLE_ALPHA',		'CAN_HANDLE_LAYERS',		'CAN_HANDLE_LAYERS_AS_ANIMATION',
        'NEEDS_ALPHA',
	'EXPORT_CANCEL',		'EXPORT_IGNORE',		'EXPORT_EXPORT',
Marc Lehmann's avatar
Marc Lehmann committed
72
73
);

Marc Lehmann's avatar
Marc Lehmann committed
74
75
76
77
sub ADD_WHITE_MASK	() { &WHITE_MASK }
sub ADD_BLACK_MASK	() { &BLACK_MASK }
sub ADD_ALPHA_MASK	() { &ALPHA_MASK }

Marc Lehmann's avatar
Marc Lehmann committed
78
79
80
81
sub ORIENTATION_HORIZONTAL	() { &HORIZONTAL }
sub ORIENTATION_VERTICAL	() { &VERTICAL   }
sub ORIENTATION_UNKNOWN		() { &UNKNOWN    }

Marc Lehmann's avatar
Marc Lehmann committed
82
#ENUM_DEFS#
Marc Lehmann's avatar
Marc Lehmann committed
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
sub NORMAL_CONVOL       (){ 0} sub NEGATIVE_CONVOL     (){ 2} sub ABSOLUTE_CONVOL     (){ 1} sub VALUE_MODE          (){14} sub COLOR_MODE          (){13}
sub SCREEN_MODE         (){ 4} sub MULTIPLY_MODE       (){ 3} sub HUE_MODE            (){11} sub OVERLAY_MODE        (){ 5} sub SUBTRACT_MODE       (){ 8}
sub NORMAL_MODE         (){ 0} sub DISSOLVE_MODE       (){ 1} sub SATURATION_MODE     (){12} sub BEHIND_MODE         (){ 2} sub DIFFERENCE_MODE     (){ 6}
sub ADDITION_MODE       (){ 7} sub LIGHTEN_ONLY_MODE   (){10} sub DIVIDE_MODE         (){15} sub DARKEN_ONLY_MODE    (){ 9} sub SHADOWS             (){ 0}
sub HIGHLIGHTS          (){ 2} sub MIDTONES            (){ 1} sub FG_BUCKET_FILL      (){ 0} sub PATTERN_BUCKET_FILL (){ 2} sub BG_BUCKET_FILL      (){ 1}
sub FG_TRANS            (){ 2} sub FG_BG_HSV           (){ 1} sub FG_BG_RGB           (){ 0} sub CUSTOM              (){ 3} sub LINEAR_INTERPOLATION(){ 0}
sub CUBIC_INTERPOLATION (){ 1} sub NEAREST_NEIGHBOR_INTERPOLATION(){ 2} sub INDEXED             (){ 2} sub GRAY                (){ 1} sub RGB                 (){ 0}
sub ONCE_END_COLOR      (){ 4} sub ONCE_FORWARD        (){ 0} sub LOOP_SAWTOOTH       (){ 2} sub ONCE_BACKWARDS      (){ 1} sub LOOP_TRIANGLE       (){ 3}
sub FLATTEN_IMAGE       (){ 3} sub CLIP_TO_BOTTOM_LAYER(){ 2} sub CLIP_TO_IMAGE       (){ 1} sub EXPAND_AS_NECESSARY (){ 0} sub CUSTOM_PALETTE      (){ 4}
sub REUSE_PALETTE       (){ 1} sub WEB_PALETTE         (){ 2} sub MAKE_PALETTE        (){ 0} sub MONO_PALETTE        (){ 3} sub IMAGE_CLONE         (){ 0}
sub PATTERN_CLONE       (){ 1} sub PDB_CALLING_ERROR   (){ 1} sub PDB_EXECUTION_ERROR (){ 0} sub PDB_PASS_THROUGH    (){ 2} sub PDB_SUCCESS         (){ 3}
sub RUN_WITH_LAST_VALS  (){bless \(my $x=2),'Gimp::run_mode'} sub RUN_INTERACTIVE     (){bless \(my $x=0),'Gimp::run_mode'} sub RUN_NONINTERACTIVE  (){bless \(my $x=1),'Gimp::run_mode'} sub DODGE               (){ 0} sub BURN                (){ 1}
sub POINTS              (){ 1} sub PIXELS              (){ 0} sub DODGEBURN_SHADOWS   (){ 2} sub DODGEBURN_MIDTONES  (){ 1} sub DODGEBURN_HIGHLIGHTS(){ 0}
sub OFFSET_TRANSPARENT  (){ 1} sub OFFSET_BACKGROUND   (){ 0} sub FS_DITHER           (){ 1} sub NODESTRUCT_DITHER   (){ 4} sub NO_DITHER           (){ 0}
sub FSLOWBLEED_DITHER   (){ 2} sub FIXED_DITHER        (){ 3} sub CONSOLE             (){ 1} sub ERROR_CONSOLE       (){ 2} sub MESSAGE_BOX         (){ 0}
sub REPEAT_NONE         (){ 0} sub REPEAT_TRIANGULAR   (){ 2} sub REPEAT_SAWTOOTH     (){ 1} sub INTERSECT           (){ 3} sub ADD                 (){ 0}
sub SUB                 (){ 1} sub REPLACE             (){ 2} sub TEMPORARY           (){ 3} sub EXTENSION           (){ 2} sub INTERNAL            (){ 0}
sub PLUGIN              (){ 1} sub BLUR_CONVOLVE       (){ 0} sub SHARPEN_CONVOLVE    (){ 1} sub CUSTOM_CONVOLVE     (){ 2} sub UNKNOWN             (){ 2}
sub VERTICAL            (){ 1} sub HORIZONTAL          (){ 0} sub YELLOW_HUES         (){ 2} sub MAGENTA_HUES        (){ 6} sub BLUE_HUES           (){ 5}
sub GREEN_HUES          (){ 3} sub ALL_HUES            (){ 0} sub CYAN_HUES           (){ 4} sub RED_HUES            (){ 1} sub SQUARE              (){ 3}
sub CONICAL_SYMMETRIC   (){ 4} sub CONICAL_ASYMMETRIC  (){ 5} sub BILINEAR            (){ 1} sub SPIRAL_ANTICLOCKWISE(){10} sub SHAPEBURST_ANGULAR  (){ 6}
sub LINEAR              (){ 0} sub SHAPEBURST_SPHERICAL(){ 7} sub RADIAL              (){ 2} sub SPIRAL_CLOCKWISE    (){ 9} sub SHAPEBURST_DIMPLED  (){ 8}
sub VALUE_LUT           (){ 0} sub ALPHA_LUT           (){ 4} sub BLUE_LUT            (){ 3} sub GREEN_LUT           (){ 2} sub RED_LUT             (){ 1}
sub INDEXED_IMAGE       (){ 4} sub INDEXEDA_IMAGE      (){ 5} sub GRAY_IMAGE          (){ 2} sub RGB_IMAGE           (){ 0} sub GRAYA_IMAGE         (){ 3}
sub RGBA_IMAGE          (){ 1} sub INCREMENTAL         (){ 1} sub CONTINUOUS          (){ 0} sub TRANS_IMAGE_FILL    (){ 3} sub FG_IMAGE_FILL       (){ 0}
sub NO_IMAGE_FILL       (){ 4} sub BG_IMAGE_FILL       (){ 1} sub WHITE_IMAGE_FILL    (){ 2} sub BLACK_MASK          (){ 1} sub ALPHA_MASK          (){ 2}
sub WHITE_MASK          (){ 0} sub DISCARD             (){ 1} sub APPLY               (){ 0} sub BLUE_CHANNEL        (){ 2} sub INDEXED_CHANNEL     (){ 4}
sub GREEN_CHANNEL       (){ 1} sub AUXILLARY_CHANNEL   (){ 5} sub GRAY_CHANNEL        (){ 3} sub RED_CHANNEL         (){ 0} sub PRESSURE            (){ 2}
sub SOFT                (){ 1} sub HARD                (){ 0}
Marc Lehmann's avatar
Marc Lehmann committed
112
#ENUM_DEFS#
Marc Lehmann's avatar
Marc Lehmann committed
113
114
115
116

sub WRAP		(){ 0 }
sub SMEAR		(){ 1 }
sub BLACK		(){ 2 }
Marc Lehmann's avatar
Marc Lehmann committed
117

Marc Lehmann's avatar
Marc Lehmann committed
118
119
120
121
122
# file_tiff_*
sub COMPRESSION_NONE		(){ 0 }
sub COMPRESSION_LZW		(){ 1 }
sub COMPRESSION_PACKBITS	(){ 2 }

Marc Lehmann's avatar
Marc Lehmann committed
123
124
125
126
127
# internal constants shared with Perl-Server

sub _PS_FLAG_QUIET	{ 0000000001 };	# do not output messages
sub _PS_FLAG_BATCH	{ 0000000002 }; # started via Gimp::Net, extra = filehandle

Marc Lehmann's avatar
Marc Lehmann committed
128
$_PROT_VERSION = "3";			# protocol version
Marc Lehmann's avatar
Marc Lehmann committed
129

Marc Lehmann's avatar
Marc Lehmann committed
130
131
132
133
134
sub croak {
   require Carp;
   goto &Carp::croak;
}

Marc Lehmann's avatar
Marc Lehmann committed
135
my @_procs = ('main', 'xlfd_size', '__', 'N_');
Marc Lehmann's avatar
Marc Lehmann committed
136
137
#my @_default = (@_procs, ':consts' ,':_auto2');
my @_default = (@_procs, ':consts');
Marc Lehmann's avatar
Marc Lehmann committed
138
   
Marc Lehmann's avatar
Marc Lehmann committed
139
140
141
# we really abuse the import facility..
sub import($;@) {
   my $pkg = shift;
Marc Lehmann's avatar
Marc Lehmann committed
142
   my $up = caller;
Marc Lehmann's avatar
Marc Lehmann committed
143
   my @export;
Marc Lehmann's avatar
Marc Lehmann committed
144

Marc Lehmann's avatar
Marc Lehmann committed
145
   @_=@_default unless @_;
Marc Lehmann's avatar
Marc Lehmann committed
146
   
Marc Lehmann's avatar
Marc Lehmann committed
147
   for(map { $_ eq ":DEFAULT" ? @_default : $_ } @_) {
Marc Lehmann's avatar
Marc Lehmann committed
148
149
      if ($_ eq ":auto") {
         push(@export,@_consts,@_procs);
Marc Lehmann's avatar
Marc Lehmann committed
150
         *{"$up\::AUTOLOAD"} = sub {
Marc Lehmann's avatar
Marc Lehmann committed
151
            croak "Cannot call '$AUTOLOAD' at this time" unless initialized();
Marc Lehmann's avatar
Marc Lehmann committed
152
            my ($class,$name) = $AUTOLOAD =~ /^(.*)::(.*?)$/;
Marc Lehmann's avatar
Marc Lehmann committed
153
            *{$AUTOLOAD} = sub { unshift @_, 'Gimp'; $AUTOLOAD = "Gimp::$name"; goto &AUTOLOAD };
Marc Lehmann's avatar
Marc Lehmann committed
154
            #*{$AUTOLOAD} = sub { Gimp->$name(@_) }; # old version
Marc Lehmann's avatar
Marc Lehmann committed
155
156
            goto &$AUTOLOAD;
         };
Marc Lehmann's avatar
Marc Lehmann committed
157
158
159
      } elsif ($_ eq ":_auto2") {
         push(@export,@_consts,@_procs);
         *{"$up\::AUTOLOAD"} = sub {
Marc Lehmann's avatar
Marc Lehmann committed
160
161
            warn __"$function: calling $AUTOLOAD without specifying the :auto import tag is deprecated!\n";
            croak __"Cannot call '$AUTOLOAD' at this time" unless initialized();
Marc Lehmann's avatar
Marc Lehmann committed
162
            my ($class,$name) = $AUTOLOAD =~ /^(.*)::(.*?)$/;
Marc Lehmann's avatar
Marc Lehmann committed
163
            *{$AUTOLOAD} = sub { unshift @_, 'Gimp'; $AUTOLOAD = "Gimp::$name"; goto &AUTOLOAD };
Marc Lehmann's avatar
Marc Lehmann committed
164
            #*{$AUTOLOAD} = sub { Gimp->$name(@_) }; # old version
Marc Lehmann's avatar
Marc Lehmann committed
165
166
            goto &$AUTOLOAD;
         };
Marc Lehmann's avatar
Marc Lehmann committed
167
168
169
170
171
      } elsif ($_ eq ":consts") {
         push(@export,@_consts);
      } elsif ($_ eq ":param") {
         push(@export,@_param);
      } elsif (/^interface=(\S+)$/) {
Marc Lehmann's avatar
Marc Lehmann committed
172
         croak __"interface=... tag is no longer supported\n";
Marc Lehmann's avatar
Marc Lehmann committed
173
174
      } elsif ($_=~/spawn_options=(\S+)/) {
         $spawn_opts = $1;
Marc Lehmann's avatar
Marc Lehmann committed
175
176
177
      } elsif ($_ ne "") {
         push(@export,$_);
      } elsif ($_ eq "") {
Marc Lehmann's avatar
Marc Lehmann committed
178
         #nop #d#FIXME, Perl-Server requires this!
Marc Lehmann's avatar
Marc Lehmann committed
179
      } else {
Marc Lehmann's avatar
Marc Lehmann committed
180
         croak __"$_ is not a valid import tag for package $pkg";
Marc Lehmann's avatar
Marc Lehmann committed
181
182
183
184
      }
   }
   
   for(@export) {
Marc Lehmann's avatar
Marc Lehmann committed
185
      *{"$up\::$_"} = \&$_;
Marc Lehmann's avatar
Marc Lehmann committed
186
187
188
   }
}

Marc Lehmann's avatar
Marc Lehmann committed
189
190
191
sub xlfd_size($) {
  local $^W=0;
  my ($px,$pt)=(split(/-/,$_[0]))[7,8];
Marc Lehmann's avatar
Marc Lehmann committed
192
193
  $px>0 ? ($px,&Gimp::PIXELS)
        : ($pt,&Gimp::POINTS);
Marc Lehmann's avatar
Marc Lehmann committed
194
195
}

Marc Lehmann's avatar
Marc Lehmann committed
196
# the monadic identity function
Marc Lehmann's avatar
Marc Lehmann committed
197
198
sub N_($) { shift }

Marc Lehmann's avatar
Marc Lehmann committed
199
200
my @init_functions;

Marc Lehmann's avatar
Marc Lehmann committed
201
my $gtk_init = 1;
Marc Lehmann's avatar
Marc Lehmann committed
202

Marc Lehmann's avatar
Marc Lehmann committed
203
204
205
206
207
208
209
210
211
212
213
214
215
sub gtk_init() {
   if ($gtk_init) {
      require Gtk;
      Gtk->init;
      Gtk::Rc->parse (Gimp->gtkrc);
      Gtk::Gdk->set_use_xshm (Gimp->use_xshm);
      Gtk::Preview->set_gamma (Gimp->gamma);
      Gtk::Preview->set_install_cmap (Gimp->install_cmap);
      Gtk::Preview->set_color_cube (Gimp->color_cube);
      Gtk::Widget->set_default_visual (Gtk::Preview->get_visual);
      Gtk::Widget->set_default_colormap (Gtk::Preview->get_cmap);
      $gtk_init = 0;
   }
Marc Lehmann's avatar
Marc Lehmann committed
216
217
218
219
220
   &{shift @init_functions} while @init_functions;
}

sub gtk_init_hook(&) {
   push @init_functions, @_;
Marc Lehmann's avatar
Marc Lehmann committed
221
222
223
   unless ($gtk_init) {
      &{shift @init_functions} while @init_functions;
   }
Marc Lehmann's avatar
Marc Lehmann committed
224
225
}

Marc Lehmann's avatar
Marc Lehmann committed
226
227
228
# internal utility function for Gimp::Fu and others
sub wrap_text {
   my $x=$_[0];
Marc Lehmann's avatar
Marc Lehmann committed
229
   $x=~s/\G(.{1,$_[1]})(\s+|$)/$1\n/gm;
Marc Lehmann's avatar
Marc Lehmann committed
230
   $x=~s/[ \t\r\n]+$//g;
Marc Lehmann's avatar
Marc Lehmann committed
231
232
233
   $x;
}

Marc Lehmann's avatar
Marc Lehmann committed
234
235
236
237
238
239
240
241
242
243
244
245
246
my %rgb_db;
my $rgb_db_path;

sub set_rgb_db($) {
   $rgb_db_path=$_[0];
   undef %rgb_db;
}

sub canonicalize_colour {
   if (@_ == 3) {
      [@_];
   } elsif (ref $_[0]) {
      $_[0];
Marc Lehmann's avatar
Marc Lehmann committed
247
   } elsif ($_[0] =~ /^#([0-9a-fA-F]{2,2})([0-9a-fA-F]{2,2})([0-9a-fA-F]{2,2})$/) {
Marc Lehmann's avatar
Marc Lehmann committed
248
249
      [map {eval "0x$_"} ($1,$2,$3)];
   } else {
Marc Lehmann's avatar
Marc Lehmann committed
250
      unless (%rgb_db) {
Marc Lehmann's avatar
Marc Lehmann committed
251
         if ($rgb_db_path) {
Marc Lehmann's avatar
Marc Lehmann committed
252
            open RGB_TEXT,"<$rgb_db_path" or croak __"unable to open $rgb_db_path";
Marc Lehmann's avatar
Marc Lehmann committed
253
         } else {
Marc Lehmann's avatar
Marc Lehmann committed
254
            *RGB_TEXT=*DATA;
Marc Lehmann's avatar
Marc Lehmann committed
255
         }
Marc Lehmann's avatar
Marc Lehmann committed
256
         while(<RGB_TEXT>) {
Marc Lehmann's avatar
Marc Lehmann committed
257
258
259
            next unless /^\s*(\d+)\s+(\d+)\s+(\d+)\s+(.+?)\s*$/;
            $rgb_db{lc($4)}=[$1,$2,$3];
         }
Marc Lehmann's avatar
Marc Lehmann committed
260
         close RGB_TEXT;
Marc Lehmann's avatar
Marc Lehmann committed
261
262
263
264
      }
      if ($rgb_db{lc($_[0])}) {
         return $rgb_db{lc($_[0])};
      } else {
Marc Lehmann's avatar
Marc Lehmann committed
265
         croak sprintf __"Unable to grok '%s' as colour specifier", join(",",@_);
Marc Lehmann's avatar
Marc Lehmann committed
266
267
268
269
270
271
      }
   }
}

*canonicalize_color = \&canonicalize_colour;

Marc Lehmann's avatar
Marc Lehmann committed
272
273
($basename = $0) =~ s/^.*[\\\/]//;

Marc Lehmann's avatar
Marc Lehmann committed
274
275
$spawn_opts = "";

Marc Lehmann's avatar
Marc Lehmann committed
276
# extra check for Gimp::Feature::import
Marc Lehmann's avatar
Marc Lehmann committed
277
278
$in_query=0 unless defined $in_query;		# perl -w is SOOO braindamaged
$in_top=$in_quit=$in_run=$in_net=$in_init=0;	# perl -w is braindamaged
Marc Lehmann's avatar
Marc Lehmann committed
279
($function)=$0=~/([^\/\\]+)$/;
Marc Lehmann's avatar
Marc Lehmann committed
280
281
282

$verbose=0;

Marc Lehmann's avatar
Marc Lehmann committed
283
284
285
286
287
288
289
290
291
292
$interface_type = "net";
if (@ARGV) {
   if ($ARGV[0] eq "-gimp") {
      $interface_type = "lib";
      # ignore other parameters completely
   } else {
      while(@ARGV) {
         $_=shift(@ARGV);
         if (/^-h$|^--?help$|^-\?$/) {
            $help=1;
Marc Lehmann's avatar
Marc Lehmann committed
293
            print __"Usage: $0 [gimp-args..] [interface-args..] [script-args..]
Marc Lehmann's avatar
Marc Lehmann committed
294
295
296
297
298
299
       gimp-arguments are
           -gimp <anything>           used internally only
           -h | -help | --help | -?   print some help
           -v | --verbose             be more verbose in what you do
           --host|--tcp HOST[:PORT]   connect to HOST (optionally using PORT)
                                      (for more info, see Gimp::Net(3))
Marc Lehmann's avatar
Marc Lehmann committed
300
";
Marc Lehmann's avatar
Marc Lehmann committed
301
302
303
304
305
306
307
308
309
310
311
312
         } elsif (/^-v$|^--verbose$/) {
            $verbose++;
         } elsif (/^--host$|^--tcp$/) {
            $host=shift(@ARGV);
         } else {
            unshift(@ARGV,$_);
            last;
         }
      }
   }
}

Marc Lehmann's avatar
Marc Lehmann committed
313
my @log;
Marc Lehmann's avatar
Marc Lehmann committed
314
315
316
317
318

sub format_msg {
   $_=shift;
   "$_->[0]: $_->[2] ".($_->[1] ? "($_->[1])":"");
}
Marc Lehmann's avatar
Marc Lehmann committed
319
320

sub _initialized_callback {
Marc Lehmann's avatar
Marc Lehmann committed
321
322
323
324
325
326
327
328
329
330
   # load the compatibility module on older versions
   if ($interface_pkg eq "Gimp::Lib") {
      # this must match @max_gimp_version in Gimp::Compat
      my @compat_gimp_version = (1,1);
      if ((Gimp->major_version < $compat_gimp_version[0])
          || (Gimp->major_version == $compat_gimp_version[0]
              && Gimp->minor_version < $compat_gimp_version[1])) {
         require Gimp::Compat;
         $compat_gimp_version[0] == $Gimp::Compat::max_gimp_version[0]
            && $compat_gimp_version[1] == $Gimp::Compat::max_gimp_version[1]
Marc Lehmann's avatar
Marc Lehmann committed
331
               or die "FATAL: Gimp::Compat version mismatch\n";
Marc Lehmann's avatar
Marc Lehmann committed
332
333
      }
   }
Marc Lehmann's avatar
Marc Lehmann committed
334
   if (@log) {
Marc Lehmann's avatar
Marc Lehmann committed
335
      my $oldtrace = set_trace(0);
Marc Lehmann's avatar
Marc Lehmann committed
336
337
338
339
      unless ($in_net || $in_query || $in_quit || $in_init) {
         for(@log) {
            Gimp->message(format_msg($_)) if $_->[3];
         }
Marc Lehmann's avatar
Marc Lehmann committed
340
      }
Marc Lehmann's avatar
Marc Lehmann committed
341
342
      Gimp->_gimp_append_data ('gimp-perl-log', map join("\1",@$_)."\0",@log);
      @log=();
Marc Lehmann's avatar
Marc Lehmann committed
343
      set_trace($oldtrace);
Marc Lehmann's avatar
Marc Lehmann committed
344
345
346
347
348
349
350
351
352
   }
}

# message
# function
# fatal
sub logger {
   my %args = @_;
   $args{message}  = "unknown message"    unless defined $args{message};
Marc Lehmann's avatar
Marc Lehmann committed
353
   $args{function} = $function            unless defined $args{function};
Marc Lehmann's avatar
Marc Lehmann committed
354
355
   $args{function} = ""                   unless defined $args{function};
   $args{fatal}    = 1                    unless defined $args{fatal};
Marc Lehmann's avatar
Marc Lehmann committed
356
   push(@log,[$basename,@args{'function','message','fatal'}]);
Marc Lehmann's avatar
Marc Lehmann committed
357
   print STDERR format_msg($log[-1]),"\n" if !($in_query || $in_init || $in_quit) || $verbose;
Marc Lehmann's avatar
Marc Lehmann committed
358
359
360
   _initialized_callback if initialized();
}

Marc Lehmann's avatar
Marc Lehmann committed
361
sub die_msg {
Marc Lehmann's avatar
Marc Lehmann committed
362
   logger(message => substr($_[0],0,-1), fatal => 1, function => 'ERROR');
Marc Lehmann's avatar
Marc Lehmann committed
363
364
}

Marc Lehmann's avatar
Marc Lehmann committed
365
366
# this needs to be improved
sub quiet_die {
Marc Lehmann's avatar
Marc Lehmann committed
367
   $in_top ? exit(1) : die "IGNORE THIS MESSAGE\n";
Marc Lehmann's avatar
Marc Lehmann committed
368
369
}

Marc Lehmann's avatar
Marc Lehmann committed
370
unless($no_SIG) {
Marc Lehmann's avatar
Marc Lehmann committed
371
372
373
   $SIG{__DIE__} = sub {
      unless ($^S || !defined $^S || $in_quit) {
         die_msg $_[0];
Marc Lehmann's avatar
Marc Lehmann committed
374
         initialized() ? &quiet_die : exit quiet_main();
Marc Lehmann's avatar
Marc Lehmann committed
375
      } else {
Marc Lehmann's avatar
Marc Lehmann committed
376
         die $_[0];
Marc Lehmann's avatar
Marc Lehmann committed
377
378
379
380
381
      }
   };

   $SIG{__WARN__} = sub {
      unless ($in_quit) {
Marc Lehmann's avatar
Marc Lehmann committed
382
         warn $_[0];
Marc Lehmann's avatar
Marc Lehmann committed
383
      } else {
Marc Lehmann's avatar
Marc Lehmann committed
384
         logger(message => substr($_[0],0,-1), fatal => 0, function => __"WARNING");
Marc Lehmann's avatar
Marc Lehmann committed
385
386
387
388
      }
   };
}

Marc Lehmann's avatar
Marc Lehmann committed
389
390
my %callback;

Marc Lehmann's avatar
Marc Lehmann committed
391
sub cbchain($) {
Marc Lehmann's avatar
Marc Lehmann committed
392
   my $cb = shift;
Marc Lehmann's avatar
Marc Lehmann committed
393
   $callback{$cb} ? @{$callback{$cb}} : ();
Marc Lehmann's avatar
Marc Lehmann committed
394
395
396
397
}

sub callback {
   my $type = shift;
Marc Lehmann's avatar
Marc Lehmann committed
398
   my @cb;
Marc Lehmann's avatar
Marc Lehmann committed
399
400
   if ($type eq "-run") {
      local $function = shift;
Marc Lehmann's avatar
Marc Lehmann committed
401
      local $in_run = 1;
Marc Lehmann's avatar
Marc Lehmann committed
402
      _initialized_callback;
Marc Lehmann's avatar
Marc Lehmann committed
403
404
405
406
407
408
409
410
      {
         local $^W = 0;
         @cb = (
            @{$callback{run}},
            @{$callback{lib}},
            @{$callback{$function}},
         );
      }
Marc Lehmann's avatar
Marc Lehmann committed
411
412
      die_msg __"required callback 'run' not found\n" unless @cb;
      for (@cb) { &$_ }
Marc Lehmann's avatar
Marc Lehmann committed
413
   } elsif ($type eq "-net") {
Marc Lehmann's avatar
Marc Lehmann committed
414
      local $in_net = 1;
Marc Lehmann's avatar
Marc Lehmann committed
415
      _initialized_callback;
Marc Lehmann's avatar
Marc Lehmann committed
416
417
418
419
420
421
422
423
      {
         local $^W = 0;
         @cb = (
            @{$callback{run}},
            @{$callback{net}},
            @{$callback{$function}},
         );
      }
Marc Lehmann's avatar
Marc Lehmann committed
424
425
      die_msg __"required callback 'net' not found\n" unless @cb;
      for (@cb) { &$_ }
Marc Lehmann's avatar
Marc Lehmann committed
426
   } elsif ($type eq "-query") {
Marc Lehmann's avatar
Marc Lehmann committed
427
      local $in_query = 1;
Marc Lehmann's avatar
Marc Lehmann committed
428
      _initialized_callback;
Marc Lehmann's avatar
Marc Lehmann committed
429
430
431
432
433
434
      {
         local $^W = 0;
         @cb = (
            @{$callback{query}},
         );
      }
Marc Lehmann's avatar
Marc Lehmann committed
435
436
      die_msg __"required callback 'query' not found\n" unless @cb;
      for (@cb) { &$_ }
Marc Lehmann's avatar
Marc Lehmann committed
437
   } elsif ($type eq "-quit") {
Marc Lehmann's avatar
Marc Lehmann committed
438
      local $in_quit = 1;
Marc Lehmann's avatar
Marc Lehmann committed
439
440
441
442
443
444
      {
         local $^W = 0;
         @cb = (
            @{$callback{quiet}},
         );
      }
Marc Lehmann's avatar
Marc Lehmann committed
445
      for (@cb) { &$_ }
Marc Lehmann's avatar
Marc Lehmann committed
446
447
448
   }
}

Marc Lehmann's avatar
Marc Lehmann committed
449
sub register_callback($$) {
Marc Lehmann's avatar
Marc Lehmann committed
450
   push(@{$callback{$_[0]}},$_[1]);
Marc Lehmann's avatar
Marc Lehmann committed
451
452
}

Marc Lehmann's avatar
Marc Lehmann committed
453
454
sub on_query(&) { register_callback "query", $_[0] }
sub on_net  (&) { register_callback "net"  , $_[0] }
Marc Lehmann's avatar
Marc Lehmann committed
455
456
sub on_lib  (&) { register_callback "lib"  , $_[0] }
sub on_run  (&) { register_callback "run"  , $_[0] }
Marc Lehmann's avatar
Marc Lehmann committed
457

Marc Lehmann's avatar
Marc Lehmann committed
458
sub main {
Marc Lehmann's avatar
Marc Lehmann committed
459
   &{"$interface_pkg\::gimp_main"};
Marc Lehmann's avatar
Marc Lehmann committed
460
}
Marc Lehmann's avatar
Marc Lehmann committed
461

Marc Lehmann's avatar
Marc Lehmann committed
462
463
464
# same as main, but callbacks are ignored
sub quiet_main {
   main;
Marc Lehmann's avatar
Marc Lehmann committed
465
466
}

Marc Lehmann's avatar
Marc Lehmann committed
467
468
##############################################################################

Marc Lehmann's avatar
Marc Lehmann committed
469
470
471
472
473
if ($interface_type=~/^lib$/i) {
   $interface_pkg="Gimp::Lib";
} elsif ($interface_type=~/^net$/i) {
   $interface_pkg="Gimp::Net";
} else {
Marc Lehmann's avatar
Marc Lehmann committed
474
   croak __"interface '$interface_type' unsupported.";
Marc Lehmann's avatar
Marc Lehmann committed
475
476
477
478
479
480
}

eval "require $interface_pkg" or croak "$@";
$interface_pkg->import;

# create some common aliases
Marc Lehmann's avatar
Marc Lehmann committed
481
for(qw(_gimp_procedure_available gimp_call_procedure set_trace initialized)) {
Marc Lehmann's avatar
Marc Lehmann committed
482
   *$_ = \&{"$interface_pkg\::$_"};
Marc Lehmann's avatar
Marc Lehmann committed
483
484
}

Marc Lehmann's avatar
Marc Lehmann committed
485
486
487
488
*init  = \&{"$interface_pkg\::gimp_init"};
*end   = \&{"$interface_pkg\::gimp_end" };
*lock  = \&{"$interface_pkg\::lock" };
*unlock= \&{"$interface_pkg\::unlock" };
Marc Lehmann's avatar
Marc Lehmann committed
489

Marc Lehmann's avatar
Marc Lehmann committed
490
my %ignore_function = (DESTROY => 1);
Marc Lehmann's avatar
Marc Lehmann committed
491

Marc Lehmann's avatar
Marc Lehmann committed
492
493
@PREFIXES=("gimp_", "");

Marc Lehmann's avatar
Marc Lehmann committed
494
495
496
497
498
499
500
501
502
503
504
505
@gimp_gui_functions = qw(
   gimp_progress_init
   gimp_progress_update
   gimp_displays_flush
   gimp_display_new
   gimp_display_delete
);

sub ignore_functions(@) {
   @ignore_function{@_}++;
}

Marc Lehmann's avatar
Marc Lehmann committed
506
sub recroak($) {
Marc Lehmann's avatar
Marc Lehmann committed
507
  $_[0] =~ s/ at .*? line \d+.*$//s;
Marc Lehmann's avatar
Marc Lehmann committed
508
  croak $_[0];
Marc Lehmann's avatar
Marc Lehmann committed
509
510
511
512
}

sub AUTOLOAD {
   my ($class,$name) = $AUTOLOAD =~ /^(.*)::(.*?)$/;
Marc Lehmann's avatar
Marc Lehmann committed
513
   for(@{"$class\::PREFIXES"}) {
Marc Lehmann's avatar
Marc Lehmann committed
514
515
516
517
      my $sub = $_.$name;
      if (exists $ignore_function{$sub}) {
        *{$AUTOLOAD} = sub { () };
        goto &$AUTOLOAD;
Marc Lehmann's avatar
Marc Lehmann committed
518
519
520
521
      } elsif (UNIVERSAL::can(Gimp::Util,$sub)) {
         my $ref = \&{"Gimp::Util::$sub"};
         *{$AUTOLOAD} = sub {
            shift unless ref $_[0];
Marc Lehmann's avatar
Marc Lehmann committed
522
523
524
            #goto &$ref; # does not work, PERLBUG! #FIXME
            my @r = eval { &$ref };
            recroak $@ if $@; wantarray ? @r : $r[0];
Marc Lehmann's avatar
Marc Lehmann committed
525
526
         };
         goto &$AUTOLOAD;
Marc Lehmann's avatar
Marc Lehmann committed
527
      } elsif (UNIVERSAL::can($interface_pkg,$sub)) {
Marc Lehmann's avatar
Marc Lehmann committed
528
         my $ref = \&{"$interface_pkg\::$sub"};
Marc Lehmann's avatar
Marc Lehmann committed
529
530
         *{$AUTOLOAD} = sub {
            shift unless ref $_[0];
Marc Lehmann's avatar
Marc Lehmann committed
531
532
533
            #goto &$ref; # does not work, PERLBUG! #FIXME
            my @r = eval { &$ref };
            recroak $@ if $@; wantarray ? @r : $r[0];
Marc Lehmann's avatar
Marc Lehmann committed
534
535
536
         };
         goto &$AUTOLOAD;
      } elsif (_gimp_procedure_available ($sub)) {
Marc Lehmann's avatar
Marc Lehmann committed
537
538
539
         *{$AUTOLOAD} = sub {
            shift unless ref $_[0];
            unshift @_, $sub;
Marc Lehmann's avatar
Marc Lehmann committed
540
541
542
            #goto &gimp_call_procedure; # does not work, PERLBUG! #FIXME
            my @r = eval { gimp_call_procedure (@_) };
            recroak $@ if $@; wantarray ? @r : $r[0];
Marc Lehmann's avatar
Marc Lehmann committed
543
         };
Marc Lehmann's avatar
Marc Lehmann committed
544
         goto &$AUTOLOAD;
Marc Lehmann's avatar
Marc Lehmann committed
545
546
      }
   }
Marc Lehmann's avatar
Marc Lehmann committed
547
   croak __"function/macro \"$name\" not found in $class";
Marc Lehmann's avatar
Marc Lehmann committed
548
549
550
551
552
}

sub _pseudoclass {
  my ($class, @prefixes)= @_;
  unshift(@prefixes,"");
Marc Lehmann's avatar
Marc Lehmann committed
553
554
555
556
  *{"Gimp::$class\::AUTOLOAD"} = \&AUTOLOAD;
  push(@{"$class\::ISA"}		, "Gimp::$class");
  push(@{"Gimp::$class\::PREFIXES"}	, @prefixes); @prefixes=@{"Gimp::$class\::PREFIXES"};
  push(@{"$class\::PREFIXES"}		, @prefixes); @prefixes=@{"$class\::PREFIXES"};
Marc Lehmann's avatar
Marc Lehmann committed
557
558
}

Marc Lehmann's avatar
Marc Lehmann committed
559
560
561
_pseudoclass qw(Layer		gimp_layer_ gimp_drawable_ gimp_floating_sel_ gimp_image_ gimp_ plug_in_ perl_fu_);
_pseudoclass qw(Image		gimp_image_ gimp_drawable_ gimp_ plug_in_ perl_fu_);
_pseudoclass qw(Drawable	gimp_drawable_ gimp_layer_ gimp_channel_ gimp_image_ gimp_ plug_in_ perl_fu_);
Marc Lehmann's avatar
Marc Lehmann committed
562
_pseudoclass qw(Selection 	gimp_selection_);
Marc Lehmann's avatar
Marc Lehmann committed
563
_pseudoclass qw(Channel		gimp_channel_ gimp_drawable_ gimp_selection_ gimp_image_ gimp_ plug_in_ perl_fu_);
Marc Lehmann's avatar
Marc Lehmann committed
564
565
566
567
568
569
_pseudoclass qw(Display		gimp_display_ gimp_);
_pseudoclass qw(Plugin		plug_in_);
_pseudoclass qw(Gradients	gimp_gradients_);
_pseudoclass qw(Edit		gimp_edit_);
_pseudoclass qw(Progress	gimp_progress_);
_pseudoclass qw(Region		);
Marc Lehmann's avatar
Marc Lehmann committed
570
_pseudoclass qw(Parasite	);
Marc Lehmann's avatar
Marc Lehmann committed
571
572

# "C"-Classes
Marc Lehmann's avatar
Marc Lehmann committed
573
_pseudoclass qw(GDrawable	gimp_gdrawable_ gimp_drawable_);
Marc Lehmann's avatar
Marc Lehmann committed
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
_pseudoclass qw(PixelRgn	gimp_pixel_rgn_);
_pseudoclass qw(Tile		gimp_tile_);

# Classes without GIMP-Object
_pseudoclass qw(Palette		gimp_palette_);
_pseudoclass qw(Brushes		gimp_brushes_);
_pseudoclass qw(Edit		gimp_edit_);
_pseudoclass qw(Gradients	gimp_gradients_);
_pseudoclass qw(Patterns	gimp_patterns_);

package Gimp::Tile;

unshift (@Tile::ISA, "Gimp::Tile");

package Gimp::PixelRgn;

push(@PixelRgn::ISA, "Gimp::PixelRgn");

sub new($$$$$$$$) {
   shift;
   init Gimp::PixelRgn(@_);
}

package Gimp::Parasite;

sub is_type($$)		{ $_[0]->[0] eq $_[1] }
Marc Lehmann's avatar
Marc Lehmann committed
600
sub is_persistent($)	{ $_[0]->[1] & &Gimp::PARASITE_PERSISTENT }
Marc Lehmann's avatar
Marc Lehmann committed
601
sub is_error($)		{ !defined $_[0]->[0] }
Marc Lehmann's avatar
Marc Lehmann committed
602
sub has_flag($$)	{ $_[0]->[1] & $_[1] }
Marc Lehmann's avatar
Marc Lehmann committed
603
sub copy($)		{ [@{$_[0]}] }
Marc Lehmann's avatar
Marc Lehmann committed
604
605
606
607
608
609
sub name($)		{ $_[0]->[0] }
sub flags($)		{ $_[0]->[1] }
sub data($)		{ $_[0]->[2] }
sub compare($$)		{ $_[0]->[0] eq $_[1]->[0] and
			  $_[0]->[1] eq $_[1]->[1] and 
			  $_[0]->[2] eq $_[1]->[2] }
Marc Lehmann's avatar
Marc Lehmann committed
610
sub new($$$$)		{ shift; [@_] }
Marc Lehmann's avatar
Marc Lehmann committed
611

Marc Lehmann's avatar
Marc Lehmann committed
612
613
614
615
616
617
618
package Gimp::run_mode;

# I guess I now use almost every perl feature available ;)

use overload fallback => 1,
             '0+'     => sub { ${$_[0]} };

Marc Lehmann's avatar
Marc Lehmann committed
619
620
621
622
623
624
625
626
627
628
package Gimp; # for __DATA__

1;

=cut

=head1 NAME

Gimp - Perl extension for writing Gimp Extensions/Plug-ins/Load & Save-Handlers

Marc Lehmann's avatar
Marc Lehmann committed
629
630
631
This is mostly a reference manual. For a quick intro, look at
L<Gimp::Fu>. For more information, including tutorials, look at the
Gimp-Perl pages at http://gimp.pages.de.
Marc Lehmann's avatar
Marc Lehmann committed
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657

=head1 RATIONALE

Well, scheme (which is used by script-fu), is IMnsHO the crappiest language
ever (well, the crappiest language that one actually can use, so it's not
_that_ bad). Scheme has the worst of all languages, no data types, but still
using variables. Look at haskell (http://www.haskell.org) to see how
functional is done right.

Since I was unable to write a haskell interface (and perl is the traditional
scripting language), I wrote a Perl interface instead. Not too bad a
decision I believe...

=head1 SYNOPSIS

  use Gimp;
  
  Other modules of interest:
  
  use Gimp::Fu;		# easy scripting environment
  use Gimp::PDL;	# interface to the Perl Data Language
  
  these have their own manpage.

=head2 IMPORT TAGS

Marc Lehmann's avatar
Marc Lehmann committed
658
If you don't specify any import tags, Gimp assumes C<qw/:consts main xlfd_size/>
Marc Lehmann's avatar
Marc Lehmann committed
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
which is usually what you want.

=over 4

=item :auto

Import useful constants, like RGB, RUN_NONINTERACTIVE... as well as all
libgimp and pdb functions automagically into the caller's namespace. BEWARE!
This will overwrite your AUTOLOAD function, if you have one!

=item :param

Import PARAM_* constants (PARAM_INT32, PARAM_STRING etc.) only.

=item :consts

All constants from gimpenums.h (BG_IMAGE_FILL, RUN_NONINTERACTIVE, NORMAL_MODE, PARAM_INT32 etc.).

Marc Lehmann's avatar
Marc Lehmann committed
677
678
679
680
=item spawn_options=I<options>

Set default spawn options to I<options>, see L<Gimp::Net>.

Marc Lehmann's avatar
Marc Lehmann committed
681
=item :DEFAULT
Marc Lehmann's avatar
Marc Lehmann committed
682
683
684

The default set (see below).

Marc Lehmann's avatar
Marc Lehmann committed
685
686
=back

Marc Lehmann's avatar
Marc Lehmann committed
687
688
The default (unless '' is specified) is C<'main', 'xlfd_size', ':consts', '__'>.
(C<'__'> is used for i18n purposes).
Marc Lehmann's avatar
Marc Lehmann committed
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716

=head1 GETTING STARTED

You should first read the Gimp::Fu manpage and then come back. This manpage is mainly
intended for reference purposes.

Also, Dov Grobgeld has written an excellent tutorial for Gimp-Perl. You can
find it at http://imagic.weizmann.ac.il/~dov/gimp/perl-tut.html

=head1 DESCRIPTION

I think you already know what this is about: writing Gimp
plug-ins/extensions/scripts/file-handlers/standalone-scripts, just about
everything you can imagine in perl. If you are missing functionality (look
into TODO first), please feel free contact the author...

Some hilights:

=over 2

=item *
Networked plug-ins and plug-ins using the libgimp interfaces (i.e. to be
started from within The Gimp) look almost the same (if you use the Gimp::Fu
interface, there will be no visible differences at all), you can easily
create hybrid (networked & libgimp) scripts as well.

=item *
Use either a plain pdb (scheme-like) interface or nice object-oriented
Marc Lehmann's avatar
Marc Lehmann committed
717
syntax, i.e. "gimp_image_new(600,300,RGB)" is the same as "new Image(600,300,RGB)"
Marc Lehmann's avatar
Marc Lehmann committed
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742

=item *
Gimp::Fu will start The Gimp for you, if it cannot connect to an existing
gimp process.

=item *
You can optionally overwrite the pixel-data functions by versions using piddles
(see L<Gimp::PDL>)

=back

noteworthy limitations (subject to be changed):

=over 2

=item *
callback procedures do not poass return values to The Gimp.

=back

=head1 OUTLINE OF A GIMP PLUG-IN

All plug-ins (and extensions etc.) _must_ contain a call to C<Gimp::main>.
The return code should be immediately handed out to exit:

Marc Lehmann's avatar
Marc Lehmann committed
743
 exit main;		# Gimp::main is exported by default.
Marc Lehmann's avatar
Marc Lehmann committed
744
745
746

Before the call to C<Gimp::main>, I<no> other PDB function must be called.

Marc Lehmann's avatar
Marc Lehmann committed
747
In a C<Gimp::Fu>-script, you should call C<Gimp::Fu::main> instead:
Marc Lehmann's avatar
Marc Lehmann committed
748

Marc Lehmann's avatar
Marc Lehmann committed
749
 exit main;		# Gimp::Fu::main is exported by default as well.
Marc Lehmann's avatar
Marc Lehmann committed
750
751

This is similar to Gtk, Tk or similar modules, where you have to call the
Marc Lehmann's avatar
Marc Lehmann committed
752
753
754
755
756
757
758
759
main eventloop. Attention: although you call C<exit> with the result of
C<main>, the main function might not actually return. This depends on both
the version of Gimp and the version of the Gimp-Perl module that is in
use.  Do not depend on C<main> to return at all, but still call C<exit>
immediately.

If you need to do cleanups before exiting you should use the C<quit>
callback (which is not yet available if you use Gimp::Fu).
Marc Lehmann's avatar
Marc Lehmann committed
760
761
762

=head1 CALLBACKS

Marc Lehmann's avatar
Marc Lehmann committed
763
764
765
THIS SECTION IS OUTDATED AND WILL BE REWORKED SOON. USE Gimp::Fu or READ
THE SOURCE :(

Marc Lehmann's avatar
Marc Lehmann committed
766
If you use the plain Gimp module (as opposed to Gimp::Fu), your program
Marc Lehmann's avatar
Marc Lehmann committed
767
should only call one function: C<main>. Everything else is going to be
Marc Lehmann's avatar
Marc Lehmann committed
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
B<called> from The Gimp at a later stage. For this to work, you should
define certain call-backs in the same module you called C<Gimp::main>:

=over 4

=item init (), query (), quit ()

the standard libgimp callback functions. C<run>() is missing, because this
module will directly call the function you registered with
C<gimp_install_procedure>. Some only make sense for extensions, some
only for normal plug-ins.

=item <installed_procedure>()

The callback for a registered function (C<gimp_install_procedure> and
friends). The arguments from The Gimp are passed as normal arguments
(with the exception of arrays being passed without a preceding count).

The return values from <installed_procedure>() are checked against the
specification, with the exception that a single C<undef> is treated like no
arguments. you can return less, but not more results than specified.

If you C<die> within the callback, the error will be reported to The Gimp
(as soon as The Gimp implements such a functionality) as an execution error.

=item net ()

this is called when the plug-in is not started directly from within the
Marc Lehmann's avatar
Marc Lehmann committed
796
Gimp, but instead from the B<Net-Server> (the perl network server extension you
Marc Lehmann's avatar
Marc Lehmann committed
797
798
799
800
801
802
803
804
805
806
hopefully have installed and started ;)

=back

=head1 CALLING GIMP FUNCTIONS

There are two different flavours of gimp-functions. Functions from the
B<PDB> (the Procedural DataBase), and functions from B<libgimp> (the
C-language interface library).

Marc Lehmann's avatar
Marc Lehmann committed
807
808
809
810
811
812
You can get a listing and description of every PDB function by starting
the B<DB Browser> extension in the Gimp-B<Xtns> menu (but remember that
B<DB Browser> is buggy and displays "_" (underscores) as "-" (dashes), so
you can't see the difference between gimp_quit and gimp-quit. As a rule
of thumb, B<Script-Fu> in gimp versions before 1.2 registers scripts with
dashes, and everything else uses underscores).
Marc Lehmann's avatar
Marc Lehmann committed
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837

B<libgimp> functions can't be traced (and won't be traceable in the
foreseeable future).

To call pdb functions (or equivalent libgimp functions), just treat them like
normal perl (this requires the use of the C<:auto> import tag, but see below
for another possibility!):

 gimp_palette_set_foreground([20,5,7]);
 gimp_palette_set_background("cornsilk");

If you don't use the C<:auto> import tag, you can call all Gimp functions
using OO-Syntax:

 Gimp->gimp_palette_set_foreground([20,5,7]);
 Gimp->palette_set_background("cornsilk");
 Palette->set_foreground('#1230f0');

As you can see, you can also drop part of the name prefixes with this
syntax, so its actually shorter to write.

"But how do I call functions containing dashes?". Well, get your favourite
perl book and learn perl! Anyway, newer perls understand a nice syntax (see
also the description for C<gimp_call_procedure>):

Marc Lehmann's avatar
Marc Lehmann committed
838
 "Gimp::plug-in-the-egg"->(RUN_INTERACTIVE,$image,$drawable);
Marc Lehmann's avatar
Marc Lehmann committed
839

Marc Lehmann's avatar
Marc Lehmann committed
840
841
You can drop the C<Gimp::> when using the C<:auto>-import-tag. Very
(very!) old perls may need:
Marc Lehmann's avatar
Marc Lehmann committed
842

Marc Lehmann's avatar
Marc Lehmann committed
843
 &{"Gimp::plug-in-the-egg"}("Gimp",RUN_INTERACTIVE,$image,$drawable);
Marc Lehmann's avatar
Marc Lehmann committed
844
845
846
847
848
849
850

(unfortunately. the plug-in in this example is actually called
"plug_in_the_egg" *sigh*)

=head1 SPECIAL FUNCTIONS

In this section, you can find descriptions of special functions, functions
Marc Lehmann's avatar
Marc Lehmann committed
851
852
853
854
having different calling conventions/semantics than I would expect (I
cannot speak for you), or just plain interesting functions. All of these
functions must either be imported explicitly or called using a namespace
override (C<Gimp::>), not as Methods (C<Gimp-E<gt>>).
Marc Lehmann's avatar
Marc Lehmann committed
855
856
857

=over 4

Marc Lehmann's avatar
Marc Lehmann committed
858
=item main(), Gimp::main()
Marc Lehmann's avatar
Marc Lehmann committed
859
860
861
862

Should be called immediately when perl is initialized. Arguments are not yet
supported. Initializations can later be done in the init function.

Marc Lehmann's avatar
Marc Lehmann committed
863
864
865
866
867
868
869
870
871
=item xlfd_size(fontname)

This auxillary functions parses the XLFD (usually obtained from a C<PF_FONT>
parameter) and returns its size and unit (e.g. C<(20,POINTS)>). This can
conviniently used in the gimp_text_..._fontname functions, which ignore the
size (no joke ;). Example:

 $drawable->text_fontname (50, 50, "The quick", 5, 1, xlfd_size $font, $font;

Marc Lehmann's avatar
Marc Lehmann committed
872
=item Gimp::gtk_init()
Marc Lehmann's avatar
Marc Lehmann committed
873
874
875
876
877

Initialize Gtk in a similar way the Gimp itself did it. This automatically
parses gimp's gtkrc and sets a variety of default settings (visual,
colormap, gamma, shared memory...).

Marc Lehmann's avatar
Marc Lehmann committed
878
879
880
881
882
883
884
885
886
=item Gimp::gtk_init_add { init statements ... };

Add a callback function that should be called when gtk is being
initialized (i.e. when Gimp::gtk_init is called, which should therefore be
done even in Gnome applications).

This is different to Gtk->init_add, which only gets called in Gtk->main,
which is too late for registering types.

Marc Lehmann's avatar
Marc Lehmann committed
887
=item Gimp::init([connection-argument]), Gimp::end()
Marc Lehmann's avatar
Marc Lehmann committed
888

Marc Lehmann's avatar
Marc Lehmann committed
889
890
891
These is an alternative interface that replaces the call to Gimp::main
and the net callback. At the moment it only works for the Net interface
(L<Gimp::Net>), and not as a native plug-in. Here's an example:
Marc Lehmann's avatar
Marc Lehmann committed
892
893
894
895
896
897

 use Gimp;
 
 Gimp::init;
 <do something with the gimp>

Marc Lehmann's avatar
Marc Lehmann committed
898
The optional argument to init has the same format as the GIMP_HOST variable
Marc Lehmann's avatar
Marc Lehmann committed
899
described in L<Gimp::Net>. Calling C<Gimp::end> is optional.
Marc Lehmann's avatar
Marc Lehmann committed
900

Marc Lehmann's avatar
Marc Lehmann committed
901
902
903
904
905
906
907
908
909
910
=item Gimp::lock(), Gimp::unlock()

These functions can be used to gain exclusive access to the Gimp. After
calling lock, all accesses by other clients will be blocked and executed
after the call to unlock. Calls to lock and unlock can be nested.

Currently, these functions only lock the current Perl-Server instance
against exclusive access, they are nops when used via the Gimp::Lib
interface.

Marc Lehmann's avatar
Marc Lehmann committed
911
912
=item Gimp::set_rgb_db(filespec)

Marc Lehmann's avatar
Marc Lehmann committed
913
914
915
916
917
Use the given rgb database instead of the default one. The format is
the same as the one used by the X11 Consortiums rgb database (you might
have a copy in /usr/lib/X11/rgb.txt). You can view the default database
with C<perldoc -m Gimp>, at the end of the file (the default database is
similar, but not identical to the X11 default rgb.txt)
Marc Lehmann's avatar
Marc Lehmann committed
918

Marc Lehmann's avatar
Marc Lehmann committed
919
=item Gimp::initialized()
Marc Lehmann's avatar
Marc Lehmann committed
920
921
922
923

this function returns true whenever it is safe to clal gimp functions. This is
usually only the case after gimp_main or gimp_init have been called.

Marc Lehmann's avatar
Marc Lehmann committed
924
925
926
927
928
929
930
931
932
933
=item Gimp::register_callback(gimp_function_name,perl_function)

Using this fucntion you can overwrite the standard Gimp behaviour of
calling a perl subroutine of the same name as the gimp function.

The first argument is the name of a registered gimp function that you want
to overwrite ('perl_fu_make_something'), and the second argument can be
either a name of the corresponding perl sub ('Elsewhere::make_something')
or a code reference (\&my_make).

Marc Lehmann's avatar
Marc Lehmann committed
934
935
936
937
938
939
940
941
942
943
944
=back

=head1 SPECIAL METHODS

This chapter descibes methods that behave differently than you might
expect, or methods uniquely implemented in perl (that is, not in the
PDB). All of these must be invoked using the method syntax (C<Gimp-E<gt>>
or C<$object-E<gt>>).

=over 4

Marc Lehmann's avatar
Marc Lehmann committed
945
946
947
948
949
950
=item gimp_install_procedure(name, blurb, help, author, copyright, date, menu_path, image_types, type, [params], [return_vals])

Mostly same as gimp_install_procedure. The parameters and return values for
the functions are specified as an array ref containing either integers or
array-refs with three elements, [PARAM_TYPE, \"NAME\", \"DESCRIPTION\"].

Marc Lehmann's avatar
Marc Lehmann committed
951
=item gimp_progress_init(message,[])
Marc Lehmann's avatar
Marc Lehmann committed
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984

Initializes a progress bar. In networked modules this is a no-op.

=item gimp_progress_update(percentage)

Updates the progress bar. No-op in networked modules.

=item gimp_tile_*, gimp_pixel_rgn_*, gimp_drawable_get

With these functions you can access the raw pixel data of drawables. They
are documented in L<Gimp::Pixel>, to keep this manual page short.

=item gimp_call_procedure(procname, arguments...)

This function is actually used to implement the fancy stuff. Its your basic
interface to the PDB. Every function call is eventually done through his
function, i.e.:

 gimp_image_new(args...);

is replaced by

 gimp_call_procedure "gimp_image_new",args...;

at runtime.

=item gimp_list_images, gimp_image_get_layers, gimp_image_get_channels

These functions return what you would expect: an array of images, layers or
channels. The reason why this is documented is that the usual way to return
C<PARAM_INT32ARRAY>'s would be to return a B<reference> to an B<array of
integers>, rather than blessed objects.

Marc Lehmann's avatar
Marc Lehmann committed
985
986
=item gimp_drawable_bounds drawable/gdrawable

Marc Lehmann's avatar
Marc Lehmann committed
987
Returns an array (x,y,w,h) containing the upper left corner and the
Marc Lehmann's avatar
Marc Lehmann committed
988
989
990
size of currently selected parts of the drawable, just as needed by
PixelRgn->new and similar functions.

Marc Lehmann's avatar
Marc Lehmann committed
991
=item server_eval(string)
Marc Lehmann's avatar
Marc Lehmann committed
992

Marc Lehmann's avatar
Marc Lehmann committed
993
994
995
996
997
This evaluates the given string in array context and returns the
results. It's similar to C<eval>, but with two important differences: the
evaluating always takes place on the server side/server machine (which
might be the same as the local one) and compilation/runtime errors are
reported as runtime errors (i.e. throwing an exception).
Marc Lehmann's avatar
Marc Lehmann committed
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017

=back

=head1 OBJECT ORIENTED SYNTAX

In this manual, only the plain syntax (that lesser languages like C use) is
described. Actually, the recommended way to write gimp scripts is to use the
fancy OO-like syntax you are used to in perl (version 5 at least ;). As a
fact, OO-syntax saves soooo much typing as well. See L<Gimp::OO> for
details.

=head1 DEBUGGING AIDS

No, I can't tell you how to cure immune deficiencies (which might well be
uncurable, as AIDS virii might be able to survive in brain cells, among
other unreachable (for medication) parts of your body), but I I<can> tell
you how Gimp can help you debugging your scripts:

=over 4

Marc Lehmann's avatar
Marc Lehmann committed
1018
=item Gimp::set_trace (tracemask)
Marc Lehmann's avatar
Marc Lehmann committed
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056

Tracking down bugs in gimp scripts is difficult: no sensible error messages.
If anything goes wrong, you only get an execution failure. Switch on
tracing to see which parameters are used to call pdb functions.

This function is never exported, so you have to qualify it when calling.

tracemask is any number of the following flags or'ed together.

=over 8

=item TRACE_NONE

nothing is printed.

=item TRACE_CALL

all pdb calls (and only pdb calls!) are printed
with arguments and return values.

=item TRACE_TYPE

the parameter types are printed additionally.

=item TRACE_NAME

the parameter names are printed.

=item TRACE_DESC

the parameter descriptions.

=item TRACE_ALL

all of the above.

=back

Marc Lehmann's avatar
Marc Lehmann committed
1057
1058
C<set_trace> returns the old tracemask.

Marc Lehmann's avatar
Marc Lehmann committed
1059
=item Gimp::set_trace(\$tracevar)
Marc Lehmann's avatar
Marc Lehmann committed
1060
1061
1062
1063
1064

write trace into $tracevar instead of printing it to STDERR. $tracevar only
contains the last command traces, i.e. it's cleared on every PDB invocation
invocation.

Marc Lehmann's avatar
Marc Lehmann committed
1065
=item Gimp::set_trace(*FILEHANDLE)
Marc Lehmann's avatar
Marc Lehmann committed
1066
1067
1068

write trace to FILEHANDLE instead of STDERR.

Marc Lehmann's avatar
Marc Lehmann committed
1069
1070
=back

Marc Lehmann's avatar
Marc Lehmann committed
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
=head1 SUPPORTED GIMP DATA TYPES

Gimp supports different data types like colors, regions, strings. In
perl, these are represented as:

=over 4

=item INT32, INT16, INT8, FLOAT, STRING

normal perl scalars. Anything except STRING will be mapped
to a perl-double.

=item INT32ARRAY, INT16ARRAY, INT8ARRAY, FLOATARRAY, STRINGARRAY

array refs containing scalars of the same type, i.e. [1, 2, 3, 4]. Gimp
implicitly swallows or generates a preceeding integer argument because the
preceding argument usually (this is a de-facto standard) contains the number
of elements.

=item COLOR

on input, either an array ref with 3 elements (i.e. [233,40,40]), a X11-like
string ("#rrggbb") or a colour name ("papayawhip") (see set_rgb_db).

=item DISPLAY, IMAGE, LAYER, CHANNEL, DRAWABLE, SELECTION

these will be mapped to corresponding objects (IMAGE => Gimp::Image). In trace
output you will see small integers (the image/layer/etc..-ID)

=item PARASITE

represented as an array ref [name, flags, data], where name and data should be perl strings
and flags is the numerical flag value.

=item REGION, BOUNDARY, PATH, STATUS

Not yet supported (and might never be).

=back

=head1 AUTHOR

Marc Lehmann <pcg@goof.com>

=head1 SEE ALSO

Marc Lehmann's avatar
Marc Lehmann committed
1117
perl(1), gimp(1), L<Gimp::OO>, L<Gimp::Data>, L<Gimp::Pixel>, L<Gimp::PDL>, L<Gimp::Util>, L<Gimp::UI>, L<Gimp::Feature>, L<Gimp::Net>,
Marc Lehmann's avatar
Marc Lehmann committed
1118
L<Gimp::Compat>, L<Gimp::Config>, L<Gimp::Lib>, L<Gimp::Module>, L<scm2perl> and L<scm2scm>.
Marc Lehmann's avatar
Marc Lehmann committed
1119
1120
1121
1122

=cut

__DATA__
Marc Lehmann's avatar
Marc Lehmann committed
1123
240 248 255		AliceBlue
Marc Lehmann's avatar
Marc Lehmann committed
1124
250 235 215		AntiqueWhite
Marc Lehmann's avatar
Marc Lehmann committed
1125
1126
1127
1128
255 239 219		AntiqueWhite1
238 223 204		AntiqueWhite2
205 192 176		AntiqueWhite3
139 131 120		AntiqueWhite4
Marc Lehmann's avatar
Marc Lehmann committed
1129
255 235 205		BlanchedAlmond
Marc Lehmann's avatar
Marc Lehmann committed
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
138  43 226		BlueViolet
 95 153 159		CadetBlue
152 245 255		CadetBlue1
142 229 238		CadetBlue2
122 197 205		CadetBlue3
 83 134 139		CadetBlue4
 34  34 152		CornflowerBlue
0     0 139		DarkBlue
0   139 139		DarkCyan
184 134  11		DarkGoldenrod
255 185	 15		DarkGoldenrod1
238 173	 14		DarkGoldenrod2
205 149	 12		DarkGoldenrod3
139 101	  8		DarkGoldenrod4
169 169 169		DarkGray
  0  83   0		DarkGreen
169 169 169		DarkGrey
189 183 107		DarkKhaki
139   0 139		DarkMagenta
 85 107  47		DarkOliveGreen
202 255 112		DarkOliveGreen1
188 238 104		DarkOliveGreen2
162 205	 90		DarkOliveGreen3
110 139	 61		DarkOliveGreen4
255 127   0		DarkOrange
255 127	  0		DarkOrange1
238 118	  0		DarkOrange2
205 102	  0		DarkOrange3
139  69	  0		DarkOrange4
153  50 204		DarkOrchid
191  62 255		DarkOrchid1
178  58 238		DarkOrchid2
154  50 205		DarkOrchid3
104  34 139		DarkOrchid4
139   0   0		DarkRed
233 150 122		DarkSalmon
143 188 143		DarkSeaGreen
193 255 193		DarkSeaGreen1
180 238 180		DarkSeaGreen2
155 205 155		DarkSeaGreen3
105 139 105		DarkSeaGreen4
 72  61 139		DarkSlateBlue
Marc Lehmann's avatar
Marc Lehmann committed
1172
 47  79  79		DarkSlateGray
Marc Lehmann's avatar
Marc Lehmann committed
1173
1174
1175
1176
151 255 255		DarkSlateGray1
141 238 238		DarkSlateGray2
121 205 205		DarkSlateGray3
 82 139 139		DarkSlateGray4
Marc Lehmann's avatar
Marc Lehmann committed
1177
 47  79  79		DarkSlateGrey
Marc Lehmann's avatar
Marc Lehmann committed
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
  0 195 205		DarkTurquoise
148   0 211		DarkViolet
255  20 147		DeepPink
255  20 147		DeepPink1
238  18 137		DeepPink2
205  16 118		DeepPink3
139  10	 80		DeepPink4
  0 191 255		DeepSkyBlue
  0 191 255		DeepSkyBlue1
  0 178 238		DeepSkyBlue2
  0 154 205		DeepSkyBlue3
  0 104 139		DeepSkyBlue4
Marc Lehmann's avatar
Marc Lehmann committed
1190
1191
1192
105 105 105		DimGray
105 105 105		DimGrey
 30 144 255		DodgerBlue
Marc Lehmann's avatar
Marc Lehmann committed
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
 30 144 255		DodgerBlue1
 28 134 238		DodgerBlue2
 24 116 205		DodgerBlue3
 16  78 139		DodgerBlue4
 58  95 205		FlatMediumBlue
 72 118 255		FlatMediumBlue1
 67 110 238		FlatMediumBlue2
 58  95 205		FlatMediumBlue3
 39  64 139		FlatMediumBlue4
143 188 143		FlatMediumGreen
193 255 193		FlatMediumGreen1
180 238 180		FlatMediumGreen2
155 205 155		FlatMediumGreen3
105 139 105		FlatMediumGreen4
255 250 240		FloralWhite
Marc Lehmann's avatar
Marc Lehmann committed
1208
 34 139  34		ForestGreen
Marc Lehmann's avatar
Marc Lehmann committed
1209
1210
248 248 255		GhostWhite
173 255  47		GreenYellow
Marc Lehmann's avatar
Marc Lehmann committed
1211
255 105 180		HotPink
Marc Lehmann's avatar
Marc Lehmann committed
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
255 110 180		HotPink1
238 106 167		HotPink2
205  96 144		HotPink3
139  58  98		HotPink4
139  58  58		IndianRed
255 106 106		IndianRed1
238  99	 99		IndianRed2
205  85	 85		IndianRed3
139  58	 58		IndianRed4
255 240 245		LavenderBlush
Marc Lehmann's avatar
Marc Lehmann committed
1222
1223
1224
1225
255 240 245		LavenderBlush1
238 224 229		LavenderBlush2
205 193 197		LavenderBlush3
139 131 134		LavenderBlush4
Marc Lehmann's avatar
Marc Lehmann committed
1226
1227
1228
1229
1230
1231
1232
124 252   0		LawnGreen
255 250 205		LemonChiffon
255 250 205		LemonChiffon1
238 233 191		LemonChiffon2
205 201 165		LemonChiffon3
139 137 112		LemonChiffon4
173 216 230		LightBlue
Marc Lehmann's avatar
Marc Lehmann committed
1233
1234
1235
1236
191 239 255		LightBlue1
178 223 238		LightBlue2
154 192 205		LightBlue3
104 131 139		LightBlue4
Marc Lehmann's avatar
Marc Lehmann committed
1237
1238
240 128 128		LightCoral
224 255 255		LightCyan
Marc Lehmann's avatar
Marc Lehmann committed
1239
1240
1241
1242
224 255 255		LightCyan1
209 238 238		LightCyan2
180 205 205		LightCyan3
122 139 139		LightCyan4
Marc Lehmann's avatar
Marc Lehmann committed
1243
238 221 130		LightGoldenrod
Marc Lehmann's avatar
Marc Lehmann committed
1244
1245
1246
1247
255 236 139		LightGoldenrod1
238 220 130		LightGoldenrod2
205 190 112		LightGoldenrod3
139 129	 76		LightGoldenrod4
Marc Lehmann's avatar
Marc Lehmann committed
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
250 250 210		LightGoldenrodYellow
211 211 211		LightGray
144 238 144		LightGreen
211 211 211		LightGrey
255 174 185		LightPink
255 174 185		LightPink1
238 162 173		LightPink2
205 140 149		LightPink3
139  95 101		LightPink4
255 160 122		LightSalmon
255 160 122		LightSalmon1
238 149 114		LightSalmon2
205 129	 98		LightSalmon3
139  87	 66		LightSalmon4
 32 178 170		LightSeaGreen
176 226 255		LightSkyBlue
176 226 255		LightSkyBlue1
164 211 238		LightSkyBlue2
141 182 205		LightSkyBlue3
 96 123 139		LightSkyBlue4
132 112 255		LightSlateBlue
119 136 153		LightSlateGray
119 136 153		LightSlateGrey
 176 196 222		LightSteelBlue
202 225 255		LightSteelBlue1
188 210 238		LightSteelBlue2
162 181 205		LightSteelBlue3
110 123 139		LightSteelBlue4
255 255 224		LightYellow
Marc Lehmann's avatar
Marc Lehmann committed
1277
1278
1279
1280
255 255 224		LightYellow1
238 238 209		LightYellow2
205 205 180		LightYellow3
139 139 122		LightYellow4
Marc Lehmann's avatar
Marc Lehmann committed
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
 50 205  50		LimeGreen
102 205 170		MediumAquamarine
  0   0 205		MediumBlue
107 142  35		MediumForestGreen
184 134  11		MediumGoldenrod
255 185	 15		MediumGoldenrod1
238 173	 14		MediumGoldenrod2
205 149	 12		MediumGoldenrod3
139 101	  8		MediumGoldenrod4
186  85 211		MediumOrchid
224 102 255		MediumOrchid1
209  95 238		MediumOrchid2
180  82 205		MediumOrchid3
122  55 139		MediumOrchid4
255 125 179		MediumPink
255 125 179		MediumPink1
238 116 167		MediumPink2
205 100 144		MediumPink3
139  68	 98		MediumPink4
147 112 219		MediumPurple
171 130 255		MediumPurple1
159 121 238		MediumPurple2
137 104 205		MediumPurple3
 93  71 139		MediumPurple4
 60 179 113		MediumSeaGreen
123 104 238		MediumSlateBlue
127 255   0		MediumSpringGreen
  0 227 238		MediumTurquoise
199  21 133		MediumVioletRed
 25  25 100		MidnightBlue
245 255 250		MintCream
255 228 225		MistyRose
255 228 225		MistyRose1
238 213 210		MistyRose2
205 183 181		MistyRose3
139 125 123		MistyRose4
255 222 173		NavajoWhite
255 222 173		NavajoWhite1
238 207 161		NavajoWhite2
205 179 139		NavajoWhite3
139 121	 94		NavajoWhite4
 34  34 139		NavyBlue
238 221 130		OldGoldenrod
255 236 139		OldGoldenrod1
238 220 130		OldGoldenrod2
205 190 112		OldGoldenrod3
139 129	 76		OldGoldenrod4
253 245 230		OldLace
238 238 175		OldMediumGoldenrod
255 255 187		OldMediumGoldenrod1
238 238 174		OldMediumGoldenrod2
205 205 150		OldMediumGoldenrod3
139 139 102		OldMediumGoldenrod4
107 142  35		OliveDrab
192 255	 62		OliveDrab1
179 238	 58		OliveDrab2
154 205	 50		OliveDrab3
105 139	 34		OliveDrab4
255  69   0		OrangeRed
255  69	  0		OrangeRed1
238  64	  0		OrangeRed2
205  55	  0		OrangeRed3
139  37	  0		OrangeRed4
238 232 170		PaleGoldenrod
152 251 152		PaleGreen
154 255 154		PaleGreen1
144 238 144		PaleGreen2
124 205 124		PaleGreen3
 84 139	 84		PaleGreen4
255 170 200		PalePink
175 238 238		PaleTurquoise
187 255 255		PaleTurquoise1
174 238 238		PaleTurquoise2
150 205 205		PaleTurquoise3
102 139 139		PaleTurquoise4
219 112 147		PaleVioletRed
255 130 171		PaleVioletRed1
238 121 159		PaleVioletRed2
205 104 137		PaleVioletRed3
139  71	 93		PaleVioletRed4
255 239 213		PapayaWhip
255 218 185		PeachPuff
255 218 185		PeachPuff1
238 203 173		PeachPuff2
205 175 149		PeachPuff3
139 119 101		PeachPuff4
176 224 230		PowderBlue
188 143 143		RosyBrown
Marc Lehmann's avatar
Marc Lehmann committed
1369
1370
1371
1372
255 193 193		RosyBrown1
238 180 180		RosyBrown2
205 155 155		RosyBrown3
139 105 105		RosyBrown4
Marc Lehmann's avatar
Marc Lehmann committed
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
 65 105 225		RoyalBlue
 72 118 255		RoyalBlue1
 67 110 238		RoyalBlue2
 58  95 205		RoyalBlue3
 39  64 139		RoyalBlue4
139  69  19		SaddleBrown
244 164  96		SandyBrown
 46 139  87		SeaGreen
 84 255 159		SeaGreen1
 78 238 148		SeaGreen2
 67 205 128		SeaGreen3
 46 139	 87		SeaGreen4
135 206 255		SkyBlue
135 206 255		SkyBlue1
126 192 238		SkyBlue2
108 166 205		SkyBlue3
 74 112 139		SkyBlue4
106  90 205		SlateBlue
131 111 255		SlateBlue1
122 103 238		SlateBlue2
105  89 205		SlateBlue3
 71  60 139		SlateBlue4
112 128 144		SlateGray
198 226 255		SlateGray1
185 211 238		SlateGray2
159 182 205		SlateGray3
108 123 139		SlateGray4
112 128 144		SlateGrey
  0 255 127		SpringGreen
  0 255 127		SpringGreen1
  0 238 118		SpringGreen2
  0 205 102		SpringGreen3
  0 139	 69		SpringGreen4
 70 130 180		SteelBlue
 99 184 255		SteelBlue1
 92 172 238		SteelBlue2
 79 148 205		SteelBlue3
 54 100 139		SteelBlue4
255  62 150		VioletRed
255  62 150		VioletRed1
238  58 140		VioletRed2
205  50 120		VioletRed3
139  34	 82		VioletRed4
245 245 245		WhiteSmoke
154 205  50		YellowGreen
240 248 255		alice blue
250 235 215		antique white
41 171 151		aquamarine
127 255 212		aquamarine1
118 238 198		aquamarine2
102 205 170		aquamarine3
 69 139 116		aquamarine4
240 255 255		azure
240 255 255		azure1
224 238 238		azure2
193 205 205		azure3
131 139 139		azure4
245 245 220		beige
255 228 196		bisque
255 228 196		bisque1
238 213 183		bisque2
205 183 158		bisque3
139 125 107		bisque4
0 0 0			black
255 235 205		blanched almond
0 0 255			blue
114 33 188		blue violet
  0   0 255		blue1
  0   0 238		blue2
  0   0 205		blue3
  0   0 139		blue4
103 67 0		brown
255  64	 64		brown1
238  59	 59		brown2
205  51	 51		brown3
139  35	 35		brown4
222 184 135		burlywood
Marc Lehmann's avatar
Marc Lehmann committed
1450
1451
1452
1453
255 211 155		burlywood1
238 197 145		burlywood2
205 170 125		burlywood3
139 115	 85		burlywood4
Marc Lehmann's avatar
Marc Lehmann committed
1454
1455
1456
1457
1458
1459
1460
126 125 160		cadet blue
127 255   0		chartreuse
127 255	  0		chartreuse1
118 238	  0		chartreuse2
102 205	  0		chartreuse3
 69 139	  0		chartreuse4
210 105  30		chocolate
Marc Lehmann's avatar
Marc Lehmann committed
1461
1462
1463
1464
255 127	 36		chocolate1
238 118	 33		chocolate2
205 102	 29		chocolate3
139  69	 19		chocolate4
Marc Lehmann's avatar
Marc Lehmann committed
1465
248 137 117		coral
Marc Lehmann's avatar
Marc Lehmann committed
1466
1467
1468
1469
255 114	 86		coral1
238 106	 80		coral2
205  91	 69		coral3
139  62	 47		coral4
Marc Lehmann's avatar
Marc Lehmann committed
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
100 149 237		cornflower blue
255 248 220		cornsilk
255 248 220		cornsilk1
238 232 205		cornsilk2
205 200 177		cornsilk3
139 136 120		cornsilk4
0 255 255		cyan
  0 255 255		cyan1
  0 238 238		cyan2
  0 205 205		cyan3
  0 139 139		cyan4
0     0 139		dark blue
0   139 139		dark cyan
184 134  11		dark goldenrod
169 169 169		dark gray
0 83 0			dark green
169 169 169		dark grey
189 183 107		dark khaki
139   0 139		dark magenta
79 79 47		dark olive green
255 127   0		dark orange
106 37 102		dark orchid
139   0   0		dark red
233 150 122		dark salmon
143 188 143		dark sea green
51 62 99		dark slate blue
60 64 74		dark slate gray
60 64 74		dark slate grey
29 111 117		dark turquoise
148   0 211		dark violet
255  20 147		deep pink
  0 191 255		deep sky blue
105 105 105		dim gray
105 105 105		dim grey
 30 144 255		dodger blue
136 18 13		firebrick
255  48	 48		firebrick1
238  44	 44		firebrick2
205  38	 38		firebrick3
139  26	 26		firebrick4
 58  95 205		flat medium blue
143 188 143		flat medium green
255 250 240		floral white
85 192 52		forest green
220 220 220		gainsboro
248 248 255		ghost white
254 197 68		gold
255 215	  0		gold1
238 201	  0		gold2
205 173	  0		gold3
139 117	  0		gold4
218 165 32		goldenrod
255 193	 37		goldenrod1
238 180	 34		goldenrod2
205 155	 29		goldenrod3
139 105	 20		goldenrod4
174 174 174		gray
0 0 0 			gray0
3 3 3 			gray1
26 26 26 		gray10
255 255 255 		gray100
28 28 28 		gray11
31 31 31 		gray12
33 33 33 		gray13
36 36 36 		gray14
38 38 38 		gray15
41 41 41 		gray16
43 43 43 		gray17
46 46 46 		gray18
48 48 48 		gray19
5 5 5 			gray2
51 51 51 		gray20
54 54 54 		gray21
56 56 56 		gray22
59 59 59 		gray23
61 61 61 		gray24
64 64 64 		gray25
66 66 66 		gray26
69 69 69 		gray27
71 71 71 		gray28
74 74 74 		gray29
8 8 8 			gray3
77 77 77 		gray30
79 79 79 		gray31
82 82 82 		gray32
84 84 84 		gray33
87 87 87 		gray34
89 89 89 		gray35
92 92 92 		gray36
94 94 94 		gray37
97 97 97 		gray38
99 99 99 		gray39
10 10 10 		gray4
Marc Lehmann's avatar
Marc Lehmann committed
1563
102 102 102 		gray40
Marc Lehmann's avatar
Marc Lehmann committed
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583