#!/usr/bin/perl -w use lib './blib/lib','./blib/arch','../blib/lib','../blib/arch'; use FileHandle; use FindBin qw($Bin); use constant FONT=>"$Bin/Generic.ttf"; use constant SKIP_TEST_8 => 1; my $loaded; my $suffix; BEGIN {$| = 1; $loaded = 0; print "1..12\n"; } END {print "not ok 1\n" unless $loaded;} use GD qw(:DEFAULT GD_CMP_IMAGE); use GD::Simple; $loaded++; if ($suffix = $ENV{GDIMAGETYPE}) { print STDERR "Testing using $suffix support.\n"; } elsif (GD::Image->can('newFromPng')) { print STDERR "Testing using png support.\n"; $suffix = "png"; } elsif (GD::Image->can('newFromJpeg')) { print STDERR "Testing using jpeg support.\n"; $suffix = "jpeg"; } elsif (GD::Image->can('newFromGif')) { print STDERR "Testing using gif support.\n"; $suffix = "gif"; } else { die "Regression tests require one or more of PNG, GIF or JPEG support in libgd."; } print "ok 1\n"; chdir 't' || die "Couldn't change to 't' directory: $!"; $arg = shift; if (defined $arg && $arg eq '--write') { warn "Writing regression files..."; compare(&test2,2,'write'); compare(&test3,3,'write'); compare(&test4,4,'write'); compare(&test5,5,'write'); compare(&test6,6,'write'); compare(&test7,7,'write'); compare(&test8,8,'write'); compare(&test9('frog.xpm'),9,'write') if GD::Image->can('newFromXpm'); compare(&test10('frog.jpg'),10,'write') if GD::Image->can('newFromJpeg'); } compare(test2(),2); compare(test3(),3); compare(test4(),4); compare(test5(),5); compare(test6(),6); compare(test7(),7); if (SKIP_TEST_8) { print "ok 8 # Skip, FreeType changes too frequently to be testable\n"; } elsif (GD::Image->stringTTF(0,FONT,12.0,0.0,20,20,"Hello world!")) { compare(test8(),8,undef); } elsif ($@ =~/not built with .+Type font support/) { print "ok ",8," # Skip, no FreeType font support\n"; } else { print "not ok ",8,"\n"; } if (GD::Image->newFromXpm('frog.xpm')) { compare(test9('frog.xpm'),9); } elsif ($@ =~/not built with xpm support/) { print "ok ",9," # Skip, no XPM support\n"; } else { print "not ok ",9,"\n"; } if (GD::Image->can('newFromJpeg')) { compare(test10('frog.jpg'),10); } else { print "ok ",10," # Skip, no JPEG support\n"; } my $image = GD::Image->new(300,300); $image->colorAllocate(255,255,255); $image->colorAllocate(0,0,0); $image->colorAllocate(255,0,0); $image->rectangle(0,0,300,300,0); $image->filledRectangle(10,10,50,50,2); my $gd = $image->gd; my $image2 = GD::Image->newFromGdData($gd); print ((image($image) eq image($image2)) ? "ok 11\n" : "not ok 11\n"); my $gd2 = $image->gd2; $image2 = GD::Image->newFromGd2Data($gd2); print ((image($image) eq image($image2)) ? "ok 12\n" : "not ok 12\n"); exit 0; sub compare { if (@_ < 2 && $@ =~ /not built with PNG/i) { print "ok $_[0] # Skip, no PNG support\n"; return; } my($imageData,$testNo,$fht) = @_; local($/); undef $/; my $regressdata; my $file = ($^O eq 'VMS')? "test.out_".$testNo."_$suffix" : "./test.out.$testNo.$suffix"; if (defined $fht and $fht eq 'write') { open (REGRESSFILE,">${file}_new") || die "Can't open regression file '${file}_new': $!\n"; print STDERR "Writing ${file}_new\n"; binmode REGRESSFILE; print REGRESSFILE $imageData; close REGRESSFILE; } else { my ($ok,$counter); my $fname = $file; while (-r "./$fname") { open (REGRESSFILE,"./$fname") || die "Can't open regression file './t/$fname': $!\n"; binmode REGRESSFILE; $regressdata = ; close REGRESSFILE; $ok = $imageData eq $regressdata; last if $ok; $fname = "$file-".++$counter; } print $ok ? "ok $testNo" : "not ok $testNo","\n"; } } sub test2 { my($im) = new GD::Image(300,300); my($white) = $im->colorAllocate(255, 255, 255); my($black) = $im->colorAllocate(0, 0, 0); my($red) = $im->colorAllocate(255, 0, 0); my($green) = $im->colorAllocate(0,255,0); my($yellow) = $im->colorAllocate(255,250,205); open (TILE,"./tile.$suffix") || die "Can't open tile file: $!"; my($tile) = $suffix eq 'png' ? GD::Image->newFromPng(TILE) : $suffix eq 'gif' ? GD::Image->newFromGif(TILE) : $suffix eq 'jpeg'? GD::Image->newFromJpeg(TILE) : die "Regression tests require PNG, GIF or JPEG support in libgd"; close TILE; return unless $tile; $im->setBrush($tile); $im->arc(100,100,100,150,0,360,gdBrushed); $im->setTile($tile); $im->filledRectangle(150,150,250,250,gdTiled); $im->rectangle(150,150,250,250,$black); $im->setStyle($green,$green,$green,gdTransparent,$red,$red,$red,gdTransparent); $im->line(0,280,300,280,gdStyled); return image($im) } sub test3 { my($im) = new GD::Image(300,300); my($white,$black,$red,$blue,$yellow) = ( $im->colorAllocate(255, 255, 255), $im->colorAllocate(0, 0, 0), $im->colorAllocate(255, 0, 0), $im->colorAllocate(0,0,255), $im->colorAllocate(255,250,205) ); my($brush) = new GD::Image(10,10); $brush->colorAllocate(255,255,255); # white $brush->colorAllocate(0,0,0); # black $brush->transparent($white); # white is transparent $brush->filledRectangle(0,0,5,2,$black); # a black rectangle $im->setBrush($brush); $im->arc(100,100,100,150,0,360,gdBrushed); my($poly) = new GD::Polygon; $poly->addPt(30,30); $poly->addPt(100,10); $poly->addPt(190,290); $poly->addPt(30,290); $im->polygon($poly,gdBrushed); $im->fill(132,62,$blue); $im->fill(100,70,$red); $im->fill(40,40,$yellow); $im->interlaced(1); $im->copy($im,150,150,20,20,50,50); $im->copyResized($im,10,200,20,20,100,100,50,50); return image($im) } sub test4 { my($im) = new GD::Image(100,50); my($black,$white,$red,$blue) = ( $im->colorAllocate(0, 0, 0), $im->colorAllocate(255, 255, 255), $im->colorAllocate(255, 0, 0), $im->colorAllocate(0,0,255) ); $im->arc(50, 25, 98, 48, 0, 360, $white); $im->fill(50, 21, $red); return image($im) } sub test5 { my($im) = new GD::Image(225,180); my($black,$white,$red,$blue,$yellow) = ($im->colorAllocate(0, 0, 0), $im->colorAllocate(255, 255, 255), $im->colorAllocate(255, 0, 0), $im->colorAllocate(0,0,255), $im->colorAllocate(255,250,205) ); my($poly) = new GD::Polygon; $poly->addPt(0,50); $poly->addPt(25,25); $poly->addPt(50,50); $im->filledPolygon($poly,$blue); $poly->offset(100,100); $im->filledPolygon($poly,$red); $poly->map(50,50,100,100,10,10,110,60); $im->filledPolygon($poly,$yellow); $poly->map($poly->bounds,50,20,80,160); $im->filledPolygon($poly,$white); return image($im) } sub test6 { my($im) = new GD::Image(300,300); my($white,$black,$red,$blue,$yellow) = ( $im->colorAllocate(255, 255, 255), $im->colorAllocate(0, 0, 0), $im->colorAllocate(255, 0, 0), $im->colorAllocate(0,0,255), $im->colorAllocate(255,250,205) ); $im->transparent($white); $im->interlaced(1); my($brush) = new GD::Image(10,10); $brush->colorAllocate(255,255,255); $brush->colorAllocate(0,0,0); $brush->transparent($white); $brush->filledRectangle(0,0,5,2,$black); $im->string(gdLargeFont,150,10,"Hello world!",$red); $im->string(gdSmallFont,150,28,"Goodbye cruel world!",$blue); $im->stringUp(gdTinyFont,280,250,"I'm climbing the wall!",$black); $im->charUp(gdMediumBoldFont,280,280,"Q",$black); $im->setBrush($brush); $im->arc(100,100,100,150,0,360,gdBrushed); $poly = new GD::Polygon; $poly->addPt(30,30); $poly->addPt(100,10); $poly->addPt(190,290); $poly->addPt(30,290); $im->polygon($poly,gdBrushed); $im->fill(132,62,$blue); $im->fill(100,70,$red); $im->fill(40,40,$yellow); return image($im) } sub test7 { my $dtor = 0.0174533; my $pi = 3.141592654; my $xsize = 500; my $ysize = 500; my $scale = 1; my $x_offset = $xsize/2; my $y_offset = $ysize/2; my $im = new GD::Image($xsize,$ysize); my $poly = new GD::Polygon; my $col_bg = $im->colorAllocate(0,0,0); my $col_fg = $im->colorAllocate(255,255,0); my $col_fill = $im->colorAllocate(255,0,0); my $r_0 = 100; my $theta_0 = 20; my $spring_factor = 30; for($theta=0;$theta<=360;$theta++) { my $r = $r_0 + $spring_factor*sin(2*$pi*$theta/$theta_0); my $x = int($r * cos($theta*$dtor))*$scale+$x_offset; my $y = int($r * sin($theta*$dtor))*$scale+$y_offset; $poly->addPt($x,$y); } $im->filledPolygon($poly,$col_fill); # Call gdImageFilledPolygon() return image($im) } sub test8 { my $im = GD::Image->new(400,250); if (!$im) { printf("Test7: no image");}; my($white,$black,$red,$blue,$yellow) = ( $im->colorAllocate(255, 255, 255), $im->colorAllocate(0, 0, 0), $im->colorAllocate(255, 0, 0), $im->colorAllocate(0,0,255), $im->colorAllocate(255,250,205) ); # Some TTFs $im->stringFT($black,FONT,12.0,0.0,20,20,"Hello world!") || warn $@; $im->stringFT($red,FONT,14.0,0.0,20,80,"Hello world!") || warn $@; $im->stringFT($blue,FONT,30.0,-0.5,60,100,"Goodbye cruel world!") || warn $@; return image($im) } sub test9 { my $fn = shift; my $im = GD::Image->newFromXpm($fn); return image($im) } sub test10 { my $fn = shift; my $im = GD::Image->newFromJpeg($fn); return image($im) } # not used sub test11 { my $fn = shift; my $im = GD::Image->newFromGif($fn); $im->gif; } sub image { my $gd = shift; return $suffix eq 'png' ? $gd->png :$suffix eq 'gif' ? $gd->gif :$suffix eq 'jpeg'? $gd->jpeg :undef; }