Skip to content

Commit

Permalink
moved num_rgb to xs
Browse files Browse the repository at this point in the history
  • Loading branch information
Tobias Leich committed Oct 15, 2010
1 parent ed017ea commit 7945a0f
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 24 deletions.
14 changes: 0 additions & 14 deletions lib/SDLx/Validate.pm
Expand Up @@ -84,20 +84,6 @@ sub _color_arrayref {
return \@valid;
}

sub num_rgb {
my ($color) = @_;
my $format = _color_format($color);
if ( $format eq 'number' ) {
no warnings 'uninitialized';
return _color_number($color, 0);
} 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);
Expand Down
28 changes: 28 additions & 0 deletions src/SDLx/Validate.h
@@ -1,4 +1,32 @@

SDL_Color *bag_to_color( SV *bag )
{
SDL_Color *color = NULL;

if( sv_isobject(bag) && (SvTYPE(SvRV(bag)) == SVt_PVMG) )
{
void **pointers = (void **)(SvIV((SV *)SvRV( bag )));
color = (SDL_Color *)(pointers[0]);
}

return color;
}

char *_color_format( SV *color )
{
char *retval = NULL;
if( !SvOK(color) || SvIOK(color) )
retval = "number";
else if( sv_derived_from(color, "ARRAY") )
retval = "arrayref";
else if( sv_isobject(color) && sv_derived_from(color, "SDL::Color") )
retval = "SDLx::Color";
else
warn("Color must be number or arrayref or SDLx::Color");

return retval;
}

SV *_color_number( SV *color, SV *alpha )
{
int c = SvIV(color);
Expand Down
34 changes: 24 additions & 10 deletions src/SDLx/Validate.xs
Expand Up @@ -16,17 +16,9 @@ char *
val__color_format( color )
SV *color
CODE:
if( !SvOK(color) || SvIOK(color) )
RETVAL = "number";
else if( sv_derived_from(color, "ARRAY") )
RETVAL = "arrayref";
else if( sv_isobject(color) && sv_derived_from(color, "SDL::Color") )
RETVAL = "SDLx::Color";
else
{
RETVAL = _color_format( color );
if(NULL == RETVAL)
XSRETURN_UNDEF;
warn("Color must be number or arrayref or SDLx::Color");
}
OUTPUT:
RETVAL

Expand All @@ -48,3 +40,25 @@ val__color_arrayref( color, ... )
: _color_arrayref( color, newSVuv(0) );
OUTPUT:
RETVAL

SV *
val_num_rgb( color )
SV *color
CODE:
char *format = _color_format( color );
if( 0 == strcmp("number", format) )
RETVAL = _color_number(color, newSVuv(0));
else if( 0 == strcmp("arrayref", format) )
{
AV *c = _color_arrayref( (AV *)SvRV(color), newSVuv(0) );
RETVAL = newSVuv(( SvUV(AvARRAY(c)[0]) << 16 ) + ( SvUV(AvARRAY(c)[1]) << 8 ) + SvUV(AvARRAY(c)[2]));
}
else if( 0 == strcmp("SDLx::Color", format) )
{
SDL_Color *_color = bag_to_color( color );
RETVAL = newSVuv(( (_color->r) << 16 ) + ( (_color->g) << 8 ) + _color->b);
}
else
XSRETURN_UNDEF;
OUTPUT:
RETVAL

0 comments on commit 7945a0f

Please sign in to comment.