#!/usr/bin/perl
#
#     Copyright (C) 1997 Claus-Justus Heine
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING.  If not, write to
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
#
#   This _UGLY_ script creates an input file for the tgif 2D gfx program
#   consisiting of several pages that make up an animation sequence.
#
#   TODO: make it scalable
#

$version = <<EOT;
animtape-1.0 -- an _UGLY_  perl script to generate an animation sequence of 
simplified tape cartridges

RCS $Revision: 1.5 $
RCS $Date: 1997/09/20 00:11:35 $"
EOT

$usage = <<EOT;
Usage: animtape [options ...]

Mandatory or optional arguments to long options are mandatory or optional
for short options too.

  -f  --file            Output file. Default is "animfoo.obj".
  -n  --step            The increment/decrement of the tape spindels measured
                        in pixels. Default is 5.
  -s  --scale           Fraction to scale the image size with. The default
                        size is 412x312 pixels. UNIMPLEMENTED
  -h, --help            Print this help.
  -?                    Same as '-h'.
      --usage           Same as '-h'.
  -V, --version         Print version information.

Author: Claus-Justus Heine <claus\@momo.math.rwth-aachen.de>
EOT

$step = 5;
$scale= 1.0;
$file = "animfoo.obj";

while ($ARGV[0] =~ /^-/) { 
    $_ = shift; 
    if (/--file/) {$_ = shift; $file = $_; next;} 
    if (/-f/) {$_ = shift; $file = $_; next;} 
    if (/--step/) {$_ = shift; $step = $_; next;} 
    if (/-n/) {$_ = shift; $step = $_; next;} 
    if (/--scale/) {$_ = shift; $scale = $_; next;} 
    if (/-s/) {$_ = shift; $scale = $_; next;} 
    if (/--help/) { print $usage; exit 0; }
    if (/-h/) { print $usage; exit 0; }
    if (/--usage/) { print $usage; exit 0; }
    if (/-\?/) { print $usage; exit 0; }
    if (/--version/) { print $version; exit 0; }
    if (/-V/) { print $version; exit 0; }
    die $usage;
}

if ($scale < 0.5) {
    $lw = 0.5;
} else {
    $lw = 1.0;
}

$footer = <<EOT;
oval('black',264*$scale,128*$scale,280*$scale,144*$scale,2,1,1,24,0,0,0,0,0,'1',[
]).
oval('black',120*$scale,128*$scale,136*$scale,144*$scale,2,1,1,40,0,0,0,0,0,'1',[
]).
oval('white',369*$scale,264*$scale,391*$scale,288*$scale,1,1,1,330,0,0,0,0,0,'1',[
]).
oval('white',32*$scale,264*$scale,54*$scale,288*$scale,1,1,1,331,0,0,0,0,0,'1',[
]).
oval('black',369*$scale,264*$scale,391*$scale,288*$scale,0,4*$lw,1,330,0,0,0,0,0,'1',[
]).
oval('black',32*$scale,264*$scale,54*$scale,288*$scale,0,4*$lw,1,331,0,0,0,0,0,'1',[
]).
poly('black',2,[
	381*$scale,288*$scale,43*$scale,288*$scale],0,2*$lw,1,336,0,1,0,0,8,3,0,0,0,'1','8','3',
     "0",[
]).
oval('black',174*$scale,234*$scale,226*$scale,286*$scale,1,1,1,349,0,0,0,0,0,'1',[
]).
oval('white',80*$scale,88*$scale,176*$scale,184*$scale,0,4*$lw,1,365,0,0,0,0,0,'1',[
]).
oval('white',224*$scale,88*$scale,320*$scale,184*$scale,0,4*$lw,1,412,0,0,0,0,0,'1',[
]).
EOT

$r   = (54*$scale - 32*$scale)/2;
$m1x = 32*$scale + $r;
$m2x = 369*$scale + $r;
$my  = 264*$scale + $r;

$bar1 = <<HERE;
box('white',128*$scale,132*$scale,174*$scale,140*$scale,1,1,1,273,0,0,0,1,0,'1',[
    179*$scale,125*$scale,179*$scale,125*$scale,187*$scale,173*$scale,0,1000,-1000,0,-3*$scale,7*$scale],[
]).
HERE
$bar2 = <<HERE;
box('white',124*$scale,100*$scale,164*$scale,140*$scale,1,1,1,382,0,0,0,1,0,'1',[
    157*$scale,103*$scale,157*$scale,103*$scale,165*$scale,151*$scale,707,707,-707,707,1*$scale,-3*$scale],[
]).
HERE
$bar3 = <<HERE;
box('white',124*$scale,88*$scale,132*$scale,136*$scale,1,1,1,262,0,0,0,0,0,'1',[
]).
HERE
$bar4 = <<HERE;
box('white',92*$scale,100*$scale,132*$scale,140*$scale,1,1,1,385,0,0,0,1,0,'1',[
    91*$scale,103*$scale,91*$scale,103*$scale,99*$scale,151*$scale,707,-707,707,707,1,3],[
]).
HERE
$bar5 = <<HERE;
box('white',80*$scale,132*$scale,128*$scale,140*$scale,1,1,1,277,0,0,0,1,0,'1',[
    131*$scale,125*$scale,131*$scale,125*$scale,139*$scale,173*$scale,0,1000,-1000,0,-3*$scale,7*$scale],[
]).
HERE
$bar6 = <<HERE;
box('white',92*$scale,132*$scale,132*$scale,172*$scale,1,1,1,384*$scale,0,0,0,1,0,'1',[
    125*$scale,135*$scale,125*$scale,135*$scale,133*$scale,183*$scale,707,707,-707,707,1*$scale,-3*$scale],[
]).
HERE
$bar7 = <<HERE;
box('white',124*$scale,136*$scale,132*$scale,184*$scale,1,1,1,265,0,0,0,0,0,'1',[
]).
HERE
$bar8 = <<HERE;
box('white',124*$scale,132*$scale,164*$scale,172*$scale,1,1,1,387,0,0,0,1,0,'1',[
    123*$scale,135*$scale,123*$scale,135*$scale,131*$scale,183*$scale,707,-707,707,707,1,3],[
]).
HERE

$bar9 = <<HERE;
box('white',268*$scale,136*$scale,276*$scale,184*$scale,1,1,1,409,0,0,0,0,0,'1',[
]).
HERE
$bar10 = <<HERE;
box('white',268*$scale,132*$scale,308*$scale,172*$scale,1,1,1,416,0,0,0,1,0,'1',[
    267*$scale,135*$scale,267*$scale,135*$scale,275*$scale,183*$scale,707,-707,707,707,1,3],[
]).
HERE
$bar11 = <<HERE;
box('white',272*$scale,132*$scale,320*$scale,140*$scale,1,1,1,410,0,0,0,1,0,'1',[
    323*$scale,125*$scale,323*$scale,125*$scale,331*$scale,173*$scale,0,1000,-1000,0,-3*$scale,7*$scale],[
]).
HERE
$bar12 = <<HERE;
box('white',268*$scale,100*$scale,308*$scale,140*$scale,1,1,1,413,0,0,0,1,0,'1',[
    301*$scale,103*$scale,301*$scale,103*$scale,309*$scale,151*$scale,707,707,-707,707,1*$scale,-3*$scale],[
]).
HERE
$bar13 = <<HERE;
box('white',268*$scale,88*$scale,276*$scale,136*$scale,1,1,1,408,0,0,0,0,0,'1',[
]).
HERE
$bar14 = <<HERE;
box('white',236*$scale,100*$scale,276*$scale,140*$scale,1,1,1,415,0,0,0,1,0,'1',[
    235*$scale,103*$scale,235*$scale,103*$scale,243*$scale,151*$scale,707,-707,707,707,1,3],[
]).
HERE
$bar15 = <<HERE;
box('white',224*$scale,132*$scale,272*$scale,140*$scale,1,1,1,411,0,0,0,1,0,'1',[
    275*$scale,125*$scale,275*$scale,125*$scale,283*$scale,173*$scale,0,1000,-1000,0,-3*$scale,7*$scale],[
]).
HERE
$bar16 = <<HERE;
box('white',236*$scale,132*$scale,276*$scale,172*$scale,1,1,1,414,0,0,0,1,0,'1',[
    269*$scale,135*$scale,269*$scale,135*$scale,277*$scale,183*$scale,707,707,-707,707,1*$scale,-3*$scale],[
]).
HERE

$move1 = <<HERE;
poly('white',2,[
	64*$scale,288*$scale,80*$scale,288*$scale],0,2*$lw,1,429,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$move2 = <<HERE;
poly('white',2,[
	96*$scale,288*$scale,112*$scale,288*$scale],0,2*$lw,1,435,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$move3 = <<HERE;
poly('white',2,[
	128*$scale,288*$scale,144*$scale,288*$scale],0,2*$lw,1,431,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$move4 = <<HERE;
poly('white',2,[
	160*$scale,288*$scale,176*$scale,288*$scale],0,2*$lw,1,436,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$move5 = <<HERE;
poly('white',2,[
	192*$scale,288*$scale,208*$scale,288*$scale],0,2*$lw,1,432,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$move6 = <<HERE;
poly('white',2,[
	224*$scale,288*$scale,240*$scale,288*$scale],0,2*$lw,1,437,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$move7 = <<HERE;
poly('white',2,[
	256*$scale,288*$scale,272*$scale,288*$scale],0,2*$lw,1,433,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$move8 = <<HERE;
poly('white',2,[
	288*$scale,288*$scale,304*$scale,288*$scale],0,2*$lw,1,438,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$move9 = <<HERE;
poly('white',2,[
	320*$scale,288*$scale,336*$scale,288*$scale],0,2*$lw,1,434,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$move10 = <<HERE;
poly('white',2,[
	352*$scale,288*$scale,368*$scale,288*$scale],0,2*$lw,1,439,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE

$sbar1 = <<HERE;
poly('white',2,[
	200*$scale,260*$scale,224*$scale,260*$scale],0,2*$lw,1,2348,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$sbar2 = <<HERE;
poly('white',2,[
	216*$scale,268*$scale,216*$scale,244*$scale],0,2*$lw,1,2353,0,0,0,0,10,4,0,1,0,'2','10','4',
    "0",[
	216*$scale,244*$scale,216*$scale,244*$scale,216*$scale,268*$scale,707,707,-707,707,0,0],[
]).
HERE
$sbar3 = <<HERE;
poly('white',2,[
	200*$scale,260*$scale,200*$scale,236*$scale],0,2*$lw,1,2350,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$sbar4 = <<HERE;
poly('white',2,[
	184*$scale,268*$scale,184*$scale,244*$scale],0,2*$lw,1,2357,0,0,0,0,10,4,0,1,0,'2','10','4',
    "0",[
	184*$scale,244*$scale,184*$scale,244*$scale,184*$scale,268*$scale,707,-707,707,707,0,0],[
]).
HERE
$sbar5 = <<HERE;
poly('white',2,[
	176*$scale,260*$scale,200*$scale,260*$scale],0,2*$lw,1,2349,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$sbar6 = <<HERE;
poly('white',2,[
	200*$scale,284*$scale,200*$scale,260*$scale],0,2*$lw,1,2355,0,0,0,0,10,4,0,1,0,'2','10','4',
    "0",[
	200*$scale,260*$scale,200*$scale,260*$scale,200*$scale,284*$scale,707,707,-707,707,0,0],[
]).
HERE
$sbar7 = <<HERE;
poly('white',2,[
	200*$scale,280*$scale,200*$scale,256*$scale],0,2*$lw,1,2351,0,0,0,0,10,4,0,0,0,'2','10','4',
    "0",[
]).
HERE
$sbar8 = <<HERE;
poly('white',2,[
	200*$scale,284*$scale,200*$scale,260*$scale],0,2*$lw,1,2359,0,0,0,0,10,4,0,1,0,'2','10','4',
    "0",[
	200*$scale,260*$scale,200*$scale,260*$scale,200*$scale,284*$scale,707,-707,707,707,0,0],[
]).
HERE

#$left1=32;
#$top1=40;
#$right1=224;
#$bottom1=232;

$left1=14*$scale;
$top1=22*$scale;
$right1=242*$scale;
$bottom1=250*$scale;

$maxd = $right1 - $left1;

$pages = int(($maxd - 32*$scale) / ($step * 2)) + 1;

$mind = $maxd - ($pages - 1) * $step * 2;

print "$mind, $maxd, $pages, $step\n";

$left2  = 272*$scale - $mind/2;
$top2   = 136*$scale - $mind/2;
$right2 = 272*$scale + $mind/2;
$bottom2= 136*$scale + $mind/2;

$R1    = ($right1 - $left1)/2;
$M1x   = $left1 + $R1;

$R2    = ($right2 - $left2)/2;
$M2x   = $left2 + $R2;

$My   = $top1  + $R1;

$D1 = sqrt(($M1x - $m1x)*($M1x - $m1x) + ($My - $my)*($My - $my));
$D2 = sqrt(($M2x - $m2x)*($M2x - $m2x) + ($My - $my)*($My - $my));

open(FOO, ">" . "$file.$$");
print FOO "%TGIF 3.0-p13\n";
print FOO "state(0,33,100.000,0,0,0,8,1,9,1,1,0,0,1,1,1,0,'Courier',0,17,0,0,0,10,0,0,1,1,0,16,0,0,1," . $pages*2 . ",1,0,1056,1497,0,0,2880).\n";
print FOO <<HERE;
%
% @(#)$Header: /homes/cvs/ftape-stacked/contrib/scripts/animtape,v 1.5 1997/09/20 00:11:35 claus Exp $
% %W%
%
unit("1 pixel/pixel").
HERE

for $nr (1..$pages) {
    print FOO "page($nr,\"\",1).\n";
    $tmp = <<HERE;
box('grey75',20*$scale,20*$scale,420*$scale,320*$scale,1,1,1,574,0,0,0,0,0,'1',[
]).
box('black',15*$scale,15*$scale,415*$scale,315*$scale,1,1,1,571,0,0,0,0,0,'1',[
]).
box('grey75',10*$scale,10*$scale,410*$scale,310*$scale,1,1,1,568,0,0,0,0,0,'1',[
]).
box('black',5*$scale,5*$scale,405*$scale,305*$scale,1,1,1,564,0,0,0,0,0,'1',[
]).
box('grey75',0*$scale,0*$scale,400*$scale,300*$scale,1,1,1,100,0,0,0,0,0,'1',[
]).
HERE
    print FOO $tmp;
    $R1    = ($right1 - $left1)/2;

    $alpha = acos(($R1-$r)/$D1);
    $gamma = acos(($M1x-$m1x)/$D1);

    $P1x = $M1x - cos($alpha-$gamma)*$R1 + 1;
    $P1y = $My  - sin($alpha-$gamma)*$R1;

    $P2x = $m1x - cos($alpha-$gamma)*$r;
    $P2y = $my  - sin($alpha-$gamma)*$r;

    print FOO <<EOT;
poly('black',2,[
$P1x,$P1y,$P2x,$P2y],0,2*$lw,1,336,0,1,0,0,8,3,0,0,0,'1','8','3',
"0",[\n]).
EOT

    $R2    = ($right2 - $left2)/2;

    $alpha = acos(($R2-$r)/$D2);
    $gamma = acos(($m2x-$M2x)/$D2);


    $P1x = $M2x + cos($alpha-$gamma)*$R2;
    $P1y = $My  - sin($alpha-$gamma)*$R2;

    $P2x = $m2x + cos($alpha-$gamma)*$r;
    $P2y = $my  - sin($alpha-$gamma)*$r;

    print FOO "poly('black',2,[\n";
   print FOO "$P1x,$P1y,$P2x,$P2y],0,2*$lw,1,336,0,1,0,0,8,3,0,0,0,'1','8','3',\n";
    print FOO "\"0\",[\n]).\n";

    print FOO "oval('black',$left2,$top2,$right2,$bottom2,1,1,1,42,0,0,0,0,0,'1',[\n";
    print FOO "]).\n";
    print FOO "oval('black',$left1,$top1,$right1,$bottom1,1,1,1,41,0,0,0,0,0,'1',[\n";
    print FOO "]).\n";
    print FOO $footer;
    eval "print FOO \$bar" . (($nr - 1) % 8 + 1);
    eval "print FOO \$bar" . (($nr - 1) % 8 + 9);
    eval "print FOO \$move" . (($nr - 1) % 10 + 1);
    eval "print FOO \$sbar" . (($nr - 1) % 8 + 1);
    $left1   = $left1   + $step;
    $top1    = $top1    + $step;
    $right1  = $right1  - $step;
    $bottom1 = $bottom1 - $step;

    $left2   = $left2   - $step;
    $top2    = $top2    - $step;
    $right2  = $right2  + $step;
    $bottom2 = $bottom2 + $step;
}

for $nr ($pages+1..2*$pages) {
    $left1   = $left1   - $step;
    $top1    = $top1    - $step;
    $right1  = $right1  + $step;
    $bottom1 = $bottom1 + $step;

    $left2   = $left2   + $step;
    $top2    = $top2    + $step;
    $right2  = $right2  - $step;
    $bottom2 = $bottom2 - $step;
    print FOO "page($nr,\"\",1).\n";
    printf FOO <<HERE;
box('grey75',20*$scale,20*$scale,420*$scale,320*$scale,1,1,1,574,0,0,0,0,0,'1',[
]).
box('black',15*$scale,15*$scale,415*$scale,315*$scale,1,1,1,571,0,0,0,0,0,'1',[
]).
box('grey75',10*$scale,10*$scale,410*$scale,310*$scale,1,1,1,568,0,0,0,0,0,'1',[
]).
box('black',5*$scale,5*$scale,405*$scale,305*$scale,1,1,1,564,0,0,0,0,0,'1',[
]).
box('grey75',0*$scale,0*$scale,400*$scale,300*$scale,1,1,1,100,0,0,0,0,0,'1',[
]).
HERE
    $R1    = ($right1 - $left1)/2;

    $alpha = acos(($R1-$r)/$D1);
    $gamma = acos(($M1x-$m1x)/$D1);

    $P1x = $M1x - cos($alpha-$gamma)*$R1 + 1;
    $P1y = $My  - sin($alpha-$gamma)*$R1;

    $P2x = $m1x - cos($alpha-$gamma)*$r;
    $P2y = $my  - sin($alpha-$gamma)*$r;

    print FOO "poly('black',2,[\n";
   print FOO "$P1x,$P1y,$P2x,$P2y],0,2*$lw,1,336,0,1,0,0,8,3,0,0,0,'1','8','3',\n";
    print FOO "\"0\",[\n]).\n";

    $R2    = ($right2 - $left2)/2;

    $alpha = acos(($R2-$r)/$D2);
    $gamma = acos(($m2x-$M2x)/$D2);


    $P1x = $M2x + cos($alpha-$gamma)*$R2;
    $P1y = $My  - sin($alpha-$gamma)*$R2;

    $P2x = $m2x + cos($alpha-$gamma)*$r;
    $P2y = $my  - sin($alpha-$gamma)*$r;

    print FOO "poly('black',2,[\n";
   print FOO "$P1x,$P1y,$P2x,$P2y],0,2*$lw,1,336,0,1,0,0,8,3,0,0,0,'1','8','3',\n";
    print FOO "\"0\",[\n]).\n";

    print FOO "oval('black',$left2,$top2,$right2,$bottom2,1,1,1,42,0,0,0,0,0,'1',[\n";
    print FOO "]).\n";
    print FOO "oval('black',$left1,$top1,$right1,$bottom1,1,1,1,41,0,0,0,0,0,'1',[\n";
    print FOO "]).\n";
    print FOO $footer;
    eval "print FOO \$bar" . ((2*$pages - $nr) % 8 + 1);
    eval "print FOO \$bar" . ((2*$pages - $nr) % 8 + 9);
    eval "print FOO \$move" . ((2*$pages - $nr) % 10 + 1);
    eval "print FOO \$sbar" . ((2*$pages - $nr) % 8 + 1);
}
close FOO;

sub acos 
{
    local ($cos) = @_;
    local ($sin);

    $sin = sqrt(1-$cos*$cos);
    atan2($sin,$cos);
}

sub asin 
{
    local ($sin) = @_;
    local ($cos);

    $cos = sqrt(1-$sin*$sin);
    atan2($sin,$cos);
}
open(FOO, "<" . "$file.$$");
open(FII, ">" . $file);
while (<FOO>) {
    $in = $_;
    while ($in =~ /(-*[0-9.]*)\*(-*[0-9.]*)/) {
	$a = $1 * $2;
	$in =~ s/-*[0-9.]*\*-*[0-9.]*/$a/;
    }
    print FII "$in";
}
close(FOO);
close(FII);
unlink("$file.$$");
