The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include "helper.h"

#ifndef aTHX_
#define aTHX_
#endif

#include <SDL.h>
#include "SDLx/Validate.h"

MODULE = SDLx::Validate 	PACKAGE = SDLx::Validate    PREFIX = val_

char *
val__color_format( color )
    SV *color
    CODE:
        RETVAL = _color_format( color );
        if(NULL == RETVAL)
            XSRETURN_UNDEF;
    OUTPUT:
        RETVAL

SV *
val__color_number( color, alpha )
    SV* color
    SV* alpha
    CODE:
        RETVAL = _color_number( color, alpha );
    OUTPUT:
        RETVAL

AV *
val__color_arrayref( color, ... )
    AV *color
    CODE:
        RETVAL = items > 1
               ? _color_arrayref( color, ST(1) )
               : _color_arrayref( color, sv_2mortal(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, sv_2mortal(newSVuv(0)) );
        else if( 0 == strcmp("arrayref", format) )
        {
            AV *c          = _color_arrayref( (AV *)SvRV(color), sv_2mortal(newSVuv(0)) );
            unsigned int v = (( SvUV(AvARRAY(c)[0]) << 16 ) + ( SvUV(AvARRAY(c)[1]) << 8 ) + SvUV(AvARRAY(c)[2]));
            RETVAL         = newSVuv(v);
        }
        else if( 0 == strcmp("SDL::Color", format) )
        {
            SDL_Color *_color = (SDL_Color*) bag2obj( color );
            unsigned int v    = ( (_color->r) << 16 ) + ( (_color->g) << 8 ) + _color->b;
            RETVAL            = newSVuv( v );
        }
        else
            XSRETURN_UNDEF;
    OUTPUT:
        RETVAL

SV *
val_num_rgba( color )
    SV *color
    CODE:
        char *format = _color_format( color );
        if( 0 == strcmp("number", format) )
            RETVAL = _color_number( color, sv_2mortal(newSVuv(1)) );
        else if( 0 == strcmp("arrayref", format) )
        {
            AV *c          = _color_arrayref( (AV *)SvRV(color), sv_2mortal(newSVuv(1)) );
            unsigned int v = (SvUV(AvARRAY(c)[0]) << 24) + (SvUV(AvARRAY(c)[1]) << 16) + (SvUV(AvARRAY(c)[2]) << 8) + SvUV(AvARRAY(c)[3] );
            RETVAL         = newSVuv(v);
        }
        else if( 0 == strcmp("SDL::Color", format) )
        {
            SDL_Color *_color = (SDL_Color*)bag2obj( color );
            unsigned int v    = (((_color->r) << 24) + ((_color->g) << 16) + ((_color->b) << 8) + 0xFF) ;
            RETVAL            = newSVuv( v );
        }
        else
            XSRETURN_UNDEF;
    OUTPUT:
        RETVAL

AV *
val_list_rgb( color )
    SV *color
    CODE:
        RETVAL = __list_rgb( color );
    OUTPUT:
        RETVAL

AV *
val_list_rgba( color )
    SV *color
    CODE:
        RETVAL = __list_rgba( color );
    OUTPUT:
        RETVAL

void
val_rect( r )
    SV* r
    PPCODE:
        ST(0) = create_mortal_rect( r );
        XSRETURN(1);

void *
val_surface( s )
    SV *s
    PPCODE:
        assert_surface(s); /* ok or dead */
        /* ret is already mortal */
        ST(0) = s;
        XSRETURN(1);

SV *
val_map_rgb( color, format)
    SV* color
    SDL_PixelFormat * format
    CODE:
        RETVAL = newSVuv( __map_rgb( color, format ) );
    OUTPUT:
        RETVAL

SV *
val_map_rgba( color, format)
    SV* color
    SDL_PixelFormat * format
    CODE:
        RETVAL = newSVuv( __map_rgba( color, format ) );
    OUTPUT:
        RETVAL