#! /usr/bin/perl
# 1.1   MJPH    13-AUG-1999     Add U+00B7 and reverse mappings as well

use Font::TTF::Font;
require 'getopts.pl';
Getopts('m:');

unless (defined $ARGV[1])
{
    die <<'EOT';
    EUROFIX [-m num] infile outfile
Edits a font to account for the change in codepage 1252 definition in Win98,
NT5 and all things new then. -m specifies that the Mac hack should also be
done.

The following changes are made to ensure that the glyphs at the two positions
are the same, if possible:
    U+0080 and U+20AC                Euro sign
    U+008E and U+017D                Z caron
    U+009E and U+017E                z caron
    U+00B7 and U+2219                Middle dot
For more details of which glyph is used where in Windows, see the POD which
accompanies this program.

For the Mac table
    glyph at U+0080 (in MS table) copied to num             Euro sign
    (-m may be for 240 or 211 depending on Apple or MS)

Copies are only made if there is no glyph there already.    
EOT
}

$f = Font::TTF::Font->open($ARGV[0]);
$f->{'cmap'}->read->{' isDirty'} = 1;

copy_cmap($f, $opt_m, 0x0080, 0x20AC);
copy_cmap($f, 0, 0x008E, 0x017D);
copy_cmap($f, 0, 0x009E, 0x017E);
copy_cmap($f, 0, 0x00B7, 0x2219);

$f->{'OS/2'}->read->update;

$f->out($ARGV[1]);



sub copy_cmap
{
    my ($f, $mac, @equates) = @_;
    my ($gnum, $i, $t, $u);

    foreach $u (@equates)
    { last if ($gnum = $f->{'cmap'}->ms_lookup($u)); }

    return undef unless $gnum;

    # Work through the tables hacking:
    for ($i = 0; $i < $f->{'cmap'}{'Num'}; $i++)
    {
        $t = $f->{'cmap'}{'Tables'}[$i];
        if ($mac && $t->{'Platform'} == 1 && $t->{'Encoding'} == 0)
        { $t->{'val'}{$mac} = $gnum if ($mac && !$t->{'val'}{$mac}); }  # Mac
        elsif (($t->{'Platform'} == 0 && $t->{'Encoding'} == 0)
                || ($t->{'Platform'} == 3 && $t->{'Encoding'} == 1))
        {
            foreach $u (@equates)
            { $t->{'val'}{$u} = $gnum unless $t->{'val'}{$u}; }
        }    # ISO or MS
    }
    $f;
}



