#! /usr/bin/perl

sub load_files {
    if($#ARGV != 1) {
	print "please invoke program like: ./sobel.pl <input image> <output image>\n";
	die;
    }
    open(INFILE,"<$ARGV[0]") || die "Could not open file $ARGV[0] for reading\n";
    open(OUTFILE,">$ARGV[1]") || die "Could not open file $ARGV[1] for writing\n";
}

sub parse_infile {
    $line_count = 1;
    $row_counter = 0;
    $col_counter = 0;
    @$row_counter=();
    while($line=<INFILE>) {
	chop($line);
	if($line_count==1) {
	    print OUTFILE "$line\n";
	    $line_count=$line_count+1;
	    $num=substr($line,1,1);
	}
	elsif($line_count==2) {
	    print OUTFILE "#Creator: sobel.pl\n";
	    $line_count=$line_count+1;
	}
	elsif($line_count==4) {
	    print OUTFILE "$line\n";
	    $line_count=$line_count+1;
	}
	elsif($line_count==3) {
	    $line_count=$line_count+1;
	    print OUTFILE "$line\n";
	    @info = split(/\s+/,$line);
	    $width=$info[0];
	    if($num==3) {
		$width = $width*3;
	    }
	    else {
		$num=1;
	    }
	    $height = $info[1];
	}
	else {
	    if($col_counter == $width) {
		$col_counter = 0;
		$row_counter = $row_counter + 1;
	        @$row_counter=();
	    }
	    $$row_counter[$col_counter]=$line;
	    $col_counter = $col_counter + 1;
	}
	    
    }
}

sub getval {
    ($get_row,$get_col) = @_;
    if($get_row<0) {
	$get_row=0;
    }
    elsif($get_row>=$height) {
	$get_row=$height-1;
    }
    if($get_col<0) {
	$get_col=$get_col+$num;
    }
    elsif($get_col>$width) {
	$get_col=$width-$num;
    }
    return $$get_row[$get_col];
}

sub manipulate_data {
    for($rn=0; $rn<$height; $rn=$rn+1) {
	for ($cn=0; $cn<$width; $cn=$cn+1) {
	    $rnminus1 = $rn - 1;
	    $rnplus1 = $rn + 1;
	    $cnminus1 = $cn-1*$num;
	    $cnplus1 = $cn+1*$num;
	    $a = getval($rnminus1,$cnminus1);
	    $b = getval($rnminus1,$cn);
	    $c = getval($rnminus1,$cnplus1);
	    $d = getval($rn,$cnminus1);
	    $f = getval($rn,$cnplus1);
	    $g = getval($rnplus1,$cnminus1);
	    $h = getval($rnplus1,$cn);
	    $i = getval($rnplus1,$cnplus1);
	    $x = $c + 2.0*$f + $i - 
		($a + 2.0*$d + $g);
	    $y = $a + 2.0*$b + $c -
		($g + 2.0*$h + $i);
	    if($x<0){
		$x=$x*-1;
	    }
	    if($y<0){
		$y=$y*-1;
	    }
	    if($x>$y) {
		$temp[$nn]=$x;
	    }
	    else {
		$temp[$nn]=$y;
	    }
	    print OUTFILE "$temp[0]\n";
	}
    }
}

MAIN:
    load_files();
parse_infile();
manipulate_data();
close(INFILE);
close(OUTFILE);

