#!/usr/bin/perl

use GD;

$size = 100; #size of image

$pmax = $size * $size; #1000000;
$primes = primes($pmax);

$max = $size; #1000;
($x,$y) = ($max/2,$max/2);
$dir = 1;
$i = 1;

$img = new GD::Image($max,$max,1);
$img->fill(10,5,color(255,255,255));

$streak = 0;
@dists = ();
for(1..$size) { push @dists,($_,$_); }
$dist = 1;
$disti = 0;
$grid[$x][$y] = 1;
while($i < $pmax) {
    if($x < $max && $y < $max && $x >=0 && $y >= 0) {
	if($primes->{$i}) {
	    $grid[$x][$y] = $i;
	}
    }
    #print "Setting $i at $x,$y\n";
    if($dir == 1) { $x++; }
    elsif($dir == 2) { $y--; }
    elsif($dir == 3) { $x--; }
    elsif($dir == 4) { $y++; }
    $dist++;
    if($dist > $dists[$disti]) {
	$disti++;
	$dir++;
	if($dir > 4) { $dir = 1;}
	$dist = 1;
    }
    $i++;
}
#$img->string(gdTinyFont,10,10,$i,color(0,0,0));
for($y=0;$y<$max;$y++) {
    for($x=0;$x<$max;$x++) {
	#if($grid[$x][$y]) { print sprintf("%2d",$i); }
	#if($grid[$x][$y]) { $img->setPixel($x,$y,color(255,0,0)); }
	if($grid[$x][$y]) {
#	    unless($grid[$x][$y] % 13) {
		$img->setPixel($x,$y,color(127,127,255));
#	    }
#	    if($grid[$x][$y] == 1) {
#		$img->setPixel($x,$y,color(255,0,0));
#	    } elsif($grid[$x][$y] == 2) {
#		$img->setPixel($x,$y,color(255,255,0));
#	    } elsif($grid[$x][$y] == 3) {
#		$img->setPixel($x,$y,color(0,255,0));
#	    } elsif($grid[$x][$y] == 5) {
#		$img->setPixel($x,$y,color(0,255,255));
#	    } elsif($grid[$x][$y] == 7) {
#		$img->setPixel($x,$y,color(0,0,255));
#	    } elsif($grid[$x][$y] == 11) {
#		$img->setPixel($x,$y,color(255,0,255));
#	    } elsif($grid[$x][$y] == 13) {
#		$img->setPixel($x,$y,color(128,128,255));
#	    } else {
#		$img->setPixel($x,$y,color(223,223,223));
#	    }
	    if($grid[$x][$y] > $max_disp) { $max_disp = $grid[$x][$y]; }
	    unless($grid[$x][$y] % 50000) {
		#$img->string(gdTinyFont,$x+2,$y+2,$grid[$x][$y],color(0,0,0));
	    }
	    if($grid[$x][$y] >= $i-1) {
		#$img->string(gdTinyFont,$x+2,$y+2,$grid[$x][$y],color(0,0,0));
	    }
	}
    }
}
#$img->string(gdTinyFont,10,20,$max_disp,color(0,0,0));
#$img->string(gdTinyFont,10,30,$maxstreak,color(0,0,0));
#$img->string(gdTinyFont,10,40,$topstreak,color(0,0,0));

print "Content-Type: image/png\n\n";
print $img->png;

sub get_rgb {
    my($val) = @_;
    $val = int(($val/1000) % 768);
    my($r,$g,$b);
    if($val <= 255) {
	$r = $val;
	$b = 255-$val;
	$g = 0;
    } elsif($val <= 511) {
	$g = $val-256;
	$r = 255-($val-256);
	$b = 0;
    } else {
	$b = $val-512;
	$g = 255-($val-512);
	$r = 0;
    }
    return color($r,$g,$b);
}

sub primes {
    my($n) = @_;
    my($i,$j,%primes,%notprimes);
    for($i=2;$i<=$n;$i++) {
        if(!$notprimes{$i}) {
            $primes{$i} = 1;
            for($j=($i**2);$j<=$n;$j+=$i) {
                $notprimes{$j} = 1;
            }
        }
    }
    return \%primes;
}

sub color {
    my($r,$g,$b) = @_;
    if(!defined($pal{"$r\_$g\_$b"})) {
        $pal{"$r\_$g\_$b"} = $img->colorAllocate($r,$g,$b);
    }
    return $pal{"$r\_$g\_$b"};
}
