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 )