Font-TTF-Scripts

 view release on metacpan or  search on metacpan

Examples/ttfwidth.pl  view on Meta::CPAN

        {
        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";
($c_fmt, $c_len, $c_ver) = unpack("nnn", $c_head);
die "Incorrect encoding format $c_fmt, should be 4" if ($c_fmt != 4);
read(INFILE, $c_head, 8) == 8 || die "reading cmap table header part 2";
($c_segs) = unpack("n", $c_head);
$c_segs = $c_segs / 2;
# now read the real meat of the table
read(INFILE, $c_data, 2 * $c_segs) == 2 * $c_segs || die "reading cmap_end data";
(@c_ends) = unpack("n" x $c_segs, $c_data);
read(INFILE, $c_data, 2 * $c_segs + 2) == 2 * $c_segs + 2
        || die "reading cmap_start data";
(@c_starts) = unpack("xx" . "n" x $c_segs, $c_data);
read(INFILE, $c_data, 2 * $c_segs) == 2 * $c_segs || die "reading cmap_deltas";
(@c_deltas) = unpack("n" x $c_segs, $c_data);
read(INFILE, $c_data, 2 * $c_segs) == 2 * $c_segs || die "reading cmap_ranges";
(@c_ranges) = unpack("n" x $c_segs, $c_data);
undef $c_data;
$num = read(INFILE, $c_idarray, $c_len - $c_segs * 8 - 16);
(@c_idarray) = unpack("n" x ($num / 2), $c_idarray);
undef $c_idarray;
# convert range type information into per-code information.  Creates mapping
# table (@c_enc) to convert unicode to glyph
$c_count = 0;
cmap:
for ($i = 0; $i < $c_segs - 1; $i++)
    {
    for ($j = $c_starts[$i]; $j <= $c_ends[$i]; $j++)
        {



( run in 0.483 second using v1.01-cache-2.11-cpan-d8267643d1d )