From bcd52a0db366fd644d6d13f21c232e16752ce867 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Thu, 13 Jan 2011 13:11:34 +1030 Subject: [PATCH 001/153] Validate PP test. --- lib/SDLx/Validate.pm | 169 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 158 insertions(+), 11 deletions(-) diff --git a/lib/SDLx/Validate.pm b/lib/SDLx/Validate.pm index 9c2065cf..ca4c4e4f 100644 --- a/lib/SDLx/Validate.pm +++ b/lib/SDLx/Validate.pm @@ -2,19 +2,20 @@ package SDLx::Validate; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); -require Exporter; -require DynaLoader; -our @ISA = qw(Exporter DynaLoader); - -$SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /Use of uninitialized value in subroutine entry/}; - -use Carp (); +use Carp; use Scalar::Util (); +sub surface { + my ($arg) = @_; + if ( Scalar::Util::blessed($arg) && $arg->isa("SDL::Surface") ) { + return $arg; + } + Carp::confess("Surface must be SDL::Surface or SDLx::Surface"); +} + sub surfacex { my ($arg) = @_; - if ( Scalar::Util::blessed($arg)) { + if ( Scalar::Util::blessed($arg) ) { if ( $arg->isa("SDLx::Surface") ) { return $arg; } @@ -26,12 +27,158 @@ sub surfacex { Carp::confess("Surface must be SDL::Surface or SDLx::Surface"); } +sub rect { + my ($arg) = @_; + if ( !defined $arg ) { + require SDL::Rect; + return SDL::Rect->new( 0, 0, 0, 0 ); + } elsif ( ref $arg ) { + if(ref $arg eq "ARRAY" ) { + Carp::cluck("Rect arrayref had more than 4 values") + if @$arg > 4; + require SDL::Rect; + return SDL::Rect->new( map { $_ || 0 } @$arg[ 0 .. 3 ] ); + } elsif ( Scalar::Util::blessed($arg) and $arg->isa("SDL::Rect") ) { + return $arg; + } + } + Carp::confess("Rect must be arrayref or SDL::Rect or undef"); +} + +sub _color_number { + my ( $color, $alpha ) = @_; + if ( !defined $color || $color < 0 ) { + Carp::cluck("Color was a negative number") + if defined $color && $color < 0; + if ($alpha) { + return 0x000000FF; + } else { + return 0x000000; + } + } else { + if ( $alpha && $color > 0xFFFFFFFF ) { + Carp::cluck("Color was number greater than maximum expected: 0xFFFFFFFF"); + return 0xFFFFFFFF; + } elsif ( !$alpha && $color > 0xFFFFFF ) { + Carp::cluck("Color was number greater than maximum expected: 0xFFFFFF"); + return 0xFFFFFF; + } + } + return $color; +} + +sub _color_arrayref { + my ( $color, $alpha ) = @_; + my @valid; + my $length = $alpha ? 4 : 3; + for ( my $i = 0; $i < $length; $i++ ) { + if ( !defined $color->[$i] ) { + if ( $i == 3 ) { # alpha + $valid[$i] = 0xFF; + } else { + $valid[$i] = 0; + } + } elsif ( Scalar::Util::looks_like_number( $color->[$i] ) ) { + if ( $color->[$i] > 0xFF ) { + Carp::cluck("Number in color arrayref was greater than maximum expected: 0xFF"); + $valid[$i] = 0xFF; + } elsif ( $color->[$i] < 0 ) { + Carp::cluck("Number in color arrayref was negative"); + $valid[$i] = 0; + } else { + $valid[$i] = $color->[$i]; + } + } + else { + Carp::confess("All values in color arrayref must be numbers or undef"); + } + } + return \@valid; +} + +sub _color_format { + my ($color) = @_; + if ( !defined $color || Scalar::Util::looks_like_number($color) ) { + return 'number'; + } elsif ( ref $color ) { + if ( ref $color eq "ARRAY" ) { + return 'arrayref'; + } elsif ( Scalar::Util::blessed($color) || $color->isa("SDL::Color") ) { + return 'SDLx::Color'; + } + } + Carp::confess("Color must be number or arrayref or SDLx::Color"); +} + +sub num_rgb { + my ($color) = @_; + my $format = _color_format($color); + if ( $format eq 'number' ) { + return _color_number($color); + } elsif ( $format eq 'arrayref' ) { + my $c = _color_arrayref($color); + return ( $c->[0] << 16 ) + ( $c->[1] << 8 ) + ( $c->[2] ); + } elsif ( $format eq 'SDLx::Color' ) { + return ( $color->r << 16 ) + ( $color->g << 8 ) + $color->b; + } +} + +sub num_rgba { + my ($color) = @_; + my $format = _color_format($color); + if ( $format eq 'number' ) { + return _color_number( $color, 1 ); + } elsif ( $format eq 'arrayref' ) { + my $c = _color_arrayref( $color, 1 ); + return ( $c->[0] << 24 ) + ( $c->[1] << 16 ) + ( $c->[2] << 8 ) + ( $c->[3] ); + } elsif ( $format eq 'SDLx::Color' ) { + return ( $color->r << 24 ) + ( $color->g << 16 ) + ( $color->b << 8 ) + 0xFF; + } +} + +sub list_rgb { + my ($color) = @_; + my $format = _color_format($color); + if ( $format eq 'number' ) { + my $n = _color_number($color); + return [ $n >> 16 & 0xFF, $n >> 8 & 0xFF, $n & 0xFF ]; + } elsif ( $format eq 'arrayref' ) { + return _color_arrayref($color); + } elsif ( $format eq 'SDLx::Color' ) { + return [ $color->r, $color->g, $color->b ]; + } +} + +sub list_rgba { + my ($color) = @_; + my $format = _color_format( $color, 1 ); + if ( $format eq 'number' ) { + my $n = _color_number( $color, 1 ); + return [ $n >> 24 & 0xFF, $n >> 16 & 0xFF, $n >> 8 & 0xFF, $n & 0xFF ]; + } elsif ( $format eq 'arrayref' ) { + return _color_arrayref( $color, 1 ); + } elsif ( $format eq 'SDLx::Color' ) { + return [ $color->r, $color->g, $color->b, 0xFF ]; + } +} + sub color { require SDL::Color; return SDL::Color->new( @{ list_rgb(@_) } ); } -bootstrap SDLx::Validate; +sub map_rgb { + my ( $color, $format ) = @_; -1; + require SDL::Video; + return SDL::Video::map_RGB( $format, @{ list_rgb($color) } ); +} + +sub map_rgba { + my ( $color, $format ) = @_; + require SDL::Video; + return SDL::Video::map_RGBA( $format, @{ list_rgba($color) } ); +} + +1; From 789f1b306424364026f1efd99d6b314f4268bf31 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Thu, 13 Jan 2011 13:27:54 +1030 Subject: [PATCH 002/153] Surface PP test. --- lib/SDLx/Surface.pm | 55 ++++++++++++++++++++++++++++----- src/SDLx/Surface.xs | 74 --------------------------------------------- 2 files changed, 48 insertions(+), 81 deletions(-) diff --git a/lib/SDLx/Surface.pm b/lib/SDLx/Surface.pm index b4714b3c..5dbf6f47 100644 --- a/lib/SDLx/Surface.pm +++ b/lib/SDLx/Surface.pm @@ -123,9 +123,7 @@ sub get_pixel { sub set_pixel { my ( $self, $y, $x, $new_value ) = @_; - $new_value = SDLx::Validate::num_rgba($new_value); - SDLx::Surface::set_pixel_xs( $self, $x, $y, $new_value ); } @@ -190,6 +188,8 @@ sub load { } } + + my $formated_surface = $surface; if( SDL::Video::get_video_surface ) { @@ -201,6 +201,33 @@ sub load { #EXTENSTIONS +sub blit { + my ( $src, $dest, $src_rect, $dest_rect ) = @_; + + $src = SDLx::Validate::surface($src); + $dest = SDLx::Validate::surface($dest); + + if(defined $src_rect) { + $src_rect = SDLx::Validate::rect($src_rect); + } + else { + $src_rect = SDL::Rect->new( 0, 0, $src->w, $src->h ); + } + if(defined $dest_rect) { + $dest_rect = SDLx::Validate::rect($dest_rect); + } + else { + $dest_rect = SDL::Rect->new( 0, 0, $dest->w, $dest->h ); + } + + SDL::Video::blit_surface( + $src, $src_rect, + $dest, $dest_rect + ); + + return $src; +} + sub blit_by { my ( $dest, $src, $src_rect, $dest_rect ) = @_; SDLx::Surface::blit( $src, $dest, $src_rect, $dest_rect ); @@ -218,13 +245,13 @@ sub update { my ( $surface, $rects ) = @_; if ( !defined($rects) || ( ref($rects) eq 'ARRAY' && !ref( $rects->[0] ) ) ) { - my @rect; - @rect = @{$rects} if $rects; + my @rect; + @rect = @{$rects} if $rects; $rect[0] ||= 0; $rect[1] ||= 0; $rect[2] ||= $surface->w; $rect[3] ||= $surface->h; - + SDL::Video::update_rect( $surface, @rect ); } else { SDL::Video::update_rects( $surface, map { SDLx::Validate::rect($_) } @{$rects} ); @@ -233,6 +260,20 @@ sub update { return $surface; } +sub draw_rect { + my ( $self, $rect, $color ) = @_; + $color = SDLx::Validate::map_rgba( $color, $self->format ); + if ( defined $rect ) { + $rect = SDLx::Validate::rect($rect); + } else { + $rect = SDL::Rect->new( 0, 0, $self->w, $self->h ); + } + + SDL::Video::fill_rect( $self, $rect, $color ) + and Carp::confess "Error drawing rect: " . SDL::get_error(); + return $self; +} + sub draw_line { my ( $self, $start, $end, $color, $antialias ) = @_; @@ -273,7 +314,7 @@ sub draw_circle { unless( $antialias ) { - SDL::GFX::Primitives::circle_color( $self, @{$center}, $radius, $color ); + SDL::GFX::Primitives::circle_color( $self, @{$center}, $radius, $color ); } else { @@ -283,7 +324,7 @@ sub draw_circle { } sub draw_circle_filled { - my ( $self, $center, $radius, $color) = @_; + my ( $self, $center, $radius, $color ) = @_; unless ( SDL::Config->has('SDL_gfx_primitives') ) { Carp::cluck("SDL_gfx_primitives support has not been compiled"); diff --git a/src/SDLx/Surface.xs b/src/SDLx/Surface.xs index 550105bf..358b82d0 100644 --- a/src/SDLx/Surface.xs +++ b/src/SDLx/Surface.xs @@ -172,80 +172,6 @@ surfacex_set_pixel_xs ( surface, x, y, value ) SDL_UnlockSurface(surface); -void -surfacex_draw_rect ( surface, rt, color ) - SDL_Surface *surface - SV* rt - SV* color - CODE: - - Uint32 m_color = __map_rgba( color, surface->format ); - SDL_Rect r_rect; - r_rect.x = 0; r_rect.y = 0; r_rect.w = surface->w; r_rect.h = surface->h; - - if( SvOK(rt) ) - { - int newly_created_rect = 0; - SV* foo = rect( rt, &newly_created_rect ); - SDL_Rect* v_rect = (SDL_Rect*)bag2obj(foo); - r_rect.x = v_rect->x; - r_rect.y = v_rect->y; - r_rect.w = v_rect->w; - r_rect.h = v_rect->h; - SDL_FillRect(surface, &r_rect, m_color); - SvREFCNT_dec(foo); - //if( newly_created_rect == 1 ) { safefree( v_rect); } - } - else - SDL_FillRect(surface, &r_rect, m_color); -void -surfacex_blit( src, dest, ... ) - SV *src - SV *dest - CODE: - src = surface(src); - dest = surface(dest); - SDL_Surface *_src = (SDL_Surface *)bag2obj(src); - SDL_Surface *_dest = (SDL_Surface *)bag2obj(dest); - - SDL_Rect _src_rect; - SDL_Rect _dest_rect; - int newly_created_rect = 0; - SV* s_rect_sv, *d_rect_sv; - int mall_sr = 0; int mall_dr = 0; - if( items > 2 && SvOK(ST(2)) ) - { - s_rect_sv = rect(ST(2), &newly_created_rect); - _src_rect = *(SDL_Rect *)bag2obj( s_rect_sv ); - mall_sr = 1; - } - else - { - _src_rect.x = 0; - _src_rect.y = 0; - _src_rect.w = _src->w; - _src_rect.h = _src->h; - } - - if( items > 3 && SvOK(ST(3)) ) - { - d_rect_sv = rect(ST(3), &newly_created_rect); - _dest_rect = *(SDL_Rect *)bag2obj( d_rect_sv ); - mall_dr = 1; - } - else - { - _dest_rect.x = 0; - _dest_rect.y = 0; - _dest_rect.w = _dest->w; - _dest_rect.h = _dest->h; - } - - SDL_BlitSurface( _src, &_src_rect, _dest, &_dest_rect ); - if ( mall_sr == 1 ) - SvREFCNT_dec( s_rect_sv); - if ( mall_dr == 1 ) - SvREFCNT_dec( d_rect_sv ); From 823e5fd953f039f7d2b54a10dec983dd07bb8117 Mon Sep 17 00:00:00 2001 From: Blaise Roth Date: Tue, 1 Mar 2011 18:05:56 +1030 Subject: [PATCH 003/153] Paused method added to controller --- OFL-FAQ.txt | 432 +++++++++++++++++------------------ OFL.txt | 188 +++++++-------- lib/SDLx/Controller.pm | 41 ++-- lib/pods/SDLx/Controller.pod | 30 ++- 4 files changed, 363 insertions(+), 328 deletions(-) diff --git a/OFL-FAQ.txt b/OFL-FAQ.txt index cc9e6c2b..6785a19c 100644 --- a/OFL-FAQ.txt +++ b/OFL-FAQ.txt @@ -1,216 +1,216 @@ -OFL FAQ - Frequently Asked Questions about the SIL Open Font License (OFL) -Version 1.1 - 1 February 2007 -(See http://scripts.sil.org/OFL for updates) - - -1 ABOUT USING AND DISTRIBUTING FONTS LICENSED UNDER THE OFL - -1.1 Can I use the fonts in any publication, even embedded in the file? -Yes. You may use them like most other fonts, but unlike some fonts you may include an embedded subset of the fonts in your document. Such use does not require you to include this license or other files (listed in OFL condition 2), nor does it require any type of acknowledgement within the publication. Some mention of the font name within the publication information (such as in a colophon) is usually appreciated. If you wish to include the complete font as a separate file, you should distribute the full font package, including all existing acknowledgements, and comply with the OFL conditions. Of course, referencing or embedding an OFL font in any document does not change the license of the document itself. The requirement for fonts to remain under the OFL does not apply to any document created using the fonts and their derivatives. Similarly, creating any kind of graphic using a font under OFL does not make the resulting artwork subject to the OFL. - -1.2 Can I make web pages using these fonts? -Yes! Go ahead! Using CSS (Cascading Style Sheets) is recommended. - -1.3 Can I make the fonts available to others from my web site? -Yes, as long as you meet the conditions of the license (do not sell by itself, include the necessary files, rename Modified Versions, do not abuse the Author(s)' name(s) and do not sublicense). - -1.4 Can the fonts be included with Free/Libre and Open Source Software collections such as GNU/Linux and BSD distributions? -Yes! Fonts licensed under the OFL can be freely agreggated with software under FLOSS (Free/Libre and Open Source Software) licenses. Since fonts are much more useful aggregated to than merged with existing software, possible incompatibility with existing software licenses is not a problem. You can also repackage the fonts and the accompanying components in a .rpm or .deb package and include them in distro CD/DVDs and online repositories. - -1.5 I want to distribute the fonts with my program. Does this mean my program also has to be free and open source software? -No. Only the portions based on the font software are required to be released under the OFL. The intent of the license is to allow aggregation or bundling with software under restricted licensing as well. - -1.6 Can I include the fonts on a CD of freeware or commercial fonts? -Yes, as long some other font or software is also on the disk, so the OFL font is not sold by itself. - -1.7 Can I sell a software package that includes these fonts? -Yes, you can do this with both the Original Version and a Modified Version. Examples of bundling made possible by the OFL would include: word processors, design and publishing applications, training and educational software, edutainment software, etc. - -1.8 Why won't the OFL let me sell the fonts alone? -The intent is to keep people from making money by simply redistributing the fonts. The only people who ought to profit directly from the fonts should be the original authors, and those authors have kindly given up potential direct income to distribute their fonts under the OFL. Please honor and respect their contribution! - -1.9 I've come across a font released under the OFL. How can I easily get more information about the Original Version? How can I know where it stands compared to the Original Version or other Modified Versions? -Consult the copyright statement in the license for ways to contact the original authors. Consult the FONTLOG for information on how the font differs from the Original Version, and get in touch with the various contributors via the information in the acknowledgment section. Please consider using the Original Versions of the fonts whenever possible. - -1.10 What do you mean in condition 4? Can you provide examples of abusive promotion / endorsement / advertisement vs. normal acknowledgement? -The intent is that the goodwill and reputation of the author(s) should not be used in a way that makes it sound like the original author(s) endorse or approve of a specific Modified Version or software bundle. For example, it would not be right to advertise a word processor by naming the author(s) in a listing of software features, or to promote a Modified Version on a web site by saying "designed by ...". However, it would be appropriate to acknowledge the author(s) if your software package has a list of people who deserve thanks. We realize that this can seem to be a gray area, but the standard used to judge an acknowledgement is that if the acknowledgement benefits the author(s) it is allowed, but if it primarily benefits other parties, or could reflect poorly on the author(s), then it is not. - - -2 ABOUT MODIFYING OFL LICENSED FONTS - -2.1 Can I change the fonts? Are there any limitations to what things I can and cannot change? -You are allowed to change anything, as long as such changes do not violate the terms of the license. In other words, you are not allowed to remove the copyright statement(s) from the font, but you could add additional information into it that covers your contribution. - -2.2 I have a font that needs a few extra glyphs - can I take them from an OFL licensed font and copy them into mine? -Yes, but if you distribute that font to others it must be under the OFL, and include the information mentioned in condition 2 of the license. - -2.3 Can I charge people for my additional work? In other words, if I add a bunch of special glyphs and/or OpenType/Graphite code, can I sell the enhanced font? -Not by itself. Derivative fonts must be released under the OFL and cannot be sold by themselves. It is permitted, however, to include them in a larger software package (such as text editors, office suites or operating systems), even if the larger package is sold. In that case, you are strongly encouraged, but not required, to also make that derived font easily and freely available outside of the larger package. - -2.4 Can I pay someone to enhance the fonts for my use and distribution? -Yes. This is a good way to fund the further development of the fonts. Keep in mind, however, that if the font is distributed to others it must be under the OFL. You won't be able to recover your investment by exclusively selling the font, but you will be making a valuable contribution to the community. Please remember how you have benefitted from the contributions of others. - -2.5 I need to make substantial revisions to the font to make it work with my program. It will be a lot of work, and a big investment, and I want to be sure that it can only be distributed with my program. Can I restrict its use? -No. If you redistribute a Modified Version of the font it must be under the OFL. You may not restrict it in any way. This is intended to ensure that all released improvements to the fonts become available to everyone. But you will likely get an edge over competitors by being the first to distribute a bundle with the enhancements. Again, please remember how you have benefitted from the contributions of others. - -2.6 Do I have to make any derivative fonts (including source files, build scripts, documentation, etc.) publicly available? -No, but please do share your improvements with others. You may find that you receive more than what you gave in return. - -2.7 Why can't I use the Reserved Font Name(s) in my derivative font names? I'd like people to know where the design came from. -The best way to acknowledge the source of the design is to thank the original authors and any other contributors in the files that are distributed with your revised font (although no acknowledgement is required). The FONTLOG is a natural place to do this. Reserved Font Name(s) ensure that the only fonts that have the original names are the unmodified Original Versions. This allows designers to maintain artistic integrity while allowing collaboration to happen. It eliminates potential confusion and name conflicts. When choosing a name be creative and avoid names that reuse almost all the same letters in the same order or sound like the original. Keep in mind that the Copyright Holder(s) can allow a specific trusted partner to use Reserved Font Name(s) through a separate written agreement. - -2.8 What do you mean by "primary name as presented to the user"? Are you are referring to the font menu name? -Yes, the requirement to change the visible name used to differentiate the font from others applies to the font menu name and other mechanisms to specify a font in a document. It would be fine, for example, to keep a text reference to the original fonts in the description field, in your modified source file or in documentation provided alongside your derivative as long as no one could be confused that your modified source is the original. But you cannot use the Reserved Font Names in any way to identify the font to the user (unless the Copyright Holder(s) allow(s) it through a separate agreement, see section 2.7). Users who install derivatives ("Modified Versions") on their systems should not see any of the original names ("Reserved Font Names") in their font menus, for example. Again, this is to ensure that users are not confused and do not mistake a font for another and so expect features only another derivative or the Original Version can actually offer. Ultimately, creating name conflicts will cause many problems for the users as well as for the designer of both the Original and Modified versions, so please think ahead and find a good name for your own derivative. Font substitution systems like fontconfig, or application-level font fallback configuration within OpenOffice.org or Scribus, will also get very confused if the name of the font they are configured to substitute to actually refers to another physical font on the user's hard drive. It will help everyone if Original Versions and Modified Versions can easily be distinguished from one another and from other derivatives. The substitution mechanism itself is outside the scope of the license. Users can always manually change a font reference in a document or set up some kind of substitution at a higher level but at the lower level the fonts themselves have to respect the Reserved Font Name(s) requirement to prevent ambiguity. If a substitution is currently active the user should be aware of it. - -2.9 Am I not allowed to use any part of the Reserved Font Names? -You may not use the words of the font names, but you would be allowed to use parts of words, as long as you do not use any word from the Reserved Font Names entirely. We do not recommend using parts of words because of potential confusion, but it is allowed. For example, if "Foobar" was a Reserved Font Name, you would be allowed to use "Foo" or "bar", although we would not recommend it. Such an unfortunate choice would confuse the users of your fonts as well as make it harder for other designers to contribute. - -2.10 So what should I, as an author, identify as Reserved Font Names? -Original authors are encouraged to name their fonts using clear, distinct names, and only declare the unique parts of the name as Reserved Font Names. For example, the author of a font called "Foobar Sans" would declare "Foobar" as a Reserved Font Name, but not "Sans", as that is a common typographical term, and may be a useful word to use in a derivative font name. Reserved Font Names should also be single words. A font called "Flowing River" should have Reserved Font Names "Flowing" and "River", not "Flowing River". - -2.11 Do I, as an author, have to identify and Reserved Font Names? -No, but we strongly encourage you to do so. This is to avoid confusion between your work and Modified versions. You may, however, give certain trusted parties the right to use any of your Reserved Font Names through separate written agreements. For example, even if "Foobar" is a RFN, you could write up an agreement to give company "XYZ" the right to distribute a modified version with a name that includes "Foobar". This allows for freedom without confusion. - -2.12 Are any names (such as the main font name) reserved by default? -No. That is a change to the license as of version 1.1. If you want any names to be Reserved Font Names, they must be specified after the copyright statement. - -2.13 What is this FONTLOG thing exactly? -It has three purposes: 1) to provide basic information on the font to users and other developers, 2) to document changes that have been made to the font or accompanying files, either by the original authors or others, and 3) to provide a place to acknowledge the authors and other contributors. Please use it! See below for details on how changes should be noted. - -2.14 Am I required to update the FONTLOG? -No, but users, designers and other developers might get very frustrated at you if you don't! People need to know how derivative fonts differ from the originals, and how to take advantage of the changes, or build on them. - - -3 ABOUT THE FONTLOG - -The FONTLOG can take a variety of formats, but should include these four sections: - -3.1 FONTLOG for -This file provides detailed information on the font software. This information should be distributed along with the fonts and any derivative works. - -3.2 Basic Font Information -(Here is where you would describe the purpose and brief specifications for the font project, and where users can find more detailed documentation. It can also include references to how changes can be contributed back to the Original Version. You may also wish to include a short guide to the design, or a reference to such a document.) - -3.3 ChangeLog -(This should list both major and minor changes, most recent first. Here are some examples:) - -1 Feb 2005 (Jane Doe) Version 1.1 -- Improved build script performance and verbosity -- Extended the smart code documentation -- Corrected minor typos in the documentation -- Fixed position of combining inverted breve below (U+032F) -- Added OpenType/Graphite smart code for Armenian -- Added Armenian glyphs (U+0531 -> U+0587) -- Released as "" - -1 Jan 2005 (Joe Smith) Version 1.0 -- Initial release of font "" - -3.4 Acknowledgements -(Here is where contributors can be acknowledged. - -If you make modifications be sure to add your name (N), email (E), web-address (W) and description (D). This list is sorted by last name in alphabetical order.) - -N: Jane Doe -E: jane@university.edu -W: http://art.university.edu/projects/fonts -D: Contributor - Armenian glyphs and code - -N: Fred Foobar -E: fred@foobar.org -W: http://foobar.org -D: Contributor - misc Graphite fixes - -N: Pat Johnson -E: pat@fontstudio.org -W: http://pat.fontstudio.org -D: Designer - Greek & Cyrillic glyphs based on Roman design - -N: Tom Parker -E: tom@company.com -W: http://www.company.com/tom/projects/fonts -D: Engineer - original smart font code - -N: Joe Smith -E: joe@fontstudio.org -W: http://joe.fontstudio.org -D: Designer - original Roman glyphs - -(Original authors can also include information here about their organization.) - - -4 ABOUT MAKING CONTRIBUTIONS - -4.1 Why should I contribute my changes back to the original authors? -It would benefit many people if you contributed back to what you've received. Providing your contributions and improvements to the fonts and other components (data files, source code, build scripts, documentation, etc.) could be a tremendous help and would encourage others to contribute as well and 'give back', which means you will have an opportunity to benefit from other people's contributions as well. Sometimes maintaining your own separate version takes more effort than merging back with the original. Be aware that any contributions, however, must be either your own original creation or work that you own, and you may be asked to affirm that clearly when you contribute. - -4.2 I've made some very nice improvements to the font, will you consider adopting them and putting them into future Original Versions? -Most authors would be very happy to receive such contributions. Keep in mind that it is unlikely that they would want to incorporate major changes that would require additional work on their end. Any contributions would likely need to be made for all the fonts in a family and match the overall design and style. Authors are encouraged to include a guide to the design with the fonts. It would also help to have contributions submitted as patches or clearly marked changes (the use of smart source revision control systems like subversion, svk or bzr is a good idea). Examples of useful contributions are bug fixes, additional glyphs, stylistic alternates (and the smart font code to access them) or improved hinting. - -4.3 How can I financially support the development of OFL fonts? -It is likely that most authors of OFL fonts would accept financial contributions - contact them for instructions on how to do this. Such contributions would support future development. You can also pay for others to enhance the fonts and contribute the results back to the original authors for inclusion in the Original Version. - - -5 ABOUT THE LICENSE - -5.1 I see that this is version 1.1 of the license. Will there be later changes? -Version 1.1 is the first minor revision of the OFL. We are confident that version 1.1 will meet most needs, but are open to future improvements. Any revisions would be for future font releases, and previously existing licenses would remain in effect. No retroactive changes are possible, although the Copyright Holder(s) can re-release the font under a revised OFL. All versions will be available on our web site: http://scripts.sil.org/OFL. - -5.2 Can I use the SIL Open Font License for my own fonts? -Yes! We heartily encourage anyone to use the OFL to distribute their own original fonts. It is a carefully constructed license that allows great freedom along with enough artistic integrity protection for the work of the authors as well as clear rules for other contributors and those who redistribute the fonts. Some additional information about using the OFL is included at the end of this FAQ. - -5.3 Does this license restrict the rights of the Copyright Holder(s)? -No. The Copyright Holder(s) still retains all the rights to their creation; they are only releasing a portion of it for use in a specific way. For example, the Copyright Holder(s) may choose to release a 'basic' version of their font under the OFL, but sell a restricted 'enhanced' version. Only the Copyright Holder(s) can do this. - -5.4 Is the OFL a contract or a license? -The OFL is a license and not a contract and so does not require you to sign it to have legal validity. By using, modifying and redistributing components under the OFL you indicate that you accept the license. - -5.5 How about translating the license and the FAQ into other languages? -SIL certainly recognises the need for people who are not familiar with English to be able to understand the OFL and this FAQ better in their own language. Making the license very clear and readable is a key goal of the OFL. - -If you are an experienced translator, you are very welcome to help translating the OFL and its FAQ so that designers and users in your language community can understand the license better. But only the original English version of the license has legal value and has been approved by the community. Translations do not count as legal substitutes and should only serve as a way to explain the original license. SIL - as the author and steward of the license for the community at large - does not approve any translation of the OFL as legally valid because even small translations ambiguities could be abused and create problems. - -We give permission to publish unofficial translations into other languages provided that they comply with the following guidelines: - -- put the following disclaimer in both English and the target language stating clearly that the translation is unofficial: - -"This is an unofficial translation of the SIL Open Font License into $language. It was not published by SIL International, and does not legally state the distribution terms for fonts that use the OFL. A release under the OFL is only valid when using the original English text. - -However, we recognize that this unofficial translation will help users and designers not familiar with English to understand the SIL OFL better and make it easier to use and release font families under this collaborative font design model. We encourage designers who consider releasing their creation under the OFL to read the FAQ in their own language if it is available. - -Please go to http://scripts.sil.org/OFL for the official version of the license and the accompanying FAQ." -" - -- keep your unofficial translation current and update it at our request if needed, for example if there is any ambiguity which could lead to confusion. - -If you start such a unofficial translation effort of the OFL and its accompanying FAQ please let us know, thank you. - - -6 ABOUT SIL INTERNATIONAL - -6.1 Who is SIL International and what does it do? -SIL International is a worldwide faith-based education and development organization (NGO) that studies, documents, and assists in developing the world's lesser-known languages through literacy, linguistics, translation, and other academic disciplines. SIL makes its services available to all without regard to religious belief, political ideology, gender, race, or ethnic background. SIL's members and volunteers share a Christian commitment. - -6.2 What does this have to do with font licensing? -The ability to read, write, type and publish in one's own language is one of the most critical needs for millions of people around the world. This requires fonts that are widely available and support lesser-known languages. SIL develops - and encourages others to develop - a complete stack of writing systems implementation components available under open licenses. This open stack includes input methods, smart fonts, smart rendering libraries and smart applications. There has been a need for a common open license that is specifically applicable to fonts and related software (a crucial component of this stack) so SIL developed the SIL Open Font License with the help of the FLOSS community. - -6.3 How can I contact SIL? -Our main web site is: http://www.sil.org/ -Our site about complex scripts is: http://scripts.sil.org/ -Information about this license (including contact email information) is at: http://scripts.sil.org/OFL - - -7 ABOUT USING THE OFL FOR YOUR ORIGINAL FONTS - -If you want to release your fonts under the OFL, you only need to do the following: - -7.1 Put your copyright and reserved font names information in the beginning of the main OFL file. -7.2 Put your copyright and the OFL references in your various font files (such as in the copyright, license and description fields) and in your other components (build scripts, glyph databases, documentation, rendering samples, etc). -7.3 Write an initial FONTLOG for your font and include it in the release package. -7.4 Include the OFL in your release package. -7.5 We also highly recommend you include the relevant practical documentation on the license by putting the OFL-FAQ in your package. - - -That's all. If you have any more questions please get in touch with us. - - +OFL FAQ - Frequently Asked Questions about the SIL Open Font License (OFL) +Version 1.1 - 1 February 2007 +(See http://scripts.sil.org/OFL for updates) + + +1 ABOUT USING AND DISTRIBUTING FONTS LICENSED UNDER THE OFL + +1.1 Can I use the fonts in any publication, even embedded in the file? +Yes. You may use them like most other fonts, but unlike some fonts you may include an embedded subset of the fonts in your document. Such use does not require you to include this license or other files (listed in OFL condition 2), nor does it require any type of acknowledgement within the publication. Some mention of the font name within the publication information (such as in a colophon) is usually appreciated. If you wish to include the complete font as a separate file, you should distribute the full font package, including all existing acknowledgements, and comply with the OFL conditions. Of course, referencing or embedding an OFL font in any document does not change the license of the document itself. The requirement for fonts to remain under the OFL does not apply to any document created using the fonts and their derivatives. Similarly, creating any kind of graphic using a font under OFL does not make the resulting artwork subject to the OFL. + +1.2 Can I make web pages using these fonts? +Yes! Go ahead! Using CSS (Cascading Style Sheets) is recommended. + +1.3 Can I make the fonts available to others from my web site? +Yes, as long as you meet the conditions of the license (do not sell by itself, include the necessary files, rename Modified Versions, do not abuse the Author(s)' name(s) and do not sublicense). + +1.4 Can the fonts be included with Free/Libre and Open Source Software collections such as GNU/Linux and BSD distributions? +Yes! Fonts licensed under the OFL can be freely agreggated with software under FLOSS (Free/Libre and Open Source Software) licenses. Since fonts are much more useful aggregated to than merged with existing software, possible incompatibility with existing software licenses is not a problem. You can also repackage the fonts and the accompanying components in a .rpm or .deb package and include them in distro CD/DVDs and online repositories. + +1.5 I want to distribute the fonts with my program. Does this mean my program also has to be free and open source software? +No. Only the portions based on the font software are required to be released under the OFL. The intent of the license is to allow aggregation or bundling with software under restricted licensing as well. + +1.6 Can I include the fonts on a CD of freeware or commercial fonts? +Yes, as long some other font or software is also on the disk, so the OFL font is not sold by itself. + +1.7 Can I sell a software package that includes these fonts? +Yes, you can do this with both the Original Version and a Modified Version. Examples of bundling made possible by the OFL would include: word processors, design and publishing applications, training and educational software, edutainment software, etc. + +1.8 Why won't the OFL let me sell the fonts alone? +The intent is to keep people from making money by simply redistributing the fonts. The only people who ought to profit directly from the fonts should be the original authors, and those authors have kindly given up potential direct income to distribute their fonts under the OFL. Please honor and respect their contribution! + +1.9 I've come across a font released under the OFL. How can I easily get more information about the Original Version? How can I know where it stands compared to the Original Version or other Modified Versions? +Consult the copyright statement in the license for ways to contact the original authors. Consult the FONTLOG for information on how the font differs from the Original Version, and get in touch with the various contributors via the information in the acknowledgment section. Please consider using the Original Versions of the fonts whenever possible. + +1.10 What do you mean in condition 4? Can you provide examples of abusive promotion / endorsement / advertisement vs. normal acknowledgement? +The intent is that the goodwill and reputation of the author(s) should not be used in a way that makes it sound like the original author(s) endorse or approve of a specific Modified Version or software bundle. For example, it would not be right to advertise a word processor by naming the author(s) in a listing of software features, or to promote a Modified Version on a web site by saying "designed by ...". However, it would be appropriate to acknowledge the author(s) if your software package has a list of people who deserve thanks. We realize that this can seem to be a gray area, but the standard used to judge an acknowledgement is that if the acknowledgement benefits the author(s) it is allowed, but if it primarily benefits other parties, or could reflect poorly on the author(s), then it is not. + + +2 ABOUT MODIFYING OFL LICENSED FONTS + +2.1 Can I change the fonts? Are there any limitations to what things I can and cannot change? +You are allowed to change anything, as long as such changes do not violate the terms of the license. In other words, you are not allowed to remove the copyright statement(s) from the font, but you could add additional information into it that covers your contribution. + +2.2 I have a font that needs a few extra glyphs - can I take them from an OFL licensed font and copy them into mine? +Yes, but if you distribute that font to others it must be under the OFL, and include the information mentioned in condition 2 of the license. + +2.3 Can I charge people for my additional work? In other words, if I add a bunch of special glyphs and/or OpenType/Graphite code, can I sell the enhanced font? +Not by itself. Derivative fonts must be released under the OFL and cannot be sold by themselves. It is permitted, however, to include them in a larger software package (such as text editors, office suites or operating systems), even if the larger package is sold. In that case, you are strongly encouraged, but not required, to also make that derived font easily and freely available outside of the larger package. + +2.4 Can I pay someone to enhance the fonts for my use and distribution? +Yes. This is a good way to fund the further development of the fonts. Keep in mind, however, that if the font is distributed to others it must be under the OFL. You won't be able to recover your investment by exclusively selling the font, but you will be making a valuable contribution to the community. Please remember how you have benefitted from the contributions of others. + +2.5 I need to make substantial revisions to the font to make it work with my program. It will be a lot of work, and a big investment, and I want to be sure that it can only be distributed with my program. Can I restrict its use? +No. If you redistribute a Modified Version of the font it must be under the OFL. You may not restrict it in any way. This is intended to ensure that all released improvements to the fonts become available to everyone. But you will likely get an edge over competitors by being the first to distribute a bundle with the enhancements. Again, please remember how you have benefitted from the contributions of others. + +2.6 Do I have to make any derivative fonts (including source files, build scripts, documentation, etc.) publicly available? +No, but please do share your improvements with others. You may find that you receive more than what you gave in return. + +2.7 Why can't I use the Reserved Font Name(s) in my derivative font names? I'd like people to know where the design came from. +The best way to acknowledge the source of the design is to thank the original authors and any other contributors in the files that are distributed with your revised font (although no acknowledgement is required). The FONTLOG is a natural place to do this. Reserved Font Name(s) ensure that the only fonts that have the original names are the unmodified Original Versions. This allows designers to maintain artistic integrity while allowing collaboration to happen. It eliminates potential confusion and name conflicts. When choosing a name be creative and avoid names that reuse almost all the same letters in the same order or sound like the original. Keep in mind that the Copyright Holder(s) can allow a specific trusted partner to use Reserved Font Name(s) through a separate written agreement. + +2.8 What do you mean by "primary name as presented to the user"? Are you are referring to the font menu name? +Yes, the requirement to change the visible name used to differentiate the font from others applies to the font menu name and other mechanisms to specify a font in a document. It would be fine, for example, to keep a text reference to the original fonts in the description field, in your modified source file or in documentation provided alongside your derivative as long as no one could be confused that your modified source is the original. But you cannot use the Reserved Font Names in any way to identify the font to the user (unless the Copyright Holder(s) allow(s) it through a separate agreement, see section 2.7). Users who install derivatives ("Modified Versions") on their systems should not see any of the original names ("Reserved Font Names") in their font menus, for example. Again, this is to ensure that users are not confused and do not mistake a font for another and so expect features only another derivative or the Original Version can actually offer. Ultimately, creating name conflicts will cause many problems for the users as well as for the designer of both the Original and Modified versions, so please think ahead and find a good name for your own derivative. Font substitution systems like fontconfig, or application-level font fallback configuration within OpenOffice.org or Scribus, will also get very confused if the name of the font they are configured to substitute to actually refers to another physical font on the user's hard drive. It will help everyone if Original Versions and Modified Versions can easily be distinguished from one another and from other derivatives. The substitution mechanism itself is outside the scope of the license. Users can always manually change a font reference in a document or set up some kind of substitution at a higher level but at the lower level the fonts themselves have to respect the Reserved Font Name(s) requirement to prevent ambiguity. If a substitution is currently active the user should be aware of it. + +2.9 Am I not allowed to use any part of the Reserved Font Names? +You may not use the words of the font names, but you would be allowed to use parts of words, as long as you do not use any word from the Reserved Font Names entirely. We do not recommend using parts of words because of potential confusion, but it is allowed. For example, if "Foobar" was a Reserved Font Name, you would be allowed to use "Foo" or "bar", although we would not recommend it. Such an unfortunate choice would confuse the users of your fonts as well as make it harder for other designers to contribute. + +2.10 So what should I, as an author, identify as Reserved Font Names? +Original authors are encouraged to name their fonts using clear, distinct names, and only declare the unique parts of the name as Reserved Font Names. For example, the author of a font called "Foobar Sans" would declare "Foobar" as a Reserved Font Name, but not "Sans", as that is a common typographical term, and may be a useful word to use in a derivative font name. Reserved Font Names should also be single words. A font called "Flowing River" should have Reserved Font Names "Flowing" and "River", not "Flowing River". + +2.11 Do I, as an author, have to identify and Reserved Font Names? +No, but we strongly encourage you to do so. This is to avoid confusion between your work and Modified versions. You may, however, give certain trusted parties the right to use any of your Reserved Font Names through separate written agreements. For example, even if "Foobar" is a RFN, you could write up an agreement to give company "XYZ" the right to distribute a modified version with a name that includes "Foobar". This allows for freedom without confusion. + +2.12 Are any names (such as the main font name) reserved by default? +No. That is a change to the license as of version 1.1. If you want any names to be Reserved Font Names, they must be specified after the copyright statement. + +2.13 What is this FONTLOG thing exactly? +It has three purposes: 1) to provide basic information on the font to users and other developers, 2) to document changes that have been made to the font or accompanying files, either by the original authors or others, and 3) to provide a place to acknowledge the authors and other contributors. Please use it! See below for details on how changes should be noted. + +2.14 Am I required to update the FONTLOG? +No, but users, designers and other developers might get very frustrated at you if you don't! People need to know how derivative fonts differ from the originals, and how to take advantage of the changes, or build on them. + + +3 ABOUT THE FONTLOG + +The FONTLOG can take a variety of formats, but should include these four sections: + +3.1 FONTLOG for +This file provides detailed information on the font software. This information should be distributed along with the fonts and any derivative works. + +3.2 Basic Font Information +(Here is where you would describe the purpose and brief specifications for the font project, and where users can find more detailed documentation. It can also include references to how changes can be contributed back to the Original Version. You may also wish to include a short guide to the design, or a reference to such a document.) + +3.3 ChangeLog +(This should list both major and minor changes, most recent first. Here are some examples:) + +1 Feb 2005 (Jane Doe) Version 1.1 +- Improved build script performance and verbosity +- Extended the smart code documentation +- Corrected minor typos in the documentation +- Fixed position of combining inverted breve below (U+032F) +- Added OpenType/Graphite smart code for Armenian +- Added Armenian glyphs (U+0531 -> U+0587) +- Released as "" + +1 Jan 2005 (Joe Smith) Version 1.0 +- Initial release of font "" + +3.4 Acknowledgements +(Here is where contributors can be acknowledged. + +If you make modifications be sure to add your name (N), email (E), web-address (W) and description (D). This list is sorted by last name in alphabetical order.) + +N: Jane Doe +E: jane@university.edu +W: http://art.university.edu/projects/fonts +D: Contributor - Armenian glyphs and code + +N: Fred Foobar +E: fred@foobar.org +W: http://foobar.org +D: Contributor - misc Graphite fixes + +N: Pat Johnson +E: pat@fontstudio.org +W: http://pat.fontstudio.org +D: Designer - Greek & Cyrillic glyphs based on Roman design + +N: Tom Parker +E: tom@company.com +W: http://www.company.com/tom/projects/fonts +D: Engineer - original smart font code + +N: Joe Smith +E: joe@fontstudio.org +W: http://joe.fontstudio.org +D: Designer - original Roman glyphs + +(Original authors can also include information here about their organization.) + + +4 ABOUT MAKING CONTRIBUTIONS + +4.1 Why should I contribute my changes back to the original authors? +It would benefit many people if you contributed back to what you've received. Providing your contributions and improvements to the fonts and other components (data files, source code, build scripts, documentation, etc.) could be a tremendous help and would encourage others to contribute as well and 'give back', which means you will have an opportunity to benefit from other people's contributions as well. Sometimes maintaining your own separate version takes more effort than merging back with the original. Be aware that any contributions, however, must be either your own original creation or work that you own, and you may be asked to affirm that clearly when you contribute. + +4.2 I've made some very nice improvements to the font, will you consider adopting them and putting them into future Original Versions? +Most authors would be very happy to receive such contributions. Keep in mind that it is unlikely that they would want to incorporate major changes that would require additional work on their end. Any contributions would likely need to be made for all the fonts in a family and match the overall design and style. Authors are encouraged to include a guide to the design with the fonts. It would also help to have contributions submitted as patches or clearly marked changes (the use of smart source revision control systems like subversion, svk or bzr is a good idea). Examples of useful contributions are bug fixes, additional glyphs, stylistic alternates (and the smart font code to access them) or improved hinting. + +4.3 How can I financially support the development of OFL fonts? +It is likely that most authors of OFL fonts would accept financial contributions - contact them for instructions on how to do this. Such contributions would support future development. You can also pay for others to enhance the fonts and contribute the results back to the original authors for inclusion in the Original Version. + + +5 ABOUT THE LICENSE + +5.1 I see that this is version 1.1 of the license. Will there be later changes? +Version 1.1 is the first minor revision of the OFL. We are confident that version 1.1 will meet most needs, but are open to future improvements. Any revisions would be for future font releases, and previously existing licenses would remain in effect. No retroactive changes are possible, although the Copyright Holder(s) can re-release the font under a revised OFL. All versions will be available on our web site: http://scripts.sil.org/OFL. + +5.2 Can I use the SIL Open Font License for my own fonts? +Yes! We heartily encourage anyone to use the OFL to distribute their own original fonts. It is a carefully constructed license that allows great freedom along with enough artistic integrity protection for the work of the authors as well as clear rules for other contributors and those who redistribute the fonts. Some additional information about using the OFL is included at the end of this FAQ. + +5.3 Does this license restrict the rights of the Copyright Holder(s)? +No. The Copyright Holder(s) still retains all the rights to their creation; they are only releasing a portion of it for use in a specific way. For example, the Copyright Holder(s) may choose to release a 'basic' version of their font under the OFL, but sell a restricted 'enhanced' version. Only the Copyright Holder(s) can do this. + +5.4 Is the OFL a contract or a license? +The OFL is a license and not a contract and so does not require you to sign it to have legal validity. By using, modifying and redistributing components under the OFL you indicate that you accept the license. + +5.5 How about translating the license and the FAQ into other languages? +SIL certainly recognises the need for people who are not familiar with English to be able to understand the OFL and this FAQ better in their own language. Making the license very clear and readable is a key goal of the OFL. + +If you are an experienced translator, you are very welcome to help translating the OFL and its FAQ so that designers and users in your language community can understand the license better. But only the original English version of the license has legal value and has been approved by the community. Translations do not count as legal substitutes and should only serve as a way to explain the original license. SIL - as the author and steward of the license for the community at large - does not approve any translation of the OFL as legally valid because even small translations ambiguities could be abused and create problems. + +We give permission to publish unofficial translations into other languages provided that they comply with the following guidelines: + +- put the following disclaimer in both English and the target language stating clearly that the translation is unofficial: + +"This is an unofficial translation of the SIL Open Font License into $language. It was not published by SIL International, and does not legally state the distribution terms for fonts that use the OFL. A release under the OFL is only valid when using the original English text. + +However, we recognize that this unofficial translation will help users and designers not familiar with English to understand the SIL OFL better and make it easier to use and release font families under this collaborative font design model. We encourage designers who consider releasing their creation under the OFL to read the FAQ in their own language if it is available. + +Please go to http://scripts.sil.org/OFL for the official version of the license and the accompanying FAQ." +" + +- keep your unofficial translation current and update it at our request if needed, for example if there is any ambiguity which could lead to confusion. + +If you start such a unofficial translation effort of the OFL and its accompanying FAQ please let us know, thank you. + + +6 ABOUT SIL INTERNATIONAL + +6.1 Who is SIL International and what does it do? +SIL International is a worldwide faith-based education and development organization (NGO) that studies, documents, and assists in developing the world's lesser-known languages through literacy, linguistics, translation, and other academic disciplines. SIL makes its services available to all without regard to religious belief, political ideology, gender, race, or ethnic background. SIL's members and volunteers share a Christian commitment. + +6.2 What does this have to do with font licensing? +The ability to read, write, type and publish in one's own language is one of the most critical needs for millions of people around the world. This requires fonts that are widely available and support lesser-known languages. SIL develops - and encourages others to develop - a complete stack of writing systems implementation components available under open licenses. This open stack includes input methods, smart fonts, smart rendering libraries and smart applications. There has been a need for a common open license that is specifically applicable to fonts and related software (a crucial component of this stack) so SIL developed the SIL Open Font License with the help of the FLOSS community. + +6.3 How can I contact SIL? +Our main web site is: http://www.sil.org/ +Our site about complex scripts is: http://scripts.sil.org/ +Information about this license (including contact email information) is at: http://scripts.sil.org/OFL + + +7 ABOUT USING THE OFL FOR YOUR ORIGINAL FONTS + +If you want to release your fonts under the OFL, you only need to do the following: + +7.1 Put your copyright and reserved font names information in the beginning of the main OFL file. +7.2 Put your copyright and the OFL references in your various font files (such as in the copyright, license and description fields) and in your other components (build scripts, glyph databases, documentation, rendering samples, etc). +7.3 Write an initial FONTLOG for your font and include it in the release package. +7.4 Include the OFL in your release package. +7.5 We also highly recommend you include the relevant practical documentation on the license by putting the OFL-FAQ in your package. + + +That's all. If you have any more questions please get in touch with us. + + diff --git a/OFL.txt b/OFL.txt index 2c09f250..c258eea2 100644 --- a/OFL.txt +++ b/OFL.txt @@ -1,94 +1,94 @@ -Copyright (c) 2003-2008 SIL International (http://www.sil.org/), -with Reserved Font Names "Gentium" and "SIL". - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 1 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that the font -names of derivative works are changed. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. +Copyright (c) 2003-2008 SIL International (http://www.sil.org/), +with Reserved Font Names "Gentium" and "SIL". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 1 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that the font +names of derivative works are changed. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 95baf37e..ef1e7d9d 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -22,6 +22,7 @@ my %_event_handlers; my %_move_handlers; my %_show_handlers; my %_sleep_cycle; +my %_paused; sub new { my ($self, %args) = @_; @@ -32,9 +33,9 @@ sub new { my $a; $self = bless \$a, $self; } - + my $ref = refaddr $self; - + $_dt{ $ref } = defined $args{dt} ? $args{dt} : 0.1; $_min_t{ $ref } = defined $args{min_t} ? $args{min_t} : 1 / 60; # $_current_time{ $ref } = $args{current_time} || 0; #no point @@ -43,7 +44,8 @@ sub new { $_event_handlers{ $ref } = $args{event_handlers}; $_move_handlers{ $ref } = $args{move_handlers}; $_show_handlers{ $ref } = $args{show_handlers}; - $_sleep_cycle{ $ref } = $args{delay}; + $_sleep_cycle{ $ref } = $args{delay}; +# $_paused{ $ref } = $args{paused}; #read only return $self; } @@ -61,17 +63,18 @@ sub DESTROY { delete $_move_handlers{ $ref}; delete $_show_handlers{ $ref}; delete $_sleep_cycle { $ref }; + delete $_paused { $ref }; } sub run { my ($self) = @_; - my $ref = refaddr $self; + my $ref = refaddr $self; my $dt = $_dt{ $ref }; my $min_t = $_min_t{ $ref }; my $t = 0.0; - #Allows us to do stop and run - $_stop{ $ref } = 0; + #Allows us to do stop and run + $_stop{ $ref } = 0; $_current_time{ $ref } = Time::HiRes::time; while ( !$_stop{ $ref } ) { @@ -91,9 +94,9 @@ sub run { my $step = $delta_copy / $dt; $self->_move( $ref, $step, $t ); #a partial move $t += $dt * $step; - + $self->_show( $ref, $delta_time ); - + $dt = $_dt{ $ref}; #these can change $min_t = $_min_t{ $ref}; #during the cycle SDL::delay( $_sleep_cycle{ $ref } ) if $_sleep_cycle{ $ref }; @@ -106,6 +109,7 @@ sub pause { my $ref = refaddr $self; $callback ||= sub {1}; my $event = SDL::Event->new(); + $_paused{ $ref} = 1; while(1) { SDL::Events::wait_event($event) or Carp::confess("pause failed waiting for an event"); if($callback->($event, $self)) { @@ -113,6 +117,7 @@ sub pause { last; } } + delete $_paused{ $ref}; } sub _event { @@ -173,10 +178,10 @@ sub add_show_handler { sub _remove_handler { my ( $arr_ref, $id ) = @_; if ( ref $id ) { - ($id) = grep { + ($id) = grep { $id eq $arr_ref->[$_] } 0..$#{$arr_ref}; - + if ( !defined $id ) { Carp::cluck("$id is not currently a handler of this type"); return; @@ -225,28 +230,32 @@ sub show_handlers { $_show_handlers{ refaddr $_[0] } } sub dt { my ($self, $arg) = @_; - my $ref = refaddr $self; + my $ref = refaddr $self; $_dt{ $ref} = $arg if defined $arg; - + $_dt{ $ref}; } sub min_t { my ($self, $arg) = @_; - my $ref = refaddr $self; + my $ref = refaddr $self; $_min_t{ $ref} = $arg if defined $arg; - + $_min_t{ $ref}; } sub current_time { my ($self, $arg) = @_; - my $ref = refaddr $self; + my $ref = refaddr $self; $_current_time{ $ref} = $arg if defined $arg; - + $_current_time{ $ref}; } +sub paused { + $_paused{ refaddr $_[0]}; +} + 1; #not 42 man! __END__ diff --git a/lib/pods/SDLx/Controller.pod b/lib/pods/SDLx/Controller.pod index a36900ad..5fc717cb 100644 --- a/lib/pods/SDLx/Controller.pod +++ b/lib/pods/SDLx/Controller.pod @@ -117,7 +117,7 @@ This can be used to easily implement a pause when the app loses focus: sub window { my ($e, $app) = @_; if($e->type == SDL_QUIT) { - $app->stop; + $app->stop; # quit handling is here so that the app # can be stopped while paused } @@ -129,7 +129,7 @@ This can be used to easily implement a pause when the app loses focus: else { $app->pause(\&window); # recursive, but only once since the window - # can't lose focus again without gaining is first + # can't lose focus again without gaining it first } } } @@ -142,6 +142,32 @@ Otherwise, time will accumulate while the application is paused, and many moveme Note 2: a pause will be potentially dangerous to the C cycle (even if you implement your own) unless called by an C callback. +=head2 paused + +Returns 1 if the app is paused, undef otherwise. +This is only useful when used within code that will be run by C: + + sub pause { + # press P to toggle pause + + my ($e, $app) = @_; + if($e->type == SDL_QUIT) { + $app->stop; + # quit handling is here so that the app + # can be stopped while paused + } + elsif($e->type == SDL_KEYDOWN) { + if($e->key_sym == SDLK_P) { + # We're paused, so end pause + return 1 if $app->paused; + + # We're not paused, so pause + $app->pause(\&pause); + } + } + return 0; + } + =head2 add_event_handler Register a callback to handle events. You can add as many subs as you need. From f6bd05c77249e73f179615fd09bcc507fa5eff1c Mon Sep 17 00:00:00 2001 From: Blaizer Date: Wed, 24 Aug 2011 22:19:45 +0930 Subject: [PATCH 004/153] SDLx::App prototype work in progress --- lib/SDLx/App.pm | 366 +++++++++++++++++++++++++++--------------------- 1 file changed, 206 insertions(+), 160 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 9199b2d3..8c2bab7a 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -1,222 +1,268 @@ -#!/usr/bin/env perl -# -# App.pm -# - package SDLx::App; use strict; use warnings; -use Carp; -use SDL; - -use SDL::Rect; -use SDL::Video; -use SDL::Event; -use SDL::Events; -use SDL::Surface; -use SDL::PixelFormat; -use SDLx::Surface; -use Data::Dumper; -use Scalar::Util 'refaddr'; + +use SDL (); +use SDL::Video (); +use SDL::Mouse (); use base qw/SDLx::Surface SDLx::Controller/; +use Carp (); +use Scalar::Util qw/refaddr/; # wont need this with SDLx::InsideOut + sub new { - my $proto = shift; - my $class = ref($proto) || $proto; - my %options = @_; - - # SDL_INIT_VIDEO() is 0, so check defined instead of truth. - unless ( exists( $options{noinit} ) ) # we shouldn't do init always - { - my $init = - defined $options{init} - ? $options{init} - : SDL::SDL_INIT_EVERYTHING; - - SDL::init($init); + my $class = shift; + $class = ref $class || $class; + my %o = @_; + + # undef is not a valid input + my $w = defined $o{width} ? $o{width} : defined $o{w} ? $o{w} : 640; + my $h = defined $o{height} ? $o{height} : defined $o{h} ? $o{h} : 480; + my $d = defined $o{depth} ? $o{depth} : defined $o{d} ? $o{d} : 32; + my $r = defined $o{red_size} ? $o{red_size} : defined $o{r} ? $o{r} : 5; + my $g = defined $o{green_size} ? $o{green_size} : defined $o{g} ? $o{g} : 5; + my $b = defined $o{blue_size} ? $o{blue_size} : defined $o{b} ? $o{b} : 5; + my $a = defined $o{alpha_size} ? $o{alpha_size} : defined $o{a} ? $o{a} : undef; + my $ra = defined $o{red_accum_size} ? $o{red_accum_size} : defined $o{ra} ? $o{ra} : undef; + my $ga = defined $o{green_accum_size} ? $o{green_accum_size} : defined $o{ga} ? $o{ga} : undef; + my $ba = defined $o{blue_accum_size} ? $o{blue_accum_size} : defined $o{ba} ? $o{ba} : undef; + my $aa = defined $o{alpha_accum_size} ? $o{alpha_accum_size} : defined $o{aa} ? $o{aa} : undef; + my $bs = defined $o{buffer_size} ? $o{buffer_size} : defined $o{bs} ? $o{bs} : undef; + my $ss = defined $o{stencil_size} ? $o{stencil_size} : defined $o{ss} ? $o{ss} : undef; + my $pos = defined $o{position} ? $o{position} : defined $o{pos} ? $o{pos} : undef; + my $s = defined $o{stash} ? $o{stash} : defined $o{s} ? $o{s} : undef; + + # undef is a valid input + my $t = exists $o{title} ? $o{title} : exists $o{t} ? $o{t} : undef; + my $it = exists $o{icon_title} ? $o{icon_title} : exists $o{it} ? $o{it} : undef; + my $icon = $o{icon}; + my $init = $o{init}; + my $f = exists $o{flags} ? $o{flags} : exists $o{f} ? $o{f} : undef; + + # boolean + my $ni = $o{no_init} || $o{ni}; + my $af = $o{any_format} || $o{af}; + my $db = $o{double_buf} || $o{db}; + my $sw = $o{sw_surface} || $o{sw}; + my $hw = $o{hw_surface} || $o{hw}; + my $ab = $o{async_blit} || $o{ab}; + my $hwp = $o{hw_palette} || $o{hwp}; + my $fs = $o{fullscreen} || $o{fs}; + my $gl = $o{opengl} || $o{gl}; + my $rs = $o{resizable} || $o{rs}; + my $nf = $o{no_frame} || $o{nf}; + my $nc = $o{no_cursor} || $o{nc}; + my $cen = $o{centered} || $o{cen}; + my $gi = $o{grab_input} || $o{gi}; + + unless ( $ni ) { + if ( ref $init eq 'ARRAY' ) { + my %init = map { $_ => 1 } @$init; + undef $init; + $init |= SDL::SDL_INIT_AUDIO if $init{audio} || $init{a}; + $init |= SDL::SDL_INIT_VIDEO if $init{video} || $init{v}; + $init |= SDL::SDL_INIT_CDROM if $init{cd_rom} || $init{cd}; + $init |= SDL::SDL_INIT_EVERYTHING if $init{everything} || $init{e}; + $init |= SDL::SDL_INIT_NOPARACHUTE if $init{no_parachute} || $init{np}; + $init |= SDL::SDL_INIT_JOYSTICK if $init{joystick} || $init{j}; + $init |= SDL::SDL_INIT_TIMER if $init{timer} || $init{t}; + } + SDL::init( defined $init ? $init : SDL::SDL_INIT_EVERYTHING ); + } + unless( defined $f ) { + $f = SDL::Video::SDL_ANYFORMAT; } + elsif( ref $f eq 'ARRAY' ) { + my %flag = map { $_ => 1 } @$f; + undef $f; + $f |= SDL::Video::SDL_ANYFORMAT if $flag{any_format} || $flag{af}; + $f |= SDL::Video::SDL_DOUBLEBUF if $flag{double_buf} || $flag{db}; + $f |= SDL::Video::SDL_SWSURFACE if $flag{sw_surface} || $flag{sw}; + $f |= SDL::Video::SDL_HWSURFACE if $flag{hw_surface} || $flag{hw}; + $f |= SDL::Video::SDL_ASYNCBLIT if $flag{async_blit} || $flag{ab}; + $f |= SDL::Video::SDL_HWPALETTE if $flag{hw_palette} || $flag{hwp}; + $f |= SDL::Video::SDL_FULLSCREEN if $flag{fullscreen} || $flag{fs}; + $f |= SDL::Video::SDL_OPENGL if $flag{opengl} || $flag{gl}; + $f |= SDL::Video::SDL_RESIZABLE if $flag{resizable} || $flag{rs}; + $f |= SDL::Video::SDL_NOFRAME if $flag{no_frame} || $flag{nf}; + } + $f |= SDL::Video::SDL_ANYFORMAT if $af; + $f |= SDL::Video::SDL_DOUBLEBUF if $db; + $f |= SDL::Video::SDL_SWSURFACE if $sw; + $f |= SDL::Video::SDL_HWSURFACE if $hw; + $f |= SDL::Video::SDL_ASYNCBLIT if $ab; + $f |= SDL::Video::SDL_HWPALETTE if $hwp; + $f |= SDL::Video::SDL_FULLSCREEN if $fs; + $f |= SDL::Video::SDL_OPENGL if $gl; + $f |= SDL::Video::SDL_RESIZABLE if $rs; + $f |= SDL::Video::SDL_NOFRAME if $nf; + $f ||= 0; + + $ENV{SDL_VIDEO_CENTERED} = $cen if $cen; + $ENV{SDL_VIDEO_WINDOW_POS} = $pos if $pos; + + my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) or Carp::confess( SDL::get_error() ); + my $self = SDLx::Surface->new( surface => $surface ); + $self->SDLx::Controller::new( %o ); + bless $self, $class; - my $t = $options{title} || $options{t} || $0; - my $it = $options{icon_title} || $options{it} || $t; - my $ic = $options{icon} || $options{i} || ""; - my $w = $options{width} || $options{w} || 800; - my $h = $options{height} || $options{h} || 600; - my $d = $options{depth} || $options{d} || 16; - my $f = $options{flags} || $options{f} || SDL::Video::SDL_ANYFORMAT; - my $r = $options{red_size} || $options{r} || 5; - my $g = $options{green_size} || $options{g} || 5; - my $b = $options{blue_size} || $options{b} || 5; - my $a = $options{alpha_size} || $options{a} || 0; - my $ras = $options{red_accum_size} || $options{ras} || 0; - my $gas = $options{green_accum_size} || $options{gas} || 0; - my $bas = $options{blue_accum_size} || $options{bas} || 0; - my $aas = $options{alpha_accum_size} || $options{aas} || 0; - my $db = $options{double_buffer} || $options{db} || 0; - my $eoq = $options{exit_on_quit} || $options{eoq} || 0; - - my $bs = $options{buffer_size} || $options{bs} || 0; - my $st = $options{stencil_size} || $options{st} || 0; - my $async = $options{asyncblit} || 0; - - $f |= SDL::Video::SDL_OPENGL if ( $options{gl} || $options{opengl} ); - $f |= SDL::Video::SDL_FULLSCREEN - if ( $options{fullscreen} || $options{full} ); - $f |= SDL::Video::SDL_RESIZABLE if ( $options{resizeable} ); - $f |= SDL::Video::SDL_DOUBLEBUF if ($db); - $f |= SDL::Video::SDL_ASYNCBLIT if ($async); - - if ( $f & SDL::Video::SDL_OPENGL ) { + if ( $gl ) { $SDLx::App::USING_OPENGL = 1; - SDL::Video::GL_set_attribute( SDL::Constants::SDL_GL_RED_SIZE(), $r ) - if ($r); - SDL::Video::GL_set_attribute( SDL::Constants::SDL_GL_GREEN_SIZE(), $g ) - if ($g); - SDL::Video::GL_set_attribute( SDL::Constants::SDL_GL_BLUE_SIZE(), $b ) - if ($b); - SDL::Video::GL_set_attribute( SDL::Constants::SDL_GL_ALPHA_SIZE(), $a ) - if ($a); - - SDL::Video::GL_set_attribute( - SDL::Constants::SDL_GL_RED_ACCUM_SIZE(), - $ras - ) if ($ras); - SDL::Video::GL_set_attribute( - SDL::Constants::SDL_GL_GREEN_ACCUM_SIZE(), - $gas - ) if ($gas); - SDL::Video::GL_set_attribute( - SDL::Constants::SDL_GL_BLUE_ACCUM_SIZE(), - $bas - ) if ($bas); - SDL::Video::GL_set_attribute( - SDL::Constants::SDL_GL_ALPHA_ACCUM_SIZE(), - $aas - ) if ($aas); - - SDL::Video::GL_set_attribute( - SDL::Constants::SDL_GL_DOUBLEBUFFER(), - $db - ) if ($db); - SDL::Video::GL_set_attribute( - SDL::Constants::SDL_GL_BUFFER_SIZE(), - $bs - ) if ($bs); - SDL::Video::GL_set_attribute( SDL::Constants::SDL_GL_DEPTH_SIZE(), $d ); - } else { - $SDLx::App::USING_OPENGL = 0; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_RED_SIZE(), $r ); + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_GREEN_SIZE(), $g ); + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BLUE_SIZE(), $b ); + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ALPHA_SIZE(), $a ) if defined $a; + + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_RED_ACCUM_SIZE(), $ra ) if defined $ra; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_GREEN_ACCUM_SIZE(), $ga ) if defined $ga; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BLUE_ACCUM_SIZE(), $ba ) if defined $ba; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ALPHA_ACCUM_SIZE(), $aa ) if defined $aa; + + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_DEPTH_SIZE(), $d ); + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_DOUBLEBUFFER(), $db ) if defined $db; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BUFFER_SIZE(), $bs ) if defined $bs; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_STENCIL_SIZE(), $ss ) if defined $ss; + + # These could be added here? + # SDL_GL_STEREO + # SDL_GL_MULTISAMPLEBUFFERS + # SDL_GL_MULTISAMPLESAMPLES + # SDL_GL_ACCELERATED_VISUAL + # SDL_GL_SWAP_CONTROL } - - my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) - or Carp::confess SDL::get_error(); - $options{surface} = $surface; - - my $self = SDLx::Surface->new(%options); - - if ( $ic and -e $ic ) { - my $icon = SDL::Video::load_BMP($ic); - SDL::Video::wm_set_icon($icon); + else { + $SDLx::App::USING_OPENGL = 0; } - SDL::Video::wm_set_caption( $t, $it ); - $self = $self->SDLx::Controller::new(%options); - bless $self, $class; - - $self->add_event_handler( \&_exit_on_quit ) if $eoq; + $self->title( $t, $it ); + $self->icon( $icon ); + $self->show_cursor( 0 ) if $nc; + $self->grab_input( $gi ) if $gi; + $self->stash() = $s; - return $self; + $self; } sub resize { - my ( $self, $w, $h ) = @_; + my ($self) = @_; my $flags = $self->flags; if ( $flags & SDL::Video::SDL_RESIZABLE ) { - my $bpp = $self->format->BitsPerPixel; - $self = SDL::Video::set_video_mode( $w, $h, $bpp, $flags ) - or die "SDL cannot set video:" . SDL::get_error; - } else { - die "Application surface not resizable"; + my ( $self, $w, $h ) = @_; + my $d = $self->format->BitsPerPixel; + return $self = SDL::Video::set_video_mode( $w, $h, $d, $flags ) + or Carp::confess( "SDL cannot set video:" . SDL::get_error ); } + Carp::confess( "Application surface not resizable" ); } sub title { - my $self = shift; - my ( $title, $icon ); - if (@_) { - $title = shift; - $icon = shift || $title; - SDL::Video::wm_set_caption( $title, $icon ); + shift; + if ( @_ ) { + my ( $title, $icon ) = @_; + $title = defined $icon ? $icon : $0 unless defined $title; + $icon = $title unless defined $icon; + return SDL::Video::wm_set_caption( $title, $icon ); + } + SDL::Video::wm_get_caption(); +} + +sub icon { + my ( undef, $icon ) = @_; + if ( defined $icon ) { + unless ( eval { $icon->isa( 'SDL::Surface' ) } ) { + $icon = SDL::Video::load_BMP( $icon ); + unless ( $icon ) { + require SDL::Image; + $icon = SDL::Image::load( $icon ); + } + } + SDL::Video::wm_set_icon( $icon ); } - return SDL::Video::wm_get_caption(); } sub delay { - my $self = shift; - my $delay = shift; - SDL::delay($delay); + my ( undef, $ms ) = @_; + SDL::delay( $ms ); } sub ticks { - return SDL::get_ticks(); + SDL::get_ticks(); } sub error { - return SDL::get_error(); + shift; + if( @_ == 1 and !defined $_[0] ) { + return SDL::clear_error(); + } + if( @_ ) { + return SDL_set_error_real( @_ ); + } + SDL::get_error(); } sub warp { - my $self = shift; - SDL::Mouse::warp_mouse(@_); + my ( undef, $x, $y ) = @_; + SDL::Mouse::warp_mouse( $x, $y ); +} + +sub show_cursor { + shift; + require SDL::Constants; + if( @_ ) { + my ( $show ) = @_; + return SDL::Mouse::show_cursor( SDL::Constants::SDL_ENABLE ) if $show; + return SDL::Mouse::show_cursor( SDL::Constants::SDL_DISABLE ); + } + SDL::Mouse::show_cursor( SDL::Constants::SDL_QUERY ); } sub fullscreen { - my $self = shift; - SDL::Video::wm_toggle_fullscreen($self); + my ( $self ) = @_; + SDL::Video::wm_toggle_fullscreen( $self ); } sub iconify { - my $self = shift; SDL::Video::wm_iconify_window(); } sub grab_input { - my ( $self, $mode ) = @_; - SDL::Video::wm_grab_input($mode); + shift; + if(@_) { + my ( $grab ) = @_; + return SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_ON ) if $grab; + return SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_OFF ); + } + SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_QUERY ); } sub sync { - my $self = shift; - if ($SDLx::App::USING_OPENGL) { - SDL::Video::GL_swap_buffers(); - } else { - $self->flip(); + if ( $SDLx::App::USING_OPENGL ) { + return SDL::Video::GL_swap_buffers(); } + my ( $self ) = @_; + $self->flip(); } sub attribute { - my ( $self, $mode, $value ) = @_; - return undef unless ($SDLx::App::USING_OPENGL); + return unless $SDLx::App::USING_OPENGL; + my ( undef, $mode, $value ) = @_; if ( defined $value ) { - SDL::Video::GL_set_attribute( $mode, $value ); + return SDL::Video::GL_set_attribute( $mode, $value ); } - my $returns = SDL::Video::GL_get_attribute($mode); - Carp::confess "SDLx::App::attribute failed to get GL attribute" - if ( $$returns[0] < 0 ); - $$returns[1]; -} - -sub _exit_on_quit { - my ($event, $app) = @_; - - $app->stop() if $event->type == SDL_QUIT; - + my $returns = SDL::Video::GL_get_attribute( $mode ); + Carp::confess( "SDLx::App::attribute failed to get GL attribute" ) + if ( $returns->[0] < 0 ); + $returns->[1]; } +# wont need this with SDLx::InsideOut my %_stash; -sub stash :lvalue{ - my $ref = refaddr($_[0]); +sub stash :lvalue { + my ( $self ) = @_; + my $ref = refaddr( $self ); $_stash{ $ref } = {} unless $_stash{ $ref }; - return $_stash{ $ref } + return $_stash{ $ref }; } 1; From 34f1f9b35b272e4cba12a0420933f5870f734128 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Wed, 24 Aug 2011 23:12:17 +0930 Subject: [PATCH 005/153] fixes addressing stuff kthakore pointed out --- lib/SDLx/App.pm | 77 +++++++++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 32 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 8c2bab7a..97a932c0 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -3,13 +3,22 @@ package SDLx::App; use strict; use warnings; +# SDL modules actually used here use SDL (); use SDL::Video (); use SDL::Mouse (); use base qw/SDLx::Surface SDLx::Controller/; +# SDL modules used for other reasons +# Please verify their usefulness here +use SDL::Rect (); +use SDL::Event (); +use SDL::Events (); +use SDL::Surface (); +use SDL::PixelFormat (); + use Carp (); -use Scalar::Util qw/refaddr/; # wont need this with SDLx::InsideOut +use Scalar::Util qw/refaddr/; sub new { my $class = shift; @@ -20,16 +29,6 @@ sub new { my $w = defined $o{width} ? $o{width} : defined $o{w} ? $o{w} : 640; my $h = defined $o{height} ? $o{height} : defined $o{h} ? $o{h} : 480; my $d = defined $o{depth} ? $o{depth} : defined $o{d} ? $o{d} : 32; - my $r = defined $o{red_size} ? $o{red_size} : defined $o{r} ? $o{r} : 5; - my $g = defined $o{green_size} ? $o{green_size} : defined $o{g} ? $o{g} : 5; - my $b = defined $o{blue_size} ? $o{blue_size} : defined $o{b} ? $o{b} : 5; - my $a = defined $o{alpha_size} ? $o{alpha_size} : defined $o{a} ? $o{a} : undef; - my $ra = defined $o{red_accum_size} ? $o{red_accum_size} : defined $o{ra} ? $o{ra} : undef; - my $ga = defined $o{green_accum_size} ? $o{green_accum_size} : defined $o{ga} ? $o{ga} : undef; - my $ba = defined $o{blue_accum_size} ? $o{blue_accum_size} : defined $o{ba} ? $o{ba} : undef; - my $aa = defined $o{alpha_accum_size} ? $o{alpha_accum_size} : defined $o{aa} ? $o{aa} : undef; - my $bs = defined $o{buffer_size} ? $o{buffer_size} : defined $o{bs} ? $o{bs} : undef; - my $ss = defined $o{stencil_size} ? $o{stencil_size} : defined $o{ss} ? $o{ss} : undef; my $pos = defined $o{position} ? $o{position} : defined $o{pos} ? $o{pos} : undef; my $s = defined $o{stash} ? $o{stash} : defined $o{s} ? $o{s} : undef; @@ -76,16 +75,16 @@ sub new { elsif( ref $f eq 'ARRAY' ) { my %flag = map { $_ => 1 } @$f; undef $f; - $f |= SDL::Video::SDL_ANYFORMAT if $flag{any_format} || $flag{af}; - $f |= SDL::Video::SDL_DOUBLEBUF if $flag{double_buf} || $flag{db}; - $f |= SDL::Video::SDL_SWSURFACE if $flag{sw_surface} || $flag{sw}; - $f |= SDL::Video::SDL_HWSURFACE if $flag{hw_surface} || $flag{hw}; - $f |= SDL::Video::SDL_ASYNCBLIT if $flag{async_blit} || $flag{ab}; - $f |= SDL::Video::SDL_HWPALETTE if $flag{hw_palette} || $flag{hwp}; - $f |= SDL::Video::SDL_FULLSCREEN if $flag{fullscreen} || $flag{fs}; - $f |= SDL::Video::SDL_OPENGL if $flag{opengl} || $flag{gl}; - $f |= SDL::Video::SDL_RESIZABLE if $flag{resizable} || $flag{rs}; - $f |= SDL::Video::SDL_NOFRAME if $flag{no_frame} || $flag{nf}; + $f |= SDL::Video::SDL_ANYFORMAT if $flag{any_format} || $flag{af}; + $f |= SDL::Video::SDL_DOUBLEBUF if $flag{double_buf} || $flag{db}; + $f |= SDL::Video::SDL_SWSURFACE if $flag{sw_surface} || $flag{sw}; + $f |= SDL::Video::SDL_HWSURFACE if $flag{hw_surface} || $flag{hw}; + $f |= SDL::Video::SDL_ASYNCBLIT if $flag{async_blit} || $flag{ab}; + $f |= SDL::Video::SDL_HWPALETTE if $flag{hw_palette} || $flag{hwp}; + $f |= SDL::Video::SDL_FULLSCREEN if $flag{fullscreen} || $flag{fs}; + $f |= SDL::Video::SDL_OPENGL if $flag{opengl} || $flag{gl}; + $f |= SDL::Video::SDL_RESIZABLE if $flag{resizable} || $flag{rs}; + $f |= SDL::Video::SDL_NOFRAME if $flag{no_frame} || $flag{nf}; } $f |= SDL::Video::SDL_ANYFORMAT if $af; $f |= SDL::Video::SDL_DOUBLEBUF if $db; @@ -108,6 +107,17 @@ sub new { bless $self, $class; if ( $gl ) { + my $r = defined $o{red_size} ? $o{red_size} : defined $o{r} ? $o{r} : 5; + my $g = defined $o{green_size} ? $o{green_size} : defined $o{g} ? $o{g} : 5; + my $b = defined $o{blue_size} ? $o{blue_size} : defined $o{b} ? $o{b} : 5; + my $a = defined $o{alpha_size} ? $o{alpha_size} : defined $o{a} ? $o{a} : undef; + my $ra = defined $o{red_accum_size} ? $o{red_accum_size} : defined $o{ra} ? $o{ra} : undef; + my $ga = defined $o{green_accum_size} ? $o{green_accum_size} : defined $o{ga} ? $o{ga} : undef; + my $ba = defined $o{blue_accum_size} ? $o{blue_accum_size} : defined $o{ba} ? $o{ba} : undef; + my $aa = defined $o{alpha_accum_size} ? $o{alpha_accum_size} : defined $o{aa} ? $o{aa} : undef; + my $bs = defined $o{buffer_size} ? $o{buffer_size} : defined $o{bs} ? $o{bs} : undef; + my $ss = defined $o{stencil_size} ? $o{stencil_size} : defined $o{ss} ? $o{ss} : undef; + $SDLx::App::USING_OPENGL = 1; SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_RED_SIZE(), $r ); SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_GREEN_SIZE(), $g ); @@ -145,10 +155,9 @@ sub new { } sub resize { - my ($self) = @_; + my ($self, $w, $h) = @_; my $flags = $self->flags; if ( $flags & SDL::Video::SDL_RESIZABLE ) { - my ( $self, $w, $h ) = @_; my $d = $self->format->BitsPerPixel; return $self = SDL::Video::set_video_mode( $w, $h, $d, $flags ) or Carp::confess( "SDL cannot set video:" . SDL::get_error ); @@ -159,16 +168,17 @@ sub resize { sub title { shift; if ( @_ ) { - my ( $title, $icon ) = @_; - $title = defined $icon ? $icon : $0 unless defined $title; - $icon = $title unless defined $icon; - return SDL::Video::wm_set_caption( $title, $icon ); + my ( $title, $icon_title ) = @_; + $title = defined $icon_title ? $icon_title : $0 unless defined $title; + $icon_title = $title unless defined $icon_title; + return SDL::Video::wm_set_caption( $title, $icon_title ); } SDL::Video::wm_get_caption(); } sub icon { - my ( undef, $icon ) = @_; + shift; + my ( $icon ) = @_; if ( defined $icon ) { unless ( eval { $icon->isa( 'SDL::Surface' ) } ) { $icon = SDL::Video::load_BMP( $icon ); @@ -181,8 +191,10 @@ sub icon { } } +# this should probably be moved to SDLx::Controller sub delay { - my ( undef, $ms ) = @_; + shift; + my ( $ms ) = @_; SDL::delay( $ms ); } @@ -202,7 +214,8 @@ sub error { } sub warp { - my ( undef, $x, $y ) = @_; + shift; + my ( $x, $y ) = @_; SDL::Mouse::warp_mouse( $x, $y ); } @@ -246,7 +259,8 @@ sub sync { sub attribute { return unless $SDLx::App::USING_OPENGL; - my ( undef, $mode, $value ) = @_; + shift; + my ( $mode, $value ) = @_; if ( defined $value ) { return SDL::Video::GL_set_attribute( $mode, $value ); } @@ -256,7 +270,6 @@ sub attribute { $returns->[1]; } -# wont need this with SDLx::InsideOut my %_stash; sub stash :lvalue { my ( $self ) = @_; From 1ad9fa5a4ffacb62b33ff859cbfaf574ec33cce5 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Thu, 25 Aug 2011 20:06:07 +0930 Subject: [PATCH 006/153] merge properly --- src/SDLx/Surface.xs | 90 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/src/SDLx/Surface.xs b/src/SDLx/Surface.xs index 8ca0bf06..cbc9af91 100644 --- a/src/SDLx/Surface.xs +++ b/src/SDLx/Surface.xs @@ -12,6 +12,10 @@ #include #include "SDLx/Validate.h" +#ifdef HAVE_SDL_GFX_PRIMITIVES +#include +#endif + SV * get_pixel32 (SDL_Surface *surface, int x, int y) { @@ -173,8 +177,6 @@ surfacex_set_pixel_xs ( surface, x, y, value ) SDL_UnlockSurface(surface); -<<<<<<< HEAD -======= void surfacex_draw_rect ( surface, rt, color ) SDL_Surface *surface @@ -197,7 +199,89 @@ surfacex_draw_rect ( surface, rt, color ) r_rect.x = 0; r_rect.y = 0; r_rect.w = surface->w; r_rect.h = surface->h; SDL_FillRect(surface, &r_rect, m_color); } ->>>>>>> 34f1f9b35b272e4cba12a0420933f5870f734128 +#ifdef HAVE_SDL_GFX_PRIMITIVES + +int +surfacex_draw_polygon(surface, vectors, color, antialias) + SDL_Surface * surface + AV* vectors + Uint32 color + SV *antialias + CODE: + AV* vx = newAV(); + AV* vy = newAV(); + int n; + for(n = 0; n <= av_len(vectors); n++) + { + if(n & 1) + av_store(vy, (int)((n-1)/2), *av_fetch(vectors, n, 0)); + else + av_store(vx, (int)(n/2), *av_fetch(vectors, n, 0)); + } + + n = av_len(vx) + 1; + + Sint16 * _vx = av_to_sint16(vx); + Sint16 * _vy = av_to_sint16(vy); + RETVAL = SvOK(antialias) + ? aapolygonColor(surface, _vx, _vy, n, color) + : polygonColor(surface, _vx, _vy, n, color); + _svinta_free( _vx, av_len(vx) ); + _svinta_free( _vy, av_len(vy) ); + OUTPUT: + RETVAL + +#endif + +void +surfacex_blit( src, dest, ... ) + SV *src + SV *dest + CODE: + src = surface(src); + dest = surface(dest); + SDL_Surface *_src = (SDL_Surface *)bag2obj(src); + SDL_Surface *_dest = (SDL_Surface *)bag2obj(dest); + + SDL_Rect _src_rect; + SDL_Rect _dest_rect; + int newly_created_rect = 0; + SV* s_rect_sv, *d_rect_sv; + int mall_sr = 0; int mall_dr = 0; + if( items > 2 && SvOK(ST(2)) ) + { + s_rect_sv = rect(ST(2), &newly_created_rect); + _src_rect = *(SDL_Rect *)bag2obj( s_rect_sv ); + mall_sr = 1; + } + else + { + _src_rect.x = 0; + _src_rect.y = 0; + _src_rect.w = _src->w; + _src_rect.h = _src->h; + } + + if( items > 3 && SvOK(ST(3)) ) + { + d_rect_sv = rect(ST(3), &newly_created_rect); + _dest_rect = *(SDL_Rect *)bag2obj( d_rect_sv ); + mall_dr = 1; + } + else + { + _dest_rect.x = 0; + _dest_rect.y = 0; + _dest_rect.w = _dest->w; + _dest_rect.h = _dest->h; + } + + SDL_BlitSurface( _src, &_src_rect, _dest, &_dest_rect ); + if ( mall_sr == 1 ) + SvREFCNT_dec( s_rect_sv); + if ( mall_dr == 1 ) + SvREFCNT_dec( d_rect_sv ); + From dae4d59bedee292334c011b363d59ae0173e213d Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sun, 18 Sep 2011 19:17:05 +0930 Subject: [PATCH 007/153] went back to branch experimental's Controller, and added a couple small features as a bonus --- lib/SDLx/Controller.pm | 47 ++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index a11efbd3..e50cd6f6 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -22,6 +22,7 @@ my %_event_handlers; my %_move_handlers; my %_show_handlers; my %_sleep_cycle; +my %_eoq; my %_paused; sub new { @@ -41,10 +42,11 @@ sub new { # $_current_time{ $ref } = $args{current_time} || 0; #no point $_stop{ $ref } = $args{stop}; $_event{ $ref } = $args{event} || SDL::Event->new(); - $_event_handlers{ $ref } = $args{event_handlers}; - $_move_handlers{ $ref } = $args{move_handlers}; - $_show_handlers{ $ref } = $args{show_handlers}; - $_sleep_cycle{ $ref } = $args{delay}; + $_event_handlers{ $ref } = $args{event_handlers} || []; + $_move_handlers{ $ref } = $args{move_handlers} || []; + $_show_handlers{ $ref } = $args{show_handlers} || []; + $_sleep_cycle{ $ref } = $args{delay}; + $_eoq{$ref} = $args{exit_on_quit} || $args{eoq} || 0; # $_paused{ $ref } = $args{paused}; #read only return $self; @@ -63,7 +65,8 @@ sub DESTROY { delete $_move_handlers{ $ref}; delete $_show_handlers{ $ref}; delete $_sleep_cycle { $ref }; - delete $_paused { $ref }; + delete $_eoq{$ref}; + delete $_paused{$ref}; } sub run { @@ -104,15 +107,27 @@ sub run { } +sub exit_on_quit { + my ($self, $value) = @_; + + my $ref = refaddr $self; + if (defined $value) { + $_eoq{$ref} = $value; + } + + return $_eoq{$ref}; +} +*eoq = \&exit_on_quit; # alias + sub pause { - my ($self, $callback) = @_; + my ($self, $callback, $event) = @_; my $ref = refaddr $self; - $callback ||= sub {1}; - my $event = SDL::Event->new(); + $event ||= SDL::Event->new(); $_paused{ $ref} = 1; while(1) { SDL::Events::wait_event($event) or Carp::confess("pause failed waiting for an event"); - if($callback->($event, $self)) { + $self->_exit_on_quit($_event{ $ref}) if $_eoq{ $ref}; + if(!$callback or $callback->($event, $self)) { $_current_time{ $ref} = Time::HiRes::time; #so run doesn't catch up with the time paused last; } @@ -124,6 +139,7 @@ sub _event { my ($self, $ref) = @_; SDL::Events::pump_events(); while ( SDL::Events::poll_event( $_event{ $ref} ) ) { + $self->_exit_on_quit( $_event{ $ref} ) if $_eoq{$ref}; foreach my $event_handler ( @{ $_event_handlers{ $ref} } ) { next unless $event_handler; $event_handler->( $_event{ $ref}, $self ); @@ -157,7 +173,6 @@ sub _add_handler { sub add_move_handler { my $ref = refaddr $_[0]; - $_[0]->remove_all_move_handlers if !$_move_handlers{ $ref }; return _add_handler( $_move_handlers{ $ref}, $_[1] ); } @@ -165,13 +180,11 @@ sub add_event_handler { my $ref = refaddr $_[0]; Carp::confess 'SDLx::App or a Display (SDL::Video::get_video_mode) must be made' unless SDL::Video::get_video_surface(); - $_[0]->remove_all_event_handlers if !$_event_handlers{ $ref }; return _add_handler( $_event_handlers{ $ref}, $_[1] ); } sub add_show_handler { my $ref = refaddr $_[0]; - $_[0]->remove_all_show_handlers if !$_show_handlers{ $ref }; return _add_handler( $_show_handlers{ $ref}, $_[1] ); } @@ -256,6 +269,14 @@ sub paused { $_paused{ refaddr $_[0]}; } -1; #not 42 man! +sub _exit_on_quit { + my ($self, $event) = @_; + + $self->stop() if $event->type == SDL_QUIT; +} + +1; __END__ + + From 063a2c7b8a5f799e9a98d3185ae916161fbec9de Mon Sep 17 00:00:00 2001 From: Blaizer Date: Fri, 30 Sep 2011 21:28:03 +0930 Subject: [PATCH 008/153] Made eoq work correctly inside pause --- lib/SDLx/Controller.pm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index e50cd6f6..8c9c1921 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -120,14 +120,15 @@ sub exit_on_quit { *eoq = \&exit_on_quit; # alias sub pause { - my ($self, $callback, $event) = @_; + my ($self, $callback) = @_; my $ref = refaddr $self; - $event ||= SDL::Event->new(); $_paused{ $ref} = 1; while(1) { - SDL::Events::wait_event($event) or Carp::confess("pause failed waiting for an event"); - $self->_exit_on_quit($_event{ $ref}) if $_eoq{ $ref}; - if(!$callback or $callback->($event, $self)) { + SDL::Events::wait_event($_event{ $ref}) or Carp::confess("pause failed waiting for an event"); + if( + $_eoq{ $ref} && do { $self->_exit_on_quit($_event{ $ref}); $_stop{ $ref} } + or !$callback or $callback->($_event{ $ref}, $self) + ) { $_current_time{ $ref} = Time::HiRes::time; #so run doesn't catch up with the time paused last; } From fd42dc96507cc2c380971f723e77efa4275132b9 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sat, 1 Oct 2011 00:53:36 +0930 Subject: [PATCH 009/153] Some changes I've been meaning to make and a little polish --- lib/SDLx/App.pm | 99 ++++++++++++++++++++++--------------------------- 1 file changed, 45 insertions(+), 54 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 458e642d..2cccdbf0 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -28,7 +28,8 @@ sub new { # undef is not a valid input my $w = defined $o{width} ? $o{width} : defined $o{w} ? $o{w} : 640; my $h = defined $o{height} ? $o{height} : defined $o{h} ? $o{h} : 480; - my $d = defined $o{depth} ? $o{depth} : defined $o{d} ? $o{d} : 32; + my $d = defined $o{depth} ? $o{depth} : defined $o{d} ? $o{d} : undef; + my $f = defined $o{flags} ? $o{flags} : defined $o{f} ? $o{f} : 0; my $pos = defined $o{position} ? $o{position} : defined $o{pos} ? $o{pos} : undef; my $s = defined $o{stash} ? $o{stash} : defined $o{s} ? $o{s} : undef; @@ -37,23 +38,29 @@ sub new { my $it = exists $o{icon_title} ? $o{icon_title} : exists $o{it} ? $o{it} : undef; my $icon = $o{icon}; my $init = $o{init}; - my $f = exists $o{flags} ? $o{flags} : exists $o{f} ? $o{f} : undef; # boolean - my $ni = $o{no_init} || $o{ni}; - my $af = $o{any_format} || $o{af}; - my $db = $o{double_buf} || $o{db}; - my $sw = $o{sw_surface} || $o{sw}; - my $hw = $o{hw_surface} || $o{hw}; - my $ab = $o{async_blit} || $o{ab}; - my $hwp = $o{hw_palette} || $o{hwp}; - my $fs = $o{fullscreen} || $o{fs}; - my $gl = $o{opengl} || $o{gl}; - my $rs = $o{resizable} || $o{rs}; - my $nf = $o{no_frame} || $o{nf}; - my $nc = $o{no_cursor} || $o{nc}; - my $cen = $o{centered} || $o{cen}; - my $gi = $o{grab_input} || $o{gi}; + my $ni = $o{no_init} || $o{ni}; + my $af = $o{any_format} || $o{af}; + my $db = $o{double_buf} || $o{db}; + my $sw = $o{sw_surface} || $o{sw}; + my $hw = $o{hw_surface} || $o{hw}; + my $ab = $o{async_blit} || $o{ab}; + my $hwp = $o{hw_palette} || $o{hwp}; + my $fs = $o{fullscreen} || $o{fs}; + my $gl = $o{opengl} || $o{gl}; + my $rs = $o{resizable} || $o{rs}; + my $nf = $o{no_frame} || $o{nf}; + my $ncur = $o{no_cursor} || $o{ncur}; + my $cen = $o{centered} || $o{cen}; + my $gi = $o{grab_input} || $o{gi}; + my $nc = $o{no_controller} || $o{nc}; + + unless( defined $d ) { + # specify SDL_ANYFORMAT if depth isn't defined + $d = 32; + $af = 1; + } unless ( $ni ) { if ( ref $init eq 'ARRAY' ) { @@ -69,23 +76,7 @@ sub new { } SDL::init( defined $init ? $init : SDL::SDL_INIT_EVERYTHING ); } - unless( defined $f ) { - $f = SDL::Video::SDL_ANYFORMAT; - } - elsif( ref $f eq 'ARRAY' ) { - my %flag = map { $_ => 1 } @$f; - undef $f; - $f |= SDL::Video::SDL_ANYFORMAT if $flag{any_format} || $flag{af}; - $f |= SDL::Video::SDL_DOUBLEBUF if $flag{double_buf} || $flag{db}; - $f |= SDL::Video::SDL_SWSURFACE if $flag{sw_surface} || $flag{sw}; - $f |= SDL::Video::SDL_HWSURFACE if $flag{hw_surface} || $flag{hw}; - $f |= SDL::Video::SDL_ASYNCBLIT if $flag{async_blit} || $flag{ab}; - $f |= SDL::Video::SDL_HWPALETTE if $flag{hw_palette} || $flag{hwp}; - $f |= SDL::Video::SDL_FULLSCREEN if $flag{fullscreen} || $flag{fs}; - $f |= SDL::Video::SDL_OPENGL if $flag{opengl} || $flag{gl}; - $f |= SDL::Video::SDL_RESIZABLE if $flag{resizable} || $flag{rs}; - $f |= SDL::Video::SDL_NOFRAME if $flag{no_frame} || $flag{nf}; - } + $f |= SDL::Video::SDL_ANYFORMAT if $af; $f |= SDL::Video::SDL_DOUBLEBUF if $db; $f |= SDL::Video::SDL_SWSURFACE if $sw; @@ -96,17 +87,18 @@ sub new { $f |= SDL::Video::SDL_OPENGL if $gl; $f |= SDL::Video::SDL_RESIZABLE if $rs; $f |= SDL::Video::SDL_NOFRAME if $nf; - $f ||= 0; $ENV{SDL_VIDEO_CENTERED} = $cen if $cen; $ENV{SDL_VIDEO_WINDOW_POS} = $pos if $pos; - my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) or Carp::confess( SDL::get_error() ); + my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) or Carp::confess( "set_video_mode failed: ", SDL::get_error() ); my $self = SDLx::Surface->new( surface => $surface ); - $self->SDLx::Controller::new( %o ); + $self->SDLx::Controller::new( %o ) unless $nc; bless $self, $class; if ( $gl ) { + $SDLx::App::USING_OPENGL = 1; + my $r = defined $o{red_size} ? $o{red_size} : defined $o{r} ? $o{r} : 5; my $g = defined $o{green_size} ? $o{green_size} : defined $o{g} ? $o{g} : 5; my $b = defined $o{blue_size} ? $o{blue_size} : defined $o{b} ? $o{b} : 5; @@ -118,21 +110,20 @@ sub new { my $bs = defined $o{buffer_size} ? $o{buffer_size} : defined $o{bs} ? $o{bs} : undef; my $ss = defined $o{stencil_size} ? $o{stencil_size} : defined $o{ss} ? $o{ss} : undef; - $SDLx::App::USING_OPENGL = 1; - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_RED_SIZE(), $r ); - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_GREEN_SIZE(), $g ); - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BLUE_SIZE(), $b ); - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ALPHA_SIZE(), $a ) if defined $a; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_RED_SIZE, $r ); + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_GREEN_SIZE, $g ); + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BLUE_SIZE, $b ); + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ALPHA_SIZE, $a ) if defined $a; SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_RED_ACCUM_SIZE(), $ra ) if defined $ra; SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_GREEN_ACCUM_SIZE(), $ga ) if defined $ga; SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BLUE_ACCUM_SIZE(), $ba ) if defined $ba; SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ALPHA_ACCUM_SIZE(), $aa ) if defined $aa; - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_DEPTH_SIZE(), $d ); - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_DOUBLEBUFFER(), $db ) if defined $db; - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BUFFER_SIZE(), $bs ) if defined $bs; - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_STENCIL_SIZE(), $ss ) if defined $ss; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_DEPTH_SIZE, $d ); + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_DOUBLEBUFFER, $db ) if defined $db; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BUFFER_SIZE, $bs ) if defined $bs; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_STENCIL_SIZE, $ss ) if defined $ss; # These could be added here? # SDL_GL_STEREO @@ -147,9 +138,9 @@ sub new { $self->title( $t, $it ); $self->icon( $icon ); - $self->show_cursor( 0 ) if $nc; + $self->show_cursor( 0 ) if $ncur; $self->grab_input( $gi ) if $gi; - $self->stash() = $s; + $self->stash = $s; $self; } @@ -173,7 +164,7 @@ sub title { $icon_title = $title unless defined $icon_title; return SDL::Video::wm_set_caption( $title, $icon_title ); } - SDL::Video::wm_get_caption(); + SDL::Video::wm_get_caption; } sub icon { @@ -199,18 +190,18 @@ sub delay { } sub ticks { - SDL::get_ticks(); + SDL::get_ticks; } sub error { shift; if( @_ == 1 and !defined $_[0] ) { - return SDL::clear_error(); + return SDL::clear_error; } if( @_ ) { return SDL_set_error_real( @_ ); } - SDL::get_error(); + SDL::get_error; } sub warp { @@ -236,7 +227,7 @@ sub fullscreen { } sub iconify { - SDL::Video::wm_iconify_window(); + SDL::Video::wm_iconify_window; } sub grab_input { @@ -251,10 +242,10 @@ sub grab_input { sub sync { if ( $SDLx::App::USING_OPENGL ) { - return SDL::Video::GL_swap_buffers(); + return SDL::Video::GL_swap_buffers; } my ( $self ) = @_; - $self->flip(); + $self->flip; } sub attribute { From 37694fba0e60fcb0741072142e66893c55e4f09a Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 13 Dec 2011 16:01:08 +1030 Subject: [PATCH 010/153] did a check with was_init instead of having to supply no_init --- lib/SDLx/App.pm | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 2cccdbf0..ea3d8166 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -40,7 +40,6 @@ sub new { my $init = $o{init}; # boolean - my $ni = $o{no_init} || $o{ni}; my $af = $o{any_format} || $o{af}; my $db = $o{double_buf} || $o{db}; my $sw = $o{sw_surface} || $o{sw}; @@ -56,24 +55,29 @@ sub new { my $gi = $o{grab_input} || $o{gi}; my $nc = $o{no_controller} || $o{nc}; - unless( defined $d ) { + unless ( defined $d ) { # specify SDL_ANYFORMAT if depth isn't defined $d = 32; $af = 1; } - unless ( $ni ) { - if ( ref $init eq 'ARRAY' ) { - my %init = map { $_ => 1 } @$init; - undef $init; - $init |= SDL::SDL_INIT_AUDIO if $init{audio} || $init{a}; - $init |= SDL::SDL_INIT_VIDEO if $init{video} || $init{v}; - $init |= SDL::SDL_INIT_CDROM if $init{cd_rom} || $init{cd}; - $init |= SDL::SDL_INIT_EVERYTHING if $init{everything} || $init{e}; - $init |= SDL::SDL_INIT_NOPARACHUTE if $init{no_parachute} || $init{np}; - $init |= SDL::SDL_INIT_JOYSTICK if $init{joystick} || $init{j}; - $init |= SDL::SDL_INIT_TIMER if $init{timer} || $init{t}; - } + #used to say unless no_init here. I don't think we need it anymore + if ( ref $init eq 'ARRAY' ) { + my %init = map { $_ => 1 } @$init; + undef $init; + $init |= SDL::SDL_INIT_AUDIO if $init{audio} || $init{a}; + $init |= SDL::SDL_INIT_VIDEO if $init{video} || $init{v}; + $init |= SDL::SDL_INIT_CDROM if $init{cd_rom} || $init{cd}; + $init |= SDL::SDL_INIT_EVERYTHING if $init{everything} || $init{e}; + $init |= SDL::SDL_INIT_NOPARACHUTE if $init{no_parachute} || $init{np}; + $init |= SDL::SDL_INIT_JOYSTICK if $init{joystick} || $init{j}; + $init |= SDL::SDL_INIT_TIMER if $init{timer} || $init{t}; + } + #if anything is already inited, only init specified extra subsystems + if ( SDL::was_init( SDL::INIT_EVERYTHING ) & (SDL_INIT_AUDIO | SDL_INIT_CDROM | SDL_INIT_EVENTTHREAD | SDL_INIT_JOYSTICK | SDL_INIT_TIMER | SDL_INIT_VIDEO) ) { + SDL::init_subsystems($init) if defined $init; + } + else { SDL::init( defined $init ? $init : SDL::SDL_INIT_EVERYTHING ); } @@ -88,6 +92,7 @@ sub new { $f |= SDL::Video::SDL_RESIZABLE if $rs; $f |= SDL::Video::SDL_NOFRAME if $nf; + #we'll let SDL decide which takes priority and set both if both are specified $ENV{SDL_VIDEO_CENTERED} = $cen if $cen; $ENV{SDL_VIDEO_WINDOW_POS} = $pos if $pos; @@ -195,10 +200,10 @@ sub ticks { sub error { shift; - if( @_ == 1 and !defined $_[0] ) { + if ( @_ == 1 and !defined $_[0] ) { return SDL::clear_error; } - if( @_ ) { + if ( @_ ) { return SDL_set_error_real( @_ ); } SDL::get_error; @@ -213,7 +218,7 @@ sub warp { sub show_cursor { shift; require SDL::Constants; - if( @_ ) { + if ( @_ ) { my ( $show ) = @_; return SDL::Mouse::show_cursor( SDL::Constants::SDL_ENABLE ) if $show; return SDL::Mouse::show_cursor( SDL::Constants::SDL_DISABLE ); @@ -232,7 +237,7 @@ sub iconify { sub grab_input { shift; - if(@_) { + if (@_) { my ( $grab ) = @_; return SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_ON ) if $grab; return SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_OFF ); From e5236f38a0b7a381345fa4e5284007696502034e Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 13 Dec 2011 18:13:42 +1030 Subject: [PATCH 011/153] and now it actually works --- lib/SDLx/App.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index ea3d8166..2dba0826 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -74,7 +74,7 @@ sub new { $init |= SDL::SDL_INIT_TIMER if $init{timer} || $init{t}; } #if anything is already inited, only init specified extra subsystems - if ( SDL::was_init( SDL::INIT_EVERYTHING ) & (SDL_INIT_AUDIO | SDL_INIT_CDROM | SDL_INIT_EVENTTHREAD | SDL_INIT_JOYSTICK | SDL_INIT_TIMER | SDL_INIT_VIDEO) ) { + if ( SDL::was_init( SDL::SDL_INIT_EVERYTHING ) & (SDL::SDL_INIT_AUDIO | SDL::SDL_INIT_CDROM | SDL::SDL_INIT_EVENTTHREAD | SDL::SDL_INIT_JOYSTICK | SDL::SDL_INIT_TIMER | SDL::SDL_INIT_VIDEO) ) { SDL::init_subsystems($init) if defined $init; } else { From 73348e9c0f0e99a6dab3062ac2c9c95c4d1037f8 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sat, 24 Dec 2011 03:16:57 +1030 Subject: [PATCH 012/153] cleaned up SDLx::App. Cleaned up SDLx::Controller and added time and sleep and made eoq handler modifiable. Added a bunch of tests to controller, still not quite everything is covered. Didn't add anything to app tests, just cleaned them up a little. PODs to come next. --- lib/SDLx/App.pm | 75 +++++++++++--------------- lib/SDLx/Controller.pm | 117 +++++++++++++++++++++++++---------------- t/sdlx_app.t | 4 +- t/sdlx_controller.t | 102 +++++++++++++++++++++++++++-------- t/sdlx_surface.t | 4 +- 5 files changed, 190 insertions(+), 112 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 2dba0826..f938ee5c 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -20,6 +20,8 @@ use SDL::PixelFormat (); use Carp (); use Scalar::Util qw/refaddr/; +my %_stash; + sub new { my $class = shift; $class = ref $class || $class; @@ -31,7 +33,7 @@ sub new { my $d = defined $o{depth} ? $o{depth} : defined $o{d} ? $o{d} : undef; my $f = defined $o{flags} ? $o{flags} : defined $o{f} ? $o{f} : 0; my $pos = defined $o{position} ? $o{position} : defined $o{pos} ? $o{pos} : undef; - my $s = defined $o{stash} ? $o{stash} : defined $o{s} ? $o{s} : undef; + my $s = defined $o{stash} ? $o{stash} : defined $o{s} ? $o{s} : {}; # undef is a valid input my $t = exists $o{title} ? $o{title} : exists $o{t} ? $o{t} : undef; @@ -75,7 +77,7 @@ sub new { } #if anything is already inited, only init specified extra subsystems if ( SDL::was_init( SDL::SDL_INIT_EVERYTHING ) & (SDL::SDL_INIT_AUDIO | SDL::SDL_INIT_CDROM | SDL::SDL_INIT_EVENTTHREAD | SDL::SDL_INIT_JOYSTICK | SDL::SDL_INIT_TIMER | SDL::SDL_INIT_VIDEO) ) { - SDL::init_subsystems($init) if defined $init; + SDL::init_sub_system( $init ) if defined $init; } else { SDL::init( defined $init ? $init : SDL::SDL_INIT_EVERYTHING ); @@ -150,6 +152,16 @@ sub new { $self; } +sub DESTROY { + my ($self) = @_; + my $ref = refaddr($self); + delete $_stash{ $ref }; +} + +sub stash :lvalue { + return $_stash{ refaddr( $_[0] ) }; +} + sub resize { my ($self, $w, $h) = @_; my $flags = $self->flags; @@ -162,9 +174,8 @@ sub resize { } sub title { - shift; - if ( @_ ) { - my ( $title, $icon_title ) = @_; + my ( undef, $title, $icon_title ) = @_; + if ( @_ > 1 ) { $title = defined $icon_title ? $icon_title : $0 unless defined $title; $icon_title = $title unless defined $icon_title; return SDL::Video::wm_set_caption( $title, $icon_title ); @@ -173,25 +184,13 @@ sub title { } sub icon { - shift; - my ( $icon ) = @_; - if ( defined $icon ) { - unless ( eval { $icon->isa( 'SDL::Surface' ) } ) { - $icon = SDL::Video::load_BMP( $icon ); - unless ( $icon ) { - require SDL::Image; - $icon = SDL::Image::load( $icon ); - } - } - SDL::Video::wm_set_icon( $icon ); - } + SDL::Video::wm_set_icon( $_[1] ); } -# this should probably be moved to SDLx::Controller +# this has been moved to SDLx::Controller in the form of time and sleep +# this can be removed at any time we wanna break compat sub delay { - shift; - my ( $ms ) = @_; - SDL::delay( $ms ); + SDL::delay( $_[1] ); } sub ticks { @@ -210,20 +209,17 @@ sub error { } sub warp { - shift; - my ( $x, $y ) = @_; + my ( undef, $x, $y ) = @_; SDL::Mouse::warp_mouse( $x, $y ); } sub show_cursor { - shift; - require SDL::Constants; - if ( @_ ) { - my ( $show ) = @_; - return SDL::Mouse::show_cursor( SDL::Constants::SDL_ENABLE ) if $show; - return SDL::Mouse::show_cursor( SDL::Constants::SDL_DISABLE ); + my (undef, $show) = @_; + if ( @_ > 1 ) { + return SDL::Mouse::show_cursor( SDL::Events::SDL_ENABLE ) if $show; + return SDL::Mouse::show_cursor( SDL::Events::SDL_DISABLE ); } - SDL::Mouse::show_cursor( SDL::Constants::SDL_QUERY ); + SDL::Mouse::show_cursor( SDL::Events::SDL_QUERY ); } sub fullscreen { @@ -236,9 +232,8 @@ sub iconify { } sub grab_input { - shift; - if (@_) { - my ( $grab ) = @_; + my (undef, $grab ) = @_; + if (@_ > 1) { return SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_ON ) if $grab; return SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_OFF ); } @@ -246,17 +241,17 @@ sub grab_input { } sub sync { + my ( $self ) = @_; if ( $SDLx::App::USING_OPENGL ) { return SDL::Video::GL_swap_buffers; } - my ( $self ) = @_; $self->flip; } sub attribute { + my ( undef, $mode, $value ) = @_; + return unless $SDLx::App::USING_OPENGL; - shift; - my ( $mode, $value ) = @_; if ( defined $value ) { return SDL::Video::GL_set_attribute( $mode, $value ); } @@ -266,12 +261,4 @@ sub attribute { $returns->[1]; } -my %_stash; -sub stash :lvalue { - my ( $self ) = @_; - my $ref = refaddr( $self ); - $_stash{ $ref } = {} unless $_stash{ $ref }; - return $_stash{ $ref }; -} - 1; diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 810ff5ee..9598741b 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -21,9 +21,11 @@ my %_event; my %_event_handlers; my %_move_handlers; my %_show_handlers; -my %_sleep_cycle; +my %_delay; my %_eoq; my %_paused; +my %_time; +my %_eoq_handler; sub new { my ($self, %args) = @_; @@ -39,29 +41,21 @@ sub new { $_dt{ $ref } = defined $args{dt} ? $args{dt} : 0.1; $_min_t{ $ref } = defined $args{min_t} ? $args{min_t} : 1 / 60; -# $_current_time{ $ref } = $args{current_time} || 0; #no point - $_stop{ $ref } = $args{stop}; +# $_current_time{ $ref } = $args{current_time} || 0; #no point +# $_stop{ $ref } = $args{stop}; #shouldn't be allowed $_event{ $ref } = $args{event} || SDL::Event->new(); $_event_handlers{ $ref } = $args{event_handlers} || []; $_move_handlers{ $ref } = $args{move_handlers} || []; $_show_handlers{ $ref } = $args{show_handlers} || []; - $_sleep_cycle{ $ref } = $args{delay}; - $_eoq{$ref} = $args{exit_on_quit} || $args{eoq} || 0; -# $_paused{ $ref } = $args{paused}; #read only + $_delay{ $ref } = (defined $args{delay} && $args{delay} >= 1 ? $args{delay} / 1000 : $args{delay}) || 0; #phasing out ticks, but still accepting them. Remove whenever we break compat + $_eoq{$ref} = $args{exit_on_quit} || $args{eoq}; +# $_paused{ $ref } = $args{paused}; #no point + $_time{ $ref } = $args{time} || 0; + $_eoq_handler{ $ref } = $args{exit_on_quit_handler} || $args{eoq_handler} || \&_default_exit_on_quit_handler; return $self; } - -sub delay { - my $self = shift; - my $delay = shift; - my $ref = refaddr $self; - - $_sleep_cycle{ $ref } = $delay if $delay; - return $self; -} - sub DESTROY { my $self = shift; my $ref = refaddr $self; @@ -74,9 +68,11 @@ sub DESTROY { delete $_event_handlers{ $ref}; delete $_move_handlers{ $ref}; delete $_show_handlers{ $ref}; - delete $_sleep_cycle { $ref }; - delete $_eoq{$ref}; - delete $_paused{$ref}; + delete $_delay { $ref}; + delete $_eoq{ $ref}; + delete $_paused{ $ref}; + delete $_time{ $ref}; + delete $_eoq_handler{ $ref}; } sub run { @@ -84,7 +80,6 @@ sub run { my $ref = refaddr $self; my $dt = $_dt{ $ref }; my $min_t = $_min_t{ $ref }; - my $t = 0.0; #Allows us to do stop and run $_stop{ $ref } = 0; @@ -100,34 +95,24 @@ sub run { my $delta_copy = $delta_time; while ( $delta_copy > $dt ) { - $self->_move( $ref, 1, $t ); #a full move + $self->_move( $ref, 1, $_time{ $ref} ); #a full move $delta_copy -= $dt; - $t += $dt; + $_time{ $ref} += $dt; } my $step = $delta_copy / $dt; - $self->_move( $ref, $step, $t ); #a partial move - $t += $dt * $step; + $self->_move( $ref, $step, $_time{ $ref} ); #a partial move + $_time{ $ref} += $dt * $step; $self->_show( $ref, $delta_time ); $dt = $_dt{ $ref}; #these can change $min_t = $_min_t{ $ref}; #during the cycle - SDL::delay( $_sleep_cycle{ $ref } ) if $_sleep_cycle{ $ref }; + + Time::HiRes::sleep( $_delay{ $ref } ) if $_delay{ $ref }; } } - -sub exit_on_quit { - my ($self, $value) = @_; - - my $ref = refaddr $self; - if (defined $value) { - $_eoq{$ref} = $value; - } - - return $_eoq{$ref}; -} -*eoq = \&exit_on_quit; # alias +sub stop { $_stop{ refaddr $_[0] } = 1 } sub pause { my ($self, $callback) = @_; @@ -136,7 +121,7 @@ sub pause { while(1) { SDL::Events::wait_event($_event{ $ref}) or Carp::confess("pause failed waiting for an event"); if( - $_eoq{ $ref} && do { $self->_exit_on_quit($_event{ $ref}); $_stop{ $ref} } + $_eoq{ $ref} && do { $_eoq_handler{ $ref}->( $_event{ $ref}, $self ); $_stop{ $ref} } or !$callback or $callback->($_event{ $ref}, $self) ) { $_current_time{ $ref} = Time::HiRes::time; #so run doesn't catch up with the time paused @@ -145,12 +130,16 @@ sub pause { } delete $_paused{ $ref}; } +sub paused { + #why would you ever want to set this? Internally set only + $_paused{ refaddr $_[0]}; +} sub _event { my ($self, $ref) = @_; SDL::Events::pump_events(); while ( SDL::Events::poll_event( $_event{ $ref} ) ) { - $self->_exit_on_quit( $_event{ $ref} ) if $_eoq{$ref}; + $_eoq_handler{ $ref}->( $_event{ $ref}, $self ) if $_eoq{ $ref}; foreach my $event_handler ( @{ $_event_handlers{ $ref} } ) { next unless $event_handler; $event_handler->( $_event{ $ref}, $self ); @@ -174,8 +163,6 @@ sub _show { } } -sub stop { $_stop{ refaddr $_[0] } = 1 } - sub _add_handler { my ( $arr_ref, $handler ) = @_; push @{$arr_ref}, $handler; @@ -276,16 +263,58 @@ sub current_time { $_current_time{ $ref}; } -sub paused { - $_paused{ refaddr $_[0]}; +sub delay { + my ($self, $arg) = @_; + my $ref = refaddr $self; + $_delay{ $ref} = $arg if defined $arg; + + $_delay{ $ref}; +} + +sub exit_on_quit { + my ($self, $arg) = @_; + my $ref = refaddr $self; + $_eoq{ $ref} = $arg if defined $arg; + + $_eoq{ $ref}; +} +*eoq = \&exit_on_quit; # alias + +sub exit_on_quit_handler { + my ($self, $arg) = @_; + my $ref = refaddr $self; + $_eoq_handler{ $ref} = $arg if defined $arg; + + $_eoq_handler{ $ref}; } +*eoq_handler = \&exit_on_quit_handler; #alias -sub _exit_on_quit { +sub _default_exit_on_quit_handler { my ($self, $event) = @_; $self->stop() if $event->type == SDL_QUIT; } +sub event { + my ($self, $arg) = @_; + my $ref = refaddr $self; + $_event{ $ref} = $arg if defined $arg; + + $_event{ $ref}; +} + +#replacements for SDLx::App->get_ticks() and delay() +sub time { + my ($self, $arg) = @_; + my $ref = refaddr $self; + $_time{ $ref} = $arg if defined $arg; + + $_time{ $ref}; +} +sub sleep { + return Time::HiRes::sleep( $_[1] ); +} + 1; __END__ diff --git a/t/sdlx_app.t b/t/sdlx_app.t index 56add72f..2499b56b 100644 --- a/t/sdlx_app.t +++ b/t/sdlx_app.t @@ -19,18 +19,20 @@ use SDLx::App; can_ok( 'SDLx::App', qw/ new + stash resize title delay ticks error warp + show_cursor fullscreen iconify grab_input sync attribute - / + / ); my $videodriver = $ENV{SDL_VIDEODRIVER}; diff --git a/t/sdlx_controller.t b/t/sdlx_controller.t index 62543be6..a0eb1d61 100644 --- a/t/sdlx_controller.t +++ b/t/sdlx_controller.t @@ -5,6 +5,7 @@ use SDL; use SDL::Config; use SDL::Video; use SDL::Color; +use SDL::Event; use SDLx::Controller; use Scalar::Util 'refaddr'; use lib 't/lib'; @@ -13,11 +14,13 @@ use SDL::TestTool; can_ok( 'SDLx::Controller', qw( - new run stop pause dt min_t current_time + new run stop pause paused + dt min_t current_time delay time eoq exit_on_quit event add_move_handler add_event_handler add_show_handler remove_move_handler remove_event_handler remove_show_handler remove_all_move_handlers remove_all_event_handlers remove_all_show_handlers - move_handlers event_handlers show_handlers eoq exit_on_quit + move_handlers event_handlers show_handlers exit_on_quit_handler eoq_handler + time sleep ) ); @@ -26,38 +29,88 @@ TODO: { can_ok( 'SDLx::Controller', qw( ) ); } +# defaults my $app = SDLx::Controller->new; isa_ok( $app, 'SDLx::Controller', 'default controller can be spawned' ); -is($app->dt, 0.1, 'default dt set to 0.1'); -is($app->min_t, 1 / 60, 'default min_t set to 1/60' ); -is($app->eoq, 0, 'no eoq by default'); -is($app->exit_on_quit, 0, 'no exit_on_quit by default'); +is($app->dt, 0.1, 'default dt set to 0.1' ); +is($app->min_t, 1/60, 'default min_t set to 1/60' ); +is($app->delay, 0, 'default delay set to 0' ); is( scalar @{ $app->move_handlers }, 0, 'no motion handlers by default' ); is( scalar @{ $app->show_handlers }, 0, 'no show handlers by default' ); is( scalar @{ $app->event_handlers }, 0, 'no event handlers by default' ); - -is( $app->exit_on_quit, 0, 'exit_on_quit is not set by default' ); -is( $app->eoq, 0, 'eoq() is a method alias to exit_on_quit()' ); +isa_ok($app->event, 'SDL::Event', 'SDL::Event for controller created' ); +is($app->time, 0, 'time started at 0' ); +ok( !$app->exit_on_quit, 'exit_on_quit is not set by default' ); +ok( !$app->eoq, 'eoq() is a method alias to exit_on_quit()' ); +is(ref $app->exit_on_quit_handler, 'CODE', 'default eoq handler set' ); +is($app->eoq_handler, \&SDLx::Controller::_default_exit_on_quit_handler, 'eoq_handler is an alias' ); +is($app->current_time, undef, 'current_time has not been set yet' ); + +# modifying with param methods $app->exit_on_quit(1); is( scalar @{ $app->event_handlers }, 0, 'exit_on_quit does not trigger event handlers' ); -is( $app->exit_on_quit, 1, 'exit_on_quit can be set dynamically' ); -is( $app->eoq, 1, 'eoq() follows exit_on_quit()' ); +ok( $app->exit_on_quit, 'exit_on_quit can be set dynamically' ); +ok( $app->eoq, 'eoq() follows exit_on_quit()' ); $app->remove_all_event_handlers; -is( $app->exit_on_quit, 1, 'exit_on_quit is not an event handler' ); -is( $app->eoq, 1, 'eoq() still follows exit_on_quit()' ); +ok( $app->exit_on_quit, 'exit_on_quit is not an event handler' ); +ok( $app->eoq, 'eoq() still follows exit_on_quit()' ); $app->eoq(0); -is( $app->eoq, 0, 'eoq can be set dynamically' ); -is( $app->exit_on_quit, 0, 'exit_on_quit() follows eoq()' ); - +ok( !$app->eoq, 'eoq can be set dynamically' ); +ok( !$app->exit_on_quit, 'exit_on_quit() follows eoq()' ); + +$app->dt(1337); +is( $app->dt, 1337, 'dt can be changed with method' ); +$app->min_t(123); +is( $app->min_t, 123, 'min_t can be changed with method' ); +$app->delay(555); +is( $app->delay, 555, 'delay can be changed with method' ); +my $event = SDL::Event->new; +$app->event($event); +is( $app->event, $event, 'event can be changed with method' ); +$app->time(20.3); +is( $app->time, 20.3, 'time can be changed with method' ); +$app->exit_on_quit_handler(\&dummy_sub); +is( $app->exit_on_quit_handler, \&dummy_sub, 'exit_on_quit_handler can be changed with method' ); +is( $app->eoq_handler, \&dummy_sub, 'eoq_handler is an alias' ); +$app->eoq_handler(\&dummy_sub2); +is( $app->exit_on_quit_handler, \&dummy_sub2, 'eoq_handler can be changed with method' ); +is( $app->eoq_handler, \&dummy_sub2, 'and it is an alias again' ); +$app->current_time(9.95); +is( $app->current_time, 9.95, 'current_time can be changed with method' ); + +my ($dummy_ref1, $dummy_ref2, $dummy_ref3) = ([], [sub {}, \&dummy_sub], [\&dummy_sub2, sub {}, sub {}]); + +# constructor set params $app = SDLx::Controller->new( - dt => 0.1, - min_t => 0.5, + dt => 0.1255, + min_t => 0.467, + event => $event, + event_handlers => $dummy_ref1, + move_handlers => $dummy_ref2, + show_handlers => $dummy_ref3, + delay => 0.262, + eoq => 1, + time => 99, + eoq_handler => \&dummy_sub2, ); isa_ok( $app, 'SDLx::Controller' ); -is($app->dt, 0.1, 'new dt set to 0.1'); -is($app->min_t, 0.5, 'new min_t set to 0.5' ); - +is($app->dt, 0.1255, 'dt set in constructor'); +is($app->min_t, 0.467, 'min_t set in constructor' ); +is($app->event, $event, 'event set in constructor' ); +is($app->event_handlers, $dummy_ref1, 'event_handlers set in constructor' ); +is($app->move_handlers, $dummy_ref2, 'move_handlers set in constructor' ); +is($app->show_handlers, $dummy_ref3, 'show_handlers set in constructor' ); +is($app->delay, 0.262, 'delay set in constructor' ); +ok($app->eoq, 'eoq set in constructor' ); +is($app->time, 99, 'time set in constructor' ); +is($app->eoq_handler, \&dummy_sub2, 'eoq_handler set in constructor' ); + +# and now the app for the next part of testing +$app = SDLx::Controller->new( + dt => 0.1, + min_t => 0.5, +); sub dummy_sub {1} sub dummy_sub2 {1} @@ -151,4 +204,11 @@ $app->run(); cmp_ok($move_inc, '>=', 30, 'called our motion handlers at least 30 times'); is($show_inc, 30, 'called our show handlers exactly 30 times'); +#TODO testing: +#pause and paused +#current_time +#delay +#time +#sleep + done_testing; diff --git a/t/sdlx_surface.t b/t/sdlx_surface.t index b524c92c..8d1e8839 100644 --- a/t/sdlx_surface.t +++ b/t/sdlx_surface.t @@ -216,12 +216,12 @@ SKIP: pass 'draw_trigon_filled works'; } - is( $surfs[0]->draw_polygon( [ [100, 10], [110, 10], [110, 20] ], [ 255, 0, 0, 255 ] ), $surfs[0], 'draw_polygon returns self' ); + is( $surfs[0]->draw_polygon( [ [100, 10], [110, 10], [110, 20] ], [ 255, 0, 0, 255 ], 1 ), $surfs[0], 'draw_polygon returns self' ); is( $surfs[0]->draw_polygon_filled( [ [100, 10], [110, 10], [110, 20] ], [ 255, 0, 0, 255 ] ), $surfs[0], 'draw_polygon_filled returns self' ); foreach my $color (@colors_t) { my $color = [ 255, 0, 0, 255 ]; my $verts = [ [100, 10], [110, 10], [110, 20], [100, 20] ]; - $surfs[0]->draw_polygon( $verts, $color ); #no fill + $surfs[0]->draw_polygon( $verts, $color, 0 ); #no fill $surfs[0]->draw_polygon( $verts, $color, 1 ); $surfs[0]->draw_polygon_filled( $verts, $color ); #fill isnt( $surfs[0]->[100][10], 0 ); From 91af091bdc3995cfd5efef85be96349c2652f985 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sat, 24 Dec 2011 14:44:30 +1030 Subject: [PATCH 013/153] Completed and reworded and made the controller POD all nice and good. --- lib/SDLx/Controller.pm | 5 +- lib/pods/SDLx/Controller.pod | 345 +++++++++++++++++++++++------------ 2 files changed, 234 insertions(+), 116 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 9598741b..b940670d 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -90,7 +90,10 @@ sub run { my $new_time = Time::HiRes::time; my $delta_time = $new_time - $_current_time{ $ref }; - next if $delta_time < $min_t; + if($delta_time < $min_t) { + Time::HiRes::sleep(0.001); #sleep at least a millisecond + next; + } $_current_time{ $ref} = $new_time; my $delta_copy = $delta_time; diff --git a/lib/pods/SDLx/Controller.pod b/lib/pods/SDLx/Controller.pod index 19fdec8e..5dc0992a 100644 --- a/lib/pods/SDLx/Controller.pod +++ b/lib/pods/SDLx/Controller.pod @@ -13,7 +13,7 @@ Extension, Controller # create our controller object my $app = SDLx::Controller->new; - + # we could also do: my $app = SDLx::App->new; # because App is also a controller @@ -32,9 +32,9 @@ The core of an SDL application/game is the main loop, where you handle events and display your elements on the screen until something signals the end of the program. This usually goes in the form of: - while (1) { - ... - } + while (1) { + ... + } The problem most developers face, besides the repetitive work, is to ensure the screen update is independent of the frame rate. Otherwise, your game will @@ -55,38 +55,85 @@ ease. =head2 new SDLx::Controller->new( - dt => 0.5, - min_t => 0, - event => $event_object, + dt => 0.05, + min_t => 0, + delay => 1 / 200, + eoq => 1, + eoq_handler => \&eoq_handler, + event_handlers => [ @event_callbacks ], + move_handlers => [ @move_callbacks ], + show_handlers => [ @show_callbacks ], + event => $event, + time => 99, ); -The C
parameter specifies the length, in seconds, of a full movement step, and defaults to 0.1. -The C
can be anything and the game can still look the same. -It is only when you change the C
without changing all the things in the movement step that are being multiplied by the first move argument that it will make a difference. +Creates and returns a new controller object with the specified params. +All params are optional and have sane defaults. + +=over + +=item dt + +The length, in seconds, of a full movement step. Defaults to 0.1. +The C
can be anything and the game can still look the same. +It is only when you change the C
without changing the rest of the constants in the move step that it will have a time scaling difference. If you lower the C
, everything will move faster than it did with it set higher, and vice-versa. This is useful to add slo-mo and fast-forward features to the game, all you would have to do is change the C
. -C specifies the minimum time, in seconds, that has to accumulate before any move or show handlers are called, and defaults to 1 / 60. -Having the C at 1 / 60 ensures that the controller can update the screen at a maximum of 60 times per second. +=item min_t + +The minimum time, in seconds, that has to accumulate before any move or show handlers are called. Defaults to 1 / 60. +A C of 1 / 60 ensures that the controller can update the screen at a maximum of 60 times per second. A "V-Sync" such as this is necessary to prevent video "tear", which occurs when the app is updating faster than the monitor can display. -Setting it to 0, as seen above, will let the app run as fast as it possibly can. +Setting it to 0, as seen above, will not delay the loop at all. + +=item delay + +The time, in seconds, to delay after every full app loop. Defaults to 0. +B Picking a good delay based on the needs can hugely reduce CPU load and pressure. + +=item exit_on_quit (shortcut: eoq) -C specifies a loop delay in millisecs to place on the controller loop. B Picking a good delay based on the needs can help reduce CPU load and pressure. +If true, the app loop will stop when an C event is triggered. Defaults to false. +You can also specify your own exit on quit handler, but the default will do exactly what was just mentioned. -C is a SDL::Event object that events going to the event callbacks are polled in to. It defaults to C<< SDL::Event->new() >>. +=item exit_on_quit_handler (shortcut: eoq_handler) -All parameters are optional. +An alternative callback to handle quitting. Defaults to a callback that stops the event loop on an C event. +Things that should be specified here are additional ways to end the app, like on pressing Esc or Alt-F4. -Returns the new object. +=item event_handlers + +=item move_handlers + +=item show_handlers + +An array ref of the corresponding handler callbacks. All default to []. +This is basically a shortcut way of adding handlers. +They would otherwise be added with their corresponding C method. +See below for a full explanation of the L loop and handlers. + +=item event + +The C object that events going to the event callbacks are polled in to. Defaults to C<< SDL::Event->new() >>. + +=item time + +The starting time, in seconds, that you want the time since the app loop started to be at. Defaults to 0. +You'll seldom have to set this param. + +=back =head2 run + $app->run; + After creating and setting up your handlers (see below), call this method to activate the main loop. The main loop will run until C is called. -All hooked functions will be called during the main loop, in this order: +All added handlers will be called during the main loop, in this order: -=over 4 +=over =item 1. Events @@ -96,109 +143,67 @@ All hooked functions will be called during the main loop, in this order: =back -Please refer to each handler below for information on received arguments. -Note that the second argument every callback recieves is the C object. +Please refer to each handler below for full information on what they do. +Note that the second argument every callback recieves is the app object. =head2 stop Returns from the C loop. -=head2 pause - -Attempts to pause the application with a call to C. See L. - -Takes 1 argument which is a callback. The application waits for the next event with C. -When one is recieved, it is passed to the callback as the first argument, along with the C object as the second argument. -If the callback then returns a true value, C will return. -If the callback returns a false value, C will repeat the process. - -This can be used to easily implement a pause when the app loses focus: +=head2 add_event_handler - sub window { - my ($e, $app) = @_; - if($e->type == SDL_QUIT) { - $app->stop; - # quit handling is here so that the app - # can be stopped while paused + my $index = $app->add_event_handler( + sub { + my ($event, $app) = @_; + # handle event ... } - elsif($e->type == SDL_ACTIVEEVENT) { - if($e->active_state & SDL_APPINPUTFOCUS) { - if($e->active_gain) { - return 1; - } - else { - $app->pause(\&window); - # recursive, but only once since the window - # can't lose focus again without gaining it first - } - } - } - return 0; - } - -Note: if you implement your own pause function, remember to update C to the current time when the application unpauses. -This should be done with C. -Otherwise, time will accumulate while the application is paused, and many movement steps will be called all at once when it unpauses. + ); -Note 2: a pause will be potentially dangerous to the C cycle (even if you implement your own) unless called by an C callback. +Add a callback to the list to handle events. +You can add as many subs as you need. +For each SDL::Event from the user, all registered callbacks will supplied with it in order. +Returns the index of the added callback. -=head2 paused +Events from the user will one by one be polled into the app's L object. +Each event will then be passed to all of the registered callbacks as the first argument. +The argument second is the C object. -Returns 1 if the app is paused, undef otherwise. -This is only useful when used within code that will be run by C: +Below is an example of an equivalent event handler to the default exit on quit action. +This is just an example of an event handler, it's not recommended to make the stop handler an event handler (as shown at the bottom of the example). - sub pause { - # press P to toggle pause - - my ($e, $app) = @_; - if($e->type == SDL_QUIT) { + sub stop { + my ($event, $app) = @_; + if($event->type == SDL_QUIT) { $app->stop; - # quit handling is here so that the app - # can be stopped while paused - } - elsif($e->type == SDL_KEYDOWN) { - if($e->key_sym == SDLK_p) { - # We're paused, so end pause - return 1 if $app->paused; - - # We're not paused, so pause - $app->pause(\&pause); - } } - return 0; - } - -=head2 add_event_handler - -Register a callback to handle events. You can add as many subs as you need. -Whenever a SDL::Event occurs, all registered callbacks will be triggered in -order. Returns the order queue number of the added callback. - -The first argument passed to registered callbacks is the L<< SDL::Event >> object. -The second is the C object. - - sub stop { - my ($event, $app) = @_; - if($event->type == SDL_QUIT) { - $app->stop; - } } $app->add_event_handler(\&stop); + # but we should really be doing this + $app->exit_on_quit_handler(\&stop); + =head2 add_move_handler -Register a callback to update your objects. You can add as many subs as -you need. Returns the order queue number of the added callback. + my $index = $app->add_move_handler( + sub { + my ($step, $app, $time) = @_; + # handle moving ... + } + ); +Add a callback to the list to handle the moving of your objects. +You can add as many subs as you need. All registered callbacks will be triggered in order for as many C
as have happened between calls, and once more for any remaining time less than C
. +Returns the index of the added callback. + The first argument passed to the callbacks is the portion of the step, which will be 1 for a full step, and less than 1 for a partial step. -Movement values should be multiplied by this value. -The full steps correspond to the amount of C
passed between calls, and the partial step corresponds to the call with the remaining time less than C
. -The argument can be 0 if no time has passed since the last cycle. If you need to protect against this, set a C, or put a C<< return unless $_[0] >> at the start of every move handler. +Inversely, the time that the each move callback should handle is equal to the step argument multiplied by the C
. All movement values should be multiplied by the step value. +The argument can be 0 if no time has passed since the last cycle. It's best to protect against this by supplying the app a small L value. + +The second argument passed to the callbacks is the app object. -The second argument passed to the callbacks is the C object. -The third is the total amount of time passed since the call of C. +The third is the total amount of time passed in the run loop, and is also accessed with the L method. You should use these handlers to update your in-game objects, check collisions, etc. so you can check and/or update it as necessary. @@ -208,29 +213,55 @@ so you can check and/or update it as necessary. $ball->move_x( $ball->x_vel * $step ); $ball->move_y( $ball->y_vel * $step ); } + $app->add_move_handler(\&move_ball); =head2 add_show_handler -Register a callback to render objects. You can add as many subs as you need. -Returns the order queue number of the added callback. -All registered callbacks will be triggered in order, once per run of the C loop. + my $index = $app->add_show_handler( + sub { + my ($delta, $app) = @_; + # handle showing ... + } + ); -The first argument passed is the time, in seconds, since the previous call. -The second is the C object. +Add a callback to the list to handle the rendering of objects. +You can add as many subs as you need. +All registered callbacks will be triggered in order, once per run of the L loop. +Returns the index of the added callback. + +The first argument passed is the time, in seconds, since the previous show. +The second is the app object. sub show_ball { my ($delta, $app) = @_; + + # the drawing below will only work if the app is an SDLx::App + # and not just a controller $app->draw_rect( [ $ball->x, $ball->y, $ball->size, $ball->size ], $ball->colour ); } + $app->add_show_handler(\&show_ball); + +=head2 event_handlers + +=head2 move_handlers + +=head2 show_handlers -=head2 remove_move_handler( $index ) + my $handlers = $app->..._handlers; -=head2 remove_event_handler( $index ) +Returns the corresponding array ref so that you can directly modify the handler list. -=head2 remove_show_handler( $index ) +=head2 remove_event_handler + +=head2 remove_move_handler + +=head2 remove_show_handler + + $app->remove_..._handler( $index ); + $app->remove_...handler( $callback ); Removes the handler with the given index from the respective calling queue. @@ -239,26 +270,114 @@ The first coderef in the handler list that this matches will be removed. Returns the removed handler. -=head2 remove_all_move_handlers - =head2 remove_all_event_handlers +=head2 remove_all_move_handlers + =head2 remove_all_show_handlers + $app->remove_all_..._handlers(); + Removes all handlers from the respective calling queue. =head2 remove_all_handlers -Quick access to removing all handlers at once. + $app->remove_all_handlers(); + +Shortcut to remove all handlers at once. + +=head2 pause + + $app->pause( + sub { + my ($event, $app) = @_; + # handle event ... + + return 1 if ... ; # unpause + return 0; # stay paused + } + ); + +Attempts to pause the application with a call to C. + +Takes 1 argument which is a callback. The application waits for the next event with C. +When one is recieved, it is passed to the callback as the first argument, along with the app object as the second argument. +If the callback then returns a true value, C will return. +If the callback returns a false value, C will repeat the process. + +Exit handling will work as it does in the app loop if L is true. +Otherwise, you will have to provide your own exit handling in the pause callback if you want to allow the app to be stopped while being paused. + +This can be used to easily implement a pause when the app loses focus: + + sub window { + my ($e, $app) = @_; + if($e->type == SDL_ACTIVEEVENT) { + if($e->active_state & SDL_APPINPUTFOCUS) { + if($e->active_gain) { + return 1; + } + else { + $app->pause(\&window); + # recursive, but only once since the window + # can't lose focus again without gaining it first + } + } + } + return 0; + } + $app->add_event_handler(\&pause); + +Note: if you implement your own pause function, remember to update C to the current time when the application unpauses. +This should be done with L. +Otherwise, time will accumulate while the application is paused, and many movement steps will be called all at once when it unpauses. + +Note 2: a pause will be potentially dangerous to the C cycle (even if you implement your own) unless called by an C callback. + +=head2 paused + +Returns 1 if the app is paused, undef otherwise. +This is only useful when used within code that will be run by L: + + sub toggle_pause { + # press P to toggle pause + + my ($e, $app) = @_; + if($e->type == SDL_KEYDOWN) { + if($e->key_sym == SDLK_p) { + # We're paused, so end pause + return 1 if $app->paused; + + # We're not paused, so pause + $app->pause(\&toggle_pause); + } + } + return 0; + } + $app->add_event_handler(\&toggle_pause); +All the examples here are of recursive pause callbacks, but, of course, yours don't have to be. + =head2 dt +=head2 exit_on_quit + =head2 min_t +=head2 delay + +=head2 exit_on_quit_handler + +=head2 event + +=head2 time + =head2 current_time If an argument is passed, modifies the corresponding value to the argument. C
and C will keep their old value until the beginning of the next C cycle. +See L for details on what all of these params affect. +L mentions C in a note, other than there it shouldn't be touched. Returns the corresponding value. @@ -268,10 +387,6 @@ See L. =head2 ACKNOWLEGDEMENTS -The idea and base for this module comes from Lazy Foo's L<< Frame Independent +The idea and base for the L loop comes from Lazy Foo's L<< Frame Independent Movement|http://www.lazyfoo.net/SDL_tutorials/lesson32/index.php >> tutorial, and Glenn Fiedler's L<< Fix Your Timestep|http://gafferongames.com/game-physics/fix-your-timestep/ >> article on timing. - - - - From d5f421c96c036da286df5bacc40c5b773432fe31 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sat, 24 Dec 2011 14:57:59 +1030 Subject: [PATCH 014/153] Forgot time and sleep in the controller pod, forgot shortcuts for param methods and fixed a bit of explanation about param methods. --- lib/pods/SDLx/Controller.pod | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/pods/SDLx/Controller.pod b/lib/pods/SDLx/Controller.pod index 5dc0992a..32c2249e 100644 --- a/lib/pods/SDLx/Controller.pod +++ b/lib/pods/SDLx/Controller.pod @@ -362,18 +362,23 @@ All the examples here are of recursive pause callbacks, but, of course, yours do =head2 exit_on_quit +(shortcut: eoq) + =head2 min_t =head2 delay =head2 exit_on_quit_handler -=head2 event +(shortcut: eoq_handler) -=head2 time +=head2 event =head2 current_time + my $param = $app->...; + $app->...($param); + If an argument is passed, modifies the corresponding value to the argument. C
and C will keep their old value until the beginning of the next C cycle. See L for details on what all of these params affect. @@ -381,6 +386,23 @@ L mentions C in a note, other than there it shouldn't be t Returns the corresponding value. +=head2 time + + my $time = $app->time; + $app->time($time); + +Returns the total time, in hi-res seconds, the app loop has been running. +Use this instead of L. +Although you shouldn't need to, you can supply a different time to reset it to counting from that value. +This will (probably) have no effect on the L loop. Change L if you want to have an effect. + +=head2 sleep + + $app->sleep($time); + +Causes the app to sleep for the specified time, in hi-res seconds, or forever if no argument is specified. +Use this instead of L. + =head1 AUTHORS See L. From e5661fbf72b0654367ab90efe9b058505239b3aa Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 17 Jan 2012 03:20:21 +1030 Subject: [PATCH 015/153] SDLx:App -- changed shortcuts around a lot and cleaned up everything existing --- lib/SDLx/App.pm | 192 +++++++++++++++++++++-------------------- lib/SDLx/Controller.pm | 7 +- lib/pods/SDLx/App.pod | 86 +++++++++--------- t/sdlx_app.t | 7 +- 4 files changed, 151 insertions(+), 141 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index f938ee5c..011842f9 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -7,14 +7,14 @@ use warnings; use SDL (); use SDL::Video (); use SDL::Mouse (); +use SDL::Event (); +use SDL::Surface (); use base qw/SDLx::Surface SDLx::Controller/; # SDL modules used for other reasons # Please verify their usefulness here use SDL::Rect (); -use SDL::Event (); use SDL::Events (); -use SDL::Surface (); use SDL::PixelFormat (); use Carp (); @@ -22,67 +22,73 @@ use Scalar::Util qw/refaddr/; my %_stash; +$SDLx::App::USING_OPENGL = 0; + sub new { my $class = shift; $class = ref $class || $class; my %o = @_; # undef is not a valid input - my $w = defined $o{width} ? $o{width} : defined $o{w} ? $o{w} : 640; - my $h = defined $o{height} ? $o{height} : defined $o{h} ? $o{h} : 480; - my $d = defined $o{depth} ? $o{depth} : defined $o{d} ? $o{d} : undef; - my $f = defined $o{flags} ? $o{flags} : defined $o{f} ? $o{f} : 0; - my $pos = defined $o{position} ? $o{position} : defined $o{pos} ? $o{pos} : undef; - my $s = defined $o{stash} ? $o{stash} : defined $o{s} ? $o{s} : {}; + my $w = defined $o{width} ? $o{width} : defined $o{w} ? $o{w} : 640; + my $h = defined $o{height} ? $o{height} : defined $o{h} ? $o{h} : 480; + my $d = defined $o{depth} ? $o{depth} : defined $o{d} ? $o{d} : undef; + my $f = defined $o{flags} ? $o{flags} : defined $o{f} ? $o{f} : 0; + my $pos = defined $o{position} ? $o{position} : defined $o{pos} ? $o{pos} : undef; + my $s = defined $o{stash} ? $o{stash} : {}; # undef is a valid input - my $t = exists $o{title} ? $o{title} : exists $o{t} ? $o{t} : undef; - my $it = exists $o{icon_title} ? $o{icon_title} : exists $o{it} ? $o{it} : undef; - my $icon = $o{icon}; - my $init = $o{init}; + my $t = $o{title}; + my $it = $o{icon_title}; + my $icon = $o{icon}; + my $init = exists $o{initialize} ? $o{initialize} : $o{init}; # boolean - my $af = $o{any_format} || $o{af}; - my $db = $o{double_buf} || $o{db}; - my $sw = $o{sw_surface} || $o{sw}; - my $hw = $o{hw_surface} || $o{hw}; - my $ab = $o{async_blit} || $o{ab}; - my $hwp = $o{hw_palette} || $o{hwp}; - my $fs = $o{fullscreen} || $o{fs}; - my $gl = $o{opengl} || $o{gl}; - my $rs = $o{resizable} || $o{rs}; - my $nf = $o{no_frame} || $o{nf}; - my $ncur = $o{no_cursor} || $o{ncur}; - my $cen = $o{centered} || $o{cen}; - my $gi = $o{grab_input} || $o{gi}; - my $nc = $o{no_controller} || $o{nc}; - + my $af = $o{any_format}; + my $db = $o{double_buffer} || $o{double_buf} || $o{dbl_buf}; + my $sw = $o{software_surface} || $o{sw_surface} || $o{sw}; + my $hw = $o{hardware_surface} || $o{hw_surface} || $o{hw}; + my $ab = $o{asynchronous_blit} || $o{async_blit}; + my $hwp = $o{hardware_palette} || $o{hw_palette} || $o{hw_pal}; + my $fs = $o{full_screen} || $o{fullscreen}; + my $gl = $o{open_gl} || $o{opengl} || $o{gl}; + my $rs = $o{resizable}; + my $nf = $o{no_frame}; + my $ncur = $o{no_cursor}; + my $cen = $o{centered} || $o{center}; + my $gi = $o{grab_input}; + my $nc = $o{no_controller}; + unless ( defined $d ) { - # specify SDL_ANYFORMAT if depth isn't defined + # specify SDL_ANYFORMAT flag if depth isn't defined $d = 32; $af = 1; } - #used to say unless no_init here. I don't think we need it anymore + # used to say unless no_init here. I don't think we need it anymore if ( ref $init eq 'ARRAY' ) { + # make a hash with keys of the values in the init array my %init = map { $_ => 1 } @$init; undef $init; - $init |= SDL::SDL_INIT_AUDIO if $init{audio} || $init{a}; - $init |= SDL::SDL_INIT_VIDEO if $init{video} || $init{v}; - $init |= SDL::SDL_INIT_CDROM if $init{cd_rom} || $init{cd}; - $init |= SDL::SDL_INIT_EVERYTHING if $init{everything} || $init{e}; - $init |= SDL::SDL_INIT_NOPARACHUTE if $init{no_parachute} || $init{np}; - $init |= SDL::SDL_INIT_JOYSTICK if $init{joystick} || $init{j}; - $init |= SDL::SDL_INIT_TIMER if $init{timer} || $init{t}; + + $init |= SDL::SDL_INIT_AUDIO if $init{audio}; + $init |= SDL::SDL_INIT_CDROM if $init{cd_rom} || $init{cdrom}; + $init |= SDL::SDL_INIT_EVERYTHING if $init{everything}; + $init |= SDL::SDL_INIT_NOPARACHUTE if $init{no_parachute}; + $init |= SDL::SDL_INIT_JOYSTICK if $init{joystick}; + $init |= SDL::SDL_INIT_TIMER if $init{timer}; } - #if anything is already inited, only init specified extra subsystems - if ( SDL::was_init( SDL::SDL_INIT_EVERYTHING ) & (SDL::SDL_INIT_AUDIO | SDL::SDL_INIT_CDROM | SDL::SDL_INIT_EVENTTHREAD | SDL::SDL_INIT_JOYSTICK | SDL::SDL_INIT_TIMER | SDL::SDL_INIT_VIDEO) ) { - SDL::init_sub_system( $init ) if defined $init; + + # if anything is already inited, only init specified extra subsystems + if ( SDL::was_init( SDL::SDL_INIT_AUDIO | SDL::SDL_INIT_CDROM | SDL::SDL_INIT_EVENTTHREAD | SDL::SDL_INIT_JOYSTICK | SDL::SDL_INIT_TIMER | SDL::SDL_INIT_VIDEO ) ) { + # I'm assuming we always wanna init video + SDL::init_sub_system( ($init || 0) | SDL::SDL_INIT_VIDEO ); } else { - SDL::init( defined $init ? $init : SDL::SDL_INIT_EVERYTHING ); + # I'm assuming we always wanna init video + SDL::init( defined $init ? $init | SDL::SDL_INIT_VIDEO : SDL::SDL_INIT_EVERYTHING ); } - + $f |= SDL::Video::SDL_ANYFORMAT if $af; $f |= SDL::Video::SDL_DOUBLEBUF if $db; $f |= SDL::Video::SDL_SWSURFACE if $sw; @@ -94,28 +100,35 @@ sub new { $f |= SDL::Video::SDL_RESIZABLE if $rs; $f |= SDL::Video::SDL_NOFRAME if $nf; - #we'll let SDL decide which takes priority and set both if both are specified + # we'll let SDL decide which takes priority and set both if both are specified $ENV{SDL_VIDEO_CENTERED} = $cen if $cen; $ENV{SDL_VIDEO_WINDOW_POS} = $pos if $pos; - my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) or Carp::confess( "set_video_mode failed: ", SDL::get_error() ); - my $self = SDLx::Surface->new( surface => $surface ); + my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) + or Carp::confess( "set_video_mode failed: ", SDL::get_error() ); + my $self = bless SDLx::Surface->new( surface => $surface ), $class; $self->SDLx::Controller::new( %o ) unless $nc; - bless $self, $class; if ( $gl ) { $SDLx::App::USING_OPENGL = 1; - - my $r = defined $o{red_size} ? $o{red_size} : defined $o{r} ? $o{r} : 5; - my $g = defined $o{green_size} ? $o{green_size} : defined $o{g} ? $o{g} : 5; - my $b = defined $o{blue_size} ? $o{blue_size} : defined $o{b} ? $o{b} : 5; - my $a = defined $o{alpha_size} ? $o{alpha_size} : defined $o{a} ? $o{a} : undef; - my $ra = defined $o{red_accum_size} ? $o{red_accum_size} : defined $o{ra} ? $o{ra} : undef; - my $ga = defined $o{green_accum_size} ? $o{green_accum_size} : defined $o{ga} ? $o{ga} : undef; - my $ba = defined $o{blue_accum_size} ? $o{blue_accum_size} : defined $o{ba} ? $o{ba} : undef; - my $aa = defined $o{alpha_accum_size} ? $o{alpha_accum_size} : defined $o{aa} ? $o{aa} : undef; - my $bs = defined $o{buffer_size} ? $o{buffer_size} : defined $o{bs} ? $o{bs} : undef; - my $ss = defined $o{stencil_size} ? $o{stencil_size} : defined $o{ss} ? $o{ss} : undef; + + my $r = defined $o{gl_red_size} ? $o{gl_red_size} : defined $o{gl_red} ? $o{gl_red} : 5; + my $g = defined $o{gl_green_size} ? $o{gl_green_size} : defined $o{gl_green} ? $o{gl_green} : 5; + my $b = defined $o{gl_blue_size} ? $o{gl_blue_size} : defined $o{gl_blue} ? $o{gl_blue} : 5; + my $a = defined $o{gl_alpha_size} ? $o{gl_alpha_size} : defined $o{gl_alpha} ? $o{gl_alpha} : undef; + my $ra = defined $o{gl_red_accum_size} ? $o{gl_red_accum_size} : defined $o{gl_red_accum} ? $o{gl_red_accum} : undef; + my $ga = defined $o{gl_green_accum_size} ? $o{gl_green_accum_size} : defined $o{gl_green_accum} ? $o{gl_green_accum} : undef; + my $ba = defined $o{gl_blue_accum_size} ? $o{gl_blue_accum_size} : defined $o{gl_blue_accum} ? $o{gl_blue_accum} : undef; + my $aa = defined $o{gl_alpha_accum_size} ? $o{gl_alpha_accum_size} : defined $o{gl_alpha_accum} ? $o{gl_alpha_accum} : undef; + my $bs = defined $o{gl_buffer_size} ? $o{gl_buffer_size} : defined $o{gl_buffer} ? $o{gl_buffer} : undef; + my $ss = defined $o{gl_stencil_size} ? $o{gl_stencil_size} : defined $o{gl_stencil} ? $o{gl_stencil} : undef; + my $msb = defined $o{gl_multi_sample_buffers} ? $o{gl_multi_sample_buffers} : undef; + my $mss = defined $o{gl_multi_sample_samples} ? $o{gl_multi_sample_samples} : undef; + + # boolean + my $s = $o{gl_stereo}; + my $sc = $o{gl_swap_control}; + my $av = $o{gl_accelerated_visual}; SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_RED_SIZE, $r ); SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_GREEN_SIZE, $g ); @@ -132,15 +145,11 @@ sub new { SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BUFFER_SIZE, $bs ) if defined $bs; SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_STENCIL_SIZE, $ss ) if defined $ss; - # These could be added here? - # SDL_GL_STEREO - # SDL_GL_MULTISAMPLEBUFFERS - # SDL_GL_MULTISAMPLESAMPLES - # SDL_GL_ACCELERATED_VISUAL - # SDL_GL_SWAP_CONTROL - } - else { - $SDLx::App::USING_OPENGL = 0; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_STEREO, $s ) if defined $s; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_MULTISAMPLEBUFFERS, $msb ) if defined $msb; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_MULTISAMPLESAMPLES, $mss ) if defined $mss; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_SWAP_CONTROL, $sc ) if defined $sc; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ACCELERATED_VISUAL, $av ) if defined $av; } $self->title( $t, $it ); @@ -153,7 +162,7 @@ sub new { } sub DESTROY { - my ($self) = @_; + my ( $self ) = @_; my $ref = refaddr($self); delete $_stash{ $ref }; } @@ -163,14 +172,23 @@ sub stash :lvalue { } sub resize { - my ($self, $w, $h) = @_; - my $flags = $self->flags; - if ( $flags & SDL::Video::SDL_RESIZABLE ) { - my $d = $self->format->BitsPerPixel; - return $self = SDL::Video::set_video_mode( $w, $h, $d, $flags ) - or Carp::confess( "SDL cannot set video:" . SDL::get_error ); - } - Carp::confess( "Application surface not resizable" ); + my ( $self, $w, $h, $d, $flags ) = @_; + + # you'd probably never need to change the depth or flags, but we offer it because why not + $d = $self->format->BitsPerPixel unless defined $d; + $flags = $self->flags unless defined $flags; + + # do what we do in new() to make the app object + my $surface = SDL::Video::set_video_mode( $w, $h, $d, $flags ) + or Carp::confess( "resize with set_video_mode failed: ", SDL::get_error() ); + $surface = bless SDLx::Surface->new( surface => $surface ), ref $self; + + # make $self point to the new C surface object + # luckily, we keep the app's SDLx::Controller like this + # because its inside-out-ness pays attention to the address of the SV and not the C object + $$self = $$surface; + + $self; } sub title { @@ -187,16 +205,6 @@ sub icon { SDL::Video::wm_set_icon( $_[1] ); } -# this has been moved to SDLx::Controller in the form of time and sleep -# this can be removed at any time we wanna break compat -sub delay { - SDL::delay( $_[1] ); -} - -sub ticks { - SDL::get_ticks; -} - sub error { shift; if ( @_ == 1 and !defined $_[0] ) { @@ -208,18 +216,18 @@ sub error { SDL::get_error; } -sub warp { +sub warp_cursor { my ( undef, $x, $y ) = @_; SDL::Mouse::warp_mouse( $x, $y ); } sub show_cursor { - my (undef, $show) = @_; + my ( undef, $show ) = @_; if ( @_ > 1 ) { - return SDL::Mouse::show_cursor( SDL::Events::SDL_ENABLE ) if $show; - return SDL::Mouse::show_cursor( SDL::Events::SDL_DISABLE ); + return SDL::Mouse::show_cursor( SDL::Event::SDL_ENABLE ) if $show; + return SDL::Mouse::show_cursor( SDL::Event::SDL_DISABLE ); } - SDL::Mouse::show_cursor( SDL::Events::SDL_QUERY ); + SDL::Mouse::show_cursor( SDL::Event::SDL_QUERY ); } sub fullscreen { @@ -232,7 +240,7 @@ sub iconify { } sub grab_input { - my (undef, $grab ) = @_; + my ( undef, $grab ) = @_; if (@_ > 1) { return SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_ON ) if $grab; return SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_OFF ); @@ -248,9 +256,9 @@ sub sync { $self->flip; } -sub attribute { +sub gl_attribute { my ( undef, $mode, $value ) = @_; - + return unless $SDLx::App::USING_OPENGL; if ( defined $value ) { return SDL::Video::GL_set_attribute( $mode, $value ); diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index b940670d..22d3c312 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -29,10 +29,9 @@ my %_eoq_handler; sub new { my ($self, %args) = @_; - if(ref $self) { - bless $self, ref $self; - } - else { + + # if $self is blessed then it has to isa controller, so let's not even bless it to this class + unless(ref $self) { my $a; $self = bless \$a, $self; } diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 98a3a41c..113724f4 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -12,33 +12,35 @@ Extension =head1 SYNOPSIS use SDL; - use SDLx::App; + use SDLx::App; use SDL::Event; - use SDL::Events; - - my $app = SDLx::App->new( - title => 'Application Title', - width => 640, - height => 480, - depth => 32 - ); + use SDL::Events; + + my $app = SDLx::App->new( + title => 'My Great Game', + width => 640, + height => 480, + depth => 32 + ); This is the manual way of doing things - my $event = SDL::Event->new; # create a new event - - SDL::Events::pump_events(); - - while ( SDL::Events::poll_event($event) ) { - my $type = $event->type(); # get event type - print $type; - exit if $type == SDL_QUIT; - } + my $event = SDL::Event->new; # create a new event + + SDL::Events::pump_events(); + + while ( SDL::Events::poll_event($event) ) { + my $type = $event->type(); # get event type + print $type; + exit if $type == SDL_QUIT; + } An alternative to the manual Event processing is through the L module. L is a Controller so see the CALLBACKS section below. =head1 DESCRIPTION +The C provides methods for the root window of your SDL application, as well as many related convenience methods. + L controls the root window of the of your SDL based application. It extends the L class, and provides an interface to the window manager oriented functions. @@ -96,15 +98,6 @@ passed, both the window title and icon title will be set to its value. If two parameters are passed the window title will be set to the first, and the icon title to the second. -=head2 delay( $ms ) - -C takes 1 argument, and will sleep the application for -that many ms. - -=head2 ticks - -C returns the number of ms since the application began. - =head2 error C returns the last error message set by the SDL. @@ -155,25 +148,36 @@ always returns the current value of the given attribute, or Carp::confesss on fa C is a C. Use the event, show and handlers to run the app. - use SDL; - use SDLx::App; - - use SDL::Event; #Where ever the event call back is processed + use SDL; + use SDLx::App; + + use SDL::Event; #Where ever the event call back is processed - my $app = SDLx::App->new( width => 200, height => 200); + my $app = SDLx::App->new( width => 200, height => 200); - $app->add_event_handler( sub{ return 0 if $_[0]->type == SDL_QUIT; return 1}); + $app->add_event_handler( + sub { + my ($event) = @_; + # handle the event here + } + ); - $app->add_show_handler( sub{ $app->update() } ); + $app->add_show_handler( + sub { + # handle drawing objects here + } + ); - $app->add_move_handler( - sub{ - #calc your physics here - } ); + $app->add_move_handler( + sub { + # handle moving objects here + } + ); - $app->run(); + # run the app with the added callbacks + $app->run(); -see L for more details. +For a full explanation of the L loop and other Controller related methods, please see L. =head1 AUTHORS @@ -181,6 +185,6 @@ See L. =head1 SEE ALSO -L L L L +L, L, L, L, L, L =cut diff --git a/t/sdlx_app.t b/t/sdlx_app.t index 2499b56b..7178ec47 100644 --- a/t/sdlx_app.t +++ b/t/sdlx_app.t @@ -22,16 +22,15 @@ can_ok( stash resize title - delay - ticks + icon error - warp + warp_cursor show_cursor fullscreen iconify grab_input sync - attribute + gl_attribute / ); From daedcbcb7e8141fb54fd33bed68a1d33b34fb174 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 17 Jan 2012 17:20:08 +1030 Subject: [PATCH 016/153] a little bit more fixing stuff --- lib/SDLx/App.pm | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 011842f9..22760305 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -116,10 +116,10 @@ sub new { my $g = defined $o{gl_green_size} ? $o{gl_green_size} : defined $o{gl_green} ? $o{gl_green} : 5; my $b = defined $o{gl_blue_size} ? $o{gl_blue_size} : defined $o{gl_blue} ? $o{gl_blue} : 5; my $a = defined $o{gl_alpha_size} ? $o{gl_alpha_size} : defined $o{gl_alpha} ? $o{gl_alpha} : undef; - my $ra = defined $o{gl_red_accum_size} ? $o{gl_red_accum_size} : defined $o{gl_red_accum} ? $o{gl_red_accum} : undef; - my $ga = defined $o{gl_green_accum_size} ? $o{gl_green_accum_size} : defined $o{gl_green_accum} ? $o{gl_green_accum} : undef; - my $ba = defined $o{gl_blue_accum_size} ? $o{gl_blue_accum_size} : defined $o{gl_blue_accum} ? $o{gl_blue_accum} : undef; - my $aa = defined $o{gl_alpha_accum_size} ? $o{gl_alpha_accum_size} : defined $o{gl_alpha_accum} ? $o{gl_alpha_accum} : undef; + my $ra = defined $o{gl_accum_red_size} ? $o{gl_accum_red_size} : defined $o{gl_accum_red} ? $o{gl_accum_red} : undef; + my $ga = defined $o{gl_accum_green_size} ? $o{gl_accum_green_size} : defined $o{gl_accum_green} ? $o{gl_accum_green} : undef; + my $ba = defined $o{gl_accum_blue_size} ? $o{gl_accum_blue_size} : defined $o{gl_accum_blue} ? $o{gl_accum_blue} : undef; + my $aa = defined $o{gl_accum_alpha_size} ? $o{gl_accum_alpha_size} : defined $o{gl_accum_alpha} ? $o{gl_accum_alpha} : undef; my $bs = defined $o{gl_buffer_size} ? $o{gl_buffer_size} : defined $o{gl_buffer} ? $o{gl_buffer} : undef; my $ss = defined $o{gl_stencil_size} ? $o{gl_stencil_size} : defined $o{gl_stencil} ? $o{gl_stencil} : undef; my $msb = defined $o{gl_multi_sample_buffers} ? $o{gl_multi_sample_buffers} : undef; @@ -130,19 +130,19 @@ sub new { my $sc = $o{gl_swap_control}; my $av = $o{gl_accelerated_visual}; - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_RED_SIZE, $r ); - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_GREEN_SIZE, $g ); - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BLUE_SIZE, $b ); + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_RED_SIZE, $r ) if defined $r; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_GREEN_SIZE, $g ) if defined $g; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BLUE_SIZE, $b ) if defined $b; SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ALPHA_SIZE, $a ) if defined $a; - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_RED_ACCUM_SIZE(), $ra ) if defined $ra; - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_GREEN_ACCUM_SIZE(), $ga ) if defined $ga; - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BLUE_ACCUM_SIZE(), $ba ) if defined $ba; - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ALPHA_ACCUM_SIZE(), $aa ) if defined $aa; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ACCUM_RED_SIZE, $ra ) if defined $ra; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ACCUM_GREEN_SIZE, $ga ) if defined $ga; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ACCUM_BLUE_SIZE, $ba ) if defined $ba; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ACCUM_ALPHA_SIZE, $aa ) if defined $aa; - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_DEPTH_SIZE, $d ); - SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_DOUBLEBUFFER, $db ) if defined $db; SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_BUFFER_SIZE, $bs ) if defined $bs; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_DOUBLEBUFFER, $db ) if defined $db; + SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_DEPTH_SIZE, $d ); SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_STENCIL_SIZE, $ss ) if defined $ss; SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_STEREO, $s ) if defined $s; @@ -173,7 +173,7 @@ sub stash :lvalue { sub resize { my ( $self, $w, $h, $d, $flags ) = @_; - + # you'd probably never need to change the depth or flags, but we offer it because why not $d = $self->format->BitsPerPixel unless defined $d; $flags = $self->flags unless defined $flags; @@ -182,7 +182,7 @@ sub resize { my $surface = SDL::Video::set_video_mode( $w, $h, $d, $flags ) or Carp::confess( "resize with set_video_mode failed: ", SDL::get_error() ); $surface = bless SDLx::Surface->new( surface => $surface ), ref $self; - + # make $self point to the new C surface object # luckily, we keep the app's SDLx::Controller like this # because its inside-out-ness pays attention to the address of the SV and not the C object From db40d61c6f02bd271978893d7dbd075aba4848d6 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 17 Jan 2012 20:14:39 +1030 Subject: [PATCH 017/153] lots more fixes and tried to break less compat --- lib/SDLx/App.pm | 124 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 88 insertions(+), 36 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 22760305..2f232f1c 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -26,7 +26,21 @@ $SDLx::App::USING_OPENGL = 0; sub new { my $class = shift; - $class = ref $class || $class; + + # if we already have an app, we just use set_video_mode to change it + if( ref $class ) { + my ( $w, $h, $d, $f ) = @_; + my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) + or Carp::confess( "changing app with set_video_mode failed: ", SDL::get_error() ); + $surface = bless SDLx::Surface->new( surface => $surface ), ref $class; + + # make the app scalar ref point to the new C surface object + # luckily, we keep the app's SDLx::Controller like this + # because its inside-out-ness pays attention to the address of the SV and not the C object + $$class = $$surface; + return $class; + } + my %o = @_; # undef is not a valid input @@ -66,27 +80,17 @@ sub new { } # used to say unless no_init here. I don't think we need it anymore - if ( ref $init eq 'ARRAY' ) { - # make a hash with keys of the values in the init array - my %init = map { $_ => 1 } @$init; - undef $init; - - $init |= SDL::SDL_INIT_AUDIO if $init{audio}; - $init |= SDL::SDL_INIT_CDROM if $init{cd_rom} || $init{cdrom}; - $init |= SDL::SDL_INIT_EVERYTHING if $init{everything}; - $init |= SDL::SDL_INIT_NOPARACHUTE if $init{no_parachute}; - $init |= SDL::SDL_INIT_JOYSTICK if $init{joystick}; - $init |= SDL::SDL_INIT_TIMER if $init{timer}; - } - - # if anything is already inited, only init specified extra subsystems - if ( SDL::was_init( SDL::SDL_INIT_AUDIO | SDL::SDL_INIT_CDROM | SDL::SDL_INIT_EVENTTHREAD | SDL::SDL_INIT_JOYSTICK | SDL::SDL_INIT_TIMER | SDL::SDL_INIT_VIDEO ) ) { - # I'm assuming we always wanna init video - SDL::init_sub_system( ($init || 0) | SDL::SDL_INIT_VIDEO ); + if( !defined $init ) { + SDLx::App::init( SDL::SDL_INIT_EVERYTHING ); } else { - # I'm assuming we always wanna init video - SDL::init( defined $init ? $init | SDL::SDL_INIT_VIDEO : SDL::SDL_INIT_EVERYTHING ); + if( ref $init ) { + push @$init, "video"; + } + else { + $init |= SDL::SDL_INIT_VIDEO + } + SDLx::App::init( $init ); } $f |= SDL::Video::SDL_ANYFORMAT if $af; @@ -171,24 +175,52 @@ sub stash :lvalue { return $_stash{ refaddr( $_[0] ) }; } +sub init { + my ( $init ) = @_; + + return unless defined $init; + if ( ref $init ) { + # make a hash with keys of the values in the init array + my %init = map { $_ => 1 } @$init; + undef $init; + + $init |= SDL::SDL_INIT_TIMER if $init{timer}; + $init |= SDL::SDL_INIT_AUDIO if $init{audio}; + $init |= SDL::SDL_INIT_VIDEO if $init{video}; + $init |= SDL::SDL_INIT_CDROM if $init{cd_rom} || $init{cdrom}; + $init |= SDL::SDL_INIT_JOYSTICK if $init{joystick}; + $init |= SDL::SDL_INIT_EVERYTHING if $init{everything} || $init{all}; + $init |= SDL::SDL_INIT_NOPARACHUTE if $init{no_parachute}; + $init |= SDL::SDL_INIT_EVENTTHREAD if $init{event_thread}; + } + + # if anything is already inited, only init specified extra subsystems + if ( SDL::was_init( SDL::SDL_INIT_EVERYTHING ) ) { + SDL::init_sub_system( $init ) + and Carp::cluck( "SDL init_sub_system failed: ", SDL::get_error() ); + } + else { + SDL::init( $init ) + and Carp::confess( "SDL init failed: ", SDL::get_error() ); + } +} + +sub screen_size { + SDLx::App::init( SDL::SDL_INIT_VIDEO ); + + my $video_info = SDL::Video::get_video_info(); + + return( $video_info->current_w, $video_info->current_h ); +} + sub resize { - my ( $self, $w, $h, $d, $flags ) = @_; + my ( $self, $w, $h, $d, $f ) = @_; # you'd probably never need to change the depth or flags, but we offer it because why not $d = $self->format->BitsPerPixel unless defined $d; - $flags = $self->flags unless defined $flags; - - # do what we do in new() to make the app object - my $surface = SDL::Video::set_video_mode( $w, $h, $d, $flags ) - or Carp::confess( "resize with set_video_mode failed: ", SDL::get_error() ); - $surface = bless SDLx::Surface->new( surface => $surface ), ref $self; - - # make $self point to the new C surface object - # luckily, we keep the app's SDLx::Controller like this - # because its inside-out-ness pays attention to the address of the SV and not the C object - $$self = $$surface; + $f = $self->flags unless defined $f; - $self; + $self->new( $w, $h, $d, $f ); } sub title { @@ -232,7 +264,18 @@ sub show_cursor { sub fullscreen { my ( $self ) = @_; - SDL::Video::wm_toggle_fullscreen( $self ); + return 1 if SDL::Video::wm_toggle_fullscreen( $self ); + + # fallback to doing it with set_video_mode() + my $w = $self->w; + my $h = $self->h; + my $d = $self->format->BitsPerPixel; + my $f = $self->flags; + + #toggle fullscreen flag + $f ^= SDL::Video::SDL_FULLSCREEN; + + $self->new( $w, $h, $d, $f ); } sub iconify { @@ -242,8 +285,8 @@ sub iconify { sub grab_input { my ( undef, $grab ) = @_; if (@_ > 1) { - return SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_ON ) if $grab; - return SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_OFF ); + return SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_ON ) if $grab and $grab ne SDL::Video::SDL_GRAB_QUERY; + return SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_OFF ) unless $grab; } SDL::Video::wm_grab_input( SDL::Video::SDL_GRAB_QUERY ); } @@ -269,4 +312,13 @@ sub gl_attribute { $returns->[1]; } +# this has been moved to SDLx::Controller in the form of time and sleep +# this can be removed at any time we wanna break compat +sub delay { + SDL::delay( $_[1] ); +} +sub ticks { + SDL::get_ticks; +} + 1; From ab13f8c6c3a6cf3f213b060e41e451a9f29b9244 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 17 Jan 2012 20:44:26 +1030 Subject: [PATCH 018/153] SDLx::App tests can_ok updated --- t/sdlx_app.t | 2 ++ 1 file changed, 2 insertions(+) diff --git a/t/sdlx_app.t b/t/sdlx_app.t index 7178ec47..a1b3329b 100644 --- a/t/sdlx_app.t +++ b/t/sdlx_app.t @@ -20,6 +20,8 @@ can_ok( 'SDLx::App', qw/ new stash + init + screen_size resize title icon From bf02d32742a34fa55bf3be54593f25ada1a546a9 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 17 Jan 2012 21:03:02 +1030 Subject: [PATCH 019/153] SDLx::App docs synopsis --- lib/pods/SDLx/App.pod | 103 +++++++++++++++++++----------------------- 1 file changed, 46 insertions(+), 57 deletions(-) diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 113724f4..8da90d22 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -3,7 +3,7 @@ =head1 NAME -SDLx::App - a SDL perl extension +SDLx::App - The root window of an SDL application =head1 CATEGORY @@ -11,35 +11,58 @@ Extension =head1 SYNOPSIS - use SDL; - use SDLx::App; - use SDL::Event; - use SDL::Events; + use SDL; + use SDLx::App; + use SDL::Event; + use SDL::Events; + + # this is all the code we need to have a working app! + my $app = SDLx::App->new; + # we can also specify many useful things in the constructor my $app = SDLx::App->new( - title => 'My Great Game', - width => 640, - height => 480, - depth => 32 + title => 'My Great Game', + width => 1024, + height => 600, + centered => 1, + no_frame => 1, + async_blit => 1, ); -This is the manual way of doing things + # our app also comes with an SDLx::Controller + + # add a handler handle events such as keypresses + $app->add_event_handler( + sub { + my ($event) = @_; + # handle the event here + } + ); - my $event = SDL::Event->new; # create a new event + # add a handler to move our objects in response to time + $app->add_move_handler( + sub { + # handle moving objects here + } + ); - SDL::Events::pump_events(); + # add a handler to show our objects on the screen + $app->add_show_handler( + sub { + # handle drawing objects here + } + ); - while ( SDL::Events::poll_event($event) ) { - my $type = $event->type(); # get event type - print $type; - exit if $type == SDL_QUIT; - } + # finally, start the app run loop with the added handlers + $app->run(); -An alternative to the manual Event processing is through the L module. L is a Controller so see the CALLBACKS section below. +For a full explanation of the L loop and other Controller related methods, +please see L. =head1 DESCRIPTION -The C provides methods for the root window of your SDL application, as well as many related convenience methods. +The C provides methods for the root window of your SDL application, +as well as many related convenience methods. L controls the root window of the of your SDL based application. It extends the L class, and provides an interface to the window @@ -65,16 +88,17 @@ the icon title. Defaults to file name. Shortcut: 'it' the icon itself. Defaults to none. Shortcut: 'i' =item * width -Window width, in pixels. Defaults to 800. Shortcut: 'w' +Window width, in pixels. Defaults to 640. Shortcut: 'w' =item * height -Window height, in pixels. Defaults to 600. Shortcut: 'h' +Window height, in pixels. Defaults to 480. Shortcut: 'h' =item * depth Screen depth. Defaults to 16. Shortcut: 'd'. =item * flags -Any flags you want to pass to L upon initialization. Defaults to SDL_ANYFORMAT. Flags should be I together if you're passing more than one (flags => FOO|BAR). Shortcut: 'f'. +Any flags you want to pass to L upon initialization. Defaults to SDL_ANYFORMAT. +Flags should be I together if you're passing more than one (flags => FOO|BAR). Shortcut: 'f'. =item * resizeable Set this to a true value to make the window resizeable by the user. Default is off. @@ -144,41 +168,6 @@ C allows one to get and set GL attributes. By passing a va in addition to the attribute selector, the value will be set. C always returns the current value of the given attribute, or Carp::confesss on failure. -=head1 CALLBACKS - -C is a C. Use the event, show and handlers to run the app. - - use SDL; - use SDLx::App; - - use SDL::Event; #Where ever the event call back is processed - - my $app = SDLx::App->new( width => 200, height => 200); - - $app->add_event_handler( - sub { - my ($event) = @_; - # handle the event here - } - ); - - $app->add_show_handler( - sub { - # handle drawing objects here - } - ); - - $app->add_move_handler( - sub { - # handle moving objects here - } - ); - - # run the app with the added callbacks - $app->run(); - -For a full explanation of the L loop and other Controller related methods, please see L. - =head1 AUTHORS See L. From f864f81fbb5297032e0e81b3b1749cf1860f2d5d Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 17 Jan 2012 21:06:51 +1030 Subject: [PATCH 020/153] SDLx::App docs description --- lib/pods/SDLx/App.pod | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 8da90d22..4332aca5 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -63,10 +63,8 @@ please see L. The C provides methods for the root window of your SDL application, as well as many related convenience methods. - -L controls the root window of the of your SDL based application. -It extends the L class, and provides an interface to the window -manager oriented functions. +It is a subclass of both L and L, +providing all the methods they both provide. =head1 METHODS From fd6b826041dc4fb4cd60166a25d4edac39fca13c Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 17 Jan 2012 21:32:22 +1030 Subject: [PATCH 021/153] SDLx::App docs full new() example and reordered flags --- lib/SDLx/App.pm | 36 ++++++++++++++++++------------------ lib/pods/SDLx/App.pod | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 18 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 2f232f1c..275e4d32 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -26,14 +26,14 @@ $SDLx::App::USING_OPENGL = 0; sub new { my $class = shift; - + # if we already have an app, we just use set_video_mode to change it if( ref $class ) { my ( $w, $h, $d, $f ) = @_; my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) or Carp::confess( "changing app with set_video_mode failed: ", SDL::get_error() ); $surface = bless SDLx::Surface->new( surface => $surface ), ref $class; - + # make the app scalar ref point to the new C surface object # luckily, we keep the app's SDLx::Controller like this # because its inside-out-ness pays attention to the address of the SV and not the C object @@ -58,15 +58,15 @@ sub new { my $init = exists $o{initialize} ? $o{initialize} : $o{init}; # boolean - my $af = $o{any_format}; - my $db = $o{double_buffer} || $o{double_buf} || $o{dbl_buf}; - my $sw = $o{software_surface} || $o{sw_surface} || $o{sw}; - my $hw = $o{hardware_surface} || $o{hw_surface} || $o{hw}; + my $sw = $o{software_surface} || $o{sw_surface} || $o{sw}; + my $hw = $o{hardware_surface} || $o{hw_surface} || $o{hw}; my $ab = $o{asynchronous_blit} || $o{async_blit}; - my $hwp = $o{hardware_palette} || $o{hw_palette} || $o{hw_pal}; + my $af = $o{any_format}; + my $hwp = $o{hardware_palette} || $o{hw_palette} || $o{hw_pal}; + my $db = $o{double_buffer} || $o{double_buf} || $o{dbl_buf}; my $fs = $o{full_screen} || $o{fullscreen}; - my $gl = $o{open_gl} || $o{opengl} || $o{gl}; - my $rs = $o{resizable}; + my $gl = $o{open_gl} || $o{opengl} || $o{gl}; + my $rs = $o{resizable} || $o{resizeable}; # it's a hard word to spell :-) my $nf = $o{no_frame}; my $ncur = $o{no_cursor}; my $cen = $o{centered} || $o{center}; @@ -93,12 +93,12 @@ sub new { SDLx::App::init( $init ); } - $f |= SDL::Video::SDL_ANYFORMAT if $af; - $f |= SDL::Video::SDL_DOUBLEBUF if $db; $f |= SDL::Video::SDL_SWSURFACE if $sw; $f |= SDL::Video::SDL_HWSURFACE if $hw; $f |= SDL::Video::SDL_ASYNCBLIT if $ab; + $f |= SDL::Video::SDL_ANYFORMAT if $af; $f |= SDL::Video::SDL_HWPALETTE if $hwp; + $f |= SDL::Video::SDL_DOUBLEBUF if $db; $f |= SDL::Video::SDL_FULLSCREEN if $fs; $f |= SDL::Video::SDL_OPENGL if $gl; $f |= SDL::Video::SDL_RESIZABLE if $rs; @@ -177,7 +177,7 @@ sub stash :lvalue { sub init { my ( $init ) = @_; - + return unless defined $init; if ( ref $init ) { # make a hash with keys of the values in the init array @@ -193,7 +193,7 @@ sub init { $init |= SDL::SDL_INIT_NOPARACHUTE if $init{no_parachute}; $init |= SDL::SDL_INIT_EVENTTHREAD if $init{event_thread}; } - + # if anything is already inited, only init specified extra subsystems if ( SDL::was_init( SDL::SDL_INIT_EVERYTHING ) ) { SDL::init_sub_system( $init ) @@ -207,9 +207,9 @@ sub init { sub screen_size { SDLx::App::init( SDL::SDL_INIT_VIDEO ); - + my $video_info = SDL::Video::get_video_info(); - + return( $video_info->current_w, $video_info->current_h ); } @@ -265,16 +265,16 @@ sub show_cursor { sub fullscreen { my ( $self ) = @_; return 1 if SDL::Video::wm_toggle_fullscreen( $self ); - + # fallback to doing it with set_video_mode() my $w = $self->w; my $h = $self->h; my $d = $self->format->BitsPerPixel; my $f = $self->flags; - + #toggle fullscreen flag $f ^= SDL::Video::SDL_FULLSCREEN; - + $self->new( $w, $h, $d, $f ); } diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 4332aca5..25b8ceaf 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -70,6 +70,43 @@ providing all the methods they both provide. =head2 new + my $app = SDLx::App->new( + width => 640, + height => 480, + depth => 32, + flags => SDL_SWSURFACE | SDL_ANYFORMAT, + + # parameter access to flags + sw_surface => 1, + hw_surface => 1, + async_blit => 1, + any_format => 1, + hw_palette => 1, + double_buf => 1, + fullscreen => 1, + open_gl => 1, + resizable => 1, + no_frame => 1, + + # two ways to do init. init video is assumed regardless + init => SDL_INIT_AUDIO | SDL_INIT_JOYSTICK, + init => [ 'audio', 'joystick' ], + + # window position + position => [ 150, 100 ], + centered => 1, + + # other things + no_cursor => 1, + grab_input => 1, + + # don't initialize an SDLx::Controller for the app + no_controller => 1, + + # store your goodies in the app if you like + stash => {}, + ); + C initializes the SDL, creates a new screen, and initializes some of the window manager properties. C takes a series of named parameters: From a2250afccd3bbe260a44eda5d2ad7fe4079f8c48 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 17 Jan 2012 23:36:49 +1030 Subject: [PATCH 022/153] SDLx::App docs full new() reordered example --- lib/pods/SDLx/App.pod | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 25b8ceaf..fff518f8 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -74,9 +74,18 @@ providing all the methods they both provide. width => 640, height => 480, depth => 32, + + title => "My Great Game", + icon_title => "MGG", + icon => SDL::Video::load_BMP( "icon.bmp" ), + + # two ways to do init. init video is assumed regardless + init => SDL_INIT_AUDIO | SDL_INIT_JOYSTICK, + init => [ 'audio', 'joystick' ], + + # normal libsdl access to flags flags => SDL_SWSURFACE | SDL_ANYFORMAT, - - # parameter access to flags + # or parameter access to flags sw_surface => 1, hw_surface => 1, async_blit => 1, @@ -88,18 +97,13 @@ providing all the methods they both provide. resizable => 1, no_frame => 1, - # two ways to do init. init video is assumed regardless - init => SDL_INIT_AUDIO | SDL_INIT_JOYSTICK, - init => [ 'audio', 'joystick' ], + no_cursor => 1, + grab_input => 1, # window position position => [ 150, 100 ], centered => 1, - # other things - no_cursor => 1, - grab_input => 1, - # don't initialize an SDLx::Controller for the app no_controller => 1, From e01357588bfac15e81613da2908017d933c3e17d Mon Sep 17 00:00:00 2001 From: Blaizer Date: Wed, 18 Jan 2012 02:08:36 +1030 Subject: [PATCH 023/153] SDLx::App docs new() parameter explanations --- lib/SDLx/App.pm | 12 +-- lib/pods/SDLx/App.pod | 195 +++++++++++++++++++++++++++++++++++------- 2 files changed, 169 insertions(+), 38 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 275e4d32..21e15410 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -62,7 +62,7 @@ sub new { my $hw = $o{hardware_surface} || $o{hw_surface} || $o{hw}; my $ab = $o{asynchronous_blit} || $o{async_blit}; my $af = $o{any_format}; - my $hwp = $o{hardware_palette} || $o{hw_palette} || $o{hw_pal}; + my $hwp = $o{hardware_palette} || $o{hw_palette}; my $db = $o{double_buffer} || $o{double_buf} || $o{dbl_buf}; my $fs = $o{full_screen} || $o{fullscreen}; my $gl = $o{open_gl} || $o{opengl} || $o{gl}; @@ -108,11 +108,6 @@ sub new { $ENV{SDL_VIDEO_CENTERED} = $cen if $cen; $ENV{SDL_VIDEO_WINDOW_POS} = $pos if $pos; - my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) - or Carp::confess( "set_video_mode failed: ", SDL::get_error() ); - my $self = bless SDLx::Surface->new( surface => $surface ), $class; - $self->SDLx::Controller::new( %o ) unless $nc; - if ( $gl ) { $SDLx::App::USING_OPENGL = 1; @@ -156,6 +151,11 @@ sub new { SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ACCELERATED_VISUAL, $av ) if defined $av; } + my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) + or Carp::confess( "set_video_mode failed: ", SDL::get_error() ); + my $self = bless SDLx::Surface->new( surface => $surface ), $class; + + $self->SDLx::Controller::new( %o ) unless $nc; $self->title( $t, $it ); $self->icon( $icon ); $self->show_cursor( 0 ) if $ncur; diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index fff518f8..8fc5d1ba 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -24,6 +24,7 @@ Extension title => 'My Great Game', width => 1024, height => 600, + dt => 0.05, centered => 1, no_frame => 1, async_blit => 1, @@ -75,8 +76,8 @@ providing all the methods they both provide. height => 480, depth => 32, - title => "My Great Game", - icon_title => "MGG", + title => "Application Title", + icon_title => "App Title", icon => SDL::Video::load_BMP( "icon.bmp" ), # two ways to do init. init video is assumed regardless @@ -84,7 +85,7 @@ providing all the methods they both provide. init => [ 'audio', 'joystick' ], # normal libsdl access to flags - flags => SDL_SWSURFACE | SDL_ANYFORMAT, + flags => SDL_SWSURFACE | SDL_ANYFORMAT, # or parameter access to flags sw_surface => 1, hw_surface => 1, @@ -97,57 +98,187 @@ providing all the methods they both provide. resizable => 1, no_frame => 1, - no_cursor => 1, - grab_input => 1, - # window position - position => [ 150, 100 ], centered => 1, + position => [ 150, 100 ], + + no_cursor => 1, + grab_input => 1, # don't initialize an SDLx::Controller for the app no_controller => 1, # store your goodies in the app if you like stash => {}, + + # and everything from SDLx::Controller + dt => 0.1, + min_t => 1 / 60, + delay => 0, + eoq => 1, + eoq_handler => \&quit, + event => SDL::Event->new(), + event_handlers => [], + move_handlers => [], + show_handlers => [], + time => 0, ); -C initializes the SDL, creates a new screen, -and initializes some of the window manager properties. -C takes a series of named parameters: +Initializes SDL with L, +creates the root window with L, +initializes an L belonging to the app, +and performs many other app management tasks all as specified by named parameters. +Returns an L of the new app. -=over 4 +The complete set of parameters are shown in the code above and explained in detail below. +When constructing the app's L all parameters specified are also given to +L<< SDLx::Controller->new|SDLx::Controller/new >>, so should be specified here. See +L. -=item * title -the window title. Defaults to the file name. Shorter alias: 't' +=over -=item * icon_title -the icon title. Defaults to file name. Shortcut: 'it' +=item width -=item * icon -the icon itself. Defaults to none. Shortcut: 'i' +The window width, in pixels. Defaults to 640. Alias: C. -=item * width -Window width, in pixels. Defaults to 640. Shortcut: 'w' +=item height -=item * height -Window height, in pixels. Defaults to 480. Shortcut: 'h' +The window height, in pixels. Defaults to 480. Alias: C. -=item * depth -Screen depth. Defaults to 16. Shortcut: 'd'. +=item depth -=item * flags -Any flags you want to pass to L upon initialization. Defaults to SDL_ANYFORMAT. -Flags should be I together if you're passing more than one (flags => FOO|BAR). Shortcut: 'f'. +The surface's color depth, in bits per pixel. Should be 8, 16, 24 or 32. +If not defined, defaults to 32 and specifies the +L flag. Alias: C. -=item * resizeable -Set this to a true value to make the window resizeable by the user. Default is off. +=item title -=item * exit_on_quit -Set this to a true value to make the app exit if a SDL_QUIT event is triggered. Shortcut: 'eoq'. +The window's title, as a string. Defaults to the L if defined, or the file name. -=back +=item icon_title -=head1 METHODS +The application's icon title, as a string. Defaults to the L if defined, or the file name. + +=item icon + +The application's icon. Set with L. + +=item init + +The SDL subsystems to initialize, as a product of the L or an array ref. +The video subsystem is initialized no matter what, and does not need to be specified. +The specified value is passed to L, so see that for more details. +Defaults to L. Alias: C. + +=item flags + +L. +Flags should be bitwise I together when passing more than one (C FOO|BAR>). +All flags have a corresponding named parameter which can be used instead of specifying them here, +and are explained below. +Defaults to no flags, or to L if the C parameter was undefined. +Alias: C. + +=item sw_surface + +The L flag, as a boolean. If true, creates the surface in +system memory. This is best used when you plan to do per-pixel manipulations, +or blit surfaces with alpha channels. Aliases: C, C. + +=item hw_surface + +The L flag, as a boolean. If true, creates the surface in +video memory. This is best used when the surfaces you'll be blitting are also hardware surfaces. +SDL copies the surfaces from video memory to system memory when you L them, +and back when you L them, which can cause a major performance hit. +If the video driver does not support hardware surfaces, a software surface will be returned instead. +Many platforms can only provide hardware surfaces when using L. +Aliases: C, C. + +=item async_blit + +The L flag, as a boolean. If true, enables the use of asynchronous updates +of the display surface. This will usually slow down blitting on single-CPU machines, but can speed up blitting +on multi-CPU machines. Alias: C. + +=item any_format + +The L flag, as a boolean. If a video surface of the requested +bits-per-pixel (bpp) is not available SDL will normally emulate one with a shadow surface. +Passing a true value prevents this and causes SDL to use the video surface, regardless of its pixel depth. +This flag is specified automatically when the L parameter is undefined. + +=item hw_palette + +The L flag, as a boolean. If true, gives SDL exclusive palette access. +Without this flag you may not always get the exact colors you request with +L or L. +Alias: C. + +=item double_buf + +The L flag, as a boolean. If true, enables hardware double buffering; +faster, but only valid with a hardware surface. L should be used to flip the buffers +and update the screen. All drawing will take place on the surface that is not being displayed. +If double buffering could not be enabled then L will just perform an +L on the entire screen. Aliases: C, C. + +=item fullscreen + +The L flag, as a boolean. If true, SDL will attempt to use a fullscreen mode, +changing the hardware resolution to the resolution of the display surface. +If, for whatever reason, this change is not possible the next higher resolution will be used +and the display surface centered on a black background. Alias: C. + +=item open_gl + +The L flag, as a boolean. If true, creates an OpenGL rendering context. +This uses any C attributes specified and any others set with L. Alias: C. + +=item resizable + +The L flag, as a boolean. If true, creates a resizable window. +When the window is resized by the user a L event +is generated and L should be called with the new size. + +=item no_frame +The L flag, as a boolean. If true, SDL attempts to create a window +with no title bar or frame decoration. Fullscreen modes automatically have this flag set. + +=item centered + +A boolean value. If true, centers the window on the screen using C<$ENV{SDL_VIDEO_CENTERED}>. +Alias: C
. + +=item position + +The position of the window on the screen, as an array ref. The array ref should be two elements long, +specifying C and C values, in pixels, used to position the window on the screen. +Implemented using C<$ENV{SDL_VIDEO_WINDOW_POS}>. Alias: C. + +=item no_cursor + +A boolean value. If true, hides the cursor on the video surface using L. +A surface can then instead be blitted to the display at the location of the cursor. + +=item grab_input + +A boolean value. If true, SDL attempts to confine the cursor to the window using L. +Also, nearly all keyboard input will be passed directly to the application, +and not interpreted by any window manager present. + +=item no_controller + +A boolean value. If true, does not initialize an L for the app. +Care should then be taken to not use any of Ls methods. + +=item stash + +A place to store any information you need the app to hold. This can then be returned and set with +L. If not specified, defaults to an empty hash ref. + +=back =head2 title() From 77c07e9e95a4059f068aebd6a6c9d8b22cd1a3b8 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Wed, 25 Jan 2012 16:16:47 +1030 Subject: [PATCH 024/153] SDLx::App set_video_mode method --- lib/SDLx/App.pm | 54 ++++++++++++++++++++++++++----------------------- t/sdlx_app.t | 1 + 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 21e15410..f255f40a 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -27,20 +27,6 @@ $SDLx::App::USING_OPENGL = 0; sub new { my $class = shift; - # if we already have an app, we just use set_video_mode to change it - if( ref $class ) { - my ( $w, $h, $d, $f ) = @_; - my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) - or Carp::confess( "changing app with set_video_mode failed: ", SDL::get_error() ); - $surface = bless SDLx::Surface->new( surface => $surface ), ref $class; - - # make the app scalar ref point to the new C surface object - # luckily, we keep the app's SDLx::Controller like this - # because its inside-out-ness pays attention to the address of the SV and not the C object - $$class = $$surface; - return $class; - } - my %o = @_; # undef is not a valid input @@ -49,13 +35,13 @@ sub new { my $d = defined $o{depth} ? $o{depth} : defined $o{d} ? $o{d} : undef; my $f = defined $o{flags} ? $o{flags} : defined $o{f} ? $o{f} : 0; my $pos = defined $o{position} ? $o{position} : defined $o{pos} ? $o{pos} : undef; - my $s = defined $o{stash} ? $o{stash} : {}; # undef is a valid input my $t = $o{title}; my $it = $o{icon_title}; my $icon = $o{icon}; my $init = exists $o{initialize} ? $o{initialize} : $o{init}; + my $s = exists $o{stash} ? $o{stash} : {}; # boolean my $sw = $o{software_surface} || $o{sw_surface} || $o{sw}; @@ -151,9 +137,7 @@ sub new { SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ACCELERATED_VISUAL, $av ) if defined $av; } - my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) - or Carp::confess( "set_video_mode failed: ", SDL::get_error() ); - my $self = bless SDLx::Surface->new( surface => $surface ), $class; + my $self = $class->set_video_mode( $w, $h, $d, $f ); $self->SDLx::Controller::new( %o ) unless $nc; $self->title( $t, $it ); @@ -165,6 +149,25 @@ sub new { $self; } +sub set_video_mode { + my ($self, $w, $h, $d, $f) = @_; + + my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) + or Carp::confess( "set_video_mode failed: ", SDL::get_error() ); + $surface = SDLx::Surface->new( surface => $surface ); + + # if we already have an app + if( ref $self ) { + # make the app scalar ref point to the new C surface object + # luckily, we keep the app's SDLx::Controller like this + # because its inside-out-ness pays attention to the address of the SV and not the C object + bless $surface, ref $self; + $$self = $$surface; + return $self; + } + return bless $surface, $self; +} + sub DESTROY { my ( $self ) = @_; my $ref = refaddr($self); @@ -220,7 +223,7 @@ sub resize { $d = $self->format->BitsPerPixel unless defined $d; $f = $self->flags unless defined $f; - $self->new( $w, $h, $d, $f ); + $self->set_video_mode( $w, $h, $d, $f ); } sub title { @@ -267,15 +270,16 @@ sub fullscreen { return 1 if SDL::Video::wm_toggle_fullscreen( $self ); # fallback to doing it with set_video_mode() - my $w = $self->w; - my $h = $self->h; - my $d = $self->format->BitsPerPixel; my $f = $self->flags; - #toggle fullscreen flag - $f ^= SDL::Video::SDL_FULLSCREEN; + eval { $self->set_video_mode( 0, 0, 0, $f ^ SDL::Video::SDL_FULLSCREEN ) }; + return 1 unless $@; + + # failed going fullscreen, let's revert back + $self->set_video_mode( 0, 0, $self->format->BitsPerPixel, $f ); - $self->new( $w, $h, $d, $f ); + # report failure to go fullscreen + return 0; } sub iconify { diff --git a/t/sdlx_app.t b/t/sdlx_app.t index a1b3329b..25af979c 100644 --- a/t/sdlx_app.t +++ b/t/sdlx_app.t @@ -19,6 +19,7 @@ use SDLx::App; can_ok( 'SDLx::App', qw/ new + set_video_mode stash init screen_size From 6a3b4e6a5738de8627d64bc4082dc0dd254c23f2 Mon Sep 17 00:00:00 2001 From: Ioan Rogers Date: Sun, 29 Jan 2012 14:53:24 -0800 Subject: [PATCH 025/153] Make SDLx::Music match the docs: data returns hashref with no args, and play can be called with $name --- lib/SDLx/Music.pm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/SDLx/Music.pm b/lib/SDLx/Music.pm index 8f1f7fd9..695f1383 100644 --- a/lib/SDLx/Music.pm +++ b/lib/SDLx/Music.pm @@ -45,7 +45,8 @@ sub new { sub data { my $self = shift; - return if $#_ < 0; + + return $self->{data} if $#_ == -1; return $self->{data}->{ $_[0] } if $#_ == 0; my %data = @_; @@ -92,7 +93,11 @@ sub play { my %override = @_; return unless defined $play_data; - + + if ( ref $play_data eq '') { + $play_data = $self->{data}->{$play_data}; + } + my $volume = $play_data->{volume} || $override{volume} || 50; my $fade_in = $play_data->{fade_in} || $override{fade_in} || 0; my $loops = $play_data->{loops} || $override{loops} || 1; From 58a81bc6f8c216e9312ab07c2d0ba96a36971dab Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 31 Jan 2012 00:07:45 +1030 Subject: [PATCH 026/153] SDLx::App docs for init --- lib/SDLx/App.pm | 5 ++--- lib/pods/SDLx/App.pod | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index f255f40a..6255e460 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -179,9 +179,8 @@ sub stash :lvalue { } sub init { - my ( $init ) = @_; + my $init = shift; - return unless defined $init; if ( ref $init ) { # make a hash with keys of the values in the init array my %init = map { $_ => 1 } @$init; @@ -194,7 +193,7 @@ sub init { $init |= SDL::SDL_INIT_JOYSTICK if $init{joystick}; $init |= SDL::SDL_INIT_EVERYTHING if $init{everything} || $init{all}; $init |= SDL::SDL_INIT_NOPARACHUTE if $init{no_parachute}; - $init |= SDL::SDL_INIT_EVENTTHREAD if $init{event_thread}; + $init |= SDL::SDL_INIT_EVENTTHREAD if $init{event_thread}; } # if anything is already inited, only init specified extra subsystems diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 8fc5d1ba..20d674fe 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -280,6 +280,33 @@ L. If not specified, defaults to an empty hash ref. =back +=head2 init + + SDLx::App::init( SDL::SDL_INIT_TIMER | SDL::SDL_INIT_AUDIO | ... ); + SDLx::App::init( [ 'timer', 'audio', 'video', 'cd_rom', 'cdrom', 'joystick', + 'everything', 'all', 'no_parachute', 'event_thread' ] ); + +This is not a method, but a sub. It is used internally by L to init SDL with +L. If any subsystems are already initialized, it will use +L instead. You should use this whenever you need to +init anything outside calls to . + +If a number is specified, it will initialize SDL in the same way as L describes. +If an array ref is specified, each element should be a string corresponding to a flag to specify. +The strings and their corresponding flags are shown in the table below. See L for +descriptions of what each flag does. + + flag string alias + ==================== ============ ====== + SDL_INIT_TIMER timer + SDL_INIT_AUDIO audio + SDL_INIT_VIDEO video + SDL_INIT_CDROM cd_rom cdrom + SDL_INIT_JOYSTICK joystick + SDL_INIT_EVERYTHING everything all + SDL_INIT_NOPARACHUTE no_parachute + SDL_INIT_EVENTTHREAD event_thread + =head2 title() =head2 title( $new_title ) From 38e0efb1de37548a6f336b7954b99405ac15966d Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 31 Jan 2012 00:18:24 +1030 Subject: [PATCH 027/153] SDLx::App screen_size --- lib/pods/SDLx/App.pod | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 20d674fe..cd89dd2b 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -75,15 +75,15 @@ providing all the methods they both provide. width => 640, height => 480, depth => 32, - + title => "Application Title", icon_title => "App Title", icon => SDL::Video::load_BMP( "icon.bmp" ), - + # two ways to do init. init video is assumed regardless init => SDL_INIT_AUDIO | SDL_INIT_JOYSTICK, init => [ 'audio', 'joystick' ], - + # normal libsdl access to flags flags => SDL_SWSURFACE | SDL_ANYFORMAT, # or parameter access to flags @@ -110,7 +110,7 @@ providing all the methods they both provide. # store your goodies in the app if you like stash => {}, - + # and everything from SDLx::Controller dt => 0.1, min_t => 1 / 60, @@ -226,7 +226,7 @@ L on the entire screen. Aliases: C flag, as a boolean. If true, SDL will attempt to use a fullscreen mode, +The L flag, as a boolean. If true, SDL will attempt to use a fullscreen mode, changing the hardware resolution to the resolution of the display surface. If, for whatever reason, this change is not possible the next higher resolution will be used and the display surface centered on a black background. Alias: C. @@ -302,11 +302,21 @@ descriptions of what each flag does. SDL_INIT_AUDIO audio SDL_INIT_VIDEO video SDL_INIT_CDROM cd_rom cdrom - SDL_INIT_JOYSTICK joystick + SDL_INIT_JOYSTICK joystick SDL_INIT_EVERYTHING everything all SDL_INIT_NOPARACHUTE no_parachute SDL_INIT_EVENTTHREAD event_thread +=head2 screen_size + + my ($screen_w, $screen_h) = SDLx::App::screen_size(); + +Returns the width and height of the user's screen resolution using +L. +This can be called before or after calling L. +Initializing the video subsytem will be handled correctly no matter what thanks to +L. + =head2 title() =head2 title( $new_title ) From 0a241a91711ccf50bf4bc3960366fbb7b8f7da78 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 31 Jan 2012 02:20:59 +1030 Subject: [PATCH 028/153] SDLx::App docs for set_video_mode, resize, fullscreen, iconify --- lib/SDLx/App.pm | 12 ++++++------ lib/pods/SDLx/App.pod | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 6255e460..670b1802 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -216,11 +216,10 @@ sub screen_size { } sub resize { - my ( $self, $w, $h, $d, $f ) = @_; + my ( $self, $w, $h ) = @_; - # you'd probably never need to change the depth or flags, but we offer it because why not - $d = $self->format->BitsPerPixel unless defined $d; - $f = $self->flags unless defined $f; + my $d = $self->format->BitsPerPixel; + my $f = $self->flags; $self->set_video_mode( $w, $h, $d, $f ); } @@ -269,13 +268,14 @@ sub fullscreen { return 1 if SDL::Video::wm_toggle_fullscreen( $self ); # fallback to doing it with set_video_mode() + my $d = $self->format->BitsPerPixel; my $f = $self->flags; - eval { $self->set_video_mode( 0, 0, 0, $f ^ SDL::Video::SDL_FULLSCREEN ) }; + eval { $self->set_video_mode( 0, 0, $d, $f ^ SDL::Video::SDL_FULLSCREEN ) }; return 1 unless $@; # failed going fullscreen, let's revert back - $self->set_video_mode( 0, 0, $self->format->BitsPerPixel, $f ); + $self->set_video_mode( 0, 0, $d, $f ); # report failure to go fullscreen return 0; diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index cd89dd2b..0f672fbd 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -317,6 +317,31 @@ This can be called before or after calling L. Initializing the video subsytem will be handled correctly no matter what thanks to L. +=head2 set_video_mode + + my $app = SDLx::App->set_video_mode( $w, $h, $d, $f ); + $app->set_video_mode( $w, $h, $d, $f ); + +The first form is used internally by L to create the new SDL display surface. +The second form can be used to change the video mode of an existing app. +See L for a description on what the +four arguments do. + +=head2 resize + + $app->resize( $w, $h ); + +Resize the app to the specified width and height. The surface's depth and flags will remain the same. + +=head2 fullscreen + +Toggles the app in and out of fullscreen mode in a cross-platform-friendly way. +Returns false if the app fails to go fullscreen for some reason. Otherwise, returns true. + +=head2 iconify + +Attempts to iconify the window with L. + =head2 title() =head2 title( $new_title ) From 57dd766898a3651df5fc70c360d1bb4ef85acaa8 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 31 Jan 2012 02:23:34 +1030 Subject: [PATCH 029/153] fix for previous commit --- lib/SDLx/App.pm | 6 +++--- lib/pods/SDLx/App.pod | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 670b1802..f3e6cf75 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -151,11 +151,11 @@ sub new { sub set_video_mode { my ($self, $w, $h, $d, $f) = @_; - + my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) or Carp::confess( "set_video_mode failed: ", SDL::get_error() ); $surface = SDLx::Surface->new( surface => $surface ); - + # if we already have an app if( ref $self ) { # make the app scalar ref point to the new C surface object @@ -273,7 +273,7 @@ sub fullscreen { eval { $self->set_video_mode( 0, 0, $d, $f ^ SDL::Video::SDL_FULLSCREEN ) }; return 1 unless $@; - + # failed going fullscreen, let's revert back $self->set_video_mode( 0, 0, $d, $f ); diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 0f672fbd..ae49c7bc 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -335,11 +335,15 @@ Resize the app to the specified width and height. The surface's depth and flags =head2 fullscreen + $app->fullscreen(); + Toggles the app in and out of fullscreen mode in a cross-platform-friendly way. Returns false if the app fails to go fullscreen for some reason. Otherwise, returns true. =head2 iconify + $app->iconify(); + Attempts to iconify the window with L. =head2 title() From 81fc1d7c50de28864cfca90c9248de67c85720c1 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 31 Jan 2012 19:20:27 +1030 Subject: [PATCH 030/153] SDLx::App title, icon and error and their docs. Made everything a method again. --- lib/SDLx/App.pm | 23 +++++++++++-------- lib/pods/SDLx/App.pod | 52 +++++++++++++++++++++---------------------- 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index f3e6cf75..874e65d5 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -67,7 +67,7 @@ sub new { # used to say unless no_init here. I don't think we need it anymore if( !defined $init ) { - SDLx::App::init( SDL::SDL_INIT_EVERYTHING ); + SDLx::App->init( SDL::SDL_INIT_EVERYTHING ); } else { if( ref $init ) { @@ -76,7 +76,7 @@ sub new { else { $init |= SDL::SDL_INIT_VIDEO } - SDLx::App::init( $init ); + SDLx::App->init( $init ); } $f |= SDL::Video::SDL_SWSURFACE if $sw; @@ -138,10 +138,13 @@ sub new { } my $self = $class->set_video_mode( $w, $h, $d, $f ); - $self->SDLx::Controller::new( %o ) unless $nc; + + $t = defined $it ? $it : $0 unless defined $t; + $it = $t unless defined $it; $self->title( $t, $it ); $self->icon( $icon ); + $self->show_cursor( 0 ) if $ncur; $self->grab_input( $gi ) if $gi; $self->stash = $s; @@ -150,7 +153,7 @@ sub new { } sub set_video_mode { - my ($self, $w, $h, $d, $f) = @_; + my ( $self, $w, $h, $d, $f ) = @_; my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) or Carp::confess( "set_video_mode failed: ", SDL::get_error() ); @@ -179,7 +182,7 @@ sub stash :lvalue { } sub init { - my $init = shift; + my ( undef, $init ) = @_; if ( ref $init ) { # make a hash with keys of the values in the init array @@ -208,7 +211,7 @@ sub init { } sub screen_size { - SDLx::App::init( SDL::SDL_INIT_VIDEO ); + SDLx::App->init( SDL::SDL_INIT_VIDEO ); my $video_info = SDL::Video::get_video_info(); @@ -227,15 +230,17 @@ sub resize { sub title { my ( undef, $title, $icon_title ) = @_; if ( @_ > 1 ) { - $title = defined $icon_title ? $icon_title : $0 unless defined $title; - $icon_title = $title unless defined $icon_title; + my ($t, $it) = SDL::Video::wm_get_caption; + $title = $t unless defined $title; + $icon_title = $it unless defined $icon_title; return SDL::Video::wm_set_caption( $title, $icon_title ); } SDL::Video::wm_get_caption; } sub icon { - SDL::Video::wm_set_icon( $_[1] ); + my ( undef, $icon, $mask ) = @_; + SDL::Video::wm_set_icon( $icon ); } sub error { diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index ae49c7bc..69294219 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -78,7 +78,7 @@ providing all the methods they both provide. title => "Application Title", icon_title => "App Title", - icon => SDL::Video::load_BMP( "icon.bmp" ), + icon => TODO, # two ways to do init. init video is assumed regardless init => SDL_INIT_AUDIO | SDL_INIT_JOYSTICK, @@ -282,14 +282,14 @@ L. If not specified, defaults to an empty hash ref. =head2 init - SDLx::App::init( SDL::SDL_INIT_TIMER | SDL::SDL_INIT_AUDIO | ... ); - SDLx::App::init( [ 'timer', 'audio', 'video', 'cd_rom', 'cdrom', 'joystick', + SDLx::App->init( SDL::SDL_INIT_TIMER | SDL::SDL_INIT_AUDIO | ... ); + SDLx::App->init( [ 'timer', 'audio', 'video', 'cd_rom', 'cdrom', 'joystick', 'everything', 'all', 'no_parachute', 'event_thread' ] ); -This is not a method, but a sub. It is used internally by L to init SDL with +This is used internally by L to init SDL with L. If any subsystems are already initialized, it will use L instead. You should use this whenever you need to -init anything outside calls to . +init anything outside calls to , as it will always do what you want. If a number is specified, it will initialize SDL in the same way as L describes. If an array ref is specified, each element should be a string corresponding to a flag to specify. @@ -309,7 +309,7 @@ descriptions of what each flag does. =head2 screen_size - my ($screen_w, $screen_h) = SDLx::App::screen_size(); + my ($screen_w, $screen_h) = SDLx::App->screen_size(); Returns the width and height of the user's screen resolution using L. @@ -346,34 +346,34 @@ Returns false if the app fails to go fullscreen for some reason. Otherwise, retu Attempts to iconify the window with L. -=head2 title() +=head2 title -=head2 title( $new_title ) + my ( $title, $icon_title ) = $app->title(); + $app->title( $title, $icon_title ); -=head2 title( $window_title, $icon_title ) +If no arguments are specified, returns a list of the title and the icon title. +If arguments are specified, the titles will be set instead. Specify undef to keep the title or +icon title the same, or a string to modify them. -C takes 0, 1, or 2 arguments. If no parameter is given, -it returns the current application window title. If one parameter is -passed, both the window title and icon title will be set to its value. -If two parameters are passed the window title will be set to the first, -and the icon title to the second. +=head2 icon -=head2 error - -C returns the last error message set by the SDL. + SDLx::App->icon( $filename ); + SDLx::App->icon( SDL::Video::load_BMP( $filename ) ); + SDLx::App->icon( $icon, $color_key ); + SDLx::App->icon( $icon, $mask ); -=head2 resize( $width, $height ) +This is yet to be implemented. Currently only the second form works. -C takes a new width and height of the application. Only -works if the application was originally created with the resizable option. - -=head2 fullscreen - -C toggles the application in and out of fullscreen mode. +=head2 error -=head2 iconify + my $error = $app->error(); + $app->error( @error ); + $app->error( undef ); -C iconifies the application window. +With no arguments, returns the current SDL error using L. +With one or more arguments, sets the SDL error to the C formatted string. +With C as the one and only argument, clears the SDL error. This can be used +when you are done with the error. =head2 grab_input( $CONSTANT ) From 350ffca232012b1ff0259eed677741bac8b4482e Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 31 Jan 2012 19:34:46 +1030 Subject: [PATCH 031/153] SDLx::App warp_cursor, show_cursor, grab_input and their docs --- lib/SDLx/App.pm | 6 +++--- lib/pods/SDLx/App.pod | 29 +++++++++++++++++++++-------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 874e65d5..6b886467 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -256,14 +256,14 @@ sub error { sub warp_cursor { my ( undef, $x, $y ) = @_; - SDL::Mouse::warp_mouse( $x, $y ); + SDL::Mouse::warp_mouse( $x || 0, $y || 0 ); } sub show_cursor { my ( undef, $show ) = @_; if ( @_ > 1 ) { - return SDL::Mouse::show_cursor( SDL::Event::SDL_ENABLE ) if $show; - return SDL::Mouse::show_cursor( SDL::Event::SDL_DISABLE ); + return SDL::Mouse::show_cursor( SDL::Event::SDL_ENABLE ) if $show and $show ne SDL::Event::SDL_QUERY; + return SDL::Mouse::show_cursor( SDL::Event::SDL_DISABLE ) unless $show; } SDL::Mouse::show_cursor( SDL::Event::SDL_QUERY ); } diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 69294219..a046ac12 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -375,20 +375,33 @@ With one or more arguments, sets the SDL error to the C formatted strin With C as the one and only argument, clears the SDL error. This can be used when you are done with the error. -=head2 grab_input( $CONSTANT ) +=head2 warp_cursor -C can be used to change the input focus behavior of -the application. It takes one argument, which should be one of the following: + $app->warp_cursor( $x, $y ); -=over 4 +Moves the cursor to the specified coordinates on the application window. If an argument +is not specified, it will default to 0. -=item * SDL_GRAB_QUERY +=head2 show_cursor -=item * SDL_GRAB_ON + my $is_cursor_shown = $app->show_cursor(); + $app->show_cursor( $show ); -=item * SDL_GRAB_OFF +If no arguments are specified, returns a boolean that will be true if the cursor +is currently being shown or false otherwise. If an argument is specified, the cursor will be +shown if it is true or hidden otherwise. -=back +=head2 grab_input + + my $is_grabbing_input = $app->grab_input(); + $app->grab_input( $grab ); + +Grab input attempts to confine the cursor to the window. +Also, nearly all keyboard input will be passed directly to the application, +and not interpreted by any window manager present. +If no arguments are specified, returns a boolean that will be true if +grab input is on or false if it is off. If an argument is specified, grab input will be turned on +if it is true or off otherwise. =head2 sync From 7ed6d156799d66b02b1a6a6b69ddb11d9cac87df Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 31 Jan 2012 20:01:21 +1030 Subject: [PATCH 032/153] SDLx::App sync, gl_attribute and their docs --- lib/SDLx/App.pm | 2 +- lib/pods/SDLx/App.pod | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 6b886467..8330749d 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -249,7 +249,7 @@ sub error { return SDL::clear_error; } if ( @_ ) { - return SDL_set_error_real( @_ ); + return SDL::set_error_real( @_ ); } SDL::get_error; } diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index a046ac12..b26ce89f 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -405,17 +405,22 @@ if it is true or off otherwise. =head2 sync -C encapsulates the various methods of syncronizing the screen with the -current video buffer. C will do a fullscreen update, using the double buffer -or OpenGL buffer if applicable. This is prefered to calling flip on the application window. +Swaps the OpenGL buffers and does a full update of the screen with +L if OpenGL is being used. +This is preferable to swapping the SDL buffers. +Otherwise, just swaps the SDL buffers using L. -=head2 attribute( $attr ) +=head2 gl_attribute -=head2 attribute( $attr, $value ) + my $value = $app->( $attribute ); + $app->gl_attribute( $attribute, $value ); -C allows one to get and set GL attributes. By passing a value -in addition to the attribute selector, the value will be set. C -always returns the current value of the given attribute, or Carp::confesss on failure. +With one argument, returns the value of the specified attribute using +L. +With a value argument, sets the specified attribute +to the specified value using L. +The attribute argument should be one of the L. +See L for more details. =head1 AUTHORS @@ -423,6 +428,6 @@ See L. =head1 SEE ALSO -L, L, L, L, L, L +L, L, L, L, L =cut From 92bc088da5c396db1e806ee888a7f55cccdb263f Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 31 Jan 2012 20:06:29 +1030 Subject: [PATCH 033/153] Docs for undocumented SDL::Surface method: flags --- lib/pods/SDL/Surface.pod | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/pods/SDL/Surface.pod b/lib/pods/SDL/Surface.pod index 864a8256..15082f1a 100644 --- a/lib/pods/SDL/Surface.pod +++ b/lib/pods/SDL/Surface.pod @@ -83,6 +83,12 @@ SDL::Surface width is defined at construction so this is read-only. Returns the height of the surface. SDL::Surface height is defined at construction so this is read-only. +=head2 flags + + my $flags = $surface->flags; + +Returns the flags of the surface (bitwise OR-ed L). + =head2 format my $format = $surface->format; From fb1332ff2f1b3d8bcfcf1542fb0d7a02af50a766 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 31 Jan 2012 20:08:43 +1030 Subject: [PATCH 034/153] this should have been with the sync/gl_attribute commit --- lib/SDLx/App.pm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 8330749d..ebcf7f3c 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -304,19 +304,19 @@ sub sync { if ( $SDLx::App::USING_OPENGL ) { return SDL::Video::GL_swap_buffers; } - $self->flip; + SDL::Video::flip( $self ); } sub gl_attribute { my ( undef, $mode, $value ) = @_; return unless $SDLx::App::USING_OPENGL; - if ( defined $value ) { + if ( @_ > 2 ) { return SDL::Video::GL_set_attribute( $mode, $value ); } my $returns = SDL::Video::GL_get_attribute( $mode ); - Carp::confess( "SDLx::App::attribute failed to get GL attribute" ) - if ( $returns->[0] < 0 ); + Carp::cluck( "SDL::Video::GL_get_attribute failed to get GL attribute" ) + if $returns->[0] < 0; $returns->[1]; } From f31d22f20a899725879e7a639097122fe58af531 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 31 Jan 2012 20:45:05 +1030 Subject: [PATCH 035/153] screen_size now returns depth as well --- lib/pods/SDLx/App.pod | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index b26ce89f..ec72d33e 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -309,9 +309,9 @@ descriptions of what each flag does. =head2 screen_size - my ($screen_w, $screen_h) = SDLx::App->screen_size(); + my ($screen_w, $screen_h, $screen_d) = SDLx::App->screen_size(); -Returns the width and height of the user's screen resolution using +Returns the width, height and depth of the user's screen using L. This can be called before or after calling L. Initializing the video subsytem will be handled correctly no matter what thanks to From 740e7f86b9c81426e199ea2866d4d74ef899b1d3 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Fri, 3 Feb 2012 01:19:53 +1030 Subject: [PATCH 036/153] SDLx::App icon done and documented but transparency doesn't work. SDLx::App is just about done now, except for some polish. Needs tests, too... --- lib/SDLx/App.pm | 23 ++++++++++++++++++----- lib/pods/SDLx/App.pod | 31 ++++++++++++++++++++----------- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 474273c3..85e35927 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -9,7 +9,8 @@ use SDL::Video (); use SDL::Mouse (); use SDL::Event (); use SDL::Surface (); -use SDL::VideoInfo(); +use SDL::VideoInfo (); +use SDLx::Validate (); use base qw/SDLx::Surface SDLx::Controller/; # SDL modules used for other reasons @@ -39,13 +40,14 @@ sub new { my $d = defined $o{depth} ? $o{depth} : defined $o{d} ? $o{d} : undef; my $f = defined $o{flags} ? $o{flags} : defined $o{f} ? $o{f} : 0; my $pos = defined $o{position} ? $o{position} : defined $o{pos} ? $o{pos} : undef; + my $ico = $o{icon}; # undef is a valid input my $t = $o{title}; my $it = $o{icon_title}; - my $icon = $o{icon}; my $init = exists $o{initialize} ? $o{initialize} : $o{init}; my $s = exists $o{stash} ? $o{stash} : {}; + my $icc = $o{icon_color_key}; # boolean my $sw = $o{software_surface} || $o{sw_surface} || $o{sw}; @@ -58,7 +60,7 @@ sub new { my $gl = $o{open_gl} || $o{opengl} || $o{gl}; my $rs = $o{resizable} || $o{resizeable}; # it's a hard word to spell :-) my $nf = $o{no_frame}; - my $ncur = $o{no_cursor}; + my $ncur = $o{hide_cursor} || $o{no_cursor}; my $cen = $o{centered} || $o{center}; my $gi = $o{grab_input}; my $nc = $o{no_controller}; @@ -148,6 +150,9 @@ sub new { SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_SWAP_CONTROL, $sc ) if defined $sc; SDL::Video::GL_set_attribute( SDL::Video::SDL_GL_ACCELERATED_VISUAL, $av ) if defined $av; } + + # icon must be set before set_video_mode + SDLx::App->icon( $ico, $icc ) if defined $ico; my $self = $class->set_video_mode( $w, $h, $d, $f ); $self->SDLx::Controller::new( %o ) unless $nc; @@ -155,7 +160,6 @@ sub new { $t = defined $it ? $it : $0 unless defined $t; $it = $t unless defined $it; $self->title( $t, $it ); - $self->icon( $icon ); $self->show_cursor( 0 ) if $ncur; $self->grab_input( $gi ) if $gi; @@ -257,7 +261,16 @@ sub title { } sub icon { - my ( undef, $icon, $mask ) = @_; + my ( undef, $icon, $color ) = @_; + SDLx::App->init( SDL::SDL_INIT_VIDEO ); + unless( UNIVERSAL::isa( $icon, "SDL::Surface" ) ) { + $icon = SDL::Video::load_BMP( $icon ); + $icon or Carp::confess( "Could not load_BMP icon '$icon': ", SDL::get_error() ); + } + if( defined $color ) { + $color = SDLx::Validate::map_rgb( $color, $icon->format ); + SDL::Video::set_color_key( $icon, SDL::Video::SDL_SRCCOLORKEY, $color ); + } SDL::Video::wm_set_icon( $icon ); } diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index ec72d33e..1cf92eca 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -76,9 +76,10 @@ providing all the methods they both provide. height => 480, depth => 32, - title => "Application Title", - icon_title => "App Title", - icon => TODO, + title => "Application Title", + icon_title => "App Title", + icon => "icon.bmp", + icon_color_key => [255, 255, 0], # two ways to do init. init video is assumed regardless init => SDL_INIT_AUDIO | SDL_INIT_JOYSTICK, @@ -102,7 +103,7 @@ providing all the methods they both provide. centered => 1, position => [ 150, 100 ], - no_cursor => 1, + hide_cursor => 1, grab_input => 1, # don't initialize an SDLx::Controller for the app @@ -161,7 +162,11 @@ The application's icon title, as a string. Defaults to the L if defined, =item icon -The application's icon. Set with L. +The application's icon. Set with the L method. + +=item icon_color_key + +You can optionally use this when specifying the C parameter to set its color key (transparent pixel). =item init @@ -257,10 +262,11 @@ The position of the window on the screen, as an array ref. The array ref should specifying C and C values, in pixels, used to position the window on the screen. Implemented using C<$ENV{SDL_VIDEO_WINDOW_POS}>. Alias: C. -=item no_cursor +=item hide_cursor A boolean value. If true, hides the cursor on the video surface using L. A surface can then instead be blitted to the display at the location of the cursor. +Alias: C. =item grab_input @@ -357,12 +363,15 @@ icon title the same, or a string to modify them. =head2 icon - SDLx::App->icon( $filename ); - SDLx::App->icon( SDL::Video::load_BMP( $filename ) ); - SDLx::App->icon( $icon, $color_key ); - SDLx::App->icon( $icon, $mask ); + SDLx::App->icon( $filename, $color ); + SDLx::App->icon( $surface, $color ); -This is yet to be implemented. Currently only the second form works. +Sets the window's icon. +This must be called before creating the display surface, so SDL::Image can not be used. +If a filename is specified, it is loaded withL. +Otherwise, the first argument should be a surface. Win32 icons must be 32x32. +The C<$color> argument is optional and, if specified, is used to set the icon's color key (transparent pixel). +It should be an RGB color as either a number or array ref. =head2 error From b84b9b30ae504968658a460679744249572e2b85 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Fri, 3 Feb 2012 03:30:29 +1030 Subject: [PATCH 037/153] SDLx::Controller stop_handler and its docs. Just about finished SDLx::Controller now, too. Needs polish, tests, and... someone to tell me the docs make sense? --- lib/SDLx/Controller.pm | 39 ++++++++++++---------------------- lib/pods/SDLx/Controller.pod | 41 ++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 46 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 22d3c312..384f6652 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -22,14 +22,13 @@ my %_event_handlers; my %_move_handlers; my %_show_handlers; my %_delay; -my %_eoq; my %_paused; my %_time; -my %_eoq_handler; +my %_stop_handler; sub new { my ($self, %args) = @_; - + # if $self is blessed then it has to isa controller, so let's not even bless it to this class unless(ref $self) { my $a; @@ -47,10 +46,9 @@ sub new { $_move_handlers{ $ref } = $args{move_handlers} || []; $_show_handlers{ $ref } = $args{show_handlers} || []; $_delay{ $ref } = (defined $args{delay} && $args{delay} >= 1 ? $args{delay} / 1000 : $args{delay}) || 0; #phasing out ticks, but still accepting them. Remove whenever we break compat - $_eoq{$ref} = $args{exit_on_quit} || $args{eoq}; # $_paused{ $ref } = $args{paused}; #no point $_time{ $ref } = $args{time} || 0; - $_eoq_handler{ $ref } = $args{exit_on_quit_handler} || $args{eoq_handler} || \&_default_exit_on_quit_handler; + $_stop_handler{ $ref } = $args{stop_handler} || \&_default_stop_handler; return $self; } @@ -68,10 +66,9 @@ sub DESTROY { delete $_move_handlers{ $ref}; delete $_show_handlers{ $ref}; delete $_delay { $ref}; - delete $_eoq{ $ref}; delete $_paused{ $ref}; delete $_time{ $ref}; - delete $_eoq_handler{ $ref}; + delete $_stop_handler{ $ref}; } sub run { @@ -109,7 +106,7 @@ sub run { $dt = $_dt{ $ref}; #these can change $min_t = $_min_t{ $ref}; #during the cycle - + Time::HiRes::sleep( $_delay{ $ref } ) if $_delay{ $ref }; } @@ -123,7 +120,7 @@ sub pause { while(1) { SDL::Events::wait_event($_event{ $ref}) or Carp::confess("pause failed waiting for an event"); if( - $_eoq{ $ref} && do { $_eoq_handler{ $ref}->( $_event{ $ref}, $self ); $_stop{ $ref} } + $_stop_handler{ $ref} && do { $_stop_handler{ $ref}->( $_event{ $ref}, $self ); $_stop{ $ref} } or !$callback or $callback->($_event{ $ref}, $self) ) { $_current_time{ $ref} = Time::HiRes::time; #so run doesn't catch up with the time paused @@ -141,7 +138,7 @@ sub _event { my ($self, $ref) = @_; SDL::Events::pump_events(); while ( SDL::Events::poll_event( $_event{ $ref} ) ) { - $_eoq_handler{ $ref}->( $_event{ $ref}, $self ) if $_eoq{ $ref}; + $_stop_handler{ $ref}->( $_event{ $ref}, $self ) if $_stop_handler{ $ref}; foreach my $event_handler ( @{ $_event_handlers{ $ref} } ) { next unless $event_handler; $event_handler->( $_event{ $ref}, $self ); @@ -273,28 +270,18 @@ sub delay { $_delay{ $ref}; } -sub exit_on_quit { - my ($self, $arg) = @_; - my $ref = refaddr $self; - $_eoq{ $ref} = $arg if defined $arg; - - $_eoq{ $ref}; -} -*eoq = \&exit_on_quit; # alias - -sub exit_on_quit_handler { +sub stop_handler { my ($self, $arg) = @_; my $ref = refaddr $self; - $_eoq_handler{ $ref} = $arg if defined $arg; + $_stop_handler{ $ref} = $arg if @_ > 1; - $_eoq_handler{ $ref}; + $_stop_handler{ $ref}; } -*eoq_handler = \&exit_on_quit_handler; #alias -sub _default_exit_on_quit_handler { - my ($self, $event) = @_; +sub _default_stop_handler { + my ($event, $self) = @_; - $self->stop() if $event->type == SDL_QUIT; + $self->stop() if $event->type == SDL_QUIT; } sub event { diff --git a/lib/pods/SDLx/Controller.pod b/lib/pods/SDLx/Controller.pod index 32c2249e..66dda200 100644 --- a/lib/pods/SDLx/Controller.pod +++ b/lib/pods/SDLx/Controller.pod @@ -58,11 +58,10 @@ ease. dt => 0.05, min_t => 0, delay => 1 / 200, - eoq => 1, - eoq_handler => \&eoq_handler, event_handlers => [ @event_callbacks ], move_handlers => [ @move_callbacks ], show_handlers => [ @show_callbacks ], + stop_handler => \&stop_handler, event => $event, time => 99, ); @@ -92,16 +91,6 @@ Setting it to 0, as seen above, will not delay the loop at all. The time, in seconds, to delay after every full app loop. Defaults to 0. B Picking a good delay based on the needs can hugely reduce CPU load and pressure. -=item exit_on_quit (shortcut: eoq) - -If true, the app loop will stop when an C event is triggered. Defaults to false. -You can also specify your own exit on quit handler, but the default will do exactly what was just mentioned. - -=item exit_on_quit_handler (shortcut: eoq_handler) - -An alternative callback to handle quitting. Defaults to a callback that stops the event loop on an C event. -Things that should be specified here are additional ways to end the app, like on pressing Esc or Alt-F4. - =item event_handlers =item move_handlers @@ -113,6 +102,24 @@ This is basically a shortcut way of adding handlers. They would otherwise be added with their corresponding C method. See below for a full explanation of the L loop and handlers. +=item stop_handler + +An extra, but separate, event callback to handle all L of the app. +It is the same in almost every way to an event handler (see L): same recieved arguments, called in the same place. +One difference is that it is called in L so that the app can be stopped while paused. +Another difference is that it should always apply to the app; while you add and remove and clear event handlers, +this wont be touched. This is good, because you'd (probably) always want your app to able to be stopped. +Because of this, it's a good idea to use the stop handler regardless of whether you will be using L. + +Defaults to a callback that L the event loop on an C event. +Specify a code ref to use a different callback to handle quitting, or a false value to not use a stop handler. +If you want to provide your own stop handler you should give it the code of the default stop handler: + + my ($event, $self) = @_; + $self->stop() if $event->type == SDL_QUIT; + +followed by any other code to handle events also triggering the app to stop, such as pressing Esc. + =item event The C object that events going to the event callbacks are polled in to. Defaults to C<< SDL::Event->new() >>. @@ -357,20 +364,14 @@ This is only useful when used within code that will be run by L: $app->add_event_handler(\&toggle_pause); All the examples here are of recursive pause callbacks, but, of course, yours don't have to be. - -=head2 dt -=head2 exit_on_quit - -(shortcut: eoq) +=head2 dt =head2 min_t =head2 delay -=head2 exit_on_quit_handler - -(shortcut: eoq_handler) +=head2 stop_handler =head2 event From 8d8d0c3833c3b1a9f24e2933ed8db7da99f85097 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Wed, 22 Feb 2012 20:57:24 +0100 Subject: [PATCH 038/153] using ogg files --- t/mixer_music.t | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/t/mixer_music.t b/t/mixer_music.t index 8d23e558..9e6f7bc3 100644 --- a/t/mixer_music.t +++ b/t/mixer_music.t @@ -59,16 +59,18 @@ sub mix_func { return @stream; } -my $delay = 100; -my $audio_test_file = 'test/data/silence.wav'; -my $volume1 = 2; -my $volume2 = 1; +my $delay = 100; +my $wav_test_file = 'test/data/silence.wav'; +my $ogg_test_file = 'test/data/silence.ogg'; +my $volume1 = 2; +my $volume2 = 1; if ( $ENV{'SDL_RELEASE_TESTING'} ) { - $delay = 2000; - $audio_test_file = 'test/data/sample.wav'; - $volume1 = 20; - $volume2 = 10; + $delay = 2000; + $wav_test_file = 'test/data/sample.wav'; + $ogg_test_file = 'test/data/sample.ogg'; + $volume1 = 20; + $volume2 = 10; } SDL::Mixer::Music::volume_music($volume1); @@ -103,24 +105,26 @@ SKIP: is( $mix_func_called > 0, 1, "[hook_music] called $mix_func_called times" ); } -my $sample_music = SDL::Mixer::Music::load_MUS($audio_test_file); -isa_ok( $sample_music, 'SDL::Mixer::MixMusic', '[load_MUS]' ); -is( SDL::Mixer::Music::play_music( $sample_music, 0 ), - 0, "[play_music] plays $audio_test_file" -); - SKIP: { - skip( 'Version 1.2.7 needed', 2 ) if $v < 1.2.7; + skip( 'Version 1.2.7 needed', 3 ) if $v < 1.2.7; - my $rw = SDL::RWOps->new_file( $audio_test_file, "rb" ); + my $rw = SDL::RWOps->new_file( $ogg_test_file, "rb" ); + isa_ok( $rw, 'SDL::RWOps', '[SDL::RWOps->new_file]' ); my $sample_music_rw = SDL::Mixer::Music::load_MUS_RW( $rw ); isa_ok( $sample_music_rw, 'SDL::Mixer::MixMusic', '[load_MUS_RW]' ); is( SDL::Mixer::Music::play_music( $sample_music_rw, 0 ), - 0, "[play_music_rw] plays $audio_test_file" + 0, "[play_music_rw] plays $wav_test_file" ); } +my $wav_music = SDL::Mixer::Music::load_MUS($wav_test_file); +my $ogg_music = SDL::Mixer::Music::load_MUS($ogg_test_file); +isa_ok( $wav_music, 'SDL::Mixer::MixMusic', '[load_MUS]' ); +is( SDL::Mixer::Music::play_music( $wav_music, 0 ), + 0, "[play_music] plays $wav_test_file" +); + SKIP: { skip( 'Version 1.2.9 needed', 2 ) if $v < 1.2.9; @@ -137,8 +141,8 @@ SKIP: SDL::delay($delay); is( SDL::Mixer::Music::playing_music(), 1, "[playing_music] music is playing" ); -is( SDL::Mixer::Music::get_music_type($sample_music), - MUS_WAV, "[get_music_type] $audio_test_file is MUS_WAV" +is( SDL::Mixer::Music::get_music_type($wav_music), + MUS_WAV, "[get_music_type] $wav_test_file is MUS_WAV" ); is( SDL::Mixer::Music::get_music_type(), MUS_WAV, "[get_music_type] currently playing MUS_WAV" @@ -174,7 +178,7 @@ is( SDL::Mixer::Music::set_music_cmd("mpeg123 -q"), is( SDL::Mixer::Music::set_music_cmd(), 0, '[set_music_cmd] return to the internal player' ); -is( SDL::Mixer::Music::fade_in_music( $sample_music, 0, 2000 ), +is( SDL::Mixer::Music::fade_in_music( $wav_music, 0, 2000 ), 0, "[fade_in_music] $delay ms" ); @@ -188,8 +192,8 @@ is( SDL::Mixer::Music::halt_music(), 0, '[halt_music]' ); SKIP: { skip( 'We need an MOD/OGG/MP3 for positioning', 2 ) - unless $audio_test_file =~ /\.(ogg|mod|mp3)$/; - is( SDL::Mixer::Music::fade_in_music_pos( $sample_music, 0, 2000, 2.5 ), + unless $ogg_test_file =~ /\.(ogg|mod|mp3)$/; + is( SDL::Mixer::Music::fade_in_music_pos( $ogg_music, 0, 2000, 2.5 ), 0, "[fade_in_music_pos] $delay ms, beginning at 2.5 ms" ); is( SDL::Mixer::Music::set_music_position(2.5), From 9cde6a83eff023e397470995ccc6e6a9908d051f Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Wed, 22 Feb 2012 20:58:10 +0100 Subject: [PATCH 039/153] added ogg test files --- test/data/sample.ogg | Bin 0 -> 76840 bytes test/data/silence.ogg | Bin 0 -> 41658 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/data/sample.ogg create mode 100644 test/data/silence.ogg diff --git a/test/data/sample.ogg b/test/data/sample.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3540be62a9ca746213a0e5a30e3812ca0e819f7d GIT binary patch literal 76840 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 literal 0 HcmV?d00001 diff --git a/test/data/silence.ogg b/test/data/silence.ogg new file mode 100644 index 0000000000000000000000000000000000000000..df793b2847816fb4eab532cda684070e067ab570 GIT binary patch literal 41658 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 Date: Sat, 10 Mar 2012 17:28:14 +0100 Subject: [PATCH 040/153] little change for setting context, still not perfect --- src/Mixer/Channels.xs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Mixer/Channels.xs b/src/Mixer/Channels.xs index a70e6e52..59e4132c 100644 --- a/src/Mixer/Channels.xs +++ b/src/Mixer/Channels.xs @@ -6,10 +6,6 @@ #include "defines.h" #include "helper.h" -#ifndef aTHX_ -#define aTHX_ -#endif - #include #ifdef HAVE_SDL_MIXER @@ -28,7 +24,11 @@ static SV * cb = (SV*)NULL; void callback(int channel) { - PERL_SET_CONTEXT(parent_perl); + dTHX; + if(!aTHX) { + PERL_SET_CONTEXT(parent_perl); + } + dSP; ENTER; SAVETMPS; From cba923add2241d62303b7f0901bd3d413636939f Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Sat, 10 Mar 2012 17:30:04 +0100 Subject: [PATCH 041/153] fixed bugtracker link --- Build.PL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Build.PL b/Build.PL index 688d2215..2c34d3fa 100644 --- a/Build.PL +++ b/Build.PL @@ -606,7 +606,7 @@ my $build = $package->new( #create_readme => 1, ### make sense only if there is some POD doc in the file specified by dist_version_from meta_merge => { resources => { - bugtracker => 'http://sdlperl.ath.cx/projects/SDLPerl', + bugtracker => 'http://github.com/PerlGameDev/SDL/issues', repository => 'http://github.com/PerlGameDev/SDL' } }, From d1a3445c183a393569a2b380bc5f0c7b9dddd303 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Sat, 10 Mar 2012 17:38:19 +0100 Subject: [PATCH 042/153] added constants for SDL_DEFAULT_REPEAT_DELAY and SDL_DEFAULT_REPEAT_INTERVAL --- lib/SDL/Constants.pm | 7 ++- lib/SDL/Event.pm | 3 +- lib/SDL/Events.pm | 3 +- lib/pods/SDL/Events.pod | 123 +++++++++++++++++++++------------------- 4 files changed, 73 insertions(+), 63 deletions(-) diff --git a/lib/SDL/Constants.pm b/lib/SDL/Constants.pm index d8015132..978df978 100644 --- a/lib/SDL/Constants.pm +++ b/lib/SDL/Constants.pm @@ -1030,6 +1030,11 @@ use constant { KMOD_META => ( KMOD_LMETA | KMOD_RMETA ), }; # SDL::Events/keymod +use constant { + SDL_DEFAULT_REPEAT_DELAY => 500, + SDL_DEFAULT_REPEAT_INTERVAL => 30, +}; # SDL::Events/repeat + use constant { SMOOTHING_OFF => 0, SMOOTHING_ON => 1, @@ -1217,8 +1222,6 @@ use constant { FPS_LOWER_LIMIT => 1, FPS_DEFAULT => 30, SDL_ALL_HOTKEYS => 0xFFFFFFFF, - SDL_DEFAULT_REPEAT_DELAY => 500, - SDL_DEFAULT_REPEAT_INTERVAL => 30, }; use constant { diff --git a/lib/SDL/Event.pm b/lib/SDL/Event.pm index e236181e..753cc22f 100644 --- a/lib/SDL/Event.pm +++ b/lib/SDL/Event.pm @@ -24,7 +24,8 @@ our %EXPORT_TAGS = ( app => $SDL::Constants::EXPORT_TAGS{'SDL::Events/app'}, button => $SDL::Constants::EXPORT_TAGS{'SDL::Events/button'}, keysym => $SDL::Constants::EXPORT_TAGS{'SDL::Events/keysym'}, - keymod => $SDL::Constants::EXPORT_TAGS{'SDL::Events/keymod'} + keymod => $SDL::Constants::EXPORT_TAGS{'SDL::Events/keymod'}, + repeat => $SDL::Constants::EXPORT_TAGS{'SDL::Events/repeat'} ); 1; diff --git a/lib/SDL/Events.pm b/lib/SDL/Events.pm index 9ff75e53..42e105a0 100644 --- a/lib/SDL/Events.pm +++ b/lib/SDL/Events.pm @@ -24,7 +24,8 @@ our %EXPORT_TAGS = ( app => $SDL::Constants::EXPORT_TAGS{'SDL::Events/app'}, button => $SDL::Constants::EXPORT_TAGS{'SDL::Events/button'}, keysym => $SDL::Constants::EXPORT_TAGS{'SDL::Events/keysym'}, - keymod => $SDL::Constants::EXPORT_TAGS{'SDL::Events/keymod'} + keymod => $SDL::Constants::EXPORT_TAGS{'SDL::Events/keymod'}, + repeat => $SDL::Constants::EXPORT_TAGS{'SDL::Events/repeat'} ); 1; diff --git a/lib/pods/SDL/Events.pod b/lib/pods/SDL/Events.pod index d5ce2a75..0d309f1e 100644 --- a/lib/pods/SDL/Events.pod +++ b/lib/pods/SDL/Events.pod @@ -15,7 +15,7 @@ Most likely you just want to know how to get events for you app. use SDL::Event; use SDL::Events ':all'; - SDL::init(SDL_INIT_VIDEO); # Event can only be grabbed in the same thread as this + SDL::init(SDL_INIT_VIDEO); # Event can only be grabbed in the same thread as this ... @@ -27,7 +27,7 @@ Most likely you just want to know how to get events for you app. while( SDL::Events::poll_event($event) ) { #check by event type - on_active() if $event->type == SDL_ACTIVEEVENT; + on_active() if $event->type == SDL_ACTIVEEVENT; ... } } @@ -198,6 +198,11 @@ Export tag ':keymod' KMOD_MODE KMOD_RESERVED +Export tag ':repeat' + + SDL_DEFAULT_REPEAT_DELAY + SDL_DEFAULT_REPEAT_INTERVAL + =head1 METHODS =head2 pump_events @@ -206,24 +211,24 @@ Pumps the event loop, gathering events from the input devices. pump_events(); -pump_events gathers all the pending input information from devices and places it on the event queue. Without calls to pump_events no events would -ever be placed on the queue. -Often the need for calls to pump_events is hidden from the user since L and L implicitly call pump_events. +pump_events gathers all the pending input information from devices and places it on the event queue. Without calls to pump_events no events would +ever be placed on the queue. +Often the need for calls to pump_events is hidden from the user since L and L implicitly call pump_events. However, if you are not polling or waiting for events (e.g. you are filtering them), then you must call pump_events to force an event queue update. -=head2 peep_events (event, num_events, action, mask) +=head2 peep_events (event, num_events, action, mask) -Checks the event queue for messages and optionally returns them. +Checks the event queue for messages and optionally returns them. my $num_peep_events = SDL::Events::peep_events($event, 127, SDL_PEEKEVENT, SDL_ALLEVENTS); If action is SDL_ADDEVENT, up to numevents events will be added to the back of the event queue. -If action is SDL_PEEKEVENT, up to numevents events at the front of the event queue, matching mask, will be returned and will not be removed from +If action is SDL_PEEKEVENT, up to numevents events at the front of the event queue, matching mask, will be returned and will not be removed from the queue. -If action is SDL_GETEVENT, up to numevents events at the front of the event queue, matching mask, will be returned and will be removed from the +If action is SDL_GETEVENT, up to numevents events at the front of the event queue, matching mask, will be returned and will be removed from the queue. The mask parameter is a bitwise OR of SDL::Events::SDL_EVENTMASK(event_type), for all event types you are interested in @@ -239,14 +244,14 @@ Examples of mask: =item SDL_EVENTMASK (SDL_KEYUP) =item (SDL_EVENTMASK (SDL_MOUSEBUTTONDOWN) | SDL_EVENTMASK (SDL_MOUSEBUTTONUP)) - + =item SDL_ALLEVENTS - + =item SDL_KEYUPMASK - + =item SDL_ALLEVENTS ^ SDL_QUITMASK -=back +=back =head3 RETURN @@ -254,26 +259,26 @@ Number of Events actually stored or -1 if there was an error =head2 poll_event($event) -Polls for currently pending events. +Polls for currently pending events. If $event is not NULL, the next event is removed from the queue and stored in the L structure pointed to by $event. -As this function implicitly calls pump_events, you can only call this function in the thread that set the video mode with -L. +As this function implicitly calls pump_events, you can only call this function in the thread that set the video mode with +L. =head3 RETURN -Returns 1 if there are any pending events, or 0 if there are none available. +Returns 1 if there are any pending events, or 0 if there are none available. =head2 push_event($event) -Pushes an event onto the event queue +Pushes an event onto the event queue -The event queue can actually be used as a two way communication channel. Not only can events be read from the queue, but the user can also push -their own events onto it. event is a pointer to the event structure you wish to push onto the queue. +The event queue can actually be used as a two way communication channel. Not only can events be read from the queue, but the user can also push +their own events onto it. event is a pointer to the event structure you wish to push onto the queue. The event is copied into the queue, and the caller may dispose of the memory pointed to after push_event returns. -Note: Pushing device input events onto the queue doesn't modify the state of the device within SDL. +Note: Pushing device input events onto the queue doesn't modify the state of the device within SDL. This function is thread safe, and can be called from other threads safely. @@ -287,8 +292,8 @@ Waits indefinitely for the next available $event, returning 0 if there was an er If $event is not NULL, the next event is removed from the queue and stored in $event. -As this function implicitly calls SDL_PumpEvents, you can only call this function in the thread that -L. +As this function implicitly calls SDL_PumpEvents, you can only call this function in the thread that +L. =head3 RETURN @@ -296,7 +301,7 @@ L. =head2 set_event_filter -Sets up a filter to process all events +Sets up a filter to process all events my $filter = sub { if($_[0]->type == SDL_ACTIVEEVENT){ return 0} else{ return 1; }}; @@ -308,15 +313,15 @@ set_event_filter takes a coderef that it checks all events again. The callback g sub { my $event_to_test = shift; ...} -to filter the event return a 0, to pass the filter return a 1. +to filter the event return a 0, to pass the filter return a 1. -One B is if you are filtering SDL_QUIT the event will be filtered if it is non-intterupt call ( Window closes normally ). If it is a -interrupt SDL_QUIT it will be process on the next event poll. +One B is if you are filtering SDL_QUIT the event will be filtered if it is non-intterupt call ( Window closes normally ). If it is a +interrupt SDL_QUIT it will be process on the next event poll. -Events pushed onto to the queue with L or L +Events pushed onto to the queue with L or L do not get filtered. -This callback may run in a different thread. +This callback may run in a different thread. =head2 get_key_state @@ -328,7 +333,7 @@ Get a snapshot of the current keyboard state Use L to update the state array. -This function gives you the current state after all events have been processed, so if a key or button has been pressed and released before you +This function gives you the current state after all events have been processed, so if a key or button has been pressed and released before you process events, then the pressed state will never show up in the get_key_state call. This function doesn't take into account whether shift has been pressed or not. @@ -345,19 +350,19 @@ Return value is an OR'd combination of KMOD_* my $mod_state = SDL::Events::get_mod_state(); - # Check which ones are pressed with + # Check which ones are pressed with # no mod pressed? - + print 'no_mod' if ( $mod_state & KMOD_NONE ); - # CTRL or ALT + # CTRL or ALT print 'ctrl alt' if ($mod_state & KMOD_CTRL || $mod_state & KMOD_ALT ); =head3 MOD VALUES -=over +=over =item KMOD_NONE @@ -383,7 +388,7 @@ Return value is an OR'd combination of KMOD_* =item KMOD_MODE -=item KMOD_CTRL +=item KMOD_CTRL same as KMOD_LCTRL|KMOD_RCTRL @@ -414,7 +419,7 @@ Simply pass your desired modifier states into $modstate. This value can be a OR' Any KMOD_* constant see L for constants. SDL::Events::set_mod_state( $modstate ); -=head2 event_state +=head2 event_state Allows you to set the state of processing certain events @@ -454,16 +459,16 @@ Gets the name of the a SDL virtual keysym Returns a string with the name of the key sym. -=head2 enable_unicode +=head2 enable_unicode Enable/Disable UNICODE translation my $previous_translation_mode = SDL::Events::enable_unicode( 1 ); #enable $previous_translation_mode = SDL::Events::enable_unicode( 0 ); #disables -To obtain the character codes corresponding to received keyboard events, Unicode translation must first be turned on using this function. The -translation incurs a slight overhead for each keyboard event and is therefore disabled by default. For each subsequently recieved key down event, -the unicode member of the L provided structure will be then contain the corresponding character code, or +To obtain the character codes corresponding to received keyboard events, Unicode translation must first be turned on using this function. The +translation incurs a slight overhead for each keyboard event and is therefore disabled by default. For each subsequently recieved key down event, +the unicode member of the L provided structure will be then contain the corresponding character code, or otherwise zero. A value of 1 for enabling, 0 for disabling and -1 for unchanged. -1 is usefull for querying the current translation mode. @@ -472,53 +477,53 @@ Only key press events will be translated not release events. Returns the previous translation mode as (1,0). -=head2 enable_key_repeat +=head2 enable_key_repeat Sets keyboard repeat rate my $success = SDL::Events::enable_key_repeat( $delay, $interval ); -Enables or disables the keyboard repeat rate. $delay specifies how long the key must be pressed before it begins repeating, it then repleats at the +Enables or disables the keyboard repeat rate. $delay specifies how long the key must be pressed before it begins repeating, it then repleats at the speed specified by $interval. Both $delay and $interval are expressed in milliseconds. Setting $delay to 0 disables key repeating completely. Good default values are SDL_DEFAULT_REPEAT_DELAY and SDL_DEFAULT_REPEAT_INTERVAL. Return 0 on success and -1 on fail. -=head2 get_mouse_state +=head2 get_mouse_state Retrives the current state of the mouse my ($mask,$x,$y) = @{ SDL::Events::get_mouse_state( ) }; - print 'Button Left pressed' if ($mask & SDL_BUTTON_LMASK); + print 'Button Left pressed' if ($mask & SDL_BUTTON_LMASK); - print 'Button Right pressed' if ($mask & SDL_BUTTON_RMASK); + print 'Button Right pressed' if ($mask & SDL_BUTTON_RMASK); - print 'Button Middle pressed' if ($mask & SDL_BUTTON_MMASK); + print 'Button Middle pressed' if ($mask & SDL_BUTTON_MMASK); print $x.','.$y; -The current button state is returned as a button $bitmask, which can be tested using the the above constants +The current button state is returned as a button $bitmask, which can be tested using the the above constants -=head2 get_relative_mouse_state +=head2 get_relative_mouse_state Retrives the current relative state of the mouse my ($mask,$x,$y) = @{ SDL::Events::get_mouse_state( ) }; - print 'Button Left pressed' if ($mask & SDL_BUTTON_LMASK); + print 'Button Left pressed' if ($mask & SDL_BUTTON_LMASK); - print 'Button Right pressed' if ($mask & SDL_BUTTON_RMASK); + print 'Button Right pressed' if ($mask & SDL_BUTTON_RMASK); - print 'Button Middle pressed' if ($mask & SDL_BUTTON_MMASK); + print 'Button Middle pressed' if ($mask & SDL_BUTTON_MMASK); print $x.','.$y; # this is relative to the last postion of the mouse -The current button state is returned as a button $bitmask, which can be tested using the the above constants +The current button state is returned as a button $bitmask, which can be tested using the the above constants -=head2 get_app_state +=head2 get_app_state Gets the state of the application @@ -526,7 +531,7 @@ Gets the state of the application The $app_state is a bitwise combination of: -=over +=over =item SDL_APPMOUSEFOCUS @@ -547,22 +552,22 @@ Application is visible warn 'Application Visible' if $app_state & SDL_APPACTIVE -=back +=back -=head2 joystick_event_state +=head2 joystick_event_state Enable/disable joystick event polling my $status = SDL::Events::joystick_event_state( $state ); -This function is used to enable or disable joystick event processing. With joystick event processing disabled you will have to update joystick +This function is used to enable or disable joystick event processing. With joystick event processing disabled you will have to update joystick states with L and read the joystick information manually. $state can be: -=over +=over =item SDL_QUERY -=item SDL_ENABLE +=item SDL_ENABLE =item SDL_IGNORE From 87c9268e4bace6b982e7f5d22ccc9106047d1a78 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sun, 1 Apr 2012 01:51:02 +1030 Subject: [PATCH 043/153] SDLx::Controller stop_handler and changed pause to work better. Fixed tests. Rewrote docs. Fixed examples to comply --- examples/SDLx/SDLx_C_Interface.pl | 8 - examples/SDLx/SDLx_Sound.pl | 1 - examples/SDLx/SDLx_controller_two_squares.pl | 2 - examples/SDLx/SDLx_text.pl | 2 +- examples/SDLx/SDLx_text_shadow.pl | 2 +- examples/SDLx/SDLx_text_styles.pl | 2 +- examples/SDLx/SDLx_text_wordwrap.pl | 2 +- examples/SDLx/SDLx_text_zoom.pl | 2 +- examples/SDLx/app.pl | 12 +- examples/SDLx/music.pl | 2 +- examples/SDLx/pong.pl | 4 +- lib/SDLx/Controller.pm | 123 ++++---- lib/pods/SDLx/Controller.pod | 284 ++++++++++++------- t/sdlx_controller.t | 72 +++-- 14 files changed, 304 insertions(+), 214 deletions(-) diff --git a/examples/SDLx/SDLx_C_Interface.pl b/examples/SDLx/SDLx_C_Interface.pl index f371cba2..41ce6995 100644 --- a/examples/SDLx/SDLx_C_Interface.pl +++ b/examples/SDLx/SDLx_C_Interface.pl @@ -34,14 +34,6 @@ $app->draw_rect( [ 100 - $state->x, $state->y, 2, 2 ], 0xFF0FFF ); }; -#an event handler to exit -my $event = sub { - $_[1]->stop if $_[0]->type == SDL_QUIT; -}; - - -$app->add_event_handler($event); - #clear the screen $app->add_show_handler( sub { $app->draw_rect( [ 0, 0, $app->w, $app->h ], 0x000000 ) } ); diff --git a/examples/SDLx/SDLx_Sound.pl b/examples/SDLx/SDLx_Sound.pl index d95a615f..efdc543a 100644 --- a/examples/SDLx/SDLx_Sound.pl +++ b/examples/SDLx/SDLx_Sound.pl @@ -44,7 +44,6 @@ # pause or resume on keydown $app->add_event_handler( sub{ my $e = $_[0]; - $_[1]->stop() if $e->type == SDL_QUIT; if( $e->type == SDL_KEYDOWN ) { print "Ai\n"; diff --git a/examples/SDLx/SDLx_controller_two_squares.pl b/examples/SDLx/SDLx_controller_two_squares.pl index 19fe7d8a..8e3016bf 100644 --- a/examples/SDLx/SDLx_controller_two_squares.pl +++ b/examples/SDLx/SDLx_controller_two_squares.pl @@ -101,8 +101,6 @@ sub on_event { $ball->{x_vel} += $ball->{vel} if $key == SDLK_LEFT; $ball->{x_vel} -= $ball->{vel} if $key == SDLK_RIGHT; - } elsif ( $event->type == SDL_QUIT ) { - $_[0]->stop; } } diff --git a/examples/SDLx/SDLx_text.pl b/examples/SDLx/SDLx_text.pl index 57f2abcc..46568400 100644 --- a/examples/SDLx/SDLx_text.pl +++ b/examples/SDLx/SDLx_text.pl @@ -5,7 +5,7 @@ use SDLx::App; use SDLx::Text; -my $app = SDLx::App->new( eoq => 1 ); +my $app = SDLx::App->new(); my $text = SDLx::Text->new; diff --git a/examples/SDLx/SDLx_text_shadow.pl b/examples/SDLx/SDLx_text_shadow.pl index ee318961..780143e1 100644 --- a/examples/SDLx/SDLx_text_shadow.pl +++ b/examples/SDLx/SDLx_text_shadow.pl @@ -7,7 +7,7 @@ use SDLx::App; use SDLx::Text; -my $app = SDLx::App->new( eoq => 1 ); +my $app = SDLx::App->new(); my $normal = SDLx::Text->new; my $shadow = SDLx::Text->new( shadow => 1 ); diff --git a/examples/SDLx/SDLx_text_styles.pl b/examples/SDLx/SDLx_text_styles.pl index f30bf8d8..b92311d7 100644 --- a/examples/SDLx/SDLx_text_styles.pl +++ b/examples/SDLx/SDLx_text_styles.pl @@ -5,7 +5,7 @@ use SDLx::App; use SDLx::Text; -my $app = SDLx::App->new( eoq => 1 ); +my $app = SDLx::App->new(); my $text = SDLx::Text->new; diff --git a/examples/SDLx/SDLx_text_wordwrap.pl b/examples/SDLx/SDLx_text_wordwrap.pl index bc6a7f5d..8c99d74a 100644 --- a/examples/SDLx/SDLx_text_wordwrap.pl +++ b/examples/SDLx/SDLx_text_wordwrap.pl @@ -5,7 +5,7 @@ use SDLx::App; use SDLx::Text; -my $app = SDLx::App->new( eoq => 1 ); +my $app = SDLx::App->new(); my $text = SDLx::Text->new( word_wrap => 450 ); diff --git a/examples/SDLx/SDLx_text_zoom.pl b/examples/SDLx/SDLx_text_zoom.pl index 8ea200cf..e41b149b 100644 --- a/examples/SDLx/SDLx_text_zoom.pl +++ b/examples/SDLx/SDLx_text_zoom.pl @@ -7,7 +7,7 @@ use SDLx::App; use SDLx::Text; -my $app = SDLx::App->new( eoq => 1, width => 400, height => 100 ); +my $app = SDLx::App->new( width => 400, height => 100 ); my $text = SDLx::Text->new; diff --git a/examples/SDLx/app.pl b/examples/SDLx/app.pl index 0358f381..07789727 100644 --- a/examples/SDLx/app.pl +++ b/examples/SDLx/app.pl @@ -7,15 +7,11 @@ height => 480, ); +sub draw_lines { + $app->draw_line( [ rand $app->w, rand $app->h ], [ rand $app->w, rand $app->h ], 0xFFFFFFFF ); + $app->update(); +} - -sub draw_lines { $app->draw_line( [ 0, 0 ], [ rand( $app->w ), rand( $app->h ) ], 0xFFFFFFFF ); $app->update(); } - -sub event_handle { my $e = shift; $_[0]->stop if ( $e->type == SDL_QUIT ); } - -$app->add_event_handler( \&event_handle ); $app->add_show_handler( \&draw_lines ); $app->run(); - - diff --git a/examples/SDLx/music.pl b/examples/SDLx/music.pl index 62d5b6d2..3cdae1c9 100644 --- a/examples/SDLx/music.pl +++ b/examples/SDLx/music.pl @@ -4,4 +4,4 @@ $music->data( sam => "test/data/sample.wav" ); $sam = $music->data("sam"); $music->play($sam); -while ( $music->playing ) { print "playing\n" } +while ( $music->playing ) { print "playing\n"; sleep 1; } diff --git a/examples/SDLx/pong.pl b/examples/SDLx/pong.pl index fe1b278a..a4bf6b3b 100644 --- a/examples/SDLx/pong.pl +++ b/examples/SDLx/pong.pl @@ -29,7 +29,7 @@ y => 0, w => 20, h => 80, - vel => 250, + vel => 130, y_vel => 0, }; @@ -143,8 +143,6 @@ sub on_event { my $key = $event->key_sym; $paddle->{y_vel} += $paddle->{vel} if $key == SDLK_UP; $paddle->{y_vel} -= $paddle->{vel} if $key == SDLK_DOWN; - } elsif ( $event->type == SDL_QUIT ) { - exit; } } diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 384f6652..41806c60 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -1,21 +1,19 @@ package SDLx::Controller; use strict; use warnings; -use Carp; -use Time::HiRes; -use SDL; -use SDL::Event; -use SDL::Events; -use SDL::Video; +use Carp (); +use Time::HiRes (); +use SDL (); +use SDL::Event (); +use SDL::Events (); +use SDL::Video (); use SDLx::Controller::Interface; use SDLx::Controller::State; use Scalar::Util 'refaddr'; -# inside out, so this can work as the superclass of another -# SDL::Surface subclass +# inside out, so this can work as the superclass of another class my %_dt; my %_min_t; -my %_current_time; my %_stop; my %_event; my %_event_handlers; @@ -39,16 +37,15 @@ sub new { $_dt{ $ref } = defined $args{dt} ? $args{dt} : 0.1; $_min_t{ $ref } = defined $args{min_t} ? $args{min_t} : 1 / 60; -# $_current_time{ $ref } = $args{current_time} || 0; #no point -# $_stop{ $ref } = $args{stop}; #shouldn't be allowed + $_stop{ $ref } = 1; $_event{ $ref } = $args{event} || SDL::Event->new(); $_event_handlers{ $ref } = $args{event_handlers} || []; $_move_handlers{ $ref } = $args{move_handlers} || []; $_show_handlers{ $ref } = $args{show_handlers} || []; $_delay{ $ref } = (defined $args{delay} && $args{delay} >= 1 ? $args{delay} / 1000 : $args{delay}) || 0; #phasing out ticks, but still accepting them. Remove whenever we break compat -# $_paused{ $ref } = $args{paused}; #no point +# $_paused{ $ref } = undef; $_time{ $ref } = $args{time} || 0; - $_stop_handler{ $ref } = $args{stop_handler} || \&_default_stop_handler; + $_stop_handler{ $ref } = $args{stop_handler} || \&default_stop_handler; return $self; } @@ -59,7 +56,6 @@ sub DESTROY { delete $_dt{ $ref}; delete $_min_t{ $ref}; - delete $_current_time{ $ref}; delete $_stop{ $ref}; delete $_event{ $ref}; delete $_event_handlers{ $ref}; @@ -77,60 +73,93 @@ sub run { my $dt = $_dt{ $ref }; my $min_t = $_min_t{ $ref }; - #Allows us to do stop and run - $_stop{ $ref } = 0; + # alows us to do stop and run + delete $_stop{ $ref }; + delete $_paused{ $ref }; - $_current_time{ $ref } = Time::HiRes::time; + my $current_time = Time::HiRes::time; while ( !$_stop{ $ref } ) { $self->_event($ref); my $new_time = Time::HiRes::time; - my $delta_time = $new_time - $_current_time{ $ref }; + my $delta_time = $new_time - $current_time; if($delta_time < $min_t) { - Time::HiRes::sleep(0.001); #sleep at least a millisecond + Time::HiRes::sleep(0.001); # sleep at least a millisecond next; } - $_current_time{ $ref} = $new_time; + $current_time = $new_time; my $delta_copy = $delta_time; + my $time_ref = \$_time{ $ref}; while ( $delta_copy > $dt ) { - $self->_move( $ref, 1, $_time{ $ref} ); #a full move + $self->_move( $ref, 1, $$time_ref ); # a full move $delta_copy -= $dt; - $_time{ $ref} += $dt; + $$time_ref += $dt; } my $step = $delta_copy / $dt; - $self->_move( $ref, $step, $_time{ $ref} ); #a partial move - $_time{ $ref} += $dt * $step; + $self->_move( $ref, $step, $$time_ref ); # a partial move + $$time_ref += $dt * $step; $self->_show( $ref, $delta_time ); - $dt = $_dt{ $ref}; #these can change - $min_t = $_min_t{ $ref}; #during the cycle + # these can change during the cycle + $dt = $_dt{ $ref}; + $min_t = $_min_t{ $ref}; Time::HiRes::sleep( $_delay{ $ref } ) if $_delay{ $ref }; } + # pause works by stopping the app and running it again + if( $_paused{ $ref } ) { + delete $_stop{ $ref}; + + $self->_pause($ref); + + # exit out of this sub before going back in so we don't recurse deeper and deeper + goto &{ $self->can('run') } + unless $_stop{ $ref}; + } +} + +sub stop { + my $ref = refaddr $_[0]; + + $_stop{ $ref } = 1; + + # if we're going to stop we don't want to pause + delete $_paused{ $ref }; +} +sub stopped { + # returns true if the app is stopped or about to stop + $_stop{ refaddr $_[0]}; } -sub stop { $_stop{ refaddr $_[0] } = 1 } +sub _pause { + my ($self, $ref) = @_; + my $event = $_event{ $ref}; + my $stop_handler = $_stop_handler{ $ref}; + my $callback = $_paused{ $ref}; + + do { + SDL::Events::wait_event( $event ) or Carp::confess("pause failed waiting for an event"); + } + until + $stop_handler && do { $stop_handler->( $event, $self ); $_stop{ $ref} } + or !$callback or $callback->( $event, $self ) + ; +} sub pause { my ($self, $callback) = @_; my $ref = refaddr $self; - $_paused{ $ref} = 1; - while(1) { - SDL::Events::wait_event($_event{ $ref}) or Carp::confess("pause failed waiting for an event"); - if( - $_stop_handler{ $ref} && do { $_stop_handler{ $ref}->( $_event{ $ref}, $self ); $_stop{ $ref} } - or !$callback or $callback->($_event{ $ref}, $self) - ) { - $_current_time{ $ref} = Time::HiRes::time; #so run doesn't catch up with the time paused - last; - } - } - delete $_paused{ $ref}; + + # if we're going to stop we don't want to pause + return if !$_paused{ $ref} and $_stop{ $ref}; + + $_paused{ $ref} = $callback; + $_stop{ $ref} = 1; } sub paused { - #why would you ever want to set this? Internally set only + # returns the callback (always true) if the app is paused or about to pause $_paused{ refaddr $_[0]}; } @@ -254,14 +283,6 @@ sub min_t { $_min_t{ $ref}; } -sub current_time { - my ($self, $arg) = @_; - my $ref = refaddr $self; - $_current_time{ $ref} = $arg if defined $arg; - - $_current_time{ $ref}; -} - sub delay { my ($self, $arg) = @_; my $ref = refaddr $self; @@ -278,10 +299,10 @@ sub stop_handler { $_stop_handler{ $ref}; } -sub _default_stop_handler { +sub default_stop_handler { my ($event, $self) = @_; - $self->stop() if $event->type == SDL_QUIT; + $self->stop() if $event->type == SDL::Events::SDL_QUIT; } sub event { @@ -292,7 +313,7 @@ sub event { $_event{ $ref}; } -#replacements for SDLx::App->get_ticks() and delay() +# replacements for SDLx::App->get_ticks() and delay() sub time { my ($self, $arg) = @_; my $ref = refaddr $self; diff --git a/lib/pods/SDLx/Controller.pod b/lib/pods/SDLx/Controller.pod index 66dda200..b2237d88 100644 --- a/lib/pods/SDLx/Controller.pod +++ b/lib/pods/SDLx/Controller.pod @@ -14,7 +14,7 @@ Extension, Controller # create our controller object my $app = SDLx::Controller->new; - # we could also do: + # but we usually do: my $app = SDLx::App->new; # because App is also a controller @@ -47,8 +47,9 @@ hardware. This module provides an industry-proven standard for frame independent movement. It calls the movement handlers based on time (hi-res seconds) rather -than frame rate. You can add/remove handlers and control your main loop with -ease. +than frame rate. You can add/remove these handlers and control your main loop with +ease. This module also provides methods for your other timing needs, +such as pausing the game. =head1 METHODS @@ -74,10 +75,20 @@ All params are optional and have sane defaults. =item dt The length, in seconds, of a full movement step. Defaults to 0.1. -The C

can be anything and the game can still look the same. -It is only when you change the C
without changing the rest of the constants in the move step that it will have a time scaling difference. +In most cases, the C
could be set to any number and the game could run almost identically +(except for floating-point precision differences). This is because B is an enforcement of the maximum time +between calling movement handlers>. The actual time between calling move handlers may be much less, as the movement handlers +are called at least once per frame. The specifics of this are explained in L. + +Usually you wouldn't need this value to be lower than the time it takes an average +computer to complete a cycle and render the frame. When you do need to run multiple move handlers per frame though, +such as if you were checking collision between fast-moving objects, you can set the C
to some low value +(less than 1/60). Otherwise, leaving it at 0.1 is fine. + +Regardless of whether you need to enforce a maximum time between move handlers, this system has its benefits. +Modifying the C
without touching any of the other code in your program will result in a time-scaling effect. If you lower the C
, everything will move faster than it did with it set higher, and vice-versa. -This is useful to add slo-mo and fast-forward features to the game, all you would have to do is change the C
. +This is useful to add slo-mo and fast-forward features to the game. All you would have to do is change the C
. =item min_t @@ -88,8 +99,9 @@ Setting it to 0, as seen above, will not delay the loop at all. =item delay -The time, in seconds, to delay after every full app loop. Defaults to 0. -B Picking a good delay based on the needs can hugely reduce CPU load and pressure. +The time, in seconds or milliseconds, to delay after every full L loop. Defaults to 0. +If you specify a number greater than or equal to 1, it will be treated as milliseconds instead of seconds. +B Picking a good delay based on the needs of your game can greatly reduce CPU load and pressure. =item event_handlers @@ -99,35 +111,39 @@ B Picking a good delay based on the needs can hugely reduce CPU load and An array ref of the corresponding handler callbacks. All default to []. This is basically a shortcut way of adding handlers. -They would otherwise be added with their corresponding C method. +They would otherwise be added with their corresponding C method. See below for a full explanation of the L loop and handlers. =item stop_handler An extra, but separate, event callback to handle all L of the app. -It is the same in almost every way to an event handler (see L): same recieved arguments, called in the same place. +It is the same in almost every aspect to an event handler (see L): same recieved arguments, +called in the same place. + One difference is that it is called in L so that the app can be stopped while paused. -Another difference is that it should always apply to the app; while you add and remove and clear event handlers, -this wont be touched. This is good, because you'd (probably) always want your app to able to be stopped. +Another difference is that it should always apply to the app; while you add, remove and clear handlers +it wont be touched. This is good, because you'd (probably) always want your app to able to be stopped. Because of this, it's a good idea to use the stop handler regardless of whether you will be using L. -Defaults to a callback that L the event loop on an C event. -Specify a code ref to use a different callback to handle quitting, or a false value to not use a stop handler. +Defaults to C<\&SDLx::Controller::default_stop_handler>: a callback that L the event loop on an C event. +Specify a code ref to use a different callback to handle stopping, or a false value to not use a stop handler. If you want to provide your own stop handler you should give it the code of the default stop handler: my ($event, $self) = @_; $self->stop() if $event->type == SDL_QUIT; -followed by any other code to handle events also triggering the app to stop, such as pressing Esc. +followed by any other code to handle events also triggering the app to stop, such as the user pressing Esc. =item event -The C object that events going to the event callbacks are polled in to. Defaults to C<< SDL::Event->new() >>. +The L object that events going to the event callbacks are L in to. +Defaults to C<< SDL::Event->new() >>. =item time -The starting time, in seconds, that you want the time since the app loop started to be at. Defaults to 0. -You'll seldom have to set this param. +The time, in seconds, that you want the L loop to say it has been going for. +This has no affect on the run loop. All it will do is alter what L returns. See L. +Defaults to 0. You'll seldom have to set this param. =back @@ -135,10 +151,10 @@ You'll seldom have to set this param. $app->run; -After creating and setting up your handlers (see below), call this method to -activate the main loop. The main loop will run until C is called. +After creating and setting up your handlers (see below), call this method to enter the main loop. +This loop will run until L is called. -All added handlers will be called during the main loop, in this order: +All added handlers will be called during the run loop, in this order: =over @@ -153,10 +169,6 @@ All added handlers will be called during the main loop, in this order: Please refer to each handler below for full information on what they do. Note that the second argument every callback recieves is the app object. -=head2 stop - -Returns from the C loop. - =head2 add_event_handler my $index = $app->add_event_handler( @@ -166,28 +178,31 @@ Returns from the C loop. } ); -Add a callback to the list to handle events. +Adds a callback to the end of the event handler list. You can add as many subs as you need. -For each SDL::Event from the user, all registered callbacks will supplied with it in order. +For each SDL::Event from the user, all registered callbacks will be called in order and supplied with it. Returns the index of the added callback. -Events from the user will one by one be polled into the app's L object. -Each event will then be passed to all of the registered callbacks as the first argument. -The argument second is the C object. +More specifically: events from the user will, one by one, be polled into the app's L object. +This event will then be passed to all of the registered callbacks as the first argument. +The second argument is the app. + +Below is an example of an event handler that sets a variable true when the left mouse button is down and false otherwise. -Below is an example of an equivalent event handler to the default exit on quit action. -This is just an example of an event handler, it's not recommended to make the stop handler an event handler (as shown at the bottom of the example). + our $click = 0; - sub stop { + sub on_click { my ($event, $app) = @_; - if($event->type == SDL_QUIT) { - $app->stop; + my $state = + $event->type == SDL_MOUSEBUTTONDOWN ? 1 : + $event->type == SDL_MOUSEBUTTONUP ? 0 : + return + ; + if($event->button_button == SDL_BUTTON_LEFT) { + $click = $state; } } - $app->add_event_handler(\&stop); - - # but we should really be doing this - $app->exit_on_quit_handler(\&stop); + $app->add_event_handler(\&on_click); =head2 add_move_handler @@ -198,22 +213,32 @@ This is just an example of an event handler, it's not recommended to make the st } ); -Add a callback to the list to handle the moving of your objects. +Adds a callback to the end of the movement handler list. You can add as many subs as you need. All registered callbacks will be triggered in order for as many C
as have happened between calls, -and once more for any remaining time less than C
. +and once more for the remaining time less than C
. +A reasonable C
for a game will usually be a number greater than +the time you would ever expect to have passed between frames. This means that your movement handlers will ordinarily +only be called once per frame. See the discussion of C
in L. Returns the index of the added callback. -The first argument passed to the callbacks is the portion of the step, which will be 1 for a full step, and less than 1 for a partial step. -Inversely, the time that the each move callback should handle is equal to the step argument multiplied by the C
. All movement values should be multiplied by the step value. -The argument can be 0 if no time has passed since the last cycle. It's best to protect against this by supplying the app a small L value. +The first argument passed to the callbacks is the fraction of C
time that the move callback should handle. +This will be 1 for a full step and less than 1 for a partial step. +Inversely, the time that the each move callback should handle is equal to the step argument multiplied by the C
. +All movement values should be multiplied by the step value. + +It is possible for the argument to be 0 if no time has passed since the last cycle. +It's best to protect against this by supplying the app a small L value. The second argument passed to the callbacks is the app object. -The third is the total amount of time passed in the run loop, and is also accessed with the L method. +The third is the value returned by L. See L. You should use these handlers to update your in-game objects, check collisions, etc. -so you can check and/or update it as necessary. +Below is an example of how you might move an object. Note that the movement value, a velocity in this case, +is multiplied by the step argument. + + our $ball = MyBall->new; sub move_ball { my ($step, $app, $t) = @_; @@ -231,18 +256,22 @@ so you can check and/or update it as necessary. } ); -Add a callback to the list to handle the rendering of objects. +Adds a callback to the end of the rendering handler list. You can add as many subs as you need. -All registered callbacks will be triggered in order, once per run of the L loop. +All registered callbacks will be triggered in order, once per cycle of the L loop. Returns the index of the added callback. The first argument passed is the time, in seconds, since the previous show. -The second is the app object. +This can be used to display a rough FPS value by dividing 1 by it. + +The second argument is the app object. + + our $ball = MyBall->new; sub show_ball { my ($delta, $app) = @_; - # the drawing below will only work if the app is an SDLx::App + # the drawing below works if the app is an SDLx::App # and not just a controller $app->draw_rect( [ $ball->x, $ball->y, $ball->size, $ball->size ], @@ -257,7 +286,9 @@ The second is the app object. =head2 show_handlers - my $handlers = $app->..._handlers; + my $event_handlers = $app->event_handlers; + my $move_handlers = $app->move_handlers; + my $show_handlers = $app->show_handlers; Returns the corresponding array ref so that you can directly modify the handler list. @@ -267,13 +298,17 @@ Returns the corresponding array ref so that you can directly modify the handler =head2 remove_show_handler - $app->remove_..._handler( $index ); - $app->remove_...handler( $callback ); + my $removed_handler = $app->remove_event_handler( $index ); + my $removed_handler = $app->remove_event_handler( $callback ); + my $removed_handler = $app->remove_move_handler( $index ); + my $removed_handler = $app->remove_move_handler( $callback ); + my $removed_handler = $app->remove_show_handler( $index ); + my $removed_handler = $app->remove_show_handler( $callback ); -Removes the handler with the given index from the respective calling queue. +Removes the handler with the given index from the respective handler list. You can also pass a coderef. -The first coderef in the handler list that this matches will be removed. +The first coderef in the handler list that matches this will be removed. Returns the removed handler. @@ -283,15 +318,49 @@ Returns the removed handler. =head2 remove_all_show_handlers - $app->remove_all_..._handlers(); + $app->remove_all_event_handlers(); + $app->remove_all_move_handlers(); + $app->remove_all_show_handlers(); -Removes all handlers from the respective calling queue. +Removes all handlers from the respective handler list. None of these will remove the app's L. =head2 remove_all_handlers $app->remove_all_handlers(); -Shortcut to remove all handlers at once. +Shortcut to remove all handlers at once. This will not remove the app's L. + +=head2 stop + + $app->stop; + +Tells the controller to end the run loop. This only has meaning when called from within a +handler of the run loop. The L loop will complete the current cycle +(handling events, moves and shows) and then return. This graceful way of ending the game loop +is preferred and it is the way the default L does it. + +Once the L loop has been stopped, it can be started again without problems. +This technique should be used to do operations that take a long time outside of the timing of the app. + + $app->run; + + do_something_that_takes_a_long_time(); + + $app->run; + +This code snippet could be used to play the first part of a game, then load the next part +and resume playing. When the first run loop is stopped the expensive operation will be executed. +Once that has completed the second run loop will resume the game, ignoring the time that passed outside the run loop. +If the expensive operation was performed from within the run loop, +upon completing the operation the move handlers would take into account all the time passed. + +=head2 stopped + + my $stopped = $app->stopped; + +Returns true if the run loop is stopped (before and after being in the run loop). +Also returns true when the run loop is about to stop. +That is, true when the app will complete the current run cycle before stopping. =head2 pause @@ -301,28 +370,37 @@ Shortcut to remove all handlers at once. # handle event ... return 1 if ... ; # unpause - return 0; # stay paused + return; # stay paused } ); -Attempts to pause the application with a call to C. +Pauses the application with a call to C. This only has meaning when called +from within a handler of the run loop. Events can then be used to +unpause the app. This is done outside the timing of the app with the same technique as explained in L. + +Takes 1 argument which is a callback. The application completes the current run loop then starts waiting +for the next event with L. This means that C can be called by any kind of handler +in the run loop. If L is called during the same run cycle, before or after calling C, +the app will just stop instead of pausing. -Takes 1 argument which is a callback. The application waits for the next event with C. -When one is recieved, it is passed to the callback as the first argument, along with the app object as the second argument. +When L receives an event, it is passed to the callback as the first argument. +Just like an event handler, the second argument passed is the app. If the callback then returns a true value, C will return. -If the callback returns a false value, C will repeat the process. +If the callback returns a false value, the app will stay paused and the process will be repeated. -Exit handling will work as it does in the app loop if L is true. -Otherwise, you will have to provide your own exit handling in the pause callback if you want to allow the app to be stopped while being paused. +If a L is defined, then each event will also be passed to that. This will allow the app to be stopped +while being paused. If the stop handler calls L then the app will unpause and then stop. +If your app doesn't have a stop handler then you'll have to handle stopping yourself in the pause callback. -This can be used to easily implement a pause when the app loses focus: +Below is an example of C used to implement a pause and unpause when the app loses and gain focus. +As a neat shortcut, the callback is recursively defined and used as both an event handler and the pause callback. sub window { - my ($e, $app) = @_; - if($e->type == SDL_ACTIVEEVENT) { - if($e->active_state & SDL_APPINPUTFOCUS) { - if($e->active_gain) { - return 1; + my ($event, $app) = @_; + if($event->type == SDL_ACTIVEEVENT) { + if($event->active_state & SDL_APPINPUTFOCUS) { + if($event->active_gain) { # gained focus + return 1; # unpause } else { $app->pause(\&window); @@ -331,27 +409,22 @@ This can be used to easily implement a pause when the app loses focus: } } } - return 0; + return; } - $app->add_event_handler(\&pause); - -Note: if you implement your own pause function, remember to update C to the current time when the application unpauses. -This should be done with L. -Otherwise, time will accumulate while the application is paused, and many movement steps will be called all at once when it unpauses. - -Note 2: a pause will be potentially dangerous to the C cycle (even if you implement your own) unless called by an C callback. + $app->add_event_handler(\&window); =head2 paused -Returns 1 if the app is paused, undef otherwise. -This is only useful when used within code that will be run by L: + my $paused = $app->paused; - sub toggle_pause { - # press P to toggle pause +Returns true if the run loop is currently paused. Also returns true when the run loop is about to pause. +That is, true when the app will complete the current run cycle before pausing. +This has dual purposes. Firstly, it is useful from within the paused callback as shown below. - my ($e, $app) = @_; - if($e->type == SDL_KEYDOWN) { - if($e->key_sym == SDLK_p) { + sub toggle_pause { # press P to toggle pause + my ($event, $app) = @_; + if($event->type == SDL_KEYDOWN) { + if($event->key_sym == SDLK_p) { # We're paused, so end pause return 1 if $app->paused; @@ -359,11 +432,14 @@ This is only useful when used within code that will be run by L: $app->pause(\&toggle_pause); } } - return 0; + return; } $app->add_event_handler(\&toggle_pause); -All the examples here are of recursive pause callbacks, but, of course, yours don't have to be. +Secondly, it is useful for handlers to tell if the app is about to pause. If L is called from within an event handler, +then the move and show handlers can check and respond to L in the remainder of the run cycle. +For example, a show handler could make the screen say PAUSED when L is true. This is preferred to having the +event handler display this, because L could be called in the meantime. =head2 dt @@ -375,15 +451,20 @@ All the examples here are of recursive pause callbacks, but, of course, yours do =head2 event -=head2 current_time - - my $param = $app->...; - $app->...($param); + my $dt = $app->dt; + my $min_t = $app->min_t; + my $delay = $app->delay; + my $stop_handler = $app->stop_handler; + my $event = $app->event; + $app->dt ($dt); + $app->min_t ($min_t); + $app->delay ($delay); + $app->stop_handler($stop_handler); + $app->event ($event); If an argument is passed, modifies the corresponding value to the argument. C
and C will keep their old value until the beginning of the next C cycle. -See L for details on what all of these params affect. -L mentions C in a note, other than there it shouldn't be touched. +See L for details on what these params do. Returns the corresponding value. @@ -392,10 +473,13 @@ Returns the corresponding value. my $time = $app->time; $app->time($time); -Returns the total time, in hi-res seconds, the app loop has been running. -Use this instead of L. -Although you shouldn't need to, you can supply a different time to reset it to counting from that value. -This will (probably) have no effect on the L loop. Change L if you want to have an effect. +Returns the sum of all the C
s that have been handled by all move handlers. In other words, the total amount of time +that has passed in the run loop. When the run loop is L and resumed, this value is not reset. +This should be a useful value to have, but isn't a replacement for L. +Use L instead of L. + +Specify a value to count from that time. This will have no effect on the run loop itself, but may be useful for +the code in your handlers. =head2 sleep @@ -413,3 +497,7 @@ See L. The idea and base for the L loop comes from Lazy Foo's L<< Frame Independent Movement|http://www.lazyfoo.net/SDL_tutorials/lesson32/index.php >> tutorial, and Glenn Fiedler's L<< Fix Your Timestep|http://gafferongames.com/game-physics/fix-your-timestep/ >> article on timing. + +=head1 SEE ALSO + +L, L, L diff --git a/t/sdlx_controller.t b/t/sdlx_controller.t index a0eb1d61..4de024e0 100644 --- a/t/sdlx_controller.t +++ b/t/sdlx_controller.t @@ -14,13 +14,13 @@ use SDL::TestTool; can_ok( 'SDLx::Controller', qw( - new run stop pause paused - dt min_t current_time delay time eoq exit_on_quit event + new run stop stopped pause paused + dt min_t delay event stop_handler default_stop_handler + time sleep add_move_handler add_event_handler add_show_handler + move_handlers event_handlers show_handlers remove_move_handler remove_event_handler remove_show_handler remove_all_move_handlers remove_all_event_handlers remove_all_show_handlers - move_handlers event_handlers show_handlers exit_on_quit_handler eoq_handler - time sleep ) ); @@ -40,23 +40,20 @@ is( scalar @{ $app->show_handlers }, 0, 'no show handlers by default' ); is( scalar @{ $app->event_handlers }, 0, 'no event handlers by default' ); isa_ok($app->event, 'SDL::Event', 'SDL::Event for controller created' ); is($app->time, 0, 'time started at 0' ); -ok( !$app->exit_on_quit, 'exit_on_quit is not set by default' ); -ok( !$app->eoq, 'eoq() is a method alias to exit_on_quit()' ); -is(ref $app->exit_on_quit_handler, 'CODE', 'default eoq handler set' ); -is($app->eoq_handler, \&SDLx::Controller::_default_exit_on_quit_handler, 'eoq_handler is an alias' ); -is($app->current_time, undef, 'current_time has not been set yet' ); +is($app->stop_handler, \&SDLx::Controller::default_stop_handler, 'stop_handler defaults to &default_stop_handler' ); +ok( $app->stopped, 'default stopped' ); +ok( !$app->paused, 'default not paused' ); # modifying with param methods -$app->exit_on_quit(1); -is( scalar @{ $app->event_handlers }, 0, 'exit_on_quit does not trigger event handlers' ); -ok( $app->exit_on_quit, 'exit_on_quit can be set dynamically' ); -ok( $app->eoq, 'eoq() follows exit_on_quit()' ); +$app->stop_handler(\&dummy_sub); +is( $app->stop_handler, \&dummy_sub, 'stop_handler changed with method' ); +is( scalar @{ $app->event_handlers }, 0, 'stop_handler does not trigger event handlers' ); $app->remove_all_event_handlers; -ok( $app->exit_on_quit, 'exit_on_quit is not an event handler' ); -ok( $app->eoq, 'eoq() still follows exit_on_quit()' ); -$app->eoq(0); -ok( !$app->eoq, 'eoq can be set dynamically' ); -ok( !$app->exit_on_quit, 'exit_on_quit() follows eoq()' ); +ok( $app->stop_handler, 'stop_handler is not an event handler' ); +$app->remove_all_handlers; +ok( $app->stop_handler, 'stop_handler is not removed by remove all handlers' ); +$app->stop_handler(undef); +is( $app->stop_handler, undef, 'stop_handler can be undefined' ); $app->dt(1337); is( $app->dt, 1337, 'dt can be changed with method' ); @@ -69,14 +66,22 @@ $app->event($event); is( $app->event, $event, 'event can be changed with method' ); $app->time(20.3); is( $app->time, 20.3, 'time can be changed with method' ); -$app->exit_on_quit_handler(\&dummy_sub); -is( $app->exit_on_quit_handler, \&dummy_sub, 'exit_on_quit_handler can be changed with method' ); -is( $app->eoq_handler, \&dummy_sub, 'eoq_handler is an alias' ); -$app->eoq_handler(\&dummy_sub2); -is( $app->exit_on_quit_handler, \&dummy_sub2, 'eoq_handler can be changed with method' ); -is( $app->eoq_handler, \&dummy_sub2, 'and it is an alias again' ); -$app->current_time(9.95); -is( $app->current_time, 9.95, 'current_time can be changed with method' ); + +# stop and pause +$app->stop; +ok( $app->stopped, 'stopped true when used stop' ); + +$app = SDLx::Controller->new; +$app->pause(\&dummy_sub); +ok( $app->paused, 'paused true when used pause' ); +is( $app->paused, \&dummy_sub, 'paused set to correct callback' ); +$app->pause(\&dummy_sub2); +is( $app->paused, \&dummy_sub2, 'paused set to correct callback again' ); +$app->stop; +ok( $app->stopped, 'stopped true when used stop after pause' ); +ok( !$app->paused, 'paused false when used stop after pause' ); +$app->pause(\&dummy_sub); +ok( !$app->paused, 'paused remains false when used after stop' ); my ($dummy_ref1, $dummy_ref2, $dummy_ref3) = ([], [sub {}, \&dummy_sub], [\&dummy_sub2, sub {}, sub {}]); @@ -89,9 +94,8 @@ $app = SDLx::Controller->new( move_handlers => $dummy_ref2, show_handlers => $dummy_ref3, delay => 0.262, - eoq => 1, time => 99, - eoq_handler => \&dummy_sub2, + stop_handler => \&dummy_sub2, ); isa_ok( $app, 'SDLx::Controller' ); @@ -102,9 +106,8 @@ is($app->event_handlers, $dummy_ref1, 'event_handlers set in constructor' ); is($app->move_handlers, $dummy_ref2, 'move_handlers set in constructor' ); is($app->show_handlers, $dummy_ref3, 'show_handlers set in constructor' ); is($app->delay, 0.262, 'delay set in constructor' ); -ok($app->eoq, 'eoq set in constructor' ); is($app->time, 99, 'time set in constructor' ); -is($app->eoq_handler, \&dummy_sub2, 'eoq_handler set in constructor' ); +is($app->stop_handler, \&dummy_sub2, 'stop_handler set in constructor' ); # and now the app for the next part of testing $app = SDLx::Controller->new( @@ -203,12 +206,7 @@ $app->run(); cmp_ok($move_inc, '>=', 30, 'called our motion handlers at least 30 times'); is($show_inc, 30, 'called our show handlers exactly 30 times'); - -#TODO testing: -#pause and paused -#current_time -#delay -#time -#sleep +ok( $app->stopped, 'stopped is true after the app is stopped' ); +ok( !$app->paused, 'paused is false. none of that' ); done_testing; From bcc61776342128b215d92332a2f057d3d528c772 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sun, 1 Apr 2012 01:57:43 +1030 Subject: [PATCH 044/153] SDLx::Controller Gotta rewrite a bit of test code --- t/sdlx_controller.t | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/t/sdlx_controller.t b/t/sdlx_controller.t index 4de024e0..113168c6 100644 --- a/t/sdlx_controller.t +++ b/t/sdlx_controller.t @@ -71,17 +71,17 @@ is( $app->time, 20.3, 'time can be changed with method' ); $app->stop; ok( $app->stopped, 'stopped true when used stop' ); -$app = SDLx::Controller->new; -$app->pause(\&dummy_sub); -ok( $app->paused, 'paused true when used pause' ); -is( $app->paused, \&dummy_sub, 'paused set to correct callback' ); -$app->pause(\&dummy_sub2); -is( $app->paused, \&dummy_sub2, 'paused set to correct callback again' ); -$app->stop; -ok( $app->stopped, 'stopped true when used stop after pause' ); -ok( !$app->paused, 'paused false when used stop after pause' ); -$app->pause(\&dummy_sub); -ok( !$app->paused, 'paused remains false when used after stop' ); +# $app = SDLx::Controller->new; +# $app->pause(\&dummy_sub); +# ok( $app->paused, 'paused true when used pause' ); +# is( $app->paused, \&dummy_sub, 'paused set to correct callback' ); +# $app->pause(\&dummy_sub2); +# is( $app->paused, \&dummy_sub2, 'paused set to correct callback again' ); +# $app->stop; +# ok( $app->stopped, 'stopped true when used stop after pause' ); +# ok( !$app->paused, 'paused false when used stop after pause' ); +# $app->pause(\&dummy_sub); +# ok( !$app->paused, 'paused remains false when used after stop' ); my ($dummy_ref1, $dummy_ref2, $dummy_ref3) = ([], [sub {}, \&dummy_sub], [\&dummy_sub2, sub {}, sub {}]); From 00479487bc029c0cb72fd5b9ea56bb640eeb51a4 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sun, 1 Apr 2012 11:36:59 +0930 Subject: [PATCH 045/153] Using branch experimentals version of this file. Mine was broken --- src/SDLx/Surface.xs | 319 ++++++++++++++++++-------------------------- 1 file changed, 133 insertions(+), 186 deletions(-) diff --git a/src/SDLx/Surface.xs b/src/SDLx/Surface.xs index e3efcbda..f3fdb017 100644 --- a/src/SDLx/Surface.xs +++ b/src/SDLx/Surface.xs @@ -18,217 +18,179 @@ SV * get_pixel32 (SDL_Surface *surface, int x, int y) { - - /*Convert the pixels to 32 bit */ - Uint32 *pixels = (Uint32 *)surface->pixels; - /*Get the requested pixel */ - - void* s = pixels + _calc_offset(surface, x, y); + /* Convert the pixels to 32 bit */ + Uint32 *pixels = (Uint32 *)surface->pixels; + /* Get the requested pixel */ - /*printf( " Pixel = %d, Ptr = %p \n", *((int*) s), s ); */ + void* s = pixels + _calc_offset(surface, x, y); - SV* sv = newSV_type(SVt_PV); - SvPV_set(sv, s); - SvPOK_on(sv); - SvLEN_set(sv, 0); - SvCUR_set(sv, surface->format->BytesPerPixel); - return newRV_noinc(sv); /*make a modifiable reference using u_ptr's place as the memory :) */ + /* printf( " Pixel = %d, Ptr = %p \n", *((int*) s), s ); */ + SV* sv = newSV_type(SVt_PV); + SvPV_set(sv, s); + SvPOK_on(sv); + SvLEN_set(sv, 0); + SvCUR_set(sv, surface->format->BytesPerPixel); + return newRV_noinc(sv); /* make a modifiable reference using u_ptr's place as the memory :) */ } - SV * construct_p_matrix ( SDL_Surface *surface ) { - /*return get_pixel32( surface, 0, 0); */ + /* return get_pixel32( surface, 0, 0); */ AV * matrix = newAV(); - int i, j; - i = 0; - for( i =0 ; i < surface->w; i++) - { - AV * matrix_row = newAV(); - for( j =0 ; j < surface->h; j++) - { - av_push(matrix_row, get_pixel32(surface, i,j) ); - } - av_push(matrix, newRV_noinc((SV *)matrix_row) ); - - } - - return newRV_noinc((SV *)matrix); + int i, j; + i = 0; + for( i =0 ; i < surface->w; i++ ) + { + AV * matrix_row = newAV(); + for( j =0 ; j < surface->h; j++ ) + av_push( matrix_row, get_pixel32(surface, i,j) ); + + av_push( matrix, newRV_noinc((SV *)matrix_row) ); + } + + return newRV_noinc((SV *)matrix); } - int _calc_offset ( SDL_Surface* surface, int x, int y ) -{ - int offset; - offset = (surface->pitch * y)/surface->format->BytesPerPixel; - offset += x; - return offset; +{ + int offset; + offset = (surface->pitch * y) / surface->format->BytesPerPixel; + offset += x; + return offset; } - unsigned int _get_pixel(SDL_Surface * surface, int offset) { - - unsigned int value; - switch(surface->format->BytesPerPixel) - { - case 1: value = ((Uint8 *)surface->pixels)[offset]; - break; - case 2: value = ((Uint16 *)surface->pixels)[offset]; - break; - case 3: value = ((Uint32)((Uint8 *)surface->pixels)[offset * surface->format->BytesPerPixel] << 0) - + ((Uint32)((Uint8 *)surface->pixels)[offset * surface->format->BytesPerPixel + 1] << 8) - + ((Uint32)((Uint8 *)surface->pixels)[offset * surface->format->BytesPerPixel + 2] << 16); - break; - case 4: value = ((Uint32 *)surface->pixels)[offset]; - break; - - } - return value; + unsigned int value; + switch(surface->format->BytesPerPixel) + { + case 1: value = ((Uint8 *)surface->pixels)[offset]; + break; + case 2: value = ((Uint16 *)surface->pixels)[offset]; + break; + case 3: value = ((Uint32)((Uint8 *)surface->pixels)[offset * surface->format->BytesPerPixel] << 0) + + ((Uint32)((Uint8 *)surface->pixels)[offset * surface->format->BytesPerPixel + 1] << 8) + + ((Uint32)((Uint8 *)surface->pixels)[offset * surface->format->BytesPerPixel + 2] << 16); + break; + case 4: value = ((Uint32 *)surface->pixels)[offset]; + break; + } + return value; } - MODULE = SDLx::Surface PACKAGE = SDLx::Surface PREFIX = surfacex_ SV * surfacex_pixel_array ( surface ) - SDL_Surface *surface - CODE: - switch(surface->format->BytesPerPixel) - { - case 1: croak("Not implemented yet for 8bpp surfaces\n"); - break; - case 2: croak("Not implemented yet for 16bpp surfaces\n"); - break; - case 3: croak("Not implemented yet for 24bpp surfaces\n"); - break; - case 4: - RETVAL = construct_p_matrix (surface); - break; - - } - - - OUTPUT: - RETVAL + SDL_Surface *surface + CODE: + switch(surface->format->BytesPerPixel) + { + case 1: croak("Not implemented yet for 8bpp surfaces\n"); + break; + case 2: croak("Not implemented yet for 16bpp surfaces\n"); + break; + case 3: croak("Not implemented yet for 24bpp surfaces\n"); + break; + case 4: + RETVAL = construct_p_matrix (surface); + break; + } + OUTPUT: + RETVAL unsigned int surfacex_get_pixel_xs ( surface, x, y ) - SDL_Surface *surface - int x - int y - CODE: - if( x < 0 ) - x = 0; - else if ( x > surface->w) - x = surface->w; - - if ( y < 0 ) - y = 0; - else if ( y > surface->h) - y = surface->h; - - int offset; - offset = _calc_offset( surface, x, y); - RETVAL = _get_pixel( surface, offset ); - - OUTPUT: - RETVAL + SDL_Surface *surface + int x + int y + CODE: + _int_range( &x, 0, surface->w ); + _int_range( &y, 0, surface->h ); + int offset; + offset = _calc_offset( surface, x, y); + RETVAL = _get_pixel( surface, offset ); + OUTPUT: + RETVAL void surfacex_set_pixel_xs ( surface, x, y, value ) - SDL_Surface *surface - int x - int y - unsigned int value - CODE: - if( x < 0 ) - x = 0; - else if ( x > surface->w) - x = surface->w; - - if ( y < 0 ) - y = 0; - else if ( y > surface->h) - y = surface->h; - - int offset; - offset = _calc_offset( surface, x, y); - if(SDL_MUSTLOCK(surface)) - if ( SDL_LockSurface(surface) < 0) - croak( "Locking surface in set_pixels failed: %s", SDL_GetError() ); - switch(surface->format->BytesPerPixel) - { - case 1: ((Uint8 *)surface->pixels)[offset] = (Uint8)value; - break; - case 2: ((Uint16 *)surface->pixels)[offset] = (Uint16)value; - break; - case 3: ((Uint8 *)surface->pixels)[offset * surface->format->BytesPerPixel] = (Uint8)( value & 0xFF); - ((Uint8 *)surface->pixels)[offset * surface->format->BytesPerPixel + 1] = (Uint8)((value << 8) & 0xFF); - ((Uint8 *)surface->pixels)[offset * surface->format->BytesPerPixel + 2] = (Uint8)((value << 16) & 0xFF); - break; - case 4: ((Uint32 *)surface->pixels)[offset] = (Uint32)value; - break; - } - if(SDL_MUSTLOCK(surface)) - SDL_UnlockSurface(surface); - + SDL_Surface *surface + int x + int y + unsigned int value + CODE: + _int_range( &x, 0, surface->w ); + _int_range( &y, 0, surface->h ); + int offset; + offset = _calc_offset( surface, x, y); + if(SDL_MUSTLOCK(surface) && SDL_LockSurface(surface) < 0) + croak( "Locking surface in set_pixels failed: %s", SDL_GetError() ); + switch(surface->format->BytesPerPixel) + { + case 1: ((Uint8 *)surface->pixels)[offset] = (Uint8)value; + break; + case 2: ((Uint16 *)surface->pixels)[offset] = (Uint16)value; + break; + case 3: ((Uint8 *)surface->pixels)[offset * surface->format->BytesPerPixel] = (Uint8)( value & 0xFF); + ((Uint8 *)surface->pixels)[offset * surface->format->BytesPerPixel + 1] = (Uint8)((value << 8) & 0xFF); + ((Uint8 *)surface->pixels)[offset * surface->format->BytesPerPixel + 2] = (Uint8)((value << 16) & 0xFF); + break; + case 4: ((Uint32 *)surface->pixels)[offset] = (Uint32)value; + break; + } + if(SDL_MUSTLOCK(surface)) + SDL_UnlockSurface(surface); void surfacex_draw_rect ( surface, rt, color ) - SDL_Surface *surface - SV* rt - SV* color - CODE: - Uint32 m_color = __map_rgba( color, surface->format ); - SDL_Rect r_rect; + SDL_Surface *surface + SV* rt + SV* color + CODE: + Uint32 m_color = __map_rgba( color, surface->format ); + SDL_Rect r_rect; - if( SvOK(rt) ) - { - int newly_created_rect = 0; - SV* foo = rect( rt, &newly_created_rect ); - r_rect = *(SDL_Rect*)bag2obj(foo); - SDL_FillRect(surface, &r_rect, m_color); - SvREFCNT_dec(foo); - } - else - { - r_rect.x = 0; r_rect.y = 0; r_rect.w = surface->w; r_rect.h = surface->h; - SDL_FillRect(surface, &r_rect, m_color); - } + if( SvOK(rt) ) + r_rect = *(SDL_Rect*)bag2obj( create_mortal_rect( rt ) ); + else + { + r_rect.x = 0; r_rect.y = 0; r_rect.w = surface->w; r_rect.h = surface->h; + } + SDL_FillRect(surface, &r_rect, m_color); #ifdef HAVE_SDL_GFX_PRIMITIVES -int -surfacex_draw_polygon(surface, vectors, color, antialias) - SDL_Surface * surface +SV * +surfacex_draw_polygon ( surface, vectors, color, ... ) + SV* surface AV* vectors Uint32 color - SV *antialias CODE: - AV* vx = newAV(); - AV* vy = newAV(); - int n; - for(n = 0; n <= av_len(vectors); n++) + SDL_Surface * _surface = (SDL_Surface *)bag2obj(surface); + AV* vx = newAV(); + AV* vy = newAV(); + AV* vertex; + while(av_len(vectors) >= 0) { - if(n & 1) - av_store(vy, (int)((n-1)/2), *av_fetch(vectors, n, 0)); - else - av_store(vx, (int)(n/2), *av_fetch(vectors, n, 0)); + vertex = (AV*)SvRV(av_shift(vectors)); + av_push(vx, av_shift(vertex)); + av_push(vy, av_shift(vertex)); } - n = av_len(vx) + 1; - + int n = av_len(vx) + 1; Sint16 * _vx = av_to_sint16(vx); Sint16 * _vy = av_to_sint16(vy); - RETVAL = SvOK(antialias) - ? aapolygonColor(surface, _vx, _vy, n, color) - : polygonColor(surface, _vx, _vy, n, color); + if ( items > 3 && SvTRUE( ST(3) ) ) + aapolygonColor( _surface, _vx, _vy, n, color ); + else + polygonColor( _surface, _vx, _vy, n, color ); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); + RETVAL = SvREFCNT_inc(surface); // why SvREFCNT_inc? OUTPUT: RETVAL @@ -239,22 +201,17 @@ surfacex_blit( src, dest, ... ) SV *src SV *dest CODE: - src = surface(src); - dest = surface(dest); + assert_surface(src); + assert_surface(dest); + /* just return the pointer stored in the bag */ SDL_Surface *_src = (SDL_Surface *)bag2obj(src); SDL_Surface *_dest = (SDL_Surface *)bag2obj(dest); SDL_Rect _src_rect; SDL_Rect _dest_rect; - int newly_created_rect = 0; - SV* s_rect_sv, *d_rect_sv; - int mall_sr = 0; int mall_dr = 0; + if( items > 2 && SvOK(ST(2)) ) - { - s_rect_sv = rect(ST(2), &newly_created_rect); - _src_rect = *(SDL_Rect *)bag2obj( s_rect_sv ); - mall_sr = 1; - } + _src_rect = *(SDL_Rect *)bag2obj( create_mortal_rect( ST(2) ) ); else { _src_rect.x = 0; @@ -264,11 +221,7 @@ surfacex_blit( src, dest, ... ) } if( items > 3 && SvOK(ST(3)) ) - { - d_rect_sv = rect(ST(3), &newly_created_rect); - _dest_rect = *(SDL_Rect *)bag2obj( d_rect_sv ); - mall_dr = 1; - } + _dest_rect = *(SDL_Rect *)bag2obj( create_mortal_rect( ST(3) ) ); else { _dest_rect.x = 0; @@ -278,9 +231,3 @@ surfacex_blit( src, dest, ... ) } SDL_BlitSurface( _src, &_src_rect, _dest, &_dest_rect ); - if ( mall_sr == 1 ) - SvREFCNT_dec( s_rect_sv); - if ( mall_dr == 1 ) - SvREFCNT_dec( d_rect_sv ); - - From 571403c14cdeffbb97d1532a7f8da34b72ef62c3 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sun, 1 Apr 2012 11:38:23 +0930 Subject: [PATCH 046/153] Fixes to App, Controller and their docs. Wrote entry for Deprecated --- lib/SDLx/App.pm | 11 +---------- lib/SDLx/Controller.pm | 2 +- lib/pods/SDL/Deprecated.pod | 25 +++++++++++++++++++++++++ lib/pods/SDLx/App.pod | 2 +- lib/pods/SDLx/Controller.pod | 3 ++- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 6419615c..c58c8ec5 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -56,7 +56,7 @@ sub new { my $af = $o{any_format}; my $hwp = $o{hardware_palette} || $o{hw_palette}; my $db = $o{double_buffer} || $o{double_buf} || $o{dbl_buf}; - my $fs = $o{full_screen} || $o{fullscreen}; + my $fs = $o{full_screen} || $o{fullscreen} || $o{full}; my $gl = $o{open_gl} || $o{opengl} || $o{gl}; my $rs = $o{resizable} || $o{resizeable}; # it's a hard word to spell :-) my $nf = $o{no_frame}; @@ -353,13 +353,4 @@ sub gl_attribute { $returns->[1]; } -# this has been moved to SDLx::Controller in the form of time and sleep -# this can be removed at any time we wanna break compat -sub delay { - SDL::delay( $_[1] ); -} -sub ticks { - SDL::get_ticks; -} - 1; diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 41806c60..d05dcad7 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -45,7 +45,7 @@ sub new { $_delay{ $ref } = (defined $args{delay} && $args{delay} >= 1 ? $args{delay} / 1000 : $args{delay}) || 0; #phasing out ticks, but still accepting them. Remove whenever we break compat # $_paused{ $ref } = undef; $_time{ $ref } = $args{time} || 0; - $_stop_handler{ $ref } = $args{stop_handler} || \&default_stop_handler; + $_stop_handler{ $ref } = exists $args{stop_handler} ? $args{stop_handler} : \&default_stop_handler; return $self; } diff --git a/lib/pods/SDL/Deprecated.pod b/lib/pods/SDL/Deprecated.pod index 154f4bf1..16ed07d4 100644 --- a/lib/pods/SDL/Deprecated.pod +++ b/lib/pods/SDL/Deprecated.pod @@ -11,6 +11,31 @@ Core =head1 RELEASES +=head2 2.xxx + +SDLx::App had a full rewrite and SDLx::Controller was updated. + +=over + +=item SDLx::App + +Shortcut aliases in the constructor have been changed and removed. The main ones people use are still there like +C, C and C. These lesser used ones no longer work: C, C, C, C, C, C, C, C, C. + +All OpenGL parameters for the constructor now have a C prefix. These were never documented anyway, +so they're not listed here. + +The OpenGL method C is now called C. + +C and C have been removed and replaced with SDLx::Controller's C
and C will keep their old value until the beginning of the next C cycle. +If an argument is passed, modifies the corresponding parameter to the argument. +For each of these parameters the L loop will give the handlers its old value until the start of the next cycle. +The L callback, however, will always receive the new value. See L for details on what these params do. Returns the corresponding value. diff --git a/t/sdlx_controller.t b/t/sdlx_controller.t index 372cbcce..c73d826c 100644 --- a/t/sdlx_controller.t +++ b/t/sdlx_controller.t @@ -6,11 +6,18 @@ use SDL::Config; use SDL::Video; use SDL::Color; use SDL::Event; +use SDL::Events; use SDLx::Controller; use Scalar::Util 'refaddr'; use lib 't/lib'; use SDL::TestTool; +# we need video for events to work +$ENV{SDL_VIDEODRIVER} = 'dummy' unless $ENV{SDL_RELEASE_TESTING}; +if ( !SDL::TestTool->init(SDL_INIT_VIDEO) or !SDL::Video::set_video_mode( 640, 480, 32, SDL_SWSURFACE ) ) { + plan( skip_all => 'Failed to init video' ); +} + can_ok( 'SDLx::Controller', qw( @@ -69,19 +76,237 @@ is( $app->time, 20.3, 'time can be changed with method' ); # stop and pause $app->stop; -ok( $app->stopped, 'stopped true when used stop' ); - -# $app = SDLx::Controller->new; -# $app->pause(\&dummy_sub); -# ok( $app->paused, 'paused true when used pause' ); -# is( $app->paused, \&dummy_sub, 'paused set to correct callback' ); -# $app->pause(\&dummy_sub2); -# is( $app->paused, \&dummy_sub2, 'paused set to correct callback again' ); -# $app->stop; -# ok( $app->stopped, 'stopped true when used stop after pause' ); -# ok( !$app->paused, 'paused false when used stop after pause' ); -# $app->pause(\&dummy_sub); -# ok( !$app->paused, 'paused remains false when used after stop' ); +ok( $app->stopped, 'stopped still true when used stop' ); +{ + my $pass_event; + my $pass_app; + my $pass_paused_within; + my $pass_not_stopped_within; + my $pass_not_paused_before; + my $pass_not_stopped_before; + my $pass_paused_in_cycle; + my $pass_stopped_in_cycle; + + my $pause_test; + $pause_test = sub { + my ($event, $caller) = @_; + $pass_event++ if $event->type == SDL_KEYUP; + $pass_app++ if $caller == $app; + $pass_paused_within++ if $app->paused == $pause_test; + $pass_not_stopped_within++ unless $app->stopped; + + $app->stop if $event->type == SDL_QUIT; + return; + }; + + $app = SDLx::Controller->new( + stop_handler => undef, + show_handlers => [ + sub { + $pass_not_paused_before++ unless $app->paused; + $pass_not_stopped_before++ unless $app->stopped; + }, + sub { + $pass_not_paused_before++ unless $app->paused; + $pass_not_stopped_before++ unless $app->stopped; + + my $event = SDL::Event->new; + $event->type(SDL_KEYUP); + my $quit_event = SDL::Event->new; + $quit_event->type(SDL_QUIT); + SDL::Events::push_event($event); + SDL::Events::push_event($event); + SDL::Events::push_event($quit_event); + + $app->pause(\&dummy_sub); + $app->pause($pause_test); + $pass_paused_in_cycle++ if $app->paused == $pause_test; + $pass_stopped_in_cycle++ if $app->stopped; + }, + sub { + $pass_paused_in_cycle++ if $app->paused == $pause_test; + $pass_stopped_in_cycle++ if $app->stopped; + }, + ], + ); + $app->run; + + ok( $app->stopped, 'stopped true after being paused' ); + ok( !$app->paused, 'paused not true after stopped' ); + is( $pass_event, 2, 'pause gets the right event' ); + is( $pass_app, 3, 'pause gets the app' ); + is( $pass_paused_within, 3, 'paused returns callback within callback' ); + is( $pass_not_stopped_within, 3, 'stopped return false within callback' ); + is( $pass_not_paused_before, 2, 'paused returns false before being paused' ); + is( $pass_not_stopped_before, 2, 'stopped returns false before being paused' ); + is( $pass_paused_in_cycle, 2, 'pause returns callback in remaining cycle' ); + is( $pass_stopped_in_cycle, 2, 'stopped returns true in remaining cycle' ); +} + +# callback returning 1 ending pause +{ + my $in_callback; + + $app = SDLx::Controller->new( + show_handlers => [sub { + $app->stop if $in_callback; + + my $event = SDL::Event->new; + my $other_event = SDL::Event->new; + $other_event->type(SDL_MOUSEBUTTONDOWN); + SDL::Events::push_event($event); + SDL::Events::push_event($event); + SDL::Events::push_event($other_event); + + $app->pause(sub { + my ($event) = @_; + $in_callback++; + return 1 if $event->type == SDL_MOUSEBUTTONDOWN; + return; + }); + }], + ); + $app->run; + + ok( $app->stopped, 'stopped true after being paused' ); + ok( !$app->paused, 'paused not true after stopped' ); + is( $in_callback, 3, 'callback called exactly three times' ); +} + +# stop handler ending pause +{ + my $in_callback; + + $app = SDLx::Controller->new( + show_handlers => [sub { + my $event = SDL::Event->new; + my $quit_event = SDL::Event->new; + $quit_event->type(SDL_QUIT); + SDL::Events::push_event($event); + SDL::Events::push_event($event); + SDL::Events::push_event($quit_event); + + $app->pause(sub { + $in_callback++; + return; + }); + }], + ); + $app->run; + + ok( $app->stopped, 'stopped true after being paused' ); + ok( !$app->paused, 'paused not true after stopped' ); + is( $in_callback, 2, 'callback only called twice' ); +} + +# stop overriding pause +{ + my $didnt_override; + + $app = SDLx::Controller->new( + show_handlers => [sub { + $app->stop; + + my $event = SDL::Event->new; + SDL::Events::push_event($event); + + $app->pause(sub { + $didnt_override = 1; + return 1; + }); + }], + ); + $app->run; + + ok( $app->stopped, 'stopped true after run' ); + ok( !$app->paused, 'paused never happened' ); + ok( !$didnt_override, 'pause overrided by stop' ); +} +{ + my $didnt_override; + + $app = SDLx::Controller->new( + show_handlers => [sub { + my $event = SDL::Event->new; + SDL::Events::push_event($event); + + $app->pause(sub { + $didnt_override = 1; + return 1; + }); + + $app->stop; + }], + ); + $app->run; + + SDL::Events::poll_event( $app->event ); # remove unused event + ok( !$didnt_override, 'pause overrided by stop' ); +} + +# stop and event handlers +{ + my $fail_event_before_show; + my $pass_stop_handler_event; + my $pass_stop_handler_app; + my $pass_event_handler_event; + my $pass_event_handler_app; + my $pass_stopped; + my $fail_stopped; + my $in_show_handler; + + $app = SDLx::Controller->new( + stop_handler => sub { + my ($event, $caller) = @_; + $fail_event_before_show++ unless $in_show_handler; + $pass_stop_handler_event++ if $event->type == SDL_KEYDOWN; + $pass_stop_handler_app++ if $caller == $app; + $fail_stopped++ if $app->stopped; + }, + event_handlers => [ + sub { + $fail_stopped++ if $app->stopped; + }, + sub { + my ($event, $caller) = @_; + $fail_event_before_show++ unless $in_show_handler; + $pass_event_handler_event++ if $event->type == SDL_KEYDOWN; + $pass_event_handler_app++ if $caller == $app; + $app->stop if $event->type == SDL_MOUSEBUTTONUP; + }, + sub { + $pass_stopped++ if $app->stopped; + }, + ], + show_handlers => [sub { + if($app->stopped) { + $pass_stopped++; + return; + } + + $in_show_handler++; + + my $event = SDL::Event->new; + $event->type(SDL_KEYDOWN); + my $other_event = SDL::Event->new; + $other_event->type(SDL_MOUSEBUTTONUP); + SDL::Events::push_event($event); + SDL::Events::push_event($event); + SDL::Events::push_event($other_event); + }], + ); + $app->run; + + ok( $app->stopped, 'stopped true after run' ); + ok( !$fail_event_before_show, 'event handlers not called before show' ); + is( $pass_stop_handler_event, 2, 'stop handler got correct event' ); + is( $pass_stop_handler_app, 3, 'stop handler got app' ); + is( $pass_event_handler_event, 2, 'event handler got correct event' ); + is( $pass_event_handler_app, 3, 'event handler got app' ); + is( $pass_stopped, 2, 'stopped true within cycle' ); + ok( !$fail_stopped, 'stopped not true before stopped' ); + is( $in_show_handler, 1, 'got into the show handler once' ); +} my ($dummy_ref1, $dummy_ref2, $dummy_ref3) = ([], [sub {}, \&dummy_sub], [\&dummy_sub2, sub {}, sub {}]); @@ -118,14 +343,7 @@ $app = SDLx::Controller->new( sub dummy_sub {1} sub dummy_sub2 {1} -my @kinds = qw(move show); - -# SDL events need a video surface to work -my $videodriver = $ENV{SDL_VIDEODRIVER}; -$ENV{SDL_VIDEODRIVER} = 'dummy' unless $ENV{SDL_RELEASE_TESTING}; -push @kinds, 'event' - if SDL::TestTool->init(SDL_INIT_VIDEO) - and SDL::Video::set_video_mode( 640, 480, 32, SDL_SWSURFACE ); +my @kinds = qw(move show event); foreach my $kind (@kinds) { my $method = "add_${kind}_handler"; From f62c0e26582b151b755a4d26e025d897e5d43ea2 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Fri, 6 Apr 2012 11:48:37 +0930 Subject: [PATCH 049/153] Proofread Controller docs and spellchecked app docs --- lib/pods/SDLx/App.pod | 6 ++-- lib/pods/SDLx/Controller.pod | 69 ++++++++++++++++++++---------------- 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index bc7fb126..22b528b4 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -322,7 +322,7 @@ descriptions of what each flag does. Returns the width, height and depth of the user's screen using L. This can be called before or after calling L. -Initializing the video subsytem will be handled correctly no matter what thanks to +Initializing the video subsystem will be handled correctly no matter what thanks to L. =head2 set_video_mode @@ -371,7 +371,7 @@ icon title the same, or a string to modify them. Sets the window's icon. This must be called before creating the display surface, so SDL::Image can not be used. -If a filename is specified, it is loaded withL. +If a filename is specified, it is loaded with L. Otherwise, the first argument should be a surface. Win32 icons must be 32x32. The C<$color> argument is optional and, if specified, is used to set the icon's color key (transparent pixel). It should be an RGB color as either a number or array ref. @@ -417,6 +417,8 @@ if it is true or off otherwise. =head2 sync + $app->sync(); + Swaps the OpenGL buffers and does a full update of the screen with L if OpenGL is being used. This is preferable to swapping the SDL buffers. diff --git a/lib/pods/SDLx/Controller.pod b/lib/pods/SDLx/Controller.pod index d89fb755..fad9b9cb 100644 --- a/lib/pods/SDLx/Controller.pod +++ b/lib/pods/SDLx/Controller.pod @@ -36,12 +36,12 @@ the program. This usually goes in the form of: ... } -The problem most developers face, besides the repetitive work, is to ensure +The problem most developers face, besides the repetitive work, is ensuring that the screen update is independent of the frame rate. Otherwise, your game will -run at different speeds on different machines and this is never good (old +run at different speeds on different machines, which is never a good thing (old MS-DOS games, anyone?). -One way to circumveint this is by capping the frame rate so it's the same no +One way to circumvent this is by capping the frame rate so it's the same no matter what, but this is not the right way to do it as it penalizes better hardware. @@ -94,14 +94,14 @@ This is useful to add slo-mo and fast-forward features to the game. All you woul The minimum time, in seconds, that has to accumulate before any move or show handlers are called. Defaults to 1 / 60. A C of 1 / 60 ensures that the controller can update the screen at a maximum of 60 times per second. -A "V-Sync" such as this is necessary to prevent video "tear", which occurs when the app is updating faster than the monitor can display. -Setting it to 0, as seen above, will not delay the loop at all. +A "V-Sync" such as this is necessary to prevent video "tear", which occurs when the app is updating faster than the monitor +can display. Setting it to 0, as seen above, will not delay the loop at all. =item delay The time, in seconds or milliseconds, to delay after every full L loop. Defaults to 0. If you specify a number greater than or equal to 1, it will be treated as milliseconds instead of seconds. -B Picking a good delay based on the needs of your game can greatly reduce CPU load. +B Picking an appropriate delay based on the needs of your game can greatly reduce CPU load. =item event_handlers @@ -117,17 +117,17 @@ See below for a full explanation of the L loop and handlers. =item stop_handler An extra, but separate, event callback to handle all L of the app. -It is the same in almost every aspect to an event handler (see L): same recieved arguments, +It is the same in almost every aspect to an event handler (see L): same received arguments, called in the same place. One difference is that it is called in L so that the app can be stopped while paused. -Another difference is that it should always apply to the app; while you add, remove and clear handlers -it wont be touched. This is good, because you'd (probably) always want your app to able to be stopped. +Another difference is that it should always apply to the app; while you add, remove and clear handlers, +it won't be touched. This is good, because you'd (probably) always want your app to able to be stopped. Because of this, it's a good idea to use the stop handler regardless of whether you will be using L. Defaults to C<\&SDLx::Controller::default_stop_handler>: a callback that L the event loop on an C event. Specify a code ref to use a different callback to handle stopping, or a false value to not use a stop handler. -If you want to provide your own stop handler you should give it the code of the default stop handler: +If you want to provide your own stop handler, you should give it the code of the default stop handler: my ($event, $self) = @_; $self->stop() if $event->type == SDL_QUIT; @@ -142,7 +142,7 @@ Defaults to C<< SDL::Event->new() >>. =item time The time, in seconds, that you want the L loop to say it has been going for. -This has no affect on the run loop. All it will do is alter what L returns. See L. +This has no effect on the run loop. All it will do is alter what L returns. See L. Defaults to 0. You'll seldom have to set this param. =back @@ -167,7 +167,7 @@ All added handlers will be called during the run loop, in this order: =back Please refer to each handler below for full information on what they do. -Note that the second argument every callback recieves is the app object. +Note that the second argument every callback receives is the app object. =head2 add_event_handler @@ -180,14 +180,15 @@ Note that the second argument every callback recieves is the app object. Adds a callback to the end of the event handler list. You can add as many subs as you need. -For each SDL::Event from the user, all registered callbacks will be called in order and supplied with it. +For each L from the user, all registered callbacks will be called in order and supplied with it. Returns the index of the added callback. -More specifically: events from the user will, one by one, be polled into the app's L object. +More specifically: events from the user will, one by one, be L into the app's L object. This event will then be passed to all of the registered callbacks as the first argument. The second argument is the app. -Below is an example of an event handler that sets a variable true when the left mouse button is down and false otherwise. +Below is an example of an event handler that sets a variable to true when the left mouse button is pressed, +and back to false when it is lifted. our $click = 0; @@ -195,15 +196,19 @@ Below is an example of an event handler that sets a variable true when the left my ($event, $app) = @_; my $state = $event->type == SDL_MOUSEBUTTONDOWN ? 1 : - $event->type == SDL_MOUSEBUTTONUP ? 0 : - return + $event->type == SDL_MOUSEBUTTONUP ? 0 : undef ; + return unless defined $state; # not a mouse click + if($event->button_button == SDL_BUTTON_LEFT) { $click = $state; } } $app->add_event_handler(\&on_click); +For full details on the event object passed to the event handlers, see L. +For other event related functions and a full list of the event constants, see L. + =head2 add_move_handler my $index = $app->add_move_handler( @@ -224,7 +229,7 @@ Returns the index of the added callback. The first argument passed to the callbacks is the fraction of C
time that the move callback should handle. This will be 1 for a full step and less than 1 for a partial step. -Inversely, the time that the each move callback should handle is equal to the step argument multiplied by the C
. +Inversely, the time that each move callback should handle is equal to the step argument multiplied by the C
. All movement values should be multiplied by the step value. It is possible for the argument to be 0 if no time has passed since the last cycle. @@ -273,9 +278,9 @@ The second argument is the app object. # the drawing below works if the app is an SDLx::App # and not just a controller - $app->draw_rect( - [ $ball->x, $ball->y, $ball->size, $ball->size ], - $ball->colour + $app->draw_circle_filled( + [ $ball->x, $ball->y ], $ball->radius, + $ball->color ); } $app->add_show_handler(\&show_ball); @@ -349,8 +354,8 @@ This technique should be used to do operations that take a long time outside of $app->run; This code snippet could be used to play the first part of a game, then load the next part -and resume playing. When the first run loop is stopped the expensive operation will be executed. -Once that has completed the second run loop will resume the game, ignoring the time that passed outside the run loop. +and resume playing. When the first run loop is stopped, the expensive operation will be executed. +Once that has completed, the second run loop will resume the game, ignoring the time that passed outside the run loop. If the expensive operation was performed from within the run loop, upon completing the operation the move handlers would take into account all the time passed. @@ -378,7 +383,7 @@ Pauses the application with a call to C. -Takes 1 argument which is a callback. The application completes the current run loop then starts waiting +Takes one argument, which is a callback. The application completes the current run loop, then starts waiting for the next event with L. This means that C can be called by any kind of handler in the run loop. If L is called during the same run cycle, before or after calling C, the app will just stop instead of pausing. @@ -389,11 +394,11 @@ If the callback then returns a true value, C will return. If the callback returns a false value, the app will stay paused and the process will be repeated. If a L is defined, then each event will also be passed to that. This will allow the app to be stopped -while being paused. If the stop handler calls L then the app will unpause and then stop. -If your app doesn't have a stop handler then you'll have to handle stopping yourself in the pause callback. +while being paused. If the stop handler calls L, then the app will unpause and then stop. +If your app doesn't have a stop handler, then you'll have to handle stopping yourself in the pause callback. The app will also unpause if the callback calls L, regardless of whether the callback then returns true or false. -Below is an example of C used to implement a pause and unpause when the app loses and gain focus. +Below is an example of C used to implement a pause and unpause when the app loses and gains focus. As a neat shortcut, the callback is recursively defined and used as both an event handler and the pause callback. sub window { @@ -420,7 +425,9 @@ As a neat shortcut, the callback is recursively defined and used as both an even Returns true if the run loop is currently paused. Also returns true when the run loop is about to pause. That is, true when the app will complete the current run cycle before pausing. -This has dual purposes. Firstly, it is useful from within the paused callback as shown below. + +Both of these cases can be useful for handling pausing. Being able to tell if the app is currently paused is useful +from within the L callback: sub toggle_pause { # press P to toggle pause my ($event, $app) = @_; @@ -437,8 +444,8 @@ This has dual purposes. Firstly, it is useful from within the paused callback as } $app->add_event_handler(\&toggle_pause); -Secondly, it is useful for handlers to tell if the app is about to pause. If L is called from within an event handler, -then the move and show handlers can check and respond to L in the remainder of the run cycle. +Knowing if the app is about to pause is useful from within the app's handlers. If L is called from within +an event handler, then the move and show handlers can check and respond to L in the remainder of the run cycle. In this time, both C and L will return true. When the app is actually paused, only C will return true. This true value is actually the callback you passed with L, and can be checked to tell between different pauses. For example, a show handler could make the screen say PAUSED when L is true. This is preferred to having the @@ -496,7 +503,7 @@ Use this instead of L. See L. -=head2 ACKNOWLEGDEMENTS +=head2 ACKNOWLEDGEMENTS The idea and base for the L loop comes from Lazy Foo's L<< Frame Independent Movement|http://www.lazyfoo.net/SDL_tutorials/lesson32/index.php >> tutorial, From a6e30b0f12979f3dd997baeddbbb51e39b2f4143 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Fri, 6 Apr 2012 12:15:50 +0930 Subject: [PATCH 050/153] Added code for max_t and couldn't resist a bit of cleanup --- lib/SDLx/Controller.pm | 16 ++++++++++------ lib/pods/SDLx/Controller.pod | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 627da6ad..7673a246 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -14,6 +14,7 @@ use Scalar::Util 'refaddr'; # inside out, so this can work as the superclass of another class my %_dt; my %_min_t; +my %_max_t; my %_stop; my %_event; my %_event_handlers; @@ -37,6 +38,7 @@ sub new { $_dt{ $ref } = defined $args{dt} ? $args{dt} : 0.1; $_min_t{ $ref } = defined $args{min_t} ? $args{min_t} : 1 / 60; + $_max_t{ $ref } = defined $args{max_t} ? $args{max_t} : 0.5; $_stop{ $ref } = 1; $_event{ $ref } = $args{event} || SDL::Event->new(); $_event_handlers{ $ref } = $args{event_handlers} || []; @@ -56,6 +58,7 @@ sub DESTROY { delete $_dt{ $ref}; delete $_min_t{ $ref}; + delete $_max_t{ $ref }; delete $_stop{ $ref}; delete $_event{ $ref}; delete $_event_handlers{ $ref}; @@ -71,7 +74,6 @@ sub run { my ($self) = @_; my $ref = refaddr $self; my $dt = $_dt{ $ref }; - my $min_t = $_min_t{ $ref }; my $delay = $_delay{ $ref }; # these should never change @@ -84,16 +86,17 @@ sub run { delete $_paused{ $ref }; my $current_time = Time::HiRes::time; - Time::HiRes::sleep( $_delay{ $ref } ) if $_delay{ $ref }; + Time::HiRes::sleep( $delay ) if $delay; while ( !$_stop{ $ref } ) { my $new_time = Time::HiRes::time; my $delta_time = $new_time - $current_time; - if($delta_time < $min_t) { + if( $delta_time < $_min_t{ $ref } ) { Time::HiRes::sleep(0.001); # sleep at least a millisecond redo; } $current_time = $new_time; + $delta_time = $_max_t{ $ref } if $delta_time > $_max_t{ $ref }; my $delta_copy = $delta_time; my $time_ref = \$_time{ $ref}; @@ -110,12 +113,11 @@ sub run { $self->_show( $show_handlers, $delta_time ); + Time::HiRes::sleep( $delay ) if $delay; + # these can change during the cycle $dt = $_dt{ $ref}; - $min_t = $_min_t{ $ref}; $delay = $_delay{ $ref }; - - Time::HiRes::sleep( $delay ) if $delay; } # pause works by stopping the app and running it again @@ -124,6 +126,8 @@ sub run { $self->_pause($ref); + delete $_paused{ $ref }; + # exit out of this sub before going back in so we don't recurse deeper and deeper goto $self->can('run') unless $_stop{ $ref}; diff --git a/lib/pods/SDLx/Controller.pod b/lib/pods/SDLx/Controller.pod index fad9b9cb..043df81e 100644 --- a/lib/pods/SDLx/Controller.pod +++ b/lib/pods/SDLx/Controller.pod @@ -199,7 +199,7 @@ and back to false when it is lifted. $event->type == SDL_MOUSEBUTTONUP ? 0 : undef ; return unless defined $state; # not a mouse click - + if($event->button_button == SDL_BUTTON_LEFT) { $click = $state; } From fff061d613bdb8ee598416c10f9801608a05e490 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sat, 7 Apr 2012 13:16:07 +0930 Subject: [PATCH 051/153] Documented max_t and updated Deprecated --- lib/SDLx/Controller.pm | 6 +----- lib/pods/SDL/Deprecated.pod | 6 +++++- lib/pods/SDLx/Controller.pod | 11 ++++++++++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 7673a246..8181d224 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -38,7 +38,7 @@ sub new { $_dt{ $ref } = defined $args{dt} ? $args{dt} : 0.1; $_min_t{ $ref } = defined $args{min_t} ? $args{min_t} : 1 / 60; - $_max_t{ $ref } = defined $args{max_t} ? $args{max_t} : 0.5; + $_max_t{ $ref } = defined $args{max_t} ? $args{max_t} : 0.1; $_stop{ $ref } = 1; $_event{ $ref } = $args{event} || SDL::Event->new(); $_event_handlers{ $ref } = $args{event_handlers} || []; @@ -350,7 +350,3 @@ sub ticks { } 1; - -__END__ - - diff --git a/lib/pods/SDL/Deprecated.pod b/lib/pods/SDL/Deprecated.pod index d467626d..dccf1500 100644 --- a/lib/pods/SDL/Deprecated.pod +++ b/lib/pods/SDL/Deprecated.pod @@ -22,7 +22,9 @@ SDLx::App had a full rewrite and SDLx::Controller was updated. Shortcut aliases in the constructor have been changed and removed. The main ones people use are still there like C, C and C. These lesser used ones no longer work: C, C, C, C, C, C, C, C, C. -All OpenGL parameters for the constructor now have a C prefix. These were never documented anyway, +C was renamed to C, but this method wasn't documented before anyway. + +All OpenGL parameters for the constructor now have a C prefix. These were never documented, so they're not listed here. The OpenGL method C is now called C. @@ -35,6 +37,8 @@ for backcompat. The C parameter and method have been removed. The exit on quit (stop on quit) action is now enabled by default. The C parameter and method are now used to change and disable the quit action of the app. +C will now slow the application down if it runs at less than 10 FPS, by default. + =back =head2 2.517 diff --git a/lib/pods/SDLx/Controller.pod b/lib/pods/SDLx/Controller.pod index 043df81e..be4aaa16 100644 --- a/lib/pods/SDLx/Controller.pod +++ b/lib/pods/SDLx/Controller.pod @@ -58,6 +58,7 @@ such as pausing the game. SDLx::Controller->new( dt => 0.05, min_t => 0, + max_t => 0.05, delay => 1 / 200, event_handlers => [ @event_callbacks ], move_handlers => [ @move_callbacks ], @@ -74,7 +75,7 @@ All params are optional and have sane defaults. =item dt -The length, in seconds, of a full movement step. Defaults to 0.1. +The time, in seconds, of a full movement step. Defaults to 0.1. In most cases, the C
could be set to any number and the game could run almost identically (except for floating-point precision differences). This is because B is an enforcement of the maximum time between calling movement handlers>. The actual time between calling move handlers may be much less, as the movement handlers @@ -97,6 +98,14 @@ A C of 1 / 60 ensures that the controller can update the screen at a maxi A "V-Sync" such as this is necessary to prevent video "tear", which occurs when the app is updating faster than the monitor can display. Setting it to 0, as seen above, will not delay the loop at all. +=item max_t + +The maximum time, in seconds, that the movement handlers are allowed to handle in a single cycle of the run loop. +If more time has passed since the last cycle, this time will not be handled and the game will slow down. +This is to protect against the slippery slope effect that happens when lag causes more movement handlers to be called +which, in turn, causes more lag. Setting C to the same value as C
guarantees that movement handlers will each +only be called once per frame. Defaults to 0.1, meaning the game will slow down if it is running at lower than 10 FPS. + =item delay The time, in seconds or milliseconds, to delay after every full L loop. Defaults to 0. From 8b1176526e32a21249e2a3114826944d09c0ee9e Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sat, 7 Apr 2012 13:56:12 +0930 Subject: [PATCH 052/153] Fix controller tests --- lib/SDLx/Controller.pm | 2 +- t/sdlx_controller.t | 27 +-------------------------- 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 8181d224..7d2bba26 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -171,8 +171,8 @@ sub pause { # if we're going to stop we don't want to pause return if !$_paused{ $ref} and $_stop{ $ref}; + $_stop{ $ref } = 1; $_paused{ $ref} = $callback; - $_stop{ $ref} = 1; } sub paused { # returns the callback (always true) if the app is paused or about to pause diff --git a/t/sdlx_controller.t b/t/sdlx_controller.t index c73d826c..e40e37f2 100644 --- a/t/sdlx_controller.t +++ b/t/sdlx_controller.t @@ -173,32 +173,6 @@ ok( $app->stopped, 'stopped still true when used stop' ); is( $in_callback, 3, 'callback called exactly three times' ); } -# stop handler ending pause -{ - my $in_callback; - - $app = SDLx::Controller->new( - show_handlers => [sub { - my $event = SDL::Event->new; - my $quit_event = SDL::Event->new; - $quit_event->type(SDL_QUIT); - SDL::Events::push_event($event); - SDL::Events::push_event($event); - SDL::Events::push_event($quit_event); - - $app->pause(sub { - $in_callback++; - return; - }); - }], - ); - $app->run; - - ok( $app->stopped, 'stopped true after being paused' ); - ok( !$app->paused, 'paused not true after stopped' ); - is( $in_callback, 2, 'callback only called twice' ); -} - # stop overriding pause { my $didnt_override; @@ -338,6 +312,7 @@ is($app->stop_handler, \&dummy_sub2, 'stop_handler set in constructor' ); $app = SDLx::Controller->new( dt => 0.1, min_t => 0.5, + max_t => 1e9999, ); sub dummy_sub {1} From 8b98eeb838671a465808d02b89e25aa7494c202c Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sun, 8 Apr 2012 12:50:51 +0930 Subject: [PATCH 053/153] fixed App set_video_mode so it doesn't call DESTROY --- lib/SDLx/App.pm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index c58c8ec5..a7e04085 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -172,18 +172,12 @@ sub new { sub set_video_mode { my ( $self, $w, $h, $d, $f ) = @_; - my $surface = SDL::Video::set_video_mode( $w, $h, $d, $f ) or Carp::confess( "set_video_mode failed: ", SDL::get_error() ); $surface = SDLx::Surface->new( surface => $surface ); # if we already have an app if( ref $self ) { - # make the app scalar ref point to the new C surface object - # luckily, we keep the app's SDLx::Controller like this - # because its inside-out-ness pays attention to the address of the SV and not the C object - bless $surface, ref $self; - $$self = $$surface; return $self; } return bless $surface, $self; From 4b61909bed07e60ac90012dc4abc7bf309f9e7ba Mon Sep 17 00:00:00 2001 From: Blaizer Date: Thu, 12 Apr 2012 17:36:55 +0930 Subject: [PATCH 054/153] added max_t method for max_t param --- lib/SDLx/Controller.pm | 8 ++++++++ lib/pods/SDLx/Controller.pod | 2 ++ 2 files changed, 10 insertions(+) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 7d2bba26..5eec4fa6 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -302,6 +302,14 @@ sub min_t { $_min_t{ $ref}; } +sub max_t { + my ($self, $arg) = @_; + my $ref = refaddr $self; + $_max_t{ $ref } = $arg if defined $arg; + + $_max_t{ $ref }; +} + sub delay { my ($self, $arg) = @_; my $ref = refaddr $self; diff --git a/lib/pods/SDLx/Controller.pod b/lib/pods/SDLx/Controller.pod index be4aaa16..110b7e7d 100644 --- a/lib/pods/SDLx/Controller.pod +++ b/lib/pods/SDLx/Controller.pod @@ -472,11 +472,13 @@ event handler display this, because L could be called in the meantime. my $dt = $app->dt; my $min_t = $app->min_t; + my $max_t = $app->max_t; my $delay = $app->delay; my $stop_handler = $app->stop_handler; my $event = $app->event; $app->dt ($dt); $app->min_t ($min_t); + $app->max_t ($max_t); $app->delay ($delay); $app->stop_handler($stop_handler); $app->event ($event); From 763c098a3ac5b107c1d83203024f7a058214f765 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Thu, 12 Apr 2012 17:37:17 +0930 Subject: [PATCH 055/153] Updated changelog with all changes to App and Controller --- CHANGELOG | 21 +++++++++++++++++++++ lib/pods/SDLx/Controller.pod | 3 ++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index e5d1144a..e005e2ad 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,27 @@ Revision history for Perl extension SDL_perl. Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) +* 2.537_03 Apr 12 2012 + - SDLx::App made the docs a lot better [Blaizer] + - SDLx::App changed around shortcut names in the constructor [Blaizer] + - SDLx::App added and improved parameters of the constructor, see docs [Blaizer] + - SDLx::App updated methods resize, title, icon, error, show_cursor, grab_input [Blaizer] + - SDLx::App fullscreen method works better [Blaizer] + - SDLx::App new init method does our initializing right [Blaizer] + - SDLx::App new set_video_mode method does set_video_mode for SDLx::App [Blaizer] + - SDLx::App new screen_size method returns the user's screen size [Blaizer] + - SDLx::App warp method renamed to warp_cursor, attribute renamed to gl_attribute [Blaizer] + - SDLx::App fix to return the user's resolution to normal when a fullscreen app closes [FROGGS] + - SDLx::App removed delay method and deprecated get_ticks [Blaizer] + - SDLx::Controller removed eoq, its action is on by default and implemented by stop_handler [Blaizer] + - SDLx::Controller made the docs a lot better, even proofread them [Blaizer] + - SDLx::Controller pause works by stopping the app [Blaizer] + - SDLx::Controller added stopped and paused methods to tell what the app is doing [Blaizer] + - SDLx::Controller added max_t param, by default slows down apps going at less than 10 FPS [Blaizer] + - SDLx::Controller added time and sleep methods to replace get_ticks and delay [Blaizer] + - SDLx::Controller added some tests for pausing and events [Blaizer] + - SDLx::Controller removed current_time parameter [Blaizer] + * 2.537_02 Feb 13 2012 - t/core_cd.t: gnu hurd 0.3 handles devices like cdrom strange (skipping tests) [FROGGS] - t/sdlx_fps.t: seems better to try to get 5 fps (slow vm's) [FROGGS] diff --git a/lib/pods/SDLx/Controller.pod b/lib/pods/SDLx/Controller.pod index 110b7e7d..05ea47cc 100644 --- a/lib/pods/SDLx/Controller.pod +++ b/lib/pods/SDLx/Controller.pod @@ -58,7 +58,7 @@ such as pausing the game. SDLx::Controller->new( dt => 0.05, min_t => 0, - max_t => 0.05, + max_t => 1e9999, delay => 1 / 200, event_handlers => [ @event_callbacks ], move_handlers => [ @move_callbacks ], @@ -105,6 +105,7 @@ If more time has passed since the last cycle, this time will not be handled and This is to protect against the slippery slope effect that happens when lag causes more movement handlers to be called which, in turn, causes more lag. Setting C to the same value as C
guarantees that movement handlers will each only be called once per frame. Defaults to 0.1, meaning the game will slow down if it is running at lower than 10 FPS. +Setting it to 1e9999 (or infinity), as seen above, will disable this action. =item delay From 8f1d03a917da445cf3f64cb6490852442ea742fc Mon Sep 17 00:00:00 2001 From: Blaizer Date: Thu, 12 Apr 2012 17:42:04 +0930 Subject: [PATCH 056/153] Added tests for max_t --- t/sdlx_controller.t | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/t/sdlx_controller.t b/t/sdlx_controller.t index e40e37f2..c2703762 100644 --- a/t/sdlx_controller.t +++ b/t/sdlx_controller.t @@ -22,7 +22,7 @@ can_ok( 'SDLx::Controller', qw( new run stop stopped pause paused - dt min_t delay event stop_handler default_stop_handler + dt min_t max_t delay event stop_handler default_stop_handler time sleep add_move_handler add_event_handler add_show_handler move_handlers event_handlers show_handlers @@ -41,6 +41,7 @@ my $app = SDLx::Controller->new; isa_ok( $app, 'SDLx::Controller', 'default controller can be spawned' ); is($app->dt, 0.1, 'default dt set to 0.1' ); is($app->min_t, 1/60, 'default min_t set to 1/60' ); +is($app->max_t, 0.1, 'default max_t set to 0.1' ); is($app->delay, 0, 'default delay set to 0' ); is( scalar @{ $app->move_handlers }, 0, 'no motion handlers by default' ); is( scalar @{ $app->show_handlers }, 0, 'no show handlers by default' ); @@ -66,6 +67,8 @@ $app->dt(1337); is( $app->dt, 1337, 'dt can be changed with method' ); $app->min_t(123); is( $app->min_t, 123, 'min_t can be changed with method' ); +$app->max_t(190); +is( $app->max_t, 190, 'max_t can be changed with method' ); $app->delay(555); is( $app->delay, 555, 'delay can be changed with method' ); my $event = SDL::Event->new; @@ -288,6 +291,7 @@ my ($dummy_ref1, $dummy_ref2, $dummy_ref3) = ([], [sub {}, \&dummy_sub], [\&dumm $app = SDLx::Controller->new( dt => 0.1255, min_t => 0.467, + max_t => 43, event => $event, event_handlers => $dummy_ref1, move_handlers => $dummy_ref2, @@ -300,6 +304,7 @@ $app = SDLx::Controller->new( isa_ok( $app, 'SDLx::Controller' ); is($app->dt, 0.1255, 'dt set in constructor'); is($app->min_t, 0.467, 'min_t set in constructor' ); +is($app->max_t, 43, 'max_t set in constructor' ); is($app->event, $event, 'event set in constructor' ); is($app->event_handlers, $dummy_ref1, 'event_handlers set in constructor' ); is($app->move_handlers, $dummy_ref2, 'move_handlers set in constructor' ); From 564c8b755bb319e9134e92d4a5d9439ac4f4d7ff Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Thu, 19 Apr 2012 23:09:11 +0200 Subject: [PATCH 057/153] lvalue subs dont return stuff --- lib/SDLx/App.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index a7e04085..20463325 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -196,7 +196,7 @@ sub DESTROY { } sub stash :lvalue { - return $_stash{ refaddr( $_[0] ) }; + $_stash{ refaddr( $_[0] ) }; } sub init { From 0bcbf3334b0b83f0e548338b75d09accde99b64f Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Thu, 19 Apr 2012 23:10:02 +0200 Subject: [PATCH 058/153] turn MMX on, to be sure --- lib/SDL/GFX/ImageFilter.pm | 2 ++ t/gfx_imagefilter.t | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/SDL/GFX/ImageFilter.pm b/lib/SDL/GFX/ImageFilter.pm index 19324bf8..963ebab6 100644 --- a/lib/SDL/GFX/ImageFilter.pm +++ b/lib/SDL/GFX/ImageFilter.pm @@ -19,4 +19,6 @@ our %EXPORT_TAGS = ( smoothing => $SDL::Constants::EXPORT_TAGS{'SDL::GFX/smoothing'} ); +MMX_on(); + 1; diff --git a/t/gfx_imagefilter.t b/t/gfx_imagefilter.t index d75de70a..5edcff35 100644 --- a/t/gfx_imagefilter.t +++ b/t/gfx_imagefilter.t @@ -32,6 +32,8 @@ printf( "got version: %d.%d.%d\n", $v->major, $v->minor, $v->patch ); my @done = qw/ MMX_detect + MMX_off + MMX_on /; my $display = SDL::Video::set_video_mode( 640, 480, 32, SDL_SWSURFACE ); @@ -99,9 +101,6 @@ SDL::Video::update_rect( $display, 0, 0, 640, 480 ); #SDL::delay(1000); my @left = qw/ - MMX_detect - MMX_off - MMX_on add mean sub From 571885ab2ad66d9c56e8ffed3f91a6231f852a95 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Thu, 10 May 2012 21:58:05 +0200 Subject: [PATCH 059/153] platform specific notes by Alex --- lib/pods/SDL/Platform.pod | 117 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 lib/pods/SDL/Platform.pod diff --git a/lib/pods/SDL/Platform.pod b/lib/pods/SDL/Platform.pod new file mode 100644 index 00000000..11656118 --- /dev/null +++ b/lib/pods/SDL/Platform.pod @@ -0,0 +1,117 @@ + +=pod + +=head1 NAME + +SDL-Platform - Platform Specific Informations about SDL Perl + +=head1 CATEGORY + +Documentation + + +=head1 DESCRIPTION + +This document describes OS specific informations regading the installation and use of L. + +=head2 General (all OS) + +You need to install L to acquire all prerequisites of L. + +On Windows, L will get you zip-files containing prebuilt libs. + +On Unixes you can choose between compiling libs or use libs provided by the dist. +The different options on Unixes are availale when requirements are met. Like having specific libs installed. + +There is some additional documentation in the L. +You definitively want to look there, if you want to know how to install L from the latest sources (e.g. in an unfinished, unreleased state). + + + +=head1 Windows + +=head2 Installation + +We recommend Strawberry Perl. You can get it L. + +Once you installed Strawberry Perl, you can access the cpan shell via the start menu. + +Open up the cpan shell and type C. Please follow the dialog and answer the questions to the best of your knowledge. + + + +=head1 Mac OS X + +=head2 Installation + +You will need a newer version of Perl that you can install with L. + +Once you have a newer Perl installed please use C to install L (and of course L). + +=head2 Using SDL on Mac OS X + +You can't use the C executable to run SDL scripts on Mac OS X, you need to use C. +When you install L, a program named C is installed. It should be in your path. + +Using Mac OS X, your SDL Perl script have to look like this: + + #!SDLPerl + + use strict; + use warnings; + use SDL; + # your code here ... + +Using the wrong Perl executable, you might encounter a lot of error messages resulting in C. +cf. the corresponding L. + +=head1 SEE ALSO + +=over + +=item * L + +=item * L + +=back + +=head1 AUTHORS + +See list of module authors in L. + +If you would like to contribute to SDL Perl, please post a message on the mailing list: + +sdl-devel@perl.org + +And request access to the github repository. Or drop us a line on #sdl over at irc.perl.org + +=head1 COPYRIGHT & LICENSE + +Copyright 2002-2010 SDL Authors as listed above, all rights reserved. + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 DISCLAIMER OF WARRANTY + +BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE +ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH +YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL +NECESSARY SERVICING, REPAIR, OR CORRECTION. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE +LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, +OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE +THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + From d241a99b648b9e3a25433f5875ad5a737b540c05 Mon Sep 17 00:00:00 2001 From: Mikhael Goikhman Date: Sun, 13 May 2012 14:13:50 +0300 Subject: [PATCH 060/153] fix spelling errors in pods Conflicts: lib/pods/SDL/Events.pod lib/pods/SDLx/App.pod lib/pods/SDLx/Controller.pod --- lib/pods/SDL.pod | 2 +- lib/pods/SDL/Audio.pod | 4 ++-- lib/pods/SDL/AudioSpec.pod | 2 +- lib/pods/SDL/CD.pod | 2 +- lib/pods/SDL/Cookbook/OpenGL.pod | 8 +++---- lib/pods/SDL/Cookbook/PDL.pod | 6 ++--- lib/pods/SDL/Deprecated.pod | 4 ++-- lib/pods/SDL/Event.pod | 10 ++++---- lib/pods/SDL/Events.pod | 26 ++++++++++----------- lib/pods/SDL/GFX/Framerate.pod | 4 ++-- lib/pods/SDL/GFX/Primitives.pod | 4 ++-- lib/pods/SDL/MPEG.pod | 4 ++-- lib/pods/SDL/Mixer.pod | 2 +- lib/pods/SDL/Mixer/Channels.pod | 4 ++-- lib/pods/SDL/Mixer/Groups.pod | 4 ++-- lib/pods/SDL/Mixer/Music.pod | 2 +- lib/pods/SDL/Overlay.pod | 2 +- lib/pods/SDL/Pango.pod | 6 ++--- lib/pods/SDL/RWOps.pod | 26 ++++++++++----------- lib/pods/SDL/SMPEG.pod | 2 +- lib/pods/SDL/TTF.pod | 18 +++++++-------- lib/pods/SDL/Tutorial/LunarLander.pod | 2 +- lib/pods/SDL/Video.pod | 12 +++++----- lib/pods/SDLx/App.pod | 13 ++++++----- lib/pods/SDLx/Controller.pod | 19 ++++++++------- lib/pods/SDLx/Controller/Interface.pod | 6 ++--- lib/pods/SDLx/Layer.pod | 8 +++---- lib/pods/SDLx/LayerManager.pod | 8 +++---- lib/pods/SDLx/Music.pod | 4 ++-- lib/pods/SDLx/Rect.pod | 4 ++-- lib/pods/SDLx/Sound.pod | 32 +++++++++++++------------- lib/pods/SDLx/Sprite.pod | 2 +- lib/pods/SDLx/Sprite/Animated.pod | 2 +- lib/pods/SDLx/Surface.pod | 8 +++---- lib/pods/SDLx/Text.pod | 4 ++-- 35 files changed, 135 insertions(+), 131 deletions(-) diff --git a/lib/pods/SDL.pod b/lib/pods/SDL.pod index a33b7aae..9f6a3d95 100644 --- a/lib/pods/SDL.pod +++ b/lib/pods/SDL.pod @@ -88,7 +88,7 @@ C doesn't return any values. my $flags = SDL::was_init( $flags ); -C allows you to see which SDL subsytems have been initialized. +C allows you to see which SDL subsystems have been initialized. The C<$flags> tell C which subsystems to check, and are taken in the same way as C. C returns a mask of the initialized subsystems it checks. diff --git a/lib/pods/SDL/Audio.pod b/lib/pods/SDL/Audio.pod index 2c8c352c..6244e873 100644 --- a/lib/pods/SDL/Audio.pod +++ b/lib/pods/SDL/Audio.pod @@ -189,7 +189,7 @@ Converts audio data to a desired audio format. C takes as first parameter C, which was previously initialized. Initializing a C is a two step process. First of all, the structure must be created via Cbuild> along with source and destination format parameters. Secondly, -the C and C fields must be setup. C should point to the audio data buffer beeing source and destination at +the C and C fields must be setup. C should point to the audio data buffer being source and destination at once and C should be set to the buffer length in bytes. Remember, the length of the buffer pointed to by buf should be C bytes in length. @@ -256,7 +256,7 @@ Example: # And now we're ready to convert SDL::Audio::convert($wav_cvt, $wav_buf, $wav_len); - # We can freeto original WAV data now + # We can free original WAV data now SDL::Audio::free_wav($wav_buf); B: What to do with it? How to use callback? See http://www.libsdl.org/cgi/docwiki.cgi/SDL_ConvertAudio diff --git a/lib/pods/SDL/AudioSpec.pod b/lib/pods/SDL/AudioSpec.pod index b9aca813..dc7f04d2 100644 --- a/lib/pods/SDL/AudioSpec.pod +++ b/lib/pods/SDL/AudioSpec.pod @@ -29,7 +29,7 @@ Core, Audio, Structure # do something here } -=head1 DESCIPTION +=head1 DESCRIPTION The C structure is used to describe the format of some audio data. This structure is used by C and C. diff --git a/lib/pods/SDL/CD.pod b/lib/pods/SDL/CD.pod index a91ebe44..77f3ce27 100644 --- a/lib/pods/SDL/CD.pod +++ b/lib/pods/SDL/CD.pod @@ -170,7 +170,7 @@ Current track on the CD; my $track = $CD->track($number); -Retrives track description of track $number in CD. See L. +Retrieves track description of track $number in CD. See L. =head2 FRAMES_TO_MSF diff --git a/lib/pods/SDL/Cookbook/OpenGL.pod b/lib/pods/SDL/Cookbook/OpenGL.pod index 5bc715d7..e70e4550 100644 --- a/lib/pods/SDL/Cookbook/OpenGL.pod +++ b/lib/pods/SDL/Cookbook/OpenGL.pod @@ -11,9 +11,9 @@ Cookbook =head1 DESCRIPTION -As of release 2.5 SDL no longer maintains it's own bindings of openGL. Support for openGL has been moved over to a more mature implementation. +As of release 2.5 SDL no longer maintains it's own bindings of OpenGL. Support for OpenGL has been moved over to a more mature implementation. -This implementation is the POGL project. L is faster and more complete; and works with SDL seemlessly. +This implementation is the POGL project. L is faster and more complete; and works with SDL seamlessly. =head2 EXAMPLE @@ -37,7 +37,7 @@ You can use OpenGL as needed here. $| = 1; $WIDTH = 1024; $HEIGHT = 768; - $SDLAPP = SDLx::App->new(title => "Opengl App", width => $WIDTH, height => $HEIGHT, gl => 1); + $SDLAPP = SDLx::App->new(title => "OpenGL App", width => $WIDTH, height => $HEIGHT, gl => 1); $SDLEVENT = SDL::Event->new; SDLx::App can start an OpenGL application with the parameter gl => 1. @@ -48,7 +48,7 @@ SDLx::App can start an OpenGL application with the parameter gl => 1. gluPerspective(60, $WIDTH / $HEIGHT, 1, 1000); glTranslatef(0, 0, -20); -Above we enable GL and set the correct prespective +Above we enable GL and set the correct perspective while (1) { &handlepolls; diff --git a/lib/pods/SDL/Cookbook/PDL.pod b/lib/pods/SDL/Cookbook/PDL.pod index c58b45dc..05aec389 100644 --- a/lib/pods/SDL/Cookbook/PDL.pod +++ b/lib/pods/SDL/Cookbook/PDL.pod @@ -38,7 +38,7 @@ Create a normal $piddle with zeros, byte format and the Bpp x width x height dim my $pointer = $piddle->get_dataref(); -Here is where we get the acutal data the piddle is pointing to. We will have SDL create a new surface from this function. +Here is where we get the actual data the piddle is pointing to. We will have SDL create a new surface from this function. my $surface = SDL::Surface->new_from( $pointer, $width, $height, 32, $width * $bytes_per_pixel ); @@ -48,7 +48,7 @@ Using the same dimensions we create the surface using new_form. The width * Bpp warn "Made surface of $width, $height and ". $surface->format->BytesPerPixel; return ( $piddle, $surface ); -Finally make sure that the surface acutally has the correct dimensions we gave. +Finally make sure that the surface actually has the correct dimensions we gave. B $surface->format->BytesPerPixel must return 1,2,3,4. !! @@ -79,7 +79,7 @@ When blitting the new surface check for the return value to see if there has bee die "Could not blit: " . SDL::get_error() if ( $b == -1 ); -If the error message is 'Blit combination not supported' that means that the BPP is incorrect or incosistent with the dimensions. +If the error message is 'Blit combination not supported' that means that the BPP is incorrect or inconsistent with the dimensions. After that a simple update_rect will so your new surface on the screen. =head1 AUTHORS diff --git a/lib/pods/SDL/Deprecated.pod b/lib/pods/SDL/Deprecated.pod index dccf1500..20733114 100644 --- a/lib/pods/SDL/Deprecated.pod +++ b/lib/pods/SDL/Deprecated.pod @@ -58,7 +58,7 @@ C will limit apps to a framerate of 60 by default. =item SDLx::App -C is depreceated. +C is deprecated. =back @@ -86,7 +86,7 @@ Has drastically changed, and is still volatile. =item SDL::App -SDL::App has migrated to SDLx::App namespace. The reason for this is because it is an extenstion and not a 1:1 XS/Constant Module to the c library. +SDL::App has migrated to SDLx::App namespace. The reason for this is because it is an extension and not a 1:1 XS/Constant Module to the c library. =item SDL::Game::Rect diff --git a/lib/pods/SDL/Event.pod b/lib/pods/SDL/Event.pod index 0527abd1..9d2d3020 100644 --- a/lib/pods/SDL/Event.pod +++ b/lib/pods/SDL/Event.pod @@ -57,7 +57,7 @@ and it is then up to the application to process the information stored with them =head2 new C creates an empty event-object, which can be used store information. -Either by calling C that transferes one event from the queue into our object +Either by calling C that transfers one event from the queue into our object or by setting all the needed data manually in order to push the event to the queue. use SDL::Event; @@ -105,7 +105,7 @@ L - Joystick axis motion event structur =item * -L - Joystick trackball motion event structure +L - Joystick trackball motion event structure =item * @@ -361,7 +361,7 @@ This is currently only implemented on Windows and Linux/Unix-alikes. When a mouse button press or release is detected, the number of the button pressed (from 1 to 255, with 1 usually being the left button and 2 the right) is placed into C. The position of the mouse -when this event occured is stored in the C and the C fields. Like a keyboard event, +when this event occurred is stored in the C and the C fields. Like a keyboard event, information on whether the event was a press or a release event is stored in both the C and C fields, but this should be obvious. @@ -395,7 +395,7 @@ The field C is the index of the joystick that reported the event. =head3 jaxis_axis -The C is the index of the axis (for a more detailed explaination see the Joystick section). +The C is the index of the axis (for a more detailed explanation see the Joystick section). =head3 jaxis_value @@ -482,7 +482,7 @@ C =back -=head2 Joystrick trackball events +=head2 Joystick trackball events A C event occurs when a user moves a trackball on the joystick. diff --git a/lib/pods/SDL/Events.pod b/lib/pods/SDL/Events.pod index 0d309f1e..2d56423a 100644 --- a/lib/pods/SDL/Events.pod +++ b/lib/pods/SDL/Events.pod @@ -223,12 +223,12 @@ Checks the event queue for messages and optionally returns them. my $num_peep_events = SDL::Events::peep_events($event, 127, SDL_PEEKEVENT, SDL_ALLEVENTS); -If action is SDL_ADDEVENT, up to numevents events will be added to the back of the event queue. +If action is SDL_ADDEVENT, up to num_events events will be added to the back of the event queue. -If action is SDL_PEEKEVENT, up to numevents events at the front of the event queue, matching mask, will be returned and will not be removed from +If action is SDL_PEEKEVENT, up to num_events events at the front of the event queue, matching mask, will be returned and will not be removed from the queue. -If action is SDL_GETEVENT, up to numevents events at the front of the event queue, matching mask, will be returned and will be removed from the +If action is SDL_GETEVENT, up to num_events events at the front of the event queue, matching mask, will be returned and will be removed from the queue. The mask parameter is a bitwise OR of SDL::Events::SDL_EVENTMASK(event_type), for all event types you are interested in @@ -315,8 +315,8 @@ set_event_filter takes a coderef that it checks all events again. The callback g to filter the event return a 0, to pass the filter return a 1. -One B is if you are filtering SDL_QUIT the event will be filtered if it is non-intterupt call ( Window closes normally ). If it is a -interrupt SDL_QUIT it will be process on the next event poll. +One B is if you are filtering SDL_QUIT the event will be filtered if it is non-interrupt call ( Window closes normally ). If it is a +interrupt SDL_QUIT it will be process on the next event poll. Events pushed onto to the queue with L or L do not get filtered. @@ -466,12 +466,12 @@ Enable/Disable UNICODE translation my $previous_translation_mode = SDL::Events::enable_unicode( 1 ); #enable $previous_translation_mode = SDL::Events::enable_unicode( 0 ); #disables -To obtain the character codes corresponding to received keyboard events, Unicode translation must first be turned on using this function. The -translation incurs a slight overhead for each keyboard event and is therefore disabled by default. For each subsequently recieved key down event, -the unicode member of the L provided structure will be then contain the corresponding character code, or +To obtain the character codes corresponding to received keyboard events, Unicode translation must first be turned on using this function. The +translation incurs a slight overhead for each keyboard event and is therefore disabled by default. For each subsequently received key down event, +the unicode member of the L provided structure will be then contain the corresponding character code, or otherwise zero. -A value of 1 for enabling, 0 for disabling and -1 for unchanged. -1 is usefull for querying the current translation mode. +A value of 1 for enabling, 0 for disabling and -1 for unchanged. -1 is useful for querying the current translation mode. Only key press events will be translated not release events. @@ -483,7 +483,7 @@ Sets keyboard repeat rate my $success = SDL::Events::enable_key_repeat( $delay, $interval ); -Enables or disables the keyboard repeat rate. $delay specifies how long the key must be pressed before it begins repeating, it then repleats at the +Enables or disables the keyboard repeat rate. $delay specifies how long the key must be pressed before it begins repeating, it then repeats at the speed specified by $interval. Both $delay and $interval are expressed in milliseconds. Setting $delay to 0 disables key repeating completely. Good default values are SDL_DEFAULT_REPEAT_DELAY and SDL_DEFAULT_REPEAT_INTERVAL. @@ -492,7 +492,7 @@ Return 0 on success and -1 on fail. =head2 get_mouse_state -Retrives the current state of the mouse +Retrieves the current state of the mouse my ($mask,$x,$y) = @{ SDL::Events::get_mouse_state( ) }; @@ -508,7 +508,7 @@ The current button state is returned as a button $bitmask, which can be tested u =head2 get_relative_mouse_state -Retrives the current relative state of the mouse +Retrieves the current relative state of the mouse my ($mask,$x,$y) = @{ SDL::Events::get_mouse_state( ) }; @@ -518,7 +518,7 @@ Retrives the current relative state of the mouse print 'Button Middle pressed' if ($mask & SDL_BUTTON_MMASK); - print $x.','.$y; # this is relative to the last postion of the mouse + print $x.','.$y; # this is relative to the last position of the mouse The current button state is returned as a button $bitmask, which can be tested using the the above constants diff --git a/lib/pods/SDL/GFX/Framerate.pod b/lib/pods/SDL/GFX/Framerate.pod index 670a3dac..ecc11dac 100644 --- a/lib/pods/SDL/GFX/Framerate.pod +++ b/lib/pods/SDL/GFX/Framerate.pod @@ -41,8 +41,8 @@ Get the currently set framerate of the manager. SDL::GFX::Framerate::delay($fps); -Generate a delay to accomodate currently set framerate. Call once in thegraphics/rendering loop. -If the computer cannot keep up with the rate (i.e.drawing too slow), the delay is zero and the delay interpolation is reset. +Generate a delay to accommodate the currently set framerate. Call once in the graphics/rendering loop. +If the computer cannot keep up with the rate (i.e. drawing too slow), the delay is zero and the delay interpolation is reset. =head1 AUTHORS diff --git a/lib/pods/SDL/GFX/Primitives.pod b/lib/pods/SDL/GFX/Primitives.pod index 1f3880ac..1f9c8ecf 100644 --- a/lib/pods/SDL/GFX/Primitives.pod +++ b/lib/pods/SDL/GFX/Primitives.pod @@ -9,7 +9,7 @@ GFX =head1 DESCRIPTION -All functions take an SDL::Surface object as first parameter. This can be a new surface that will be blittet afterwads, can be an surface +All functions take an SDL::Surface object as first parameter. This can be a new surface that will be blitted afterwards, can be an surface obtained by L or can be an L. The C values for the C<_color> functions are C<0xRRGGBBAA> (32bit), even if the surface uses e. g. 8bit colors. @@ -30,7 +30,7 @@ Draws a pixel at point C/C<$y>. You can pass the color by C<0xRRGGBBAA> or by my $surface = SDL::Video::set_video_mode(640, 480, 32, SDL_SWSURFACE); - SDL::GFX::Primitives::pixel_color($surface, 2, 2, 0xFF0000FF); # red pixcel + SDL::GFX::Primitives::pixel_color($surface, 2, 2, 0xFF0000FF); # red pixel SDL::GFX::Primitives::pixel_RGBA( $surface, 4, 4, 0x00, 0xFF, 0x00, 0xFF); # green pixel =head2 hline diff --git a/lib/pods/SDL/MPEG.pod b/lib/pods/SDL/MPEG.pod index 5d37a63b..247a898b 100644 --- a/lib/pods/SDL/MPEG.pod +++ b/lib/pods/SDL/MPEG.pod @@ -15,7 +15,7 @@ TODO =head1 DESCRIPTION -C provides an interface to quering the status +C provides an interface to querying the status of a SMPEG stream. =head2 METHODS @@ -48,7 +48,7 @@ C returns the offset into the clip in bytes =item * -C returns the offset into the clip in fames +C returns the offset into the clip in frames =item * diff --git a/lib/pods/SDL/Mixer.pod b/lib/pods/SDL/Mixer.pod index 6f761536..b16dd88f 100644 --- a/lib/pods/SDL/Mixer.pod +++ b/lib/pods/SDL/Mixer.pod @@ -163,7 +163,7 @@ B: Only available for SDL_mixer >= 1.2.10 SDL::Mixer::quit(); -This function unloads the liraries previously loaded with L. +This function unloads the libraries previously loaded with L. B: Only available for SDL_mixer >= 1.2.10 diff --git a/lib/pods/SDL/Mixer/Channels.pod b/lib/pods/SDL/Mixer/Channels.pod index 6eca76e1..4dc10e42 100644 --- a/lib/pods/SDL/Mixer/Channels.pod +++ b/lib/pods/SDL/Mixer/Channels.pod @@ -17,7 +17,7 @@ Mixer my $ret = SDL::Mixer::Channels::allocate_channels( $number_of_channels ); -Dynamically change the number of channels managed by the mixer. If decreasing the number of channels, the upper channels arestopped. +Dynamically change the number of channels managed by the mixer. If decreasing the number of channels, the upper channels are stopped. This function returns the new number of allocated channels. Example @@ -142,7 +142,7 @@ Example 2: my $playing = SDL::Mixer::Channels::playing( $channel ); -Returns C<1> if the given channel is playing sound, otherwise C<0>. It does'nt check if the channel is paused. +Returns C<1> if the given channel is playing sound, otherwise C<0>. It doesn't check if the channel is paused. B: If you pass C<-1> you will get the number of playing channels. diff --git a/lib/pods/SDL/Mixer/Groups.pod b/lib/pods/SDL/Mixer/Groups.pod index 6e1676bd..347ba880 100644 --- a/lib/pods/SDL/Mixer/Groups.pod +++ b/lib/pods/SDL/Mixer/Groups.pod @@ -92,7 +92,7 @@ C returns the channel number which started to play at last. Fades out the channels by the given group id. The fade-out-time is specified by C<$ms>. -Retuns the number of affected channels. +Returns the number of affected channels. =head2 halt_group @@ -100,7 +100,7 @@ Retuns the number of affected channels. Halts the channels by the given group id. -Retuns C<0>. +Returns C<0>. =head1 AUTHORS diff --git a/lib/pods/SDL/Mixer/Music.pod b/lib/pods/SDL/Mixer/Music.pod index e862548e..0fefbd3b 100644 --- a/lib/pods/SDL/Mixer/Music.pod +++ b/lib/pods/SDL/Mixer/Music.pod @@ -240,7 +240,7 @@ Returns C<1> if the music is paused, otherwise C<0>. my $playing_music = SDL::Mixer::Music::playing_music(); -Returns C<1> if the music is playing sound, otherwise C<0>. It does'nt check if the music is paused. +Returns C<1> if the music is playing sound, otherwise C<0>. It doesn't check if the music is paused. =head1 AUTHORS diff --git a/lib/pods/SDL/Overlay.pod b/lib/pods/SDL/Overlay.pod index 4c465271..7ecc8cef 100644 --- a/lib/pods/SDL/Overlay.pod +++ b/lib/pods/SDL/Overlay.pod @@ -17,7 +17,7 @@ First import the following modules to get access to constants and functions need use SDL::Video; use SDL::Overlay; -Init the video susbsystem. +Init the video subsystem. SDL::Init(SDL_INIT_VIDEO); diff --git a/lib/pods/SDL/Pango.pod b/lib/pods/SDL/Pango.pod index beb8bd71..e50cc1dc 100644 --- a/lib/pods/SDL/Pango.pod +++ b/lib/pods/SDL/Pango.pod @@ -25,7 +25,7 @@ Pango my $context = SDL::Pango::Context->new; SDL::Pango::set_default_color($context, 0xA7C344FF, 0); - SDL::Pango::set_markup($context, 'Hallo World!', -1); + SDL::Pango::set_markup($context, 'Hello World!', -1); SDL::init(SDL_INIT_VIDEO); @@ -110,7 +110,7 @@ Returns: always C<0>. my $was_init = SDL::Pango::was_init(); -Query the initilization status of the Glib and Pango API. You may, of course, use this before L to avoid initilizing twice +Query the initialization status of the Glib and Pango API. You may, of course, use this before L to avoid initializing twice in a row. Returns: Non-zero when already initialized. Zero when not initialized. @@ -212,7 +212,7 @@ Draws the text or markup to an existing surface at position C<$x>/C<$y>. SDL::Pango::set_surface_create_args($context, $flags, $bits, $r_mask, $g_mask, $b_mask, $a_mask); -Sets the argumet that are used when creating a surface via L. +Sets the argument that are used when creating a surface via L. Example: diff --git a/lib/pods/SDL/RWOps.pod b/lib/pods/SDL/RWOps.pod index 7d22e0ed..57ecec6f 100644 --- a/lib/pods/SDL/RWOps.pod +++ b/lib/pods/SDL/RWOps.pod @@ -3,7 +3,7 @@ =head1 NAME -SDL::RWOps -- SDL Bindings to SDL_RWOPs +SDL::RWOps -- SDL Bindings to SDL_RWops =head1 CATEGORY @@ -13,7 +13,7 @@ TODO, Core, Structure =head1 SYNOPSIS # The following example will load several png's from a single file to an array of SDL::Surface's. - # Usefull for e.g. levelfiles. + # Useful for e.g. levelfiles. use SDL; use SDL::Image; use SDL::RWOps; @@ -52,9 +52,9 @@ An example usage would be to put a bunch of resources in a zip file and use Zzip =head2 rw_from_file(file,mode) -rw_from_file creates a new SDL::RWops structure for reading from and/or writing to a named file. +rw_from_file creates a new SDL::RWOps structure for reading from and/or writing to a named file. The mode string is treated the same as in a call to the C library's fopen(). -SDL::rw_from_file() returns a SDL::RWops structure on succés or undef on failure. +SDL::rw_from_file() returns a SDL::RWOps structure on success or undef on failure. Mode Strings: @@ -80,16 +80,16 @@ This additional "b" character can either be appended at the end of the string (t =head2 rw_from_fp(fp,autoclose) -SDL::rw_from_fp creates a new SDL::RWops structure from a file pointer, opened with stdio. If autoclose is nonzero, the file will be automatically closed when the SDL::RWops structure is closed. -It returns a SDL::RWops on succés or undef on error. +SDL::rw_from_fp creates a new SDL::RWOps structure from a file pointer, opened with stdio. If autoclose is nonzero, the file will be automatically closed when the SDL::RWOps structure is closed. +It returns a SDL::RWOps on success or undef on error. Note: This is not available under Win32, since files opened in an application on that platform cannot be used by a dynamically linked library. =head2 rw_from_mem(mem,size) -SDL::rw_from_mem sets up a SDL::RWops struct based on a chunk of memory of a certain size. -It returns a SDL::Rwops on succés or undef on error. +SDL::rw_from_mem sets up a SDL::RWOps struct based on a chunk of memory of a certain size. +It returns a SDL::RWOps on success or undef on error. Note: If the memory is not writable, use SDL::rw_from_const_mem instead. @@ -104,14 +104,14 @@ It assumes the memory area is not writable. It returns a SDL::RWOps on success o =head2 alloc_rw() -alloc_rw allocates an empty, unpopulated SDL::RWops structure. You must fill out the fields yourself. -It returns a SDL::RWops structure on succés or undef on error. +alloc_rw allocates an empty, unpopulated SDL::RWOps structure. You must fill out the fields yourself. +It returns a SDL::RWOps structure on success or undef on error. Note: You must free any memory allocated with SDL::alloc_rw with SDL::free_rw. =head2 free_rw(context) -SDL::free_rw frees an SDL::RWops structure previously allocated by SDL::alloc_rw. Only use it on memory allocated by SDL::alloc_rw. +SDL::free_rw frees an SDL::RWOps structure previously allocated by SDL::alloc_rw. Only use it on memory allocated by SDL::alloc_rw. It doesn't returns anything. @@ -119,7 +119,7 @@ It doesn't returns anything. SDL::rw_seek calls the seek function pointer in an SDL::RWOps structure. It takes the same 3 parameters as the function pointer: - 1. A pointer to an SDL::rwops structure + 1. A pointer to an SDL::RWOps structure 2. An offset in bytes. This can be a negative value. 3.SEEK_SET, SEEK_CUR, or SEEK_END. SEEK_SET seeks from the beginning of the file, SEEK_CUR from the current position, and SEEK_END from the end of the file. @@ -137,7 +137,7 @@ SDL_RWread calls the function pointed to by an SDL::RWOps structure's read membe 1. A pointer to an SDL::RWOps structure 2. A pointer to an area of memory to read data into 3. The size of each block of memory to read - 4. The maxinum number of memory blocks to read(it may read less) + 4. The maximum number of memory blocks to read(it may read less) It returns the number of memory blocks read, or -1 if the read failed. diff --git a/lib/pods/SDL/SMPEG.pod b/lib/pods/SDL/SMPEG.pod index e9bd1baf..6c8f51b0 100644 --- a/lib/pods/SDL/SMPEG.pod +++ b/lib/pods/SDL/SMPEG.pod @@ -18,7 +18,7 @@ TODO C adds support for MPEG video to your SDL Perl application. SMPEGs are objects bound to -surfaces, whose playback is controled through the +surfaces, whose playback is controlled through the object's interface. =head2 METHODS diff --git a/lib/pods/SDL/TTF.pod b/lib/pods/SDL/TTF.pod index ebcc07ba..abc75406 100644 --- a/lib/pods/SDL/TTF.pod +++ b/lib/pods/SDL/TTF.pod @@ -107,7 +107,7 @@ Returns: C<0> on success, C<-1> on any error. my $was_init = SDL::TTF::was_init(); -Query the initilization status of the truetype font API. +Query the initialization status of the truetype font API. You may, of course, use this before L to avoid initializing twice in a row. Or use this to determine if you need to call L. @@ -456,7 +456,7 @@ Note that the first example uses the same text as in the LATIN1 example, that is Examples: - ($width, $height) = @{ SDL::TTF::size_utf8($font, 'Hallo World!') }; # plain text, if your script is in utf8 or ansi-format + ($width, $height) = @{ SDL::TTF::size_utf8($font, 'Hello World!') }; # plain text, if your script is in utf8 or ansi-format # or @@ -465,7 +465,7 @@ Examples: # or use Unicode::String; - my $unicode = utf8($data_from_somwhere); + my $unicode = utf8($data_from_somewhere); ($width, $height) = @{ SDL::TTF::size_utf8($font, $unicode->utf8) }; # utf8 via Unicode::String =head4 size_unicode @@ -481,15 +481,15 @@ C<$text> has to be: =item UTF16BE without BOM -"hallo" will look like "\0h\0a\0l\0l\0o" +"hello" will look like "\0h\0e\0l\0l\0o" =item UTF16BE with BOM -"hallo" will look like "\xFE\xFF\0h\0a\0l\0l\0o" +"hello" will look like "\xFE\xFF\0h\0e\0l\0l\0o" =item UTF16LE with BOM -"hallo" will look like "\xFF\xFEh\0a\0l\0l\0o\0" +"hello" will look like "\xFF\xFEh\0e\0l\0l\0o\0" =back @@ -532,7 +532,7 @@ Example: my $display = SDL::Video::set_video_mode(640, 480, 32, SDL_SWSURFACE); my $font = SDL::TTF::open_font('somefont.ttf', '24'); die 'Coudnt make font '. SDL::get_error if !$font; - my $surface = SDL::TTF::render_text_solid($font, 'Hallo!', SDL::Color->new(0xFF,0xFF,0xFF)); + my $surface = SDL::TTF::render_text_solid($font, 'Hello!', SDL::Color->new(0xFF,0xFF,0xFF)); SDL::Video::blit_surface($surface, SDL::Rect->new(0, 0, 640, 480), $display, SDL::Rect->new(10, 10, 640, 480)); SDL::Video::update_rect($display, 0, 0, 0, 0); SDL::delay(5000); @@ -591,7 +591,7 @@ Example: my $font = SDL::TTF::open_font('arial.ttf', '24'); my $white = SDL::Color->new(0xFF, 0xFF, 0xFF); my $black = SDL::Color->new(0x00, 0x00, 0x00); - my $surface = SDL::TTF::render_text_solid($font, 'Hallo!', $white, $black); + my $surface = SDL::TTF::render_text_solid($font, 'Hello!', $white, $black); SDL::Video::blit_surface($surface, SDL::Rect->new(0, 0, 640, 480), $display, SDL::Rect->new(10, 10, 640, 480)); SDL::Video::update_rect($display, 0, 0, 0, 0); @@ -644,7 +644,7 @@ Example: my $display = SDL::Video::set_video_mode(640, 480, 32, SDL_SWSURFACE); my $font = SDL::TTF::open_font('arial.ttf', '24'); - my $surface = SDL::TTF::render_text_blended($font, 'Hallo!', SDL::Color->new(0xFF,0xFF,0xFF)); + my $surface = SDL::TTF::render_text_blended($font, 'Hello!', SDL::Color->new(0xFF,0xFF,0xFF)); SDL::Video::blit_surface($surface, SDL::Rect->new(0, 0, 640, 480), $display, SDL::Rect->new(10, 10, 640, 480)); SDL::Video::update_rect($display, 0, 0, 0, 0); diff --git a/lib/pods/SDL/Tutorial/LunarLander.pod b/lib/pods/SDL/Tutorial/LunarLander.pod index 6b604ad3..514fd3db 100644 --- a/lib/pods/SDL/Tutorial/LunarLander.pod +++ b/lib/pods/SDL/Tutorial/LunarLander.pod @@ -146,7 +146,7 @@ So the middle section of the program will become: if ( $up{$t} ) { my $a = $up{$t}; - print "(accellerating $a m/s^2)\n"; + print "(accelerating $a m/s^2)\n"; $velocity = $velocity - $a; } diff --git a/lib/pods/SDL/Video.pod b/lib/pods/SDL/Video.pod index f90eed93..c04205f8 100644 --- a/lib/pods/SDL/Video.pod +++ b/lib/pods/SDL/Video.pod @@ -65,7 +65,7 @@ Export tag: ':video' NOTE: This option is kept for compatibility only, and is not recommended for new code. SDL_RESIZABLE Resizable surface SDL_NOFRAME No window caption or edge frame - SDL_HWACCEL Use Hardware acceleration blit + SDL_HWACCEL Use hardware acceleration blit SDL_SRCCOLORKEY Use colorkey blitting SDL_RLEACCELOK Private flag SDL_RLEACCEL Accelerated colorkey blitting with RLE @@ -90,7 +90,7 @@ Export tag ':grab' SDL_GRAB_QUERY SDL_GRAB_OFF SDL_GRAB_ON - SDL_GRAB_FULLSCREEN Used interally + SDL_GRAB_FULLSCREEN Used internally Export tag ':gl' @@ -248,7 +248,7 @@ Sets up a video mode with the specified width, height, bits-per-pixel and flags. C returns a L on success otherwise it returns undef on error, the error message is retrieved using C. -=head3 List of avalaibles flags +=head3 List of available flags =over 4 @@ -630,7 +630,7 @@ Surfaces that were previously locked using L doesn't return anything. -B: Since 1.1.8, the surface locks are recursive. See L for more information. +B: Since 1.1.8, the surface locks are recursive. See L for more information. =head2 MUSTLOCK @@ -919,7 +919,7 @@ C returns -1 on error. if( -1 == $ret ) { - print( "an error occoured" ); + print( "an error occurred" ); } else { @@ -962,7 +962,7 @@ Example: if( -1 == $ret ) { - print( "an error occoured" ); + print( "an error occurred" ); } else { diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 22b528b4..79de5b6d 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -419,20 +419,21 @@ if it is true or off otherwise. $app->sync(); + +C encapsulates the various methods of synchronizing the screen with the +current video buffer. C will do a fullscreen update, using the double buffer +or OpenGL buffer if applicable. This is preferred to calling flip on the application window. + Swaps the OpenGL buffers and does a full update of the screen with L if OpenGL is being used. -This is preferable to swapping the SDL buffers. -Otherwise, just swaps the SDL buffers using L. +This is preferable to swapping the SDL buffers. Otherwise, just swaps the SDL buffers using L. =head2 gl_attribute my $value = $app->( $attribute ); $app->gl_attribute( $attribute, $value ); -With one argument, returns the value of the specified attribute using -L. -With a value argument, sets the specified attribute -to the specified value using L. +With one argument, returns the value of the specified attribute using L. With a value argument, sets the specified attribute to the specified value using L. The attribute argument should be one of the L. See L for more details. diff --git a/lib/pods/SDLx/Controller.pod b/lib/pods/SDLx/Controller.pod index 05ea47cc..112516f7 100644 --- a/lib/pods/SDLx/Controller.pod +++ b/lib/pods/SDLx/Controller.pod @@ -157,6 +157,9 @@ Defaults to 0. You'll seldom have to set this param. =back +Please refer to each handler below for information on received arguments. +Note that the second argument every callback receives is the C object. + =head2 run $app->run; @@ -168,6 +171,11 @@ All added handlers will be called during the run loop, in this order: =over +Takes 1 argument which is a callback. The application waits for the next event with C. +When one is received, it is passed to the callback as the first argument, along with the C object as the second argument. +If the callback then returns a true value, C will return. +If the callback returns a false value, C will repeat the process. + =item 1. Events =item 2. Movements @@ -188,17 +196,12 @@ Note that the second argument every callback receives is the app object. } ); -Adds a callback to the end of the event handler list. -You can add as many subs as you need. -For each L from the user, all registered callbacks will be called in order and supplied with it. +Adds a callback to the end of the event handler list. You can add as many subs as you need. For each L from the user, all registered callbacks will be called in order and supplied with it. Returns the index of the added callback. -More specifically: events from the user will, one by one, be L into the app's L object. -This event will then be passed to all of the registered callbacks as the first argument. -The second argument is the app. +More specifically: events from the user will, one by one, be L into the app's L object. This event will then be passed to all of the registered callbacks as the first argument. The second argument is the app. -Below is an example of an event handler that sets a variable to true when the left mouse button is pressed, -and back to false when it is lifted. +Below is an example of an event handler that sets a variable to true when the left mouse button is pressed, and back to false when it is lifted. our $click = 0; diff --git a/lib/pods/SDLx/Controller/Interface.pod b/lib/pods/SDLx/Controller/Interface.pod index 5782d686..9e65d456 100644 --- a/lib/pods/SDLx/Controller/Interface.pod +++ b/lib/pods/SDLx/Controller/Interface.pod @@ -49,7 +49,7 @@ Extension, Controller =head2 set_acceleration -Allows you to set the acceleration callback for defining the inferface's +Allows you to set the acceleration callback for defining the interface's behaviour in terms of x,y and rotation. $interface->set_acceleration ( @@ -60,7 +60,7 @@ behaviour in terms of x,y and rotation. } ); -These accelerations are arbitary and can be set to any frame of reference. +These accelerations are arbitrary and can be set to any frame of reference. Your render callback will handle how to interpret it. The callback will receive the time and the current state as a @@ -115,7 +115,7 @@ Interpolate the current state =head2 evaluate -Evaluate the new currrent and previous state. +Evaluate the new current and previous state. =head2 update diff --git a/lib/pods/SDLx/Layer.pod b/lib/pods/SDLx/Layer.pod index 682dc7ee..10dfd682 100644 --- a/lib/pods/SDLx/Layer.pod +++ b/lib/pods/SDLx/Layer.pod @@ -52,7 +52,7 @@ The layer object just pass it through. my $index = $layer->index; -The method C represents the z-index ot this layer within its layermanager. +The method C represents the z-index of this layer within its layermanager. =head2 x @@ -87,7 +87,7 @@ B: SDL::Video::blit_surface( $layer->surface, $layer->clip, $destination_surface, $layer->pos ); -This method let you retrive the current or set a new surface. +This method let you retrieve the current or set a new surface. =head2 pos @@ -150,13 +150,13 @@ B: The z-index is not changed for the given layer. $layer->detach_xy( $x, $y ); -C detaches the prevously attached layer to the given coords. The upper left corner of this layer will be at C<$x> and C<$y>. +C detaches the previously attached layer to the given coords. The upper left corner of this layer will be at C<$x> and C<$y>. =head2 foreground $layer->foreground; -This method moves the given layer to the foreground so that it is blittet on top of the other layers. +This method moves the given layer to the foreground so that it is blitted on top of the other layers. =head1 BUGS diff --git a/lib/pods/SDLx/LayerManager.pod b/lib/pods/SDLx/LayerManager.pod index 1326e836..7168c56d 100644 --- a/lib/pods/SDLx/LayerManager.pod +++ b/lib/pods/SDLx/LayerManager.pod @@ -66,7 +66,7 @@ The method C returns all layers that were added before. my $layer = $layermanager->layer( $index ); -To obtain only one layer at index C<$index> use this function. C<$index> ranges from C<0> to C. +To obtain only one layer at index C<$index> use this function. C<$index> ranges from C<0> to C. =head2 length @@ -121,21 +121,21 @@ B: The z-index is not changed for the given layers. $layermanager->detach_xy( $x, $y ); -C detaches the prevously attached layers to the given coords. The upper left corner of the backmost layer will be at C<$x> and C<$y>. +C detaches the previously attached layers to the given coords. The upper left corner of the backmost layer will be at C<$x> and C<$y>. The other layers are positioned relative to the backmost layer just like before. =head2 detach_back $layermanager->detach_back( ); -C detaches the prevously attached layers back to the position where they were attached. +C detaches the previously attached layers back to the position where they were attached. =head2 foreground $layermanager->foreground( $layer ); $layermanager->foreground( @layers ); -This method moves the given layer(s) to the foreground so that they are blittet on top of the other layers. +This method moves the given layer(s) to the foreground so that they are blitted on top of the other layers. =head1 BUGS diff --git a/lib/pods/SDLx/Music.pod b/lib/pods/SDLx/Music.pod index 5b065e06..9715bdec 100644 --- a/lib/pods/SDLx/Music.pod +++ b/lib/pods/SDLx/Music.pod @@ -130,7 +130,7 @@ B do not mix use of this class with L if you wa -Creates the new music object. Inits audio with a call to L, if it isn't already (if you want more precise control over what is initialized, make sure you call L before you call thiihs method). Creates an empty default data object for object-wide defaults. If arguments are supplied, calls L with them to set up any initial data objects. Returns the new music object. +Creates the new music object. Inits audio with a call to L, if it isn't already (if you want more precise control over what is initialized, make sure you call L before you call this method). Creates an empty default data object for object-wide defaults. If arguments are supplied, calls L with them to set up any initial data objects. Returns the new music object. =head2 data @@ -149,7 +149,7 @@ With a hash of arguments: for each pair, and returns a L. Re $music->data_for( @names_or_data_objects ); -Calls L repeatedly, passing it one element of the list at a time, to initialise mulitiple empty names and/or add data objects. Returns C<$music>. +Calls L repeatedly, passing it one element of the list at a time, to initialise multiple empty names and/or add data objects. Returns C<$music>. =head2 has_data diff --git a/lib/pods/SDLx/Rect.pod b/lib/pods/SDLx/Rect.pod index 0c83af53..b9ace279 100644 --- a/lib/pods/SDLx/Rect.pod +++ b/lib/pods/SDLx/Rect.pod @@ -29,7 +29,7 @@ All C<< SDLx::Rect >> methods that change either position or size of a Rect retu =head2 ATTRIBUTES -All Rect attributes are acessors, meaning you can get them by name, and set them by passing a value: +All Rect attributes are accessors, meaning you can get them by name, and set them by passing a value: $rect->left(15); $rect->left; # 15 @@ -113,7 +113,7 @@ Same as C<> above, but moves the current Rect in place and returns nothing =head3 inflate(x, y) -Grows or shrinks the rectangle. Returns a new Rect with the size changed by the given offset. The rectangle remains centered around its current center. Negative values will return a shrinked rectangle instead. +Grows or shrinks the rectangle. Returns a new Rect with the size changed by the given offset. The rectangle remains centered around its current center. Negative values will return a shrunken rectangle instead. =head3 inflate_ip(x, y) diff --git a/lib/pods/SDLx/Sound.pod b/lib/pods/SDLx/Sound.pod index 09bcbfc2..da1a8e60 100644 --- a/lib/pods/SDLx/Sound.pod +++ b/lib/pods/SDLx/Sound.pod @@ -24,15 +24,15 @@ Extension # more sounds my %files = ( - chanell_01 => "/my_sound1.wav", - chanell_02 => "/my_sound2.ogg" + channel_01 => "/my_sound1.wav", + channel_02 => "/my_sound2.ogg" ); # times sounds bangs my %times = ( - chanell_01 => 0, # start - chanell_01 => 1256, # miliseconds - chanell_02 => 2345 + channel_01 => 0, # start + channel_01 => 1256, # milliseconds + channel_02 => 2345 ); # Load files in channels for realtime play @@ -43,17 +43,17 @@ Extension $snd->play(%times); # play loaded files at times $snd->play; # play again - # plays sound channel_01 at 578 miliseconds from now + # plays sound channel_01 at 578 milliseconds from now $snd->play('channel_01', 578); # fades sound $snd->fade('channel_02', 2345, 3456, -20); - # in a single act do the wole Sound + # in a single act do the whole Sound my $snd = SDLx::Sound->new( files => ( - chanell_01 => "/my_sound1.wav", - chanell_02 => "/my_sound2.ogg" + channel_01 => "/my_sound1.wav", + channel_02 => "/my_sound2.ogg" ), loud => ( @@ -61,19 +61,19 @@ Extension channel_02 => 75 ), times => ( - chanell_01 => 0, # start - chanell_01 => 1256, # miliseconds - chanell_02 => 2345 + channel_01 => 0, # start + channel_01 => 1256, # milliseconds + channel_02 => 2345 ), fade => ( - chanell_02 => [2345, 3456, -20] + channel_02 => [2345, 3456, -20] ) )->play(); =head1 DESCRIPTION -You can think about the SDLx::Sound at 2 aproaches. +You can think about the SDLx::Sound at 2 approaches. =over 4 @@ -83,9 +83,9 @@ You can think about the SDLx::Sound at 2 aproaches. =back -Your application will say what the best aproach. +Your application will say what the best approach. -In a taste that resembles to perl and to SDL, our SDLx:Sound hooks at SDL::Audio and SDL::Mixer with a gracefull and simple interface that can offer to monks a modern perlish way to manage sounds. +In a taste that resembles to perl and to SDL, our SDLx:Sound hooks at SDL::Audio and SDL::Mixer with a graceful and simple interface that can offer to monks a modern perlish way to manage sounds. An SDLx::Sound object can load sounds from filesystem, play it, adjust this loudness level or stops the sound. diff --git a/lib/pods/SDLx/Sprite.pod b/lib/pods/SDLx/Sprite.pod index 91105425..a195b735 100644 --- a/lib/pods/SDLx/Sprite.pod +++ b/lib/pods/SDLx/Sprite.pod @@ -105,7 +105,7 @@ Available options are: =item * image => $filename -Uses $filename as source image for the Sprite's surface. See suported +Uses $filename as source image for the Sprite's surface. See supported formats in L<< SDL::Image >>. This option B be used together with the 'surface' option (see below). diff --git a/lib/pods/SDLx/Sprite/Animated.pod b/lib/pods/SDLx/Sprite/Animated.pod index 143ad5d8..d06b0d65 100644 --- a/lib/pods/SDLx/Sprite/Animated.pod +++ b/lib/pods/SDLx/Sprite/Animated.pod @@ -43,7 +43,7 @@ Extension # just like a regular Sprite, we fetch our source rect from ->clip, # updating it on each call to ->next (or ->previous, or ->reset). - # If source rects for your animation are further appart (or less) + # If source rects for your animation are further apart (or less) # than the rect's width and height, you can adjust the animation # x/y offsets: $animation->step_x(15); diff --git a/lib/pods/SDLx/Surface.pod b/lib/pods/SDLx/Surface.pod index 9b38ba4c..ac9f7716 100644 --- a/lib/pods/SDLx/Surface.pod +++ b/lib/pods/SDLx/Surface.pod @@ -118,7 +118,7 @@ Returns the new Surface. $sdlx_surface->blit( $dest, $src_rect, $dest_rect ); Blits C onto $dest surface. -$src_rect or $dest_rect are optional. If $src_rect is ommited, it will be the size of the entire surface. If $dest_rect is ommited, +$src_rect or $dest_rect are optional. If $src_rect is omitted, it will be the size of the entire surface. If $dest_rect is omitted, it will be blitted at C<(0, 0)>. $src_rect or $dest_rect can be array refs or C. $dest can be C or C. Note that the final blit rectangle is stored in $dest_rect after clipping is performed. @@ -158,7 +158,7 @@ Returns $self $sdlx_surface->draw_rect( [$x,$y,$w,$h], 0xFFFF00FF ); $sdlx_surface->draw_rect( SDL::Rect->new($x,$y,$w,$h), 0xFFFF00FF ); -Draws a rect on the surface with the given color. If the rect is ommited, the colored rect will be drawn to the entire surface. +Draws a rect on the surface with the given color. If the rect is omitted, the colored rect will be drawn to the entire surface. Returns $self @@ -235,7 +235,7 @@ Returns $self $sdlx_surface->draw_ellipse( [ $x, $y ], $rx, $ry, $color ); Draws an unfilled ellipse centered at C<($x,$y)> with horizontal radius $rx, -vetical radius $ry and $color. +vertical radius $ry and $color. Antialias is turned on if $antialias is true. Returns $self @@ -245,7 +245,7 @@ Returns $self $sdlx_surface->draw_ellipse_filled( [ $x, $y ], $rx, $ry, $color ); Draws an B ellipse centered at C<($x,$y)> with horizontal radius $rx, -vetical radius $ry and $color. +vertical radius $ry and $color. Antialias is turned on automatically. Returns $self diff --git a/lib/pods/SDLx/Text.pod b/lib/pods/SDLx/Text.pod index d63d0cfc..02ce378e 100644 --- a/lib/pods/SDLx/Text.pod +++ b/lib/pods/SDLx/Text.pod @@ -147,7 +147,7 @@ Sets the font style to italic. Sets the font style to underline. -B: Due to libsdl design and depending on the chosen font, sometimes +B: Due to libSDL design and depending on the chosen font, sometimes the underline may be outside of the generated text surface, and thus not visible when blitted to the screen. In these cases, you should probably turn off the option and draw your own underlines in the target surface. @@ -156,7 +156,7 @@ off the option and draw your own underlines in the target surface. Sets the font style to strikethrough. -B: Due to libsdl design and depending on the chosen font, sometimes +B: Due to libSDL design and depending on the chosen font, sometimes the strikethrough may be outside of the generated text surface, and thus not visible when blitted to the screen. In these cases, you should probably turn off the option and draw your own strikethroughs in the target surface. From 906e370fe5025bb2fc188c461df719f025d13113 Mon Sep 17 00:00:00 2001 From: Mikhael Goikhman Date: Sun, 13 May 2012 14:42:28 +0300 Subject: [PATCH 061/153] remove redundant png files from pods/ --- lib/pods/SDL/Mouse.png | Bin 23629 -> 0 bytes lib/pods/SDL/Video.png | Bin 41703 -> 0 bytes lib/pods/SDL/Video_lock_surface.png | Bin 55823 -> 0 bytes lib/pods/SDL/Video_thumb.png | Bin 389 -> 0 bytes lib/pods/SDL_thumb.png | Bin 855 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lib/pods/SDL/Mouse.png delete mode 100644 lib/pods/SDL/Video.png delete mode 100644 lib/pods/SDL/Video_lock_surface.png delete mode 100644 lib/pods/SDL/Video_thumb.png delete mode 100644 lib/pods/SDL_thumb.png diff --git a/lib/pods/SDL/Mouse.png b/lib/pods/SDL/Mouse.png deleted file mode 100644 index 73b42e64d637f52845f52ead071349f4d428cee7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23629 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 diff --git a/lib/pods/SDL/Video.png b/lib/pods/SDL/Video.png deleted file mode 100644 index 921e25ffc3cd3c7757b8e1b1692e099f13d21057..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41703 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�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

&jDadwI+m+?^nL!q4T86vLN<-o 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 E0PsqlKmY&$ diff --git a/lib/pods/SDL_thumb.png b/lib/pods/SDL_thumb.png deleted file mode 100644 index 613e48fd27be84ee0a9b31b350831d8e8aeca8a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 855 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl4n1TX)LR>+D?3_~Eyh8kfYT~jg z(kc?-vi#gUA&$;7x_S=n*}Ztytoo7yA6qLiRt{Y$B@Q-rBPFFpvuFSN`{&rf0|`NX ziV_l<3i7&2N}>V+a$*vy{6d@8t^5D)--BB>s`7F}T6+nW8h_FTaunKsi$Gaq)Ev>em<@->e5Os2HIv?8bxVg zJ?;5*B}qjo330x@el~WI9v)NrdKS%_S65QvZS5^CC@9FotD~Tp7Z;Ed7n&3t9P8^> zmXX@u(K2u5jQX-tOJf^(NqGfPv1o6v>b&fhs`9?JwpmlB^tH8y`S`k6d75zYsmdw4 zYwEaIS^JvV>1!FYu&|hiUQq$2D#nr^zhDN3XE)M7oFs2|7lsa2Sq~tGv%n*=n1O*? z5QG`)Q{pEA1=&kHeO=kFu(9zPYn_Nl3;+t%dAc};NJz#W+$eZ3fT7{x|L2~Q6|^-r zH{4qJ)n|c8qo7U_!&a@O*Pez*G4JS}SN=Tq$alvOYl$|&i4JL>SQc*i?6Ap3d~$Tc zGTqkri1%MYCAKEpi+yXov@aklc&16{j2BP$eal`~{l8#?y201$ZWgy96$^|an_SWt czZR=t{;)^rN=2oEG0-Ipp00i_>zopr046{bO#lD@ From 813eba19354083d588055f0d5e694a5200e601e9 Mon Sep 17 00:00:00 2001 From: Kartik Thakore Date: Tue, 22 May 2012 14:41:22 -0400 Subject: [PATCH 062/153] Updated to 2.538 --- CHANGELOG | 5 ++--- lib/SDL.pm | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e005e2ad..7358ea80 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,7 +2,8 @@ Revision history for Perl extension SDL_perl. Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) -* 2.537_03 Apr 12 2012 +* 2.538 May 22 2012 + - Pod updates [mig0] - SDLx::App made the docs a lot better [Blaizer] - SDLx::App changed around shortcut names in the constructor [Blaizer] - SDLx::App added and improved parameters of the constructor, see docs [Blaizer] @@ -22,8 +23,6 @@ Versioning rule: public releases are even numbers, dev releases are odd. (same l - SDLx::Controller added time and sleep methods to replace get_ticks and delay [Blaizer] - SDLx::Controller added some tests for pausing and events [Blaizer] - SDLx::Controller removed current_time parameter [Blaizer] - -* 2.537_02 Feb 13 2012 - t/core_cd.t: gnu hurd 0.3 handles devices like cdrom strange (skipping tests) [FROGGS] - t/sdlx_fps.t: seems better to try to get 5 fps (slow vm's) [FROGGS] - SDLx::Controller::Interface: weaken tests [FROGGS] diff --git a/lib/SDL.pm b/lib/SDL.pm index 3189b995..1476c094 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.537_02'; +our $VERSION = '2.538'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); From d67b4da05d6549bb4be7769e137eb94328a474a1 Mon Sep 17 00:00:00 2001 From: Christian Walde Date: Sat, 14 Mar 2015 16:09:54 +0100 Subject: [PATCH 063/153] integrate some changes blaizer did in the merge of the typo fixes --- CHANGELOG | 2 +- lib/pods/SDL/Events.pod | 11 +++++------ lib/pods/SDLx/App.pod | 6 ------ lib/pods/SDLx/Controller.pod | 9 --------- 4 files changed, 6 insertions(+), 22 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 7358ea80..a1843f99 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,7 +3,7 @@ Revision history for Perl extension SDL_perl. Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) * 2.538 May 22 2012 - - Pod updates [mig0] + - Pod updates [mig0] - SDLx::App made the docs a lot better [Blaizer] - SDLx::App changed around shortcut names in the constructor [Blaizer] - SDLx::App added and improved parameters of the constructor, see docs [Blaizer] diff --git a/lib/pods/SDL/Events.pod b/lib/pods/SDL/Events.pod index 2d56423a..070bd7df 100644 --- a/lib/pods/SDL/Events.pod +++ b/lib/pods/SDL/Events.pod @@ -1,4 +1,3 @@ - =head1 NAME SDL::Events - Bindings to the Events Category in SDL API @@ -225,10 +224,10 @@ Checks the event queue for messages and optionally returns them. If action is SDL_ADDEVENT, up to num_events events will be added to the back of the event queue. -If action is SDL_PEEKEVENT, up to num_events events at the front of the event queue, matching mask, will be returned and will not be removed from +If action is SDL_PEEKEVENT, up to num_events events at the front of the event queue, matching mask, will be returned and will not be removed from the queue. -If action is SDL_GETEVENT, up to num_events events at the front of the event queue, matching mask, will be returned and will be removed from the +If action is SDL_GETEVENT, up to num_events events at the front of the event queue, matching mask, will be returned and will be removed from the queue. The mask parameter is a bitwise OR of SDL::Events::SDL_EVENTMASK(event_type), for all event types you are interested in @@ -315,7 +314,7 @@ set_event_filter takes a coderef that it checks all events again. The callback g to filter the event return a 0, to pass the filter return a 1. -One B is if you are filtering SDL_QUIT the event will be filtered if it is non-interrupt call ( Window closes normally ). If it is a +One B is if you are filtering SDL_QUIT the event will be filtered if it is non-interrupt call ( Window closes normally ). If it is a interrupt SDL_QUIT it will be process on the next event poll. Events pushed onto to the queue with L or L @@ -467,7 +466,7 @@ Enable/Disable UNICODE translation $previous_translation_mode = SDL::Events::enable_unicode( 0 ); #disables To obtain the character codes corresponding to received keyboard events, Unicode translation must first be turned on using this function. The -translation incurs a slight overhead for each keyboard event and is therefore disabled by default. For each subsequently received key down event, +translation incurs a slight overhead for each keyboard event and is therefore disabled by default. For each subsequently received key down event, the unicode member of the L provided structure will be then contain the corresponding character code, or otherwise zero. @@ -483,7 +482,7 @@ Sets keyboard repeat rate my $success = SDL::Events::enable_key_repeat( $delay, $interval ); -Enables or disables the keyboard repeat rate. $delay specifies how long the key must be pressed before it begins repeating, it then repeats at the +Enables or disables the keyboard repeat rate. $delay specifies how long the key must be pressed before it begins repeating, it then repeats at the speed specified by $interval. Both $delay and $interval are expressed in milliseconds. Setting $delay to 0 disables key repeating completely. Good default values are SDL_DEFAULT_REPEAT_DELAY and SDL_DEFAULT_REPEAT_INTERVAL. diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 79de5b6d..3037e1a7 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -1,4 +1,3 @@ - =pod =head1 NAME @@ -419,11 +418,6 @@ if it is true or off otherwise. $app->sync(); - -C encapsulates the various methods of synchronizing the screen with the -current video buffer. C will do a fullscreen update, using the double buffer -or OpenGL buffer if applicable. This is preferred to calling flip on the application window. - Swaps the OpenGL buffers and does a full update of the screen with L if OpenGL is being used. This is preferable to swapping the SDL buffers. Otherwise, just swaps the SDL buffers using L. diff --git a/lib/pods/SDLx/Controller.pod b/lib/pods/SDLx/Controller.pod index 112516f7..50464d8a 100644 --- a/lib/pods/SDLx/Controller.pod +++ b/lib/pods/SDLx/Controller.pod @@ -1,4 +1,3 @@ - =head1 NAME SDLx::Controller - Handles the loops for events, movement and rendering @@ -157,9 +156,6 @@ Defaults to 0. You'll seldom have to set this param. =back -Please refer to each handler below for information on received arguments. -Note that the second argument every callback receives is the C object. - =head2 run $app->run; @@ -171,11 +167,6 @@ All added handlers will be called during the run loop, in this order: =over -Takes 1 argument which is a callback. The application waits for the next event with C. -When one is received, it is passed to the callback as the first argument, along with the C object as the second argument. -If the callback then returns a true value, C will return. -If the callback returns a false value, C will repeat the process. - =item 1. Events =item 2. Movements From 1d722e07dfcb37dc06e151afab8c5d3002ece0d6 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sat, 26 May 2012 10:56:34 -0400 Subject: [PATCH 064/153] Add new changelog entry --- CHANGELOG | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index a1843f99..d564b0f3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,9 @@ Revision history for Perl extension SDL_perl. Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) +* + - Removed all non-pod changes introduced in 2.538 [jtpalmer] + * 2.538 May 22 2012 - Pod updates [mig0] - SDLx::App made the docs a lot better [Blaizer] From d595424406378d8f1bb8ba46395d4ff99fe4b04f Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sat, 26 May 2012 11:00:27 -0400 Subject: [PATCH 065/153] fixed bugtracker link --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index d564b0f3..430859bf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ Versioning rule: public releases are even numbers, dev releases are odd. (same l * - Removed all non-pod changes introduced in 2.538 [jtpalmer] + - Fixed bugtracker link [FROGGS] * 2.538 May 22 2012 - Pod updates [mig0] From 46e98e309bb6040376c9b656db60f144f46f43a0 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sat, 26 May 2012 11:00:58 -0400 Subject: [PATCH 066/153] Update changelog --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 430859bf..34a7a46c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,7 @@ Versioning rule: public releases are even numbers, dev releases are odd. (same l * - Removed all non-pod changes introduced in 2.538 [jtpalmer] - Fixed bugtracker link [FROGGS] + - Added SDL::Platform pod [pktm] * 2.538 May 22 2012 - Pod updates [mig0] From 3ae9fce07fd9c72a91d6e3df184494efdf78fa62 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sun, 10 Jun 2012 01:38:08 +0930 Subject: [PATCH 067/153] Release 2.540. Author: jtpalmer Conflicts: lib/SDL.pm --- CHANGELOG | 2 +- lib/SDL.pm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 34a7a46c..81cab88d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,7 +2,7 @@ Revision history for Perl extension SDL_perl. Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) -* +* 2.540 May 26 2012 - Removed all non-pod changes introduced in 2.538 [jtpalmer] - Fixed bugtracker link [FROGGS] - Added SDL::Platform pod [pktm] diff --git a/lib/SDL.pm b/lib/SDL.pm index 1476c094..0593ba5c 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.538'; +our $VERSION = '2.540'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); From 5d3d386b3e47fe21171e21186fa34a4d3c5374e3 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sat, 26 May 2012 16:07:05 -0400 Subject: [PATCH 068/153] Dev release 2.541_01 --- CHANGELOG | 7 +++++++ lib/SDL.pm | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 81cab88d..f34c1787 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,13 @@ Revision history for Perl extension SDL_perl. Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) +* 2.541_01 May 26 2012 + - SDL::GFX::ImageFilter: turn off MMX [FROGGS] + - SDLx::App: removed return from stash lvalue sub [FROGGS] + - SDL::Constants: added constants for SDL_DEFAULT_REPEAT_DELAY and SDL_DEFAULT_REPEAT_INTERVAL [FROGGS] + - SDL::Mixer::Channels: little change for setting context, still not perfect [FROGGS] + - t/mixer_music.t: using ogg files [FROGGS] + * 2.540 May 26 2012 - Removed all non-pod changes introduced in 2.538 [jtpalmer] - Fixed bugtracker link [FROGGS] diff --git a/lib/SDL.pm b/lib/SDL.pm index 0593ba5c..7b2447ab 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.540'; +our $VERSION = '2.541_01'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); From cba7c8bb5c0928289d1c99b9e01c7194c82a836f Mon Sep 17 00:00:00 2001 From: Dominique Dumont Date: Sun, 27 May 2012 17:37:57 +0200 Subject: [PATCH 069/153] Display of centered text was wrong: the first line was drawn offcenter on the left. Each consecutive line was drawn even more on the left. Like that: Hello world This patch fixes the centered text. --- lib/SDLx/Text.pm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/SDLx/Text.pm b/lib/SDLx/Text.pm index 4e90c839..e4dfd948 100644 --- a/lib/SDLx/Text.pm +++ b/lib/SDLx/Text.pm @@ -342,16 +342,20 @@ sub write_xy { foreach my $i ( 0 .. $#{$surfaces}) { if (my $surface = $surfaces->[$i]) { + my $tx ; $y += ($linebreaks * $surface->h); $linebreaks = 0; if ($self->{h_align} eq 'center' ) { # $x = ($target->w / 2) - ($surface->w / 2); - $x -= $surface->w / 2; + $tx = $x + ($self->w -$surface->w) / 2; } elsif ($self->{h_align} eq 'right' ) { # $x = $target->w - $surface->w; - $x -= $surface->w; + $tx = $x + $self->w - $surface->w; + } + else { + $tx = $x ; } # blit the shadow @@ -361,14 +365,14 @@ sub write_xy { SDL::Video::blit_surface( $shadow, SDL::Rect->new(0,0,$shadow->w, $shadow->h), - $target, SDL::Rect->new($x + $offset, $y + $offset, 0, 0) + $target, SDL::Rect->new($tx + $offset, $y + $offset, 0, 0) ); } # blit the text SDL::Video::blit_surface( $surface, SDL::Rect->new(0,0,$surface->w, $surface->h), - $target, SDL::Rect->new($x, $y, 0, 0) + $target, SDL::Rect->new($tx, $y, 0, 0) ); } $linebreaks++; From ad7b3a6dc1e069c3c24eb14c843190272488a264 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sun, 27 May 2012 12:27:21 -0400 Subject: [PATCH 070/153] Updated changelog --- CHANGELOG | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index f34c1787..f09d4140 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,9 @@ Revision history for Perl extension SDL_perl. Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) +* + - SDLx::Test: fixed centering multi-line text [dod] + * 2.541_01 May 26 2012 - SDL::GFX::ImageFilter: turn off MMX [FROGGS] - SDLx::App: removed return from stash lvalue sub [FROGGS] From dda7d877e5bc7879ece8cbd22fe0d41d5c7be262 Mon Sep 17 00:00:00 2001 From: Mikhael Goikhman Date: Sun, 13 May 2012 16:20:05 +0300 Subject: [PATCH 071/153] strip pods/ subdir from pod files on build --- inc/My/Builder.pm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/inc/My/Builder.pm b/inc/My/Builder.pm index 040e7e26..27391c7d 100644 --- a/inc/My/Builder.pm +++ b/inc/My/Builder.pm @@ -152,6 +152,18 @@ sub set_file_flags { $self->notes( 'file_flags' => \%file_flags ); } +sub process_pod_files { + my ($self, $ext) = @_; + + my $method = "find_${ext}_files"; + my $files = $self->_find_file_by_type($ext, 'lib'); + + while (my ($file, $dest) = each %$files) { + $dest =~ s!^lib/\Kpods/!!; + $self->copy_if_modified(from => $file, to => File::Spec->catfile($self->blib, $dest) ); + } +} + # override the following functions in My::Builder:: if necessary sub ACTION_build { my $self = shift; From d39135a4f65c4bb7abbf9d4ca9fab62d831c80be Mon Sep 17 00:00:00 2001 From: Mikhael Goikhman Date: Sun, 13 May 2012 16:31:11 +0300 Subject: [PATCH 072/153] cleanup the last commit --- inc/My/Builder.pm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/inc/My/Builder.pm b/inc/My/Builder.pm index 27391c7d..304cc148 100644 --- a/inc/My/Builder.pm +++ b/inc/My/Builder.pm @@ -155,12 +155,10 @@ sub set_file_flags { sub process_pod_files { my ($self, $ext) = @_; - my $method = "find_${ext}_files"; my $files = $self->_find_file_by_type($ext, 'lib'); - while (my ($file, $dest) = each %$files) { $dest =~ s!^lib/\Kpods/!!; - $self->copy_if_modified(from => $file, to => File::Spec->catfile($self->blib, $dest) ); + $self->copy_if_modified(from => $file, to => File::Spec->catfile($self->blib, $dest)); } } From 6eab40bd7906f1327d3c7f7420cb25a62144eed6 Mon Sep 17 00:00:00 2001 From: Mikhael Goikhman Date: Sun, 13 May 2012 16:50:31 +0300 Subject: [PATCH 073/153] make fill_rect accept 0 for Rect and accept h==0||w==0 for the same --- src/Core/Video.xs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Core/Video.xs b/src/Core/Video.xs index 8efa4b4a..c9f3403a 100644 --- a/src/Core/Video.xs +++ b/src/Core/Video.xs @@ -422,11 +422,19 @@ save_BMP ( surface, filename ) RETVAL int -fill_rect ( dest, dest_rect, pixel ) +fill_rect ( dest, dest_rect_bag, pixel ) SDL_Surface *dest - SDL_Rect *dest_rect + SV *dest_rect_bag Uint32 pixel CODE: + SDL_Rect *dest_rect = NULL; + + if (SvOK(dest_rect_bag)) + dest_rect = (SDL_Rect *)bag2obj(dest_rect_bag); + + if (dest_rect && (!dest_rect->w || !dest_rect->h)) + dest_rect = NULL; + RETVAL = SDL_FillRect(dest,dest_rect,pixel); OUTPUT: RETVAL From f7f0f59b966788520be0cc8876095b140ac2520c Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sun, 27 May 2012 14:33:28 -0400 Subject: [PATCH 074/153] Update changelog --- CHANGELOG | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index f09d4140..d954f6ef 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,8 @@ Revision history for Perl extension SDL_perl. Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) * + - inc/My/Builder.pm: strip pods/ subdir from pod files on build [mig0] + - SDL::Video: fill_rect now accepts 0 or undef for dest_rect, as well as a rect with h == 0 or w == 0 to mean the whole surface [mig0] - SDLx::Test: fixed centering multi-line text [dod] * 2.541_01 May 26 2012 From 4ffd417ee25b22e803995c31f9b9edc659dde7a0 Mon Sep 17 00:00:00 2001 From: Mikhael Goikhman Date: Tue, 29 May 2012 19:33:41 +0300 Subject: [PATCH 075/153] redo regexp without \K, not to require 5.10.0 --- inc/My/Builder.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/My/Builder.pm b/inc/My/Builder.pm index 304cc148..29e4e01c 100644 --- a/inc/My/Builder.pm +++ b/inc/My/Builder.pm @@ -157,7 +157,7 @@ sub process_pod_files { my $files = $self->_find_file_by_type($ext, 'lib'); while (my ($file, $dest) = each %$files) { - $dest =~ s!^lib/\Kpods/!!; + $dest =~ s!^(lib/)pods/!$1!; $self->copy_if_modified(from => $file, to => File::Spec->catfile($self->blib, $dest)); } } From 399ccafb3eff11ca71fbd685a3b683be6be14929 Mon Sep 17 00:00:00 2001 From: Mikhael Goikhman Date: Tue, 29 May 2012 19:59:36 +0300 Subject: [PATCH 076/153] fix small English errors in pods --- lib/pods/SDL/Event.pod | 4 ++-- lib/pods/SDL/RWOps.pod | 2 +- lib/pods/SDL/Video.pod | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/pods/SDL/Event.pod b/lib/pods/SDL/Event.pod index 9d2d3020..e2e0fd2d 100644 --- a/lib/pods/SDL/Event.pod +++ b/lib/pods/SDL/Event.pod @@ -56,7 +56,7 @@ and it is then up to the application to process the information stored with them =head2 new -C creates an empty event-object, which can be used store information. +C creates an empty event-object, which can be used to store information. Either by calling C that transfers one event from the queue into our object or by setting all the needed data manually in order to push the event to the queue. @@ -329,7 +329,7 @@ If the high 9 bits of the character are 0, then this maps to the equivalent ASCI print("An International Character.\n"); } -UNICODE translation does create a slight overhead so don't enable it unless its needed. +UNICODE translation does create a slight overhead, so don't enable it unless it's needed. NOTE: Key release events (SDL_KEYUP) won't necessarily (ever?) contain unicode information. See L diff --git a/lib/pods/SDL/RWOps.pod b/lib/pods/SDL/RWOps.pod index 57ecec6f..7458e17d 100644 --- a/lib/pods/SDL/RWOps.pod +++ b/lib/pods/SDL/RWOps.pod @@ -112,7 +112,7 @@ Note: You must free any memory allocated with SDL::alloc_rw with SDL::free_rw. =head2 free_rw(context) SDL::free_rw frees an SDL::RWOps structure previously allocated by SDL::alloc_rw. Only use it on memory allocated by SDL::alloc_rw. -It doesn't returns anything. +It doesn't return anything. =head2 rw_seek(ctx,offset,whence) diff --git a/lib/pods/SDL/Video.pod b/lib/pods/SDL/Video.pod index c04205f8..f8a357f0 100644 --- a/lib/pods/SDL/Video.pod +++ b/lib/pods/SDL/Video.pod @@ -649,7 +649,7 @@ rectangle will be drawn into. The rectangle pointed to by rect will be clipped to the edges of the surface so that the clip rectangle for a surface can never fall outside the edges of the surface. If rect is NULL the clipping rectangle will be set to the full size of the surface. -C doesn't returns anything. +C doesn't return anything. =head2 get_clip_rect @@ -658,7 +658,7 @@ C doesn't returns anything. Gets the clipping rectangle for the given L. When this surface is the destination of a blit, only the area within the clip rectangle is drawn into. The rectangle pointed to by rect will be filled with the clipping rectangle of the surface. -C doesn't returns anything; +C doesn't return anything; use SDL; use SDL::Video; @@ -693,7 +693,7 @@ with OpenGL. The results of blitting operations vary greatly depending on whether C is set or not. See L for an explanation of how this affects your results. Colorkeying and alpha attributes also interact with surface blitting. -C doesn't returns anything. +C doesn't return anything. For an example see L. @@ -703,7 +703,7 @@ For an example see L. Makes sure the given area is updated on the given screen. The rectangle must be confined within the screen boundaries because there's no clipping. -update_rect doesn't returns any value. +update_rect doesn't return any value. B: This function should not be called while screen is locked by L @@ -717,7 +717,7 @@ For an example see L Makes sure the given list of rectangles is updated on the given screen. The rectangle must be confined within the screen boundaries because there's no clipping. -C doesn't returns any value. +C doesn't return any value. B: This function should not be called while screen is locked by L. @@ -1189,7 +1189,7 @@ Example: SDL::Video::GL_swap_buffers(); Swap the OpenGL buffers, if double-buffering is supported. -C doesn't returns any value. +C doesn't return any value. =head1 Video Overlay Functions From d88b450f518cba1618f6ad14e2bfed7a75a3651d Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Wed, 30 May 2012 19:34:46 -0400 Subject: [PATCH 077/153] Update changelog --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index d954f6ef..105cddb9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ Revision history for Perl extension SDL_perl. Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) * + - Pod updates [mig0] - inc/My/Builder.pm: strip pods/ subdir from pod files on build [mig0] - SDL::Video: fill_rect now accepts 0 or undef for dest_rect, as well as a rect with h == 0 or w == 0 to mean the whole surface [mig0] - SDLx::Test: fixed centering multi-line text [dod] From e7bee6000f664c9dd1a46a7536656ce21a3a4ffd Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Wed, 30 May 2012 19:47:29 -0400 Subject: [PATCH 078/153] Change SDL-Platform to SDL::Platform --- lib/pods/SDL/Platform.pod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pods/SDL/Platform.pod b/lib/pods/SDL/Platform.pod index 11656118..befc9537 100644 --- a/lib/pods/SDL/Platform.pod +++ b/lib/pods/SDL/Platform.pod @@ -3,7 +3,7 @@ =head1 NAME -SDL-Platform - Platform Specific Informations about SDL Perl +SDL::Platform - Platform Specific Informations about SDL Perl =head1 CATEGORY From e09a6663369248aa8e6e1d1e7debdfa323901ad6 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Wed, 30 May 2012 19:47:40 -0400 Subject: [PATCH 079/153] Whitespace removal --- lib/pods/SDL/Platform.pod | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/pods/SDL/Platform.pod b/lib/pods/SDL/Platform.pod index befc9537..d71a5094 100644 --- a/lib/pods/SDL/Platform.pod +++ b/lib/pods/SDL/Platform.pod @@ -9,7 +9,6 @@ SDL::Platform - Platform Specific Informations about SDL Perl Documentation - =head1 DESCRIPTION This document describes OS specific informations regading the installation and use of L. @@ -23,11 +22,9 @@ On Windows, L will get you zip-files containing prebuilt libs. On Unixes you can choose between compiling libs or use libs provided by the dist. The different options on Unixes are availale when requirements are met. Like having specific libs installed. -There is some additional documentation in the L. +There is some additional documentation in the L. You definitively want to look there, if you want to know how to install L from the latest sources (e.g. in an unfinished, unreleased state). - - =head1 Windows =head2 Installation @@ -38,8 +35,6 @@ Once you installed Strawberry Perl, you can access the cpan shell via the start Open up the cpan shell and type C. Please follow the dialog and answer the questions to the best of your knowledge. - - =head1 Mac OS X =head2 Installation @@ -56,7 +51,7 @@ When you install L, a program named C is installed. It should be i Using Mac OS X, your SDL Perl script have to look like this: #!SDLPerl - + use strict; use warnings; use SDL; From 85ef36f9327ff7bdd6966139d711eed087488207 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Wed, 30 May 2012 19:49:13 -0400 Subject: [PATCH 080/153] Change SDL_perl to SDL --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 105cddb9..6738a59e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -Revision history for Perl extension SDL_perl. +Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) From 72f075f1c7401083dd80a978905539d5e7bf063b Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Thu, 31 May 2012 17:21:21 -0400 Subject: [PATCH 081/153] Add Module::Build as a configure requirement --- Build.PL | 1 + CHANGELOG | 1 + 2 files changed, 2 insertions(+) diff --git a/Build.PL b/Build.PL index 2c34d3fa..aed6df73 100644 --- a/Build.PL +++ b/Build.PL @@ -568,6 +568,7 @@ my $build = $package->new( license => 'lgpl', dist_version_from => 'lib/SDL.pm', configure_requires => { + 'Module::Build' => '0', 'ExtUtils::CBuilder' => '0.260301', 'Alien::SDL' => '1.426', 'File::Find' => '0', diff --git a/CHANGELOG b/CHANGELOG index 6738a59e..ee9703bc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) * + - Added Module::Build to configure requirements [jtpalmer] - Pod updates [mig0] - inc/My/Builder.pm: strip pods/ subdir from pod files on build [mig0] - SDL::Video: fill_rect now accepts 0 or undef for dest_rect, as well as a rect with h == 0 or w == 0 to mean the whole surface [mig0] From 5a88d8694c387dfe52ce36452cd7d8c8154e3b0c Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sat, 2 Jun 2012 10:32:29 -0400 Subject: [PATCH 082/153] Fix name of the ogg test --- CHANGELOG | 1 + t/mixer_music.t | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index ee9703bc..e24cf719 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) * + - t/mixer_music.t: fixed ogg test name [jtpalmer] - Added Module::Build to configure requirements [jtpalmer] - Pod updates [mig0] - inc/My/Builder.pm: strip pods/ subdir from pod files on build [mig0] diff --git a/t/mixer_music.t b/t/mixer_music.t index 9e6f7bc3..b0293d11 100644 --- a/t/mixer_music.t +++ b/t/mixer_music.t @@ -114,7 +114,7 @@ SKIP: my $sample_music_rw = SDL::Mixer::Music::load_MUS_RW( $rw ); isa_ok( $sample_music_rw, 'SDL::Mixer::MixMusic', '[load_MUS_RW]' ); is( SDL::Mixer::Music::play_music( $sample_music_rw, 0 ), - 0, "[play_music_rw] plays $wav_test_file" + 0, "[play_music_rw] plays $ogg_test_file" ); } From 47db7a0ebe74f4e466da92cf4f1ffb9f2f61f9f7 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Thu, 7 Jun 2012 17:12:50 -0400 Subject: [PATCH 083/153] Updated license --- COPYING | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/COPYING b/COPYING index 191a97fe..643ab665 100644 --- a/COPYING +++ b/COPYING @@ -1,15 +1,15 @@ - GNU LIBRARY GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] - Preamble + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -99,7 +99,7 @@ works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. - GNU LIBRARY GENERAL PUBLIC LICENSE + GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which @@ -411,7 +411,7 @@ decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - NO WARRANTY + NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. @@ -434,4 +434,4 @@ FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - END OF TERMS AND CONDITIONS + END OF TERMS AND CONDITIONS From d1105f28205675b1b8454bf8db1a4b10696642e9 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sun, 10 Jun 2012 02:01:48 +0930 Subject: [PATCH 084/153] Files that shouldn't be changed by this branch put back to the version in the experimental branch --- lib/SDLx/Music.pm | 9 ++------ lib/SDLx/Surface.pm | 55 ++++++--------------------------------------- t/sdlx_surface.t | 4 ++-- 3 files changed, 11 insertions(+), 57 deletions(-) diff --git a/lib/SDLx/Music.pm b/lib/SDLx/Music.pm index 695f1383..8f1f7fd9 100644 --- a/lib/SDLx/Music.pm +++ b/lib/SDLx/Music.pm @@ -45,8 +45,7 @@ sub new { sub data { my $self = shift; - - return $self->{data} if $#_ == -1; + return if $#_ < 0; return $self->{data}->{ $_[0] } if $#_ == 0; my %data = @_; @@ -93,11 +92,7 @@ sub play { my %override = @_; return unless defined $play_data; - - if ( ref $play_data eq '') { - $play_data = $self->{data}->{$play_data}; - } - + my $volume = $play_data->{volume} || $override{volume} || 50; my $fade_in = $play_data->{fade_in} || $override{fade_in} || 0; my $loops = $play_data->{loops} || $override{loops} || 1; diff --git a/lib/SDLx/Surface.pm b/lib/SDLx/Surface.pm index ddab420b..a2e9ce6e 100644 --- a/lib/SDLx/Surface.pm +++ b/lib/SDLx/Surface.pm @@ -123,7 +123,9 @@ sub get_pixel { sub set_pixel { my ( $self, $y, $x, $new_value ) = @_; + $new_value = SDLx::Validate::num_rgba($new_value); + SDLx::Surface::set_pixel_xs( $self, $x, $y, $new_value ); } @@ -188,8 +190,6 @@ sub load { } } - - my $formated_surface = $surface; if( SDL::Video::get_video_surface ) { @@ -201,33 +201,6 @@ sub load { #EXTENSTIONS -sub blit { - my ( $src, $dest, $src_rect, $dest_rect ) = @_; - - $src = SDLx::Validate::surface($src); - $dest = SDLx::Validate::surface($dest); - - if(defined $src_rect) { - $src_rect = SDLx::Validate::rect($src_rect); - } - else { - $src_rect = SDL::Rect->new( 0, 0, $src->w, $src->h ); - } - if(defined $dest_rect) { - $dest_rect = SDLx::Validate::rect($dest_rect); - } - else { - $dest_rect = SDL::Rect->new( 0, 0, $dest->w, $dest->h ); - } - - SDL::Video::blit_surface( - $src, $src_rect, - $dest, $dest_rect - ); - - return $src; -} - sub blit_by { my ( $dest, $src, $src_rect, $dest_rect ) = @_; SDLx::Surface::blit( $src, $dest, $src_rect, $dest_rect ); @@ -245,13 +218,13 @@ sub update { my ( $surface, $rects ) = @_; if ( !defined($rects) || ( ref($rects) eq 'ARRAY' && !ref( $rects->[0] ) ) ) { - my @rect; - @rect = @{$rects} if $rects; + my @rect; + @rect = @{$rects} if $rects; $rect[0] ||= 0; $rect[1] ||= 0; $rect[2] ||= $surface->w; $rect[3] ||= $surface->h; - + SDL::Video::update_rect( $surface, @rect ); } else { SDL::Video::update_rects( $surface, map { SDLx::Validate::rect($_) } @{$rects} ); @@ -260,20 +233,6 @@ sub update { return $surface; } -sub draw_rect { - my ( $self, $rect, $color ) = @_; - $color = SDLx::Validate::map_rgba( $color, $self->format ); - if ( defined $rect ) { - $rect = SDLx::Validate::rect($rect); - } else { - $rect = SDL::Rect->new( 0, 0, $self->w, $self->h ); - } - - SDL::Video::fill_rect( $self, $rect, $color ) - and Carp::confess "Error drawing rect: " . SDL::get_error(); - return $self; -} - sub draw_line { my ( $self, $start, $end, $color, $antialias ) = @_; @@ -314,7 +273,7 @@ sub draw_circle { unless( $antialias ) { - SDL::GFX::Primitives::circle_color( $self, @{$center}, $radius, $color ); + SDL::GFX::Primitives::circle_color( $self, @{$center}, $radius, $color ); } else { @@ -324,7 +283,7 @@ sub draw_circle { } sub draw_circle_filled { - my ( $self, $center, $radius, $color ) = @_; + my ( $self, $center, $radius, $color) = @_; unless ( SDL::Config->has('SDL_gfx_primitives') ) { Carp::cluck("SDL_gfx_primitives support has not been compiled"); diff --git a/t/sdlx_surface.t b/t/sdlx_surface.t index 8d1e8839..b524c92c 100644 --- a/t/sdlx_surface.t +++ b/t/sdlx_surface.t @@ -216,12 +216,12 @@ SKIP: pass 'draw_trigon_filled works'; } - is( $surfs[0]->draw_polygon( [ [100, 10], [110, 10], [110, 20] ], [ 255, 0, 0, 255 ], 1 ), $surfs[0], 'draw_polygon returns self' ); + is( $surfs[0]->draw_polygon( [ [100, 10], [110, 10], [110, 20] ], [ 255, 0, 0, 255 ] ), $surfs[0], 'draw_polygon returns self' ); is( $surfs[0]->draw_polygon_filled( [ [100, 10], [110, 10], [110, 20] ], [ 255, 0, 0, 255 ] ), $surfs[0], 'draw_polygon_filled returns self' ); foreach my $color (@colors_t) { my $color = [ 255, 0, 0, 255 ]; my $verts = [ [100, 10], [110, 10], [110, 20], [100, 20] ]; - $surfs[0]->draw_polygon( $verts, $color, 0 ); #no fill + $surfs[0]->draw_polygon( $verts, $color ); #no fill $surfs[0]->draw_polygon( $verts, $color, 1 ); $surfs[0]->draw_polygon_filled( $verts, $color ); #fill isnt( $surfs[0]->[100][10], 0 ); From 38df83976857f192e3cb84dba4e480a9a8746ddf Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sat, 9 Jun 2012 13:50:22 -0400 Subject: [PATCH 085/153] Dev release 2.541_02 --- CHANGELOG | 3 ++- lib/SDL.pm | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e24cf719..b456d547 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,7 +2,8 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) -* +* 2.541_02 Jun 09 2012 + - Added changes that were removed in 2.540 [Blaizer] - t/mixer_music.t: fixed ogg test name [jtpalmer] - Added Module::Build to configure requirements [jtpalmer] - Pod updates [mig0] diff --git a/lib/SDL.pm b/lib/SDL.pm index 7b2447ab..21696a87 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.541_01'; +our $VERSION = '2.541_02'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); From 9f45fec4ef20212d3af5c9de740c7d4ac29d1733 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sun, 10 Jun 2012 13:27:15 -0400 Subject: [PATCH 086/153] Bumped Alien::SDL version --- Build.PL | 2 +- CHANGELOG | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Build.PL b/Build.PL index aed6df73..7defd908 100644 --- a/Build.PL +++ b/Build.PL @@ -570,7 +570,7 @@ my $build = $package->new( configure_requires => { 'Module::Build' => '0', 'ExtUtils::CBuilder' => '0.260301', - 'Alien::SDL' => '1.426', + 'Alien::SDL' => '1.434', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', diff --git a/CHANGELOG b/CHANGELOG index b456d547..a464a25b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,9 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) +* + - Updated Alien::SDL's version to 1.434 [jtpalmer] + * 2.541_02 Jun 09 2012 - Added changes that were removed in 2.540 [Blaizer] - t/mixer_music.t: fixed ogg test name [jtpalmer] From 0d70796f40c0244ca7ea1ad98e5cd290e26c132b Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Sun, 3 Jun 2012 17:52:19 +0200 Subject: [PATCH 087/153] declarations before code --- src/Core/Audio.xs | 44 +-- src/Core/Events.xs | 13 +- src/Core/Joystick.xs | 21 +- src/Core/Time.xs | 31 +- src/Core/Video.xs | 109 +++--- src/Core/objects/AudioSpec.xs | 52 +-- src/Core/objects/Cursor.xs | 20 +- src/Core/objects/Event.xs | 599 +++++++++++++------------------ src/Core/objects/Palette.xs | 3 +- src/Core/objects/Surface.xs | 8 +- src/GFX/Primitives.xs | 9 +- src/Mixer/Channels.xs | 22 +- src/SDL.xs | 21 +- src/SDLx/Controller/Interface.xs | 76 ++-- src/SDLx/Layer.xs | 2 +- src/SDLx/LayerManager.xs | 132 ++++--- src/SDLx/Surface.xs | 61 ++-- src/SDLx/Validate.h | 45 ++- src/helper.h | 51 ++- typemap | 14 +- 20 files changed, 661 insertions(+), 672 deletions(-) diff --git a/src/Core/Audio.xs b/src/Core/Audio.xs index c81944bf..c3c8293e 100644 --- a/src/Core/Audio.xs +++ b/src/Core/Audio.xs @@ -13,7 +13,7 @@ MODULE = SDL::Audio PACKAGE = SDL::Audio PREFIX = audio_ int -audio_open ( desired, obtained ) +audio_open( desired, obtained ) SDL_AudioSpec *desired SDL_AudioSpec *obtained CODE: @@ -22,20 +22,20 @@ audio_open ( desired, obtained ) RETVAL void -audio_pause ( pause_on ) +audio_pause( pause_on ) int pause_on CODE: SDL_PauseAudio(pause_on); Uint32 -audio_get_status () +audio_get_status() CODE: RETVAL = SDL_GetAudioStatus (); OUTPUT: RETVAL void -audio_lock () +audio_lock() CODE: SDL_LockAudio(); @@ -45,20 +45,19 @@ audio_unlock () SDL_UnlockAudio(); AV * -audio_load_wav ( filename, spec ) +audio_load_wav( filename, spec ) char *filename SDL_AudioSpec *spec - CODE: - SDL_AudioSpec *temp = safemalloc(sizeof(SDL_AudioSpec)); + PREINIT: + SDL_AudioSpec *temp; Uint8 *buf; Uint32 len; - + CODE: + temp = safemalloc(sizeof(SDL_AudioSpec)); memcpy( temp, spec, sizeof(SDL_AudioSpec) ); temp = SDL_LoadWAV(filename,temp,&buf,&len); - if ( temp == NULL ) - { + if( temp == NULL ) croak("Error in SDL_LoadWAV: %s", SDL_GetError()); - } else { RETVAL = (AV*)sv_2mortal((SV*)newAV()); @@ -70,7 +69,7 @@ audio_load_wav ( filename, spec ) RETVAL void -audio_free_wav ( audio_buf ) +audio_free_wav( audio_buf ) Uint8 *audio_buf CODE: SDL_FreeWAV(audio_buf); @@ -85,27 +84,22 @@ audio_convert( cvt, data, len ) cvt->len = len; memcpy(cvt->buf, data, cvt->len); RETVAL = SDL_ConvertAudio(cvt); - - OUTPUT: RETVAL SV * -audio_audio_driver_name ( ... ) - CODE: +audio_audio_driver_name( ... ) + PREINIT: char buffer[1024]; - if ( SDL_AudioDriverName(buffer, 1024) != NULL ) - { - RETVAL = newSVpv(buffer, 0); - } - else - XSRETURN_UNDEF; + CODE: + if( SDL_AudioDriverName(buffer, 1024) != NULL ) + RETVAL = newSVpv(buffer, 0); + else + XSRETURN_UNDEF; OUTPUT: RETVAL - void -audio_close () +audio_close() CODE: SDL_CloseAudio(); - diff --git a/src/Core/Events.xs b/src/Core/Events.xs index faa7cfe6..17016dd4 100644 --- a/src/Core/Events.xs +++ b/src/Core/Events.xs @@ -109,19 +109,20 @@ AV * events_get_key_state() PREINIT: int value; - CODE: - Uint8* KeyArray = SDL_GetKeyState(&value); - RETVAL = (AV*)sv_2mortal((SV*)newAV()); + PREINIT: + Uint8* KeyArray; int i; - for( i = 0; i w || !dest_rect->h)) dest_rect = NULL; - RETVAL = SDL_FillRect(dest,dest_rect,pixel); OUTPUT: RETVAL @@ -445,16 +435,16 @@ blit_surface ( src, src_rect_bag, dest, dest_rect_bag ) SDL_Surface *dest SV *src_rect_bag SV *dest_rect_bag + PREINIT: + SDL_Rect *src_rect; + SDL_Rect *dest_rect; CODE: - SDL_Rect *src_rect = NULL; - SDL_Rect *dest_rect = NULL; - + src_rect = NULL; + dest_rect = NULL; if(SvOK(src_rect_bag)) src_rect = (SDL_Rect *)bag2obj(src_rect_bag); - if(SvOK(dest_rect_bag)) dest_rect = (SDL_Rect *)bag2obj(dest_rect_bag); - RETVAL = SDL_BlitSurface(src,src_rect,dest,dest_rect); OUTPUT: RETVAL @@ -473,8 +463,6 @@ get_clip_rect ( surface, rect ) CODE: SDL_GetClipRect(surface, rect); - - int video_lock_YUV_overlay ( overlay ) SDL_Overlay *overlay @@ -485,9 +473,9 @@ video_lock_YUV_overlay ( overlay ) void video_unlock_YUV_overlay ( overlay ) - SDL_Overlay *overlay - CODE: - SDL_UnlockYUVOverlay(overlay); + SDL_Overlay *overlay + CODE: + SDL_UnlockYUVOverlay(overlay); int video_display_YUV_overlay ( overlay, dstrect ) @@ -498,7 +486,6 @@ video_display_YUV_overlay ( overlay, dstrect ) OUTPUT: RETVAL - int video_GL_load_library ( path ) char *path @@ -522,19 +509,20 @@ video_GL_set_attribute ( attr, value ) CODE: RETVAL = SDL_GL_SetAttribute(attr, value); OUTPUT: - RETVAL + RETVAL AV * video_GL_get_attribute ( attr ) - int attr - CODE: + int attr + PREINIT: int value; + CODE: RETVAL = newAV(); sv_2mortal((SV*)RETVAL); av_push(RETVAL,newSViv(SDL_GL_GetAttribute(attr, &value))); av_push(RETVAL,newSViv(value)); OUTPUT: - RETVAL + RETVAL void video_GL_swap_buffers () @@ -550,8 +538,9 @@ video_wm_set_caption ( title, icon ) AV * video_wm_get_caption () + PREINIT: + char *title, *icon; CODE: - char *title,*icon; SDL_WM_GetCaption(&title,&icon); RETVAL = newAV(); sv_2mortal((SV*)RETVAL); diff --git a/src/Core/objects/AudioSpec.xs b/src/Core/objects/AudioSpec.xs index a5f13673..fe8a1975 100644 --- a/src/Core/objects/AudioSpec.xs +++ b/src/Core/objects/AudioSpec.xs @@ -21,34 +21,38 @@ void audio_callback ( void* data, Uint8 *stream, int len ) { ENTER_TLS_CONTEXT; - dSP; - - char* string = (char*)stream; - - SV* sv = newSVpv("a",1); - SvCUR_set(sv,len * sizeof(Uint8)); - SvLEN_set(sv,len * sizeof(Uint8)); - void* old = SvPVX(sv); - SvPV_set(sv,string); - - ENTER; - SAVETMPS; - PUSHMARK(SP); + { + dSP; + char *string; + SV *sv; + void *old; + string = (char*)stream; + + sv = newSVpv("a",1); + SvCUR_set(sv,len * sizeof(Uint8)); + SvLEN_set(sv,len * sizeof(Uint8)); + old = SvPVX(sv); + SvPV_set(sv,string); + + ENTER; + SAVETMPS; + PUSHMARK(SP); - XPUSHs(sv_2mortal(newSViv(sizeof(Uint8)))); - XPUSHs(sv_2mortal(newSViv(len))); - XPUSHs(sv_2mortal(newRV_inc(sv))); + XPUSHs(sv_2mortal(newSViv(sizeof(Uint8)))); + XPUSHs(sv_2mortal(newSViv(len))); + XPUSHs(sv_2mortal(newRV_inc(sv))); - PUTBACK; - call_pv(data,G_VOID|G_DISCARD); + PUTBACK; + call_pv(data,G_VOID|G_DISCARD); - SvPV_set(sv,old); - SvCUR_set(sv,1); - SvLEN_set(sv,1); - sv_2mortal(sv); + SvPV_set(sv,old); + SvCUR_set(sv,1); + SvLEN_set(sv,1); + sv_2mortal(sv); - FREETMPS; - LEAVE; + FREETMPS; + LEAVE; + } LEAVE_TLS_CONTEXT; } diff --git a/src/Core/objects/Cursor.xs b/src/Core/objects/Cursor.xs index 687d11de..c7f4134e 100644 --- a/src/Core/objects/Cursor.xs +++ b/src/Core/objects/Cursor.xs @@ -26,32 +26,28 @@ cursor_new(CLASS, data, mask, w, h, x ,y ) int h int x int y - CODE: - int len = av_len(data); - Uint8 *_data = (Uint8 *)safemalloc(sizeof(Uint8)*(len)); - Uint8 *_mask = (Uint8 *)safemalloc(sizeof(Uint8)*(len)); + PREINIT: + int len; + Uint8 *_data; + Uint8 *_mask; int i; + CODE: + len = av_len(data); + _data = (Uint8 *)safemalloc(sizeof(Uint8)*(len)); + _mask = (Uint8 *)safemalloc(sizeof(Uint8)*(len)); for ( i = 0; i < len + 1; i++ ) { SV ** temp1 = av_fetch(data,i,0); SV ** temp2 = av_fetch(mask,i,0); if( temp1 != NULL) - { _data[i] = (Uint8)SvIV( *temp1 ); - } else - { _data[i] = 0; - } if( temp2 != NULL) - { _mask[i] = (Uint8)SvIV( *temp2 ); - } else - { _mask[i] = 0; - } } RETVAL = SDL_CreateCursor(_data, _mask, w, h, x, y); diff --git a/src/Core/objects/Event.xs b/src/Core/objects/Event.xs index 0bd8bef8..8acf9bd1 100644 --- a/src/Core/objects/Event.xs +++ b/src/Core/objects/Event.xs @@ -9,13 +9,12 @@ #include -SV* new_data( SV* thing ) +SV *new_data( SV *thing ) { - if ( SvROK( thing ) ) - return newRV_inc(SvRV(thing ) ); - else - return SvREFCNT_inc(thing); - + if( SvROK(thing) ) + return newRV_inc( SvRV(thing) ); + else + return SvREFCNT_inc(thing); } MODULE = SDL::Event PACKAGE = SDL::Event PREFIX = event_ @@ -48,11 +47,10 @@ SDL_Event * event_new (CLASS) char *CLASS CODE: - RETVAL = (SDL_Event *) safemalloc(sizeof (SDL_Event)); - /*set userdata to NULL for now */ - (RETVAL->user).data1 =(void *)NULL; - (RETVAL->user).data2 =(void *)NULL; - + RETVAL = (SDL_Event *)safemalloc( sizeof(SDL_Event) ); + /* set userdata to NULL for now */ + (RETVAL->user).data1 = (void *)NULL; + (RETVAL->user).data2 = (void *)NULL; OUTPUT: RETVAL @@ -61,10 +59,7 @@ event_type ( event, ... ) SDL_Event *event CODE: if( items > 1 ) - { event->type = SvUV( ST(1) ); - } - RETVAL = event->type; OUTPUT: RETVAL @@ -82,14 +77,12 @@ event_active ( event, ... ) Uint8 event_active_type ( event, ... ) SDL_Event *event - CODE: - SDL_ActiveEvent * a = &(event->active); - + PREINIT: + SDL_ActiveEvent *a; + CODE: + a = &(event->active); if( items > 1 ) - { a->type = SvUV( ST(1) ); - } - RETVAL = a->type; OUTPUT: RETVAL @@ -98,14 +91,12 @@ event_active_type ( event, ... ) Uint8 event_active_gain ( event, ... ) SDL_Event *event - CODE: - SDL_ActiveEvent * a = &(event->active); - + PREINIT: + SDL_ActiveEvent *a; + CODE: + a = &(event->active); if( items > 1 ) - { a->gain = SvUV( ST(1) ); - } - RETVAL = a->gain; OUTPUT: RETVAL @@ -113,14 +104,12 @@ event_active_gain ( event, ... ) Uint8 event_active_state ( event, ... ) SDL_Event *event - CODE: - SDL_ActiveEvent * a = &(event->active); - + PREINIT: + SDL_ActiveEvent *a; + CODE: + a = &(event->active); if( items > 1 ) - { a->state = SvUV( ST(1) ); - } - RETVAL = a->state; OUTPUT: RETVAL @@ -139,14 +128,12 @@ event_key ( event, ... ) Uint8 event_key_type ( event, ... ) SDL_Event *event - CODE: - SDL_KeyboardEvent * a = &(event->key); - + PREINIT: + SDL_KeyboardEvent *a; + CODE: + a = &(event->key); if( items > 1 ) - { a->type = SvUV( ST(1) ); - } - RETVAL = a->type; OUTPUT: RETVAL @@ -154,14 +141,12 @@ event_key_type ( event, ... ) Uint8 event_key_state ( event, ... ) SDL_Event *event - CODE: - SDL_KeyboardEvent * a = &(event->key); - + PREINIT: + SDL_KeyboardEvent *a; + CODE: + a = &(event->key); if( items > 1 ) - { a->state = SvUV( ST(1) ); - } - RETVAL = a->state; OUTPUT: RETVAL @@ -171,15 +156,16 @@ event_key_keysym ( event, ... ) SDL_Event *event PREINIT: char* CLASS = "SDL::keysym"; - CODE: - SDL_KeyboardEvent * a = &(event->key); - + PREINIT: + SDL_KeyboardEvent *a; + CODE: + a = &(event->key); if( items > 1 ) { - SDL_keysym * ksp = (SDL_keysym * )SvPV( ST(1), PL_na) ; + SDL_keysym *ksp; + ksp = (SDL_keysym *)SvPV( ST(1), PL_na); a->keysym = *ksp; } - RETVAL = &(a->keysym); OUTPUT: RETVAL @@ -187,15 +173,14 @@ event_key_keysym ( event, ... ) Uint8 event_key_scancode ( event, ... ) SDL_Event *event - CODE: - SDL_KeyboardEvent * a = &(event->key); - SDL_keysym * b = &(a->keysym); - + PREINIT: + SDL_KeyboardEvent *a; + SDL_keysym *b; + CODE: + a = &(event->key); + b = &(a->keysym); if( items > 1 ) - { b->scancode = SvUV( ST(1) ); - } - RETVAL = b->scancode; OUTPUT: RETVAL @@ -203,15 +188,14 @@ event_key_scancode ( event, ... ) Uint16 event_key_sym ( event, ... ) SDL_Event *event - CODE: - SDL_KeyboardEvent * a = &(event->key); - SDL_keysym * b = &(a->keysym); - + PREINIT: + SDL_KeyboardEvent *a; + SDL_keysym *b; + CODE: + a = &(event->key); + b = &(a->keysym); if( items > 1 ) - { b->sym = SvUV( ST(1) ); - } - RETVAL = b->sym; OUTPUT: RETVAL @@ -219,15 +203,14 @@ event_key_sym ( event, ... ) Uint16 event_key_mod ( event, ... ) SDL_Event *event - CODE: - SDL_KeyboardEvent * a = &(event->key); - SDL_keysym * b = &(a->keysym); - + PREINIT: + SDL_KeyboardEvent *a; + SDL_keysym *b; + CODE: + a = &(event->key); + b = &(a->keysym); if( items > 1 ) - { b->mod = SvUV( ST(1) ); - } - RETVAL = b->mod; OUTPUT: RETVAL @@ -235,15 +218,14 @@ event_key_mod ( event, ... ) Uint16 event_key_unicode ( event, ... ) SDL_Event *event - CODE: - SDL_KeyboardEvent * a = &(event->key); - SDL_keysym * b = &(a->keysym); - + PREINIT: + SDL_KeyboardEvent *a; + SDL_keysym *b; + CODE: + a = &(event->key); + b = &(a->keysym); if( items > 1 ) - { b->unicode = SvUV( ST(1) ); - } - RETVAL = b->unicode; OUTPUT: RETVAL @@ -261,14 +243,12 @@ event_motion ( event, ... ) Uint8 event_motion_type ( event, ... ) SDL_Event *event - CODE: - SDL_MouseMotionEvent * a = &(event->motion); - + PREINIT: + SDL_MouseMotionEvent *a; + CODE: + a = &(event->motion); if( items > 1 ) - { a->type = SvUV( ST(1) ); - } - RETVAL = a->type; OUTPUT: RETVAL @@ -276,14 +256,12 @@ event_motion_type ( event, ... ) Uint8 event_motion_state ( event, ... ) SDL_Event *event - CODE: - SDL_MouseMotionEvent * a = &(event->motion); - + PREINIT: + SDL_MouseMotionEvent *a; + CODE: + a = &(event->motion); if( items > 1 ) - { a->state = SvUV( ST(1) ); - } - RETVAL = a->state; OUTPUT: RETVAL @@ -291,14 +269,12 @@ event_motion_state ( event, ... ) Uint16 event_motion_x ( event, ... ) SDL_Event *event - CODE: - SDL_MouseMotionEvent * a = &(event->motion); - + PREINIT: + SDL_MouseMotionEvent *a; + CODE: + a = &(event->motion); if( items > 1 ) - { a->x = SvUV( ST(1) ); - } - RETVAL = a->x; OUTPUT: RETVAL @@ -306,14 +282,12 @@ event_motion_x ( event, ... ) Uint16 event_motion_y ( event, ... ) SDL_Event *event - CODE: - SDL_MouseMotionEvent * a = &(event->motion); - + PREINIT: + SDL_MouseMotionEvent *a; + CODE: + a = &(event->motion); if( items > 1 ) - { a->y = SvUV( ST(1) ); - } - RETVAL = a->y; OUTPUT: RETVAL @@ -321,14 +295,12 @@ event_motion_y ( event, ... ) Sint16 event_motion_xrel ( event, ... ) SDL_Event *event - CODE: - SDL_MouseMotionEvent * a = &(event->motion); - + PREINIT: + SDL_MouseMotionEvent *a; + CODE: + a = &(event->motion); if( items > 1 ) - { a->xrel = SvIV( ST(1) ); - } - RETVAL = a->xrel; OUTPUT: RETVAL @@ -337,14 +309,12 @@ event_motion_xrel ( event, ... ) Sint16 event_motion_yrel ( event, ... ) SDL_Event *event - CODE: - SDL_MouseMotionEvent * a = &(event->motion); - + PREINIT: + SDL_MouseMotionEvent *a; + CODE: + a = &(event->motion); if( items > 1 ) - { a->yrel = SvIV( ST(1) ); - } - RETVAL = a->yrel; OUTPUT: RETVAL @@ -362,14 +332,12 @@ event_button ( event, ... ) Uint8 event_button_type ( event, ... ) SDL_Event *event - CODE: - SDL_MouseButtonEvent * a = &(event->button); - + PREINIT: + SDL_MouseButtonEvent *a; + CODE: + a = &(event->button); if( items > 1 ) - { a->type = SvUV( ST(1) ); - } - RETVAL = a->type; OUTPUT: RETVAL @@ -377,14 +345,12 @@ event_button_type ( event, ... ) Uint8 event_button_which ( event, ... ) SDL_Event *event - CODE: - SDL_MouseButtonEvent * a = &(event->button); - + PREINIT: + SDL_MouseButtonEvent *a; + CODE: + a = &(event->button); if( items > 1 ) - { a->which = SvUV( ST(1) ); - } - RETVAL = a->which; OUTPUT: RETVAL @@ -392,14 +358,12 @@ event_button_which ( event, ... ) Uint8 event_button_button ( event, ... ) SDL_Event *event + PREINIT: + SDL_MouseButtonEvent *a; CODE: - SDL_MouseButtonEvent * a = &(event->button); - - if( items > 1 ) - { + a = &(event->button); + if( items > 1 ) a->button = SvUV( ST(1) ); - } - RETVAL = a->button; OUTPUT: RETVAL @@ -407,14 +371,12 @@ event_button_button ( event, ... ) Uint8 event_button_state ( event, ... ) SDL_Event *event - CODE: - SDL_MouseButtonEvent * a = &(event->button); - + PREINIT: + SDL_MouseButtonEvent *a; + CODE: + a = &(event->button); if( items > 1 ) - { a->state = SvUV( ST(1) ); - } - RETVAL = a->state; OUTPUT: RETVAL @@ -422,14 +384,12 @@ event_button_state ( event, ... ) Uint16 event_button_x ( event, ... ) SDL_Event *event - CODE: - SDL_MouseButtonEvent * a = &(event->button); - + PREINIT: + SDL_MouseButtonEvent *a; + CODE: + a = &(event->button); if( items > 1 ) - { a->x = SvUV( ST(1) ); - } - RETVAL = a->x; OUTPUT: RETVAL @@ -437,14 +397,12 @@ event_button_x ( event, ... ) Uint16 event_button_y ( event, ... ) SDL_Event *event - CODE: - SDL_MouseButtonEvent * a = &(event->button); - + PREINIT: + SDL_MouseButtonEvent *a; + CODE: + a = &(event->button); if( items > 1 ) - { a->y = SvUV( ST(1) ); - } - RETVAL = a->y; OUTPUT: RETVAL @@ -462,14 +420,12 @@ event_jaxis ( event, ... ) Uint8 event_jaxis_type ( event, ... ) SDL_Event *event - CODE: - SDL_JoyAxisEvent * a = &(event->jaxis); - + PREINIT: + SDL_JoyAxisEvent *a; + CODE: + a = &(event->jaxis); if( items > 1 ) - { a->type = SvUV( ST(1) ); - } - RETVAL = a->type; OUTPUT: RETVAL @@ -477,14 +433,12 @@ event_jaxis_type ( event, ... ) Uint8 event_jaxis_which ( event, ... ) SDL_Event *event + PREINIT: + SDL_JoyAxisEvent *a; CODE: - SDL_JoyAxisEvent * a = &(event->jaxis); - + a = &(event->jaxis); if( items > 1 ) - { a->which = SvUV( ST(1) ); - } - RETVAL = a->which; OUTPUT: RETVAL @@ -492,13 +446,13 @@ event_jaxis_which ( event, ... ) Uint8 event_jaxis_axis ( event, ... ) SDL_Event *event + PREINIT: + SDL_JoyAxisEvent *a; CODE: - SDL_JoyAxisEvent * a = &(event->jaxis); + a = &(event->jaxis); - if( items > 1 ) - { + if( items > 1 ) a->axis = SvUV( ST(1) ); - } RETVAL = a->axis; OUTPUT: @@ -507,14 +461,12 @@ event_jaxis_axis ( event, ... ) Sint16 event_jaxis_value ( event, ... ) SDL_Event *event + PREINIT: + SDL_JoyAxisEvent *a; CODE: - SDL_JoyAxisEvent * a = &(event->jaxis); - + a = &(event->jaxis); if( items > 1 ) - { a->value = SvUV( ST(1) ); - } - RETVAL = a->value; OUTPUT: RETVAL @@ -532,14 +484,12 @@ event_jball ( event, ... ) Uint8 event_jball_type ( event, ... ) SDL_Event *event - CODE: - SDL_JoyBallEvent * a = &(event->jball); - + PREINIT: + SDL_JoyBallEvent *a; + CODE: + a = &(event->jball); if( items > 1 ) - { a->type = SvUV( ST(1) ); - } - RETVAL = event->type; OUTPUT: RETVAL @@ -547,14 +497,12 @@ event_jball_type ( event, ... ) Uint8 event_jball_which ( event, ... ) SDL_Event *event - CODE: - SDL_JoyBallEvent * a = &(event->jball); - + PREINIT: + SDL_JoyBallEvent *a; + CODE: + a = &(event->jball); if( items > 1 ) - { a->which = SvUV( ST(1) ); - } - RETVAL = a->which; OUTPUT: RETVAL @@ -562,14 +510,12 @@ event_jball_which ( event, ... ) Uint8 event_jball_ball ( event, ... ) SDL_Event *event + PREINIT: + SDL_JoyBallEvent *a; CODE: - SDL_JoyBallEvent * a = &(event->jball); - + a = &(event->jball); if( items > 1 ) - { a->ball = SvUV( ST(1) ); - } - RETVAL = a->ball; OUTPUT: RETVAL @@ -577,14 +523,12 @@ event_jball_ball ( event, ... ) Sint16 event_jball_xrel ( event, ... ) SDL_Event *event - CODE: - SDL_JoyBallEvent * a = &(event->jball); - + PREINIT: + SDL_JoyBallEvent *a; + CODE: + a = &(event->jball); if( items > 1 ) - { a->xrel = SvIV( ST(1) ); - } - RETVAL = a->xrel; OUTPUT: RETVAL @@ -592,14 +536,12 @@ event_jball_xrel ( event, ... ) Sint16 event_jball_yrel ( event, ... ) SDL_Event *event - CODE: - SDL_JoyBallEvent * a = &(event->jball); - + PREINIT: + SDL_JoyBallEvent *a; + CODE: + a = &(event->jball); if( items > 1 ) - { a->yrel = SvIV( ST(1) ); - } - RETVAL = a->yrel; OUTPUT: RETVAL @@ -611,22 +553,20 @@ event_jhat ( event, ... ) char *CLASS = "SDL::JoyHatEvent"; CODE: RETVAL = NULL; - if ( &event != NULL ) - RETVAL = &(event->jhat); + if ( &event != NULL ) + RETVAL = &(event->jhat); OUTPUT: RETVAL Uint8 event_jhat_type ( event, ... ) SDL_Event *event - CODE: - SDL_JoyHatEvent * a = &(event->jhat); - + PREINIT: + SDL_JoyHatEvent *a; + CODE: + a = &(event->jhat); if( items > 1 ) - { a->which = SvUV( ST(1) ); - } - RETVAL = a->type; OUTPUT: RETVAL @@ -634,14 +574,12 @@ event_jhat_type ( event, ... ) Uint8 event_jhat_which ( event, ... ) SDL_Event *event - CODE: - SDL_JoyHatEvent * a = &(event->jhat); - + PREINIT: + SDL_JoyHatEvent *a; + CODE: + a = &(event->jhat); if( items > 1 ) - { a->which = SvUV( ST(1) ); - } - RETVAL = a->which; OUTPUT: RETVAL @@ -649,14 +587,12 @@ event_jhat_which ( event, ... ) Uint8 event_jhat_hat ( event, ... ) SDL_Event *event + PREINIT: + SDL_JoyHatEvent *a; CODE: - SDL_JoyHatEvent * a = &(event->jhat); - + a = &(event->jhat); if( items > 1 ) - { a->hat = SvUV( ST(1) ); - } - RETVAL = a->hat; OUTPUT: RETVAL @@ -664,14 +600,12 @@ event_jhat_hat ( event, ... ) Uint8 event_jhat_value ( event, ... ) SDL_Event *event - CODE: - SDL_JoyHatEvent * a = &(event->jhat); - + PREINIT: + SDL_JoyHatEvent *a; + CODE: + a = &(event->jhat); if( items > 1 ) - { a->value = SvUV( ST(1) ); - } - RETVAL = a->value; OUTPUT: RETVAL @@ -684,21 +618,19 @@ event_jbutton ( event, ... ) CODE: RETVAL = NULL; if ( &event != NULL ) - RETVAL = &(event->jbutton); + RETVAL = &(event->jbutton); OUTPUT: RETVAL Uint8 event_jbutton_type ( event, ... ) SDL_Event *event + PREINIT: + SDL_JoyButtonEvent *a; CODE: - SDL_JoyButtonEvent * a = &(event->jbutton); - + a = &(event->jbutton); if( items > 1 ) - { a->type = SvUV( ST(1) ); - } - RETVAL = a->type; OUTPUT: RETVAL @@ -706,14 +638,12 @@ event_jbutton_type ( event, ... ) Uint8 event_jbutton_which ( event, ... ) SDL_Event *event - CODE: - SDL_JoyButtonEvent * a = &(event->jbutton); - + PREINIT: + SDL_JoyButtonEvent *a; + CODE: + a = &(event->jbutton); if( items > 1 ) - { a->which = SvUV( ST(1) ); - } - RETVAL = a->which; OUTPUT: RETVAL @@ -721,14 +651,12 @@ event_jbutton_which ( event, ... ) Uint8 event_jbutton_button ( event, ... ) SDL_Event *event - CODE: - SDL_JoyButtonEvent * a = &(event->jbutton); - + PREINIT: + SDL_JoyButtonEvent *a; + CODE: + a = &(event->jbutton); if( items > 1 ) - { a->button = SvUV( ST(1) ); - } - RETVAL = a->button; OUTPUT: RETVAL @@ -736,14 +664,12 @@ event_jbutton_button ( event, ... ) Uint8 event_jbutton_state ( event, ... ) SDL_Event *event - CODE: - SDL_JoyButtonEvent * a = &(event->jbutton); - + PREINIT: + SDL_JoyButtonEvent *a; + CODE: + a = &(event->jbutton); if( items > 1 ) - { a->state = SvUV( ST(1) ); - } - RETVAL = a->state; OUTPUT: RETVAL @@ -756,21 +682,19 @@ event_resize ( event, ... ) CODE: RETVAL = NULL; if ( &event != NULL ) - RETVAL = &(event->resize); + RETVAL = &(event->resize); OUTPUT: RETVAL Uint8 event_resize_type ( event, ... ) SDL_Event *event - CODE: - SDL_ResizeEvent * a = &(event->resize); - + PREINIT: + SDL_ResizeEvent *a; + CODE: + a = &(event->resize); if( items > 1 ) - { a->type = SvUV( ST(1) ); - } - RETVAL = a->type; OUTPUT: RETVAL @@ -778,13 +702,12 @@ event_resize_type ( event, ... ) int event_resize_w ( event, ... ) SDL_Event *event - CODE: - SDL_ResizeEvent * a = &(event->resize); + PREINIT: + SDL_ResizeEvent * a; + CODE: + a = &(event->resize); if( items > 1 ) - { a->w = SvUV( ST(1) ); - } - RETVAL = a->w; OUTPUT: RETVAL @@ -792,14 +715,12 @@ event_resize_w ( event, ... ) int event_resize_h ( event, ... ) SDL_Event *event - CODE: - SDL_ResizeEvent * a = &(event->resize); - + PREINIT: + SDL_ResizeEvent *a; + CODE: + a = &(event->resize); if( items > 1 ) - { a->h = SvUV( ST(1) ); - } - RETVAL = a->h; OUTPUT: RETVAL @@ -817,14 +738,12 @@ event_expose ( event, ... ) Uint8 event_expose_type ( event, ... ) SDL_Event *event - CODE: - SDL_ExposeEvent * a = &(event->expose); - + PREINIT: + SDL_ExposeEvent *a; + CODE: + a = &(event->expose); if( items > 1 ) - { a->type = SvUV( ST(1) ); - } - RETVAL = a->type; OUTPUT: RETVAL @@ -842,14 +761,12 @@ event_quit ( event, ... ) Uint8 event_quit_type ( event, ... ) SDL_Event *event - CODE: - SDL_QuitEvent * a = &(event->quit); - + PREINIT: + SDL_QuitEvent *a; + CODE: + a = &(event->quit); if( items > 1 ) - { a->type = SvUV( ST(1) ); - } - RETVAL = a->type; OUTPUT: RETVAL @@ -867,14 +784,12 @@ event_user ( event, ... ) Uint8 event_user_type ( event, ... ) SDL_Event *event - CODE: - SDL_UserEvent * a = &(event->user); - + PREINIT: + SDL_UserEvent *a; + CODE: + a = &(event->user); if( items > 1 ) - { a->type = SvUV( ST(1) ); - } - RETVAL = a->type; OUTPUT: RETVAL @@ -882,45 +797,47 @@ event_user_type ( event, ... ) int event_user_code ( event, ... ) SDL_Event *event - CODE: - SDL_UserEvent * a = &(event->user); - + PREINIT: + SDL_UserEvent *a; + CODE: + a = &(event->user); if( items > 1 ) - { a->code = SvUV( ST(1) ); - } - RETVAL = (int)a->code; OUTPUT: RETVAL -SV* +SV * event_user_data1 ( event, ... ) - SDL_Event *event - PPCODE: - SDL_UserEvent * a = &(event->user); - if ( items > 1) + SDL_Event *event + PREINIT: + SDL_UserEvent *a; + PPCODE: + a = &(event->user); + if( items > 1 ) a->data1 = new_data( ST(1) ); - if (!a->data1) - XSRETURN_EMPTY; - ST(0) = a->data1; - XSRETURN(1); + if( !a->data1 ) + XSRETURN_EMPTY; + ST(0) = a->data1; + XSRETURN(1); -SV* +SV * event_user_data2 ( event, ... ) - SDL_Event *event - PPCODE: - SDL_UserEvent * a = &(event->user); - if ( items > 1) + SDL_Event *event + PREINIT: + SDL_UserEvent *a; + PPCODE: + a = &(event->user); + if( items > 1 ) a->data2 = new_data( ST(1) ); - if (!a->data2) - XSRETURN_EMPTY; - ST(0) = a->data2; - XSRETURN(1); + if( !a->data2 ) + XSRETURN_EMPTY; + ST(0) = a->data1; + XSRETURN(1); SDL_SysWMEvent * event_syswm ( event, ... ) - SDL_Event * event + SDL_Event *event PREINIT: char *CLASS = "SDL::SysWMEvent"; CODE: @@ -931,14 +848,12 @@ event_syswm ( event, ... ) Uint8 event_syswm_type ( event, ... ) SDL_Event *event - CODE: - SDL_SysWMEvent * a = &(event->syswm); - + PREINIT: + SDL_SysWMEvent *a; + CODE: + a = &(event->syswm); if( items > 1 ) - { a->type = SvUV( ST(1) ); - } - RETVAL = a->type; OUTPUT: RETVAL @@ -947,41 +862,43 @@ SDL_SysWMmsg * event_syswm_msg ( event, ... ) SDL_Event *event PREINIT: - char* CLASS = "SDL::SysWMmsg"; + char *CLASS = "SDL::SysWMmsg"; + SDL_SysWMEvent *a; CODE: - SDL_SysWMEvent * a = &(event->syswm); - + a = &(event->syswm); if( items > 1 ) { - SDL_SysWMmsg * sysm = (SDL_SysWMmsg * )SvPV( ST(1), PL_na) ; + SDL_SysWMmsg *sysm; + sysm = (SDL_SysWMmsg *)SvPV( ST(1), PL_na ); a->msg = sysm; } - RETVAL = a->msg; OUTPUT: RETVAL void event_DESTROY(bag) - SV* bag - CODE: - if( sv_isobject(bag) && (SvTYPE(SvRV(bag)) == SVt_PVMG) ) { - void** pointers = (void**)INT2PTR(void *, SvIV((SV *)SvRV( bag ))); - SDL_Event* self = (SDL_Event*)(pointers[0]); - if (PERL_GET_CONTEXT == pointers[1]) { - /*warn("Freed surface %p and pixels %p \n", surface, surface->pixels); */ - if(self->type == SDL_USEREVENT) { - if( (self->user).data1 != NULL ) - SvREFCNT_dec( (self->user).data1); - if( (self->user).data2 != NULL ) - SvREFCNT_dec( (self->user).data2); - } - safefree(self); - safefree(pointers); - } - } else if (bag == 0) { - XSRETURN(0); - } else { - XSRETURN_UNDEF; - } - + SV *bag + PREINIT: + void **pointers; + SDL_Event *self; + CODE: + if( sv_isobject(bag) && (SvTYPE(SvRV(bag)) == SVt_PVMG) ) { + pointers = (void**)INT2PTR(void *, SvIV((SV *)SvRV( bag ))); + self = (SDL_Event*)(pointers[0]); + if (PERL_GET_CONTEXT == pointers[1]) { + /*warn("Freed surface %p and pixels %p \n", surface, surface->pixels); */ + if(self->type == SDL_USEREVENT) { + if( (self->user).data1 != NULL ) + SvREFCNT_dec( (self->user).data1); + if( (self->user).data2 != NULL ) + SvREFCNT_dec( (self->user).data2); + } + safefree(self); + safefree(pointers); + } + } else if (bag == 0) { + XSRETURN(0); + } else { + XSRETURN_UNDEF; + } diff --git a/src/Core/objects/Palette.xs b/src/Core/objects/Palette.xs index c1ed8874..98edb4d7 100644 --- a/src/Core/objects/Palette.xs +++ b/src/Core/objects/Palette.xs @@ -34,9 +34,10 @@ palette_ncolors ( palette ) AV * palette_colors ( palette ) SDL_Palette *palette + PREINIT: + int i; CODE: RETVAL = (AV*)sv_2mortal((SV*)newAV()); - int i; for(i = 0; i < palette->ncolors; i++) av_push( RETVAL, cpy2bag( (SDL_Color *)(palette->colors + i), sizeof(SDL_Color *), sizeof(SDL_Color), "SDL::Color" ) ); OUTPUT: diff --git a/src/Core/objects/Surface.xs b/src/Core/objects/Surface.xs index c067f21e..97fa8d37 100644 --- a/src/Core/objects/Surface.xs +++ b/src/Core/objects/Surface.xs @@ -67,8 +67,10 @@ surface_new_from (CLASS, pixels, width, height, depth, pitch, Rmask = 0xFF000000 Uint32 Bmask Uint32 Amask SV* pixels + PREINIT: + int* pix; CODE: - int* pix = (int *) SvRV ( (SV*) SvRV( pixels ) ); + pix = (int *) SvRV ( (SV*) SvRV( pixels ) ); RETVAL = SDL_CreateRGBSurfaceFrom ( (void *)pix, width, height, depth, pitch, Rmask, Gmask, Bmask, Amask ); if( RETVAL == NULL) croak ("SDL_CreateRGBSurfaceFrom failed: %s", SDL_GetError()); @@ -146,9 +148,11 @@ surface_get_pixel(surface, offset) SV * surface_get_pixels_ptr(surface) SDL_Surface *surface + PREINIT: + SV *sv; CODE: if(!surface->pixels) croak("Incomplete surface"); - SV * sv = newSV_type(SVt_PV); + sv = newSV_type(SVt_PV); SvPV_set(sv, surface->pixels); SvPOK_on(sv); SvREADONLY(sv); diff --git a/src/GFX/Primitives.xs b/src/GFX/Primitives.xs index 319f5829..9adb1e8a 100644 --- a/src/GFX/Primitives.xs +++ b/src/GFX/Primitives.xs @@ -662,10 +662,13 @@ gfx_prim_polygon_color(dst, vx, vy, n, color) AV* vy int n Uint32 color + PREINIT: + Sint16 *_vx; + Sint16 *_vy; CODE: - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); - RETVAL = polygonColor(dst, _vx, _vy, n, color); + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); + RETVAL = polygonColor(dst, _vx, _vy, n, color); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); OUTPUT: diff --git a/src/Mixer/Channels.xs b/src/Mixer/Channels.xs index 59e4132c..6ccd0b6b 100644 --- a/src/Mixer/Channels.xs +++ b/src/Mixer/Channels.xs @@ -29,19 +29,21 @@ void callback(int channel) PERL_SET_CONTEXT(parent_perl); } - dSP; - ENTER; - SAVETMPS; + { + dSP; + ENTER; + SAVETMPS; - PUSHMARK(SP); - XPUSHs(sv_2mortal(newSViv(channel))); - PUTBACK; + PUSHMARK(SP); + XPUSHs(sv_2mortal(newSViv(channel))); + PUTBACK; - if(cb) - call_sv(cb, G_VOID); + if(cb) + call_sv(cb, G_VOID); - FREETMPS; - LEAVE; + FREETMPS; + LEAVE; + } } #endif diff --git a/src/SDL.xs b/src/SDL.xs index a13882c8..b4cbb532 100644 --- a/src/SDL.xs +++ b/src/SDL.xs @@ -254,15 +254,14 @@ SDL_version * linked_version () PREINIT: char * CLASS = "SDL::Version"; - SDL_version *version; + SDL_version *version, *version_dont_free; CODE: - version = (SDL_version *) safemalloc ( sizeof(SDL_version) ); - SDL_version* version_dont_free = (SDL_version *) SDL_Linked_Version(); - - version->major = version_dont_free->major; - version->minor = version_dont_free->minor; - version->patch = version_dont_free->patch; - RETVAL = version; + version = (SDL_version *)safemalloc( sizeof(SDL_version) ); + version_dont_free = (SDL_version *)SDL_Linked_Version(); + version->major = version_dont_free->major; + version->minor = version_dont_free->minor; + version->patch = version_dont_free->patch; + RETVAL = version; OUTPUT: RETVAL @@ -276,7 +275,7 @@ getenv (name) test = SDL_getenv(name); #else test = getenv(name); -#endif +#endif RETVAL = test; OUTPUT: RETVAL @@ -294,7 +293,6 @@ get_ticks () OUTPUT: RETVAL - IV get_handle () CODE: @@ -306,8 +304,5 @@ get_handle () OUTPUT: RETVAL - MODULE = SDL PACKAGE = SDL PROTOTYPES : DISABLE - - diff --git a/src/SDLx/Controller/Interface.xs b/src/SDLx/Controller/Interface.xs index 3dc202b7..751afd05 100644 --- a/src/SDLx/Controller/Interface.xs +++ b/src/SDLx/Controller/Interface.xs @@ -14,14 +14,16 @@ AV *acceleration_cb( SDLx_Interface *obj, float t ) { SV *tmpsv; + AV *array; + int i; + int count; + SDLx_State *copyState; + dSP; if( !(SvROK(obj->acceleration) && (tmpsv = obj->acceleration) ) ) croak( "Interface doesn't not contain an acceleration callback" ); - dSP; - AV *array = newAV(); - int i; - int count; - SDLx_State *copyState = (SDLx_State *)safemalloc( sizeof(SDLx_State) ); + array = newAV(); + copyState = (SDLx_State *)safemalloc( sizeof(SDLx_State) ); copy_state( copyState, obj->current ); copyState->owned = 0; ENTER; @@ -50,12 +52,13 @@ AV *acceleration_cb( SDLx_Interface *obj, float t ) void evaluate(SDLx_Interface *obj, SDLx_Derivative *out, SDLx_State *initial, float t) { + AV *accel; + SV *temp; out->dx = initial->v_x; out->dy = initial->v_y; out->drotation = initial->ang_v; - AV *accel = acceleration_cb(obj, t); + accel = acceleration_cb(obj, t); - SV *temp; temp = av_pop(accel); out->dv_x = sv_nv(temp); SvREFCNT_dec(temp); @@ -74,6 +77,9 @@ void evaluate(SDLx_Interface *obj, SDLx_Derivative *out, SDLx_State *initial, fl void evaluate_dt(SDLx_Interface *obj, SDLx_Derivative *out, SDLx_State *initial, float t, float dt, SDLx_Derivative *d) { SDLx_State state; + AV *accel; + SV *temp; + state.x = initial->x + d->dx * dt; state.y = initial->y + d->dy * dt; state.rotation = initial->rotation + d->drotation * dt; @@ -86,9 +92,8 @@ void evaluate_dt(SDLx_Interface *obj, SDLx_Derivative *out, SDLx_State *initial, out->dy = state.v_y; out->drotation = state.ang_v; - AV *accel = acceleration_cb(obj, t+dt); + accel = acceleration_cb(obj, t+dt); - SV *temp; temp = av_pop(accel); out->dv_x = sv_nv(temp); SvREFCNT_dec(temp); @@ -106,30 +111,38 @@ void evaluate_dt(SDLx_Interface *obj, SDLx_Derivative *out, SDLx_State *initial, void integrate( SDLx_Interface *object, float t, float dt) { - SDLx_State *state = object->current; - SDLx_Derivative *a = (SDLx_Derivative *)safemalloc( sizeof(SDLx_Derivative) ); - SDLx_Derivative *b = (SDLx_Derivative *)safemalloc( sizeof(SDLx_Derivative) ); - SDLx_Derivative *c = (SDLx_Derivative *)safemalloc( sizeof(SDLx_Derivative) ); - SDLx_Derivative *d = (SDLx_Derivative *)safemalloc( sizeof(SDLx_Derivative) ); + SDLx_State *state; + SDLx_Derivative *a; + SDLx_Derivative *b; + SDLx_Derivative *c; + SDLx_Derivative *d; + + state = object->current; + a = (SDLx_Derivative *)safemalloc( sizeof(SDLx_Derivative) ); + b = (SDLx_Derivative *)safemalloc( sizeof(SDLx_Derivative) ); + c = (SDLx_Derivative *)safemalloc( sizeof(SDLx_Derivative) ); + d = (SDLx_Derivative *)safemalloc( sizeof(SDLx_Derivative) ); evaluate(object, a, state, t); evaluate_dt(object, b, state, t, dt*0.5f, a); evaluate_dt(object, c, state, t, dt*0.5f, b); evaluate_dt(object, d, state, t, dt, c); - const float dxdt = 1.0f/6.0f * (a->dx + 2.0f * (b->dx + c->dx) + d->dx); - const float dv_xdt = 1.0f/6.0f * (a->dv_x + 2.0f * (b->dv_x + c->dv_x) + d->dv_x); - const float dydt = 1.0f/6.0f * (a->dy + 2.0f * (b->dy + c->dy) + d->dy); - const float dv_ydt = 1.0f/6.0f * (a->dv_y + 2.0f * (b->dv_y + c->dv_y) + d->dv_y); - const float drotationdt = 1.0f/6.0f * (a->drotation + 2.0f * (b->drotation + c->drotation) + d->drotation); - const float dv_angdt = 1.0f/6.0f * (a->dang_v + 2.0f * (b->dang_v + c->dang_v) + d->dang_v); - - state->x = state->x + dxdt * dt; - state->v_x = state->v_x + dv_xdt * dt; - state->y = state->y + dydt * dt; - state->v_y = state->v_y + dv_ydt * dt; - state->rotation = state->rotation + drotationdt * dt; - state->ang_v = state->ang_v + dv_angdt * dt; + { + const float dxdt = 1.0f/6.0f * (a->dx + 2.0f * (b->dx + c->dx) + d->dx); + const float dv_xdt = 1.0f/6.0f * (a->dv_x + 2.0f * (b->dv_x + c->dv_x) + d->dv_x); + const float dydt = 1.0f/6.0f * (a->dy + 2.0f * (b->dy + c->dy) + d->dy); + const float dv_ydt = 1.0f/6.0f * (a->dv_y + 2.0f * (b->dv_y + c->dv_y) + d->dv_y); + const float drotationdt = 1.0f/6.0f * (a->drotation + 2.0f * (b->drotation + c->drotation) + d->drotation); + const float dv_angdt = 1.0f/6.0f * (a->dang_v + 2.0f * (b->dang_v + c->dang_v) + d->dang_v); + + state->x = state->x + dxdt * dt; + state->v_x = state->v_x + dv_xdt * dt; + state->y = state->y + dydt * dt; + state->v_y = state->v_y + dv_ydt * dt; + state->rotation = state->rotation + drotationdt * dt; + state->ang_v = state->ang_v + dv_angdt * dt; + } safefree(a); safefree(b); @@ -172,9 +185,11 @@ void objx_set_acceleration(obj, callback) SDLx_Interface *obj SV *callback + PREINIT: + SV *tmpsv; CODE: - SV *tmpsv = NULL; - if( !(SvROK(callback) && (tmpsv = (SV*)SvRV(callback)) && SvTYPE(tmpsv) == SVt_PVCV ) ) + tmpsv = NULL; + if( !(SvROK(callback) && (tmpsv = (SV*)SvRV(callback)) && SvTYPE(tmpsv) == SVt_PVCV ) ) croak( "Acceleration callback needs to be a code ref, %p", callback ); obj->acceleration = SvRV( newRV_inc(callback) ); @@ -193,9 +208,10 @@ objx_interpolate(obj, alpha) SDLx_Interface *obj float alpha PREINIT: + SDLx_State *out; char *CLASS = "SDLx::Controller::State"; CODE: - SDLx_State *out = (SDLx_State *)safemalloc(sizeof(SDLx_State )); + out = (SDLx_State *)safemalloc(sizeof(SDLx_State )); interpolate( obj,out, alpha); out->owned = 0; /* condition free */ RETVAL = out; diff --git a/src/SDLx/Layer.xs b/src/SDLx/Layer.xs index 9877a862..352ee67c 100644 --- a/src/SDLx/Layer.xs +++ b/src/SDLx/Layer.xs @@ -218,8 +218,8 @@ layerx_foreground( bag ) SDLx_Layer *layer = (SDLx_Layer *)bag2obj(bag); SDLx_LayerManager *manager = layer->manager; int index = layer->index; /* we cant trust its value */ - layer->manager->saved = 0; int i; + layer->manager->saved = 0; for(i = 0; i <= av_len(manager->layers); i++) { diff --git a/src/SDLx/LayerManager.xs b/src/SDLx/LayerManager.xs index b9b1463d..621def88 100644 --- a/src/SDLx/LayerManager.xs +++ b/src/SDLx/LayerManager.xs @@ -98,23 +98,27 @@ AV * lmx_blit( manager, dest ) SDLx_LayerManager *manager SDL_Surface *dest + PREINIT: + int index, length, attached_layers, did_something; CODE: - manager->dest = dest; - RETVAL = newAV(); - int index = 0; - int length = av_len( manager->layers ) + 1; - int attached_layers = 0; - int did_something = 0; - + manager->dest = dest; + RETVAL = newAV(); + index = 0; + length = av_len( manager->layers ) + 1; + attached_layers = 0; + did_something = 0; + while(index < length) { - SDLx_Layer *layer = (SDLx_Layer *)bag2obj(*av_fetch(manager->layers, index, 0)); - + SDLx_Layer *layer; + layer = (SDLx_Layer *)bag2obj(*av_fetch(manager->layers, index, 0)); + if(layer->attached == 0) { if(layer->touched || manager->saved == 0) { - SDL_Rect *rect = (SDL_Rect *)safemalloc( sizeof(SDL_Rect) ); + SDL_Rect *rect; + rect = (SDL_Rect *)safemalloc( sizeof(SDL_Rect) ); rect->x = layer->pos->x; rect->y = layer->pos->y; rect->w = layer->clip->w; @@ -148,21 +152,23 @@ lmx_blit( manager, dest ) index = 0; while(index < length) { - SDLx_Layer *layer = (SDLx_Layer *)bag2obj(*av_fetch(manager->layers, index, 0)); + SDLx_Layer *layer; + layer = (SDLx_Layer *)bag2obj(*av_fetch(manager->layers, index, 0)); if(layer->attached == 1 || layer->attached == 2) { + SDL_Rect *rect; if(layer->attached == 1) { layer->pos->x = x + layer->attached_rel->x; layer->pos->y = y + layer->attached_rel->y; } - SDL_Rect *rect = (SDL_Rect *)safemalloc( sizeof(SDL_Rect) ); - rect->x = layer->pos->x; - rect->y = layer->pos->y; - rect->w = layer->clip->w; - rect->h = layer->clip->h; + rect = (SDL_Rect *)safemalloc( sizeof(SDL_Rect) ); + rect->x = layer->pos->x; + rect->y = layer->pos->y; + rect->w = layer->clip->w; + rect->h = layer->clip->h; SDL_BlitSurface(layer->surface, layer->clip, dest, rect); av_push(RETVAL, _sv_ref( rect, sizeof(SDL_Rect *), sizeof(SDL_Rect), "SDL::Rect" )); @@ -179,21 +185,28 @@ lmx_by_position( manager, x, y ) SDLx_LayerManager* manager int x int y - CODE: + PREINIT: int i; - SV *match = NULL; + SV *match; + CODE: + match = NULL; for( i = av_len( manager->layers ); i >= 0 && match == NULL; i-- ) { - SV *bag = *av_fetch(manager->layers, i, 0); - SDLx_Layer *layer = (SDLx_Layer *)bag2obj(bag); - SDL_Rect *clip = layer->clip; - SDL_Rect *pos = layer->pos; - SDL_Surface *surf = layer->surface; + SV *bag; + SDLx_Layer *layer; + SDL_Rect *clip, *pos; + SDL_Surface *surf; + bag = *av_fetch(manager->layers, i, 0); + layer = (SDLx_Layer *)bag2obj(bag); + clip = layer->clip; + pos = layer->pos; + surf = layer->surface; if ( pos->x <= x && x <= pos->x + clip->w && pos->y <= y && y <= pos->y + clip->h) { Uint8 r, g, b, a; - Uint32 pixel = _get_pixel(surf, x - pos->x, y - pos->y); + Uint32 pixel; + pixel = _get_pixel(surf, x - pos->x, y - pos->y); SDL_GetRGBA( pixel, surf->format, &r, &g, &b, &a ); if(a > 0) @@ -215,9 +228,11 @@ AV * lmx_ahead( manager, index ) SDLx_LayerManager *manager int index + PREINIT: + SDLx_Layer *layer; CODE: - SDLx_Layer *layer = (SDLx_Layer *)bag2obj(*av_fetch(manager->layers, index, 0)); - RETVAL = layers_ahead( layer ); + layer = (SDLx_Layer *)bag2obj(*av_fetch(manager->layers, index, 0)); + RETVAL = layers_ahead( layer ); OUTPUT: RETVAL @@ -225,19 +240,23 @@ AV * lmx_behind( manager, index ) SDLx_LayerManager *manager int index + PREINIT: + SDLx_Layer *layer; CODE: - SDLx_Layer *layer = (SDLx_Layer *)bag2obj(*av_fetch(manager->layers, index, 0)); - RETVAL = layers_behind( layer ); + layer = (SDLx_Layer *)bag2obj(*av_fetch(manager->layers, index, 0)); + RETVAL = layers_behind( layer ); OUTPUT: RETVAL void lmx_attach( manager, ... ) SDLx_LayerManager *manager + PREINIT: + int x, y, i; CODE: manager->saved = 0; - int x = -1; - int y = -1; + x = -1; + y = -1; if(SvIOK(ST(items - 1))) { @@ -254,10 +273,10 @@ lmx_attach( manager, ... ) if(-1 == x || -1 == y) SDL_GetMouseState(&x, &y); - int i; for( i = 1; i < items; i++ ) { - SDLx_Layer *layer = (SDLx_Layer *)bag2obj(ST(i)); + SDLx_Layer *layer; + layer = (SDLx_Layer *)bag2obj(ST(i)); layer->attached = 1; layer->attached_pos->x = layer->pos->x; layer->attached_pos->y = layer->pos->y; @@ -270,18 +289,19 @@ lmx_detach_xy( manager, x = -1, y = -1 ) SDLx_LayerManager *manager int x int y + PREINIT: + int index, length, lower_x, lower_y, offset_x, offset_y; CODE: - RETVAL = newAV(); - int index = 0; - int length = av_len( manager->layers ) + 1; - int lower_x; - int lower_y; - int offset_x = 0; - int offset_y = 0; + RETVAL = newAV(); + index = 0; + length = av_len( manager->layers ) + 1; + offset_x = 0; + offset_y = 0; while(index < length) { - SDLx_Layer *layer = (SDLx_Layer *)bag2obj(*av_fetch(manager->layers, index, 0)); - + SDLx_Layer *layer; + layer = (SDLx_Layer *)bag2obj(*av_fetch(manager->layers, index, 0)); + if(layer->attached == 1) { if(av_len(RETVAL) == -1) @@ -309,13 +329,16 @@ lmx_detach_xy( manager, x = -1, y = -1 ) void lmx_detach_back( manager ) SDLx_LayerManager *manager + PREINIT: + int index, length; CODE: - int index = 0; - int length = av_len( manager->layers ) + 1; + index = 0; + length = av_len( manager->layers ) + 1; while(index < length) { - SDLx_Layer *layer = (SDLx_Layer *)bag2obj(*av_fetch(manager->layers, index, 0)); - + SDLx_Layer *layer; + layer = (SDLx_Layer *)bag2obj(*av_fetch(manager->layers, index, 0)); + if(layer->attached == 1) { layer->attached = 0; @@ -323,7 +346,7 @@ lmx_detach_back( manager ) layer->pos->x = layer->attached_pos->x; layer->pos->y = layer->attached_pos->y; } - + index++; } manager->saved = 0; @@ -331,17 +354,20 @@ lmx_detach_back( manager ) AV * lmx_foreground( manager, ... ) SDLx_LayerManager *manager + PREINIT: + int x; CODE: RETVAL = newAV(); - int x; for(x = 1; x < items; x++) { - SDLx_Layer *layer = (SDLx_Layer *)bag2obj(ST(x)); - SDLx_LayerManager *manager = layer->manager; - int index = layer->index; /* we cant trust its value */ - int i; - + SDLx_Layer *layer; + SDLx_LayerManager *manager; + int index, i; SV *fetched; + layer = (SDLx_Layer *)bag2obj(ST(x)); + manager = layer->manager; + index = layer->index; /* we cant trust its value */ + for(i = 0; i <= av_len(manager->layers); i++) { fetched = *av_fetch(manager->layers, i, 0); @@ -356,7 +382,7 @@ lmx_foreground( manager, ... ) { AvARRAY(manager->layers)[i] = AvARRAY(manager->layers)[i + 1]; } - + AvARRAY(manager->layers)[i] = fetched; manager->saved = 0; } diff --git a/src/SDLx/Surface.xs b/src/SDLx/Surface.xs index f3fdb017..2bd6fe0b 100644 --- a/src/SDLx/Surface.xs +++ b/src/SDLx/Surface.xs @@ -18,15 +18,18 @@ SV * get_pixel32 (SDL_Surface *surface, int x, int y) { + Uint32 *pixels; + void* s; + SV* sv; /* Convert the pixels to 32 bit */ - Uint32 *pixels = (Uint32 *)surface->pixels; + pixels = (Uint32 *)surface->pixels; /* Get the requested pixel */ - void* s = pixels + _calc_offset(surface, x, y); + s = pixels + _calc_offset(surface, x, y); /* printf( " Pixel = %d, Ptr = %p \n", *((int*) s), s ); */ - SV* sv = newSV_type(SVt_PV); + sv = newSV_type(SVt_PV); SvPV_set(sv, s); SvPOK_on(sv); SvLEN_set(sv, 0); @@ -37,13 +40,15 @@ SV * get_pixel32 (SDL_Surface *surface, int x, int y) SV * construct_p_matrix ( SDL_Surface *surface ) { /* return get_pixel32( surface, 0, 0); */ - AV * matrix = newAV(); + AV * matrix; int i, j; - i = 0; - for( i =0 ; i < surface->w; i++ ) + i = 0; + matrix = newAV(); + for( i = 0; i < surface->w; i++ ) { - AV * matrix_row = newAV(); - for( j =0 ; j < surface->h; j++ ) + AV * matrix_row; + matrix_row = newAV(); + for( j = 0; j < surface->h; j++ ) av_push( matrix_row, get_pixel32(surface, i,j) ); av_push( matrix, newRV_noinc((SV *)matrix_row) ); @@ -106,10 +111,11 @@ surfacex_get_pixel_xs ( surface, x, y ) SDL_Surface *surface int x int y + PREINIT: + int offset; CODE: _int_range( &x, 0, surface->w ); _int_range( &y, 0, surface->h ); - int offset; offset = _calc_offset( surface, x, y); RETVAL = _get_pixel( surface, offset ); OUTPUT: @@ -122,10 +128,11 @@ surfacex_set_pixel_xs ( surface, x, y, value ) int x int y unsigned int value + PREINIT: + int offset; CODE: _int_range( &x, 0, surface->w ); _int_range( &y, 0, surface->h ); - int offset; offset = _calc_offset( surface, x, y); if(SDL_MUSTLOCK(surface) && SDL_LockSurface(surface) < 0) croak( "Locking surface in set_pixels failed: %s", SDL_GetError() ); @@ -150,9 +157,11 @@ surfacex_draw_rect ( surface, rt, color ) SDL_Surface *surface SV* rt SV* color - CODE: - Uint32 m_color = __map_rgba( color, surface->format ); + PREINIT: + Uint32 m_color; SDL_Rect r_rect; + CODE: + m_color = __map_rgba( color, surface->format ); if( SvOK(rt) ) r_rect = *(SDL_Rect*)bag2obj( create_mortal_rect( rt ) ); @@ -169,11 +178,15 @@ surfacex_draw_polygon ( surface, vectors, color, ... ) SV* surface AV* vectors Uint32 color + PREINIT: + SDL_Surface *_surface; + AV *vx, *vy, *vertex; + int n; + Sint16 *_vx, *_vy; CODE: - SDL_Surface * _surface = (SDL_Surface *)bag2obj(surface); - AV* vx = newAV(); - AV* vy = newAV(); - AV* vertex; + _surface = (SDL_Surface *)bag2obj(surface); + vx = newAV(); + vy = newAV(); while(av_len(vectors) >= 0) { vertex = (AV*)SvRV(av_shift(vectors)); @@ -181,9 +194,9 @@ surfacex_draw_polygon ( surface, vectors, color, ... ) av_push(vy, av_shift(vertex)); } - int n = av_len(vx) + 1; - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); + n = av_len(vx) + 1; + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); if ( items > 3 && SvTRUE( ST(3) ) ) aapolygonColor( _surface, _vx, _vy, n, color ); else @@ -200,15 +213,15 @@ void surfacex_blit( src, dest, ... ) SV *src SV *dest + PREINIT: + SDL_Surface *_src, *_dest; + SDL_Rect _src_rect, _dest_rect; CODE: assert_surface(src); assert_surface(dest); /* just return the pointer stored in the bag */ - SDL_Surface *_src = (SDL_Surface *)bag2obj(src); - SDL_Surface *_dest = (SDL_Surface *)bag2obj(dest); - - SDL_Rect _src_rect; - SDL_Rect _dest_rect; + _src = (SDL_Surface *)bag2obj(src); + _dest = (SDL_Surface *)bag2obj(dest); if( items > 2 && SvOK(ST(2)) ) _src_rect = *(SDL_Rect *)bag2obj( create_mortal_rect( ST(2) ) ); diff --git a/src/SDLx/Validate.h b/src/SDLx/Validate.h index 22ea235b..6bd40123 100644 --- a/src/SDLx/Validate.h +++ b/src/SDLx/Validate.h @@ -142,8 +142,9 @@ AV* __list_rgb( SV* color ) AV* RETVAL ; if ( 0 == strcmp("number", format) ) { - RETVAL = (AV*)sv_2mortal( (SV *) newAV() ); - unsigned int _color = SvUV(sv_2mortal(_color_number(color, newSVuv(0)))); + unsigned int _color; + RETVAL = (AV*)sv_2mortal( (SV *) newAV() ); + _color = SvUV(sv_2mortal(_color_number(color, newSVuv(0)))); av_push(RETVAL, newSVuv(_color >> 16 & 0xFF)); av_push(RETVAL, newSVuv(_color >> 8 & 0xFF)); av_push(RETVAL, newSVuv(_color & 0xFF)); @@ -155,8 +156,9 @@ AV* __list_rgb( SV* color ) } else if ( 0 == strcmp("SDL::Color", format) ) { - RETVAL = (AV*)sv_2mortal((SV *) newAV() ); - SDL_Color *_color = (SDL_Color *)bag2obj(color); + SDL_Color *_color; + RETVAL = (AV*)sv_2mortal((SV *) newAV() ); + _color = (SDL_Color *)bag2obj(color); av_push(RETVAL, newSVuv(_color->r)); av_push(RETVAL, newSVuv(_color->g)); av_push(RETVAL, newSVuv(_color->b)); @@ -174,12 +176,14 @@ AV* __list_rgb( SV* color ) AV* __list_rgba( SV* color ) { - char *format = _color_format(color); - AV* RETVAL ; + char *format; + AV* RETVAL; + format = _color_format(color); if ( 0 == strcmp("number", format) ) { - RETVAL = (AV*)sv_2mortal((SV *) newAV() ); - unsigned int _color = SvUV(sv_2mortal(_color_number(color, sv_2mortal(newSVuv(1))))); + unsigned int _color; + RETVAL = (AV*)sv_2mortal((SV *) newAV() ); + _color = SvUV(sv_2mortal(_color_number(color, sv_2mortal(newSVuv(1))))); av_push(RETVAL, newSVuv(_color >> 24 & 0xFF)); av_push(RETVAL, newSVuv(_color >> 16 & 0xFF)); av_push(RETVAL, newSVuv(_color >> 8 & 0xFF)); @@ -191,8 +195,9 @@ AV* __list_rgba( SV* color ) } else if ( 0 == strcmp("SDL::Color", format) ) { - RETVAL = (AV*)sv_2mortal((SV *) newAV() ); - SDL_Color *_color = (SDL_Color*)bag2obj(color); + SDL_Color *_color; + RETVAL = (AV*)sv_2mortal((SV *) newAV() ); + _color = (SDL_Color*)bag2obj(color); av_push(RETVAL, newSVuv(_color->r)); av_push(RETVAL, newSVuv(_color->g)); av_push(RETVAL, newSVuv(_color->b)); @@ -214,10 +219,11 @@ AV* __list_rgba( SV* color ) unsigned int __map_rgb( SV* color, SDL_PixelFormat* format ) { Uint8 r, g, b; - AV* a = __list_rgb( color ); - r = SvUV(*av_fetch(a, 0, 0)); - g = SvUV(*av_fetch(a, 1, 0)); - b = SvUV(*av_fetch(a, 2, 0)); + AV* a; + a = __list_rgb( color ); + r = SvUV(*av_fetch(a, 0, 0)); + g = SvUV(*av_fetch(a, 1, 0)); + b = SvUV(*av_fetch(a, 2, 0)); return SDL_MapRGB( format, r, g, b ); } @@ -225,11 +231,12 @@ unsigned int __map_rgb( SV* color, SDL_PixelFormat* format ) unsigned int __map_rgba( SV* color, SDL_PixelFormat* format ) { int r, g, b, a; - AV* ar = __list_rgba( color ); - r = SvUV(*av_fetch(ar, 0, 0)); - g = SvUV(*av_fetch(ar, 1, 0)); - b = SvUV(*av_fetch(ar, 2, 0)); - a = SvUV(*av_fetch(ar, 3, 0)); + AV* ar; + ar = __list_rgba( color ); + r = SvUV(*av_fetch(ar, 0, 0)); + g = SvUV(*av_fetch(ar, 1, 0)); + b = SvUV(*av_fetch(ar, 2, 0)); + a = SvUV(*av_fetch(ar, 3, 0)); return SDL_MapRGBA( format, r, g, b, a ); } diff --git a/src/helper.h b/src/helper.h index 1d2ee9a5..29bc1bb3 100644 --- a/src/helper.h +++ b/src/helper.h @@ -4,6 +4,9 @@ #include #include "SDL_thread.h" +#ifndef Uint32 +#define Uint32 uint32_t +#endif PerlInterpreter * perl = NULL; @@ -22,11 +25,15 @@ void *bag2obj( SV *bag ) SV *obj2bag( int size_ptr, void *obj, char *CLASS ) { - SV * objref = newSV( size_ptr ); - void** pointers = safemalloc(3 * sizeof(void*)); + SV * objref; + void** pointers; + Uint32 *threadid; + + objref = newSV( size_ptr ); + pointers = safemalloc(3 * sizeof(void*)); pointers[0] = (void*)obj; pointers[1] = (void*)PERL_GET_CONTEXT; - Uint32 *threadid = (Uint32 *)safemalloc(sizeof(Uint32)); + threadid = (Uint32 *)safemalloc(sizeof(Uint32)); *threadid = SDL_ThreadID(); pointers[2] = (void*)threadid; sv_setref_pv( objref, CLASS, (void *)pointers); @@ -35,17 +42,23 @@ SV *obj2bag( int size_ptr, void *obj, char *CLASS ) SV *cpy2bag( void *object, int p_size, int s_size, char *package ) { - SV *ref = newSV( p_size ); - void *copy = safemalloc( s_size ); + void** pointers; + Uint32 *threadid; + SV* ref; + SV* a; + void *copy; + + ref = newSV( p_size ); + copy = safemalloc( s_size ); memcpy( copy, object, s_size ); - void** pointers = safemalloc(3 * sizeof(void*)); + pointers = safemalloc(3 * sizeof(void*)); pointers[0] = (void*)copy; pointers[1] = (void*)PERL_GET_CONTEXT; - Uint32 *threadid = (Uint32 *)safemalloc(sizeof(Uint32)); + threadid = (Uint32 *)safemalloc(sizeof(Uint32)); *threadid = SDL_ThreadID(); pointers[2] = (void*)threadid; - SV* a = sv_setref_pv(ref, package, (void *)pointers); + a = sv_setref_pv(ref, package, (void *)pointers); return a; } @@ -71,16 +84,20 @@ void objDESTROY(SV *bag, void (* callback)(void *object)) SV *_sv_ref( void *object, int p_size, int s_size, char *package ) { - SV *ref = newSV( p_size ); - void *copy = safemalloc( s_size ); - memcpy( copy, object, s_size ); + SV *ref; + void *copy; + void** pointers; + Uint32 *threadid; - void** pointers = safemalloc(3 * sizeof(void*)); - pointers[0] = (void*)copy; - pointers[1] = (void*)perl; - Uint32 *threadid = (Uint32 *)safemalloc(sizeof(Uint32)); - *threadid = SDL_ThreadID(); - pointers[2] = (void*)threadid; + ref = newSV( p_size ); + copy = safemalloc( s_size ); + memcpy( copy, object, s_size ); + pointers = safemalloc(3 * sizeof(void*)); + pointers[0] = (void*)copy; + pointers[1] = (void*)perl; + threadid = (Uint32 *)safemalloc(sizeof(Uint32)); + *threadid = SDL_ThreadID(); + pointers[2] = (void*)threadid; return sv_setref_pv(ref, package, (void *)pointers); } diff --git a/typemap b/typemap index c3ba997a..5e35f8bd 100644 --- a/typemap +++ b/typemap @@ -111,12 +111,14 @@ O_OBJECT_NPGC O_OBJECT if ($var) { - void** pointers = malloc(3 * sizeof(void*)); - pointers[0] = (void*)$var; - pointers[1] = (void*)PERL_GET_CONTEXT; - Uint32 *threadid = (Uint32 *)safemalloc(sizeof(Uint32)); - *threadid = SDL_ThreadID(); - pointers[2] = (void*)threadid; + Uint32 *threadid; + void** pointers; + pointers = malloc(3 * sizeof(void*)); + pointers[0] = (void*)$var; + pointers[1] = (void*)PERL_GET_CONTEXT; + threadid = (Uint32 *)safemalloc(sizeof(Uint32)); + *threadid = SDL_ThreadID(); + pointers[2] = (void*)threadid; sv_setref_pv( $arg, CLASS, (void*)pointers ); } else { XSRETURN_UNDEF; From 6fdd2f9fd4d18bdd131972d3f82d5a767e493e48 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Sun, 3 Jun 2012 20:44:16 +0200 Subject: [PATCH 088/153] declarations before code --- src/GFX/Primitives.xs | 77 ++++++++++++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 22 deletions(-) diff --git a/src/GFX/Primitives.xs b/src/GFX/Primitives.xs index 9adb1e8a..df1f5ee0 100644 --- a/src/GFX/Primitives.xs +++ b/src/GFX/Primitives.xs @@ -684,9 +684,12 @@ gfx_prim_polygon_RGBA(dst, vx, vy, n, r, g, b, a) Uint8 g Uint8 b Uint8 a + PREINIT: + Sint16 *_vx; + Sint16 *_vy; CODE: - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); RETVAL = polygonRGBA(dst, _vx, _vy, n, r, g, b, a); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); @@ -701,9 +704,12 @@ gfx_prim_aapolygon_color(dst, vx, vy, n, color) AV* vy int n Uint32 color + PREINIT: + Sint16 *_vx; + Sint16 *_vy; CODE: - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); RETVAL = aapolygonColor(dst, _vx, _vy, n, color); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); @@ -721,9 +727,12 @@ gfx_prim_aapolygon_RGBA(dst, vx, vy, n, r, g, b, a) Uint8 g Uint8 b Uint8 a + PREINIT: + Sint16 *_vx; + Sint16 *_vy; CODE: - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); RETVAL = aapolygonRGBA(dst, _vx, _vy, n, r, g, b, a); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); @@ -738,9 +747,12 @@ gfx_prim_filled_polygon_color(dst, vx, vy, n, color) AV* vy int n Uint32 color + PREINIT: + Sint16 *_vx; + Sint16 *_vy; CODE: - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); RETVAL = filledPolygonColor(dst, _vx, _vy, n, color); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); @@ -758,9 +770,12 @@ gfx_prim_filled_polygon_RGBA(dst, vx, vy, n, r, g, b, a) Uint8 g Uint8 b Uint8 a + PREINIT: + Sint16 *_vx; + Sint16 *_vy; CODE: - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); RETVAL = filledPolygonRGBA(dst, _vx, _vy, n, r, g, b, a); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); @@ -779,9 +794,12 @@ gfx_prim_textured_polygon(dst, vx, vy, n, texture, texture_dx, texture_dy) SDL_Surface * texture int texture_dx int texture_dy + PREINIT: + Sint16 *_vx; + Sint16 *_vy; CODE: - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); RETVAL = texturedPolygon(dst, _vx, _vy, n, texture, texture_dx, texture_dy); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); @@ -819,9 +837,12 @@ gfx_prim_filled_polygon_color_MT(dst, vx, vy, n, color, polyInts, polyAllocated) Uint32 color int **polyInts int *polyAllocated + PREINIT: + Sint16 *_vx; + Sint16 *_vy; CODE: - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); RETVAL = filledPolygonColorMT(dst, _vx, _vy, n, color, polyInts, polyAllocated); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); @@ -841,9 +862,12 @@ gfx_prim_filled_polygon_RGBA_MT(dst, vx, vy, n, r, g, b, a, polyInts, polyAlloca Uint8 a int **polyInts int *polyAllocated + PREINIT: + Sint16 *_vx; + Sint16 *_vy; CODE: - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); RETVAL = filledPolygonRGBAMT(dst, _vx, _vy, n, r, g, b, a, polyInts, polyAllocated); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); @@ -862,9 +886,12 @@ gfx_prim_textured_polygon_MT(dst, vx, vy, n, texture, texture_dx, texture_dy, po int texture_dy int **polyInts int *polyAllocated + PREINIT: + Sint16 *_vx; + Sint16 *_vy; CODE: - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); RETVAL = texturedPolygonMT(dst, _vx, _vy, n, texture, texture_dx, texture_dy, polyInts, polyAllocated); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); @@ -934,9 +961,12 @@ gfx_prim_bezier_color(dst, vx, vy, n, s, color) int n int s Uint32 color + PREINIT: + Sint16 *_vx; + Sint16 *_vy; CODE: - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); RETVAL = bezierColor(dst, _vx, _vy, n, s, color); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); @@ -955,9 +985,12 @@ gfx_prim_bezier_RGBA(dst, vx, vy, n, s, r, g, b, a) Uint8 g Uint8 b Uint8 a + PREINIT: + Sint16 *_vx; + Sint16 *_vy; CODE: - Sint16 * _vx = av_to_sint16(vx); - Sint16 * _vy = av_to_sint16(vy); + _vx = av_to_sint16(vx); + _vy = av_to_sint16(vy); RETVAL = bezierRGBA(dst, _vx, _vy, n, s, r, g, b, a); _svinta_free( _vx, av_len(vx) ); _svinta_free( _vy, av_len(vy) ); From 677a7d3633bed079aa0a446aa2e98baf89e82db7 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Sun, 3 Jun 2012 22:44:02 +0200 Subject: [PATCH 089/153] switch for libnames (libABC.lib vs. -lABC) --- inc/My/Builder.pm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/inc/My/Builder.pm b/inc/My/Builder.pm index 29e4e01c..e6d351a3 100644 --- a/inc/My/Builder.pm +++ b/inc/My/Builder.pm @@ -80,7 +80,9 @@ sub find_subsystems { $found{$_} = 1 foreach (@$h); $param->{libs}->{$library} = 1; push @{ $param->{defines} }, "-D$libraries->{$library}{define}"; - push @{ $param->{links} }, "-l$libraries->{$library}{lib}"; + push @{ $param->{links} }, Alien::SDL::ConfigData->config('build_cc') eq 'cl' + ? "lib$libraries->{$library}{lib}.lib" + : "-l$libraries->{$library}{lib}"; } else { # I disabled that, so the libs are compiled but the HAVE_* defines are not set From 71d0125fb7a0ad4ecb20ca28d30cd633742e248b Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Sun, 3 Jun 2012 23:16:35 +0200 Subject: [PATCH 090/153] declarations before code --- src/Image.xs | 209 +++++++++++++++++++++++---------------------------- 1 file changed, 96 insertions(+), 113 deletions(-) diff --git a/src/Image.xs b/src/Image.xs index e8ce41cb..c0a196c1 100644 --- a/src/Image.xs +++ b/src/Image.xs @@ -15,28 +15,19 @@ void test( char** xpm) { + int w, h, ncolors, cpp; + char *line; + char ***xpmlines = NULL; -int x, y; -int w, h, ncolors, cpp; -char *line; -char ***xpmlines = NULL; + xpmlines = &xpm; + line = *(*xpmlines)++; -xpmlines = &xpm; - -line = *(*xpmlines)++; - -if(sscanf(line, "%d %d %d %d", &w, &h, &ncolors, &cpp) != 4 - || w <= 0 || h <= 0 || ncolors <= 0 || cpp <= 0) { + if(sscanf(line, "%d %d %d %d", &w, &h, &ncolors, &cpp) != 4 + || w <= 0 || h <= 0 || ncolors <= 0 || cpp <= 0) warn( "Invalid format description %s \n %d %d %d %d", line, w, h, ncolors, cpp); - } - - } - - - MODULE = SDL::Image PACKAGE = SDL::Image PREFIX = image_ #ifdef HAVE_SDL_IMAGE @@ -45,15 +36,14 @@ const SDL_version* image_linked_version() PREINIT: char* CLASS = "SDL::Version"; - SDL_version *version; + SDL_version *version, *version_dont_free; CODE: - version = (SDL_version *) safemalloc ( sizeof(SDL_version) ); - SDL_version* version_dont_free = (SDL_version *)IMG_Linked_Version(); - - version->major = version_dont_free->major; - version->minor = version_dont_free->minor; - version->patch = version_dont_free->patch; - RETVAL = version; + version = (SDL_version *)safemalloc ( sizeof(SDL_version) ); + version_dont_free = (SDL_version *)IMG_Linked_Version(); + version->major = version_dont_free->major; + version->minor = version_dont_free->minor; + version->patch = version_dont_free->patch; + RETVAL = version; OUTPUT: RETVAL @@ -111,9 +101,9 @@ image_load_typed_rw(src, freesrc, type) SDL_Surface * image_load_ICO_rw(src) SDL_RWops* src - PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + PREINIT: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadICO_RW(src); OUTPUT: RETVAL @@ -122,9 +112,9 @@ image_load_ICO_rw(src) SDL_Surface * image_load_CUR_rw(src) SDL_RWops* src - PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + PREINIT: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadCUR_RW(src); OUTPUT: RETVAL @@ -134,9 +124,9 @@ image_load_CUR_rw(src) SDL_Surface * image_load_BMP_rw(src) SDL_RWops* src - PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + PREINIT: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadBMP_RW(src); OUTPUT: RETVAL @@ -144,9 +134,9 @@ image_load_BMP_rw(src) SDL_Surface * image_load_GIF_rw(src) SDL_RWops* src - PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + PREINIT: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadGIF_RW(src); OUTPUT: RETVAL @@ -154,9 +144,9 @@ image_load_GIF_rw(src) SDL_Surface * image_load_JPG_rw(src) SDL_RWops* src - PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + PREINIT: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadJPG_RW(src); OUTPUT: RETVAL @@ -164,9 +154,9 @@ image_load_JPG_rw(src) SDL_Surface * image_load_LBM_rw(src) SDL_RWops* src - PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + PREINIT: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadLBM_RW(src); OUTPUT: RETVAL @@ -174,9 +164,9 @@ image_load_LBM_rw(src) SDL_Surface * image_load_PCX_rw(src) SDL_RWops* src - PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + PREINIT: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadPCX_RW(src); OUTPUT: RETVAL @@ -184,9 +174,9 @@ image_load_PCX_rw(src) SDL_Surface * image_load_PNG_rw(src) SDL_RWops* src - PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + PREINIT: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadPNG_RW(src); OUTPUT: RETVAL @@ -194,9 +184,9 @@ image_load_PNG_rw(src) SDL_Surface * image_load_PNM_rw(src) SDL_RWops* src - PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + PREINIT: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadPNM_RW(src); OUTPUT: RETVAL @@ -204,9 +194,9 @@ image_load_PNM_rw(src) SDL_Surface * image_load_TGA_rw(src) SDL_RWops* src - PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + PREINIT: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadTGA_RW(src); OUTPUT: RETVAL @@ -214,9 +204,9 @@ image_load_TGA_rw(src) SDL_Surface * image_load_TIF_rw(src) SDL_RWops* src - PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + PREINIT: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadTIF_RW(src); OUTPUT: RETVAL @@ -225,54 +215,53 @@ SDL_Surface * image_load_XCF_rw(src) SDL_RWops* src PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadXCF_RW(src); OUTPUT: RETVAL SDL_Surface * image_load_XPM_rw(src) - SDL_RWops* src + SDL_RWops *src PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadXPM_RW(src); OUTPUT: RETVAL SDL_Surface * image_load_XV_rw(src) - SDL_RWops* src + SDL_RWops *src PREINIT: - char *CLASS = "SDL::Surface"; - CODE: + char *CLASS = "SDL::Surface"; + CODE: RETVAL = IMG_LoadXV_RW(src); OUTPUT: RETVAL int image_is_BMP(src) - SDL_RWops* src; + SDL_RWops *src; CODE: - RETVAL=IMG_isBMP(src); + RETVAL = IMG_isBMP(src); OUTPUT: RETVAL #if (SDL_IMAGE_MAJOR_VERSION >= 1) && (SDL_IMAGE_MINOR_VERSION >= 2) && (SDL_IMAGE_PATCHLEVEL >= 10) int image_is_CUR(src) - SDL_RWops* src; + SDL_RWops *src; CODE: - RETVAL=IMG_isCUR(src); + RETVAL = IMG_isCUR(src); OUTPUT: RETVAL - int image_is_ICO(src) - SDL_RWops* src; + SDL_RWops *src; CODE: - RETVAL=IMG_isICO(src); + RETVAL = IMG_isICO(src); OUTPUT: RETVAL @@ -280,118 +269,112 @@ int image_is_ICO(src) int image_is_GIF(src) - SDL_RWops * src; + SDL_RWops *src; CODE: - RETVAL=IMG_isGIF(src); + RETVAL = IMG_isGIF(src); OUTPUT: RETVAL int image_is_JPG(src) - SDL_RWops * src; + SDL_RWops *src; CODE: - RETVAL=IMG_isJPG(src); + RETVAL = IMG_isJPG(src); OUTPUT: RETVAL int image_is_LBM(src) - SDL_RWops * src; + SDL_RWops *src; CODE: - RETVAL=IMG_isLBM(src); + RETVAL = IMG_isLBM(src); OUTPUT: RETVAL int image_is_PCX(src) - SDL_RWops * src; + SDL_RWops *src; CODE: - RETVAL=IMG_isPCX(src); + RETVAL = IMG_isPCX(src); OUTPUT: RETVAL int image_is_PNG(src) - SDL_RWops * src; + SDL_RWops *src; CODE: - RETVAL=IMG_isPNG(src); + RETVAL = IMG_isPNG(src); OUTPUT: RETVAL int image_is_PNM(src) - SDL_RWops * src; + SDL_RWops *src; CODE: - RETVAL=IMG_isPNM(src); + RETVAL = IMG_isPNM(src); OUTPUT: RETVAL int image_is_TIF(src) - SDL_RWops * src; + SDL_RWops *src; CODE: - RETVAL=IMG_isTIF(src); + RETVAL = IMG_isTIF(src); OUTPUT: RETVAL int image_is_XCF(src) - SDL_RWops * src; + SDL_RWops *src; CODE: - RETVAL=IMG_isXCF(src); + RETVAL = IMG_isXCF(src); OUTPUT: RETVAL int image_is_XPM(src) - SDL_RWops * src; + SDL_RWops *src; CODE: - RETVAL=IMG_isXPM(src); + RETVAL = IMG_isXPM(src); OUTPUT: RETVAL int image_is_XV(src) - SDL_RWops * src; + SDL_RWops *src; CODE: - RETVAL=IMG_isXV(src); + RETVAL = IMG_isXV(src); OUTPUT: RETVAL - - SDL_Surface * image_read_XPM_from_array(array, w) int w AV* array PREINIT: - char* CLASS = "SDL::Surface"; + char *CLASS = "SDL::Surface"; + int x, len; + SV **elem; + char **src_x; + char *temp; CODE: /*make columns first */ - int x, len; - SV ** elem; - len = av_len(array) + 1; - char** src_x = safemalloc( len * sizeof(char*)); - char* temp; - for(x=0; x < len ; x++) + len = av_len(array) + 1; + src_x = safemalloc( len * sizeof(char*) ); + for(x = 0; x < len; x++) { - elem = av_fetch(array, x, 0) ; - temp = SvPV_nolen(*elem); - src_x[x] = safemalloc(w * sizeof(char) ); + elem = av_fetch(array, x, 0) ; + temp = SvPV_nolen(*elem); + src_x[x] = safemalloc( w * sizeof(char) ); memcpy( src_x[x], temp, w * sizeof(char) ); /*warn("put in %s", src_x[x]); */ } - /*test(src_x); */ - RETVAL = IMG_ReadXPMFromArray( src_x) ; - for(x=0; x < len; x++) - safefree(src_x[x]); + /*test(src_x); */ + RETVAL = IMG_ReadXPMFromArray( src_x ); + for(x = 0; x < len; x++) + safefree(src_x[x]); safefree(src_x); - OUTPUT: RETVAL - - - - #endif From 1b566569adb863bd9c16ed8864acf21949823281 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Wed, 6 Jun 2012 23:01:49 +0200 Subject: [PATCH 091/153] declarations before code --- src/Mixer/Effects.xs | 115 ++++++++++++++++++------------------------- src/Mixer/Mixer.xs | 20 +++----- src/Mixer/Music.xs | 68 ++++++++++++------------- src/Mixer/Samples.xs | 4 +- src/TTF/TTF.xs | 63 +++++++++++------------- 5 files changed, 123 insertions(+), 147 deletions(-) diff --git a/src/Mixer/Effects.xs b/src/Mixer/Effects.xs index ba417070..44f0e386 100644 --- a/src/Mixer/Effects.xs +++ b/src/Mixer/Effects.xs @@ -26,48 +26,47 @@ char* effect_func_done_cb = NULL; void effect_func(int chan, void *stream, int len, void *udata) { ENTER_TLS_CONTEXT; - Sint16 *buf = (Sint16 *)stream; - - len /= 2; /* 2 bytes ber sample */ - - dSP; /* initialize stack pointer */ - - ENTER; /* everything created after here */ - SAVETMPS; /* ...is a temporary variable. */ - - PUSHMARK(SP); /* remember the stack pointer */ - XPUSHs(sv_2mortal(newSViv(chan))); - XPUSHs(sv_2mortal(newSViv(len))); - XPUSHs(sv_2mortal(newSVsv(udata))); /* push something onto the stack */ - int i; - for(i = 0; i < len; i++) - XPUSHs(sv_2mortal(newSViv(buf[i]))); - - PUTBACK; /* make local stack pointer global */ - - /*if(cb != (SV*)NULL) */ { - int count = call_pv(effect_func_cb, G_ARRAY); /* call the function */ - SPAGAIN; /* refresh stack pointer */ - - if(count == len + 1) - *(SV *)udata = *(newSVsv(POPs)); - - if(count) + dSP; /* initialize stack pointer */ + int i; + Sint16 *buf = (Sint16 *)stream; + + len /= 2; /* 2 bytes ber sample */ + + ENTER; /* everything created after here */ + SAVETMPS; /* ...is a temporary variable. */ + + PUSHMARK(SP); /* remember the stack pointer */ + XPUSHs(sv_2mortal(newSViv(chan))); + XPUSHs(sv_2mortal(newSViv(len))); + XPUSHs(sv_2mortal(newSVsv(udata))); /* push something onto the stack */ + for(i = 0; i < len; i++) + XPUSHs(sv_2mortal(newSViv(buf[i]))); + + PUTBACK; /* make local stack pointer global */ + + /*if(cb != (SV*)NULL) */ { - memset(buf, 0, len * 2); /* clear the buffer */ - - for(i = len - 1; i >= 0; i--) + int count = call_pv(effect_func_cb, G_ARRAY); /* call the function */ + SPAGAIN; /* refresh stack pointer */ + + if(count == len + 1) + *(SV *)udata = *(newSVsv(POPs)); + + if(count) { - buf[i] = POPi; + memset(buf, 0, len * 2); /* clear the buffer */ + + for(i = len - 1; i >= 0; i--) + buf[i] = POPi; } + + PUTBACK; } - PUTBACK; + FREETMPS; /* free that return value */ + LEAVE; /* ...and the XPUSHed "mortal" args. */ } - - FREETMPS; /* free that return value */ - LEAVE; /* ...and the XPUSHed "mortal" args. */ LEAVE_TLS_CONTEXT; } @@ -79,15 +78,11 @@ void effect_pm_func(void *udata, Uint8 *stream, int len) void effect_done(int chan, void *udata) { ENTER_TLS_CONTEXT; - - dSP; /* initialize stack pointer */ - PUSHMARK(SP); /* remember the stack pointer */ - - /*if(fcb != (SV*)NULL) */ - /*warn ( "Called %s", effect_func_done_cb ); */ - - call_pv(effect_func_done_cb, G_DISCARD|G_VOID); /* call the function */ - + { + dSP; /* initialize stack pointer */ + PUSHMARK(SP); /* remember the stack pointer */ + call_pv(effect_func_done_cb, G_DISCARD|G_VOID); /* call the function */ + } LEAVE_TLS_CONTEXT; } @@ -107,26 +102,21 @@ mixeff_register(channel, func, done, arg) SV *arg CODE: if(effects == NULL) - { effects = safemalloc(MAX_EFFECTS* sizeof(void*)); - } if(effects_done == NULL) - { effects_done = safemalloc(MAX_EFFECTS* sizeof(void*)); - } GET_TLS_CONTEXT; - effect_func_cb = func; + effect_func_cb = func; effect_func_done_cb = done; if(registered_effects <= MAX_EFFECTS ) { - effects[registered_effects] = (void*)&effect_func; - effects_done[registered_effects] = (void*)&effect_done; + effects[registered_effects] = (void *)&effect_func; + effects_done[registered_effects] = (void *)&effect_done; if(0 != Mix_RegisterEffect(channel, effects[registered_effects], effects_done[registered_effects], arg)) { /*warn( "Registered %d %p %p", registered_effects, effects[registered_effects], effects_done[registered_effects]); */ - RETVAL = registered_effects; registered_effects++; } @@ -137,9 +127,7 @@ mixeff_register(channel, func, done, arg) } } else - { RETVAL = -1; - } OUTPUT: RETVAL @@ -163,25 +151,21 @@ int mixeff_unregister( channel, func ) int channel int func - CODE: - - + PREINIT: int check; + CODE: if( func <= registered_effects) { - check = Mix_UnregisterEffect(channel, effects[func]); - if (check == 0 ) - { - warn ("Error unregistering: %s", Mix_GetError() ); - } + check = Mix_UnregisterEffect(channel, effects[func]); + if( check == 0 ) + warn ("Error unregistering: %s", Mix_GetError() ); } else { warn (" Invalid effect id %d, currently %d effects registered", func, registered_effects); check = 0; } - - RETVAL = check; + RETVAL = check; OUTPUT: RETVAL @@ -239,11 +223,8 @@ mixeff_set_post_mix(func = NULL, arg = NULL) SV *arg CODE: GET_TLS_CONTEXT; - if(func != (SV *)NULL) - { Mix_SetPostMix(&effect_pm_func, arg); - } else Mix_SetPostMix(NULL, NULL); diff --git a/src/Mixer/Mixer.xs b/src/Mixer/Mixer.xs index 624b1b50..59201e1a 100644 --- a/src/Mixer/Mixer.xs +++ b/src/Mixer/Mixer.xs @@ -70,25 +70,23 @@ const SDL_version * mixer_linked_version () PREINIT: char* CLASS = "SDL::Version"; - SDL_version *version; + SDL_version *version, *version_dont_free; CODE: - version = (SDL_version *) safemalloc ( sizeof(SDL_version) ); - SDL_version* version_dont_free = (SDL_version *)Mix_Linked_Version(); - - version->major = version_dont_free->major; - version->minor = version_dont_free->minor; - version->patch = version_dont_free->patch; - RETVAL = version; + version = (SDL_version *)safemalloc( sizeof(SDL_version) ); + version_dont_free = (SDL_version *)Mix_Linked_Version(); + version->major = version_dont_free->major; + version->minor = version_dont_free->minor; + version->patch = version_dont_free->patch; + RETVAL = version; OUTPUT: RETVAL - int mixer_open_audio ( frequency, format, channels, chunksize ) int frequency Uint16 format int channels - int chunksize + int chunksize CODE: RETVAL = Mix_OpenAudio(frequency, format, channels, chunksize); OUTPUT: @@ -99,8 +97,6 @@ mixer_close_audio () CODE: Mix_CloseAudio(); - - AV * mixer_query_spec () CODE: diff --git a/src/Mixer/Music.xs b/src/Mixer/Music.xs index d87d15c7..e2e16e36 100644 --- a/src/Mixer/Music.xs +++ b/src/Mixer/Music.xs @@ -15,45 +15,46 @@ char *fcb = NULL; void mix_func(void *udata, Uint8 *stream, int len) { PERL_SET_CONTEXT(parent_perl); - dSP; /* initialize stack pointer */ - ENTER; /* everything created after here */ - SAVETMPS; /* ...is a temporary variable. */ + { + dSP; /* initialize stack pointer */ + ENTER; /* everything created after here */ + SAVETMPS; /* ...is a temporary variable. */ - PUSHMARK(SP); /* remember the stack pointer */ - XPUSHs(sv_2mortal(newSViv(*(int*)udata))); /* push something onto the stack */ - XPUSHs(sv_2mortal(newSViv(len))); - *(int*)udata = *(int*)udata + len; - PUTBACK; /* make local stack pointer global */ + PUSHMARK(SP); /* remember the stack pointer */ + XPUSHs(sv_2mortal(newSViv(*(int*)udata))); /* push something onto the stack */ + XPUSHs(sv_2mortal(newSViv(len))); + *(int*)udata = *(int*)udata + len; + PUTBACK; /* make local stack pointer global */ - if(cb != NULL) - { - int count = call_pv(cb, G_ARRAY); /* call the function */ - SPAGAIN; /* refresh stack pointer */ - - if(count == len + 1) + if(cb != NULL) { - int i; - - for(i=0; imajor = version_dont_free->major; - version->minor = version_dont_free->minor; - version->patch = version_dont_free->patch; - RETVAL = version; + version = (SDL_version *)safemalloc( sizeof(SDL_version) ); + version_dont_free = (SDL_version *)TTF_Linked_Version(); + version->major = version_dont_free->major; + version->minor = version_dont_free->minor; + version->patch = version_dont_free->patch; + RETVAL = version; OUTPUT: RETVAL @@ -124,8 +117,9 @@ const SDL_version * ttf_compile_time_version() PREINIT: char* CLASS = "SDL::Version"; + SDL_version *compile_time_version; CODE: - SDL_version *compile_time_version = safemalloc(sizeof(SDL_version)); + compile_time_version = safemalloc(sizeof(SDL_version)); SDL_TTF_VERSION(compile_time_version); RETVAL = compile_time_version; OUTPUT: @@ -275,9 +269,9 @@ AV * ttf_glyph_metrics(font, ch) TTF_Font *font SV *ch - CODE: + PREINIT: int minx, maxx, miny, maxy, advance; - + CODE: if(TTF_GlyphMetrics(font, *(utf16_to_UNICODE(ch)+1), &minx, &maxx, &miny, &maxy, &advance) == 0) { RETVAL = newAV(); @@ -297,8 +291,9 @@ AV * ttf_size_text(font, text) TTF_Font *font const char *text - CODE: + PREINIT: int w, h; + CODE: if(0 == TTF_SizeText(font, text, &w, &h)) { RETVAL = newAV(); @@ -315,8 +310,9 @@ AV * ttf_size_utf8(font, text) TTF_Font *font const char *text - CODE: + PREINIT: int w, h; + CODE: if(0 == TTF_SizeUTF8(font, text, &w, &h)) { RETVAL = newAV(); @@ -333,8 +329,9 @@ AV * ttf_size_unicode(font, text) TTF_Font *font SV *text - CODE: + PREINIT: int w, h; + CODE: if(0 == TTF_SizeUNICODE(font, utf16_to_UNICODE(text), &w, &h)) { RETVAL = newAV(); @@ -366,16 +363,16 @@ ttf_render_utf8_solid(font, text, fg) SDL_Color *fg PREINIT: char* CLASS = "SDL::Surface"; + STRLEN len; + unsigned char *utf8_text; + Uint16 *unicode; CODE: /* this is buggy, see: http://bugzilla.libsdl.org/show_bug.cgi?id=970 */ /*RETVAL = TTF_RenderUTF8_Solid(font, text, *fg); */ - - STRLEN len; - unsigned char*utf8_text = SvPV(text, len); - Uint16 *unicode = safemalloc((sv_len_utf8(text) + 2) * sizeof(Uint16)); - *unicode = 0xFEFF; + utf8_text = SvPV(text, len); + unicode = safemalloc((sv_len_utf8(text) + 2) * sizeof(Uint16)); + *unicode = 0xFEFF; UTF8_to_UNICODE(unicode+1, utf8_text, len); - RETVAL = TTF_RenderUNICODE_Solid(font, unicode, *fg); OUTPUT: RETVAL From 42556f5117e4ea1ee00553b9943738a290f1c1b6 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Mon, 11 Jun 2012 22:19:59 +0200 Subject: [PATCH 092/153] added msvc object files .obj --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 15d45fc4..7e3131c9 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ Build.bat *.def *.exp *.lds +*.obj From 59ed45e4fadf3e4e0970b0062d232ca5fddc6d21 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Mon, 11 Jun 2012 22:31:59 +0200 Subject: [PATCH 093/153] added load_libs for SDL_image and SDL_mixer --- Build.PL | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/Build.PL b/Build.PL index 7defd908..b689f4cc 100644 --- a/Build.PL +++ b/Build.PL @@ -229,6 +229,7 @@ my %subsystems = ( to => 'lib/SDLx/Layer.xs', }, libraries => [qw( SDL SDL_image )], + load_libs => [qw( png jpeg tiff )], }, AudioSpec => { file => { @@ -249,7 +250,8 @@ my %subsystems = ( from => 'src/Mixer/Mixer.xs', to => 'lib/SDL/Mixer.xs', }, - libraries => [qw( SDL SDL_mixer )], + libraries => [qw( SDL SDL_mixer )], + load_libs => [qw( vorbisfile flac mikmod smpeg )], }, MixerSamples => { file => { @@ -257,6 +259,7 @@ my %subsystems = ( to => 'lib/SDL/Mixer/Samples.xs', }, libraries => [qw( SDL SDL_mixer )], + load_libs => [qw( vorbisfile flac mikmod smpeg )], }, MixerChannels => { file => { @@ -264,6 +267,7 @@ my %subsystems = ( to => 'lib/SDL/Mixer/Channels.xs', }, libraries => [qw( SDL SDL_mixer )], + load_libs => [qw( vorbisfile flac mikmod smpeg )], }, MixerGroups => { file => { @@ -271,6 +275,7 @@ my %subsystems = ( to => 'lib/SDL/Mixer/Groups.xs', }, libraries => [qw( SDL SDL_mixer )], + load_libs => [qw( vorbisfile flac mikmod smpeg )], }, MixerMusic => { file => { @@ -278,6 +283,7 @@ my %subsystems = ( to => 'lib/SDL/Mixer/Music.xs', }, libraries => [qw( SDL SDL_mixer )], + load_libs => [qw( vorbisfile flac mikmod smpeg )], }, MixerEffects => { file => { @@ -285,6 +291,7 @@ my %subsystems = ( to => 'lib/SDL/Mixer/Effects.xs', }, libraries => [qw( SDL SDL_mixer )], + load_libs => [qw( vorbisfile flac mikmod smpeg )], }, MixChunk => { file => { @@ -292,6 +299,7 @@ my %subsystems = ( to => 'lib/SDL/Mixer/MixChunk.xs', }, libraries => [qw( SDL SDL_mixer )], + load_libs => [qw( vorbisfile flac mikmod smpeg )], }, MixMusic => { file => { @@ -299,6 +307,7 @@ my %subsystems = ( to => 'lib/SDL/Mixer/MixMusic.xs', }, libraries => [qw( SDL SDL_mixer )], + load_libs => [qw( vorbisfile flac mikmod smpeg )], }, Palette => { file => { @@ -383,6 +392,7 @@ my %subsystems = ( to => 'lib/SDL/Image.xs', }, libraries => [qw( SDL SDL_image )], + load_libs => [qw( png jpeg tiff )], }, SFont => { file => { @@ -390,6 +400,7 @@ my %subsystems = ( to => 'lib/SDLx/SFont.xs', }, libraries => [qw( SDL SDL_image )], + load_libs => [qw( png jpeg tiff )], }, # SMPEG => { @@ -535,7 +546,15 @@ my %libraries = ( header => 'tiff.h', lib => 'tiff', }, - + vorbisfile => { + lib => 'vorbisfile', + }, + flac => { + lib => 'FLAC', + }, + mikmod => { + lib => 'mikmod', + }, smpeg => { define => 'HAVE_SMPEG', header => 'smpeg/smpeg.h', From 928696e2a42048cbb791ad155938f6db892bb634 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Mon, 11 Jun 2012 22:39:47 +0200 Subject: [PATCH 094/153] init returns a bitmask, not the flag --- t/image.t | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/t/image.t b/t/image.t index 237da564..9ea5e3d5 100644 --- a/t/image.t +++ b/t/image.t @@ -176,7 +176,7 @@ SKIP: SKIP: { skip( 'JPEG support not compiled', 1 ) unless SDL::Config->has('jpeg'); - is( SDL::Image::init(IMG_INIT_JPG), IMG_INIT_JPG, + cmp_ok( SDL::Image::init(IMG_INIT_JPG), '&', IMG_INIT_JPG, '[init] Inited JPEG' ); } @@ -184,7 +184,7 @@ SKIP: SKIP: { skip( 'TIFF support not compiled', 1 ) unless SDL::Config->has('tiff'); - is( SDL::Image::init(IMG_INIT_TIF), IMG_INIT_TIF, + cmp_ok( SDL::Image::init(IMG_INIT_TIF), '&', IMG_INIT_TIF, '[init] Inited TIFF' ); } @@ -192,7 +192,7 @@ SKIP: SKIP: { skip( 'PNG support not compiled', 1 ) unless SDL::Config->has('png'); - is( SDL::Image::init(IMG_INIT_PNG), IMG_INIT_PNG, '[init] Inited PNG' ); + cmp_ok( SDL::Image::init(IMG_INIT_PNG), '&', IMG_INIT_PNG, '[init] Inited PNG' ); } can_ok( From b8e341f39e03977aff8603ae8f8c06f051be47a6 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Mon, 11 Jun 2012 22:48:07 +0200 Subject: [PATCH 095/153] load_libs from Build.PL are loaded when loading its Package --- inc/My/Builder.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/My/Builder.pm b/inc/My/Builder.pm index e6d351a3..eebc703c 100644 --- a/inc/My/Builder.pm +++ b/inc/My/Builder.pm @@ -108,7 +108,7 @@ sub translate_table { $p =~ s|^lib/(.*)\.xs|$1|; $p =~ s|/|::|g; my @list = - map ( $libraries->{$_}->{lib}, @{ $subsystems->{$m}->{libraries} } ); + map ( $libraries->{$_}->{lib}, @{ $subsystems->{$m}->{libraries} }, @{ $subsystems->{$m}->{load_libs} } ); $ret{$p} = \@list; } return \%ret; From 70642cfe77d747791ee3e50493bf157116d846a5 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Tue, 12 Jun 2012 23:07:33 +0200 Subject: [PATCH 096/153] dev release 2.541_03, updated Alien::SDL version and changelog --- Build.PL | 2 +- CHANGELOG | 8 ++++++-- lib/SDL.pm | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Build.PL b/Build.PL index b689f4cc..d9d3440f 100644 --- a/Build.PL +++ b/Build.PL @@ -589,7 +589,7 @@ my $build = $package->new( configure_requires => { 'Module::Build' => '0', 'ExtUtils::CBuilder' => '0.260301', - 'Alien::SDL' => '1.434', + 'Alien::SDL' => '1.435_1', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', diff --git a/CHANGELOG b/CHANGELOG index a464a25b..c61caae6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,8 +2,12 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) -* - - Updated Alien::SDL's version to 1.434 [jtpalmer] +* 2.541_03 Jun 12 2012 + - Updated Alien::SDL's version to 1.435_1 [FROGGS] + - Changed XS to fit MSVC (C89), so declarations are right after beginning block and before code [FROGGS] + - Added a switch so that MSVC gets a filename as import libname, other get -l... [FROGGS] + - Added load_libs for SDL_mixer and SDL_image; their deps are now loaded by Dynaloader [FROGGS] + - Fixed t/image.t's test logic; init() returns a bitmask and not a single flag [FROGGS] * 2.541_02 Jun 09 2012 - Added changes that were removed in 2.540 [Blaizer] diff --git a/lib/SDL.pm b/lib/SDL.pm index 21696a87..f1b7a59d 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.541_02'; +our $VERSION = '2.541_03'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); From f0fc2b3cf5dd19028f7a0596ef047aab6350f1fb Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Tue, 12 Jun 2012 23:21:56 +0200 Subject: [PATCH 097/153] switching back to wav for now, Alien::SDL cant tell us about system libs --- t/mixer_music.t | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/t/mixer_music.t b/t/mixer_music.t index b0293d11..21ea0026 100644 --- a/t/mixer_music.t +++ b/t/mixer_music.t @@ -109,17 +109,17 @@ SKIP: { skip( 'Version 1.2.7 needed', 3 ) if $v < 1.2.7; - my $rw = SDL::RWOps->new_file( $ogg_test_file, "rb" ); + my $rw = SDL::RWOps->new_file( $wav_test_file, "rb" ); isa_ok( $rw, 'SDL::RWOps', '[SDL::RWOps->new_file]' ); my $sample_music_rw = SDL::Mixer::Music::load_MUS_RW( $rw ); isa_ok( $sample_music_rw, 'SDL::Mixer::MixMusic', '[load_MUS_RW]' ); is( SDL::Mixer::Music::play_music( $sample_music_rw, 0 ), - 0, "[play_music_rw] plays $ogg_test_file" + 0, "[play_music_rw] plays $wav_test_file" ); } my $wav_music = SDL::Mixer::Music::load_MUS($wav_test_file); -my $ogg_music = SDL::Mixer::Music::load_MUS($ogg_test_file); +#my $ogg_music = SDL::Mixer::Music::load_MUS($ogg_test_file); isa_ok( $wav_music, 'SDL::Mixer::MixMusic', '[load_MUS]' ); is( SDL::Mixer::Music::play_music( $wav_music, 0 ), 0, "[play_music] plays $wav_test_file" @@ -192,8 +192,8 @@ is( SDL::Mixer::Music::halt_music(), 0, '[halt_music]' ); SKIP: { skip( 'We need an MOD/OGG/MP3 for positioning', 2 ) - unless $ogg_test_file =~ /\.(ogg|mod|mp3)$/; - is( SDL::Mixer::Music::fade_in_music_pos( $ogg_music, 0, 2000, 2.5 ), + unless $wav_test_file =~ /\.(ogg|mod|mp3)$/; + is( SDL::Mixer::Music::fade_in_music_pos( $wav_music, 0, 2000, 2.5 ), 0, "[fade_in_music_pos] $delay ms, beginning at 2.5 ms" ); is( SDL::Mixer::Music::set_music_position(2.5), From b81330b29bc471702729d10121d5dd06a991a305 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Wed, 13 Jun 2012 15:36:37 +0200 Subject: [PATCH 098/153] reenabled ogg test, fixed check for libs that are not checked during Build.PL --- t/image.t | 13 +++++++------ t/mixer_music.t | 10 +++++----- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/t/image.t b/t/image.t index 9ea5e3d5..fca748a1 100644 --- a/t/image.t +++ b/t/image.t @@ -5,6 +5,7 @@ use SDL::Config; use SDL::Version; use SDL::Image; use SDL::RWOps; +use Alien::SDL; use Test::More; use lib 't/lib'; @@ -55,7 +56,7 @@ printf( "got version: %d.%d.%d\n", $lver->major, $lver->minor, $lver->patch ); SKIP: { - skip( 'PNG support not compiled', 14 ) unless SDL::Config->has('png'); + skip( 'PNG support not compiled', 14 ) unless Alien::SDL->config('ld_shlib_map')->{png}; isa_ok( SDL::Image::load("test/data/highlight.png"), "SDL::Surface", "[load] Gets Surface" @@ -92,7 +93,7 @@ SKIP: SKIP: { - skip( 'JPEG support not compiled', 14 ) unless SDL::Config->has('jpeg'); + skip( 'JPEG support not compiled', 14 ) unless Alien::SDL->config('ld_shlib_map')->{'jpeg'}; isa_ok( SDL::Image::load("test/data/picture.jpg"), "SDL::Surface", "[load] Gets Surface" @@ -129,7 +130,7 @@ SKIP: SKIP: { - skip( 'TIFF support not compiled', 14 ) unless SDL::Config->has('tiff'); + skip( 'TIFF support not compiled', 14 ) unless Alien::SDL->config('ld_shlib_map')->{'tiff'}; isa_ok( SDL::Image::load("test/data/picture.tif"), "SDL::Surface", "[load] Gets Surface" @@ -175,7 +176,7 @@ SKIP: skip( 'This is only for version >= 1.2.10', 2 ) if $lver < 1.2.10; SKIP: { - skip( 'JPEG support not compiled', 1 ) unless SDL::Config->has('jpeg'); + skip( 'JPEG support not compiled', 1 ) unless Alien::SDL->config('ld_shlib_map')->{'jpeg'}; cmp_ok( SDL::Image::init(IMG_INIT_JPG), '&', IMG_INIT_JPG, '[init] Inited JPEG' ); @@ -183,7 +184,7 @@ SKIP: SKIP: { - skip( 'TIFF support not compiled', 1 ) unless SDL::Config->has('tiff'); + skip( 'TIFF support not compiled', 1 ) unless Alien::SDL->config('ld_shlib_map')->{'tiff'}; cmp_ok( SDL::Image::init(IMG_INIT_TIF), '&', IMG_INIT_TIF, '[init] Inited TIFF' ); @@ -191,7 +192,7 @@ SKIP: SKIP: { - skip( 'PNG support not compiled', 1 ) unless SDL::Config->has('png'); + skip( 'PNG support not compiled', 1 ) unless Alien::SDL->config('ld_shlib_map')->{'png'}; cmp_ok( SDL::Image::init(IMG_INIT_PNG), '&', IMG_INIT_PNG, '[init] Inited PNG' ); } diff --git a/t/mixer_music.t b/t/mixer_music.t index 21ea0026..b0293d11 100644 --- a/t/mixer_music.t +++ b/t/mixer_music.t @@ -109,17 +109,17 @@ SKIP: { skip( 'Version 1.2.7 needed', 3 ) if $v < 1.2.7; - my $rw = SDL::RWOps->new_file( $wav_test_file, "rb" ); + my $rw = SDL::RWOps->new_file( $ogg_test_file, "rb" ); isa_ok( $rw, 'SDL::RWOps', '[SDL::RWOps->new_file]' ); my $sample_music_rw = SDL::Mixer::Music::load_MUS_RW( $rw ); isa_ok( $sample_music_rw, 'SDL::Mixer::MixMusic', '[load_MUS_RW]' ); is( SDL::Mixer::Music::play_music( $sample_music_rw, 0 ), - 0, "[play_music_rw] plays $wav_test_file" + 0, "[play_music_rw] plays $ogg_test_file" ); } my $wav_music = SDL::Mixer::Music::load_MUS($wav_test_file); -#my $ogg_music = SDL::Mixer::Music::load_MUS($ogg_test_file); +my $ogg_music = SDL::Mixer::Music::load_MUS($ogg_test_file); isa_ok( $wav_music, 'SDL::Mixer::MixMusic', '[load_MUS]' ); is( SDL::Mixer::Music::play_music( $wav_music, 0 ), 0, "[play_music] plays $wav_test_file" @@ -192,8 +192,8 @@ is( SDL::Mixer::Music::halt_music(), 0, '[halt_music]' ); SKIP: { skip( 'We need an MOD/OGG/MP3 for positioning', 2 ) - unless $wav_test_file =~ /\.(ogg|mod|mp3)$/; - is( SDL::Mixer::Music::fade_in_music_pos( $wav_music, 0, 2000, 2.5 ), + unless $ogg_test_file =~ /\.(ogg|mod|mp3)$/; + is( SDL::Mixer::Music::fade_in_music_pos( $ogg_music, 0, 2000, 2.5 ), 0, "[fade_in_music_pos] $delay ms, beginning at 2.5 ms" ); is( SDL::Mixer::Music::set_music_position(2.5), From 62c4dc59ee0834fe26acf342926bd03318ab63b2 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Fri, 15 Jun 2012 14:02:17 +0200 Subject: [PATCH 099/153] requiring Alien::SDL 1.435_3 (the newer the better) --- Build.PL | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Build.PL b/Build.PL index d9d3440f..f7e783df 100644 --- a/Build.PL +++ b/Build.PL @@ -589,7 +589,7 @@ my $build = $package->new( configure_requires => { 'Module::Build' => '0', 'ExtUtils::CBuilder' => '0.260301', - 'Alien::SDL' => '1.435_1', + 'Alien::SDL' => '1.435_3', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', @@ -599,7 +599,7 @@ my $build = $package->new( 'Test::Simple' => '0.88', 'Capture::Tiny' => '0', 'Test::Most' => '0.21', - 'Alien::SDL' => '1.426', + 'Alien::SDL' => '1.435_3', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', From 571ee6aebccf484ac4612563823f06152d8eea98 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Fri, 15 Jun 2012 14:08:40 +0200 Subject: [PATCH 100/153] dev release 2.541_04 --- CHANGELOG | 3 +++ lib/SDL.pm | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index c61caae6..24cb7041 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,9 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) +* 2.541_04 Jun 15 2012 + - Updated Alien::SDL's version to 1.435_3 [FROGGS] + * 2.541_03 Jun 12 2012 - Updated Alien::SDL's version to 1.435_1 [FROGGS] - Changed XS to fit MSVC (C89), so declarations are right after beginning block and before code [FROGGS] diff --git a/lib/SDL.pm b/lib/SDL.pm index f1b7a59d..a1b06616 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.541_03'; +our $VERSION = '2.541_04'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); From 4efa3b2e8ba6707fa17282d07718c85b090c37a2 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Fri, 15 Jun 2012 18:57:11 +0200 Subject: [PATCH 101/153] we cant get/set title without window manager --- lib/SDLx/App.pm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 20463325..f5d777bd 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -80,7 +80,7 @@ sub new { push @$init, "video"; } else { - $init |= SDL::SDL_INIT_VIDEO + $init |= SDL::SDL_INIT_VIDEO; } SDLx::App->init( $init ); } @@ -246,7 +246,10 @@ sub resize { } sub title { - my ( undef, $title, $icon_title ) = @_; + my ( $self, $title, $icon_title ) = @_; + my $video_info = SDL::Video::get_video_info(); + return if $video_info && !$video_info->wm_available(); + if ( @_ > 1 ) { my ($t, $it) = SDL::Video::wm_get_caption; $title = $t unless defined $title; From 7316ff7d7a508ace4ac9dde85be60aedc74dc76c Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Sat, 16 Jun 2012 21:47:35 +0200 Subject: [PATCH 102/153] dev release 2.541_05 --- Build.PL | 4 ++-- CHANGELOG | 4 ++++ lib/SDL.pm | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Build.PL b/Build.PL index f7e783df..797a24bd 100644 --- a/Build.PL +++ b/Build.PL @@ -589,7 +589,7 @@ my $build = $package->new( configure_requires => { 'Module::Build' => '0', 'ExtUtils::CBuilder' => '0.260301', - 'Alien::SDL' => '1.435_3', + 'Alien::SDL' => '1.435_5', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', @@ -599,7 +599,7 @@ my $build = $package->new( 'Test::Simple' => '0.88', 'Capture::Tiny' => '0', 'Test::Most' => '0.21', - 'Alien::SDL' => '1.435_3', + 'Alien::SDL' => '1.435_5', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', diff --git a/CHANGELOG b/CHANGELOG index 24cb7041..078ab5bb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,10 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) +* 2.541_05 Jun 16 2012 + - Fix: SDLx::App->init tried to set window title even if there was no window manager [FROGGS] + - Updated Alien::SDL's version to 1.435_5 [FROGGS] + * 2.541_04 Jun 15 2012 - Updated Alien::SDL's version to 1.435_3 [FROGGS] diff --git a/lib/SDL.pm b/lib/SDL.pm index a1b06616..98fc3f8d 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.541_04'; +our $VERSION = '2.541_05'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); From 64f526af323b7803a836ff77ed33ab47bd14a36c Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Sat, 16 Jun 2012 23:00:49 +0200 Subject: [PATCH 103/153] its safer to have this in repo --- .gitignore | 2 +- MANIFEST | 360 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 361 insertions(+), 1 deletion(-) create mode 100644 MANIFEST diff --git a/.gitignore b/.gitignore index 7e3131c9..344b4bd4 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,7 @@ SDLPerl.app SDL_perl.c SDL_perl.xs stage -MANIFEST +!MANIFEST !MANIFEST.skip *META.yml *META.json diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 00000000..c6772003 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,360 @@ +Build.PL +CHANGELOG +COPYING +examples/cookbook/1.pl +examples/cookbook/openglapp.pl +examples/cookbook/pdl.pl +examples/cookbook/pogl_sdl_texture.pl +examples/GFX/script_roto.pl +examples/pixel_operations/fast_pixel_write.pl +examples/pixel_operations/sols/ch02.pl +examples/pixel_operations/starry.pl +examples/pixel_operations/tie_matrix.pl +examples/SDLx/app.pl +examples/SDLx/music.pl +examples/SDLx/pong.pl +examples/SDLx/SDLx_C_Interface.pl +examples/SDLx/SDLx_controller_two_squares.pl +examples/SDLx/SDLx_LayerManager_Chess.pl +examples/SDLx/SDLx_Sound.pl +examples/SDLx/SDLx_sprite.pl +examples/SDLx/SDLx_sprite_animated.pl +examples/SDLx/SDLx_text.pl +examples/SDLx/SDLx_text_shadow.pl +examples/SDLx/SDLx_text_styles.pl +examples/SDLx/SDLx_text_wordwrap.pl +examples/SDLx/SDLx_text_zoom.pl +inc/My/Builder.pm +inc/My/Builder/Darwin.pm +inc/My/Builder/Unix.pm +inc/My/Builder/Windows.pm +INSTALL +lib/Module/Build/SDL.pm +lib/pods/SDL.pod +lib/pods/SDL/Audio.pod +lib/pods/SDL/AudioCVT.pod +lib/pods/SDL/AudioSpec.pod +lib/pods/SDL/CD.pod +lib/pods/SDL/CDROM.pod +lib/pods/SDL/CDTrack.pod +lib/pods/SDL/Color.pod +lib/pods/SDL/Cookbook.pod +lib/pods/SDL/Cookbook/OpenGL.pod +lib/pods/SDL/Cookbook/PDL.pod +lib/pods/SDL/Credits.pod +lib/pods/SDL/Cursor.pod +lib/pods/SDL/Deprecated.pod +lib/pods/SDL/Event.pod +lib/pods/SDL/Events.pod +lib/pods/SDL/GFX/BlitFunc.pod +lib/pods/SDL/GFX/FPSManager.pod +lib/pods/SDL/GFX/Framerate.pod +lib/pods/SDL/GFX/ImageFilter.pod +lib/pods/SDL/GFX/Primitives.pod +lib/pods/SDL/GFX/Rotozoom.pod +lib/pods/SDL/Image.pod +lib/pods/SDL/Joystick.pod +lib/pods/SDL/Mixer.pod +lib/pods/SDL/Mixer/Channels.pod +lib/pods/SDL/Mixer/Effects.pod +lib/pods/SDL/Mixer/Groups.pod +lib/pods/SDL/Mixer/MixChunk.pod +lib/pods/SDL/Mixer/MixMusic.pod +lib/pods/SDL/Mixer/Music.pod +lib/pods/SDL/Mixer/Samples.pod +lib/pods/SDL/Mouse.pod +lib/pods/SDL/MPEG.pod +lib/pods/SDL/MultiThread.pod +lib/pods/SDL/Overlay.pod +lib/pods/SDL/Palette.pod +lib/pods/SDL/Pango.pod +lib/pods/SDL/Pango/Context.pod +lib/pods/SDL/PixelFormat.pod +lib/pods/SDL/Rect.pod +lib/pods/SDL/RWOps.pod +lib/pods/SDL/SMPEG.pod +lib/pods/SDL/Surface.pod +lib/pods/SDL/Time.pod +lib/pods/SDL/TTF.pod +lib/pods/SDL/TTF/Font.pod +lib/pods/SDL/Tutorial.pod +lib/pods/SDL/Tutorial/Animation.pod +lib/pods/SDL/Tutorial/LunarLander.pod +lib/pods/SDL/Version.pod +lib/pods/SDL/Video.pod +lib/pods/SDL/VideoInfo.pod +lib/pods/SDLx/App.pod +lib/pods/SDLx/Controller.pod +lib/pods/SDLx/Controller/Interface.pod +lib/pods/SDLx/Controller/State.pod +lib/pods/SDLx/Layer.pod +lib/pods/SDLx/LayerManager.pod +lib/pods/SDLx/Music.pod +lib/pods/SDLx/Rect.pod +lib/pods/SDLx/SFont.pod +lib/pods/SDLx/Sound.pod +lib/pods/SDLx/Sprite.pod +lib/pods/SDLx/Sprite/Animated.pod +lib/pods/SDLx/Surface.pod +lib/pods/SDLx/Text.pod +lib/SDL.pm +lib/SDL/Audio.pm +lib/SDL/AudioCVT.pm +lib/SDL/AudioSpec.pm +lib/SDL/CD.pm +lib/SDL/CDROM.pm +lib/SDL/CDTrack.pm +lib/SDL/Color.pm +lib/SDL/Config.pm +lib/SDL/Constants.pm +lib/SDL/Cursor.pm +lib/SDL/Event.pm +lib/SDL/Events.pm +lib/SDL/GFX.pm +lib/SDL/GFX/BlitFunc.pm +lib/SDL/GFX/FPSManager.pm +lib/SDL/GFX/Framerate.pm +lib/SDL/GFX/ImageFilter.pm +lib/SDL/GFX/Primitives.pm +lib/SDL/GFX/Rotozoom.pm +lib/SDL/Image.pm +lib/SDL/Internal/Loader.pm +lib/SDL/Joystick.pm +lib/SDL/Mixer.pm +lib/SDL/Mixer/Channels.pm +lib/SDL/Mixer/Effects.pm +lib/SDL/Mixer/Groups.pm +lib/SDL/Mixer/MixChunk.pm +lib/SDL/Mixer/MixMusic.pm +lib/SDL/Mixer/Music.pm +lib/SDL/Mixer/Samples.pm +lib/SDL/Mouse.pm +lib/SDL/MultiThread.pm +lib/SDL/Net.pm +lib/SDL/Net/IPaddress.pm +lib/SDL/Net/TCP.pm +lib/SDL/Net/UDP.pm +lib/SDL/Overlay.pm +lib/SDL/Palette.pm +lib/SDL/Pango.pm +lib/SDL/Pango/Context.pm +lib/SDL/PixelFormat.pm +lib/SDL/Rect.pm +lib/SDL/RWOps.pm +lib/SDL/SMPEG.pm +lib/SDL/SMPEG/Info.pm +lib/SDL/Surface.pm +lib/SDL/Time.pm +lib/SDL/TTF.pm +lib/SDL/TTF/Font.pm +lib/SDL/TTFont.pm +lib/SDL/Tutorial.pm +lib/SDL/Tutorial/Animation.pm +lib/SDL/Tutorial/LunarLander.pm +lib/SDL/Version.pm +lib/SDL/Video.pm +lib/SDL/VideoInfo.pm +lib/SDL_perl.pm +lib/SDLx/App.pm +lib/SDLx/Controller.pm +lib/SDLx/Controller/Interface.pm +lib/SDLx/Controller/State.pm +lib/SDLx/Controller/Timer.pm +lib/SDLx/FPS.pm +lib/SDLx/Layer.pm +lib/SDLx/LayerManager.pm +lib/SDLx/Music.pm +lib/SDLx/Music/Data.pm +lib/SDLx/Music/Default.pm +lib/SDLx/Rect.pm +lib/SDLx/SFont.pm +lib/SDLx/Sound.pm +lib/SDLx/Sprite.pm +lib/SDLx/Sprite/Animated.pm +lib/SDLx/Surface.pm +lib/SDLx/Surface/TiedMatrix.pm +lib/SDLx/Surface/TiedMatrixRow.pm +lib/SDLx/Text.pm +lib/SDLx/TTF.pm +lib/SDLx/Validate.pm +MacOSX/Info.plist +MacOSX/main.c +MacOSX/Makefile.test +MacOSX/SDLPerl.icns +MANIFEST This list of files +META.yml +OFL-FAQ.txt +OFL.txt +README +scripts/auto_constants.pl +scripts/const.pl +scripts/gl_const.pl +scripts/MultiThreadPOC.pl +scripts/sdl_const.pl +scripts/sdl_module_maker.pl +scripts/SDLpp.pl +share/GenBasR.ttf +src/Core/Audio.xs +src/Core/CDROM.xs +src/Core/Events.xs +src/Core/Joystick.xs +src/Core/Mouse.xs +src/Core/MultiThread.xs +src/Core/objects/AudioCVT.xs +src/Core/objects/AudioSpec.xs +src/Core/objects/CD.xs +src/Core/objects/CDTrack.xs +src/Core/objects/Color.xs +src/Core/objects/Cursor.xs +src/Core/objects/Event.xs +src/Core/objects/keysym.xs +src/Core/objects/Overlay.xs +src/Core/objects/Palette.xs +src/Core/objects/PixelFormat.xs +src/Core/objects/Rect.xs +src/Core/objects/RWOps.xs +src/Core/objects/Surface.xs +src/Core/objects/typemap +src/Core/objects/Version.xs +src/Core/objects/VideoInfo.xs +src/Core/Time.xs +src/Core/Video.xs +src/defines.h +src/GFX/BlitFunc.xs +src/GFX/CHANGELOG +src/GFX/FPSManager.xs +src/GFX/Framerate.xs +src/GFX/GFX.xs +src/GFX/ImageFilter.xs +src/GFX/Primitives.xs +src/GFX/README +src/GFX/Rotozoom.xs +src/helper.h +src/Image.xs +src/Mixer/Channels.xs +src/Mixer/Effects.xs +src/Mixer/Groups.xs +src/Mixer/Mixer.xs +src/Mixer/Music.xs +src/Mixer/objects/MixChunk.xs +src/Mixer/objects/MixMusic.xs +src/Mixer/README +src/Mixer/Samples.xs +src/Pango/objects/Context.xs +src/Pango/Pango.xs +src/ppport.h +src/SDL.xs +src/SDLx/Controller/Interface.h +src/SDLx/Controller/Interface.xs +src/SDLx/Controller/State.xs +src/SDLx/Layer.h +src/SDLx/Layer.xs +src/SDLx/LayerManager.h +src/SDLx/LayerManager.xs +src/SDLx/SFont.h +src/SDLx/SFont.xs +src/SDLx/Surface.xs +src/SDLx/Timer.h +src/SDLx/Timer.xs +src/SDLx/Validate.h +src/SDLx/Validate.xs +src/SMPEG.xs +src/SMPEG/Info.xs +src/support/darwin_support.h +src/support/darwin_support.m +src/support/win32.c +src/TTF/objects/Font.xs +src/TTF/README +src/TTF/TTF.xs +t/00-load.t +t/colorpm.t +t/config.t +t/core.t +t/core_audio.t +t/core_audiospec.t +t/core_cd.t +t/core_error.t +t/core_events.t +t/core_joystick.t +t/core_mouse.t +t/core_multi.t +t/core_overlay.t +t/core_palette.t +t/core_rect.t +t/core_rwops.t +t/core_surface.t +t/core_timer.t +t/core_version.t +t/core_video.t +t/core_video_convert_surface.t +t/core_video_gamma.t +t/extendingrect.t +t/gfx.t +t/gfx_fpsmanager.t +t/gfx_framerate.t +t/gfx_imagefilter.t +t/gfx_primitives.t +t/gfx_primitives2.t +t/gfx_rotozoom.t +t/image.t +t/image_xpm_array.t +t/lib/SDL/TestTool.pm +t/mixer.t +t/mixer_channels.t +t/mixer_effects.t +t/mixer_groups.t +t/mixer_mixchunk.t +t/mixer_mixmusic.t +t/mixer_music.t +t/mixer_samples.t +t/pango.t +t/sdlgamerect.t +t/sdlx_app.t +t/sdlx_controller.t +t/sdlx_controller_interface.t +t/sdlx_fps.t +t/sdlx_layermanager.t +t/sdlx_music.t +t/sdlx_rect.t +t/sdlx_sfont.t +t/sdlx_sound.t +t/sdlx_sprite.t +t/sdlx_sprite_animated.t +t/sdlx_surface.t +t/sdlx_text.t +t/sdlx_validate.t +t/smpeg.t +t/ttf.t +t/ttf_font.t +test/data/24P_Arial_NeonYellow.png +test/data/24P_Copperplate_Blue.png +test/data/5x7.fnt +test/data/button_dark.png +test/data/button_light.png +test/data/chest.png +test/data/electrohar.ttf +test/data/font.bmp +test/data/font.png +test/data/hero.bmp +test/data/hero.png +test/data/highlight.png +test/data/icon.bmp +test/data/LargeFont.bmp +test/data/logo.png +test/data/menu.png +test/data/pattern_red_white_2x2.bmp +test/data/picture.bmp +test/data/picture.jpg +test/data/picture.tif +test/data/README +test/data/sample.ogg +test/data/sample.wav +test/data/silence.ogg +test/data/silence.wav +test/data/test-mpeg.mpg +test/data/tribe_i.wav +test/data/wood_dark.png +test/data/wood_light.png +TODO +typemap +META.json From 9f50b91c2edab6eb3146c580ecfea6fab10446e3 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Sat, 16 Jun 2012 23:01:03 +0200 Subject: [PATCH 104/153] new dev release --- CHANGELOG | 3 +++ lib/SDL.pm | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 078ab5bb..248149f6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,9 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) +* 2.541_06 Jun 16 2012 + - Added missing .ogg test files [FROGGS] + * 2.541_05 Jun 16 2012 - Fix: SDLx::App->init tried to set window title even if there was no window manager [FROGGS] - Updated Alien::SDL's version to 1.435_5 [FROGGS] diff --git a/lib/SDL.pm b/lib/SDL.pm index 98fc3f8d..972be5a8 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.541_05'; +our $VERSION = '2.541_06'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); From fc063d22d48796dae1adbd0c12acb873ed7ff23b Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Sun, 17 Jun 2012 14:28:10 +0200 Subject: [PATCH 105/153] new dev release to test latest alien --- Build.PL | 4 ++-- lib/SDL.pm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Build.PL b/Build.PL index 797a24bd..74d8596f 100644 --- a/Build.PL +++ b/Build.PL @@ -589,7 +589,7 @@ my $build = $package->new( configure_requires => { 'Module::Build' => '0', 'ExtUtils::CBuilder' => '0.260301', - 'Alien::SDL' => '1.435_5', + 'Alien::SDL' => '1.435_6', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', @@ -599,7 +599,7 @@ my $build = $package->new( 'Test::Simple' => '0.88', 'Capture::Tiny' => '0', 'Test::Most' => '0.21', - 'Alien::SDL' => '1.435_5', + 'Alien::SDL' => '1.435_6', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', diff --git a/lib/SDL.pm b/lib/SDL.pm index 972be5a8..7418ce48 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.541_06'; +our $VERSION = '2.541_07'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); From ce6a36e8898a648e3fd0f10a172c7d116eacd731 Mon Sep 17 00:00:00 2001 From: Dominique Dumont Date: Sun, 17 Jun 2012 19:22:36 +0200 Subject: [PATCH 106/153] Fix SDLx::Rectangle clip_rect method clip_rect method was broken. set_clip_rect was not called with the surface, and get_clip_rect did not pass a rectangle to be updated. This is now fixed and works as advertised. --- lib/SDLx/Surface.pm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/SDLx/Surface.pm b/lib/SDLx/Surface.pm index a2e9ce6e..c46442f5 100644 --- a/lib/SDLx/Surface.pm +++ b/lib/SDLx/Surface.pm @@ -152,9 +152,11 @@ sub height { $_[0]->h } #WRAPPING sub clip_rect { - - SDL::Video::set_clip_rect( $_[1] ) if $_[1] && $_[1]->isa('SDL::Rect'); - SDL::Video::get_clip_rect( $_[0] ); + + SDL::Video::set_clip_rect( @_[0,1] ) if $_[1] && $_[1]->isa('SDL::Rect'); + my $r = $_[1] || SDL::Rect->new (0,0,0,0) ; + SDL::Video::get_clip_rect( $_[0], $r ); + return $r ; } From a1ec090e0a04b7dc3c141f05a7cbfca185af9dac Mon Sep 17 00:00:00 2001 From: Dominique Dumont Date: Sun, 17 Jun 2012 19:32:32 +0200 Subject: [PATCH 107/153] tests for clip_rect method --- t/sdlx_surface.t | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/t/sdlx_surface.t b/t/sdlx_surface.t index b524c92c..943f3b03 100644 --- a/t/sdlx_surface.t +++ b/t/sdlx_surface.t @@ -241,6 +241,10 @@ is( $surf_dup->format->BitsPerPixel, 'Duplicate surf has same bpp' ); +$surf_dup->clip_rect( SDL::Rect->new ( 10, 10, 40, 50 )) ; +my $r = $surf_dup->clip_rect ; +is_deeply( [ map { $r->$_ } qw/x y w h/ ], [ 10, 10, 40 ,50 ], "set and get clip_rect work") ; + if ($videodriver) { $ENV{SDL_VIDEODRIVER} = $videodriver; } else { From b13497b26dd083db702a1d72888b6094e358363a Mon Sep 17 00:00:00 2001 From: Dominique Dumont Date: Wed, 11 Apr 2012 17:05:45 +0200 Subject: [PATCH 108/153] - fix podcheck warnings ( line containing nothing but whitespace ) - fix internal link errors - mention that SDL_SRCALPHA concerns (per-surface alpha) - added pseudo-code to explain interactions between blit, alpha and color keys (pseudo-code cut'n'pasted from http://www.libsdl.org/docs/html/sdlblitsurface.html) Conflicts: lib/pods/SDL/Video.pod --- lib/pods/SDL/Video.pod | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/pods/SDL/Video.pod b/lib/pods/SDL/Video.pod index f8a357f0..18ca08d4 100644 --- a/lib/pods/SDL/Video.pod +++ b/lib/pods/SDL/Video.pod @@ -69,7 +69,7 @@ Export tag: ':video' SDL_SRCCOLORKEY Use colorkey blitting SDL_RLEACCELOK Private flag SDL_RLEACCEL Accelerated colorkey blitting with RLE - SDL_SRCALPHA Use alpha blending blit + SDL_SRCALPHA Use alpha blending blit (per-surface alpha) SDL_PREALLOC Use preallocated memory Export tag ':overlay' @@ -692,7 +692,26 @@ but this is not the case with C. Like most surface man with OpenGL. The results of blitting operations vary greatly depending on whether C is set or not. See L -for an explanation of how this affects your results. Colorkeying and alpha attributes also interact with surface blitting. +for an explanation of how this affects your results. Colorkeying and alpha attributes also interact with surface blitting, as the following pseudo-code should hopefully explain. + + if (source surface has SDL_SRCALPHA set) { + if (source surface has alpha channel (that is, surface->format->Amask != 0)) + blit using per-pixel alpha, ignoring any colour key + else { + if (source surface has SDL_SRCCOLORKEY set) + blit using the colour key AND the per-surface alpha value + else + blit using the per-surface alpha value + } + } else { + if (source surface has SDL_SRCCOLORKEY set) + blit using the colour key + else + ordinary opaque rectangular blit + } + +See L for details on C<< surface->format->Amask >>. + C doesn't return anything. For an example see L. From 16679d7ed2e95796c756b174ba191d29502dab59 Mon Sep 17 00:00:00 2001 From: Dominique Dumont Date: Wed, 11 Apr 2012 19:44:21 +0200 Subject: [PATCH 109/153] - the 3rd param set_alpha is now $alpha instead of $key - fixed internal pod links --- lib/pods/SDL/Video.pod | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/pods/SDL/Video.pod b/lib/pods/SDL/Video.pod index 18ca08d4..fef90458 100644 --- a/lib/pods/SDL/Video.pod +++ b/lib/pods/SDL/Video.pod @@ -84,7 +84,7 @@ Export tag ':palette' SDL_LOGPAL Logical palette, which controls how blits are mapped to/from the surface SDL_PHYSPAL Physical palette, which controls how pixels look on the screen - + Export tag ':grab' SDL_GRAB_QUERY @@ -337,19 +337,19 @@ each call to L, for example for a mu Creates a new SDL::surface of the specified L, and then copies and maps the given surface to it. It is also useful for making a copy of a surface. - + The flags parameter is passed to LC<-Enew> and has those semantics. This function is used internally by L. This function can only be called after C. - + it returns a L on success or C on error. - + =head2 display_format $new_surface = SDL::Video::display_format( $surface ); This function takes a surface and copies it to a new surface of the pixel format and colors of the video framebuffer, suitable for fast -blitting onto the display surface. It calls L. +blitting onto the display surface. It calls L. If you want to take advantage of hardware colorkey or alpha blit acceleration, you should set the colorkey and alpha value before calling this function. @@ -438,7 +438,7 @@ C returns C<0> on success or C<-1> on error. =head2 set_alpha - $set_alpha = SDL::Video::set_alpha( $surface, $flag, $key ); + $set_alpha = SDL::Video::set_alpha( $surface, $flag, $alpha ); C is used for setting the per-surface alpha value and/or enabling and disabling alpha blending. @@ -626,7 +626,7 @@ a matching unlock. SDL::Video::unlock_surface( $surface ); -Surfaces that were previously locked using L must be unlocked with C. +Surfaces that were previously locked using L must be unlocked with C. Surfaces should be unlocked as soon as possible. C doesn't return anything. @@ -845,7 +845,7 @@ Sets a portion of the palette for the given 8-bit surface. Palettized (8-bit) screen surfaces with the C flag have two palettes, a logical palette that is used for mapping blits to/from the surface and a physical palette (that determines how the hardware will map the colors to the display). -Non screen surfaces have a logical palette only. L always uses the logical palette when blitting surfaces (if it has to +Non screen surfaces have a logical palette only. L always uses the logical palette when blitting surfaces (if it has to convert between surface pixel formats). Because of this, it is often useful to modify only one or the other palette to achieve various special color effects (e.g., screen fading, color flashes, screen dimming). @@ -1225,7 +1225,7 @@ It returns C<0> on success or C<-1> on error. SDL::Video::unlock_YUV_overlay( $overlay ); -The opposite to L. Unlocks a previously locked overlay. An overlay must be unlocked before it +The opposite to L. Unlocks a previously locked overlay. An overlay must be unlocked before it can be displayed. C does not return anything. =head2 display_YUV_overlay From aa94885e91d4b7116280fb279ca7183f65846107 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Mon, 18 Jun 2012 19:20:24 +0200 Subject: [PATCH 110/153] new dev release 2.541_08 --- Build.PL | 4 ++-- CHANGELOG | 5 +++++ lib/SDL.pm | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Build.PL b/Build.PL index 74d8596f..769c98b8 100644 --- a/Build.PL +++ b/Build.PL @@ -589,7 +589,7 @@ my $build = $package->new( configure_requires => { 'Module::Build' => '0', 'ExtUtils::CBuilder' => '0.260301', - 'Alien::SDL' => '1.435_6', + 'Alien::SDL' => '1.435_7', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', @@ -599,7 +599,7 @@ my $build = $package->new( 'Test::Simple' => '0.88', 'Capture::Tiny' => '0', 'Test::Most' => '0.21', - 'Alien::SDL' => '1.435_6', + 'Alien::SDL' => '1.435_7', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', diff --git a/CHANGELOG b/CHANGELOG index 248149f6..0060074f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,11 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) +* 2.541_08 Jun 18 2012 + - Lots of coumentation fixes [dod] + - Fix and test for SDLx::Surface->clip_rect [dod] + - Updated Alien::SDL's version to 1.435_7 [FROGGS] + * 2.541_06 Jun 16 2012 - Added missing .ogg test files [FROGGS] diff --git a/lib/SDL.pm b/lib/SDL.pm index 7418ce48..13b417fd 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.541_07'; +our $VERSION = '2.541_08'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); From 3dff9ae253fb6658dafd631c11b848bfee935b92 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Fri, 20 Jul 2012 18:40:07 -0400 Subject: [PATCH 111/153] Fixed license in pod --- CHANGELOG | 3 +++ lib/pods/SDL.pod | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 0060074f..a8648a81 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,9 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) +* 2.541_09 + - Fixed license in SDL.pod [jtpalmer] + * 2.541_08 Jun 18 2012 - Lots of coumentation fixes [dod] - Fix and test for SDLx::Surface->clip_rect [dod] diff --git a/lib/pods/SDL.pod b/lib/pods/SDL.pod index 9f6a3d95..bb94a502 100644 --- a/lib/pods/SDL.pod +++ b/lib/pods/SDL.pod @@ -263,8 +263,9 @@ And request access to the github repository. Or drop us a line on #sdl over at i Copyright 2002-2010 SDL Authors as listed above, all rights reserved. -This program is free software; you can redistribute it and/or modify it -under the same terms as Perl itself. +This is free software, licensed under: + + The GNU Library General Public License, Version 2.0, June 1991 =head1 DISCLAIMER OF WARRANTY From 4bae66f337e909dc51effc8264709784622ea69e Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Wed, 25 Jul 2012 23:46:05 +0200 Subject: [PATCH 112/153] fixed method names so that they match implementation --- lib/pods/SDL/RWOps.pod | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/lib/pods/SDL/RWOps.pod b/lib/pods/SDL/RWOps.pod index 7458e17d..b9c57c24 100644 --- a/lib/pods/SDL/RWOps.pod +++ b/lib/pods/SDL/RWOps.pod @@ -46,13 +46,14 @@ SDL::RWOps is an "undocumented" feature of SDL, allowing you to use pointers to An example usage would be to put a bunch of resources in a zip file and use Zziplib to access them easily. +B: All methods except C and C are still TODO. =head1 METHODS -=head2 rw_from_file(file,mode) +=head2 new_file(file,mode) -rw_from_file creates a new SDL::RWOps structure for reading from and/or writing to a named file. +C creates a new SDL::RWOps structure for reading from and/or writing to a named file. The mode string is treated the same as in a call to the C library's fopen(). SDL::rw_from_file() returns a SDL::RWOps structure on success or undef on failure. @@ -78,7 +79,7 @@ This additional "b" character can either be appended at the end of the string (t -=head2 rw_from_fp(fp,autoclose) +=head2 new_FP(fp,autoclose) SDL::rw_from_fp creates a new SDL::RWOps structure from a file pointer, opened with stdio. If autoclose is nonzero, the file will be automatically closed when the SDL::RWOps structure is closed. It returns a SDL::RWOps on success or undef on error. @@ -86,7 +87,7 @@ It returns a SDL::RWOps on success or undef on error. Note: This is not available under Win32, since files opened in an application on that platform cannot be used by a dynamically linked library. -=head2 rw_from_mem(mem,size) +=head2 new_mem(mem,size) SDL::rw_from_mem sets up a SDL::RWOps struct based on a chunk of memory of a certain size. It returns a SDL::RWOps on success or undef on error. @@ -94,28 +95,28 @@ It returns a SDL::RWOps on success or undef on error. Note: If the memory is not writable, use SDL::rw_from_const_mem instead. -=head2 from_const_mem +=head2 new_const_mem - my $rw = SDL::RWOps->from_const_mem( $image_data ); - my $rw = SDL::RWOps->from_const_mem( $image_data, $size ); + my $rw = SDL::RWOps->new_const_mem( $image_data ); + my $rw = SDL::RWOps->new_const_mem( $image_data, $size ); -C sets up a SDL::RWOps object based on a memory area of a certain size. The C<$size> parameter is optional. +C sets up a SDL::RWOps object based on a memory area of a certain size. The C<$size> parameter is optional. It assumes the memory area is not writable. It returns a SDL::RWOps on success or undef on error. -=head2 alloc_rw() +=head2 alloc() alloc_rw allocates an empty, unpopulated SDL::RWOps structure. You must fill out the fields yourself. It returns a SDL::RWOps structure on success or undef on error. Note: You must free any memory allocated with SDL::alloc_rw with SDL::free_rw. -=head2 free_rw(context) +=head2 free(context) SDL::free_rw frees an SDL::RWOps structure previously allocated by SDL::alloc_rw. Only use it on memory allocated by SDL::alloc_rw. It doesn't return anything. -=head2 rw_seek(ctx,offset,whence) +=head2 seek(ctx,offset,whence) SDL::rw_seek calls the seek function pointer in an SDL::RWOps structure. It takes the same 3 parameters as the function pointer: @@ -125,12 +126,12 @@ SDL::rw_seek calls the seek function pointer in an SDL::RWOps structure. It take SDL::rw_seek returns the final offset in the data source. -=head2 rw_tell(ctx) +=head2 tell(ctx) SDL::rw_tell performs a do-nothing seek to get the current offset in an SDL::RWOps stream ctx. It takes one parameter, a pointer to an SDL::RWOps structure. It returns the offset in the stream. -=head2 rw_read(ctx,ptr,size,n) +=head2 read(ctx,ptr,size,n) SDL_RWread calls the function pointed to by an SDL::RWOps structure's read member. It takes the same 4 parameters as the function pointer: @@ -142,7 +143,7 @@ SDL_RWread calls the function pointed to by an SDL::RWOps structure's read membe It returns the number of memory blocks read, or -1 if the read failed. -=head2 rw_write(ctx,ptr,size,n) +=head2 write(ctx,ptr,size,n) SDL_RWwrite calls the write function in an SDL::RWOps structure. It takes the same parameters as the write function given in the SDL::RWOps structure: @@ -155,7 +156,7 @@ SDL_RWwrite calls the write function in an SDL::RWOps structure. It takes the sa If it couldn't write that exact number of blocks, or the write didn't work at all, it returns -1. -=head2 rw_close(ctx) +=head2 close(ctx) SDL::rw_close calls the close function in an SDL::RWOps structure. It only takes one parameter, an SDL::RWOps structure. Returns 0 on success, -1 on error. From 9406c81306c622e355c9d2d6b7b5ca69222fb7ff Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Wed, 25 Jul 2012 23:48:00 +0200 Subject: [PATCH 113/153] logged changes (SDL::RWOps docs patch) --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index a8648a81..0ffd8938 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ Versioning rule: public releases are even numbers, dev releases are odd. (same l * 2.541_09 - Fixed license in SDL.pod [jtpalmer] + - SDL::RWops docs: fixed method names so that they match implementation [FROGGS] * 2.541_08 Jun 18 2012 - Lots of coumentation fixes [dod] From b10bd88e6bdc1f361e1623fc52b062ba7b6cabb0 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sat, 28 Jul 2012 11:30:21 -0400 Subject: [PATCH 114/153] Added strict and warnings --- CHANGELOG | 1 + lib/SDL/Constants.pm | 1 + lib/SDL_perl.pm | 5 ++++- lib/SDLx/Music/Data.pm | 3 +++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 0ffd8938..541500a9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) * 2.541_09 + - SDL::Constants, SDLx::Music::Data, SDL_perl: Added strict and warnings [jtpalmer] - Fixed license in SDL.pod [jtpalmer] - SDL::RWops docs: fixed method names so that they match implementation [FROGGS] diff --git a/lib/SDL/Constants.pm b/lib/SDL/Constants.pm index 978df978..d3b15939 100644 --- a/lib/SDL/Constants.pm +++ b/lib/SDL/Constants.pm @@ -1,6 +1,7 @@ #!/usr/bin/env perl package SDL::Constants; +use strict; use warnings; use base 'Exporter'; use Config; diff --git a/lib/SDL_perl.pm b/lib/SDL_perl.pm index 54662b60..5718f66c 100644 --- a/lib/SDL_perl.pm +++ b/lib/SDL_perl.pm @@ -30,7 +30,10 @@ package SDL_perl; -@ISA = qw/ DynaLoader /; +use strict; +use warnings; +use vars qw(@ISA); +our @ISA = qw/ DynaLoader /; require DynaLoader; use SDL::Internal::Loader; diff --git a/lib/SDLx/Music/Data.pm b/lib/SDLx/Music/Data.pm index 5bb0b7fe..e11427c5 100644 --- a/lib/SDLx/Music/Data.pm +++ b/lib/SDLx/Music/Data.pm @@ -1,5 +1,8 @@ package SDLx::Music::Data; +use strict; +use warnings; + sub volume { $_[0]->{volume} = $_[1] if $_[1]; From 03da8b072ae25d1f6377ac90efd2f45a64ee6113 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sat, 28 Jul 2012 11:31:54 -0400 Subject: [PATCH 115/153] Add strict and warnings --- CHANGELOG | 1 + t/config.t | 2 ++ t/core.t | 1 + t/core_audio.t | 1 + t/core_audiospec.t | 1 + t/core_cd.t | 1 + t/core_events.t | 1 + t/core_joystick.t | 1 + t/core_mouse.t | 1 + t/core_multi.t | 1 + t/core_rwops.t | 1 + t/core_surface.t | 1 + t/core_timer.t | 1 + t/core_version.t | 1 + t/core_video.t | 1 + t/core_video_convert_surface.t | 1 + t/core_video_gamma.t | 1 + t/extendingrect.t | 2 ++ t/image.t | 1 + t/image_xpm_array.t | 2 ++ t/mixer.t | 1 + t/mixer_groups.t | 1 + t/mixer_mixmusic.t | 1 + t/mixer_music.t | 1 + t/mixer_samples.t | 1 + t/pango.t | 1 + t/sdlgamerect.t | 1 + t/sdlx_app.t | 1 + t/sdlx_sound.t | 3 +++ t/sdlx_text.t | 1 + t/smpeg.t | 1 + t/ttf.t | 1 + t/ttf_font.t | 1 + 33 files changed, 38 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 541500a9..7a52287e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) * 2.541_09 + - t/*: Added strict and warnings where it was missing [jtpalmer] - SDL::Constants, SDLx::Music::Data, SDL_perl: Added strict and warnings [jtpalmer] - Fixed license in SDL.pod [jtpalmer] - SDL::RWops docs: fixed method names so that they match implementation [FROGGS] diff --git a/t/config.t b/t/config.t index d1191f7a..99ca73cb 100644 --- a/t/config.t +++ b/t/config.t @@ -1,5 +1,7 @@ # t/002_config.t - test config() functionality +use strict; +use warnings; use Test::More tests => 2; BEGIN { use_ok('SDL::Config'); } diff --git a/t/core.t b/t/core.t index 3cc7b7d6..1ccac868 100644 --- a/t/core.t +++ b/t/core.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use Config; use SDL; diff --git a/t/core_audio.t b/t/core_audio.t index 575bc43f..3ca35a4c 100644 --- a/t/core_audio.t +++ b/t/core_audio.t @@ -7,6 +7,7 @@ BEGIN { # http://wiki.cpantesters.org/wiki/CPANAuthorNotes } } use strict; +use warnings; use SDL; use SDL::Audio; use SDL::AudioSpec; diff --git a/t/core_audiospec.t b/t/core_audiospec.t index 0643b06e..aaa869c1 100644 --- a/t/core_audiospec.t +++ b/t/core_audiospec.t @@ -7,6 +7,7 @@ BEGIN { # http://wiki.cpantesters.org/wiki/CPANAuthorNotes } } use strict; +use warnings; use threads; use threads::shared; use SDL; diff --git a/t/core_cd.t b/t/core_cd.t index 4c340344..8f9b3809 100644 --- a/t/core_cd.t +++ b/t/core_cd.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; BEGIN { diff --git a/t/core_events.t b/t/core_events.t index 91240f65..1e37ade4 100644 --- a/t/core_events.t +++ b/t/core_events.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use SDL::Event; use SDL::Events; diff --git a/t/core_joystick.t b/t/core_joystick.t index eaadc511..863fe613 100644 --- a/t/core_joystick.t +++ b/t/core_joystick.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use Test::More; use SDL::Joystick; diff --git a/t/core_mouse.t b/t/core_mouse.t index be817f9f..57a37b8c 100644 --- a/t/core_mouse.t +++ b/t/core_mouse.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use Test::More; use SDL::Mouse; diff --git a/t/core_multi.t b/t/core_multi.t index c36a74b7..db3ee1e2 100644 --- a/t/core_multi.t +++ b/t/core_multi.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use Test::More; diff --git a/t/core_rwops.t b/t/core_rwops.t index 634204c1..5f40a82f 100644 --- a/t/core_rwops.t +++ b/t/core_rwops.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use Test::More; use SDL::RWOps; diff --git a/t/core_surface.t b/t/core_surface.t index 328a19dd..897536b6 100644 --- a/t/core_surface.t +++ b/t/core_surface.t @@ -9,6 +9,7 @@ BEGIN { } use strict; +use warnings; use SDL; use SDL::Config; use SDL::Surface; diff --git a/t/core_timer.t b/t/core_timer.t index c341edfc..6de72342 100644 --- a/t/core_timer.t +++ b/t/core_timer.t @@ -9,6 +9,7 @@ BEGIN { # http://wiki.cpantesters.org/wiki/CPANAuthorNotes use threads; use threads::shared; use strict; +use warnings; use SDL; use Test::More; use SDL::Time; diff --git a/t/core_version.t b/t/core_version.t index 27cc8f09..5df0404c 100644 --- a/t/core_version.t +++ b/t/core_version.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use SDL::Version; use Test::More tests => 8; diff --git a/t/core_video.t b/t/core_video.t index 1676d30c..caef2ced 100644 --- a/t/core_video.t +++ b/t/core_video.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use SDL::Color; use SDL::Surface; diff --git a/t/core_video_convert_surface.t b/t/core_video_convert_surface.t index 1a6dbbcd..ee04a116 100644 --- a/t/core_video_convert_surface.t +++ b/t/core_video_convert_surface.t @@ -1,4 +1,5 @@ use strict; +use warnings; use SDL; use SDL::Rect; use SDL::Color; diff --git a/t/core_video_gamma.t b/t/core_video_gamma.t index 128deeca..23434a42 100644 --- a/t/core_video_gamma.t +++ b/t/core_video_gamma.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use SDL::Color; use SDL::Surface; diff --git a/t/extendingrect.t b/t/extendingrect.t index 51703fef..6edb8c46 100644 --- a/t/extendingrect.t +++ b/t/extendingrect.t @@ -1,4 +1,6 @@ package MyRect; +use strict; +use warnings; use base 'SDL::Rect'; sub new { diff --git a/t/image.t b/t/image.t index fca748a1..d1f212c5 100644 --- a/t/image.t +++ b/t/image.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use SDL::Config; use SDL::Version; diff --git a/t/image_xpm_array.t b/t/image_xpm_array.t index ad459509..adc3abaa 100644 --- a/t/image_xpm_array.t +++ b/t/image_xpm_array.t @@ -1,6 +1,8 @@ #!/usr/bin/perl -Iblib/lib -Iblib -Iblib/arch # +use strict; +use warnings; use SDL; use SDL::Config; use SDL::Rect; diff --git a/t/mixer.t b/t/mixer.t index 5a515af3..2a0b106b 100644 --- a/t/mixer.t +++ b/t/mixer.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use SDL::Config; diff --git a/t/mixer_groups.t b/t/mixer_groups.t index 6778f382..06fe1db1 100644 --- a/t/mixer_groups.t +++ b/t/mixer_groups.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use SDL::Config; diff --git a/t/mixer_mixmusic.t b/t/mixer_mixmusic.t index 9809c4b5..e8bee656 100644 --- a/t/mixer_mixmusic.t +++ b/t/mixer_mixmusic.t @@ -1,4 +1,5 @@ use strict; +use warnings; use SDL; use SDL::Config; diff --git a/t/mixer_music.t b/t/mixer_music.t index b0293d11..11913192 100644 --- a/t/mixer_music.t +++ b/t/mixer_music.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; my $audiodriver; diff --git a/t/mixer_samples.t b/t/mixer_samples.t index ffc42c95..8b245109 100644 --- a/t/mixer_samples.t +++ b/t/mixer_samples.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use SDL::Config; diff --git a/t/pango.t b/t/pango.t index 545eb759..f8fc6af3 100644 --- a/t/pango.t +++ b/t/pango.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use SDL::Config; use SDL::Color; diff --git a/t/sdlgamerect.t b/t/sdlgamerect.t index 22472eba..a89ba408 100644 --- a/t/sdlgamerect.t +++ b/t/sdlgamerect.t @@ -1,5 +1,6 @@ use Test::More tests => 87; use strict; +use warnings; use SDL; use_ok('SDLx::Rect'); diff --git a/t/sdlx_app.t b/t/sdlx_app.t index 25af979c..12d89296 100644 --- a/t/sdlx_app.t +++ b/t/sdlx_app.t @@ -2,6 +2,7 @@ # basic testing of SDLx::App use strict; +use warnings; use SDL; use SDL::Config; use SDL::Rect; diff --git a/t/sdlx_sound.t b/t/sdlx_sound.t index a639d21f..c63f21ec 100644 --- a/t/sdlx_sound.t +++ b/t/sdlx_sound.t @@ -1,5 +1,8 @@ # basic testing of SDLx::Sound +use strict; +use warnings; + my $audiodriver; BEGIN { diff --git a/t/sdlx_text.t b/t/sdlx_text.t index 0459399d..0727b798 100644 --- a/t/sdlx_text.t +++ b/t/sdlx_text.t @@ -1,4 +1,5 @@ use strict; +use warnings; use SDL; use SDL::Config; use SDL::Color; diff --git a/t/smpeg.t b/t/smpeg.t index 65977d1a..d3de8499 100644 --- a/t/smpeg.t +++ b/t/smpeg.t @@ -6,6 +6,7 @@ BEGIN { } use strict; +use warnings; use SDL; use SDL::Config; diff --git a/t/ttf.t b/t/ttf.t index 70d54334..18bdca1c 100644 --- a/t/ttf.t +++ b/t/ttf.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use SDL::Config; use SDL::Color; diff --git a/t/ttf_font.t b/t/ttf_font.t index 13fbd7e8..e5a05ca2 100644 --- a/t/ttf_font.t +++ b/t/ttf_font.t @@ -1,5 +1,6 @@ #!/usr/bin/perl -w use strict; +use warnings; use SDL; use SDL::Config; From b5ab1d5986cdfa71b6fc109b5bcb1a0ae3d0085c Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sat, 28 Jul 2012 11:36:09 -0400 Subject: [PATCH 116/153] Added POD syntax tests --- CHANGELOG | 1 + t/release-pod-syntax.t | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 t/release-pod-syntax.t diff --git a/CHANGELOG b/CHANGELOG index 7a52287e..98f82abf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) * 2.541_09 + - Added pod syntax tests [jtpalmer] - t/*: Added strict and warnings where it was missing [jtpalmer] - SDL::Constants, SDLx::Music::Data, SDL_perl: Added strict and warnings [jtpalmer] - Fixed license in SDL.pod [jtpalmer] diff --git a/t/release-pod-syntax.t b/t/release-pod-syntax.t new file mode 100644 index 00000000..63bb021f --- /dev/null +++ b/t/release-pod-syntax.t @@ -0,0 +1,16 @@ +use strict; +use warnings; + +BEGIN { + unless ($ENV{RELEASE_TESTING}) { + require Test::More; + Test::More::plan(skip_all => 'these tests are for release candidate testing'); + } +} + +use Test::More; + +eval "use Test::Pod 1.41"; +plan skip_all => "Test::Pod 1.41 required for testing POD" if $@; + +all_pod_files_ok(); From 7f837e12a8a0393e0971124ffe0e9c1f831f4637 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sat, 28 Jul 2012 13:21:25 -0400 Subject: [PATCH 117/153] Added $VERSION to all modules --- CHANGELOG | 1 + lib/Module/Build/SDL.pm | 6 +++++- lib/SDL/Audio.pm | 6 +++++- lib/SDL/AudioCVT.pm | 6 +++++- lib/SDL/AudioSpec.pm | 6 +++++- lib/SDL/CD.pm | 6 +++++- lib/SDL/CDROM.pm | 6 +++++- lib/SDL/CDTrack.pm | 6 +++++- lib/SDL/Color.pm | 6 +++++- lib/SDL/Config.pm | 4 ++++ lib/SDL/Cursor.pm | 5 +++++ lib/SDL/Event.pm | 6 +++++- lib/SDL/Events.pm | 6 +++++- lib/SDL/GFX.pm | 6 +++++- lib/SDL/GFX/BlitFunc.pm | 6 +++++- lib/SDL/GFX/FPSManager.pm | 6 +++++- lib/SDL/GFX/Framerate.pm | 6 +++++- lib/SDL/GFX/ImageFilter.pm | 6 +++++- lib/SDL/GFX/Primitives.pm | 6 +++++- lib/SDL/GFX/Rotozoom.pm | 6 +++++- lib/SDL/Image.pm | 6 +++++- lib/SDL/Internal/Loader.pm | 4 ++++ lib/SDL/Joystick.pm | 5 +++++ lib/SDL/Mixer.pm | 6 +++++- lib/SDL/Mixer/Channels.pm | 6 +++++- lib/SDL/Mixer/Effects.pm | 6 +++++- lib/SDL/Mixer/Groups.pm | 6 +++++- lib/SDL/Mixer/MixChunk.pm | 6 +++++- lib/SDL/Mixer/MixMusic.pm | 6 +++++- lib/SDL/Mixer/Music.pm | 6 +++++- lib/SDL/Mixer/Samples.pm | 6 +++++- lib/SDL/Mouse.pm | 6 ++++++ lib/SDL/MultiThread.pm | 5 +++++ lib/SDL/Net.pm | 6 +++++- lib/SDL/Net/IPaddress.pm | 5 +++++ lib/SDL/Net/TCP.pm | 5 +++++ lib/SDL/Net/UDP.pm | 5 +++++ lib/SDL/Overlay.pm | 6 +++++- lib/SDL/Palette.pm | 6 +++++- lib/SDL/Pango.pm | 6 +++++- lib/SDL/Pango/Context.pm | 6 +++++- lib/SDL/PixelFormat.pm | 6 +++++- lib/SDL/RWOps.pm | 6 +++++- lib/SDL/Rect.pm | 6 +++++- lib/SDL/SMPEG.pm | 5 +++++ lib/SDL/SMPEG/Info.pm | 6 ++++++ lib/SDL/Surface.pm | 6 +++++- lib/SDL/TTF.pm | 6 +++++- lib/SDL/TTF/Font.pm | 6 +++++- lib/SDL/TTFont.pm | 5 ++++- lib/SDL/Time.pm | 5 +++++ lib/SDL/Tutorial.pm | 4 ++++ lib/SDL/Tutorial/Animation.pm | 4 ++++ lib/SDL/Tutorial/LunarLander.pm | 6 ++++++ lib/SDL/Version.pm | 5 +++++ lib/SDL/Video.pm | 6 +++++- lib/SDL/VideoInfo.pm | 6 +++++- lib/SDL_perl.pm | 8 +++++++- lib/SDLx/App.pm | 4 ++++ lib/SDLx/Controller.pm | 4 ++++ lib/SDLx/Controller/Interface.pm | 5 +++++ lib/SDLx/Controller/State.pm | 5 +++++ lib/SDLx/Controller/Timer.pm | 4 ++++ lib/SDLx/FPS.pm | 4 ++++ lib/SDLx/Layer.pm | 5 +++++ lib/SDLx/LayerManager.pm | 5 +++++ lib/SDLx/Music.pm | 4 ++++ lib/SDLx/Music/Data.pm | 4 ++++ lib/SDLx/Music/Default.pm | 4 ++++ lib/SDLx/SFont.pm | 6 +++++- lib/SDLx/Sprite.pm | 4 ++++ lib/SDLx/Sprite/Animated.pm | 4 ++++ lib/SDLx/Surface.pm | 6 +++++- lib/SDLx/Surface/TiedMatrix.pm | 4 ++++ lib/SDLx/Surface/TiedMatrixRow.pm | 4 ++++ lib/SDLx/TTF.pm | 3 +++ lib/SDLx/Text.pm | 4 ++++ lib/SDLx/Validate.pm | 6 +++++- 78 files changed, 372 insertions(+), 44 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 98f82abf..16096309 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) * 2.541_09 + - Added $VERSION to all modules [jtpalmer] - Added pod syntax tests [jtpalmer] - t/*: Added strict and warnings where it was missing [jtpalmer] - SDL::Constants, SDLx::Music::Data, SDL_perl: Added strict and warnings [jtpalmer] diff --git a/lib/Module/Build/SDL.pm b/lib/Module/Build/SDL.pm index 8aae1005..26634bce 100644 --- a/lib/Module/Build/SDL.pm +++ b/lib/Module/Build/SDL.pm @@ -2,6 +2,10 @@ package Module::Build::SDL; use strict; use warnings; use base 'Module::Build'; +use vars qw($VERSION); + +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; __PACKAGE__->add_property(parinput => ''); __PACKAGE__->add_property(paroutput => ''); @@ -348,4 +352,4 @@ subdir only via L =back -=cut \ No newline at end of file +=cut diff --git a/lib/SDL/Audio.pm b/lib/SDL/Audio.pm index 220a4aa1..254501df 100644 --- a/lib/SDL/Audio.pm +++ b/lib/SDL/Audio.pm @@ -1,12 +1,16 @@ package SDL::Audio; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Audio'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/AudioCVT.pm b/lib/SDL/AudioCVT.pm index bb010e1b..86e66f96 100644 --- a/lib/SDL/AudioCVT.pm +++ b/lib/SDL/AudioCVT.pm @@ -1,12 +1,16 @@ package SDL::AudioCVT; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Audio'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/AudioSpec.pm b/lib/SDL/AudioSpec.pm index d9677e6e..a0941e61 100644 --- a/lib/SDL/AudioSpec.pm +++ b/lib/SDL/AudioSpec.pm @@ -1,12 +1,16 @@ package SDL::AudioSpec; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Audio'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/CD.pm b/lib/SDL/CD.pm index 16167648..4b71698f 100644 --- a/lib/SDL/CD.pm +++ b/lib/SDL/CD.pm @@ -1,12 +1,16 @@ package SDL::CD; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::CDROM'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/CDROM.pm b/lib/SDL/CDROM.pm index af00850e..21afa84d 100644 --- a/lib/SDL/CDROM.pm +++ b/lib/SDL/CDROM.pm @@ -1,12 +1,16 @@ package SDL::CDROM; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::CDROM'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/CDTrack.pm b/lib/SDL/CDTrack.pm index 5689c501..e3d76a53 100644 --- a/lib/SDL/CDTrack.pm +++ b/lib/SDL/CDTrack.pm @@ -1,12 +1,16 @@ package SDL::CDTrack; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::CDROM'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Color.pm b/lib/SDL/Color.pm index 2bb064ea..033099aa 100644 --- a/lib/SDL/Color.pm +++ b/lib/SDL/Color.pm @@ -1,12 +1,16 @@ package SDL::Color; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Config.pm b/lib/SDL/Config.pm index 7327cbd3..578e15e3 100644 --- a/lib/SDL/Config.pm +++ b/lib/SDL/Config.pm @@ -2,8 +2,12 @@ package SDL::Config; use strict; use warnings; +use vars qw($VERSION); use SDL::ConfigData; +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + sub has { my ( $class, $define ) = @_; my $sdl_config = SDL::ConfigData->config('SDL_cfg'); diff --git a/lib/SDL/Cursor.pm b/lib/SDL/Cursor.pm index f77e49e7..dc06f767 100644 --- a/lib/SDL/Cursor.pm +++ b/lib/SDL/Cursor.pm @@ -1,10 +1,15 @@ package SDL::Cursor; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Event.pm b/lib/SDL/Event.pm index 753cc22f..4bb4a67c 100644 --- a/lib/SDL/Event.pm +++ b/lib/SDL/Event.pm @@ -1,12 +1,16 @@ package SDL::Event; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Events'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Events.pm b/lib/SDL/Events.pm index 42e105a0..55eff335 100644 --- a/lib/SDL/Events.pm +++ b/lib/SDL/Events.pm @@ -1,12 +1,16 @@ package SDL::Events; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Events'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX.pm b/lib/SDL/GFX.pm index 70bf5f5e..d84b7b48 100644 --- a/lib/SDL/GFX.pm +++ b/lib/SDL/GFX.pm @@ -1,12 +1,16 @@ package SDL::GFX; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX/BlitFunc.pm b/lib/SDL/GFX/BlitFunc.pm index 14263283..1315fe24 100644 --- a/lib/SDL/GFX/BlitFunc.pm +++ b/lib/SDL/GFX/BlitFunc.pm @@ -1,12 +1,16 @@ package SDL::GFX::BlitFunc; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX/FPSManager.pm b/lib/SDL/GFX/FPSManager.pm index cb7475aa..bf305a87 100644 --- a/lib/SDL/GFX/FPSManager.pm +++ b/lib/SDL/GFX/FPSManager.pm @@ -1,12 +1,16 @@ package SDL::GFX::FPSManager; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX/Framerate.pm b/lib/SDL/GFX/Framerate.pm index 20057a46..7d436c14 100644 --- a/lib/SDL/GFX/Framerate.pm +++ b/lib/SDL/GFX/Framerate.pm @@ -1,12 +1,16 @@ package SDL::GFX::Framerate; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX/ImageFilter.pm b/lib/SDL/GFX/ImageFilter.pm index 963ebab6..bcaa1d77 100644 --- a/lib/SDL/GFX/ImageFilter.pm +++ b/lib/SDL/GFX/ImageFilter.pm @@ -1,12 +1,16 @@ package SDL::GFX::ImageFilter; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX/Primitives.pm b/lib/SDL/GFX/Primitives.pm index 3a868095..d58fff9a 100644 --- a/lib/SDL/GFX/Primitives.pm +++ b/lib/SDL/GFX/Primitives.pm @@ -1,12 +1,16 @@ package SDL::GFX::Primitives; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX/Rotozoom.pm b/lib/SDL/GFX/Rotozoom.pm index 78bf3993..00986841 100644 --- a/lib/SDL/GFX/Rotozoom.pm +++ b/lib/SDL/GFX/Rotozoom.pm @@ -1,12 +1,16 @@ package SDL::GFX::Rotozoom; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Image.pm b/lib/SDL/Image.pm index 3673c113..a8d7ce58 100644 --- a/lib/SDL/Image.pm +++ b/lib/SDL/Image.pm @@ -1,13 +1,17 @@ package SDL::Image; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Image'; use SDL::Surface; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Internal/Loader.pm b/lib/SDL/Internal/Loader.pm index 329c8c5b..4a7ed5b5 100644 --- a/lib/SDL/Internal/Loader.pm +++ b/lib/SDL/Internal/Loader.pm @@ -1,11 +1,15 @@ package SDL::Internal::Loader; use strict; use warnings; +use vars qw($VERSION @ISA @EXPORT @LIBREFS); require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(internal_load_dlls); our @LIBREFS = (); +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + use SDL::ConfigData; use Alien::SDL; diff --git a/lib/SDL/Joystick.pm b/lib/SDL/Joystick.pm index c05527dc..0f1d06d7 100644 --- a/lib/SDL/Joystick.pm +++ b/lib/SDL/Joystick.pm @@ -1,10 +1,15 @@ package SDL::Joystick; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer.pm b/lib/SDL/Mixer.pm index 6bbc96e6..f9308fad 100644 --- a/lib/SDL/Mixer.pm +++ b/lib/SDL/Mixer.pm @@ -1,12 +1,16 @@ package SDL::Mixer; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/Channels.pm b/lib/SDL/Mixer/Channels.pm index cc5f167a..86317fbb 100644 --- a/lib/SDL/Mixer/Channels.pm +++ b/lib/SDL/Mixer/Channels.pm @@ -1,12 +1,16 @@ package SDL::Mixer::Channels; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/Effects.pm b/lib/SDL/Mixer/Effects.pm index df986fc1..0a1e0a04 100644 --- a/lib/SDL/Mixer/Effects.pm +++ b/lib/SDL/Mixer/Effects.pm @@ -1,12 +1,16 @@ package SDL::Mixer::Effects; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/Groups.pm b/lib/SDL/Mixer/Groups.pm index 58405d51..f7404c48 100644 --- a/lib/SDL/Mixer/Groups.pm +++ b/lib/SDL/Mixer/Groups.pm @@ -1,12 +1,16 @@ package SDL::Mixer::Groups; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/MixChunk.pm b/lib/SDL/Mixer/MixChunk.pm index c35efa54..e1bb2e65 100644 --- a/lib/SDL/Mixer/MixChunk.pm +++ b/lib/SDL/Mixer/MixChunk.pm @@ -1,12 +1,16 @@ package SDL::Mixer::MixChunk; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/MixMusic.pm b/lib/SDL/Mixer/MixMusic.pm index 776f712e..dbaf641f 100644 --- a/lib/SDL/Mixer/MixMusic.pm +++ b/lib/SDL/Mixer/MixMusic.pm @@ -1,12 +1,16 @@ package SDL::Mixer::MixMusic; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/Music.pm b/lib/SDL/Mixer/Music.pm index 9e5365b9..6e0690ef 100644 --- a/lib/SDL/Mixer/Music.pm +++ b/lib/SDL/Mixer/Music.pm @@ -1,12 +1,16 @@ package SDL::Mixer::Music; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/Samples.pm b/lib/SDL/Mixer/Samples.pm index 1cd17ab9..a935ad39 100644 --- a/lib/SDL/Mixer/Samples.pm +++ b/lib/SDL/Mixer/Samples.pm @@ -1,12 +1,16 @@ package SDL::Mixer::Samples; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mouse.pm b/lib/SDL/Mouse.pm index 5782c596..c71702f1 100644 --- a/lib/SDL/Mouse.pm +++ b/lib/SDL/Mouse.pm @@ -1,9 +1,15 @@ package SDL::Mouse; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); + +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + bootstrap SDL::Mouse; 1; diff --git a/lib/SDL/MultiThread.pm b/lib/SDL/MultiThread.pm index 979a1df9..7113d59a 100644 --- a/lib/SDL/MultiThread.pm +++ b/lib/SDL/MultiThread.pm @@ -1,10 +1,15 @@ package SDL::MultiThread; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Net.pm b/lib/SDL/Net.pm index 123de470..56f5462b 100644 --- a/lib/SDL/Net.pm +++ b/lib/SDL/Net.pm @@ -1,12 +1,16 @@ package SDL::Net; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Net'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Net/IPaddress.pm b/lib/SDL/Net/IPaddress.pm index 90c7e986..a57e65d6 100644 --- a/lib/SDL/Net/IPaddress.pm +++ b/lib/SDL/Net/IPaddress.pm @@ -1,10 +1,15 @@ package SDL::Net::IPaddress; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Net/TCP.pm b/lib/SDL/Net/TCP.pm index 1884124c..7190063f 100644 --- a/lib/SDL/Net/TCP.pm +++ b/lib/SDL/Net/TCP.pm @@ -1,10 +1,15 @@ package SDL::Net::TCP; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Net/UDP.pm b/lib/SDL/Net/UDP.pm index 4733495f..440c137a 100644 --- a/lib/SDL/Net/UDP.pm +++ b/lib/SDL/Net/UDP.pm @@ -1,10 +1,15 @@ package SDL::Net::UDP; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Overlay.pm b/lib/SDL/Overlay.pm index 7a110f85..656bd3db 100644 --- a/lib/SDL/Overlay.pm +++ b/lib/SDL/Overlay.pm @@ -1,12 +1,16 @@ package SDL::Overlay; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Palette.pm b/lib/SDL/Palette.pm index 23b391b9..dd145991 100644 --- a/lib/SDL/Palette.pm +++ b/lib/SDL/Palette.pm @@ -1,13 +1,17 @@ package SDL::Palette; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; use SDL::Color; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Pango.pm b/lib/SDL/Pango.pm index 4edc4444..49659f7c 100644 --- a/lib/SDL/Pango.pm +++ b/lib/SDL/Pango.pm @@ -1,12 +1,16 @@ package SDL::Pango; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Pango'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Pango/Context.pm b/lib/SDL/Pango/Context.pm index 85d7a4f7..f6055998 100644 --- a/lib/SDL/Pango/Context.pm +++ b/lib/SDL/Pango/Context.pm @@ -1,12 +1,16 @@ package SDL::Pango::Context; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Pango'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/PixelFormat.pm b/lib/SDL/PixelFormat.pm index bd3f5337..2e44276b 100644 --- a/lib/SDL/PixelFormat.pm +++ b/lib/SDL/PixelFormat.pm @@ -1,12 +1,16 @@ package SDL::PixelFormat; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/RWOps.pm b/lib/SDL/RWOps.pm index 26f62561..b070fe5f 100644 --- a/lib/SDL/RWOps.pm +++ b/lib/SDL/RWOps.pm @@ -1,12 +1,16 @@ package SDL::RWOps; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::RWOps'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Rect.pm b/lib/SDL/Rect.pm index 14c75e5a..fdf17c02 100644 --- a/lib/SDL/Rect.pm +++ b/lib/SDL/Rect.pm @@ -1,12 +1,16 @@ package SDL::Rect; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/SMPEG.pm b/lib/SDL/SMPEG.pm index 467abe65..0d4113be 100644 --- a/lib/SDL/SMPEG.pm +++ b/lib/SDL/SMPEG.pm @@ -2,6 +2,7 @@ package SDL::SMPEG; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); use Carp; use SDL; use SDL::Surface; @@ -10,6 +11,10 @@ use Scalar::Util 'refaddr'; use Data::Dumper; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/SMPEG/Info.pm b/lib/SDL/SMPEG/Info.pm index b9d093e6..b7daba93 100644 --- a/lib/SDL/SMPEG/Info.pm +++ b/lib/SDL/SMPEG/Info.pm @@ -32,11 +32,17 @@ package SDL::SMPEG::Info; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); use Carp; use SDL; our @ISA = qw(Exporter DynaLoader); use SDL::SMPEG; use SDL::Internal::Loader; + +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + internal_load_dlls(__PACKAGE__); bootstrap SDL::SMPEG::Info; diff --git a/lib/SDL/Surface.pm b/lib/SDL/Surface.pm index ae188375..4da10cac 100644 --- a/lib/SDL/Surface.pm +++ b/lib/SDL/Surface.pm @@ -1,13 +1,17 @@ package SDL::Surface; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; use SDL::PixelFormat; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/TTF.pm b/lib/SDL/TTF.pm index 5e8395fc..2d84f1a6 100644 --- a/lib/SDL/TTF.pm +++ b/lib/SDL/TTF.pm @@ -1,12 +1,16 @@ package SDL::TTF; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::TTF'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/TTF/Font.pm b/lib/SDL/TTF/Font.pm index 67e8fa58..016d69fe 100644 --- a/lib/SDL/TTF/Font.pm +++ b/lib/SDL/TTF/Font.pm @@ -1,12 +1,16 @@ package SDL::TTF::Font; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::TTF'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/TTFont.pm b/lib/SDL/TTFont.pm index 7b1049ed..2993e549 100644 --- a/lib/SDL/TTFont.pm +++ b/lib/SDL/TTFont.pm @@ -36,10 +36,13 @@ use Carp; use SDL; use SDL::Surface; -use vars qw/ @ISA /; +use vars qw/ $VERSION @ISA /; @ISA = qw(SDL::Surface); +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + sub new { my $proto = shift; my $class = ref($proto) || $proto; diff --git a/lib/SDL/Time.pm b/lib/SDL/Time.pm index 6e983506..da0f6ec9 100644 --- a/lib/SDL/Time.pm +++ b/lib/SDL/Time.pm @@ -1,10 +1,15 @@ package SDL::Time; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Tutorial.pm b/lib/SDL/Tutorial.pm index 13669943..bc62b099 100644 --- a/lib/SDL/Tutorial.pm +++ b/lib/SDL/Tutorial.pm @@ -32,10 +32,14 @@ package SDL::Tutorial; use strict; use warnings; +use vars qw($VERSION); use SDL; use SDLx::App; +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + # change these values as necessary my $title = 'My SDL App'; my ( $width, $height, $depth ) = ( 640, 480, 16 ); diff --git a/lib/SDL/Tutorial/Animation.pm b/lib/SDL/Tutorial/Animation.pm index 30a44b26..a9fb66ca 100644 --- a/lib/SDL/Tutorial/Animation.pm +++ b/lib/SDL/Tutorial/Animation.pm @@ -32,6 +32,7 @@ package SDL::Tutorial::Animation; use strict; use warnings; +use vars qw($VERSION); use SDL; use SDLx::App; @@ -39,6 +40,9 @@ use SDL::Rect; use SDL::Color; use SDL::Video; +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + # change these values as necessary my $title = 'My SDL Animation'; my ( $width, $height, $depth ) = ( 640, 480, 16 ); diff --git a/lib/SDL/Tutorial/LunarLander.pm b/lib/SDL/Tutorial/LunarLander.pm index 2d01d53b..78df0450 100644 --- a/lib/SDL/Tutorial/LunarLander.pm +++ b/lib/SDL/Tutorial/LunarLander.pm @@ -1,4 +1,10 @@ package SDL::Tutorial::LunarLander; +use strict; +use warnings; +use vars qw($VERSION); + +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; sub import { my ( $class, $filename ) = (@_); diff --git a/lib/SDL/Version.pm b/lib/SDL/Version.pm index e6c2002b..4ff70bcf 100644 --- a/lib/SDL/Version.pm +++ b/lib/SDL/Version.pm @@ -1,10 +1,15 @@ package SDL::Version; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Video.pm b/lib/SDL/Video.pm index f3e6ff52..a8463257 100644 --- a/lib/SDL/Video.pm +++ b/lib/SDL/Video.pm @@ -1,12 +1,16 @@ package SDL::Video; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/VideoInfo.pm b/lib/SDL/VideoInfo.pm index b8049b9a..15d88712 100644 --- a/lib/SDL/VideoInfo.pm +++ b/lib/SDL/VideoInfo.pm @@ -1,12 +1,16 @@ package SDL::VideoInfo; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL_perl.pm b/lib/SDL_perl.pm index 5718f66c..83eefe6c 100644 --- a/lib/SDL_perl.pm +++ b/lib/SDL_perl.pm @@ -32,8 +32,14 @@ package SDL_perl; use strict; use warnings; -use vars qw(@ISA); +use vars qw($VERSION $XS_VERSION @ISA); + our @ISA = qw/ DynaLoader /; + +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + require DynaLoader; use SDL::Internal::Loader; diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index f5d777bd..aab7e2bf 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -2,6 +2,10 @@ package SDLx::App; use strict; use warnings; +use vars qw($VERSION); + +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; # SDL modules actually used here use SDL (); diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 5eec4fa6..1a6f764d 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -1,6 +1,7 @@ package SDLx::Controller; use strict; use warnings; +use vars qw($VERSION); use Carp (); use Time::HiRes (); use SDL (); @@ -11,6 +12,9 @@ use SDLx::Controller::Interface; use SDLx::Controller::State; use Scalar::Util 'refaddr'; +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + # inside out, so this can work as the superclass of another class my %_dt; my %_min_t; diff --git a/lib/SDLx/Controller/Interface.pm b/lib/SDLx/Controller/Interface.pm index 2b55b801..2a0a5bd9 100644 --- a/lib/SDLx/Controller/Interface.pm +++ b/lib/SDLx/Controller/Interface.pm @@ -1,11 +1,16 @@ package SDLx::Controller::Interface; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); use Carp qw/confess/; use Scalar::Util 'refaddr'; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; my %_controller; diff --git a/lib/SDLx/Controller/State.pm b/lib/SDLx/Controller/State.pm index 203e691f..f60042b6 100644 --- a/lib/SDLx/Controller/State.pm +++ b/lib/SDLx/Controller/State.pm @@ -1,9 +1,14 @@ package SDLx::Controller::State; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDLx/Controller/Timer.pm b/lib/SDLx/Controller/Timer.pm index 48e3776b..41d75b8d 100644 --- a/lib/SDLx/Controller/Timer.pm +++ b/lib/SDLx/Controller/Timer.pm @@ -4,8 +4,12 @@ package SDLx::Controller::Timer; # use strict; use warnings; +use vars qw($VERSION @ISA); use SDL; +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + sub new { my $class = shift; my $self = bless {@_}, $class; diff --git a/lib/SDLx/FPS.pm b/lib/SDLx/FPS.pm index 888ec261..42c1a5aa 100644 --- a/lib/SDLx/FPS.pm +++ b/lib/SDLx/FPS.pm @@ -1,11 +1,15 @@ package SDLx::FPS; use strict; use warnings; +use vars qw($VERSION @ISA); use SDL::GFX::Framerate; use SDL::GFX::FPSManager; use Carp; our @ISA = qw(SDL::GFX::FPSManager); +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + sub new { my ( $class, %args ) = @_; diff --git a/lib/SDLx/Layer.pm b/lib/SDLx/Layer.pm index d2ac63cf..8fc2eaa8 100644 --- a/lib/SDLx/Layer.pm +++ b/lib/SDLx/Layer.pm @@ -1,6 +1,7 @@ package SDLx::Layer; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); use SDL; use SDLx::Surface; use SDLx::Sprite; @@ -8,6 +9,10 @@ use SDL::Events; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDLx/LayerManager.pm b/lib/SDLx/LayerManager.pm index f8589f5f..8fb42e4c 100644 --- a/lib/SDLx/LayerManager.pm +++ b/lib/SDLx/LayerManager.pm @@ -1,6 +1,7 @@ package SDLx::LayerManager; use strict; use warnings; +use vars qw($VERSION $XS_VERSION @ISA); use SDL; use SDLx::Surface; use SDLx::Sprite; @@ -8,6 +9,10 @@ use SDL::Events; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDLx/Music.pm b/lib/SDLx/Music.pm index 8f1f7fd9..f6c2e6e1 100644 --- a/lib/SDLx/Music.pm +++ b/lib/SDLx/Music.pm @@ -1,6 +1,7 @@ package SDLx::Music; use strict; use warnings; +use vars qw($VERSION); use Carp (); use SDL; use SDL::Audio; @@ -14,6 +15,9 @@ use Data::Dumper; use SDLx::Music::Default; use SDLx::Music::Data; +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + our $def = bless( {}, "SDLx::Music::Default" ); sub new { diff --git a/lib/SDLx/Music/Data.pm b/lib/SDLx/Music/Data.pm index e11427c5..5fc5d625 100644 --- a/lib/SDLx/Music/Data.pm +++ b/lib/SDLx/Music/Data.pm @@ -2,6 +2,10 @@ package SDLx::Music::Data; use strict; use warnings; +use vars qw($VERSION); + +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; sub volume { diff --git a/lib/SDLx/Music/Default.pm b/lib/SDLx/Music/Default.pm index 41d49324..151f2b03 100644 --- a/lib/SDLx/Music/Default.pm +++ b/lib/SDLx/Music/Default.pm @@ -1,6 +1,10 @@ package SDLx::Music::Default; use strict; use warnings; +use vars qw($VERSION); + +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; sub ext { diff --git a/lib/SDLx/SFont.pm b/lib/SDLx/SFont.pm index 3687ce69..f81cd02a 100644 --- a/lib/SDLx/SFont.pm +++ b/lib/SDLx/SFont.pm @@ -2,12 +2,16 @@ package SDLx::SFont; use strict; use warnings; use SDL::Image; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::TTF'; our @ISA = qw(Exporter DynaLoader SDL::Surface); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use base 'Exporter'; our @EXPORT = ('SDL_TEXTWIDTH'); diff --git a/lib/SDLx/Sprite.pm b/lib/SDLx/Sprite.pm index 4f2e557f..236b9f3e 100644 --- a/lib/SDLx/Sprite.pm +++ b/lib/SDLx/Sprite.pm @@ -1,6 +1,7 @@ package SDLx::Sprite; use strict; use warnings; +use vars qw($VERSION); use SDL; use SDL::Video; @@ -12,6 +13,9 @@ use SDLx::Validate; use Carp (); +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + sub new { my ( $class, %options ) = @_; diff --git a/lib/SDLx/Sprite/Animated.pm b/lib/SDLx/Sprite/Animated.pm index ebefb955..721ff170 100644 --- a/lib/SDLx/Sprite/Animated.pm +++ b/lib/SDLx/Sprite/Animated.pm @@ -1,6 +1,7 @@ package SDLx::Sprite::Animated; use strict; use warnings; +use vars qw($VERSION); use Scalar::Util 'refaddr'; use SDL; @@ -11,6 +12,9 @@ use SDLx::Validate; use base 'SDLx::Sprite'; +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + # inside out my %_ticks; my %_width; diff --git a/lib/SDLx/Surface.pm b/lib/SDLx/Surface.pm index c46442f5..bc52147f 100644 --- a/lib/SDLx/Surface.pm +++ b/lib/SDLx/Surface.pm @@ -1,7 +1,7 @@ package SDLx::Surface; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use Carp (); @@ -27,6 +27,10 @@ use overload ( use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader SDL::Surface); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDLx/Surface/TiedMatrix.pm b/lib/SDLx/Surface/TiedMatrix.pm index d25da83f..db2b4574 100644 --- a/lib/SDLx/Surface/TiedMatrix.pm +++ b/lib/SDLx/Surface/TiedMatrix.pm @@ -1,9 +1,13 @@ package SDLx::Surface::TiedMatrix; use strict; use warnings; +use vars qw($VERSION); use SDLx::Surface::TiedMatrixRow; use base 'Tie::Array'; +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + sub new { my $class = shift; my $matrix = shift; diff --git a/lib/SDLx/Surface/TiedMatrixRow.pm b/lib/SDLx/Surface/TiedMatrixRow.pm index ddb1ce55..74e65b21 100644 --- a/lib/SDLx/Surface/TiedMatrixRow.pm +++ b/lib/SDLx/Surface/TiedMatrixRow.pm @@ -1,8 +1,12 @@ package SDLx::Surface::TiedMatrixRow; use strict; use warnings; +use vars qw($VERSION); use base 'Tie::Array'; +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + sub new { my $class = shift; my $matrix = shift; diff --git a/lib/SDLx/TTF.pm b/lib/SDLx/TTF.pm index a311133f..1ab48e81 100644 --- a/lib/SDLx/TTF.pm +++ b/lib/SDLx/TTF.pm @@ -1,12 +1,15 @@ package SDLx::TTF; use strict; use warnings; +use vars qw($VERSION); use Carp; use SDL; use SDL::TTF; use SDL::TTF::Font; +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/Text.pm b/lib/SDLx/Text.pm index e4dfd948..dc2ae811 100644 --- a/lib/SDLx/Text.pm +++ b/lib/SDLx/Text.pm @@ -1,6 +1,7 @@ package SDLx::Text; use strict; use warnings; +use vars qw($VERSION); use SDL; use SDL::Video; use SDL::Config; @@ -11,6 +12,9 @@ use List::Util qw(max sum); use Carp (); +our $VERSION = '2.541_08'; +$VERSION = eval $VERSION; + sub new { my ($class, %options) = @_; unless ( SDL::Config->has('SDL_ttf') ) { diff --git a/lib/SDLx/Validate.pm b/lib/SDLx/Validate.pm index ece6fb3d..182d7542 100644 --- a/lib/SDLx/Validate.pm +++ b/lib/SDLx/Validate.pm @@ -2,11 +2,15 @@ package SDLx::Validate; use strict; use warnings; -use vars qw(@ISA @EXPORT @EXPORT_OK); +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); +our $VERSION = '2.541_08'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + $SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /Use of uninitialized value in subroutine entry/}; use Carp (); From 905acc31bc30d9ba2eb7c65750e5e0c449b1e67e Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sun, 5 Aug 2012 20:40:13 -0400 Subject: [PATCH 118/153] Updated Alien::SDL requirement to 1.437_2 Conflicts: Build.PL --- Build.PL | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Build.PL b/Build.PL index 769c98b8..65911e23 100644 --- a/Build.PL +++ b/Build.PL @@ -589,7 +589,7 @@ my $build = $package->new( configure_requires => { 'Module::Build' => '0', 'ExtUtils::CBuilder' => '0.260301', - 'Alien::SDL' => '1.435_7', + 'Alien::SDL' => '1.437_2', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', @@ -599,7 +599,7 @@ my $build = $package->new( 'Test::Simple' => '0.88', 'Capture::Tiny' => '0', 'Test::Most' => '0.21', - 'Alien::SDL' => '1.435_7', + 'Alien::SDL' => '1.437_2', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', From 2ed57feebfcea17bbb84eae6610ae72389e9dc14 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sun, 5 Aug 2012 20:50:29 -0400 Subject: [PATCH 119/153] Update manifest --- MANIFEST | 4 +++- MANIFEST.SKIP | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/MANIFEST b/MANIFEST index c6772003..b5bdede6 100644 --- a/MANIFEST +++ b/MANIFEST @@ -70,6 +70,7 @@ lib/pods/SDL/Palette.pod lib/pods/SDL/Pango.pod lib/pods/SDL/Pango/Context.pod lib/pods/SDL/PixelFormat.pod +lib/pods/SDL/Platform.pod lib/pods/SDL/Rect.pod lib/pods/SDL/RWOps.pod lib/pods/SDL/SMPEG.pod @@ -182,6 +183,7 @@ MacOSX/main.c MacOSX/Makefile.test MacOSX/SDLPerl.icns MANIFEST This list of files +META.json META.yml OFL-FAQ.txt OFL.txt @@ -308,6 +310,7 @@ t/mixer_mixmusic.t t/mixer_music.t t/mixer_samples.t t/pango.t +t/release-pod-syntax.t t/sdlgamerect.t t/sdlx_app.t t/sdlx_controller.t @@ -357,4 +360,3 @@ test/data/wood_dark.png test/data/wood_light.png TODO typemap -META.json diff --git a/MANIFEST.SKIP b/MANIFEST.SKIP index a7b69177..f1ad0d32 100644 --- a/MANIFEST.SKIP +++ b/MANIFEST.SKIP @@ -1,4 +1,5 @@ ~$ \.o$ +\.obj$ \.bak$ -^(?!typemap|share|scripts/\w+\.pl|src/[^\.]|test/data/[^\.]|MacOSX/[^\.]|examples/[^\.]+|lib/[\/\w]+\.p(m|od)|inc/|t/[\w\d-]+\.t|t/lib/SDL/TestTool\.pm|Build.PL$|INSTALL$|README$|MANIFEST$|CHANGELOG$|TODO$|CONTRIBUTORS$|COPYING$|OFL-FAQ.txt|OFL.txt|META.yml|$) +^(?!typemap|share|scripts/\w+\.pl|src/[^\.]|test/data/[^\.]|MacOSX/[^\.]|examples/[^\.]+|lib/[\/\w]+\.p(m|od)|inc/|t/[\w\d-]+\.t|t/lib/SDL/TestTool\.pm|Build.PL$|INSTALL$|README$|MANIFEST$|CHANGELOG$|TODO$|CONTRIBUTORS$|COPYING$|OFL-FAQ.txt|OFL.txt|META.(yml|json)|$) From e87edc2668c684c92e094ccb3b256647fc59de56 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sun, 5 Aug 2012 21:14:06 -0400 Subject: [PATCH 120/153] Release 2.541_09 Conflicts: lib/SDL/Audio.pm lib/SDL/AudioCVT.pm lib/SDL/AudioSpec.pm lib/SDL/CD.pm lib/SDL/CDROM.pm lib/SDL/CDTrack.pm lib/SDL/Color.pm lib/SDL/Cursor.pm lib/SDL/Event.pm lib/SDL/Events.pm lib/SDL/GFX.pm lib/SDL/GFX/BlitFunc.pm lib/SDL/GFX/FPSManager.pm lib/SDL/GFX/Framerate.pm lib/SDL/GFX/ImageFilter.pm lib/SDL/GFX/Primitives.pm lib/SDL/GFX/Rotozoom.pm lib/SDL/Image.pm lib/SDL/Joystick.pm lib/SDL/Mixer.pm lib/SDL/Mixer/Channels.pm lib/SDL/Mixer/Effects.pm lib/SDL/Mixer/Groups.pm lib/SDL/Mixer/MixChunk.pm lib/SDL/Mixer/MixMusic.pm lib/SDL/Mixer/Music.pm lib/SDL/Mixer/Samples.pm lib/SDL/Mouse.pm lib/SDL/MultiThread.pm lib/SDL/Net.pm lib/SDL/Net/IPaddress.pm lib/SDL/Net/TCP.pm lib/SDL/Net/UDP.pm lib/SDL/Overlay.pm lib/SDL/Palette.pm lib/SDL/Pango.pm lib/SDL/Pango/Context.pm lib/SDL/PixelFormat.pm lib/SDL/RWOps.pm lib/SDL/Rect.pm lib/SDL/SMPEG.pm lib/SDL/SMPEG/Info.pm lib/SDL/Surface.pm lib/SDL/TTF.pm lib/SDL/TTF/Font.pm lib/SDL/Time.pm lib/SDL/Version.pm lib/SDL/Video.pm lib/SDL/VideoInfo.pm lib/SDL_perl.pm lib/SDLx/Controller/Interface.pm lib/SDLx/Controller/State.pm lib/SDLx/Layer.pm lib/SDLx/LayerManager.pm lib/SDLx/SFont.pm lib/SDLx/Surface.pm lib/SDLx/Validate.pm --- CHANGELOG | 3 ++- lib/Module/Build/SDL.pm | 2 +- lib/SDL.pm | 2 +- lib/SDL/Audio.pm | 2 +- lib/SDL/AudioCVT.pm | 2 +- lib/SDL/AudioSpec.pm | 2 +- lib/SDL/CD.pm | 2 +- lib/SDL/CDROM.pm | 2 +- lib/SDL/CDTrack.pm | 2 +- lib/SDL/Color.pm | 2 +- lib/SDL/Config.pm | 2 +- lib/SDL/Constants.pm | 3 +++ lib/SDL/Cursor.pm | 2 +- lib/SDL/Event.pm | 2 +- lib/SDL/Events.pm | 2 +- lib/SDL/GFX.pm | 2 +- lib/SDL/GFX/BlitFunc.pm | 2 +- lib/SDL/GFX/FPSManager.pm | 2 +- lib/SDL/GFX/Framerate.pm | 2 +- lib/SDL/GFX/ImageFilter.pm | 2 +- lib/SDL/GFX/Primitives.pm | 2 +- lib/SDL/GFX/Rotozoom.pm | 2 +- lib/SDL/Image.pm | 2 +- lib/SDL/Internal/Loader.pm | 2 +- lib/SDL/Joystick.pm | 2 +- lib/SDL/Mixer.pm | 2 +- lib/SDL/Mixer/Channels.pm | 2 +- lib/SDL/Mixer/Effects.pm | 2 +- lib/SDL/Mixer/Groups.pm | 2 +- lib/SDL/Mixer/MixChunk.pm | 2 +- lib/SDL/Mixer/MixMusic.pm | 2 +- lib/SDL/Mixer/Music.pm | 2 +- lib/SDL/Mixer/Samples.pm | 2 +- lib/SDL/Mouse.pm | 2 +- lib/SDL/MultiThread.pm | 2 +- lib/SDL/Net.pm | 2 +- lib/SDL/Net/IPaddress.pm | 2 +- lib/SDL/Net/TCP.pm | 2 +- lib/SDL/Net/UDP.pm | 2 +- lib/SDL/Overlay.pm | 2 +- lib/SDL/Palette.pm | 2 +- lib/SDL/Pango.pm | 2 +- lib/SDL/Pango/Context.pm | 2 +- lib/SDL/PixelFormat.pm | 2 +- lib/SDL/RWOps.pm | 2 +- lib/SDL/Rect.pm | 2 +- lib/SDL/SMPEG.pm | 2 +- lib/SDL/SMPEG/Info.pm | 2 +- lib/SDL/Surface.pm | 2 +- lib/SDL/TTF.pm | 2 +- lib/SDL/TTF/Font.pm | 2 +- lib/SDL/TTFont.pm | 2 +- lib/SDL/Time.pm | 2 +- lib/SDL/Tutorial.pm | 2 +- lib/SDL/Tutorial/Animation.pm | 2 +- lib/SDL/Tutorial/LunarLander.pm | 2 +- lib/SDL/Version.pm | 2 +- lib/SDL/Video.pm | 2 +- lib/SDL/VideoInfo.pm | 2 +- lib/SDL_perl.pm | 2 +- lib/SDLx/App.pm | 2 +- lib/SDLx/Controller.pm | 2 +- lib/SDLx/Controller/Interface.pm | 2 +- lib/SDLx/Controller/State.pm | 2 +- lib/SDLx/Controller/Timer.pm | 2 +- lib/SDLx/FPS.pm | 2 +- lib/SDLx/Layer.pm | 2 +- lib/SDLx/LayerManager.pm | 2 +- lib/SDLx/Music.pm | 2 +- lib/SDLx/Music/Data.pm | 2 +- lib/SDLx/Music/Default.pm | 2 +- lib/SDLx/Rect.pm | 3 ++- lib/SDLx/SFont.pm | 2 +- lib/SDLx/Sound.pm | 3 +++ lib/SDLx/Sprite.pm | 2 +- lib/SDLx/Sprite/Animated.pm | 2 +- lib/SDLx/Surface.pm | 2 +- lib/SDLx/Surface/TiedMatrix.pm | 2 +- lib/SDLx/Surface/TiedMatrixRow.pm | 2 +- lib/SDLx/TTF.pm | 2 +- lib/SDLx/Text.pm | 2 +- lib/SDLx/Validate.pm | 2 +- 82 files changed, 88 insertions(+), 80 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 16096309..f5910977 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,7 +2,8 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) -* 2.541_09 +* 2.541_09 Aug 05 2012 + - Updated Alien::SDL's version to 1.437_2 [jtpalmer] - Added $VERSION to all modules [jtpalmer] - Added pod syntax tests [jtpalmer] - t/*: Added strict and warnings where it was missing [jtpalmer] diff --git a/lib/Module/Build/SDL.pm b/lib/Module/Build/SDL.pm index 26634bce..9ce3d66a 100644 --- a/lib/Module/Build/SDL.pm +++ b/lib/Module/Build/SDL.pm @@ -4,7 +4,7 @@ use warnings; use base 'Module::Build'; use vars qw($VERSION); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; __PACKAGE__->add_property(parinput => ''); diff --git a/lib/SDL.pm b/lib/SDL.pm index 13b417fd..824c28f5 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); diff --git a/lib/SDL/Audio.pm b/lib/SDL/Audio.pm index 254501df..ed36888f 100644 --- a/lib/SDL/Audio.pm +++ b/lib/SDL/Audio.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Audio'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/AudioCVT.pm b/lib/SDL/AudioCVT.pm index 86e66f96..abe29995 100644 --- a/lib/SDL/AudioCVT.pm +++ b/lib/SDL/AudioCVT.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Audio'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/AudioSpec.pm b/lib/SDL/AudioSpec.pm index a0941e61..7ff4ebb6 100644 --- a/lib/SDL/AudioSpec.pm +++ b/lib/SDL/AudioSpec.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Audio'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/CD.pm b/lib/SDL/CD.pm index 4b71698f..213d90fd 100644 --- a/lib/SDL/CD.pm +++ b/lib/SDL/CD.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::CDROM'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/CDROM.pm b/lib/SDL/CDROM.pm index 21afa84d..4cecfb37 100644 --- a/lib/SDL/CDROM.pm +++ b/lib/SDL/CDROM.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::CDROM'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/CDTrack.pm b/lib/SDL/CDTrack.pm index e3d76a53..5aa98dae 100644 --- a/lib/SDL/CDTrack.pm +++ b/lib/SDL/CDTrack.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::CDROM'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Color.pm b/lib/SDL/Color.pm index 033099aa..fddf6b41 100644 --- a/lib/SDL/Color.pm +++ b/lib/SDL/Color.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Config.pm b/lib/SDL/Config.pm index 578e15e3..25cd8d4b 100644 --- a/lib/SDL/Config.pm +++ b/lib/SDL/Config.pm @@ -5,7 +5,7 @@ use warnings; use vars qw($VERSION); use SDL::ConfigData; -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; sub has { diff --git a/lib/SDL/Constants.pm b/lib/SDL/Constants.pm index d3b15939..251ebd2a 100644 --- a/lib/SDL/Constants.pm +++ b/lib/SDL/Constants.pm @@ -6,6 +6,9 @@ use warnings; use base 'Exporter'; use Config; +our $VERSION = '2.541_09'; +$VERSION = eval $VERSION; + our @EXPORT_OK = (); our %EXPORT_TAGS = ( 'SDL/defaults' => [ diff --git a/lib/SDL/Cursor.pm b/lib/SDL/Cursor.pm index dc06f767..a53802d5 100644 --- a/lib/SDL/Cursor.pm +++ b/lib/SDL/Cursor.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Event.pm b/lib/SDL/Event.pm index 4bb4a67c..34f7bdde 100644 --- a/lib/SDL/Event.pm +++ b/lib/SDL/Event.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Events'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Events.pm b/lib/SDL/Events.pm index 55eff335..0a8bc6c6 100644 --- a/lib/SDL/Events.pm +++ b/lib/SDL/Events.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Events'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX.pm b/lib/SDL/GFX.pm index d84b7b48..73688949 100644 --- a/lib/SDL/GFX.pm +++ b/lib/SDL/GFX.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX/BlitFunc.pm b/lib/SDL/GFX/BlitFunc.pm index 1315fe24..eb0847c3 100644 --- a/lib/SDL/GFX/BlitFunc.pm +++ b/lib/SDL/GFX/BlitFunc.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX/FPSManager.pm b/lib/SDL/GFX/FPSManager.pm index bf305a87..765e0af1 100644 --- a/lib/SDL/GFX/FPSManager.pm +++ b/lib/SDL/GFX/FPSManager.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX/Framerate.pm b/lib/SDL/GFX/Framerate.pm index 7d436c14..7ebb7062 100644 --- a/lib/SDL/GFX/Framerate.pm +++ b/lib/SDL/GFX/Framerate.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX/ImageFilter.pm b/lib/SDL/GFX/ImageFilter.pm index bcaa1d77..a6839b8a 100644 --- a/lib/SDL/GFX/ImageFilter.pm +++ b/lib/SDL/GFX/ImageFilter.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX/Primitives.pm b/lib/SDL/GFX/Primitives.pm index d58fff9a..6c339787 100644 --- a/lib/SDL/GFX/Primitives.pm +++ b/lib/SDL/GFX/Primitives.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX/Rotozoom.pm b/lib/SDL/GFX/Rotozoom.pm index 00986841..d06db1a8 100644 --- a/lib/SDL/GFX/Rotozoom.pm +++ b/lib/SDL/GFX/Rotozoom.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Image.pm b/lib/SDL/Image.pm index a8d7ce58..dce988c8 100644 --- a/lib/SDL/Image.pm +++ b/lib/SDL/Image.pm @@ -8,7 +8,7 @@ use SDL::Constants ':SDL::Image'; use SDL::Surface; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Internal/Loader.pm b/lib/SDL/Internal/Loader.pm index 4a7ed5b5..2177c710 100644 --- a/lib/SDL/Internal/Loader.pm +++ b/lib/SDL/Internal/Loader.pm @@ -7,7 +7,7 @@ our @ISA = qw(Exporter); our @EXPORT = qw(internal_load_dlls); our @LIBREFS = (); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; use SDL::ConfigData; diff --git a/lib/SDL/Joystick.pm b/lib/SDL/Joystick.pm index 0f1d06d7..c591d8ce 100644 --- a/lib/SDL/Joystick.pm +++ b/lib/SDL/Joystick.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer.pm b/lib/SDL/Mixer.pm index f9308fad..e2070771 100644 --- a/lib/SDL/Mixer.pm +++ b/lib/SDL/Mixer.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/Channels.pm b/lib/SDL/Mixer/Channels.pm index 86317fbb..3bbda1c7 100644 --- a/lib/SDL/Mixer/Channels.pm +++ b/lib/SDL/Mixer/Channels.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/Effects.pm b/lib/SDL/Mixer/Effects.pm index 0a1e0a04..bb2c913e 100644 --- a/lib/SDL/Mixer/Effects.pm +++ b/lib/SDL/Mixer/Effects.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/Groups.pm b/lib/SDL/Mixer/Groups.pm index f7404c48..5dec9d65 100644 --- a/lib/SDL/Mixer/Groups.pm +++ b/lib/SDL/Mixer/Groups.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/MixChunk.pm b/lib/SDL/Mixer/MixChunk.pm index e1bb2e65..084bfec5 100644 --- a/lib/SDL/Mixer/MixChunk.pm +++ b/lib/SDL/Mixer/MixChunk.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/MixMusic.pm b/lib/SDL/Mixer/MixMusic.pm index dbaf641f..47f37c10 100644 --- a/lib/SDL/Mixer/MixMusic.pm +++ b/lib/SDL/Mixer/MixMusic.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/Music.pm b/lib/SDL/Mixer/Music.pm index 6e0690ef..e0003c1d 100644 --- a/lib/SDL/Mixer/Music.pm +++ b/lib/SDL/Mixer/Music.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/Samples.pm b/lib/SDL/Mixer/Samples.pm index a935ad39..e7134732 100644 --- a/lib/SDL/Mixer/Samples.pm +++ b/lib/SDL/Mixer/Samples.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mouse.pm b/lib/SDL/Mouse.pm index c71702f1..ce5dc505 100644 --- a/lib/SDL/Mouse.pm +++ b/lib/SDL/Mouse.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/MultiThread.pm b/lib/SDL/MultiThread.pm index 7113d59a..b53bbd53 100644 --- a/lib/SDL/MultiThread.pm +++ b/lib/SDL/MultiThread.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Net.pm b/lib/SDL/Net.pm index 56f5462b..ab768dde 100644 --- a/lib/SDL/Net.pm +++ b/lib/SDL/Net.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Net'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Net/IPaddress.pm b/lib/SDL/Net/IPaddress.pm index a57e65d6..fdd2bdb8 100644 --- a/lib/SDL/Net/IPaddress.pm +++ b/lib/SDL/Net/IPaddress.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Net/TCP.pm b/lib/SDL/Net/TCP.pm index 7190063f..e40b0cf0 100644 --- a/lib/SDL/Net/TCP.pm +++ b/lib/SDL/Net/TCP.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Net/UDP.pm b/lib/SDL/Net/UDP.pm index 440c137a..3e955aaf 100644 --- a/lib/SDL/Net/UDP.pm +++ b/lib/SDL/Net/UDP.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Overlay.pm b/lib/SDL/Overlay.pm index 656bd3db..904fd701 100644 --- a/lib/SDL/Overlay.pm +++ b/lib/SDL/Overlay.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Palette.pm b/lib/SDL/Palette.pm index dd145991..8cfb9b99 100644 --- a/lib/SDL/Palette.pm +++ b/lib/SDL/Palette.pm @@ -8,7 +8,7 @@ use SDL::Constants ':SDL::Video'; use SDL::Color; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Pango.pm b/lib/SDL/Pango.pm index 49659f7c..cafc779e 100644 --- a/lib/SDL/Pango.pm +++ b/lib/SDL/Pango.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Pango'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Pango/Context.pm b/lib/SDL/Pango/Context.pm index f6055998..b88447f0 100644 --- a/lib/SDL/Pango/Context.pm +++ b/lib/SDL/Pango/Context.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Pango'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/PixelFormat.pm b/lib/SDL/PixelFormat.pm index 2e44276b..cfb0ee4a 100644 --- a/lib/SDL/PixelFormat.pm +++ b/lib/SDL/PixelFormat.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/RWOps.pm b/lib/SDL/RWOps.pm index b070fe5f..cf117654 100644 --- a/lib/SDL/RWOps.pm +++ b/lib/SDL/RWOps.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::RWOps'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Rect.pm b/lib/SDL/Rect.pm index fdf17c02..f3d64e52 100644 --- a/lib/SDL/Rect.pm +++ b/lib/SDL/Rect.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/SMPEG.pm b/lib/SDL/SMPEG.pm index 0d4113be..46fe6293 100644 --- a/lib/SDL/SMPEG.pm +++ b/lib/SDL/SMPEG.pm @@ -11,7 +11,7 @@ use Scalar::Util 'refaddr'; use Data::Dumper; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/SMPEG/Info.pm b/lib/SDL/SMPEG/Info.pm index b7daba93..3da7f619 100644 --- a/lib/SDL/SMPEG/Info.pm +++ b/lib/SDL/SMPEG/Info.pm @@ -39,7 +39,7 @@ our @ISA = qw(Exporter DynaLoader); use SDL::SMPEG; use SDL::Internal::Loader; -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Surface.pm b/lib/SDL/Surface.pm index 4da10cac..0af270d7 100644 --- a/lib/SDL/Surface.pm +++ b/lib/SDL/Surface.pm @@ -8,7 +8,7 @@ use SDL::Constants ':SDL::Video'; use SDL::PixelFormat; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/TTF.pm b/lib/SDL/TTF.pm index 2d84f1a6..f0838d62 100644 --- a/lib/SDL/TTF.pm +++ b/lib/SDL/TTF.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::TTF'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/TTF/Font.pm b/lib/SDL/TTF/Font.pm index 016d69fe..a924341a 100644 --- a/lib/SDL/TTF/Font.pm +++ b/lib/SDL/TTF/Font.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::TTF'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/TTFont.pm b/lib/SDL/TTFont.pm index 2993e549..f46a6f4b 100644 --- a/lib/SDL/TTFont.pm +++ b/lib/SDL/TTFont.pm @@ -40,7 +40,7 @@ use vars qw/ $VERSION @ISA /; @ISA = qw(SDL::Surface); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDL/Time.pm b/lib/SDL/Time.pm index da0f6ec9..2d46866c 100644 --- a/lib/SDL/Time.pm +++ b/lib/SDL/Time.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Tutorial.pm b/lib/SDL/Tutorial.pm index bc62b099..3f6dc4d9 100644 --- a/lib/SDL/Tutorial.pm +++ b/lib/SDL/Tutorial.pm @@ -37,7 +37,7 @@ use vars qw($VERSION); use SDL; use SDLx::App; -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; # change these values as necessary diff --git a/lib/SDL/Tutorial/Animation.pm b/lib/SDL/Tutorial/Animation.pm index a9fb66ca..b47724d4 100644 --- a/lib/SDL/Tutorial/Animation.pm +++ b/lib/SDL/Tutorial/Animation.pm @@ -40,7 +40,7 @@ use SDL::Rect; use SDL::Color; use SDL::Video; -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; # change these values as necessary diff --git a/lib/SDL/Tutorial/LunarLander.pm b/lib/SDL/Tutorial/LunarLander.pm index 78df0450..c99c5ae2 100644 --- a/lib/SDL/Tutorial/LunarLander.pm +++ b/lib/SDL/Tutorial/LunarLander.pm @@ -3,7 +3,7 @@ use strict; use warnings; use vars qw($VERSION); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; sub import { diff --git a/lib/SDL/Version.pm b/lib/SDL/Version.pm index 4ff70bcf..23cd724a 100644 --- a/lib/SDL/Version.pm +++ b/lib/SDL/Version.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Video.pm b/lib/SDL/Video.pm index a8463257..e4ab0e7b 100644 --- a/lib/SDL/Video.pm +++ b/lib/SDL/Video.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/VideoInfo.pm b/lib/SDL/VideoInfo.pm index 15d88712..5e7a4540 100644 --- a/lib/SDL/VideoInfo.pm +++ b/lib/SDL/VideoInfo.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL_perl.pm b/lib/SDL_perl.pm index 83eefe6c..2e5b4f94 100644 --- a/lib/SDL_perl.pm +++ b/lib/SDL_perl.pm @@ -36,7 +36,7 @@ use vars qw($VERSION $XS_VERSION @ISA); our @ISA = qw/ DynaLoader /; -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index aab7e2bf..806e1079 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -4,7 +4,7 @@ use strict; use warnings; use vars qw($VERSION); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; # SDL modules actually used here diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 1a6f764d..2d5f80ef 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -12,7 +12,7 @@ use SDLx::Controller::Interface; use SDLx::Controller::State; use Scalar::Util 'refaddr'; -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; # inside out, so this can work as the superclass of another class diff --git a/lib/SDLx/Controller/Interface.pm b/lib/SDLx/Controller/Interface.pm index 2a0a5bd9..6f5305f6 100644 --- a/lib/SDLx/Controller/Interface.pm +++ b/lib/SDLx/Controller/Interface.pm @@ -7,7 +7,7 @@ use Scalar::Util 'refaddr'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/Controller/State.pm b/lib/SDLx/Controller/State.pm index f60042b6..9edbbae0 100644 --- a/lib/SDLx/Controller/State.pm +++ b/lib/SDLx/Controller/State.pm @@ -5,7 +5,7 @@ use vars qw($VERSION $XS_VERSION @ISA); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/Controller/Timer.pm b/lib/SDLx/Controller/Timer.pm index 41d75b8d..5a02a96e 100644 --- a/lib/SDLx/Controller/Timer.pm +++ b/lib/SDLx/Controller/Timer.pm @@ -7,7 +7,7 @@ use warnings; use vars qw($VERSION @ISA); use SDL; -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/FPS.pm b/lib/SDLx/FPS.pm index 42c1a5aa..d95cba74 100644 --- a/lib/SDLx/FPS.pm +++ b/lib/SDLx/FPS.pm @@ -7,7 +7,7 @@ use SDL::GFX::FPSManager; use Carp; our @ISA = qw(SDL::GFX::FPSManager); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/Layer.pm b/lib/SDLx/Layer.pm index 8fc2eaa8..d64af035 100644 --- a/lib/SDLx/Layer.pm +++ b/lib/SDLx/Layer.pm @@ -9,7 +9,7 @@ use SDL::Events; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/LayerManager.pm b/lib/SDLx/LayerManager.pm index 8fb42e4c..d7722e00 100644 --- a/lib/SDLx/LayerManager.pm +++ b/lib/SDLx/LayerManager.pm @@ -9,7 +9,7 @@ use SDL::Events; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/Music.pm b/lib/SDLx/Music.pm index f6c2e6e1..698261e5 100644 --- a/lib/SDLx/Music.pm +++ b/lib/SDLx/Music.pm @@ -15,7 +15,7 @@ use Data::Dumper; use SDLx::Music::Default; use SDLx::Music::Data; -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; our $def = bless( {}, "SDLx::Music::Default" ); diff --git a/lib/SDLx/Music/Data.pm b/lib/SDLx/Music/Data.pm index 5fc5d625..fa5710fc 100644 --- a/lib/SDLx/Music/Data.pm +++ b/lib/SDLx/Music/Data.pm @@ -4,7 +4,7 @@ use strict; use warnings; use vars qw($VERSION); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; sub volume diff --git a/lib/SDLx/Music/Default.pm b/lib/SDLx/Music/Default.pm index 151f2b03..54dcbe06 100644 --- a/lib/SDLx/Music/Default.pm +++ b/lib/SDLx/Music/Default.pm @@ -3,7 +3,7 @@ use strict; use warnings; use vars qw($VERSION); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; sub ext diff --git a/lib/SDLx/Rect.pm b/lib/SDLx/Rect.pm index facf5414..a4494c45 100644 --- a/lib/SDLx/Rect.pm +++ b/lib/SDLx/Rect.pm @@ -4,7 +4,8 @@ use warnings; use Carp; use base 'SDL::Rect'; -our $VERSION = '0.01'; +our $VERSION = '2.541_09'; +$VERSION = eval $VERSION; sub new { my $class = shift; diff --git a/lib/SDLx/SFont.pm b/lib/SDLx/SFont.pm index f81cd02a..db8a55fe 100644 --- a/lib/SDLx/SFont.pm +++ b/lib/SDLx/SFont.pm @@ -8,7 +8,7 @@ require DynaLoader; use SDL::Constants ':SDL::TTF'; our @ISA = qw(Exporter DynaLoader SDL::Surface); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/Sound.pm b/lib/SDLx/Sound.pm index 7cb2ede1..31c86fb3 100644 --- a/lib/SDLx/Sound.pm +++ b/lib/SDLx/Sound.pm @@ -12,6 +12,9 @@ use SDL::Mixer::Music; #use SDL::Mixer::Samples; #use SDL::Mixer::MixChunk; +our $VERSION = '2.541_09'; +$VERSION = eval $VERSION; + # SDL::Mixer must be inited only one time my $audioInited = undef; diff --git a/lib/SDLx/Sprite.pm b/lib/SDLx/Sprite.pm index 236b9f3e..4ca549ed 100644 --- a/lib/SDLx/Sprite.pm +++ b/lib/SDLx/Sprite.pm @@ -13,7 +13,7 @@ use SDLx::Validate; use Carp (); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/Sprite/Animated.pm b/lib/SDLx/Sprite/Animated.pm index 721ff170..75350018 100644 --- a/lib/SDLx/Sprite/Animated.pm +++ b/lib/SDLx/Sprite/Animated.pm @@ -12,7 +12,7 @@ use SDLx::Validate; use base 'SDLx::Sprite'; -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; # inside out diff --git a/lib/SDLx/Surface.pm b/lib/SDLx/Surface.pm index bc52147f..ab7866a5 100644 --- a/lib/SDLx/Surface.pm +++ b/lib/SDLx/Surface.pm @@ -27,7 +27,7 @@ use overload ( use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader SDL::Surface); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/Surface/TiedMatrix.pm b/lib/SDLx/Surface/TiedMatrix.pm index db2b4574..cef56d29 100644 --- a/lib/SDLx/Surface/TiedMatrix.pm +++ b/lib/SDLx/Surface/TiedMatrix.pm @@ -5,7 +5,7 @@ use vars qw($VERSION); use SDLx::Surface::TiedMatrixRow; use base 'Tie::Array'; -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/Surface/TiedMatrixRow.pm b/lib/SDLx/Surface/TiedMatrixRow.pm index 74e65b21..3bd2cbd9 100644 --- a/lib/SDLx/Surface/TiedMatrixRow.pm +++ b/lib/SDLx/Surface/TiedMatrixRow.pm @@ -4,7 +4,7 @@ use warnings; use vars qw($VERSION); use base 'Tie::Array'; -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/TTF.pm b/lib/SDLx/TTF.pm index 1ab48e81..b0e49fb7 100644 --- a/lib/SDLx/TTF.pm +++ b/lib/SDLx/TTF.pm @@ -8,7 +8,7 @@ use SDL; use SDL::TTF; use SDL::TTF::Font; -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; sub new diff --git a/lib/SDLx/Text.pm b/lib/SDLx/Text.pm index dc2ae811..d85b8705 100644 --- a/lib/SDLx/Text.pm +++ b/lib/SDLx/Text.pm @@ -12,7 +12,7 @@ use List::Util qw(max sum); use Carp (); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/Validate.pm b/lib/SDLx/Validate.pm index 182d7542..c97a0b3c 100644 --- a/lib/SDLx/Validate.pm +++ b/lib/SDLx/Validate.pm @@ -7,7 +7,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_08'; +our $VERSION = '2.541_09'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; From 92db27e6f1c71161a7b63219b1c4d50c1d4200c9 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Wed, 8 Aug 2012 09:36:16 +0200 Subject: [PATCH 121/153] libz is now loaded too if we load libpng Conflicts: CHANGELOG --- Build.PL | 6 +++--- CHANGELOG | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Build.PL b/Build.PL index 65911e23..48953820 100644 --- a/Build.PL +++ b/Build.PL @@ -229,7 +229,7 @@ my %subsystems = ( to => 'lib/SDLx/Layer.xs', }, libraries => [qw( SDL SDL_image )], - load_libs => [qw( png jpeg tiff )], + load_libs => [qw( z png jpeg tiff )], }, AudioSpec => { file => { @@ -392,7 +392,7 @@ my %subsystems = ( to => 'lib/SDL/Image.xs', }, libraries => [qw( SDL SDL_image )], - load_libs => [qw( png jpeg tiff )], + load_libs => [qw( z png jpeg tiff )], }, SFont => { file => { @@ -400,7 +400,7 @@ my %subsystems = ( to => 'lib/SDLx/SFont.xs', }, libraries => [qw( SDL SDL_image )], - load_libs => [qw( png jpeg tiff )], + load_libs => [qw( z png jpeg tiff )], }, # SMPEG => { diff --git a/CHANGELOG b/CHANGELOG index f5910977..34f73a71 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,9 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) +* TBD + - libz is now loaded too if we load libpng [FROGGS] + * 2.541_09 Aug 05 2012 - Updated Alien::SDL's version to 1.437_2 [jtpalmer] - Added $VERSION to all modules [jtpalmer] From aafe2953634af88b6413fa47febe598db36e341a Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Wed, 8 Aug 2012 09:53:16 +0200 Subject: [PATCH 122/153] added libz to libraries hash --- Build.PL | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Build.PL b/Build.PL index 48953820..e93de472 100644 --- a/Build.PL +++ b/Build.PL @@ -531,6 +531,11 @@ my %libraries = ( header => 'SDL_Pango.h', lib => 'SDL_Pango', }, + z => { + define => 'HAVE_Z', + header => 'zlib.h', + lib => 'z', + }, png => { define => 'HAVE_PNG', header => 'png.h', From d6fa8f83b036e34dc8e967561b945d94501d1de2 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Wed, 8 Aug 2012 20:49:24 -0400 Subject: [PATCH 123/153] Fix handler removal It's necessary to empty the referenced array because other references to the array may exist. Replacing the referenced array with an empty array doesn't change the other references (e.g. those used in the run method). --- lib/SDLx/Controller.pm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 2d5f80ef..350460bc 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -275,15 +275,15 @@ sub remove_all_handlers { } sub remove_all_move_handlers { - $_move_handlers{ refaddr $_[0] } = []; + @{ $_move_handlers{ refaddr $_[0] } } = (); } sub remove_all_event_handlers { - $_event_handlers{ refaddr $_[0] } = []; + @{ $_event_handlers{ refaddr $_[0] } } = (); } sub remove_all_show_handlers { - $_show_handlers{ refaddr $_[0] } = []; + @{ $_show_handlers{ refaddr $_[0] } } = (); } sub move_handlers { $_move_handlers{ refaddr $_[0] } } From cc18a946c5c109ddaaf75f2e30b506695a7da1c6 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sun, 12 Aug 2012 20:24:01 -0400 Subject: [PATCH 124/153] Release 2.541_10 Conflicts: Build.PL --- Build.PL | 4 ++-- CHANGELOG | 3 ++- lib/Module/Build/SDL.pm | 2 +- lib/SDL.pm | 2 +- lib/SDL/Audio.pm | 2 +- lib/SDL/AudioCVT.pm | 2 +- lib/SDL/AudioSpec.pm | 2 +- lib/SDL/CD.pm | 2 +- lib/SDL/CDROM.pm | 2 +- lib/SDL/CDTrack.pm | 2 +- lib/SDL/Color.pm | 2 +- lib/SDL/Config.pm | 2 +- lib/SDL/Constants.pm | 2 +- lib/SDL/Cursor.pm | 2 +- lib/SDL/Event.pm | 2 +- lib/SDL/Events.pm | 2 +- lib/SDL/GFX.pm | 2 +- lib/SDL/GFX/BlitFunc.pm | 2 +- lib/SDL/GFX/FPSManager.pm | 2 +- lib/SDL/GFX/Framerate.pm | 2 +- lib/SDL/GFX/ImageFilter.pm | 2 +- lib/SDL/GFX/Primitives.pm | 2 +- lib/SDL/GFX/Rotozoom.pm | 2 +- lib/SDL/Image.pm | 2 +- lib/SDL/Internal/Loader.pm | 2 +- lib/SDL/Joystick.pm | 2 +- lib/SDL/Mixer.pm | 2 +- lib/SDL/Mixer/Channels.pm | 2 +- lib/SDL/Mixer/Effects.pm | 2 +- lib/SDL/Mixer/Groups.pm | 2 +- lib/SDL/Mixer/MixChunk.pm | 2 +- lib/SDL/Mixer/MixMusic.pm | 2 +- lib/SDL/Mixer/Music.pm | 2 +- lib/SDL/Mixer/Samples.pm | 2 +- lib/SDL/Mouse.pm | 2 +- lib/SDL/MultiThread.pm | 2 +- lib/SDL/Net.pm | 2 +- lib/SDL/Net/IPaddress.pm | 2 +- lib/SDL/Net/TCP.pm | 2 +- lib/SDL/Net/UDP.pm | 2 +- lib/SDL/Overlay.pm | 2 +- lib/SDL/Palette.pm | 2 +- lib/SDL/Pango.pm | 2 +- lib/SDL/Pango/Context.pm | 2 +- lib/SDL/PixelFormat.pm | 2 +- lib/SDL/RWOps.pm | 2 +- lib/SDL/Rect.pm | 2 +- lib/SDL/SMPEG.pm | 2 +- lib/SDL/SMPEG/Info.pm | 2 +- lib/SDL/Surface.pm | 2 +- lib/SDL/TTF.pm | 2 +- lib/SDL/TTF/Font.pm | 2 +- lib/SDL/TTFont.pm | 2 +- lib/SDL/Time.pm | 2 +- lib/SDL/Tutorial.pm | 2 +- lib/SDL/Tutorial/Animation.pm | 2 +- lib/SDL/Tutorial/LunarLander.pm | 2 +- lib/SDL/Version.pm | 2 +- lib/SDL/Video.pm | 2 +- lib/SDL/VideoInfo.pm | 2 +- lib/SDL_perl.pm | 2 +- lib/SDLx/App.pm | 2 +- lib/SDLx/Controller.pm | 2 +- lib/SDLx/Controller/Interface.pm | 2 +- lib/SDLx/Controller/State.pm | 2 +- lib/SDLx/Controller/Timer.pm | 2 +- lib/SDLx/FPS.pm | 2 +- lib/SDLx/Layer.pm | 2 +- lib/SDLx/LayerManager.pm | 2 +- lib/SDLx/Music.pm | 2 +- lib/SDLx/Music/Data.pm | 2 +- lib/SDLx/Music/Default.pm | 2 +- lib/SDLx/Rect.pm | 2 +- lib/SDLx/SFont.pm | 2 +- lib/SDLx/Sound.pm | 2 +- lib/SDLx/Sprite.pm | 2 +- lib/SDLx/Sprite/Animated.pm | 2 +- lib/SDLx/Surface.pm | 2 +- lib/SDLx/Surface/TiedMatrix.pm | 2 +- lib/SDLx/Surface/TiedMatrixRow.pm | 2 +- lib/SDLx/TTF.pm | 2 +- lib/SDLx/Text.pm | 2 +- lib/SDLx/Validate.pm | 2 +- 83 files changed, 85 insertions(+), 84 deletions(-) diff --git a/Build.PL b/Build.PL index e93de472..9df26927 100644 --- a/Build.PL +++ b/Build.PL @@ -594,7 +594,7 @@ my $build = $package->new( configure_requires => { 'Module::Build' => '0', 'ExtUtils::CBuilder' => '0.260301', - 'Alien::SDL' => '1.437_2', + 'Alien::SDL' => '1.438', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', @@ -604,7 +604,7 @@ my $build = $package->new( 'Test::Simple' => '0.88', 'Capture::Tiny' => '0', 'Test::Most' => '0.21', - 'Alien::SDL' => '1.437_2', + 'Alien::SDL' => '1.438', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', diff --git a/CHANGELOG b/CHANGELOG index 34f73a71..9a25b2cd 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,7 +2,8 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) -* TBD +* 2.541_10 Aug 12 2012 + - Updated Alien::SDL's version to 1.438 [jtpalmer] - libz is now loaded too if we load libpng [FROGGS] * 2.541_09 Aug 05 2012 diff --git a/lib/Module/Build/SDL.pm b/lib/Module/Build/SDL.pm index 9ce3d66a..31e4979a 100644 --- a/lib/Module/Build/SDL.pm +++ b/lib/Module/Build/SDL.pm @@ -4,7 +4,7 @@ use warnings; use base 'Module::Build'; use vars qw($VERSION); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; __PACKAGE__->add_property(parinput => ''); diff --git a/lib/SDL.pm b/lib/SDL.pm index 824c28f5..0a2f112e 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); diff --git a/lib/SDL/Audio.pm b/lib/SDL/Audio.pm index ed36888f..9079efda 100644 --- a/lib/SDL/Audio.pm +++ b/lib/SDL/Audio.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Audio'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/AudioCVT.pm b/lib/SDL/AudioCVT.pm index abe29995..0633eeb6 100644 --- a/lib/SDL/AudioCVT.pm +++ b/lib/SDL/AudioCVT.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Audio'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/AudioSpec.pm b/lib/SDL/AudioSpec.pm index 7ff4ebb6..f32a3447 100644 --- a/lib/SDL/AudioSpec.pm +++ b/lib/SDL/AudioSpec.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Audio'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/CD.pm b/lib/SDL/CD.pm index 213d90fd..ff0ace1b 100644 --- a/lib/SDL/CD.pm +++ b/lib/SDL/CD.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::CDROM'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/CDROM.pm b/lib/SDL/CDROM.pm index 4cecfb37..5f76a6d2 100644 --- a/lib/SDL/CDROM.pm +++ b/lib/SDL/CDROM.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::CDROM'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/CDTrack.pm b/lib/SDL/CDTrack.pm index 5aa98dae..1ac4e9c7 100644 --- a/lib/SDL/CDTrack.pm +++ b/lib/SDL/CDTrack.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::CDROM'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Color.pm b/lib/SDL/Color.pm index fddf6b41..c24d3b42 100644 --- a/lib/SDL/Color.pm +++ b/lib/SDL/Color.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Config.pm b/lib/SDL/Config.pm index 25cd8d4b..ea6a1520 100644 --- a/lib/SDL/Config.pm +++ b/lib/SDL/Config.pm @@ -5,7 +5,7 @@ use warnings; use vars qw($VERSION); use SDL::ConfigData; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub has { diff --git a/lib/SDL/Constants.pm b/lib/SDL/Constants.pm index 251ebd2a..97204d60 100644 --- a/lib/SDL/Constants.pm +++ b/lib/SDL/Constants.pm @@ -6,7 +6,7 @@ use warnings; use base 'Exporter'; use Config; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; our @EXPORT_OK = (); diff --git a/lib/SDL/Cursor.pm b/lib/SDL/Cursor.pm index a53802d5..cf6afbf0 100644 --- a/lib/SDL/Cursor.pm +++ b/lib/SDL/Cursor.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Event.pm b/lib/SDL/Event.pm index 34f7bdde..b48c5b81 100644 --- a/lib/SDL/Event.pm +++ b/lib/SDL/Event.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Events'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Events.pm b/lib/SDL/Events.pm index 0a8bc6c6..a0be7b02 100644 --- a/lib/SDL/Events.pm +++ b/lib/SDL/Events.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Events'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX.pm b/lib/SDL/GFX.pm index 73688949..e8c4061d 100644 --- a/lib/SDL/GFX.pm +++ b/lib/SDL/GFX.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX/BlitFunc.pm b/lib/SDL/GFX/BlitFunc.pm index eb0847c3..1dc2ab9b 100644 --- a/lib/SDL/GFX/BlitFunc.pm +++ b/lib/SDL/GFX/BlitFunc.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX/FPSManager.pm b/lib/SDL/GFX/FPSManager.pm index 765e0af1..877a3200 100644 --- a/lib/SDL/GFX/FPSManager.pm +++ b/lib/SDL/GFX/FPSManager.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX/Framerate.pm b/lib/SDL/GFX/Framerate.pm index 7ebb7062..3d3aa95b 100644 --- a/lib/SDL/GFX/Framerate.pm +++ b/lib/SDL/GFX/Framerate.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX/ImageFilter.pm b/lib/SDL/GFX/ImageFilter.pm index a6839b8a..d901cc2f 100644 --- a/lib/SDL/GFX/ImageFilter.pm +++ b/lib/SDL/GFX/ImageFilter.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX/Primitives.pm b/lib/SDL/GFX/Primitives.pm index 6c339787..f3d45d5d 100644 --- a/lib/SDL/GFX/Primitives.pm +++ b/lib/SDL/GFX/Primitives.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/GFX/Rotozoom.pm b/lib/SDL/GFX/Rotozoom.pm index d06db1a8..f62b76aa 100644 --- a/lib/SDL/GFX/Rotozoom.pm +++ b/lib/SDL/GFX/Rotozoom.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Image.pm b/lib/SDL/Image.pm index dce988c8..6d10be41 100644 --- a/lib/SDL/Image.pm +++ b/lib/SDL/Image.pm @@ -8,7 +8,7 @@ use SDL::Constants ':SDL::Image'; use SDL::Surface; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Internal/Loader.pm b/lib/SDL/Internal/Loader.pm index 2177c710..ae62acfe 100644 --- a/lib/SDL/Internal/Loader.pm +++ b/lib/SDL/Internal/Loader.pm @@ -7,7 +7,7 @@ our @ISA = qw(Exporter); our @EXPORT = qw(internal_load_dlls); our @LIBREFS = (); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; use SDL::ConfigData; diff --git a/lib/SDL/Joystick.pm b/lib/SDL/Joystick.pm index c591d8ce..8a44fac5 100644 --- a/lib/SDL/Joystick.pm +++ b/lib/SDL/Joystick.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer.pm b/lib/SDL/Mixer.pm index e2070771..f17952da 100644 --- a/lib/SDL/Mixer.pm +++ b/lib/SDL/Mixer.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/Channels.pm b/lib/SDL/Mixer/Channels.pm index 3bbda1c7..8d91b45c 100644 --- a/lib/SDL/Mixer/Channels.pm +++ b/lib/SDL/Mixer/Channels.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/Effects.pm b/lib/SDL/Mixer/Effects.pm index bb2c913e..de17f918 100644 --- a/lib/SDL/Mixer/Effects.pm +++ b/lib/SDL/Mixer/Effects.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/Groups.pm b/lib/SDL/Mixer/Groups.pm index 5dec9d65..900232c3 100644 --- a/lib/SDL/Mixer/Groups.pm +++ b/lib/SDL/Mixer/Groups.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/MixChunk.pm b/lib/SDL/Mixer/MixChunk.pm index 084bfec5..d9dacf76 100644 --- a/lib/SDL/Mixer/MixChunk.pm +++ b/lib/SDL/Mixer/MixChunk.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/MixMusic.pm b/lib/SDL/Mixer/MixMusic.pm index 47f37c10..400a0e68 100644 --- a/lib/SDL/Mixer/MixMusic.pm +++ b/lib/SDL/Mixer/MixMusic.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/Music.pm b/lib/SDL/Mixer/Music.pm index e0003c1d..dddac606 100644 --- a/lib/SDL/Mixer/Music.pm +++ b/lib/SDL/Mixer/Music.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mixer/Samples.pm b/lib/SDL/Mixer/Samples.pm index e7134732..206531f0 100644 --- a/lib/SDL/Mixer/Samples.pm +++ b/lib/SDL/Mixer/Samples.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Mouse.pm b/lib/SDL/Mouse.pm index ce5dc505..84a6cf67 100644 --- a/lib/SDL/Mouse.pm +++ b/lib/SDL/Mouse.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/MultiThread.pm b/lib/SDL/MultiThread.pm index b53bbd53..99d214a7 100644 --- a/lib/SDL/MultiThread.pm +++ b/lib/SDL/MultiThread.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Net.pm b/lib/SDL/Net.pm index ab768dde..8dd58773 100644 --- a/lib/SDL/Net.pm +++ b/lib/SDL/Net.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Net'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Net/IPaddress.pm b/lib/SDL/Net/IPaddress.pm index fdd2bdb8..a4e20302 100644 --- a/lib/SDL/Net/IPaddress.pm +++ b/lib/SDL/Net/IPaddress.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Net/TCP.pm b/lib/SDL/Net/TCP.pm index e40b0cf0..b45d1d02 100644 --- a/lib/SDL/Net/TCP.pm +++ b/lib/SDL/Net/TCP.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Net/UDP.pm b/lib/SDL/Net/UDP.pm index 3e955aaf..91120df9 100644 --- a/lib/SDL/Net/UDP.pm +++ b/lib/SDL/Net/UDP.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Overlay.pm b/lib/SDL/Overlay.pm index 904fd701..093667ce 100644 --- a/lib/SDL/Overlay.pm +++ b/lib/SDL/Overlay.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Palette.pm b/lib/SDL/Palette.pm index 8cfb9b99..9de930ad 100644 --- a/lib/SDL/Palette.pm +++ b/lib/SDL/Palette.pm @@ -8,7 +8,7 @@ use SDL::Constants ':SDL::Video'; use SDL::Color; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Pango.pm b/lib/SDL/Pango.pm index cafc779e..c8b92cb5 100644 --- a/lib/SDL/Pango.pm +++ b/lib/SDL/Pango.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Pango'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Pango/Context.pm b/lib/SDL/Pango/Context.pm index b88447f0..d6aa41dd 100644 --- a/lib/SDL/Pango/Context.pm +++ b/lib/SDL/Pango/Context.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Pango'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/PixelFormat.pm b/lib/SDL/PixelFormat.pm index cfb0ee4a..c5e9bdb7 100644 --- a/lib/SDL/PixelFormat.pm +++ b/lib/SDL/PixelFormat.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/RWOps.pm b/lib/SDL/RWOps.pm index cf117654..906496a8 100644 --- a/lib/SDL/RWOps.pm +++ b/lib/SDL/RWOps.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::RWOps'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Rect.pm b/lib/SDL/Rect.pm index f3d64e52..b07b568d 100644 --- a/lib/SDL/Rect.pm +++ b/lib/SDL/Rect.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/SMPEG.pm b/lib/SDL/SMPEG.pm index 46fe6293..71577422 100644 --- a/lib/SDL/SMPEG.pm +++ b/lib/SDL/SMPEG.pm @@ -11,7 +11,7 @@ use Scalar::Util 'refaddr'; use Data::Dumper; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/SMPEG/Info.pm b/lib/SDL/SMPEG/Info.pm index 3da7f619..b714055b 100644 --- a/lib/SDL/SMPEG/Info.pm +++ b/lib/SDL/SMPEG/Info.pm @@ -39,7 +39,7 @@ our @ISA = qw(Exporter DynaLoader); use SDL::SMPEG; use SDL::Internal::Loader; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Surface.pm b/lib/SDL/Surface.pm index 0af270d7..3b2f29ef 100644 --- a/lib/SDL/Surface.pm +++ b/lib/SDL/Surface.pm @@ -8,7 +8,7 @@ use SDL::Constants ':SDL::Video'; use SDL::PixelFormat; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/TTF.pm b/lib/SDL/TTF.pm index f0838d62..42b094c3 100644 --- a/lib/SDL/TTF.pm +++ b/lib/SDL/TTF.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::TTF'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/TTF/Font.pm b/lib/SDL/TTF/Font.pm index a924341a..212d2fc5 100644 --- a/lib/SDL/TTF/Font.pm +++ b/lib/SDL/TTF/Font.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::TTF'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/TTFont.pm b/lib/SDL/TTFont.pm index f46a6f4b..fca67ec4 100644 --- a/lib/SDL/TTFont.pm +++ b/lib/SDL/TTFont.pm @@ -40,7 +40,7 @@ use vars qw/ $VERSION @ISA /; @ISA = qw(SDL::Surface); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDL/Time.pm b/lib/SDL/Time.pm index 2d46866c..e6927b74 100644 --- a/lib/SDL/Time.pm +++ b/lib/SDL/Time.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Tutorial.pm b/lib/SDL/Tutorial.pm index 3f6dc4d9..f41f7b78 100644 --- a/lib/SDL/Tutorial.pm +++ b/lib/SDL/Tutorial.pm @@ -37,7 +37,7 @@ use vars qw($VERSION); use SDL; use SDLx::App; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; # change these values as necessary diff --git a/lib/SDL/Tutorial/Animation.pm b/lib/SDL/Tutorial/Animation.pm index b47724d4..acd868a9 100644 --- a/lib/SDL/Tutorial/Animation.pm +++ b/lib/SDL/Tutorial/Animation.pm @@ -40,7 +40,7 @@ use SDL::Rect; use SDL::Color; use SDL::Video; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; # change these values as necessary diff --git a/lib/SDL/Tutorial/LunarLander.pm b/lib/SDL/Tutorial/LunarLander.pm index c99c5ae2..a22af763 100644 --- a/lib/SDL/Tutorial/LunarLander.pm +++ b/lib/SDL/Tutorial/LunarLander.pm @@ -3,7 +3,7 @@ use strict; use warnings; use vars qw($VERSION); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub import { diff --git a/lib/SDL/Version.pm b/lib/SDL/Version.pm index 23cd724a..766d968a 100644 --- a/lib/SDL/Version.pm +++ b/lib/SDL/Version.pm @@ -6,7 +6,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/Video.pm b/lib/SDL/Video.pm index e4ab0e7b..30c69211 100644 --- a/lib/SDL/Video.pm +++ b/lib/SDL/Video.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL/VideoInfo.pm b/lib/SDL/VideoInfo.pm index 5e7a4540..0ddc3485 100644 --- a/lib/SDL/VideoInfo.pm +++ b/lib/SDL/VideoInfo.pm @@ -7,7 +7,7 @@ require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDL_perl.pm b/lib/SDL_perl.pm index 2e5b4f94..1ea1b443 100644 --- a/lib/SDL_perl.pm +++ b/lib/SDL_perl.pm @@ -36,7 +36,7 @@ use vars qw($VERSION $XS_VERSION @ISA); our @ISA = qw/ DynaLoader /; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 806e1079..d31de312 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -4,7 +4,7 @@ use strict; use warnings; use vars qw($VERSION); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; # SDL modules actually used here diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 350460bc..6acf7b96 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -12,7 +12,7 @@ use SDLx::Controller::Interface; use SDLx::Controller::State; use Scalar::Util 'refaddr'; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; # inside out, so this can work as the superclass of another class diff --git a/lib/SDLx/Controller/Interface.pm b/lib/SDLx/Controller/Interface.pm index 6f5305f6..2a38dd28 100644 --- a/lib/SDLx/Controller/Interface.pm +++ b/lib/SDLx/Controller/Interface.pm @@ -7,7 +7,7 @@ use Scalar::Util 'refaddr'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/Controller/State.pm b/lib/SDLx/Controller/State.pm index 9edbbae0..2a6df6e0 100644 --- a/lib/SDLx/Controller/State.pm +++ b/lib/SDLx/Controller/State.pm @@ -5,7 +5,7 @@ use vars qw($VERSION $XS_VERSION @ISA); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/Controller/Timer.pm b/lib/SDLx/Controller/Timer.pm index 5a02a96e..5918691c 100644 --- a/lib/SDLx/Controller/Timer.pm +++ b/lib/SDLx/Controller/Timer.pm @@ -7,7 +7,7 @@ use warnings; use vars qw($VERSION @ISA); use SDL; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/FPS.pm b/lib/SDLx/FPS.pm index d95cba74..46078c92 100644 --- a/lib/SDLx/FPS.pm +++ b/lib/SDLx/FPS.pm @@ -7,7 +7,7 @@ use SDL::GFX::FPSManager; use Carp; our @ISA = qw(SDL::GFX::FPSManager); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/Layer.pm b/lib/SDLx/Layer.pm index d64af035..e39cf015 100644 --- a/lib/SDLx/Layer.pm +++ b/lib/SDLx/Layer.pm @@ -9,7 +9,7 @@ use SDL::Events; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/LayerManager.pm b/lib/SDLx/LayerManager.pm index d7722e00..f7f5a3e4 100644 --- a/lib/SDLx/LayerManager.pm +++ b/lib/SDLx/LayerManager.pm @@ -9,7 +9,7 @@ use SDL::Events; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/Music.pm b/lib/SDLx/Music.pm index 698261e5..d52c963e 100644 --- a/lib/SDLx/Music.pm +++ b/lib/SDLx/Music.pm @@ -15,7 +15,7 @@ use Data::Dumper; use SDLx::Music::Default; use SDLx::Music::Data; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; our $def = bless( {}, "SDLx::Music::Default" ); diff --git a/lib/SDLx/Music/Data.pm b/lib/SDLx/Music/Data.pm index fa5710fc..45de43cb 100644 --- a/lib/SDLx/Music/Data.pm +++ b/lib/SDLx/Music/Data.pm @@ -4,7 +4,7 @@ use strict; use warnings; use vars qw($VERSION); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub volume diff --git a/lib/SDLx/Music/Default.pm b/lib/SDLx/Music/Default.pm index 54dcbe06..c3fe9486 100644 --- a/lib/SDLx/Music/Default.pm +++ b/lib/SDLx/Music/Default.pm @@ -3,7 +3,7 @@ use strict; use warnings; use vars qw($VERSION); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub ext diff --git a/lib/SDLx/Rect.pm b/lib/SDLx/Rect.pm index a4494c45..f1b2a0c3 100644 --- a/lib/SDLx/Rect.pm +++ b/lib/SDLx/Rect.pm @@ -4,7 +4,7 @@ use warnings; use Carp; use base 'SDL::Rect'; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/SFont.pm b/lib/SDLx/SFont.pm index db8a55fe..61e4f7ba 100644 --- a/lib/SDLx/SFont.pm +++ b/lib/SDLx/SFont.pm @@ -8,7 +8,7 @@ require DynaLoader; use SDL::Constants ':SDL::TTF'; our @ISA = qw(Exporter DynaLoader SDL::Surface); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/Sound.pm b/lib/SDLx/Sound.pm index 31c86fb3..46ea844c 100644 --- a/lib/SDLx/Sound.pm +++ b/lib/SDLx/Sound.pm @@ -12,7 +12,7 @@ use SDL::Mixer::Music; #use SDL::Mixer::Samples; #use SDL::Mixer::MixChunk; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; # SDL::Mixer must be inited only one time diff --git a/lib/SDLx/Sprite.pm b/lib/SDLx/Sprite.pm index 4ca549ed..898309fb 100644 --- a/lib/SDLx/Sprite.pm +++ b/lib/SDLx/Sprite.pm @@ -13,7 +13,7 @@ use SDLx::Validate; use Carp (); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/Sprite/Animated.pm b/lib/SDLx/Sprite/Animated.pm index 75350018..66aa8dab 100644 --- a/lib/SDLx/Sprite/Animated.pm +++ b/lib/SDLx/Sprite/Animated.pm @@ -12,7 +12,7 @@ use SDLx::Validate; use base 'SDLx::Sprite'; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; # inside out diff --git a/lib/SDLx/Surface.pm b/lib/SDLx/Surface.pm index ab7866a5..fc3bc3a7 100644 --- a/lib/SDLx/Surface.pm +++ b/lib/SDLx/Surface.pm @@ -27,7 +27,7 @@ use overload ( use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader SDL::Surface); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/lib/SDLx/Surface/TiedMatrix.pm b/lib/SDLx/Surface/TiedMatrix.pm index cef56d29..de9e7932 100644 --- a/lib/SDLx/Surface/TiedMatrix.pm +++ b/lib/SDLx/Surface/TiedMatrix.pm @@ -5,7 +5,7 @@ use vars qw($VERSION); use SDLx::Surface::TiedMatrixRow; use base 'Tie::Array'; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/Surface/TiedMatrixRow.pm b/lib/SDLx/Surface/TiedMatrixRow.pm index 3bd2cbd9..6ea45bce 100644 --- a/lib/SDLx/Surface/TiedMatrixRow.pm +++ b/lib/SDLx/Surface/TiedMatrixRow.pm @@ -4,7 +4,7 @@ use warnings; use vars qw($VERSION); use base 'Tie::Array'; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/TTF.pm b/lib/SDLx/TTF.pm index b0e49fb7..0f0ba75d 100644 --- a/lib/SDLx/TTF.pm +++ b/lib/SDLx/TTF.pm @@ -8,7 +8,7 @@ use SDL; use SDL::TTF; use SDL::TTF::Font; -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub new diff --git a/lib/SDLx/Text.pm b/lib/SDLx/Text.pm index d85b8705..3bc7e159 100644 --- a/lib/SDLx/Text.pm +++ b/lib/SDLx/Text.pm @@ -12,7 +12,7 @@ use List::Util qw(max sum); use Carp (); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; $VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/Validate.pm b/lib/SDLx/Validate.pm index c97a0b3c..a016ce06 100644 --- a/lib/SDLx/Validate.pm +++ b/lib/SDLx/Validate.pm @@ -7,7 +7,7 @@ require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_09'; +our $VERSION = '2.541_10'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; From b590b94e8290c04c52134317322a132ebc65c11b Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Sun, 23 Sep 2012 21:10:08 +0200 Subject: [PATCH 125/153] pdl image to surface example --- examples/cookbook/pdl2surface.pl | 50 ++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 examples/cookbook/pdl2surface.pl diff --git a/examples/cookbook/pdl2surface.pl b/examples/cookbook/pdl2surface.pl new file mode 100644 index 00000000..13e56df4 --- /dev/null +++ b/examples/cookbook/pdl2surface.pl @@ -0,0 +1,50 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use SDL; +use SDL::Surface; +use SDLx::App; +use SDLx::Surface; +use PDL; +use Data::Dumper; + +my $app = SDLx::App->new( + title => "PDL and SDL aplication", + width => 640, height => 640, eoq => 1 +); + +sub make_surface_piddle { + my $piddle = rpic('SDL/test/data/picture.jpg'); + my ($bytes_per_pixel,$width,$height) = $piddle->dims; + + my $surface = SDLx::Surface->new( width => $width, height => $height, depth => 32 ); + + SDL::Video::lock_surface($surface); + + my @pix = $piddle->list; + my $y = $height; + my $x = 0; + while( my @p = splice( @pix, 0, 3 ) ) { + unless( $x % $width ) { + $x = 0; + $y--; + } + $surface->set_pixel( $y, $x++, \@p ); + } + + SDL::Video::unlock_surface($surface); + + warn "Made surface of $width, $height and ". $surface->format->BytesPerPixel; + + return ( $piddle, $surface ); +} + +my ( $piddle, $surface ) = make_surface_piddle(); + +$app->add_show_handler( sub { + $surface->blit( $app, [0,0,$surface->w,$surface->h], [10,10,0,0] ); + $app->update(); +} ); + +$app->run(); From c30199096375bd4ffe88c982dfa7ad55ce7769b9 Mon Sep 17 00:00:00 2001 From: Kartik Thakore Date: Sun, 23 Sep 2012 18:16:19 -0400 Subject: [PATCH 126/153] Changed location so that can run pdl2surface.pl for root directory. --- examples/cookbook/pdl2surface.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cookbook/pdl2surface.pl b/examples/cookbook/pdl2surface.pl index 13e56df4..1e18b513 100644 --- a/examples/cookbook/pdl2surface.pl +++ b/examples/cookbook/pdl2surface.pl @@ -15,7 +15,7 @@ ); sub make_surface_piddle { - my $piddle = rpic('SDL/test/data/picture.jpg'); + my $piddle = rpic('test/data/picture.jpg'); my ($bytes_per_pixel,$width,$height) = $piddle->dims; my $surface = SDLx::Surface->new( width => $width, height => $height, depth => 32 ); From a1dde59057f026c71b1e724ce648d050d0961396 Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Palmer" Date: Sun, 14 Oct 2012 13:20:20 -0400 Subject: [PATCH 127/153] Fix SDLx::Surface draw_ellipse docs --- CHANGELOG | 3 +++ lib/pods/SDLx/Surface.pod | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 9a25b2cd..a4cfdad1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,9 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) +* + - Fixed SDLx::Surface->draw_ellipse docs [jtpalmer] + * 2.541_10 Aug 12 2012 - Updated Alien::SDL's version to 1.438 [jtpalmer] - libz is now loaded too if we load libpng [FROGGS] diff --git a/lib/pods/SDLx/Surface.pod b/lib/pods/SDLx/Surface.pod index ac9f7716..49fb1ea2 100644 --- a/lib/pods/SDLx/Surface.pod +++ b/lib/pods/SDLx/Surface.pod @@ -236,7 +236,6 @@ Returns $self Draws an unfilled ellipse centered at C<($x,$y)> with horizontal radius $rx, vertical radius $ry and $color. -Antialias is turned on if $antialias is true. Returns $self From fc6c4a0319d059c14bd10847e0b04ddc3265d210 Mon Sep 17 00:00:00 2001 From: Blaise Roth Date: Wed, 17 Apr 2013 13:26:14 +0930 Subject: [PATCH 128/153] My/Builder/Darwin fixed rel2abs being not found Conflicts: inc/My/Builder/Darwin.pm --- inc/My/Builder/Darwin.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/My/Builder/Darwin.pm b/inc/My/Builder/Darwin.pm index 964f10e8..918cdd23 100644 --- a/inc/My/Builder/Darwin.pm +++ b/inc/My/Builder/Darwin.pm @@ -9,6 +9,7 @@ use Data::Dumper; use Cwd; use Config; use File::Copy; +use File::Spec use base 'My::Builder'; sub special_build_settings { @@ -111,8 +112,7 @@ sub _find_file { #hide warning "Can't opendir(...): Permission denied - fix for http://rt.cpan.org/Public/Bug/Display.html?id=57232 no warnings; find( - { - wanted => sub { push @files, rel2abs($_) if /$re/ }, + { wanted => sub { push @files, File::Spec->rel2abs($_) if /$re/ }, follow => 1, no_chdir => 1, follow_skip => 2 From 288494822bb5542d39da9c20d229ce3b6656ed14 Mon Sep 17 00:00:00 2001 From: Blaise Roth Date: Wed, 17 Apr 2013 13:29:13 +0930 Subject: [PATCH 129/153] Update CHANGELOG --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index a4cfdad1..ee8b3db0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) * + - Fixed rel2abs being not found in My/Builder/Darwin [Blaizer] - Fixed SDLx::Surface->draw_ellipse docs [jtpalmer] * 2.541_10 Aug 12 2012 From a5f6900fb76e2650dec9a8dc8dd99be7eef1c5ac Mon Sep 17 00:00:00 2001 From: Kartik Thakore Date: Fri, 6 Sep 2013 15:48:16 -0400 Subject: [PATCH 130/153] Adding user event type to the push events for ia64 and hpux archs that don't pump the pushed event. --- t/sdlx_controller_interface.t | 2 ++ 1 file changed, 2 insertions(+) diff --git a/t/sdlx_controller_interface.t b/t/sdlx_controller_interface.t index 307830fc..7f91a9e8 100644 --- a/t/sdlx_controller_interface.t +++ b/t/sdlx_controller_interface.t @@ -3,6 +3,7 @@ use warnings; use Test::More; use SDL; use SDLx::App; +use SDL::Events; use SDLx::Controller; use SDLx::Controller::State; use SDLx::Controller::Interface; @@ -79,6 +80,7 @@ my $event_called = 0; require SDL::Event; require SDL::Events; my $eve = SDL::Event->new(); + $eve->type(SDL_USEREVENT); SDL::Events::push_event($eve); my $counts = [ 0, 0, 0 ]; From 9be75b3f4724f8577d5a13293529ecf71a7812dd Mon Sep 17 00:00:00 2001 From: Brian Cassidy Date: Wed, 17 Apr 2013 10:08:32 -0300 Subject: [PATCH 131/153] New version of GPL text (Closes #245) Conflicts: COPYING --- COPYING | 608 ++++++++++++++++++++++++-------------------------------- 1 file changed, 255 insertions(+), 353 deletions(-) diff --git a/COPYING b/COPYING index 643ab665..d159169d 100644 --- a/COPYING +++ b/COPYING @@ -1,25 +1,22 @@ - GNU LIBRARY GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the library GPL. It is - numbered 2 because it goes with version 2 of the ordinary GPL.] - Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Library General Public License, applies to some -specially designated Free Software Foundation software, and to any -other libraries whose authors decide to use it. You can use it for -your libraries, too. +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you @@ -30,347 +27,195 @@ in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if -you distribute copies of the library, or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link a program with the library, you must provide -complete object files to the recipients so that they can relink them -with the library, after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - Our method of protecting your rights has two steps: (1) copyright -the library, and (2) offer you this license which gives you legal -permission to copy, distribute and/or modify the library. - - Also, for each distributor's protection, we want to make certain +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free -library. If the library is modified by someone else and passed on, we -want its recipients to know that what they have is not the original -version, so that any problems introduced by others will not reflect on -the original authors' reputations. - +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that companies distributing free -software will individually obtain patent licenses, thus in effect -transforming the program into proprietary software. To prevent this, -we have made it clear that any patent must be licensed for everyone's -free use or not licensed at all. - - Most GNU software, including some libraries, is covered by the ordinary -GNU General Public License, which was designed for utility programs. This -license, the GNU Library General Public License, applies to certain -designated libraries. This license is quite different from the ordinary -one; be sure to read it in full, and don't assume that anything in it is -the same as in the ordinary license. - - The reason we have a separate public license for some libraries is that -they blur the distinction we usually make between modifying or adding to a -program and simply using it. Linking a program with a library, without -changing the library, is in some sense simply using the library, and is -analogous to running a utility program or application program. However, in -a textual and legal sense, the linked executable is a combined work, a -derivative of the original library, and the ordinary General Public License -treats it as such. - - Because of this blurred distinction, using the ordinary General -Public License for libraries did not effectively promote software -sharing, because most developers did not use the libraries. We -concluded that weaker conditions might promote sharing better. - - However, unrestricted linking of non-free programs would deprive the -users of those programs of all benefit from the free status of the -libraries themselves. This Library General Public License is intended to -permit developers of non-free programs to use free libraries, while -preserving your freedom as a user of such programs to change the free -libraries that are incorporated in them. (We have not seen how to achieve -this as regards changes in header files, but we have achieved it as regards -changes in the actual functions of the Library.) The hope is that this -will lead to faster development of free libraries. +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, while the latter only -works together with the library. - - Note that it is possible for a library to be covered by the ordinary -General Public License rather than by this special one. - - GNU LIBRARY GENERAL PUBLIC LICENSE +modification follow. + + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library which -contains a notice placed by the copyright holder or other authorized -party saying it may be distributed under the terms of this Library -General Public License (also called "this License"). Each licensee is -addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices + a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, +identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of +on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. +entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or -collective works based on the Library. +collective works based on the Program. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also compile or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - c) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - d) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the source code distributed need not include anything that is normally -distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are +distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying -the Library or works based on it. +the Program or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - - 11. If, as a consequence of a court judgment or allegation of patent + + 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. +refrain entirely from distribution of the Program. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is +integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that @@ -381,57 +226,114 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 12. If the distribution and/or use of the Library is restricted in + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Library General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. From afb154a046ee235cd8345ceedb6dcf437db390e2 Mon Sep 17 00:00:00 2001 From: Mason James Date: Wed, 28 Aug 2013 02:30:44 +1200 Subject: [PATCH 132/153] added travis buildbot --- .travis.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..2b552bf7 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,31 @@ +language: perl +perl: + - "5.8" + - "5.10" + - "5.12" + - "5.14" + - "5.16" + - "5.18" + +before_install: +# install Alien:SDL + - sudo apt-get install automake + - git clone https://github.com/PerlGameDev/Alien-SDL + - cd Alien-SDL + - cat ./cpan-deps | cpanm --sudo --notest + - perl ./Build.PL --travis + - sudo ./Build install + - prove -v + - cd .. +# success!! + +# install SDL_Perl +install: + - cpanm --sudo --notest Test::Most Tie::Simple + - perl ./Build.PL + - sudo ./Build install + +script: prove -v + +notifications: + irc: irc.perl.org#sdl From 1de08e00e2ebe3d07695df89e8ced15e6c48f54c Mon Sep 17 00:00:00 2001 From: Mason James Date: Sat, 26 Oct 2013 15:13:06 +1300 Subject: [PATCH 133/153] add '-pbp' indent style, via .perltidyrc file --- .perltidyrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .perltidyrc diff --git a/.perltidyrc b/.perltidyrc new file mode 100644 index 00000000..48b7e5b7 --- /dev/null +++ b/.perltidyrc @@ -0,0 +1 @@ +-pbp From 46a8f9ca9d1addd833c2fc0d6641af6c8d6ea08d Mon Sep 17 00:00:00 2001 From: Kartik Thakore Date: Wed, 4 Apr 2012 18:51:15 -0400 Subject: [PATCH 134/153] Added set_pixel_ptr to SDLx::Surface --- src/SDLx/Surface.xs | 8 ++++++++ typemap | 1 + 2 files changed, 9 insertions(+) diff --git a/src/SDLx/Surface.xs b/src/SDLx/Surface.xs index 2bd6fe0b..47a12e9f 100644 --- a/src/SDLx/Surface.xs +++ b/src/SDLx/Surface.xs @@ -122,6 +122,14 @@ surfacex_get_pixel_xs ( surface, x, y ) RETVAL +void +surfacex_set_pixel_ptr ( surface, pointer ) + SDL_Surface *surface + void *pointer + CODE: + surface->pixels = pointer + + void surfacex_set_pixel_xs ( surface, x, y, value ) SDL_Surface *surface diff --git a/typemap b/typemap index 5e35f8bd..dd11db1c 100644 --- a/typemap +++ b/typemap @@ -103,6 +103,7 @@ SDL_RWops* O_OBJECT SDL_svg_context* T_PTR int T_IV intArray T_ARRAY +void * T_PTR OUTPUT From e3caef42cc08a1117da4cb2e25ef3d871cd8d7b3 Mon Sep 17 00:00:00 2001 From: Christian Walde Date: Sat, 14 Mar 2015 17:12:32 +0100 Subject: [PATCH 135/153] Revert "Added $VERSION to all" - can be done later with dzil and less churn --- CHANGELOG | 1 - lib/Module/Build/SDL.pm | 4 ---- lib/SDL/Audio.pm | 6 +----- lib/SDL/AudioCVT.pm | 6 +----- lib/SDL/AudioSpec.pm | 6 +----- lib/SDL/CD.pm | 6 +----- lib/SDL/CDROM.pm | 6 +----- lib/SDL/CDTrack.pm | 6 +----- lib/SDL/Color.pm | 6 +----- lib/SDL/Config.pm | 4 ---- lib/SDL/Cursor.pm | 5 ----- lib/SDL/Event.pm | 6 +----- lib/SDL/Events.pm | 6 +----- lib/SDL/GFX.pm | 6 +----- lib/SDL/GFX/BlitFunc.pm | 6 +----- lib/SDL/GFX/FPSManager.pm | 6 +----- lib/SDL/GFX/Framerate.pm | 6 +----- lib/SDL/GFX/ImageFilter.pm | 6 +----- lib/SDL/GFX/Primitives.pm | 6 +----- lib/SDL/GFX/Rotozoom.pm | 6 +----- lib/SDL/Image.pm | 6 +----- lib/SDL/Internal/Loader.pm | 4 ---- lib/SDL/Joystick.pm | 5 ----- lib/SDL/Mixer.pm | 6 +----- lib/SDL/Mixer/Channels.pm | 6 +----- lib/SDL/Mixer/Effects.pm | 6 +----- lib/SDL/Mixer/Groups.pm | 6 +----- lib/SDL/Mixer/MixChunk.pm | 6 +----- lib/SDL/Mixer/MixMusic.pm | 6 +----- lib/SDL/Mixer/Music.pm | 6 +----- lib/SDL/Mixer/Samples.pm | 6 +----- lib/SDL/Mouse.pm | 6 ------ lib/SDL/MultiThread.pm | 5 ----- lib/SDL/Net.pm | 6 +----- lib/SDL/Net/IPaddress.pm | 5 ----- lib/SDL/Net/TCP.pm | 5 ----- lib/SDL/Net/UDP.pm | 5 ----- lib/SDL/Overlay.pm | 6 +----- lib/SDL/Palette.pm | 6 +----- lib/SDL/Pango.pm | 6 +----- lib/SDL/Pango/Context.pm | 6 +----- lib/SDL/PixelFormat.pm | 6 +----- lib/SDL/RWOps.pm | 6 +----- lib/SDL/Rect.pm | 6 +----- lib/SDL/SMPEG.pm | 5 ----- lib/SDL/SMPEG/Info.pm | 6 ------ lib/SDL/Surface.pm | 6 +----- lib/SDL/TTF.pm | 6 +----- lib/SDL/TTF/Font.pm | 6 +----- lib/SDL/TTFont.pm | 5 +---- lib/SDL/Time.pm | 5 ----- lib/SDL/Tutorial.pm | 4 ---- lib/SDL/Tutorial/Animation.pm | 4 ---- lib/SDL/Tutorial/LunarLander.pm | 4 ---- lib/SDL/Version.pm | 5 ----- lib/SDL/Video.pm | 6 +----- lib/SDL/VideoInfo.pm | 6 +----- lib/SDL_perl.pm | 8 +------- lib/SDLx/App.pm | 4 ---- lib/SDLx/Controller.pm | 4 ---- lib/SDLx/Controller/Interface.pm | 5 ----- lib/SDLx/Controller/State.pm | 5 ----- lib/SDLx/Controller/Timer.pm | 4 ---- lib/SDLx/FPS.pm | 4 ---- lib/SDLx/Layer.pm | 5 ----- lib/SDLx/LayerManager.pm | 5 ----- lib/SDLx/Music.pm | 4 ---- lib/SDLx/Music/Data.pm | 4 ---- lib/SDLx/Music/Default.pm | 4 ---- lib/SDLx/SFont.pm | 6 +----- lib/SDLx/Sprite.pm | 4 ---- lib/SDLx/Sprite/Animated.pm | 4 ---- lib/SDLx/Surface.pm | 6 +----- lib/SDLx/Surface/TiedMatrix.pm | 4 ---- lib/SDLx/Surface/TiedMatrixRow.pm | 4 ---- lib/SDLx/TTF.pm | 3 --- lib/SDLx/Text.pm | 4 ---- lib/SDLx/Validate.pm | 6 +----- 78 files changed, 43 insertions(+), 369 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index ee8b3db0..9600fe16 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -12,7 +12,6 @@ Versioning rule: public releases are even numbers, dev releases are odd. (same l * 2.541_09 Aug 05 2012 - Updated Alien::SDL's version to 1.437_2 [jtpalmer] - - Added $VERSION to all modules [jtpalmer] - Added pod syntax tests [jtpalmer] - t/*: Added strict and warnings where it was missing [jtpalmer] - SDL::Constants, SDLx::Music::Data, SDL_perl: Added strict and warnings [jtpalmer] diff --git a/lib/Module/Build/SDL.pm b/lib/Module/Build/SDL.pm index 31e4979a..19b88481 100644 --- a/lib/Module/Build/SDL.pm +++ b/lib/Module/Build/SDL.pm @@ -2,10 +2,6 @@ package Module::Build::SDL; use strict; use warnings; use base 'Module::Build'; -use vars qw($VERSION); - -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; __PACKAGE__->add_property(parinput => ''); __PACKAGE__->add_property(paroutput => ''); diff --git a/lib/SDL/Audio.pm b/lib/SDL/Audio.pm index 9079efda..220a4aa1 100644 --- a/lib/SDL/Audio.pm +++ b/lib/SDL/Audio.pm @@ -1,16 +1,12 @@ package SDL::Audio; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Audio'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/AudioCVT.pm b/lib/SDL/AudioCVT.pm index 0633eeb6..bb010e1b 100644 --- a/lib/SDL/AudioCVT.pm +++ b/lib/SDL/AudioCVT.pm @@ -1,16 +1,12 @@ package SDL::AudioCVT; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Audio'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/AudioSpec.pm b/lib/SDL/AudioSpec.pm index f32a3447..d9677e6e 100644 --- a/lib/SDL/AudioSpec.pm +++ b/lib/SDL/AudioSpec.pm @@ -1,16 +1,12 @@ package SDL::AudioSpec; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Audio'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/CD.pm b/lib/SDL/CD.pm index ff0ace1b..16167648 100644 --- a/lib/SDL/CD.pm +++ b/lib/SDL/CD.pm @@ -1,16 +1,12 @@ package SDL::CD; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::CDROM'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/CDROM.pm b/lib/SDL/CDROM.pm index 5f76a6d2..af00850e 100644 --- a/lib/SDL/CDROM.pm +++ b/lib/SDL/CDROM.pm @@ -1,16 +1,12 @@ package SDL::CDROM; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::CDROM'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/CDTrack.pm b/lib/SDL/CDTrack.pm index 1ac4e9c7..5689c501 100644 --- a/lib/SDL/CDTrack.pm +++ b/lib/SDL/CDTrack.pm @@ -1,16 +1,12 @@ package SDL::CDTrack; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::CDROM'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Color.pm b/lib/SDL/Color.pm index c24d3b42..2bb064ea 100644 --- a/lib/SDL/Color.pm +++ b/lib/SDL/Color.pm @@ -1,16 +1,12 @@ package SDL::Color; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Config.pm b/lib/SDL/Config.pm index ea6a1520..7327cbd3 100644 --- a/lib/SDL/Config.pm +++ b/lib/SDL/Config.pm @@ -2,12 +2,8 @@ package SDL::Config; use strict; use warnings; -use vars qw($VERSION); use SDL::ConfigData; -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - sub has { my ( $class, $define ) = @_; my $sdl_config = SDL::ConfigData->config('SDL_cfg'); diff --git a/lib/SDL/Cursor.pm b/lib/SDL/Cursor.pm index cf6afbf0..f77e49e7 100644 --- a/lib/SDL/Cursor.pm +++ b/lib/SDL/Cursor.pm @@ -1,15 +1,10 @@ package SDL::Cursor; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Event.pm b/lib/SDL/Event.pm index b48c5b81..753cc22f 100644 --- a/lib/SDL/Event.pm +++ b/lib/SDL/Event.pm @@ -1,16 +1,12 @@ package SDL::Event; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Events'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Events.pm b/lib/SDL/Events.pm index a0be7b02..42e105a0 100644 --- a/lib/SDL/Events.pm +++ b/lib/SDL/Events.pm @@ -1,16 +1,12 @@ package SDL::Events; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Events'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX.pm b/lib/SDL/GFX.pm index e8c4061d..70bf5f5e 100644 --- a/lib/SDL/GFX.pm +++ b/lib/SDL/GFX.pm @@ -1,16 +1,12 @@ package SDL::GFX; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX/BlitFunc.pm b/lib/SDL/GFX/BlitFunc.pm index 1dc2ab9b..14263283 100644 --- a/lib/SDL/GFX/BlitFunc.pm +++ b/lib/SDL/GFX/BlitFunc.pm @@ -1,16 +1,12 @@ package SDL::GFX::BlitFunc; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX/FPSManager.pm b/lib/SDL/GFX/FPSManager.pm index 877a3200..cb7475aa 100644 --- a/lib/SDL/GFX/FPSManager.pm +++ b/lib/SDL/GFX/FPSManager.pm @@ -1,16 +1,12 @@ package SDL::GFX::FPSManager; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX/Framerate.pm b/lib/SDL/GFX/Framerate.pm index 3d3aa95b..20057a46 100644 --- a/lib/SDL/GFX/Framerate.pm +++ b/lib/SDL/GFX/Framerate.pm @@ -1,16 +1,12 @@ package SDL::GFX::Framerate; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX/ImageFilter.pm b/lib/SDL/GFX/ImageFilter.pm index d901cc2f..963ebab6 100644 --- a/lib/SDL/GFX/ImageFilter.pm +++ b/lib/SDL/GFX/ImageFilter.pm @@ -1,16 +1,12 @@ package SDL::GFX::ImageFilter; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX/Primitives.pm b/lib/SDL/GFX/Primitives.pm index f3d45d5d..3a868095 100644 --- a/lib/SDL/GFX/Primitives.pm +++ b/lib/SDL/GFX/Primitives.pm @@ -1,16 +1,12 @@ package SDL::GFX::Primitives; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/GFX/Rotozoom.pm b/lib/SDL/GFX/Rotozoom.pm index f62b76aa..78bf3993 100644 --- a/lib/SDL/GFX/Rotozoom.pm +++ b/lib/SDL/GFX/Rotozoom.pm @@ -1,16 +1,12 @@ package SDL::GFX::Rotozoom; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::GFX'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Image.pm b/lib/SDL/Image.pm index 6d10be41..3673c113 100644 --- a/lib/SDL/Image.pm +++ b/lib/SDL/Image.pm @@ -1,17 +1,13 @@ package SDL::Image; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Image'; use SDL::Surface; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Internal/Loader.pm b/lib/SDL/Internal/Loader.pm index ae62acfe..329c8c5b 100644 --- a/lib/SDL/Internal/Loader.pm +++ b/lib/SDL/Internal/Loader.pm @@ -1,15 +1,11 @@ package SDL::Internal::Loader; use strict; use warnings; -use vars qw($VERSION @ISA @EXPORT @LIBREFS); require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(internal_load_dlls); our @LIBREFS = (); -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - use SDL::ConfigData; use Alien::SDL; diff --git a/lib/SDL/Joystick.pm b/lib/SDL/Joystick.pm index 8a44fac5..c05527dc 100644 --- a/lib/SDL/Joystick.pm +++ b/lib/SDL/Joystick.pm @@ -1,15 +1,10 @@ package SDL::Joystick; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer.pm b/lib/SDL/Mixer.pm index f17952da..6bbc96e6 100644 --- a/lib/SDL/Mixer.pm +++ b/lib/SDL/Mixer.pm @@ -1,16 +1,12 @@ package SDL::Mixer; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/Channels.pm b/lib/SDL/Mixer/Channels.pm index 8d91b45c..cc5f167a 100644 --- a/lib/SDL/Mixer/Channels.pm +++ b/lib/SDL/Mixer/Channels.pm @@ -1,16 +1,12 @@ package SDL::Mixer::Channels; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/Effects.pm b/lib/SDL/Mixer/Effects.pm index de17f918..df986fc1 100644 --- a/lib/SDL/Mixer/Effects.pm +++ b/lib/SDL/Mixer/Effects.pm @@ -1,16 +1,12 @@ package SDL::Mixer::Effects; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/Groups.pm b/lib/SDL/Mixer/Groups.pm index 900232c3..58405d51 100644 --- a/lib/SDL/Mixer/Groups.pm +++ b/lib/SDL/Mixer/Groups.pm @@ -1,16 +1,12 @@ package SDL::Mixer::Groups; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/MixChunk.pm b/lib/SDL/Mixer/MixChunk.pm index d9dacf76..c35efa54 100644 --- a/lib/SDL/Mixer/MixChunk.pm +++ b/lib/SDL/Mixer/MixChunk.pm @@ -1,16 +1,12 @@ package SDL::Mixer::MixChunk; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/MixMusic.pm b/lib/SDL/Mixer/MixMusic.pm index 400a0e68..776f712e 100644 --- a/lib/SDL/Mixer/MixMusic.pm +++ b/lib/SDL/Mixer/MixMusic.pm @@ -1,16 +1,12 @@ package SDL::Mixer::MixMusic; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/Music.pm b/lib/SDL/Mixer/Music.pm index dddac606..9e5365b9 100644 --- a/lib/SDL/Mixer/Music.pm +++ b/lib/SDL/Mixer/Music.pm @@ -1,16 +1,12 @@ package SDL::Mixer::Music; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mixer/Samples.pm b/lib/SDL/Mixer/Samples.pm index 206531f0..1cd17ab9 100644 --- a/lib/SDL/Mixer/Samples.pm +++ b/lib/SDL/Mixer/Samples.pm @@ -1,16 +1,12 @@ package SDL::Mixer::Samples; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants qw(:SDL::Mixer :SDL::Audio); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Mouse.pm b/lib/SDL/Mouse.pm index 84a6cf67..5782c596 100644 --- a/lib/SDL/Mouse.pm +++ b/lib/SDL/Mouse.pm @@ -1,15 +1,9 @@ package SDL::Mouse; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); - -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - bootstrap SDL::Mouse; 1; diff --git a/lib/SDL/MultiThread.pm b/lib/SDL/MultiThread.pm index 99d214a7..979a1df9 100644 --- a/lib/SDL/MultiThread.pm +++ b/lib/SDL/MultiThread.pm @@ -1,15 +1,10 @@ package SDL::MultiThread; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Net.pm b/lib/SDL/Net.pm index 8dd58773..123de470 100644 --- a/lib/SDL/Net.pm +++ b/lib/SDL/Net.pm @@ -1,16 +1,12 @@ package SDL::Net; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Net'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Net/IPaddress.pm b/lib/SDL/Net/IPaddress.pm index a4e20302..90c7e986 100644 --- a/lib/SDL/Net/IPaddress.pm +++ b/lib/SDL/Net/IPaddress.pm @@ -1,15 +1,10 @@ package SDL::Net::IPaddress; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Net/TCP.pm b/lib/SDL/Net/TCP.pm index b45d1d02..1884124c 100644 --- a/lib/SDL/Net/TCP.pm +++ b/lib/SDL/Net/TCP.pm @@ -1,15 +1,10 @@ package SDL::Net::TCP; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Net/UDP.pm b/lib/SDL/Net/UDP.pm index 91120df9..4733495f 100644 --- a/lib/SDL/Net/UDP.pm +++ b/lib/SDL/Net/UDP.pm @@ -1,15 +1,10 @@ package SDL::Net::UDP; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Overlay.pm b/lib/SDL/Overlay.pm index 093667ce..7a110f85 100644 --- a/lib/SDL/Overlay.pm +++ b/lib/SDL/Overlay.pm @@ -1,16 +1,12 @@ package SDL::Overlay; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Palette.pm b/lib/SDL/Palette.pm index 9de930ad..23b391b9 100644 --- a/lib/SDL/Palette.pm +++ b/lib/SDL/Palette.pm @@ -1,17 +1,13 @@ package SDL::Palette; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; use SDL::Color; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Pango.pm b/lib/SDL/Pango.pm index c8b92cb5..4edc4444 100644 --- a/lib/SDL/Pango.pm +++ b/lib/SDL/Pango.pm @@ -1,16 +1,12 @@ package SDL::Pango; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Pango'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Pango/Context.pm b/lib/SDL/Pango/Context.pm index d6aa41dd..85d7a4f7 100644 --- a/lib/SDL/Pango/Context.pm +++ b/lib/SDL/Pango/Context.pm @@ -1,16 +1,12 @@ package SDL::Pango::Context; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Pango'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/PixelFormat.pm b/lib/SDL/PixelFormat.pm index c5e9bdb7..bd3f5337 100644 --- a/lib/SDL/PixelFormat.pm +++ b/lib/SDL/PixelFormat.pm @@ -1,16 +1,12 @@ package SDL::PixelFormat; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/RWOps.pm b/lib/SDL/RWOps.pm index 906496a8..26f62561 100644 --- a/lib/SDL/RWOps.pm +++ b/lib/SDL/RWOps.pm @@ -1,16 +1,12 @@ package SDL::RWOps; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::RWOps'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Rect.pm b/lib/SDL/Rect.pm index b07b568d..14c75e5a 100644 --- a/lib/SDL/Rect.pm +++ b/lib/SDL/Rect.pm @@ -1,16 +1,12 @@ package SDL::Rect; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/SMPEG.pm b/lib/SDL/SMPEG.pm index 71577422..467abe65 100644 --- a/lib/SDL/SMPEG.pm +++ b/lib/SDL/SMPEG.pm @@ -2,7 +2,6 @@ package SDL::SMPEG; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); use Carp; use SDL; use SDL::Surface; @@ -11,10 +10,6 @@ use Scalar::Util 'refaddr'; use Data::Dumper; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/SMPEG/Info.pm b/lib/SDL/SMPEG/Info.pm index b714055b..b9d093e6 100644 --- a/lib/SDL/SMPEG/Info.pm +++ b/lib/SDL/SMPEG/Info.pm @@ -32,17 +32,11 @@ package SDL::SMPEG::Info; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); use Carp; use SDL; our @ISA = qw(Exporter DynaLoader); use SDL::SMPEG; use SDL::Internal::Loader; - -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - internal_load_dlls(__PACKAGE__); bootstrap SDL::SMPEG::Info; diff --git a/lib/SDL/Surface.pm b/lib/SDL/Surface.pm index 3b2f29ef..ae188375 100644 --- a/lib/SDL/Surface.pm +++ b/lib/SDL/Surface.pm @@ -1,17 +1,13 @@ package SDL::Surface; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; use SDL::PixelFormat; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/TTF.pm b/lib/SDL/TTF.pm index 42b094c3..5e8395fc 100644 --- a/lib/SDL/TTF.pm +++ b/lib/SDL/TTF.pm @@ -1,16 +1,12 @@ package SDL::TTF; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::TTF'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/TTF/Font.pm b/lib/SDL/TTF/Font.pm index 212d2fc5..67e8fa58 100644 --- a/lib/SDL/TTF/Font.pm +++ b/lib/SDL/TTF/Font.pm @@ -1,16 +1,12 @@ package SDL::TTF::Font; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::TTF'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/TTFont.pm b/lib/SDL/TTFont.pm index fca67ec4..7b1049ed 100644 --- a/lib/SDL/TTFont.pm +++ b/lib/SDL/TTFont.pm @@ -36,13 +36,10 @@ use Carp; use SDL; use SDL::Surface; -use vars qw/ $VERSION @ISA /; +use vars qw/ @ISA /; @ISA = qw(SDL::Surface); -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - sub new { my $proto = shift; my $class = ref($proto) || $proto; diff --git a/lib/SDL/Time.pm b/lib/SDL/Time.pm index e6927b74..6e983506 100644 --- a/lib/SDL/Time.pm +++ b/lib/SDL/Time.pm @@ -1,15 +1,10 @@ package SDL::Time; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Tutorial.pm b/lib/SDL/Tutorial.pm index f41f7b78..13669943 100644 --- a/lib/SDL/Tutorial.pm +++ b/lib/SDL/Tutorial.pm @@ -32,14 +32,10 @@ package SDL::Tutorial; use strict; use warnings; -use vars qw($VERSION); use SDL; use SDLx::App; -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - # change these values as necessary my $title = 'My SDL App'; my ( $width, $height, $depth ) = ( 640, 480, 16 ); diff --git a/lib/SDL/Tutorial/Animation.pm b/lib/SDL/Tutorial/Animation.pm index acd868a9..30a44b26 100644 --- a/lib/SDL/Tutorial/Animation.pm +++ b/lib/SDL/Tutorial/Animation.pm @@ -32,7 +32,6 @@ package SDL::Tutorial::Animation; use strict; use warnings; -use vars qw($VERSION); use SDL; use SDLx::App; @@ -40,9 +39,6 @@ use SDL::Rect; use SDL::Color; use SDL::Video; -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - # change these values as necessary my $title = 'My SDL Animation'; my ( $width, $height, $depth ) = ( 640, 480, 16 ); diff --git a/lib/SDL/Tutorial/LunarLander.pm b/lib/SDL/Tutorial/LunarLander.pm index a22af763..c3b19d33 100644 --- a/lib/SDL/Tutorial/LunarLander.pm +++ b/lib/SDL/Tutorial/LunarLander.pm @@ -1,10 +1,6 @@ package SDL::Tutorial::LunarLander; use strict; use warnings; -use vars qw($VERSION); - -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; sub import { my ( $class, $filename ) = (@_); diff --git a/lib/SDL/Version.pm b/lib/SDL/Version.pm index 766d968a..e6c2002b 100644 --- a/lib/SDL/Version.pm +++ b/lib/SDL/Version.pm @@ -1,15 +1,10 @@ package SDL::Version; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/Video.pm b/lib/SDL/Video.pm index 30c69211..f3e6ff52 100644 --- a/lib/SDL/Video.pm +++ b/lib/SDL/Video.pm @@ -1,16 +1,12 @@ package SDL::Video; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL/VideoInfo.pm b/lib/SDL/VideoInfo.pm index 0ddc3485..b8049b9a 100644 --- a/lib/SDL/VideoInfo.pm +++ b/lib/SDL/VideoInfo.pm @@ -1,16 +1,12 @@ package SDL::VideoInfo; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDL_perl.pm b/lib/SDL_perl.pm index 1ea1b443..5718f66c 100644 --- a/lib/SDL_perl.pm +++ b/lib/SDL_perl.pm @@ -32,14 +32,8 @@ package SDL_perl; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); - +use vars qw(@ISA); our @ISA = qw/ DynaLoader /; - -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - require DynaLoader; use SDL::Internal::Loader; diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index d31de312..f5d777bd 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -2,10 +2,6 @@ package SDLx::App; use strict; use warnings; -use vars qw($VERSION); - -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; # SDL modules actually used here use SDL (); diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 6acf7b96..066692ef 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -1,7 +1,6 @@ package SDLx::Controller; use strict; use warnings; -use vars qw($VERSION); use Carp (); use Time::HiRes (); use SDL (); @@ -12,9 +11,6 @@ use SDLx::Controller::Interface; use SDLx::Controller::State; use Scalar::Util 'refaddr'; -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - # inside out, so this can work as the superclass of another class my %_dt; my %_min_t; diff --git a/lib/SDLx/Controller/Interface.pm b/lib/SDLx/Controller/Interface.pm index 2a38dd28..2b55b801 100644 --- a/lib/SDLx/Controller/Interface.pm +++ b/lib/SDLx/Controller/Interface.pm @@ -1,16 +1,11 @@ package SDLx::Controller::Interface; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); use Carp qw/confess/; use Scalar::Util 'refaddr'; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; my %_controller; diff --git a/lib/SDLx/Controller/State.pm b/lib/SDLx/Controller/State.pm index 2a6df6e0..203e691f 100644 --- a/lib/SDLx/Controller/State.pm +++ b/lib/SDLx/Controller/State.pm @@ -1,14 +1,9 @@ package SDLx::Controller::State; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDLx/Controller/Timer.pm b/lib/SDLx/Controller/Timer.pm index 5918691c..48e3776b 100644 --- a/lib/SDLx/Controller/Timer.pm +++ b/lib/SDLx/Controller/Timer.pm @@ -4,12 +4,8 @@ package SDLx::Controller::Timer; # use strict; use warnings; -use vars qw($VERSION @ISA); use SDL; -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - sub new { my $class = shift; my $self = bless {@_}, $class; diff --git a/lib/SDLx/FPS.pm b/lib/SDLx/FPS.pm index 46078c92..888ec261 100644 --- a/lib/SDLx/FPS.pm +++ b/lib/SDLx/FPS.pm @@ -1,15 +1,11 @@ package SDLx::FPS; use strict; use warnings; -use vars qw($VERSION @ISA); use SDL::GFX::Framerate; use SDL::GFX::FPSManager; use Carp; our @ISA = qw(SDL::GFX::FPSManager); -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - sub new { my ( $class, %args ) = @_; diff --git a/lib/SDLx/Layer.pm b/lib/SDLx/Layer.pm index e39cf015..d2ac63cf 100644 --- a/lib/SDLx/Layer.pm +++ b/lib/SDLx/Layer.pm @@ -1,7 +1,6 @@ package SDLx::Layer; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); use SDL; use SDLx::Surface; use SDLx::Sprite; @@ -9,10 +8,6 @@ use SDL::Events; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDLx/LayerManager.pm b/lib/SDLx/LayerManager.pm index f7f5a3e4..f8589f5f 100644 --- a/lib/SDLx/LayerManager.pm +++ b/lib/SDLx/LayerManager.pm @@ -1,7 +1,6 @@ package SDLx::LayerManager; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA); use SDL; use SDLx::Surface; use SDLx::Sprite; @@ -9,10 +8,6 @@ use SDL::Events; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDLx/Music.pm b/lib/SDLx/Music.pm index d52c963e..8f1f7fd9 100644 --- a/lib/SDLx/Music.pm +++ b/lib/SDLx/Music.pm @@ -1,7 +1,6 @@ package SDLx::Music; use strict; use warnings; -use vars qw($VERSION); use Carp (); use SDL; use SDL::Audio; @@ -15,9 +14,6 @@ use Data::Dumper; use SDLx::Music::Default; use SDLx::Music::Data; -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - our $def = bless( {}, "SDLx::Music::Default" ); sub new { diff --git a/lib/SDLx/Music/Data.pm b/lib/SDLx/Music/Data.pm index 45de43cb..e11427c5 100644 --- a/lib/SDLx/Music/Data.pm +++ b/lib/SDLx/Music/Data.pm @@ -2,10 +2,6 @@ package SDLx::Music::Data; use strict; use warnings; -use vars qw($VERSION); - -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; sub volume { diff --git a/lib/SDLx/Music/Default.pm b/lib/SDLx/Music/Default.pm index c3fe9486..41d49324 100644 --- a/lib/SDLx/Music/Default.pm +++ b/lib/SDLx/Music/Default.pm @@ -1,10 +1,6 @@ package SDLx::Music::Default; use strict; use warnings; -use vars qw($VERSION); - -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; sub ext { diff --git a/lib/SDLx/SFont.pm b/lib/SDLx/SFont.pm index 61e4f7ba..3687ce69 100644 --- a/lib/SDLx/SFont.pm +++ b/lib/SDLx/SFont.pm @@ -2,16 +2,12 @@ package SDLx::SFont; use strict; use warnings; use SDL::Image; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use SDL::Constants ':SDL::TTF'; our @ISA = qw(Exporter DynaLoader SDL::Surface); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use base 'Exporter'; our @EXPORT = ('SDL_TEXTWIDTH'); diff --git a/lib/SDLx/Sprite.pm b/lib/SDLx/Sprite.pm index 898309fb..4f2e557f 100644 --- a/lib/SDLx/Sprite.pm +++ b/lib/SDLx/Sprite.pm @@ -1,7 +1,6 @@ package SDLx::Sprite; use strict; use warnings; -use vars qw($VERSION); use SDL; use SDL::Video; @@ -13,9 +12,6 @@ use SDLx::Validate; use Carp (); -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - sub new { my ( $class, %options ) = @_; diff --git a/lib/SDLx/Sprite/Animated.pm b/lib/SDLx/Sprite/Animated.pm index 66aa8dab..ebefb955 100644 --- a/lib/SDLx/Sprite/Animated.pm +++ b/lib/SDLx/Sprite/Animated.pm @@ -1,7 +1,6 @@ package SDLx::Sprite::Animated; use strict; use warnings; -use vars qw($VERSION); use Scalar::Util 'refaddr'; use SDL; @@ -12,9 +11,6 @@ use SDLx::Validate; use base 'SDLx::Sprite'; -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - # inside out my %_ticks; my %_width; diff --git a/lib/SDLx/Surface.pm b/lib/SDLx/Surface.pm index fc3bc3a7..c46442f5 100644 --- a/lib/SDLx/Surface.pm +++ b/lib/SDLx/Surface.pm @@ -1,7 +1,7 @@ package SDLx::Surface; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; use Carp (); @@ -27,10 +27,6 @@ use overload ( use SDL::Constants ':SDL::Video'; our @ISA = qw(Exporter DynaLoader SDL::Surface); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - use SDL::Internal::Loader; internal_load_dlls(__PACKAGE__); diff --git a/lib/SDLx/Surface/TiedMatrix.pm b/lib/SDLx/Surface/TiedMatrix.pm index de9e7932..d25da83f 100644 --- a/lib/SDLx/Surface/TiedMatrix.pm +++ b/lib/SDLx/Surface/TiedMatrix.pm @@ -1,13 +1,9 @@ package SDLx::Surface::TiedMatrix; use strict; use warnings; -use vars qw($VERSION); use SDLx::Surface::TiedMatrixRow; use base 'Tie::Array'; -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - sub new { my $class = shift; my $matrix = shift; diff --git a/lib/SDLx/Surface/TiedMatrixRow.pm b/lib/SDLx/Surface/TiedMatrixRow.pm index 6ea45bce..ddb1ce55 100644 --- a/lib/SDLx/Surface/TiedMatrixRow.pm +++ b/lib/SDLx/Surface/TiedMatrixRow.pm @@ -1,12 +1,8 @@ package SDLx::Surface::TiedMatrixRow; use strict; use warnings; -use vars qw($VERSION); use base 'Tie::Array'; -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - sub new { my $class = shift; my $matrix = shift; diff --git a/lib/SDLx/TTF.pm b/lib/SDLx/TTF.pm index 0f0ba75d..a311133f 100644 --- a/lib/SDLx/TTF.pm +++ b/lib/SDLx/TTF.pm @@ -1,15 +1,12 @@ package SDLx::TTF; use strict; use warnings; -use vars qw($VERSION); use Carp; use SDL; use SDL::TTF; use SDL::TTF::Font; -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; sub new { diff --git a/lib/SDLx/Text.pm b/lib/SDLx/Text.pm index 3bc7e159..e4dfd948 100644 --- a/lib/SDLx/Text.pm +++ b/lib/SDLx/Text.pm @@ -1,7 +1,6 @@ package SDLx::Text; use strict; use warnings; -use vars qw($VERSION); use SDL; use SDL::Video; use SDL::Config; @@ -12,9 +11,6 @@ use List::Util qw(max sum); use Carp (); -our $VERSION = '2.541_10'; -$VERSION = eval $VERSION; - sub new { my ($class, %options) = @_; unless ( SDL::Config->has('SDL_ttf') ) { diff --git a/lib/SDLx/Validate.pm b/lib/SDLx/Validate.pm index a016ce06..ece6fb3d 100644 --- a/lib/SDLx/Validate.pm +++ b/lib/SDLx/Validate.pm @@ -2,15 +2,11 @@ package SDLx::Validate; use strict; use warnings; -use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); -our $VERSION = '2.541_10'; -our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; - $SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /Use of uninitialized value in subroutine entry/}; use Carp (); From 27406f933b9fb7567d29694303c9da8c7cb00409 Mon Sep 17 00:00:00 2001 From: Christian Walde Date: Sat, 14 Mar 2015 17:18:27 +0100 Subject: [PATCH 136/153] remove pointless var declaration --- lib/SDL_perl.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/SDL_perl.pm b/lib/SDL_perl.pm index 5718f66c..4d516f67 100644 --- a/lib/SDL_perl.pm +++ b/lib/SDL_perl.pm @@ -32,7 +32,7 @@ package SDL_perl; use strict; use warnings; -use vars qw(@ISA); + our @ISA = qw/ DynaLoader /; require DynaLoader; From c90c903451bd3482766a3dbc38b2a451e182d997 Mon Sep 17 00:00:00 2001 From: Christian Walde Date: Sat, 14 Mar 2015 17:23:33 +0100 Subject: [PATCH 137/153] synch release files as we don't care about their state on experimental --- Build.PL | 4 ++-- CHANGELOG | 57 ++++-------------------------------------------------- lib/SDL.pm | 2 +- 3 files changed, 7 insertions(+), 56 deletions(-) diff --git a/Build.PL b/Build.PL index 9df26927..92a3d2e7 100644 --- a/Build.PL +++ b/Build.PL @@ -594,7 +594,7 @@ my $build = $package->new( configure_requires => { 'Module::Build' => '0', 'ExtUtils::CBuilder' => '0.260301', - 'Alien::SDL' => '1.438', + 'Alien::SDL' => '1.444', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', @@ -604,7 +604,7 @@ my $build = $package->new( 'Test::Simple' => '0.88', 'Capture::Tiny' => '0', 'Test::Most' => '0.21', - 'Alien::SDL' => '1.438', + 'Alien::SDL' => '1.444', 'File::Find' => '0', 'File::ShareDir' => '1.0', 'Tie::Simple' => '0', diff --git a/CHANGELOG b/CHANGELOG index 9600fe16..bd4b1854 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,59 +2,10 @@ Revision history for Perl extension SDL Versioning rule: public releases are even numbers, dev releases are odd. (same like perl dist) -* - - Fixed rel2abs being not found in My/Builder/Darwin [Blaizer] - - Fixed SDLx::Surface->draw_ellipse docs [jtpalmer] - -* 2.541_10 Aug 12 2012 - - Updated Alien::SDL's version to 1.438 [jtpalmer] - - libz is now loaded too if we load libpng [FROGGS] - -* 2.541_09 Aug 05 2012 - - Updated Alien::SDL's version to 1.437_2 [jtpalmer] - - Added pod syntax tests [jtpalmer] - - t/*: Added strict and warnings where it was missing [jtpalmer] - - SDL::Constants, SDLx::Music::Data, SDL_perl: Added strict and warnings [jtpalmer] - - Fixed license in SDL.pod [jtpalmer] - - SDL::RWops docs: fixed method names so that they match implementation [FROGGS] - -* 2.541_08 Jun 18 2012 - - Lots of coumentation fixes [dod] - - Fix and test for SDLx::Surface->clip_rect [dod] - - Updated Alien::SDL's version to 1.435_7 [FROGGS] - -* 2.541_06 Jun 16 2012 - - Added missing .ogg test files [FROGGS] - -* 2.541_05 Jun 16 2012 - - Fix: SDLx::App->init tried to set window title even if there was no window manager [FROGGS] - - Updated Alien::SDL's version to 1.435_5 [FROGGS] - -* 2.541_04 Jun 15 2012 - - Updated Alien::SDL's version to 1.435_3 [FROGGS] - -* 2.541_03 Jun 12 2012 - - Updated Alien::SDL's version to 1.435_1 [FROGGS] - - Changed XS to fit MSVC (C89), so declarations are right after beginning block and before code [FROGGS] - - Added a switch so that MSVC gets a filename as import libname, other get -l... [FROGGS] - - Added load_libs for SDL_mixer and SDL_image; their deps are now loaded by Dynaloader [FROGGS] - - Fixed t/image.t's test logic; init() returns a bitmask and not a single flag [FROGGS] - -* 2.541_02 Jun 09 2012 - - Added changes that were removed in 2.540 [Blaizer] - - t/mixer_music.t: fixed ogg test name [jtpalmer] - - Added Module::Build to configure requirements [jtpalmer] - - Pod updates [mig0] - - inc/My/Builder.pm: strip pods/ subdir from pod files on build [mig0] - - SDL::Video: fill_rect now accepts 0 or undef for dest_rect, as well as a rect with h == 0 or w == 0 to mean the whole surface [mig0] - - SDLx::Test: fixed centering multi-line text [dod] - -* 2.541_01 May 26 2012 - - SDL::GFX::ImageFilter: turn off MMX [FROGGS] - - SDLx::App: removed return from stash lvalue sub [FROGGS] - - SDL::Constants: added constants for SDL_DEFAULT_REPEAT_DELAY and SDL_DEFAULT_REPEAT_INTERVAL [FROGGS] - - SDL::Mixer::Channels: little change for setting context, still not perfect [FROGGS] - - t/mixer_music.t: using ogg files [FROGGS] +* 2.544 May 14 2014 + - Updated Alien::SDL's version we depend on to get an OpenBSD/pthread fix [FROGGS] + - Fix segfault in cleanup of MixChunks on windows [FROGGS] + - Adjusting test for SDL_gfx >= 2.0.24 [FROGGS] * 2.540 May 26 2012 - Removed all non-pod changes introduced in 2.538 [jtpalmer] diff --git a/lib/SDL.pm b/lib/SDL.pm index 0a2f112e..11205f77 100644 --- a/lib/SDL.pm +++ b/lib/SDL.pm @@ -54,7 +54,7 @@ our %EXPORT_TAGS = ( defaults => $SDL::Constants::EXPORT_TAGS{'SDL/defaults'} ); -our $VERSION = '2.541_10'; +our $VERSION = '2.544'; $VERSION = eval $VERSION; print "$VERSION" if ( defined( $ARGV[0] ) && ( $ARGV[0] eq '--SDLperl' ) ); From 559c291793842817ac915f41ed4efe4006804dbe Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Tue, 22 Apr 2014 23:51:22 +0200 Subject: [PATCH 138/153] newer SDL_gfx do not return zero-ish ticks, adjusting tests --- t/sdlx_fps.t | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/t/sdlx_fps.t b/t/sdlx_fps.t index a168b607..e9294025 100644 --- a/t/sdlx_fps.t +++ b/t/sdlx_fps.t @@ -31,7 +31,9 @@ is( $fps->get, $_fps, 'fps->get' ); is( $fps->rate, $_fps, 'fps->rate' ); cmp_ok( $fps->lastticks, '>=', $ticks_start, 'fps->lastticks' ); -cmp_ok( $fps->lastticks, '<=', $ticks_init, 'fps->lastticks' ); +# Since SDL_gfx version 2.0.24 the ticks we get are always non-zero, +# but SDL can still report 0 as $ticks_init, and then the test had failed. +cmp_ok( $fps->lastticks, '<=', ($ticks_init || 1), 'fps->lastticks' ); # rateticks is Uint32, so precision differs ok( $fps->rateticks - 1000 / $_fps < 0.000001, 'fps->rateticks' ); @@ -51,7 +53,7 @@ $fps->delay; my $ticks_post_delay = SDL::get_ticks(); cmp_ok( $fps->lastticks, '>=', $ticks_pre_delay, 'fps->lastticks after fps->delay' ); -cmp_ok( $fps->lastticks, '<=', $ticks_post_delay, 'fps->lastticks after fps->delay' ); +cmp_ok( $fps->lastticks, '<=', ($ticks_post_delay || 1), 'fps->lastticks after fps->delay' ); $fps = SDLx::FPS->new(); is( $fps->get, 30, 'fps->get default value' ); From c3143e631138a9913a1156fd86e5eedfa302a360 Mon Sep 17 00:00:00 2001 From: Tobias Leich Date: Sun, 4 May 2014 23:21:07 +0200 Subject: [PATCH 139/153] fix segfault when cleaning up MixChunks on windows We built the libSDL binaries several years ago, and so it was built against an older runtime library (msvcrt.dll). Now we build SDL itself against msvcr110.dll for example, and therefore allocate on another heap than the free() is taking place, which happens in libSDL_mixer itself. See: http://stackoverflow.com/questions/23257226/sdl-mixer-mix-freechunk-crashing-on-sample-created-in-memory --- src/Mixer/Channels.xs | 5 +++++ src/defines.h | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/Mixer/Channels.xs b/src/Mixer/Channels.xs index 6ccd0b6b..af40abd7 100644 --- a/src/Mixer/Channels.xs +++ b/src/Mixer/Channels.xs @@ -216,8 +216,13 @@ mixchan_get_chunk(chan) char* CLASS = "SDL::Mixer::MixChunk"; CODE: Mix_Chunk *chunk = Mix_GetChunk(chan); +#ifdef _WIN32 + Mix_Chunk *copy = msvcrt_malloc(sizeof(Mix_Chunk)); + copy->abuf = msvcrt_malloc( chunk->alen ); +#else Mix_Chunk *copy = malloc(sizeof(Mix_Chunk)); copy->abuf = malloc( chunk->alen ); +#endif memcpy( copy->abuf, chunk->abuf, chunk->alen ); copy->alen = chunk->alen; copy->volume = chunk->volume; diff --git a/src/defines.h b/src/defines.h index 69428356..0259da10 100644 --- a/src/defines.h +++ b/src/defines.h @@ -32,6 +32,19 @@ #ifndef SDL_PERL_DEFINES_H #define SDL_PERL_DEFINES_H +#ifdef _WIN32 +#include +typedef void* (*malloc_t)(int size); +malloc_t _msvcrt_malloc = NULL; +extern malloc_t _msvcrt_malloc; + +void *msvcrt_malloc(int size) { + if (!_msvcrt_malloc) + _msvcrt_malloc = (malloc_t)GetProcAddress(GetModuleHandle("msvcrt"), "malloc"); + return _msvcrt_malloc(size); +} +#endif + #ifdef USE_THREADS PerlInterpreter *parent_perl = NULL; extern PerlInterpreter *parent_perl; From 884c10d77bb3ce11976695c141aaf7f8fc4d6d11 Mon Sep 17 00:00:00 2001 From: Christian Walde Date: Fri, 13 Mar 2015 11:51:09 +0100 Subject: [PATCH 140/153] clarify argments to handler subs in SDLx::App Previously it was easy for someone to look at the docs and assume the move handler operated in fixed steps, only discovering how wrong that is if they end up with a need to dig into the SDLx::Controller documentation. With this line it becomes obvious that the move handler takes a number of arguments and that research is necessary. And while i'm at it, also adding the arguments for the other handlers. Conflicts: lib/pods/SDLx/App.pod --- lib/pods/SDLx/App.pod | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 3037e1a7..bd4cd838 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -32,26 +32,22 @@ Extension # our app also comes with an SDLx::Controller # add a handler handle events such as keypresses - $app->add_event_handler( - sub { - my ($event) = @_; - # handle the event here - } - ); + $app->add_event_handler( sub{ + my ($event, $app) = @_; + return $_[0]->type == SDL_QUIT ? 0 : 1; + }); # add a handler to move our objects in response to time - $app->add_move_handler( - sub { - # handle moving objects here - } - ); + $app->add_move_handler( sub{ + my ($step, $app, $t) = @_; + #calc your physics here + } ); # add a handler to show our objects on the screen - $app->add_show_handler( - sub { - # handle drawing objects here - } - ); + $app->add_show_handler( sub{ + my ($delta, $app) = @_; + $app->update; + } ); # finally, start the app run loop with the added handlers $app->run(); From d9f57f075ac7200fb087cb0b1494cab8ee01e766 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Mon, 11 Jun 2012 01:35:31 +0930 Subject: [PATCH 141/153] Let stop take a param and also fixed min_t to do its job much better Still gotta fix tests and update docs --- lib/SDLx/Controller.pm | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 066692ef..71ce9bcc 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -44,7 +44,8 @@ sub new { $_event_handlers{ $ref } = $args{event_handlers} || []; $_move_handlers{ $ref } = $args{move_handlers} || []; $_show_handlers{ $ref } = $args{show_handlers} || []; - $_delay{ $ref } = defined $args{delay} && $args{delay} >= 1 ? $args{delay} / 1000 : $args{delay} || 0; # accepts seconds or ticks + # delay accepts seconds or ticks + $_delay{ $ref } = defined $args{delay} ? ($args{delay} >= 1 ? $args{delay} / 1000 : $args{delay}) : 0.001; # $_paused{ $ref } = undef; $_time{ $ref } = $args{time} || 0; $_stop_handler{ $ref } = exists $args{stop_handler} ? $args{stop_handler} : \&default_stop_handler; @@ -73,8 +74,11 @@ sub DESTROY { sub run { my ($self) = @_; my $ref = refaddr $self; + + # to keep the old value until the end of the cycle my $dt = $_dt{ $ref }; my $delay = $_delay{ $ref }; + my $min_t = $_min_t{ $ref }; # these should never change my $event_handlers = $_event_handlers{ $ref }; @@ -91,10 +95,6 @@ sub run { while ( !$_stop{ $ref } ) { my $new_time = Time::HiRes::time; my $delta_time = $new_time - $current_time; - if( $delta_time < $_min_t{ $ref } ) { - Time::HiRes::sleep(0.001); # sleep at least a millisecond - redo; - } $current_time = $new_time; $delta_time = $_max_t{ $ref } if $delta_time > $_max_t{ $ref }; my $delta_copy = $delta_time; @@ -115,9 +115,13 @@ sub run { Time::HiRes::sleep( $delay ) if $delay; + my $min_t_delay = $min_t - (Time::HiRes::time - $new_time); + Time::HiRes::sleep($min_t_delay) if $min_t_delay > 0; + # these can change during the cycle $dt = $_dt{ $ref}; $delay = $_delay{ $ref }; + $min_t = $_min_t{ $ref }; } # pause works by stopping the app and running it again @@ -135,9 +139,12 @@ sub run { } sub stop { - my $ref = refaddr $_[0]; + my ($self, $arg) = @_; + my $ref = refaddr $self; - $_stop{ $ref } = 1; + # if we have an arg make stop that; otherwise make stop = 1 + # this lets people use stopped == 1 to exit and stopped != 1 to do whatever + $_stop{ $ref } = @_ > 1 ? $arg : 1; # if we're going to stop we don't want to pause delete $_paused{ $ref }; From a7c4bb52ba3d475e2553aeef6aa0269cd3b493e6 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Wed, 13 Jun 2012 17:27:58 +0930 Subject: [PATCH 142/153] Fixed up Controller run a bit more --- lib/SDLx/Controller.pm | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 71ce9bcc..67669077 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -45,7 +45,7 @@ sub new { $_move_handlers{ $ref } = $args{move_handlers} || []; $_show_handlers{ $ref } = $args{show_handlers} || []; # delay accepts seconds or ticks - $_delay{ $ref } = defined $args{delay} ? ($args{delay} >= 1 ? $args{delay} / 1000 : $args{delay}) : 0.001; + $_delay{ $ref } = defined $args{delay} ? ($args{delay} >= 1 ? $args{delay} / 1000 : $args{delay}) : 0; # $_paused{ $ref } = undef; $_time{ $ref } = $args{time} || 0; $_stop_handler{ $ref } = exists $args{stop_handler} ? $args{stop_handler} : \&default_stop_handler; @@ -76,9 +76,7 @@ sub run { my $ref = refaddr $self; # to keep the old value until the end of the cycle - my $dt = $_dt{ $ref }; - my $delay = $_delay{ $ref }; - my $min_t = $_min_t{ $ref }; + my ($dt, $delay, $min_t); # these should never change my $event_handlers = $_event_handlers{ $ref }; @@ -89,15 +87,21 @@ sub run { delete $_stop{ $ref }; delete $_paused{ $ref }; - my $current_time = Time::HiRes::time; - Time::HiRes::sleep( $delay ) if $delay; + my $current_time = Time::HiRes::time(); + Time::HiRes::sleep( 0.001 ); # sleep at least a millisecond while ( !$_stop{ $ref } ) { - my $new_time = Time::HiRes::time; - my $delta_time = $new_time - $current_time; + my $new_time = Time::HiRes::time(); + my $delta_time = my $delta_copy = $new_time - $current_time; $current_time = $new_time; $delta_time = $_max_t{ $ref } if $delta_time > $_max_t{ $ref }; - my $delta_copy = $delta_time; + + # these can change during the cycle + $dt = $_dt{ $ref }; + $delay = $_delay{ $ref }; + $min_t = $_min_t{ $ref }; + + # we keep this completely up-to-date my $time_ref = \$_time{ $ref}; $self->_event( $ref, $event_handlers ); @@ -113,15 +117,13 @@ sub run { $self->_show( $show_handlers, $delta_time ); - Time::HiRes::sleep( $delay ) if $delay; + # one or the other of delay or min_t is good + Time::HiRes::sleep( $delay ) if $delay > 0; - my $min_t_delay = $min_t - (Time::HiRes::time - $new_time); - Time::HiRes::sleep($min_t_delay) if $min_t_delay > 0; - - # these can change during the cycle - $dt = $_dt{ $ref}; - $delay = $_delay{ $ref }; - $min_t = $_min_t{ $ref }; + if($min_t > 0) { + my $min_t_delay = $min_t - (Time::HiRes::time - $new_time); + Time::HiRes::sleep($min_t_delay) if $min_t_delay > 0; + } } # pause works by stopping the app and running it again From c93ecf14424d739bbbf84806b6d3560efb8aa08e Mon Sep 17 00:00:00 2001 From: Blaizer Date: Wed, 13 Jun 2012 17:37:59 +0930 Subject: [PATCH 143/153] Removed the dependency for the already unused Tie::Simple --- Build.PL | 3 --- lib/SDLx/Surface.pm | 1 - 2 files changed, 4 deletions(-) diff --git a/Build.PL b/Build.PL index 92a3d2e7..f2d16aad 100644 --- a/Build.PL +++ b/Build.PL @@ -597,7 +597,6 @@ my $build = $package->new( 'Alien::SDL' => '1.444', 'File::Find' => '0', 'File::ShareDir' => '1.0', - 'Tie::Simple' => '0', 'Capture::Tiny' => '0', }, build_requires => { @@ -607,12 +606,10 @@ my $build = $package->new( 'Alien::SDL' => '1.444', 'File::Find' => '0', 'File::ShareDir' => '1.0', - 'Tie::Simple' => '0', 'Scalar::Util' => '0', }, requires => { 'Scalar::Util' => '0', - 'Tie::Simple' => '0', 'File::ShareDir' => '1.0', 'CPAN' => '1.92', 'perl' => '5.008000', diff --git a/lib/SDLx/Surface.pm b/lib/SDLx/Surface.pm index c46442f5..42d665db 100644 --- a/lib/SDLx/Surface.pm +++ b/lib/SDLx/Surface.pm @@ -16,7 +16,6 @@ use SDL::PixelFormat; use SDL::GFX::Primitives; -use Tie::Simple; use SDLx::Validate; use SDLx::Surface::TiedMatrix; From 5fd5638bd1306a188f9706994b6082ed9958a9c1 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Wed, 13 Jun 2012 23:08:44 +0930 Subject: [PATCH 144/153] Controller: Made stop signals work better with pause needs testing, though --- lib/SDLx/Controller.pm | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 67669077..a80f431d 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -25,6 +25,11 @@ my %_paused; my %_time; my %_stop_handler; +use constant { + STOP => '1', + PAUSE => '0', # pause is defined but false +}; + sub new { my ($self, %args) = @_; @@ -39,7 +44,7 @@ sub new { $_dt{ $ref } = defined $args{dt} ? $args{dt} : 0.1; $_min_t{ $ref } = defined $args{min_t} ? $args{min_t} : 1 / 60; $_max_t{ $ref } = defined $args{max_t} ? $args{max_t} : 0.1; - $_stop{ $ref } = 1; + $_stop{ $ref } = STOP; $_event{ $ref } = $args{event} || SDL::Event->new(); $_event_handlers{ $ref } = $args{event_handlers} || []; $_move_handlers{ $ref } = $args{move_handlers} || []; @@ -90,7 +95,7 @@ sub run { my $current_time = Time::HiRes::time(); Time::HiRes::sleep( 0.001 ); # sleep at least a millisecond - while ( !$_stop{ $ref } ) { + until ( defined $_stop{ $ref } ) { my $new_time = Time::HiRes::time(); my $delta_time = my $delta_copy = $new_time - $current_time; $current_time = $new_time; @@ -128,12 +133,8 @@ sub run { # pause works by stopping the app and running it again if( $_paused{ $ref } ) { - delete $_stop{ $ref}; - $self->_pause($ref); - delete $_paused{ $ref }; - # exit out of this sub before going back in so we don't recurse deeper and deeper goto $self->can('run') unless $_stop{ $ref}; @@ -144,12 +145,10 @@ sub stop { my ($self, $arg) = @_; my $ref = refaddr $self; - # if we have an arg make stop that; otherwise make stop = 1 - # this lets people use stopped == 1 to exit and stopped != 1 to do whatever - $_stop{ $ref } = @_ > 1 ? $arg : 1; + $_stop{ $ref } = @_ > 1 ? $arg : STOP; # if we're going to stop we don't want to pause - delete $_paused{ $ref }; + delete $_paused{ $ref } if defined $_stop{ $ref } and $_stop{ $ref } eq STOP; } sub stopped { # returns true if the app is stopped or about to stop @@ -161,6 +160,7 @@ sub _pause { my $event = $_event{ $ref}; my $stop_handler = $_stop_handler{ $ref}; my $callback = $_paused{ $ref}; + my $stop = delete $_stop{ $ref }; do { SDL::Events::pump_events(); # don't know if we need this @@ -169,18 +169,27 @@ sub _pause { } until $_stop{ $ref } # stop set by stop_handler - or !$callback or $callback->( $event, $self ) + or $callback->( $event, $self ) or $_stop{ $ref } # stop set by callback ; + + $_stop{ $ref } ||= $stop if $stop; + delete $_paused{ $ref }; } sub pause { my ($self, $callback) = @_; my $ref = refaddr $self; + my $stop = $_stop{ $ref }; + + unless( $callback ) { + delete $_paused{ $ref }; + return; + } # if we're going to stop we don't want to pause - return if !$_paused{ $ref} and $_stop{ $ref}; + return if !$_paused{ $ref } and defined $stop and $stop eq STOP; - $_stop{ $ref } = 1; + $_stop{ $ref } = PAUSE unless $stop; $_paused{ $ref} = $callback; } sub paused { From 505ba5afcfe6e78a877e3ec75d7ae13423391df9 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 19 Jun 2012 17:21:48 +0930 Subject: [PATCH 145/153] App: icon_color_key is an alias for icon_alpha_key --- lib/SDLx/App.pm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index f5d777bd..04eddd79 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -43,11 +43,11 @@ sub new { my $ico = $o{icon}; # undef is a valid input - my $t = $o{title}; - my $it = $o{icon_title}; - my $init = exists $o{initialize} ? $o{initialize} : $o{init}; - my $s = exists $o{stash} ? $o{stash} : {}; - my $icc = $o{icon_color_key}; + my $t = $o{title}; + my $it = $o{icon_title}; + my $init = exists $o{initialize} ? $o{initialize} : $o{init}; + my $s = exists $o{stash} ? $o{stash} : {}; + my $icc = exists $o{icon_alpha_key} ? $o{icon_alpha_key} : $o{icon_color_key}; # boolean my $sw = $o{software_surface} || $o{sw_surface} || $o{sw}; From f5e6747b8898c04bc1193adf3004dbe1124d63fd Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 19 Jun 2012 17:22:41 +0930 Subject: [PATCH 146/153] Controller: Added before_pause and after_pause --- lib/SDLx/Controller.pm | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index a80f431d..d59454fc 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -24,6 +24,8 @@ my %_delay; my %_paused; my %_time; my %_stop_handler; +my %_before_pause; +my %_after_pause; use constant { STOP => '1', @@ -54,6 +56,8 @@ sub new { # $_paused{ $ref } = undef; $_time{ $ref } = $args{time} || 0; $_stop_handler{ $ref } = exists $args{stop_handler} ? $args{stop_handler} : \&default_stop_handler; + $_before_pause{ $ref } = $args{before_pause}; + $_after_pause{ $ref } = $args{after_pause}; return $self; } @@ -74,6 +78,8 @@ sub DESTROY { delete $_paused{ $ref}; delete $_time{ $ref}; delete $_stop_handler{ $ref}; + delete $_before_pause{ $ref }; + delete $_after_pause{ $ref }; } sub run { @@ -133,7 +139,9 @@ sub run { # pause works by stopping the app and running it again if( $_paused{ $ref } ) { + $_before_pause{ $ref }->($self) if $_before_pause{ $ref }; $self->_pause($ref); + $_after_pause{ $ref }->($self) if $_after_pause{ $ref }; # exit out of this sub before going back in so we don't recurse deeper and deeper goto $self->can('run') @@ -344,6 +352,22 @@ sub stop_handler { $_stop_handler{ $ref}; } +sub before_pause { + my ($self, $arg) = @_; + my $ref = refaddr $self; + $_before_pause{ $ref } = $arg if @_ > 1; + + $_before_pause{ $ref }; +} + +sub after_pause { + my ($self, $arg) = @_; + my $ref = refaddr $self; + $_after_pause{ $ref } = $arg if @_ > 1; + + $_after_pause{ $ref }; +} + sub default_stop_handler { my ($event, $self) = @_; From 45c9cffa7d25be3018f3eddabf7f201ffae72b7b Mon Sep 17 00:00:00 2001 From: Blaizer Date: Tue, 19 Jun 2012 19:24:57 +0930 Subject: [PATCH 147/153] App: docs for icon_alpha_key change --- lib/pods/SDLx/App.pod | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index bd4cd838..90cbdd24 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -74,7 +74,7 @@ providing all the methods they both provide. title => "Application Title", icon_title => "App Title", icon => "icon.bmp", - icon_color_key => [255, 255, 0], + icon_alpha_key => [255, 255, 0], # two ways to do init. init video is assumed regardless init => SDL_INIT_AUDIO | SDL_INIT_JOYSTICK, @@ -159,9 +159,10 @@ This will only have an effect under certain operating systems. The application's icon. Set with the L method. -=item icon_color_key +=item icon_alpha_key You can optionally use this when specifying the C parameter to set its color key (transparent pixel). +Alias: C. =item init From 217b0e3958e8a5d4a55cc6dcbfd19aec2fa95ca0 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Mon, 25 Jun 2012 02:26:51 +0930 Subject: [PATCH 148/153] App: fixed up error message for icon --- lib/SDLx/App.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 04eddd79..ed713cf6 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -264,7 +264,7 @@ sub icon { SDLx::App->init( SDL::SDL_INIT_VIDEO ); unless( UNIVERSAL::isa( $icon, "SDL::Surface" ) ) { $icon = SDL::Video::load_BMP( $icon ); - $icon or Carp::confess( "Could not load_BMP icon '$icon': ", SDL::get_error() ); + $icon or Carp::confess( "Could not load_BMP icon: ", SDL::get_error() ); } if( defined $color ) { $color = SDLx::Validate::map_rgb( $color, $icon->format ); From 60ef6f08b9f4a8bc9bf43fdd68a6952420a33a5d Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sun, 1 Jul 2012 02:44:34 +0930 Subject: [PATCH 149/153] App: Put t alias for title back --- lib/SDLx/App.pm | 2 +- lib/pods/SDLx/App.pod | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index ed713cf6..91b81e61 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -43,7 +43,7 @@ sub new { my $ico = $o{icon}; # undef is a valid input - my $t = $o{title}; + my $t = exists $o{title} ? $o{title} : $o{t}; my $it = $o{icon_title}; my $init = exists $o{initialize} ? $o{initialize} : $o{init}; my $s = exists $o{stash} ? $o{stash} : {}; diff --git a/lib/pods/SDLx/App.pod b/lib/pods/SDLx/App.pod index 90cbdd24..7951b6e5 100644 --- a/lib/pods/SDLx/App.pod +++ b/lib/pods/SDLx/App.pod @@ -98,8 +98,9 @@ providing all the methods they both provide. centered => 1, position => [ 150, 100 ], - hide_cursor => 1, - grab_input => 1, + # mouse stuff + hide_cursor => 1, + grab_input => 1, # don't initialize an SDLx::Controller for the app no_controller => 1, @@ -110,12 +111,15 @@ providing all the methods they both provide. # and everything from SDLx::Controller dt => 0.1, min_t => 1 / 60, + max_t => 0.1, delay => 0, stop_handler => \&SDLx::Controller::default_stop_handler, event => SDL::Event->new(), event_handlers => [], move_handlers => [], show_handlers => [], + before_pause => sub {}, + after_pause => sub {}, time => 0, ); @@ -149,6 +153,7 @@ L flag. Alias: C. =item title The window's title, as a string. Defaults to the L if defined, or the file name. +Alias: C. =item icon_title From 1269a0cf8c9831de640bb32213abcb84a3b45171 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sun, 1 Jul 2012 02:45:37 +0930 Subject: [PATCH 150/153] Controller: singular versions for event/move/show handlers --- lib/SDLx/Controller.pm | 96 +++++++++++++++++++++++++++--------------- 1 file changed, 63 insertions(+), 33 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index d59454fc..5fad536c 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -26,6 +26,9 @@ my %_time; my %_stop_handler; my %_before_pause; my %_after_pause; +my %_event_handler; +my %_move_handler; +my %_show_handler; use constant { STOP => '1', @@ -58,6 +61,9 @@ sub new { $_stop_handler{ $ref } = exists $args{stop_handler} ? $args{stop_handler} : \&default_stop_handler; $_before_pause{ $ref } = $args{before_pause}; $_after_pause{ $ref } = $args{after_pause}; + $_event_handler{ $ref } = $args{event_handler} || \&default_event_handler; + $_move_handler{ $ref } = $args{move_handler} || \&default_move_handler; + $_show_handler{ $ref } = $args{show_handler} || \&default_show_handler; return $self; } @@ -80,19 +86,23 @@ sub DESTROY { delete $_stop_handler{ $ref}; delete $_before_pause{ $ref }; delete $_after_pause{ $ref }; + delete $_event_handler{ $ref }; + delete $_move_handler{ $ref }; + delete $_show_handler{ $ref }; } sub run { my ($self) = @_; my $ref = refaddr $self; - # to keep the old value until the end of the cycle + # these keep their old value until the end of the cycle my ($dt, $delay, $min_t); - # these should never change - my $event_handlers = $_event_handlers{ $ref }; - my $move_handlers = $_move_handlers{ $ref }; - my $show_handlers = $_show_handlers{ $ref }; + # you have to stop and rerun the app to update these + my $event_handler = $_event_handler{ $ref }; + my $move_handler = $_move_handler{ $ref }; + my $show_handler = $_show_handler{ $ref }; + my $stop_handler = $_stop_handler{ $ref }; # alows us to do stop and run delete $_stop{ $ref }; @@ -115,18 +125,23 @@ sub run { # we keep this completely up-to-date my $time_ref = \$_time{ $ref}; - $self->_event( $ref, $event_handlers ); + my $event = $_event{ $ref }; + SDL::Events::pump_events(); + while ( SDL::Events::poll_event( $event ) ) { + $stop_handler ->( $event, $self ) if $stop_handler; + $event_handler->( $event, $self ); + } while ( $delta_copy > $dt ) { - $self->_move( $move_handlers, 1, $$time_ref ); # a full move + $move_handler->( 1, $self, $$time_ref ); # a full move $delta_copy -= $dt; $$time_ref += $dt; } my $step = $delta_copy / $dt; - $self->_move( $move_handlers, $step, $$time_ref ); # a partial move + $move_handler->( $step, $self, $$time_ref ); # a partial move $$time_ref += $dt * $step; - $self->_show( $show_handlers, $delta_time ); + $show_handler->( $delta_time, $self ); # one or the other of delay or min_t is good Time::HiRes::sleep( $delay ) if $delay > 0; @@ -143,9 +158,10 @@ sub run { $self->_pause($ref); $_after_pause{ $ref }->($self) if $_after_pause{ $ref }; + return if $_stop{ $ref }; + # exit out of this sub before going back in so we don't recurse deeper and deeper - goto $self->can('run') - unless $_stop{ $ref}; + goto $self->can('run'); } } @@ -205,34 +221,24 @@ sub paused { $_paused{ refaddr $_[0]}; } -sub _event { - my ($self, $ref, $event_handlers) = @_; - my $stop_handler = $_stop_handler{ $ref }; - my $event = $_event{ $ref }; - - SDL::Events::pump_events(); - while ( SDL::Events::poll_event( $event ) ) { - $stop_handler->( $event, $self ) if $stop_handler; - foreach my $event_handler ( @$event_handlers ) { - next unless $event_handler; - $event_handler->( $event, $self ); - } +sub default_event_handler { + my ($event, $self) = @_; + foreach my $event_handler ( @{$_event_handlers{ refaddr $self }} ) { + $event_handler->( $event, $self ) if $event_handler; } } -sub _move { - my ($self, $move_handlers, $move_portion, $t) = @_; - foreach my $move_handler ( @$move_handlers ) { - next unless $move_handler; - $move_handler->( $move_portion, $self, $t ); +sub default_move_handler { + my ($move_portion, $self, $t) = @_; + foreach my $move_handler ( @{$_move_handlers{ refaddr $self }} ) { + $move_handler->( $move_portion, $self, $t ) if $move_handler; } } -sub _show { - my ($self, $show_handlers, $delta_ticks) = @_; - foreach my $show_handler ( @$show_handlers ) { - next unless $show_handler; - $show_handler->( $delta_ticks, $self ); +sub default_show_handler { + my ($delta_time, $self) = @_; + foreach my $show_handler ( @{$_show_handlers{ refaddr $self }} ) { + $show_handler->( $delta_time, $self ) if $show_handler; } } @@ -344,6 +350,30 @@ sub delay { $_delay{ $ref}; } +sub event_handler { + my ($self, $arg) = @_; + my $ref = refaddr $self; + $_event_handler{ $ref } = $arg if @_ > 1; + + $_event_handler{ $ref }; +} + +sub move_handler { + my ($self, $arg) = @_; + my $ref = refaddr $self; + $_move_handler{ $ref } = $arg if @_ > 1; + + $_move_handler{ $ref }; +} + +sub show_handler { + my ($self, $arg) = @_; + my $ref = refaddr $self; + $_show_handler{ $ref } = $arg if @_ > 1; + + $_show_handler{ $ref }; +} + sub stop_handler { my ($self, $arg) = @_; my $ref = refaddr $self; From ed52601f2a620aec7099af627942982c45a00300 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Mon, 24 Dec 2012 11:27:56 +1030 Subject: [PATCH 151/153] Controller: Handlers are optional --- lib/SDLx/Controller.pm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/SDLx/Controller.pm b/lib/SDLx/Controller.pm index 5fad536c..23eaeefd 100644 --- a/lib/SDLx/Controller.pm +++ b/lib/SDLx/Controller.pm @@ -129,19 +129,19 @@ sub run { SDL::Events::pump_events(); while ( SDL::Events::poll_event( $event ) ) { $stop_handler ->( $event, $self ) if $stop_handler; - $event_handler->( $event, $self ); + $event_handler->( $event, $self ) if $event_handler; } while ( $delta_copy > $dt ) { - $move_handler->( 1, $self, $$time_ref ); # a full move + $move_handler->( 1, $self, $$time_ref ) if $move_handler; # a full move $delta_copy -= $dt; $$time_ref += $dt; } my $step = $delta_copy / $dt; - $move_handler->( $step, $self, $$time_ref ); # a partial move + $move_handler->( $step, $self, $$time_ref ) if $move_handler; # a partial move $$time_ref += $dt * $step; - $show_handler->( $delta_time, $self ); + $show_handler->( $delta_time, $self ) if $show_handler; # one or the other of delay or min_t is good Time::HiRes::sleep( $delay ) if $delay > 0; From c56748f67ab61d15a47bdc2a6b3a3d2785e531e3 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Mon, 24 Dec 2012 12:31:36 +1030 Subject: [PATCH 152/153] SDL_WM_SetIcon transparency now works on 24 bit surfaces Just convert them to 32 bit surfaces --- lib/SDLx/App.pm | 6 +++--- src/Core/Video.xs | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/SDLx/App.pm b/lib/SDLx/App.pm index 91b81e61..efaf84ae 100644 --- a/lib/SDLx/App.pm +++ b/lib/SDLx/App.pm @@ -43,10 +43,10 @@ sub new { my $ico = $o{icon}; # undef is a valid input - my $t = exists $o{title} ? $o{title} : $o{t}; + my $t = exists $o{title} ? $o{title} : $o{t}; my $it = $o{icon_title}; - my $init = exists $o{initialize} ? $o{initialize} : $o{init}; - my $s = exists $o{stash} ? $o{stash} : {}; + my $init = exists $o{initialize} ? $o{initialize} : $o{init}; + my $s = exists $o{stash} ? $o{stash} : {}; my $icc = exists $o{icon_alpha_key} ? $o{icon_alpha_key} : $o{icon_color_key}; # boolean diff --git a/src/Core/Video.xs b/src/Core/Video.xs index 984cd1ba..020455dd 100644 --- a/src/Core/Video.xs +++ b/src/Core/Video.xs @@ -9,6 +9,7 @@ #endif #include +#include void _uinta_free(Uint16* av, int len_from_av_len) { @@ -553,7 +554,21 @@ void video_wm_set_icon ( icon ) SDL_Surface *icon CODE: - SDL_WM_SetIcon(icon,NULL); + if (icon && icon->format->BytesPerPixel == 3) { + SDL_PixelFormat* format = SDL_malloc(sizeof(SDL_PixelFormat)); + memcpy(format, icon->format, sizeof(SDL_PixelFormat)); + format->BitsPerPixel = 32; + format->BytesPerPixel = 4; + format->palette = NULL; + + SDL_Surface* new_icon = SDL_ConvertSurface(icon, format, icon->flags); + if (new_icon) { + SDL_WM_SetIcon(new_icon, NULL); + SDL_FreeSurface(new_icon); + } + } + else + SDL_WM_SetIcon(icon, NULL); Uint32 video_wm_grab_input ( mode ) From 16138d5cd3db660ce3ff79eb0feeee958f70c503 Mon Sep 17 00:00:00 2001 From: Blaizer Date: Sat, 12 Jan 2013 21:18:26 +1030 Subject: [PATCH 153/153] SDL::Palette should not be destroyed by us It's destroyed on SDL_FreeSurface. Destroying it when the Perl reference to it is lost causes problems. If we do want to destroy them when the Perl reference is lost, copies to SDL::Surface's palettes must always be returned, not the palettes themselves. --- src/Core/objects/Palette.xs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Core/objects/Palette.xs b/src/Core/objects/Palette.xs index 98edb4d7..f4d51a29 100644 --- a/src/Core/objects/Palette.xs +++ b/src/Core/objects/Palette.xs @@ -53,9 +53,3 @@ palette_color_index ( palette, index ) RETVAL = cpy2bag( (SDL_Color *)(palette->colors + index), sizeof(SDL_Color *), sizeof(SDL_Color), "SDL::Color" ); OUTPUT: RETVAL - -void -palette_DESTROY ( bag ) - SV *bag - CODE: - objDESTROY(bag, safefree);