#!/usr/bin/perl use strict; use Math::BigInt; use Math::BigFloat; use Image::Magick; die("Usage: width height logfile [output]\n") if (@ARGV < 3); my $w = $ARGV[0]; my $h = $ARGV[1]; my $lf = $ARGV[2]; my $fn = $ARGV[3]; open LF,"<$lf" or die("cannot open file: $lf\n"); my @data; foreach() { next if /^#/; /^(0x[0-9A-F]+) +(0x[0-9A-F]+) +([-+?\/])$/ or die("cannot parse line: $_\n"); my $start = new Math::BigInt($1); my $size = new Math::BigInt($2); my $status = $3; push @data,[$start, $size, $status]; } close LF; my $l = @data; my $total = $data[$l-1][0] + $data[$l-1][1]; my $pixels = $w * $h; my $bpp = $total / $pixels; $bpp = int($bpp/100)*100+100; my %colors = ( ' '=>'000000', '+'=>'00b800', '-'=>'df0000', '?'=>'cdd800', '/'=>'d68c8a' ); my @colorvals; foreach(keys %colors) { my $c = $colors{$_}; my $cb = ''; $cb .= pack 'C',hex $1 while($c =~ /(\w{2})/g); $colors{$_} = pack 'C',scalar @colorvals; push @colorvals, $cb; } my $i = "id=ImageMagick\n"; $i .= "class=PseudoClass\n"; $i .= "colors=".(scalar @colorvals)."\n"; $i .= "columns=$w\n"; $i .= "rows=$h\n"; $i .= ":\n"; $i .= join '',@colorvals; my $idx = 0; my $pos = new Math::BigInt(0); while($pos < $total) { my $r; my $en; do { $r = $data[$idx]; my $st = $$r[0]; $en = $$r[1] + $st; $idx++ if ($pos >= $en); } until ($pos < $en); my $n = ($en - $pos)/$bpp; $n = 1 if ($n == 0); $i .= $colors{$$r[2]} x $n; $pos += $bpp * $n; } $i .= $colors{' '}x($w*$h - $idx) if ($idx < $w*$h); my $im = Image::Magick->new; my $x = $im->BlobToImage($i); warn "$x" if "$x"; #$im->Set(size=>($w."x".$h)); if ($fn) { my $x = $im->Write(filename=>$fn); warn "$x" if "$x"; } else { $im->Display(); }