#!/usr/bin/perl

use strict;

my $test = 0;
my $foundry = 'un';
my %FONTS = (
	     $foundry.'mj'=>['UnBatang','UnBatangBold'],
	     $foundry.'gt'=>['UnDotum','UnDotumBold'],
	     $foundry.'tz'=>['UnTaza'],
	     $foundry.'bm'=>['UnBom'],
	     $foundry.'gr'=>['UnGraphic'],
	     $foundry.'gs'=>['UnGungseo'],
	     $foundry.'pn'=>['UnPen'],
	     $foundry.'ph'=>['UnPenheulim'],
	     $foundry.'pg'=>['UnPilgi','UnPilgiBold'],
	     $foundry.'sh'=>['UnShinmun'],
	     $foundry.'yt'=>['UnYetgul'],
	    );
my $cmap = 'UniKSCms-UCS2-H'; # 'UniKS-UTF16-H' if AcrobatReader6
my $sft = '@Unicode@';
my $opt = '-q -P 3 -E 1';

my $styname = $foundry.'ttf.sty';
my $pkmap = $foundry.'ttf2pk.map';
my $cidmap = 'cid-'.$foundry.'ttf.map';
my $texname = 'testlambda.tex';
my ($b,$c,$o) = qw/b c o/;
my %SHAPES = (
	      ''=>'',
	      $o=>'-s .167',
	      $c=>'-e .92',
	      $c.$o=>'-s .167 -e .92',
	     );
my $teststr = '\qquad 123 ABC iiiii ^^8c^^63^^b9^^e6^^c4^^bf^^c7^^c7^^99^^f6 '.
	'^^a3^^c1^^a3^^b1^^a2^^bd^^a8^^b1^^a1^^db '.
	'^^ca^^a1^^cc^^e5^^cf^^cb^^d2^^b1 --- -- -';
my @OLDPK = my @OLDSTY = my @OLDCID = ();

if(-e $pkmap and !$test) {
	open PK,$pkmap or die;
	while(<PK>) {
		push @OLDPK,$_ if /^$foundry/;
	}
	close PK;
	open PK,">$pkmap" or die;
	print PK @OLDPK;
	close PK;
}

if(-e $cidmap) {
	open CID,$cidmap or die;
	while(<CID>) {
		push @OLDCID,$_ if /^$foundry/;
	}
	close CID;
}

if(-e $styname) {
	open STY,$styname or die;
	while(<STY>) {
		push @OLDSTY,$_ if /\\MapHangulFamily/;
	}
	close CID;
}

open STY,">$styname" or die;
print STY "\\ifx\\clearocplists\\undefined
",@OLDSTY,"
\\DeclareErrorHFont{H}{\\mjdefault}{m}{n}{10}
\\DeclareHFontSubstitution{H}{\\mjdefault}{m}{n}
\\providecommand\\makethinhangul{\\hfontseries{c}} 
\\else
";
open CID,">$cidmap" or die;
print CID @OLDCID;
open TEX,">$texname" or die;
print TEX "\\documentclass{article}
\\usepackage{hfont,${foundry}ttf}
\\begin{document}
";
foreach my $font (keys %FONTS) {
  maketfmandmap($font,$FONTS{$font}[0]);
  maketfmandmap($font,$FONTS{$font}[1],$b) if $FONTS{$font}[1];
  open FD,">UHC$font.fd" or die;
  print FD "\\DeclareFontFamily{UHC}{$font}{}\n";
  makefd($font);
  makefd($font,$b) if $FONTS{$font}[1];
  close FD;
  my $family = substr($font,-2,2);
  if($family eq 'sh') {
    print STY "\\newcommand\\text$family\{\\fontfamily{$font}\\selectfont}\n";
  } else {
    print STY "\\renewcommand\\text$family\{\\fontfamily{$font}\\selectfont}\n";
  }
  if ($family =~ /(mj|gt|tz)/) {
    print STY "\\def\\${family}default{$font}\n";
  }
  print TEX "\\normalfont $font \\text$family\{$teststr}\n\n";
  print TEX "\\normalfont $font$b \\text$family\{\\bfseries $teststr}\n\n" if $FONTS{$font}[1];
}
print STY '
\renewcommand{\familydefault}{\mjdefault}
\renewcommand{\rmdefault}{\mjdefault}
\renewcommand{\sfdefault}{\gtdefault}
\renewcommand{\ttdefault}{\tzdefault}
\DeclareErrorFont{UHC}{\mjdefault}{m}{n}{10}
\DeclareFontSubstitution{UHC}{\mjdefault}{m}{n}
\providecommand\makethinhangul{\fontseries{c}\selectfont}
\fi
\endinput
';
print TEX "\\end{document}\n";
close TEX; close CID; close STY;

sub maketfmandmap {
  my($font,$ttf,$b) = @_;
  $font = 'o'.$font;
  foreach my $shape (keys %SHAPES) {
    my $opt = "$opt -o $font$b$shape";
    my $ttf2tfmcmd = "ttf2tfm $ttf $opt $SHAPES{$shape} $font$b$shape$sft";
    my $ovp2ovfcmd = "ovp2ovf $font$b$shape.ovp $font$b$shape.ovf $font$b$shape.ofm";
    print "$ttf2tfmcmd\n$ovp2ovfcmd\n";
    unless($test) {
      system("$ttf2tfmcmd >> $pkmap") == 0 or die;
      system("$ovp2ovfcmd") == 0 or die;
    }
    print CID "$font$b$shape\t$cmap\t:0:$ttf\t$SHAPES{$shape}\n";
  }
}

sub makefd {
  my ($font,$b) = @_;
  my $ff = 'o'.$font;
  my @FW = $b ? qw/b bc/ : qw/m c/;
  foreach my $fw (@FW) {
    my $fc = $c if $fw =~ /c/;
    my $fb = $b if $fw =~ /b/;
    print FD "
\\DeclareFontShape{UHC}{$font}{$fw}{n}{<->$ff$fb$fc}{}
\\DeclareFontShape{UHC}{$font}{$fw}{sl}{<->$ff$fb$fc$o}{}
\\DeclareFontShape{UHC}{$font}{$fw}{it}{<->ssub*$font/$fw/sl}{}
";
  }
}
