#!/usr/bin/perl use strict; use Math::BigInt; use Math::BigFloat; use File::Temp; use SVG; die("Usage: width height logfile [output]\n") if (@ARGV < 3); my $w = $ARGV[0]; my $h = $ARGV[1]; my $lf = $ARGV[2]; my $of = $ARGV[3]; open LF,"<$lf" or die("cannot open file: $lf\n"); my @data; foreach() { next if /^#/; next if /^(0x[0-9A-F]+) +([-+?\/])$/; /^(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 $s = SVG->new(width => $w, height => $h); my $l = @data; my $total = $data[$l-1][0] + $data[$l-1][1]; my $pixels = $w * $h; my $bpp = new Math::BigFloat($total) / $pixels; my %colors = ( '-'=>'rgb(160,0,0)', '?'=>'rgb(160,160,0)', '/'=>'rgb(200,120,100)' ); my %groups; for(keys %colors) { $groups{$_} = $s->group(style => { fill => $colors{$_}}); } my $x = 0; my $y = 0; for(@data) { my $size = $_->[1]; my $pix = new Math::BigFloat($size) / $bpp; my $stat = $_->[2]; my $group = $groups{$stat}; while($x + $pix > $w) { my $w_r = $w - $x; $group->rect(x => "$x", y => $y, width => "$w_r", height => 1) if $group; $pix -= ($w - $x); $x = 0; $y++; } $group->rect(x => "$x", y => $y, width => "$pix", height => 1) if $group && ($pix > 0); $x += $pix; } my $fh; if (!$of) { $fh = File::Temp->new(); } else { open $fh,">$of"; } print $fh $s->xmlify; close $fh; system('inkscape', $fh->filename) if !$of;