Font-TTF-Scripts

 view release on metacpan or  search on metacpan

Examples/ttfwidth.pl  view on Meta::CPAN

    {
    print "font mapping Microsoft id = $c_id, encoding = $c_enc\n";
    print "    (encoding => " . ($c_enc == 1 ? "UGL coding"
            : "unknown or symbol") . ")\n";
    }

if ($c_enc == 1)
    {
# Microsoft UGL coding (8-bit to unicode mapping table)
    (@c_enc) = (32 .. 126, 0, 0, 0, 0x201a, 0x192, 0x201e, 0x2026, 0x2020,
                0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0, 0, 0, 0,
                0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc,
                0x2122, 0x0161, 0x203a, 0x0153, 0, 0, 0x0178,
                160 .. 255);
    }
# print it all out as comma seperated variables or standard format
if (!defined $opt_s)
    {
#    print OUTFILE "\"Em box\",\"$h_em\"\n";
    if (!defined $opt_u)
        {
        print OUTFILE "Code, Char, ";
        }

    printf OUTFILE "%s, " x 8 . "%s\n",
        "Unicode", "Glyph", "AdvWidth", "LSdBearing",
        "Xmin", "Xmax", "Ymin", "Ymax", "XCentre";
    }

$big = 512;
if (defined $opt_u && $m_num > $big)
    {
    $low = 0; $c_count = $big;
    while ($c_count >= $big)
        {
        &getdata;
        &printdata;
        undef @c_uni;
        undef @l_offsets;
        undef @h_adw;
        undef @h_lsb;
        undef @g_xmin;
        undef @g_xmax;
        undef @g_ymin;
        undef @g_ymax;
        undef @map;
        }
    }
else
    {
    $low = -1;
    &getdata;
    &printdata;
    }
close(OUTFILE);
close(INFILE);


sub printdata
{
for ($i = (defined $opt_u ? $[ : 32); $i <= (defined $opt_u ? $#c_uni : 255);
        $i++)
    {
    if (defined $opt_u)
        {
        next if ($c_uni[$i] == 0);
        $j = $map[$i];
        }
    else
        {
        $j = ($c_enc == 1) ? $c_map[$c_enc[$i - 32]] : $c_map[$i];
        next if ($j == 0);
        }
    $o_cnt = $h_lsb[$j] + ($g_xmax[$j] - $g_xmin[$j]) / 2;
    $o_centre = $h_adw[$j] - $o_cnt;
    $o_centre = -$o_centre if ($o_cnt < 0);
    if (defined $opt_s)
        {
        if (!defined $opt_u)
            {
            printf OUTFILE "\\code %d\n\\char %c\n\\uni 0x%04x\n\\glyph %d\n"
                . "\\adw %d\n\\lsb %d\n",
                $i, $i, ($c_enc == 1) ? $c_enc[$i] : $i + 0xf000, $i,
                $h_adw[$j], $h_lsb[$j];
            }
        else
            {
            printf OUTFILE "\\code 0x%04x\n\\glyph %d\n\\adw %d\n\\lsb %d \n",
                $c_uni[$i], $i, $h_adw[$j], $h_lsb[$j];
            }
        printf OUTFILE "\\xmin %d\n\\xmax %d\n\\ymin %d\n\\ymax %d\n\\xcent %d\n\n",
            $g_xmin[$j], $g_xmax[$j], $g_ymin[$j], $g_ymax[$j], $o_centre;
        }
    else
        {
        if (!defined $opt_u)
            {
            if ($i == 34)
                { $o_s = "\"" x 4; }
            elsif ($i == 44)
                { $o_s = "\",\""; }
            else
                { $o_s = sprintf("%c", $i); }
            printf OUTFILE "%d,%s,0x%04X,%d,",
                $i, $o_s, ($c_enc == 1) ? $c_enc[$i - 32] : $i + 0xf000, $j;
            }
        else
            {
            printf OUTFILE "0x%04X,%d,", $c_uni[$i], $i;
            }
        printf OUTFILE "%d,%d,%d,%d,%d,%d,%d\n",
            $h_adw[$j], $h_lsb[$j], $g_xmin[$j],
            $g_xmax[$j], $g_ymin[$j], $g_ymax[$j], $o_centre;
        }
    }
}

sub getdata
{
seek(INFILE, $dir{"cmap"} + $c_offset, 0);
read(INFILE, $c_head, 6) == 6 || die "reading cmap table header";



( run in 0.864 second using v1.01-cache-2.11-cpan-5b529ec07f3 )