Importing SDLPerl 2.2
[sdlgit/SDL_perl.git] / test / testgraphictool.sdlpl
1 #!/usr/bin/env perl
2 #
3 # testgraphictool.pl
4 #
5 # Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
6 #
7 # ------------------------------------------------------------------------------
8 #
9 # This library is free software; you can redistribute it and/or
10 # modify it under the terms of the GNU Lesser General Public
11 # License as published by the Free Software Foundation; either
12 # version 2.1 of the License, or (at your option) any later version.
13
14 # This library is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 # Lesser General Public License for more details.
18
19 # You should have received a copy of the GNU Lesser General Public
20 # License along with this library; if not, write to the Free Software
21 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22 #
23 # ------------------------------------------------------------------------------
24 #
25 # Please feel free to send questions, suggestions or improvements to:
26 #
27 #       David J. Goehrig
28 #       dgoehrig@cpan.org
29 #
30
31 use strict;
32 use warnings;
33 use MIME::Base64 qw(decode_base64);
34 use SDL;
35 use SDL::Surface;
36 use SDL::App;
37 use SDL::Tool::Graphic;
38
39 my $app = new SDL::App(-title   => "Graphic Tool Test",
40                        -width   => 640,
41                        -height  => 480,
42                        -depth   => 16,
43                        -fullscreen => 0);
44 my $app_rect = new SDL::Rect(   -x=>0,
45                                 -y=>0,
46                                 -width=>$app->width,
47                                 -height=>$app->height);
48
49 write_spiral();
50 my $sprite = new SDL::Surface(-name => "/tmp/spiral.png");
51 $sprite->display_format();
52
53 #Test Zoom
54 my $graphicTool = new SDL::Tool::Graphic();
55 $graphicTool->zoom($sprite, .5, .5, 1);
56
57 my $sprite_rect = new SDL::Rect(        -x=>0,
58                                 -y=>0,
59                                 -width=>$sprite->width,
60                                 -height=>$sprite->height);
61 $sprite->blit($sprite_rect, $app, $sprite_rect);
62 $app->flip();
63 sleep 4;
64 $app->fill($app_rect, $SDL::Color::black);
65
66
67 #Test Rotate
68 $graphicTool->rotoZoom($sprite, 90, 1, 1);
69
70 $sprite_rect = new SDL::Rect(   -x=>0,
71                                 -y=>0,
72                                 -width=>$sprite->width,
73                                 -height=>$sprite->height);
74 $sprite->blit($sprite_rect, $app, $sprite_rect);
75 $app->flip();
76 sleep 4;
77
78 +print "GrayScaling\n";
79 +$app->fill($app_rect, $SDL::Color::black);
80
81 #Test GrayScale
82 $graphicTool->grayScale($sprite);
83
84 $sprite->blit($sprite_rect, $app, $sprite_rect);
85 $app->flip();
86 sleep 4;
87
88
89
90 sub write_spiral {
91         my $png = decode_base64 <<EOF;
92 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
212 EOF
213         open FP, "> /tmp/spiral.png";
214         print FP $png;
215         close FP;
216 }