see plug-ins/perl/Changes

This commit is contained in:
Marc Lehmann 1999-12-10 03:58:02 +00:00
parent d76e551cc7
commit 7db2e70126
12 changed files with 251 additions and 173 deletions

View file

@ -22,6 +22,8 @@ Revision history for Gimp-Perl extension.
- move perl-intl.h include below the other includes. William Sebok
finally came up with a nice problem analysis.
- try to get rid of -Wall, if possible.
- shield more sections against -w dumbness.
- updated many of seth's scripts.
1.17 Wed Nov 24 21:25:19 CET 1999
- re-fitted i18n translation for most plug-ins.

View file

@ -395,36 +395,48 @@ sub callback {
local $function = shift;
local $in_run = 1;
_initialized_callback;
@cb = (
@{$callback{run}},
@{$callback{lib}},
@{$callback{$function}},
);
{
local $^W = 0;
@cb = (
@{$callback{run}},
@{$callback{lib}},
@{$callback{$function}},
);
}
die_msg __"required callback 'run' not found\n" unless @cb;
for (@cb) { &$_ }
} elsif ($type eq "-net") {
local $in_net = 1;
_initialized_callback;
@cb = (
@{$callback{run}},
@{$callback{net}},
@{$callback{$function}},
);
{
local $^W = 0;
@cb = (
@{$callback{run}},
@{$callback{net}},
@{$callback{$function}},
);
}
die_msg __"required callback 'net' not found\n" unless @cb;
for (@cb) { &$_ }
} elsif ($type eq "-query") {
local $in_query = 1;
_initialized_callback;
@cb = (
@{$callback{query}},
);
{
local $^W = 0;
@cb = (
@{$callback{query}},
);
}
die_msg __"required callback 'query' not found\n" unless @cb;
for (@cb) { &$_ }
} elsif ($type eq "-quit") {
local $in_quit = 1;
@cb = (
@{$callback{quiet}},
);
{
local $^W = 0;
@cb = (
@{$callback{quiet}},
);
}
for (@cb) { &$_ }
}
}

View file

@ -192,7 +192,7 @@ static int gdrawable_free (SV *obj, MAGIC *mg)
{
GDrawable *gdr = (GDrawable *)SvIV(obj);
g_hash_table_remove (gdrawable_cache, &gdr->id);
g_hash_table_remove (gdrawable_cache, (gpointer)gdr->id);
gimp_drawable_detach (gdr);
return 0;
@ -206,9 +206,11 @@ static SV *new_gdrawable (gint32 id)
SV *sv;
if (!gdrawable_cache)
gdrawable_cache = g_hash_table_new (g_int_hash, g_int_equal);
gdrawable_cache = g_hash_table_new (g_direct_hash, g_direct_equal);
if ((sv = (SV*)g_hash_table_lookup (gdrawable_cache, &id)))
assert (sizeof (gpointer) >= sizeof (id));
if ((sv = (SV*)g_hash_table_lookup (gdrawable_cache, (gpointer)id)))
SvREFCNT_inc (sv);
else
{
@ -224,7 +226,7 @@ static SV *new_gdrawable (gint32 id)
sv_magic (sv, 0, '~', 0, 0);
mg_find (sv, '~')->mg_virtual = &vtbl_gdrawable;
g_hash_table_insert (gdrawable_cache, &id, (gpointer)sv);
g_hash_table_insert (gdrawable_cache, (gpointer)id, (void *)sv);
}
return sv_bless (newRV_noinc (sv), stash);

View file

@ -18,32 +18,54 @@ use Gimp::Util;
# Gimp::set_trace(TRACE_ALL);
# find an equivalent polar value in the range of 0 to 2 pi
sub find_in_2pi
{
my ($ang) = @_;
if ($ang < 0)
{
return ($ang - int($ang/(2*3.1415926))*2*3.1415926 + 2*3.1415926);
}
return ($ang - int($ang/(2*3.1415926))*2*3.1415926);
}
# actual script
register "burst",
"Bursts from a central location",
"Bursts from a central location\n",
"Creates a Burst of various sizes from the center of the currently
selected areas. Can create either an elliptical burst, or go to sqare
spots. Also, you can specify how much (in pixels) to leave blank on
the inside and the outside of the burst.",
selected areas. Can create either an elliptical burst, or some portion
of said burst. Also, you can specify how much (in pixels) to leave blank on
the inside and the outside of the burst. This uses whatever the current
brush settings are, and lets you control which direction to have it draw the
fades from if you have Fade set\n",
"Seth Burgess",
"Seth Burgess <sjburges\@gimp.org>",
"1999-07-31",
N_"<Image>/Filters/Misc/Burst",
N_"<Image>/Filters/Render/Burst...",
"*",
[
[PF_RADIO, "shape", "Shape To Burst Into", 0, [Rectangle => 1, Ellipse=> 0]],
[PF_RADIO, "fade_dir", "Fade Direction (if set)", 0, [In => 1, Out => 0]],
[PF_VALUE, 'points', "How many points", "16"],
[PF_VALUE, 'inside_pixels', "Inside Pixels", "10"],
[PF_VALUE, 'outside_pixels', "Outside Pixels", "10"]
[PF_RADIO, "fade_dir", "Fade Direction (if fade is set)", 0, [In => 1, Out => 0]],
[PF_VALUE, 'spokes', "How many spokes", 16],
[PF_VALUE, 'inside_pixels', "Inside Pixels", 10],
[PF_VALUE, 'outside_pixels', "Outside Pixels", 10],
[PF_SLIDER, 'start_angle', "Angle to start at, with 0 being left sweeping counter-clockwise.", 0, [-360, 360, 1]],
[PF_SLIDER, 'end_angle', "Angle to end at, with 0 being left sweeping counter-clockwise.", 360, [-360, 360, 1]]
],
[],
[],
sub {
my($img,$layer,$shape, $fade_dir, $points, $inside_pixels, $outside_pixels) =@_;
my($img,$layer, $shape, $fade_dir, $points,
$inside_pixels, $outside_pixels, $start_angle, $end_angle) =@_;
$pi = 3.1415927;
eval { $img->undo_push_group_start };
Gimp->progress_init("Burst");
$progress_increment = 1/$points;
$progress = 0;
($dumb, $x1, $y1, $x2, $y2) = $img->selection_bounds;
$img->selection_none;
@ -54,133 +76,162 @@ the inside and the outside of the burst.",
$center_x = $x1 + $width/2;
$center_y = $y1 + $height/2;
if ($start_angle > $end_angle)
{ # swap them
$angle = $end_angle;
$end_angle = $start_angle;
$start_angle = $angle;
}
if ($shape == 0)
{ #ellipse
$angle = 0;
for ($i = 0; $angle <2*$pi-0.01; $i++ )
{
$angle = $i * 2*$pi/$points;
# use the major/minor axis description of an ellipse:
# x^2 y^2
# --- + --- = 1
# a^2 b^2
#
# where a is the x axis, b is the y axis, and the equation of
# a line passing through 0 (y=mb). Solve for x&y, and pick the
# correct one for the angle.
# the for loop just increments $i until $angle is big enough
for ($i = 0, $angle=$start_angle*$pi/180;
$angle <$end_angle*$pi/180-0.01;
$i++ )
{
$angle = $i * abs($start_angle-$end_angle)*$pi/$points/180;
$angle += $start_angle*$pi/180;
# use the major/minor axis description of an ellipse:
# x^2 y^2
# --- + --- = 1
# a^2 b^2
#
# where a is the x axis, b is the y axis, and the equation of
# a line passing through 0 (y=mb). Solve for x&y, and pick the
# correct one for the angle.
$a = $width/2 - $outside_pixels;
$b = $height/2 - $outside_pixels;
$a = $width/2 - $outside_pixels;
$b = $height/2 - $outside_pixels;
# dimensions for an "inside ellipse"
$c = ($a>$b)?$inside_pixels:$inside_pixels*$a/$b;
$d = ($a>$b)?$inside_pixels*$b/$a:$inside_pixels;
# dimensions for an "inside ellipse"
$c = ($a>$b)?$inside_pixels:$inside_pixels*$a/$b;
$d = ($a>$b)?$inside_pixels*$b/$a:$inside_pixels;
# get the slope
$m = sin($angle)/cos($angle);
if ($m ==0) { $m = 0.000000000001; } #avoid div by 0
if ($c ==0) { $c = 0.000000000001; } #avoid div by 0
if ($d ==0) { $d = 0.000000000001; } #avoid div by 0
# find the positive solution of the quadratic for the endpoints
$x = sqrt(1/((1/$a/$a)+($m*$m/$b/$b)));
$y = sqrt(1/((1/($m*$m*$a*$a))+(1/$b/$b)));
# get the slope
$m = sin($angle)/cos($angle);
if ($m ==0) { $m = 0.000000000001; } #avoid div by 0
if ($c ==0) { $c = 0.000000000001; } #avoid div by 0
if ($d ==0) { $d = 0.000000000001; } #avoid div by 0
# find the positive solution of the quadratic for the endpoints
$x = sqrt(1/((1/$a/$a)+($m*$m/$b/$b)));
$y = sqrt(1/((1/($m*$m*$a*$a))+(1/$b/$b)));
# and find the starting points in the same manner
$x_start = sqrt(1/((1/$c/$c)+($m*$m/$d/$d)));
$y_start = sqrt(1/((1/($m*$m*$c*$c))+(1/$d/$d)));
# and find the starting points in the same manner
$x_start = sqrt(1/((1/$c/$c)+($m*$m/$d/$d)));
$y_start = sqrt(1/((1/($m*$m*$c*$c))+(1/$d/$d)));
# pick the right solution of the quadratic
if ($angle < $pi/2 || $angle > 3*$pi/2)
{
$x = -$x;
$x_start = -$x_start;
}
if ($angle > $pi)
{
$y = -$y;
$y_start = -$y_start;
}
# do translations to center stuff
$x = $x + $center_x;
$y = $y + $center_y;
$x_start = $x_start + $center_x;
$y_start = $y_start + $center_y;
# pick the right solution of the quadratic
if ((find_in_2pi($angle) < $pi/2) || (find_in_2pi($angle) > 3*$pi/2))
{
$x = -$x;
$x_start = -$x_start;
}
if (find_in_2pi($angle) > $pi)
{
$y = -$y;
$y_start = -$y_start;
}
# do translations to center stuff
$x = $x + $center_x;
$y = $y + $center_y;
$x_start = $x_start + $center_x;
$y_start = $y_start + $center_y;
# print "X = $x, Y = $y, M = $m\n";
if ($fade_dir == 1)
{
$layer->paintbrush_default(4, [$x, $y, $x_start, $y_start]);
}
else
{
$layer->paintbrush_default(4, [$x_start, $y_start, $x, $y]);
}
# print "X = $x, Y = $y, M = $m\n";
if ($fade_dir == 1)
{
$layer->paintbrush_default(4, [$x, $y, $x_start, $y_start]);
}
else
{
$layer->paintbrush_default(4, [$x_start, $y_start, $x, $y]);
}
$progress += $progress_increment;
Gimp->progress_update($progress);
}
}
else
{ #rectangle
# The idea here is to see where the line intersects with the
# rightmost line. If the abs of that is higer than the height,
# see where it intersects the top instead.
# The idea here is to see where the line intersects with the
# rightmost line. If the abs of that is higer than the height,
# see where it intersects the top instead.
#print "width = $width, height = $height\n";
#print "width = $width, height = $height\n";
$angle = 0;
for ($i = 0; $angle <2*$pi-0.01; $i++ )
{
$angle = $i * 2*$pi/$points;
# get the slope
$m = sin($angle)/cos($angle);
# print "M = $m\n";
if (abs($m*$width/2) < $height/2-$outside_pixels)
{ # draw on the right/left borders
$x = $width/2-$outside_pixels;
$y = $m*($width/2-$outside_pixels);
$x_start = ($width>$height)
?$inside_pixels
:$inside_pixels*$width/$height;
$y_start = ($width>$height)
?$m*$inside_pixels
:$m*$inside_pixels*$width/$height;
}
else
{ # draw on the top/bottom borders
$y = $height/2-$outside_pixels;
$x = ($height/2-$outside_pixels)/$m;
$y_start = ($width>$height)
?$inside_pixels*$height/$width
:$inside_pixels;
$x_start = ($width>$height)
?$inside_pixels*$height/$width/$m
:$inside_pixels/$m;
}
for ($i = 0, $angle=$start_angle*$pi/180;
$angle <$end_angle*$pi/180-0.01;
$i++ )
{
$angle = $i * abs($start_angle-$end_angle)*$pi/$points/180;
$angle += $start_angle*$pi/180;
# get the slope
$m = sin($angle)/cos($angle);
# print "M = $m\n";
if (abs($m*$width/2) < $height/2-$outside_pixels)
{ # draw on the right/left borders
$x = $width/2-$outside_pixels;
$y = $m*($width/2-$outside_pixels);
$x_start = ($width>$height)
?$inside_pixels
:$inside_pixels*$width/$height;
$y_start = ($width>$height)
?$m*$inside_pixels
:$m*$inside_pixels*$width/$height;
}
else
{ # draw on the top/bottom borders
$y = $height/2-$outside_pixels;
$x = ($height/2-$outside_pixels)/$m;
$y_start = ($width>$height)
?$inside_pixels*$height/$width
:$inside_pixels;
$x_start = ($width>$height)
?$inside_pixels*$height/$width/$m
:$inside_pixels/$m;
}
# the method of finding points by lines like above makes picking right
# values kinda icky, as shown by these if statements.
if ((find_in_2pi($angle) <= $pi/2) || (find_in_2pi($angle) > 3*$pi/2))
{
$x = -abs($x);
$x_start = -abs($x_start);
}
else
{
$x = abs($x);
$x_start = abs($x_start);
}
if ($angle > $pi)
{
$x = -$x;
$y = -$y;
$x_start = -$x_start;
$y_start = -$y_start;
}
# print "X = $x, Y = $y\n";
# do translations to center stuff
$x = $x + $center_x;
$y = $y + $center_y;
$x_start = $x_start + $center_x;
$y_start = $y_start + $center_y;
if ($fade_dir == 1)
{
$layer->paintbrush_default(4, [$x, $y, $x_start, $y_start]);
}
else
{
$layer->paintbrush_default(4, [$x_start, $y_start, $x, $y]);
}
if (find_in_2pi($angle) > $pi)
{
$y = -abs($y);
$y_start = -abs($y_start);
}
else
{
$y = abs($y);
$y_start = abs($y_start);
}
# do translations to center stuff
$x = $x + $center_x;
$y = $y + $center_y;
$x_start = $x_start + $center_x;
$y_start = $y_start + $center_y;
if ($fade_dir == 1)
{
$layer->paintbrush_default(4, [$x, $y, $x_start, $y_start]);
}
else
{
$layer->paintbrush_default(4, [$x_start, $y_start, $x, $y]);
}
$progress += $progress_increment;
Gimp->progress_update($progress);
}
}
eval { $img->undo_push_group_end };

View file

@ -120,7 +120,8 @@ generally do not care for the url length.
Browser compatibility list (send more results to pcg@goof.com ;)
Netscape 3.x displays broken image icons
Netscape 4.x works on some configurations, not on others
Netscape 4.x works on some configurations (communicator!),
not on others (navigator!)
Lynx displays the base64 code as text :(
MSIE 4 thousands of error messages in dialog boxes ;->
MSIE 5 shows broken image icon

View file

@ -53,7 +53,7 @@ register "firetext",
"Marc Lehmann <pcg\@goof.com>",
"Marc Lehmann",
"19990802",
__"<Toolbox>/Xtns/Render/Logos/Firetext",
N_"<Toolbox>/Xtns/Render/Logos/Firetext",
"*",
[
[PF_TEXT, "text", "The text to render (can be multi-line)", "burn,\nBurn,\nBURN!"],

View file

@ -39,7 +39,7 @@ register "fit_text",
"Seth Burgess",
"Seth Burgess <sjburges\@gimp.org>",
"1999-03-21",
N_"<Image>/Filters/Render/Fit Text",
N_"<Image>/Filters/Render/Fit Text...",
"*",
[
[PF_FONT, "font", "What font type to use - size will be ignored", $defaultfont],
@ -51,25 +51,25 @@ register "fit_text",
$width = $x2-$x1;
$height = $y2-$y1;
@extents=gimp_text_get_extents_fontname($string,xlfd_size($xlfd),$xlfd);
@extents=Gimp->text_get_extents_fontname($string,xlfd_size($xlfd),$xlfd);
$growsize = ($extents[0]<$width && $extents[1]<$height) ? 288 : -288;
if ($growsize > 0 ) {
while ($extents[0]<$width && $extents[1]<$height) {
$xlfd = growfont($xlfd,$growsize);
@extents=gimp_text_get_extents_fontname($string,xlfd_size($xlfd),$xlfd);
@extents=Gimp->text_get_extents_fontname($string,xlfd_size($xlfd),$xlfd);
}
$xlfd = growfont($xlfd, -$growsize);
}
else {
while ($extents[0]>$width || $extents[1]>$height) {
$xlfd = growfont($xlfd,$growsize);
@extents=gimp_text_get_extents_fontname($string,xlfd_size($xlfd),$xlfd);
@extents=Gimp->text_get_extents_fontname($string,xlfd_size($xlfd),$xlfd);
}
}
while ($extents[0]<$width && $extents[1]<$height) {
$xlfd = growfont($xlfd,144); # precision for the last bit
@extents=gimp_text_get_extents_fontname($string,xlfd_size($xlfd),$xlfd);
@extents=Gimp->text_get_extents_fontname($string,xlfd_size($xlfd),$xlfd);
}
$xlfd = growfont($xlfd, -144);

View file

@ -71,7 +71,7 @@ register "contrast_enhance_2x2",
"Marc Lehmann",
"Marc Lehmann <pcg\@goof.com>",
"19990725",
__"<Image>/Filters/Enhance/2x2 Contrast Enhance",
N_"<Image>/Filters/Enhance/2x2 Contrast Enhance",
"RGB*, GRAY*",
[],
sub {
@ -93,7 +93,7 @@ register "edge_detect_2x2",
"Marc Lehmann",
"Marc Lehmann <pcg\@goof.com>",
"19990725",
__"<Image>/Filters/Edge-Detect/2x2 Edge Detect",
N_"<Image>/Filters/Edge-Detect/2x2 Edge Detect",
"RGB*, GRAY*",
[],
sub {

View file

@ -1,4 +1,5 @@
#!/usr/bin/perl
# <sjburges@gimp.org>
# This is tigert's request. I suppose it'll be useful to those that do
# this sort of thing. Personally I'll probably only run it to test and
@ -8,11 +9,17 @@
#
# Bruce Miller (fixed to accomdate 1.1.x changes)
# Brendon and Wendy Humphrey <brendy@swipnet.se> (progress bar, nice comments)
#
# Tuomas Kuosmanen <tigert@gimp.org>
# Fixed some things to make this work with cvs gimp. Fixed calls to
# gimp_get_guide_orientation() (guide types that changed from
# GUIDE_VERTICAL to VERTICAL and horizontal, respectively. Should
# work now). Also convert to indexed parameters changed, fixed them too.
#
# If you have more additions, etc please don't hesitate to send them in!
use Gimp qw(:auto N_);
use Gimp;
use Gimp::Fu;
use Gimp::Util;
@ -28,7 +35,7 @@ sub get_vguides {
$i=0;
my @vguides;
while ($i=$img->find_next_guide($i)) {
if ($img->get_guide_orientation($i) == &Gimp::VERTICAL_GUIDE){
if ($img->get_guide_orientation($i) == &Gimp::VERTICAL){
$keyval = sprintf("%4d", $img->get_guide_position($i));
$vkeys{$keyval} = $i;
}
@ -49,7 +56,7 @@ sub get_hguides {
$i=0;
my @hguides;
while ($i=$img->find_next_guide($i)) {
if ($img->get_guide_orientation($i) == &Gimp::HORIZONTAL_GUIDE){
if ($img->get_guide_orientation($i) == &Gimp::HORIZONTAL){
$keyval = sprintf("%4d", $img->get_guide_position($i));
$hkeys{$keyval} = $i;
}
@ -73,9 +80,12 @@ sub dosel {
# print "Cropping from $l to $r, $t to $b\n";
$tmpimg->crop($r-$l, $b-$t, $l, $t);
$tmplay = $tmpimg->active_drawable;
if (! $tmplay->indexed) {
$tmpimg->convert_indexed(1,256);
}
if (! $tmplay->is_indexed) {
# do this: fs/low-bleed dither, make palette, 256 colors,
# dont dither alpha, do remove unused (is 1 "true" here?),
# custom palette is ignored (we create our own, thus "duck" works).
$tmpimg->convert_indexed (2,0,256,0,1,duck)
}
$tmpimg->gimp_file_save(-1,"$savepath$imgpath$imgname","$savepath$imgpath$imgname");
$tmpimg->delete;
return "$imgpath$imgname"; # what I want printed in html
@ -134,7 +144,7 @@ register "perlotine",
"Seth Burgess",
"Seth Burgess <sjburges\@gimp.org>",
"1999-03-19",
N_"<Image>/Guides/Perl-o-tine",
N_"<Image>/Filters/Web/Perl-o-tine...",
"*",
[
[PF_STRING, "save_path", "The path to export the HTML to",$ENV{HOME}],
@ -159,7 +169,7 @@ register "perlotine",
# Progress Bar
#
gimp_progress_init("Perl-o-Tine");
Gimp->progress_init("Perl-o-Tine");
$progress_increment = 1/(scalar(@horz) * scalar(@vert));
$progress = 0.0;
@ -200,7 +210,7 @@ register "perlotine",
# Increment the progress bar
$progress += $progress_increment;
gimp_progress_update ($progress);
Gimp->progress_update ($progress);
}
html_table_row_end(\*FILE, $capatalize);
$top = $bot + $cellspacing;

View file

@ -17,8 +17,8 @@ sub pixelmap { # es folgt das eigentliche Skript...
$_expr =~ /\$p/ and $init.='$p = $src->data;';
$_expr =~ /\$P/ and $init.= $drawable->has_alpha ? '$P = $src->data;' : '$P = $src->data->slice("0:-1");';
$_expr =~ /\$x/ and $init.='$x = sequence(long,$w); $x+=$_dst->x;';
$_expr =~ /\$y/ and $init.='$y = sequence(long,$h); $y+=$_dst->y;';
$_expr =~ /\$x/ and $init.='$x = (zeroes(long,$w)->xvals + $_dst->x)->dummy(1,$h)->sever;';
$_expr =~ /\$y/ and $init.='$y = (zeroes(long,$h)->xvals + $_dst->y)->dummy(0,$w)->sever;';
$_expr =~ /\$bpp/ and $init.='$bpp = $_dst->bpp;';
my($p,$P,$x,$y,$bpp,$w,$h);
@ -117,11 +117,15 @@ The source pixels without alpha. Use it like this:
=item $x
A one-dimensional vector of x-coordinates currently being worked on.
A two-dimensional vector containing the x-coordinates of each point in the current tile:
$x = (zeroes(long,$w)->xvals + $destination->x)->dummy(1,$h)->sever;
=item $y
A one-dimensional vector of y-coordinates currently being worked on.
A two-dimensional vector containing the y-coordinates of each point in the current tile:
$y = (zeroes(long,$h)->xvals + $destination->y)->dummy(0,$w)->sever;
=item $bpp

View file

@ -26,7 +26,7 @@
#[terral] input levels of 0, .24, 113 [22:11]
#[terral] --end of script [22:12]
use Gimp qw(:auto N_);
use Gimp 1.06;
use Gimp::Fu;
use Gimp::Util;
@ -39,7 +39,7 @@ register
"Otherwise, it overwrites the current layer and uses a solid noise",
"Seth Burgess",
"Seth Burgess <sjburges\@gimp.org>",
"19991119",
"1999-03-15",
N_"<Image>/Filters/Render/Terral Text",
"RGB*,GRAY*",
[
@ -53,8 +53,6 @@ sub {
($img, $pattern, $solidnoise, $font, $text, $blur) = @_;
$oldbg = gimp_palette_get_background();
$oldfg = gimp_palette_get_foreground();
$img->undo_push_group_start;
if ($solidnoise) {
$pattern->plug_in_solid_noise(1,1,256*rand(), 1,2.5,2.5);
@ -98,8 +96,6 @@ sub {
$mask->levels(0, 0, 113, 0.24, 0, 255);
$img->undo_push_group_end;
palette_set_background($oldbg);
palette_set_foreground($oldfg);
return;

View file

@ -3,7 +3,7 @@
# Once again, an effect of Xach's
# Created by Seth Burgess <sjburges@gimp.org>
use Gimp;
use Gimp qw(:auto __ N_);
use Gimp::Fu;
register "xachvision",
@ -12,7 +12,7 @@ register "xachvision",
"Seth Burgess",
"Seth Burgess <sjburges\@gimp.org>",
"1999-02-28",
N_"<Image>/Filters/Noise/Xach Vision",
N_"<Image>/Filters/Noise/Xach Vision...",
"RGB*, GRAY*",
[
[PF_COLOR, "color", "What Color to see the world in", [0, 255, 0]],