#!/afs/athena/contrib/perl5/perl

$TEXMF='/var/tmp/texmf';
$MODE='ljfour';

$xi = 10*ms(0.5);
$xiii = 10*ms(1.5);
$xiv = 10*ms(2);
$xvii = 10*ms(3);
$xx = 10*ms(4);
$xxiv = 10*ms(5);
$xxix = 10*ms(6);
$xxxv = 10*ms(7);

# size, name
%s5 = (5 => '5');
%s6 = (6 => '6');
%s7 = (7 => '7');
%s8 = (8 => '8');
%s9 = (9 => '9');
%s10 = (10 => '10');
%s10b = (10 => '');
%s12 = (12 => '12');
%s17 = ($xvii => '17');

%s10_12 = (%s10, %s12);
%s10_17 = (%s10_12, %s17);

%s9_10 = (%s9, %s10);

%s8_9 = (%s8, %s9);
%s8_10 = (%s8_9, %s10);
%s8_12 = (%s8_10, %s12);
%s8_17 = (%s8_12, %s17);

%s7_9 = (%s7, %s8_9);
%s7_10 = (%s7, %s8_10);
%s7_12 = (%s7, %s8_12);

%s5_8 = (%s5, %s6, %s7, %s8);
%s5_9 = (%s5_8, %s9);
%s5_10 = (%s5_9, %s10);
%s5_12 = (%s5_10, %s12);
%s5_17 = (%s5_12, %s17);

%s0500 = (5 => '0500');
%s0600 = (6 => '0600');
%s0700 = (7 => '0700');
%s0800 = (8 => '0800');
%s0900 = (9 => '0900');
%s1000 = (10 => '1000');
%s1095 = ($xi => '1095');
%s1200 = (12 => '1200');
%s1440 = ($xiv => '1440');
%s1728 = ($xvii => '1728');
%s2074 = ($xx => '2074');
%s2488 = ($xxiv => '2488');
%s2986 = ($xxix => '2986');
%s3583 = ($xxxv => '3583');

%s0800_3583 = (%s0800, %s0900, %s1000, %s1095, %s1200, %s1440, %s1728, %s2074,
	     %s2488, %s2986, %s3583);
%s0500_3583 = (%s0500, %s0600, %s0700, %s0800_3583);

%smusic = (11 => 11, 13 => 13, 16 => 16, 20 => 20);

@goals = (5, 6, 7, 8, 9, 10, $xi, 12, $xiv, $xvii, $xx, $xxiv);
@sligoals = (7, 8, 10, 12, 8*ms(3), 8*ms(4), 8*ms(5), 8*ms(6), 8*ms(7),
	     8*ms(8), 8*ms(9));

# buildfonts(_dirname => 'public/bbm', _desc => 'Blackboard Bold CM',
# 	_mf => 'cmmf',
# 	bbm => \%s5_17, bbmb => \%s10, bbmbx => \%s5_12, bbmbxsl => \%s10,
# 	bbmdunh => \%s10, bbmfib => \%s8, bbminch => [1],
# 	bbmsl => \%s8_12, bbmsltt => \%s10, bbmss => \%s8_17,
# 	bbmssbx => \%s10, bbmssdc => \%s10, bbmssi => \%s8_17,
# 	bbmssq => \%s8, bbmssqi => \%s8, bbmtt => \%s8_12, bbmvtt => \%s10);

# buildfonts(_dirname => 'public/cirth', _desc => 'Cirth',
# 	  cirbf => \%s10b, cirsl => \%s10b, cirss => \%s10b, cirth => \%s10b);

# buildfonts(_dirname => 'public/cm', _desc => 'Computer Modern', _mf => 'cmmf',
#        cmb => \%s10, cmbsy => \%s10, cmbx => \%s5_12, cmbxsl => \%s10,
#        cmbxti => \%s10, cmcsc => \%s10, cmdunh => \%s10, cmex => \%s9_10,
#        cmff => \%s10, cmfi => \%s10, cmfib => \%s8, cminch => [1],
#        cmitt => \%s10, cmmi => \%s5_12, cmmib => \%s10, cmr => \%s5_17,
#        cmsl => \%s8_12, cmsltt => \%s10, cmss => \%s8_17, cmssbx => \%s10,
#        cmssdc => \%s10, cmssi => \%s8_17, cmssq => \%s8, cmssqi => \%s8,
#        cmsy => \%s5_10, cmtcsc => \%s10, cmtex => \%s8_10, cmti => \%s7_12,
#        cmtt => \%s8_12, cmu => \%s10, cmvtt => \%s10);

# Weird sizes for some macros.
# buildfonts(_dirname => 'public/cm', _desc => 'Computer Modern', _mf => 'cmmf',
# 	   cmbx10 => [1.2, ms(2), ms(3), ms(4), ms(5)], cmbx12 => [ms(0.5)],
# 	   cmbxti10 => [ms(1.5)], cmbxsl10 => [ms(1.5)],
# 	   cmmi10 => [0.9, 1.2, ms(2), ms(3), ms(4)], cmmi12 => [ms(0.5)],
# 	   cmr5 => [2], cmr7 => [ms(4)], cmr10 => [1.2, ms(2), ms(4), ms(5)],
# 	   cmsl10 => [ms(2), ms(3), ms(4)], cmsltt10 => [ms(1.5)],
# 	   cmss10 => [0.5, 1.2, ms(2)], cmss12 => [ms(0.5)], cmssdc10 => [4],
# 	   cmsy10 => [0.9, ms(1.5)], cmti10 => [ms(2), ms(3), ms(4)],
# 	   cmtt10 => [1.2, ms(2), ms(3), ms(4)], cmtt12 => [ms(0.5)]);

# Sizes for slides.
# buildfonts(_dirname => 'public/cm', _desc => 'Computer Modern', _mf => 'cmmf',
# 	   _goals => \@sligoals,
# 	   cmcsc10 => [ms(6), ms(7)], cmitt => \%s10, cmmi => \%s8,
# 	   cmsy => \%s8, cmtt => \%s8);	   

# buildfonts(_dirname => 'public/cmextra', _desc => 'CM extra (bold)',
# 	    _mf => 'cmmf',
# 	    cmbcsc => \%s10, cmbtex => \%s10, cmbtt => \%s8_10, 
# 	    cmexb => \%s10, cmttb => \%s10);

# buildfonts(_dirname => 'public/concmath', _desc => 'Concrete math',
# 	     _mf => 'cmmf',
# 	     xccam => \%s5_10, xccbm => \%s5_10, xccex => \%s7_10,
# 	     xccmi => \%s5_10, xccsy => \%s5_10);

# buildfonts(_dirname => 'public/concrete', _desc => 'Concrete', _mf => 'cmmf',
# 	     cccsc => \%s10, ccmi => \%s10, ccmic => \%s9, ccr => \%s5_10,
# 	     ccsl => \%s9_10, ccslc => \%s9, ccti => \%s10);

# buildfonts(_dirname => 'public/ecc', _desc => 'T1-encoded Concrete',
# 	eocc => \%s10, eorm => \%s5_10, eosl => \%s9_10, eoti => \%s10,
# 	tcssdc => \%s10, torm => \%s5_10, tosl => \%s9_10, toti => \%s10);

# buildfonts(_dirname => 'public/ecc', _desc => 'T1-encoded Concrete',
# 	   _goals => [5,6,7,8],
# 	   eosl => \%s5_8, tosl => \%s5_8);

# # only some of these work with cmmf.
# buildfonts(_dirname => 'public/gothic', _desc => 'Gothic (old German)',
# 	   cmfrak => \%s10b, dcfrak => \%s10b, schwell => \%s10b,
# 	   suet14 => \%s10b, yfrak => \%s10b, ygoth => \%s10b,
# 	   yinitas => [1,1.2,ms(2),1.728,$xx/10,$xxiv/10], yswab => \%s10b);

# buildfonts(_dirname => 'public/lamstex', _desc => 'LamsTeX symbols',
# 	    _mf => 'cmmf',
# 	    lams1 => \%s10b, lams2 => \%s10b, lams3 => \%s10b,
# 	    lams4 => \%s10b, lams5 => \%s10b);

# # only some of these work with cmmf.
# buildfonts(_dirname => 'public/latex', _desc => 'LaTeX symbols',
#	  icmcsc => \%s10, icmex => \%s10,
#	  lasy => \%s5_10, lasyb => \%s10, lcircle => \%s10,
#	  lcirclew => \%s10, line => \%s10, linew => \%s10);

# Sizes for slides.
# buildfonts(_dirname => 'public/latex', _desc => 'LaTeX symbols', _mf => 'cmmf',
# 	   _goals => \@sligoals,
# 	   icmcsc10 => [ms(6), ms(7)], icmex => \%s10, icmmi => \%s8,
# 	   icmsy => \%s8, icmtt => \%s8, ilasy => \%s8, ilcmss => \%s8,
# 	   ilcmssb => \%s8, ilcmssi => \%s8, lasy => \%s8, lcmss => \%s8,
# 	   lcmssb => \%s8, lcmssi => \%s8);

# buildfonts(_dirname => 'public/local', _desc => 'local fonts',
# 	   dolby => [1,1.2]);

# buildfonts(_dirname => 'public/mflogo', _desc => 'Metafont logo',
# 	   logo => \%s8_10, logobf => \%s10, logod => \%s10,
# 	   logosl => \%s9_10, logosl8 => [5/8, 3/4, 7/8, 1]);

# buildfonts(_dirname => 'public/misc', _desc => 'Miscellanea',
# 	 black => [1], cmman => \%s10b, gray => [1], blesp => [1],
#	 grayf => [1], gresp => [1], halftone => [1], lgresp => [1],
#	 manfnt => \%s10b, xbmc => \%s10);

# buildfonts(_dirname => 'public/music', _desc => 'musical symbols',
# 	  beamd20 => [1], beamn => \%smusic, beamq20 => [1], beamt20 => [1],
# 	  beamv20 => [1], musicbra => [1], musicbrb => [1],
#	  musicn => \%smusic, musikn => \%smusic,
# 	  slur16 => [1], slurdd16 => [1], slurdu16 => [1], slurn16 => [1],
# 	  slurn20 => [1], slurud16 => [1], sluruu16 => [1]);

# buildfonts(_dirname => 'public/oca', _desc => 'optical character recognition',
# 	ocra => \%s10_17);

# buildfonts(_dirname => 'public/ocr-a', _desc => 'OCR-A',
# 	  ocr => {%s10_12, 16 => 16});

# buildfonts(_dirname => 'public/ocr-b', _desc => 'OCR-B',
# 	  ocrb => \%s5_10, ocrb10e => \%s10b, ocrb10f => \%s10b,
# 	  ocrb10g => \%s10b, ocrb10l => \%s10b, ocrb10s => \%s10b,
# 	  ocrb10x => \%s10b);

# buildfonts(_dirname => 'public/pandora', _desc => 'Pandora',
# 	    pnb => \%s10, pnr => \%s10, pnsl => \%s10, pnss => \%s10,
# 	    pnssb => \%s10, pnssi => \%s10, pntt => \%s9);

# buildfonts(_dirname => 'public/phonetic', _desc => 'phonetic symbols',
# 	     _mf => 'cmmf',
# 	     cmph => \%s5_10, cmphb => \%s10, cmphi => \%s7_10);

# buildfonts(_dirname => 'public/punk', _desc => 'punk',
# 	 punk => {%s10_12, 20 => 20}, punkbx20 => [1], punksl20 => [1]);

# buildfonts(_dirname => 'public/rsfs', _desc => 'Ralph Smith formal script',
# 	 _mf => 'cmmf',
# 	 rsfs => {%s5, %s7, %s10});

# buildfonts(_dirname => 'public/rsfs', _desc => 'Ralph Smith formal script',
# 	   _mf => 'cmmf',
# 	   rsfs10 => [0.8, 0.9]);

# buildfonts(_dirname => 'public/wasy', _desc => 'extended LaTeX symbols',
# 	 _mf => 'cmmf',
# 	 wasy => \%s5_10, wasyb => \%s10);

# buildfonts(_dirname => 'public/wsuipa',
# 	   _desc => 'International Phonetic Alphabet', _mf => 'cmmf',
# 	   wbxipa => \%s8_17, wslipa => \%s8_17, wsuipa => \%s8_17);

# buildfonts(_dirname => 'ams/cyrillic', _desc => 'AMS Cyrillic fonts',
# 	   _mf => 'cmmf',
# 	   wncyb => \%s5_10, wncyi => \%s5_10, wncyr => \%s5_10,
# 	   wncysc => \%s10, wncyss => \%s8_10);

# buildfonts(_dirname => 'ams/euler', _desc => 'AMS Euler fonts',
# 	  euex => \%s7_10, eufb => \%s5_10, eufm => \%s5_10, eurb => \%s5_10,
# 	  eurm => \%s5_10, eusb => \%s5_10, eusm => \%s5_10);

# buildfonts(_dirname => 'ams/extracm', _desc => 'AMS/LaTeX extra CM fonts',
# 	    _mf => 'cmmf', _goals => [5, 6, 7, 8, 9],
# 	    cmbsy => \%s5_9, cmcsc => \%s8_9, cmex => \%s7_9, cmmib => \%s5_9);

# buildfonts(_dirname => 'ams/symbols', _desc => 'AMS symbols', _mf => 'cmmf',
# 	    msam => \%s5_10, msbm => \%s5_10);

# buildfonts(_dirname => 'jknappen/ec', _desc => 'T1-encoded CM fonts',
#        ecbi => \%s0500_3583, ecbl => \%s0500_3583, ecbx => \%s0500_3583,
#        eccc => \%s0500_3583, ecci => \%s0500_3583, ecdh => \%s0500_3583,
#        ecit => \%s0800_3583, eclb => \%s8, ecli => \%s8, eclo => \%s8,
#        eclq => \%s8, ecltt => \%s8, ecoc => \%s0500_3583, ecqi => \%s8,
#        ecrb => \%s0500_3583, ecrm => \%s0500_3583, ecsc => \%s0500_3583,
#        ecsi => \%s0500_3583, ecsl => \%s0500_3583, ecso => \%s0500_3583,
#        ecsq => \%s8, ecss => \%s0500_3583, ecssdc => \%s10,
#        ecst => \%s0800_3583, ecsx => \%s0500_3583, ectc => \%s0800_3583,
#        ecti => \%s0500_3583, ectt => \%s0800_3583, ecui => \%s0500_3583,
#        ecvi => \%s0800_3583, ecvt => \%s0800_3583, ecxc => \%s0500_3583);

# Sizes for slides.
# buildfonts(_dirname => 'jknappen/ec', _desc => 'T1-encoded CM fonts',
# 	   ecit => \%s1000, ecli => \%s8, eclq => \%s8, ecltt => \%s8,
# 	   ieclb => \%s8, iecli => \%s8, ieclo => \%s8, ieclq => \%s8,
# 	   iecltt => \%s8);

# buildfonts(_dirname => 'jknappen/tc', _desc => 'CM text symbols',
#        tcbi => \%s0500_3583, tcbl => \%s0500_3583, tcbx => \%s0500_3583,
#        tcci => \%s0500_3583, tcit => \%s0800_3583, tcrb => \%s0500_3583,
#        tcrm => \%s0500_3583, tcsi => \%s0500_3583, tcsl => \%s0500_3583,
#        tcso => \%s0500_3583, tcss => \%s0500_3583, tcst => \%s0800_3583,
#        tcsx => \%s0500_3583, tcti => \%s0500_3583, tctt => \%s0800_3583,
#        tcui => \%s0500_3583, tcvi => \%s0800_3583, tcvt => \%s0800_3583);

# buildfonts(_dirname => 'urban/tengwar', _desc => 'Tengwar (Elvish)',
# 	    tengwar => \%s10b, tengwarweird => \%s10b);

# magstep
sub ms {
    return 1.2**$_[0];
}

sub runmf {
    # print "$_[0] '\\mode=$MODE; \\batchmode; \\mag=$_[1]; input $_[2]'\n";
    open(SAVEOUT, ">&STDOUT");
    open(STDOUT, "/dev/null");
    if (system($_[0],
	       "\\mode=$MODE; \\batchmode; \\mag=$_[1]; input $_[2]")
	!= 0) {
	print STDERR "runmf($_[0],$_[1],$_[2]) failed.\n";
    }
    open(STDOUT, ">&SAVEOUT");
}
    
sub mksizes {
    my $basename = $_[0];
    my $sizeref = $_[1];
    my @sizes = sort {$a <=> $b} keys(%$sizeref);
    my $goalref = $_[2];
    my $mf = $_[3];
    my ($i, $j, $mag);
    my $fullname = $basename . $sizeref->{$sizes[0]};
    
    for ($j = 0; $j < @$goalref; ++$j) {
	last if $goalref->[$j] >= 0.99*$sizes[0];
	runmf($mf, $goalref->[$j]/$sizes[0], $fullname);
    }
    for ($i = 0; $i < @sizes; ++$i) {
	$fullname = $basename . $sizeref->{$sizes[$i]};
	if (!defined($goalref->[$j]) || $goalref->[$j] >1.01*$sizes[$i]) {
	    runmf($mf, 1, $fullname);
	}
	for (; $j < @$goalref; ++$j) {
	    last if ($i < @sizes - 1) && ($goalref->[$j] >= 0.99*$sizes[$i+1]);
	    runmf($mf, $goalref->[$j]/$sizes[$i], $fullname);
	}
    }
}

sub buildfonts {
    my %fontinf = @_;
    my $mf = $fontinf{_mf} || 'mf';
    my $goalref = $fontinf{_goals} || \@goals;
    my $dir = $fontinf{_dirname} || 'tmp';

    print "\nBuilding $fontinf{_desc}:\n\n";
    foreach (keys %fontinf) {
	next if /^_/;
	print "$_ ";
	my $val = $fontinf{$_};
	if (ref($val) eq "ARRAY") {
	    foreach $mag (@$val) {
		runmf($mf, $mag, $_);
	    }
	} elsif (ref($val) eq "HASH") {
	    mksizes($_, $val, $goalref, $mf);
	}
    }
    print "\n";
    foreach (<*gf>) {
	if (system('gftopk', $_) == 0) {
	    unlink($_);
	} else {
	    print STDERR "gftopk $_ failed!\n";
	}
    }
    system("gzip -9f *.log");
    system('mkdir', '-p', "log/$dir");
    system("mv *.log.gz log/$dir");
    system('mkdir', '-p', "$TEXMF/fonts/pk/$MODE/$dir");
    system("mv *pk $TEXMF/fonts/pk/$MODE/$dir");
    system('mkdir', '-p', "$TEXMF/fonts/tfm/$dir");
    system("mv *.tfm $TEXMF/fonts/tfm/$dir");    
}
