#!/usr/bin/perl -w # convert a VM bitmap from a pbm ascii file into assembler source for aslc68k # prints source to stdout # image size 48 x 32 pixel, colordepth 24bpp, only 2 colors used # written by Soeren Gust, sgust@ithh.informationstheater.de # not very good commented, sorry. use strict; open(FILE, $ARGV[0]) or die "Can't open file"; my ($filetype, $size, $color) = ("#", "#", "#"); while($filetype =~ /^#/) { chomp($filetype = ); } if ($filetype ne "P3") { die "Wrong filetype"; } while($size =~ /^#/) { chomp($size = ); } if ($size ne "48 32") { die "Wrong size"; } while($color =~ /^#/) { chomp($color = ); } if ($color ne "255") { die "Wrong colordepth"; } my ($red, $green, $blue, $vmscolor, $indexcolor, @palette, @bitmap); my $maxcolor = 0; for my $y (0..31) { for my $x (0..47) { chomp($red = ); chomp($green = ); chomp($blue = ); $red = $red >> 4; $green = $green >> 4; $blue = $blue >> 4; $vmscolor = 0xf000 + 256 * $red + 16 * $green + $blue; $indexcolor = -1; for my $i (0..$maxcolor-1) { if ($palette[$i] == $vmscolor) { $indexcolor = $i; last; } } if ($indexcolor == -1) { $indexcolor = $maxcolor; $palette[$maxcolor++] = $vmscolor; if ($maxcolor > 2) { die "Too many colors"; } } $bitmap[$y*48+$x] = $indexcolor; } } # fill up palette with white for my $i ($maxcolor..1) { $palette[$i] = 0xffff; } # invert if necessary, check could be much better if ($palette[0] < $palette[1]) { for my $i (0..32*48-1) { $bitmap[$i] = 1 - $bitmap[$i]; } } # print icon bitmap print "; bitmap generated by ppmtovmbitmap.pl\n"; my $p = 0; for my $y (0..31) { print "\011.byte "; for my $x (0..5) { printf "\$%02x", ($bitmap[$p] << 7) + ($bitmap[$p+1] << 6) + ($bitmap[$p+2] << 5) + ($bitmap[$p+3] << 4) + ($bitmap[$p+4] << 3) + ($bitmap[$p+5] << 2) + ($bitmap[$p+6] << 1) + $bitmap[$p+7]; $p += 8; print ',' unless ($x == 5); } print "\n"; }