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"

#ifndef aTHX_
#define aTHX_
#endif

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

MODULE = SDLx::Controller::Timer 	PACKAGE = SDLx::Controller::Timer    PREFIX = timerx_

sdlx_timer *
timerx_new (CLASS, ... )
	char* CLASS
	CODE:
		RETVAL = (sdlx_timer *)safemalloc( sizeof(sdlx_timer) );
		RETVAL->started_ticks = 0;
		RETVAL->paused_ticks  = 0;
		RETVAL->started       = 0;
		RETVAL->paused        = 0;
	OUTPUT:
		RETVAL


int
timerx_started_ticks ( timer, ... )
	sdlx_timer *timer
	CODE:
		if (items > 1 ) timer->started_ticks = SvIV(ST(1)); 
		RETVAL = timer->started_ticks;
	OUTPUT:
		RETVAL

int
timerx_paused_ticks ( timer, ... )
	sdlx_timer *timer
	CODE:
		if (items > 1 ) timer->paused_ticks = SvIV(ST(1)); 
		RETVAL = timer->paused_ticks;
	OUTPUT:
		RETVAL

int
timerx_started ( timer, ... )
	sdlx_timer *timer
	CODE:
		if (items > 1 ) timer->started = SvIV(ST(1)); 
		RETVAL = timer->started;
	OUTPUT:
		RETVAL

int
timerx_paused ( timer, ... )
	sdlx_timer *timer
	CODE:
		if (items > 1 ) timer->paused = SvIV(ST(1)); 
		RETVAL = timer->paused;
	OUTPUT:
		RETVAL

void
timerx_start ( timer )
	sdlx_timer *timer
	CODE:
		timer->started = 1;
		timer->started_ticks = SDL_GetTicks();

void
timerx_stop ( timer )
	sdlx_timer *timer
	CODE:
		timer->started = 0;
		timer->paused = 0;

void
timerx_pause ( timer )
	sdlx_timer *timer
	CODE:
		if( timer->started == 1 && timer->paused == 0)
		{
			timer->paused = 1;
			timer->paused_ticks = SDL_GetTicks() - timer->started_ticks;
		}

void
timerx_unpause ( timer )
	sdlx_timer *timer
	CODE:
		timer->paused = 0;
		timer->started_ticks = SDL_GetTicks() - timer->started_ticks;
		timer->paused_ticks = 0;

int
timerx_get_ticks ( timer )
	sdlx_timer *timer
	CODE:
		if(timer->started == 1)
		{
		   if(timer->paused == 1)
		   {
			RETVAL = timer->paused_ticks;
		   }
		   else
		   {
			int update = SDL_GetTicks();
			int diff = update - timer->started_ticks;
			RETVAL = diff;
		   }
		}
		else
		{
			RETVAL = 0;
		}
	OUTPUT:
		RETVAL


int
timerx_is_started ( timer )
	sdlx_timer *timer
	CODE:
		RETVAL = timer->started;
	OUTPUT:
		RETVAL

int
timerx_is_paused ( timer)
	sdlx_timer *timer
	CODE:
		RETVAL = timer->paused;
	OUTPUT:
		RETVAL


void
timerx_DESTROY(bag)
	SV *bag
	CODE:
		if( sv_isobject(bag) && (SvTYPE(SvRV(bag)) == SVt_PVMG) ) {
			   void** pointers = (void**)INT2PTR(void *, SvIV((SV *)SvRV( bag ))); 
			   sdlx_timer * timer = (sdlx_timer*)(pointers[0]);
			   if (PERL_GET_CONTEXT == pointers[1]) {
			       pointers[0] = NULL;
			       safefree( pointers );

			       safefree(timer);
			   }
		       } else if (bag == 0) {
			   XSRETURN(0);
		       } else {
			   XSRETURN_UNDEF;
		       }