1#!/usr/bin/perl -w 2 3#BEGIN { $Gimp::verbose = 1; } 4use Gimp; 5use Gimp::Fu; 6use strict; 7use warnings; 8 9podregister { 10 $drawable->become('Gimp::Layer'); 11 return if $image->selection_is_empty == 0; 12 $image->undo_group_start; 13 Gimp::Context->push(); 14 #get the drawable dimensions 15 my $xsize = $drawable->width; 16 my $ysize = $drawable->height; 17 18 Gimp::Context->set_background([128,128,128]); 19 20 # Create a grayscale workspace image for displacement map 21 my $dm = Gimp::Image->new($xsize, $ysize, 1); 22 # It needs to have 2 layers 23 my $dmlayer = Gimp::Layer->new($dm, $xsize, $ysize, GRAY_IMAGE, "newlayer", 24 100, NORMAL_MODE); 25 $dm->insert_layer($dmlayer, 0, 0); 26 27 # Create the layers, one-by-one 28 my $i = 1; 29 my $xdist = ($arithmode) ? 30 $i * $distance / $nsteps * -cos($angle * 3.14159 / 180) : 31 $distance ** ($i/$nsteps) * -cos($angle * 3.14159 / 180); 32 my $ydist = ($arithmode) ? 33 $i * $distance / $nsteps * sin($angle * 3.14159 / 180) : 34 $distance ** ($i/$nsteps) * sin($angle * 3.14159 / 180); 35 $dmlayer->edit_clear; 36 $dmlayer->noisify(0, 255, 255, 255, 0); 37 $dmlayer->levels(0, 0, 255, 1.0, 128, 255); 38 $drawable = $drawable->copy(0); 39 $image->insert_layer($drawable, 0, -1); 40 $drawable->displace($xdist, $ydist, 1, 1, $dmlayer, $dmlayer, 1); 41 $image->lower_item($drawable) if $inmode == 1; 42 for ( $i = 2; $i <= $nsteps; $i++ ) { 43 $xdist = ($arithmode) ? 44 $i * $distance / $nsteps * -cos($angle * 3.14159 / 180) : 45 $distance ** ($i/$nsteps) * -cos($angle * 3.14159 / 180); 46 $ydist = ($arithmode) ? 47 $i * $distance / $nsteps * sin($angle * 3.14159 / 180) : 48 $distance ** ($i/$nsteps) * sin($angle * 3.14159 / 180); 49 $dmlayer->edit_clear; 50 $dmlayer->noisify(0, 255, 255, 255, 0); 51 $dmlayer->levels(0, 0, 255, 1.0, 128, 255); 52 $drawable = $drawable->copy(0); 53 $image->insert_layer($drawable, 0, -1); 54 $drawable->displace($xdist, $ydist, 1, 1, $dmlayer, $dmlayer, 1); 55 $image->lower_item($drawable) if $inmode == 1; 56 } 57 58# gimp_image_remove_layer($dm, $dmlayer); 59# gimp_image_delete ($dm); 60 Gimp::Context->pop; 61 $image->undo_group_end; 62 (); 63}; 64 65exit main; 66 67__END__ 68 69=head1 NAME 70 71blowinout - Blow selected layer in/out 72 73=head1 SYNOPSIS 74 75<Image>/Filters/Animation/BlowInOut... 76 77=head1 DESCRIPTION 78 79Generates an animation thats blows the selected layer in or out. 80 81=head1 PARAMETERS 82 83 [PF_INT32, "angle", "Wind Angle, 0 is left", 120], 84 [PF_INT32, "nsteps", "Number of Steps/Layers", 5], 85 [PF_VALUE, "distance", "How far to blow",30], 86 [PF_RADIO, "inmode", "Blow direction", 0, [In => 1, Out => 0]], 87 [PF_RADIO, "arithmode", "Kind of series", 1, [Arithmetic => 1, Geometric => 0]] 88 89=head1 IMAGE TYPES 90 91* 92 93=head1 AUTHOR 94 95John Pitney <john@pitney.org> 96 97=head1 DATE 98 991999-03-15 100 101=head1 LICENSE 102 103Copyright John Pitney. 104 105Released under the same terms as Gimp-Perl. 106