The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
use warnings;
use SDL;
use SDL::Rect;
use SDL::Config;
use SDL::Video;
use SDL::Version;
use SDL::Surface;
use SDL::PixelFormat;
use SDL::GFX;
use SDL::GFX::ImageFilter;
use Test::More;

use lib 't/lib';
use SDL::TestTool;

my $videodriver = $ENV{SDL_VIDEODRIVER};
$ENV{SDL_VIDEODRIVER} = 'dummy' unless $ENV{SDL_RELEASE_TESTING};

if ( !SDL::TestTool->init(SDL_INIT_VIDEO) ) {
	plan( skip_all => 'Failed to init video' );
} elsif ( !SDL::Config->has('SDL_gfx_imagefilter') ) {
	plan( skip_all => 'SDL_gfx_imagefilter support not compiled' );
} else {
	plan( tests => 8 );
}

my $v = SDL::GFX::linked_version();
isa_ok( $v, 'SDL::Version', '[linked_version]' );
printf( "got version: %d.%d.%d\n", $v->major, $v->minor, $v->patch );

my @done = qw/
	MMX_detect
	/;

my $display = SDL::Video::set_video_mode( 640, 480, 32, SDL_SWSURFACE );
my $pixel = SDL::Video::map_RGB( $display->format, 0, 0, 0 );
SDL::Video::fill_rect(
	$display,
	SDL::Rect->new( 0, 0, $display->w, $display->h ), $pixel
);

if ( !$display ) {
	plan skip_all => 'Couldn\'t set video mode: ' . SDL::get_error();
}

my $mmx_before = SDL::GFX::ImageFilter::MMX_detect();
is( $mmx_before == 1 || $mmx_before == 0, 1, "MMX_detect == $mmx_before" );
is( SDL::GFX::ImageFilter::MMX_off(),    undef, 'MMX_off' );
is( SDL::GFX::ImageFilter::MMX_detect(), 0,     "MMX_detect (MMX is off now)" );
is( SDL::GFX::ImageFilter::MMX_on(),     undef, 'MMX_on' );
is( SDL::GFX::ImageFilter::MMX_detect(),
	$mmx_before, "MMX_detect (MMX is same as at start)"
);

#add(Src1, Src2, Dest, length)
#mean(Src1, Src2, Dest, length)
#sub(Src1, Src2, Dest, length)
#abs_diff(Src1, Src2, Dest, length)
#mult(Src1, Src2, Dest, length)
#mult_nor(Src1, Src2, Dest, length)
#mult_div_by_2(Src1, Src2, Dest, length)
#mult_div_by_4(Src1, Src2, Dest, length)
#bit_and(Src1, Src2, Dest, length)
#bit_or(Src1, Src2, Dest, length)
#div(Src1, Src2, Dest, length)
#bit_negation(Src1, Dest, length)
#add_byte(Src1, Dest, length, C)
#add_uint(Src1, Dest, length, C)
#add_byte_to_half(Src1, Dest, length, C)
#sub_byte(Src1, Dest, length, C)
#sub_uint(Src1, Dest, length, C)
#shift_right(Src1, Dest, length, N)
#shift_right_uint(Src1, Dest, length, N)
#mult_by_byte(Src1, Dest, length, C)
#shift_right_and_mult_by_byte(Src1, Dest, length, N, C)
#shift_left_byte(Src1, Dest, length, N)
#shift_left_uint(Src1, Dest, length, N)
#shift_left(Src1, Dest, length, N)
#binarize_using_threshold(Src1, Dest, length, T)
#clip_to_range(Src1, Dest, length, Tmin, Tmax)
#normalize_linear(Src1, Dest, length, Cmin, Cmax, Nmin, Nmax)
#convolve_kernel_3x3_divide(Src, Dest, rows, columns, Kernel, Divisor)
#convolve_kernel_5x5_divide(Src, Dest, rows, columns, Kernel, Divisor)
#convolve_kernel_7x7_divide(Src, Dest, rows, columns, Kernel, Divisor)
#convolve_kernel_9x9_divide(Src, Dest, rows, columns, Kernel, Divisor)
#convolve_kernel_3x3_shift_right(Src, Dest, rows, columns, Kernel, NRightShift)
#convolve_kernel_5x5_shift_right(Src, Dest, rows, columns, Kernel, NRightShift)
#convolve_kernel_7x7_shift_right(Src, Dest, rows, columns, Kernel, NRightShift)
#convolve_kernel_9x9_shift_right(Src, Dest, rows, columns, Kernel, NRightShift)
#sobel_x(Src, Dest, rows, columns)
#sobel_x_shift_right(Src, Dest, rows, columns, NRightShift)
#align_stack()
#restore_stack()

SDL::Video::update_rect( $display, 0, 0, 640, 480 );

#SDL::delay(1000);

my @left = qw/
	MMX_detect
	MMX_off
	MMX_on
	add
	mean
	sub
	abs_diff
	mult
	mult_nor
	mult_div_by_2
	mult_div_by_4
	bit_and
	bit_or
	div
	bit_negation
	add_byte
	add_uint
	add_byte_to_half
	sub_byte
	sub_uint
	shift_right
	shift_right_uint
	mult_by_byte
	shift_right_and_mult_by_byte
	shift_left_byte
	shift_left_uint
	shift_left
	binarize_using_threshold
	clip_to_range
	normalize_linear
	convolve_kernel_3x3_divide
	convolve_kernel_5x5_divide
	convolve_kernel_7x7_divide
	convolve_kernel_9x9_divide
	convolve_kernel_3x3_shift_right
	convolve_kernel_5x5_shift_right
	convolve_kernel_7x7_shift_right
	convolve_kernel_9x9_shift_right
	sobel_x
	sobel_x_shift_right
	align_stack
	restore_stack
	/;

my $why =
	  '[Percentage Completion] '
	. int( 100 * ( $#done + 1 ) / ( $#done + $#left + 2 ) )
	. '% implementation. '
	. ( $#done + 1 ) . '/'
	. ( $#done + $#left + 2 );
TODO:
{
	local $TODO = $why;
	pass "\nThe following functions:\n" . join ",", @left;
}
if   ( $done[0] eq 'none' ) { print '0% done 0/' . $#left . "\n" }
else                        { print "$why\n" }

if ($videodriver) {
	$ENV{SDL_VIDEODRIVER} = $videodriver;
} else {
	delete $ENV{SDL_VIDEODRIVER};
}

pass 'Are we still alive? Checking for segfaults';

done_testing;