PDF-Builder
view release on metacpan or search on metacpan
lib/PDF/Builder/Resource/CIDFont/TrueType/FontFile.pm view on Meta::CPAN
#$opts{'cmaps'} = '7/8; 8/7'; # invalid P/E, should use find_ms instead
#$opts{'cmaps'} = 'find_ms; find_ms ';
#$opts{'usecmf'} = 1;
my $font;
# if the file is already a suitable font object, use it
if (UNIVERSAL::isa($file, 'Font::TTF::Font')) {
$font = $file;
} else {
confess "cannot find font '$file'" unless -f $file;
$font = Font::TTF::Font->open($file);
}
$data->{'obj'} = $font;
$class = ref $class if ref $class;
my $self = $class->SUPER::new();
$self->{'Filter'} = PDFArray(PDFName('FlateDecode'));
$self->{' font'} = $font;
$self->{' data'} = $data;
$data->{'noembed'} = !$opts{'embed'};
$data->{'iscff'} = (defined $font->{'CFF '})? 1: 0;
$self->{'Subtype'} = PDFName('CIDFontType0C') if $data->{'iscff'};
$data->{'fontfamily'} = $font->{'name'}->read()->find_name(1);
$data->{'fontname'} = $font->{'name'}->read()->find_name(4);
$font->{'OS/2'}->read();
my @stretch = qw[
Normal
UltraCondensed
ExtraCondensed
Condensed
SemiCondensed
Normal
SemiExpanded
Expanded
ExtraExpanded
UltraExpanded
];
if (defined $font->{'OS/2'}->{'usWidthClass'}) {
$data->{'fontstretch'} = $stretch[$font->{'OS/2'}->{'usWidthClass'}] || 'Normal';
} else {
$data->{'fontstretch'} = 'Normal';
}
$data->{'fontweight'} = $font->{'OS/2'}->{'usWeightClass'};
if (defined $font->{'OS/2'}->{'sFamilyClass'}) {
$data->{'panose'} = pack('n', $font->{'OS/2'}->{'sFamilyClass'});
foreach my $p (qw[bFamilyType bSerifStyle bWeight bProportion bContrast bStrokeVariation bArmStyle bLetterform bMidline bXheight]) {
if (defined $font->{'OS/2'}->{$p}) {
$data->{'panose'} .= pack('C', $font->{'OS/2'}->{$p});
}
}
}
$data->{'apiname'} = join('', map { ucfirst(lc(substr($_, 0, 2))) } split m/[^A-Za-z0-9\s]+/, $data->{'fontname'});
$data->{'fontname'} =~ s/[\x00-\x1f\s]//og;
$data->{'altname'} = $font->{'name'}->find_name(1);
$data->{'altname'} =~ s/[\x00-\x1f\s]//og;
$data->{'subname'} = $font->{'name'}->find_name(2);
$data->{'subname'} =~ s/[\x00-\x1f\s]//og;
# TBD in PDF::API2 the following line is just find_ms()
$font->{'cmap'}->read()->find_ms($opts{'isocmap'} || 0);
if (defined $font->{'cmap'}->find_ms()) {
$data->{'issymbol'} = ($font->{'cmap'}->find_ms()->{'Platform'} == 3 &&
$font->{'cmap'}->read()->find_ms()->{'Encoding'} == 0) || 0;
} else {
$data->{'issymbol'} = 0;
}
$data->{'upem'} = $font->{'head'}->read()->{'unitsPerEm'};
$data->{'fontbbox'} = [
int($font->{'head'}->{'xMin'} * 1000 / $data->{'upem'}),
int($font->{'head'}->{'yMin'} * 1000 / $data->{'upem'}),
int($font->{'head'}->{'xMax'} * 1000 / $data->{'upem'}),
int($font->{'head'}->{'yMax'} * 1000 / $data->{'upem'})
];
$data->{'stemv'} = 0;
$data->{'stemh'} = 0;
$data->{'missingwidth'} = int($font->{'hhea'}->read()->{'advanceWidthMax'} * 1000 / $data->{'upem'}) || 1000;
$data->{'maxwidth'} = int($font->{'hhea'}->{'advanceWidthMax'} * 1000 / $data->{'upem'});
$data->{'ascender'} = int($font->{'hhea'}->read()->{'Ascender'} * 1000 / $data->{'upem'});
$data->{'descender'} = int($font->{'hhea'}{'Descender'} * 1000 / $data->{'upem'});
$data->{'flags'} = 0;
if (defined $font->{'OS/2'}) {
if (defined $font->{'OS/2'}->read()->{'bProportion'}) {
$data->{'flags'} |= 1 if $font->{'OS/2'}->read()->{'bProportion'} == 9;
}
if (defined $font->{'OS/2'}{'bSerifStyle'}) {
$data->{'flags'} |= 2 unless $font->{'OS/2'}{'bSerifStyle'} > 10 &&
$font->{'OS/2'}{'bSerifStyle'} < 14;
}
if (defined $font->{'OS/2'}{'bFamilyType'}) {
$data->{'flags'} |= 8 if $font->{'OS/2'}{'bFamilyType'} == 2;
$data->{'flags'} |= 32; # if $font->{'OS/2'}{'bFamilyType'} > 3;
}
if (defined $font->{'OS/2'}{'bLetterform'}) {
$data->{'flags'} |= 64 if $font->{'OS/2'}{'bLetterform'} > 8;
}
}
$data->{'capheight'} = $font->{'OS/2'}->{'CapHeight'} || int($data->{'fontbbox'}->[3]*0.8);
$data->{'xheight'} = $font->{'OS/2'}->{'xHeight'} || int($data->{'fontbbox'}->[3]*0.4);
if ($data->{'issymbol'}) {
$data->{'e2u'} = [0xf000 .. 0xf0ff];
} else {
$data->{'e2u'} = [ unpack('U*', decode('cp1252', pack('C*', 0..255))) ];
}
( run in 0.537 second using v1.01-cache-2.11-cpan-71847e10f99 )