#!/usr/bin/perl -w

die "Usage: genrom.pl <input texture image list file>\n" unless $#ARGV==0;

$root = $ENV{ROOT};
$cnt = 0; 
$byte_cnt = 0;

# open(OUT_DATA, ">tex.data") or die "Can't open tex.data: $!";

sub align_16 {
    while ($byte_cnt & 0x7) {
        printf OUT_DATA "%c", 0;
        $byte_cnt ++;
    }
    for( $i = 0; $i < 8; $i++ ) { 
      printf OUT_DATA "%c", 0x77;
      $byte_cnt++;
    }
}

sub write_int {
    my $val = shift;
    printf OUT_DATA "%c", ($val&0xFF000000) >> 24;
    printf OUT_DATA "%c", ($val&0x00FF0000) >> 16;
    printf OUT_DATA "%c", ($val&0x0000FF00) >> 8;
    printf OUT_DATA "%c", ($val&0x000000FF);
    $byte_cnt += 4;
}

sub write_short {
    my $val = shift;
    printf OUT_DATA "%c", (hex($val)&0xFF00) >> 8;
    printf OUT_DATA "%c", (hex($val)&0x00FF);
    $byte_cnt += 2;
}

sub write_byte {
    my $val = shift;
    printf OUT_DATA "%c", (hex($val)&0xFF);
    $byte_cnt += 1;
}

`dd bs=118608 count=1 if=rom of=rom_base`;
`cp rom_base my_rom`;
open(OUT_DATA,">>my_rom");
binmode(OUT_DATA);

$inlist = shift;

open(IN_LIST, "<$inlist") or die "Can't open $inlist: $!";
while (<IN_LIST>) {
    if (/^(\d+) (\d+) (.+)\.(rgb|rgba|sgi|inta|ia|i)/) {
        $cnt ++;
    }
}
write_int($cnt);
close IN_LIST;

open(IN_LIST, "<$inlist") or die "Can't open $inlist: $!";
while (<IN_LIST>) {
    $init = 0;
    if (/^(\d+) (\d+) (RGBA|IA)_(32|16|8|4) (.+)\.(rgb|rgba|sgi|inta|ia|i)/) {
        $x = $1; 
        $y = $2;
        $type = $3;
        $bpp = $4;
        $name = $5;
        print "rgb2c $name.$6 to $name.h ...\n";
        `$root/usr/sbin/rgb2c -F -f $type -s $bpp -m $name $name.$6 > $name.h`;
        
        open(TMP_H, "<$name.h");
        while (<TMP_H>) {
            if (/ \*   Size: (\d+) x (\d+)/) {
                $w = $1;
                $h = $2; 
            } elsif (/^unsigned /) {
                align_16();
                print "  width  = ",$w, "\n"; write_int($w);
                print "  height = ",$h, "\n"; write_int($h);
                print "  type   = ",$type, $bpp, "\n"; 
                if ($bpp=~/32/ && $type=~/RGBA/) {
                    write_int(0);
                } elsif ($bpp=~/16/) {
                    if ($type=~/RGBA/) {
                        write_int(1);
                    } elsif ($type=~/IA/) {
                        write_int(2);
                    }
                } elsif ($bpp=~/8/ && $type=~/IA/) {
                    write_int(3);
                } elsif ($bpp=~/4/ && $type=~/IA/) {
                    write_int(4);
                }
                write_int($x);
                write_int($y);
#dummy alignment values
                write_int(0); 
                write_int(0); 
                write_int(0); 
                $init = 1;
            } elsif (/^\s+0x/) {
                @pixel = split /,\s*/;
                foreach $rgba (@pixel) {
                    $rgba =~ s/^\s*//;
                    if ($bpp=~/16/) {
                        write_short ($rgba);
                    } else {
                        write_byte ($rgba);
                    }
                }
            }
        }
        close TMP_H;
        if ($init==0) {
            print "Error generating header info for image $name.$6\n";
        } else {
            `/bin/rm -f $name.h`;
        }
    }
}
close IN_LIST;
close OUT_DATA;

print "Please load my_rom to view the textures on your TV monitor.\n";
