#!/usr/bin/env perl # # testgfxprim.pl # # Copyright (C) 2005 David J. Goehrig # # ------------------------------------------------------------------------------ # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # ------------------------------------------------------------------------------ # # Please feel free to send questions, suggestions or improvements to: # # David J. Goehrig # dgoehrig@cpan.org # use strict; use Getopt::Long; use Data::Dumper; use MIME::Base64 qw(decode_base64); use SDL; use SDL::App; use SDL::Event; use SDL::Surface; use SDL::Color; use SDL::Rect; use SDL::Config; use vars qw/ $app $app_rect $background $event $sprite $sprite_rect $videoflags /; die "Your system is not configured with SDL_gfx support!\n" unless (SDL::Config->has('SDL_gfx')); ## User tweakable settings (via cmd-line) my %settings = ( 'numsprites' => 10, 'screen_width' => 640, 'screen_height' => 480, 'video_bpp' => 8, 'fast' => 0, 'hw' => 0, 'fullscreen' => 0, 'bpp' => undef, ); ## Process commandline arguments sub get_cmd_args { GetOptions( "width:i" => \$settings{screen_width}, "height:i" => \$settings{screen_height}, "bpp:i" => \$settings{bpp}, "fast!" => \$settings{fast}, "hw!" => \$settings{hw}, "fullscreen!" => \$settings{fullscreen}, "numsprites=i" => \$settings{numsprites}, ); } ## Initialize application options sub set_app_args { $settings{bpp} ||= 8; # default to 8 bits per pix $videoflags |= SDL_HWACCEL if $settings{hw}; $videoflags |= SDL_FULLSCREEN if $settings{fullscreen}; } ## Setup sub init_game_context { $app = new SDL::App -width => $settings{screen_width}, -height=> $settings{screen_height}, -title => "testsprite", -flags => $videoflags; $app_rect= new SDL::Rect -height => $settings{screen_height}, -width => $settings{screen_width}; $background = $SDL::Color::black; $sprite = new SDL::Surface -name =>"/tmp/icon.bmp"; # Set transparent pixel as the pixel at (0,0) $sprite->set_color_key(SDL_SRCCOLORKEY,$sprite->pixel(0,0)); print STDERR "Got past that\n"; $sprite->display_format(); $sprite_rect = new SDL::Rect -x => 0, -y => 0, -width => $sprite->width, -height=> $sprite->height; $event = new SDL::Event(); } ## Prints diagnostics sub instruments { if ( ($app->flags & SDL_HWSURFACE) == SDL_HWSURFACE ) { printf("Screen is in video memory\n"); } else { printf("Screen is in system memory\n"); } if ( ($app->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF ) { printf("Screen has double-buffering enabled\n"); } if ( ($sprite->flags & SDL_HWSURFACE) == SDL_HWSURFACE ) { printf("Sprite is in video memory\n"); } else { printf("Sprite is in system memory\n"); } # Run a sample blit to trigger blit (if posssible) # acceleration before the check just after $sprite->blit(0,$app,0); if ( ($sprite->flags & SDL_HWACCEL) == SDL_HWACCEL ) { printf("Sprite blit uses hardware acceleration\n"); } if ( ($sprite->flags & SDL_RLEACCEL) == SDL_RLEACCEL ) { printf("Sprite blit uses RLE acceleration\n"); } } sub game_loop { my $surf = $$app; my $surfWidth=$settings{screen_width}; my $surfHeight=$settings{screen_height}; my $surfMidWidth=$settings{screen_width}>>1;; my $surfMidHeight=$settings{screen_height}>>1; $app->fill($app_rect, $background); # TODO: polygon's, GFX*Color #lines SDL::GFXHlineRGBA($surf, 0,$surfWidth, $surfMidHeight, 255,255,255,255); SDL::GFXVlineRGBA($surf, $surfMidWidth, 0,$surfHeight, 255,255,255,255); # rectangles SDL::GFXRectangleRGBA($surf, 0,0, $surfMidWidth/2,$surfMidHeight/2, 255,0,0,255); SDL::GFXBoxRGBA($surf, 0,0, $surfMidWidth/3,$surfMidHeight/3, 0,255,0,255); SDL::GFXLineRGBA($surf, 0,0, $surfWidth,$surfHeight, 0,255,255,255); SDL::GFXAalineRGBA($surf, $surfWidth,0,0,$surfHeight,0,255,255,255); # circles SDL::GFXCircleRGBA( $surf,$surfMidWidth*.3, $surfMidHeight, $surfMidWidth*.3, 255,255,0,255); SDL::GFXAacircleRGBA($surf, $surfMidWidth*.6, $surfMidHeight, $surfMidWidth*.3, 255,255,0,255); SDL::GFXFilledCircleRGBA($surf,$surfMidWidth*.3, $surfMidHeight, $surfMidWidth*.25,255,255,0,255); # ellipses SDL::GFXEllipseRGBA($surf,$surfWidth- $surfMidWidth*.3, $surfMidHeight, $surfMidWidth*.3,$surfMidHeight*.15, 255,255,0,255); SDL::GFXAaellipseRGBA($surf,$surfWidth- $surfMidWidth*.6, $surfMidHeight, $surfMidWidth*.3,$surfMidHeight*.15,255,255,0,255); SDL::GFXFilledEllipseRGBA($surf,$surfWidth- $surfMidWidth*.3, $surfMidHeight, $surfMidWidth*.25,$surfMidHeight*.10,255,255,0,255); # pie slices SDL::GFXFilledPieRGBA($surf,$surfMidWidth,$surfMidHeight, $surfMidWidth*.1, 0,90,0,0,255,255); SDL::GFXFilledPieRGBA($surf,$surfMidWidth,$surfMidHeight, $surfMidWidth*.1, 180,270,0,0,255,255); # polygons # TBD... # characters & strings SDL::GFXCharacterRGBA($surf,$surfMidWidth,0, "!",255,255,255,255); SDL::GFXStringRGBA($surf,$surfMidWidth,$surfHeight*.75, "SDL_Perl Primitive Test.",255,255,255,255); $app->flip(); $app->loop({ SDL_QUIT() => sub { exit(0); }, SDL_KEYDOWN() => sub { exit(0) if (SDL::GetKeyState(SDLK_ESCAPE)); }, }); } ## Main program loop write_bmp(); get_cmd_args(); set_app_args(); init_game_context(); instruments(); game_loop(); sub write_bmp { my $bmp = decode_base64 < /tmp/icon.bmp"; print FP $bmp; close FP; }