#!/usr/bin/perl

$first = 1;
while (<>) {
    if (/^Motion notify ([\d]+) ([\d]+) (\-?[\d]+)/) {
	$x = $1;
	$y = $2;
	push @x, $x;
	push @y, $y;
	push @press, $3;
	if ($first) {
	    $xmin = $x;
	    $xmax = $x;
	    $ymin = $y;
	    $ymax = $y;
	} else {
	    $xmin = $x if $xmin > $x;
	    $xmax = $x if $xmax < $x;
	    $ymin = $y if $ymin > $y;
	    $ymax = $y if $ymax < $y;
	}
	$first = 0;
    }
}

$scalex = 540 / ($xmax - $xmin);
$scaley = 720 / ($ymax - $ymin);
if ($scalex < $scaley) {
    $scale = $scalex;
} else {
    $scale = $scaley;
}

print "%!PS-Adobe-1.0\n";
print "36 756 translate\n";
printf "%g %g scale\n", $scale, -$scale;
printf "%d %d translate\n", -$xmin, -$ymin;
print "1 setlinejoin\n";

print ".75 .75 .75 setrgbcolor\n";

printf "%g setlinewidth\n", 5 / $scale;

$str = "moveto";
for ($i = 0; $i < @x; $i++) {
    if ($press[$i] > -480) {
	print "$x[$i] $y[$i] $str % $press[$i]\n";
	$str = "lineto";
    } else {
	if ($str eq "lineto") {
	    print "stroke\n";
	    $str = "moveto";
	}
	print "% $x[$i] $y[$i] $press[$i]\n";
    }
}

if ($str eq "lineto") {
    print "stroke\n";
    $str = "moveto";
}

if (1) {
print "1 0 0 setrgbcolor\n";
printf "%g setlinewidth\n", 0.25 / $scale;

$str = "moveto";
for ($i = 0; $i < @x; $i++) {
    print "$x[$i] $y[$i] $str % $press[$i]\n";
    $str = "lineto";
}

print "stroke\n";
}

sub predict {
    my ($i, $xx) = @_;
    my ($xavg, $x1avg, $xpred);

    $xavg = ($$xx[$i - 3] + $$xx[$i - 2] + $$xx[$i - 1]) / 3.0;
    $x1avg = (-$$xx[$i - 3] + $$xx[$i - 1]) / 2.0;
    $xpred = $xavg + 2 * $x1avg;
    return $xpred;
}

printf "%g setlinewidth\n", 0.25 / $scale;

print "0 0 0 setrgbcolor\n";

$str = "moveto";
$hushx = 0;
$hushy = 0;
for ($i = 0; $i < @x; $i++) {
    $x = $x[$i];
    $y = $y[$i];
    $pdx = "_";
    $pdy = "_";
    if ($hushx >= 3) {
	$xpred = predict ($i, \@x);
	$dx = $x - $xpred;
	$pdx = sprintf ("%g", $dx);
	if (abs ($dx) > 32) {
	    $pdx .= "!";
	    $x = $xpred;
	    $hushx = -1;
	}
	$pdx = sprintf ("%.2f", $dx);
    }
    $hushx++;
    if ($hushy >= 3) {
	$ypred = predict ($i, \@y);
	$dy = $y - $ypred;
	$pdy = sprintf ("%.2f", $dy);
	if (abs ($dy) > 32) {
	    $pdy .= "!";
	    $y = $ypred;
	    $hushy = -1;
	}
    }
    $hushy++;

    $x2 = ($x + $xold) * 0.5;
    $xold = $x;

    $y2 = ($y + $yold) * 0.5;
    $yold = $y;
    print "$x2 $y2 $str % ($pdx $pdy) $press[$i]\n";
    $str = "lineto";
}

print "stroke\n";

print "showpage";

