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