PDF-Builder
view release on metacpan or search on metacpan
lib/PDF/Builder/Resource/Font/Postscript.pm view on Meta::CPAN
if ($_ =~ m|^CC\s+(\S+)\s+(\S+)\s+;|i) {
my ($name, $comp) = ($1, $2);
my @cv = split(/;/, $_);
shift @cv;
my $rng = [];
foreach (1..$comp) {
my @c1 = split(/\s+/,shift @cv);
push @{$rng}, $c1[1],$c1[2],$c1[3];
}
$data->{'comps'}->{$name} = $rng;
}
}
last if $_ =~ /^EndFontMetrics/;
if (/(^\w+)\s+(.*)/) {
my($key, $val) = ($1, $2);
$key = lc($key);
if (defined $data->{$key}) {
# $data->{$key} = [ $data->{$key} ] unless ref $data->{$key};
# push(@{$data->{$key}}, $val);
} else {
$val =~ s/[\x00\x1f]+//g;
$data->{$key} = $val;
}
} else {
## print STDERR "Can't parse: $_";
}
}
close($afmf);
unless (exists $data->{'wx'}->{'.notdef'}) {
$data->{'wx'}->{'.notdef'} = 0;
$data->{'bbox'}{'.notdef'} = [0, 0, 0, 0];
}
$data->{'avgwidth2'} /= scalar keys %{$data->{'bbox'}} ;
$data->{'avgwidth2'} = int($data->{'avgwidth2'});
$data->{'fontname'} =~ s/[\x00-\x20]+//og;
## $data->{'fontname'} =~ s/[^A-Za-z0-9]+//og;
if (defined $data->{'fullname'}) {
$data->{'altname'} = $data->{'fullname'};
} else {
$data->{'altname'} = $data->{'familyname'};
$data->{'altname'} .= ' Italic' if $data->{'italicangle'} < 0;
$data->{'altname'} .= ' Oblique' if $data->{'italicangle'} > 0;
$data->{'altname'} .= ' '.$data->{'weight'};
}
$data->{'apiname'} = $data->{'altname'};
$data->{'altname'} =~ s/[^A-Za-z0-9]+//og;
$data->{'subname'} = $data->{'weight'};
$data->{'subname'} .= ' Italic' if $data->{'italicangle'} < 0;
$data->{'subname'} .= ' Oblique' if $data->{'italicangle'} > 0;
$data->{'subname'} =~ s/[^A-Za-z0-9]+//og;
$data->{'missingwidth'} ||= $data->{'avgwidth2'};
$data->{'issymbol'} = 0;
$data->{'fontbbox'} = [ split(/\s+/,$data->{'fontbbox'}) ];
$data->{'apiname'} = join('', map { ucfirst(lc(substr($_, 0, 2))) } split m/[^A-Za-z0-9\s]+/, $data->{'apiname'});
$data->{'flags'} = 34;
$data->{'uni'} ||= [];
foreach my $n (0..255) {
$data->{'uni'}->[$n] = uniByName($data->{'char'}->[$n] || '.notdef') || 0;
}
delete $data->{'bbox'};
return $data;
} # end of readAFM()
sub readPFM {
my ($self, $file) = @_;
if (! -e $file) {
die "pfmfile='$file' not found.";
}
my $fh = IO::File->new();
my $data = {};
$data->{'issymbol'} = 0;
$data->{'wx'} = {};
$data->{'bbox'} = {};
$data->{'kern'} = {};
$data->{'char'} = [];
my $buf;
open($fh, "<", $file) || return;
binmode($fh, ':raw');
read($fh, $buf, 117 + 30);
my %df;
# Packing structure for PFM Header
( $df{'Version'},
$df{'Size'},
$df{'Copyright'},
$df{'Type'},
$df{'Point'},
$df{'VertRes'},
$df{'HorizRes'},
$df{'Ascent'},
$df{'InternalLeading'},
$df{'ExternalLeading'},
$df{'Italic'},
$df{'Underline'},
$df{'StrikeOut'},
$df{'Weight'},
#define FW_DONTCARE 0
#define FW_THIN 100
#define FW_EXTRALIGHT 200
#define FW_ULTRALIGHT FW_EXTRALIGHT
#define FW_LIGHT 300
#define FW_NORMAL 400
#define FW_REGULAR 400
#define FW_MEDIUM 500
#define FW_SEMIBOLD 600
#define FW_DEMIBOLD FW_SEMIBOLD
#define FW_BOLD 700
lib/PDF/Builder/Resource/Font/Postscript.pm view on Meta::CPAN
$df{'FirstChar'},
$df{'LastChar'},
$df{'DefaultChar'},
$df{'BreakChar'},
$df{'WidthBytes'},
$df{'Device'},
$df{'Face'},
$df{'BitsPointer'},
$df{'BitsOffset'},
$df{'SizeFields'}, # Two bytes, the size of extension section
$df{'ExtMetricsOffset'}, # Four bytes, offset value to the 'Extended Text Metrics' section
$df{'ExtentTable'}, # Four bytes Offset value to the Extent Table
$df{'OriginTable'}, # Four bytes 0
$df{'PairKernTable'}, # Four bytes 0
$df{'TrackKernTable'}, # Four bytes 0
$df{'DriverInfo'}, # Four bytes Offset value to the PostScript font name string
$df{'Reserved'}, # Four bytes 0
) = unpack("vVa60vvvvvvvCCCvCvvCvvCCCCvVVVV vVVVVVVV",$buf); # PFM Header + Ext
seek($fh, $df{Device}, 0);
read($fh, $buf, 250);
($df{'postScript'}) = unpack("Z*", $buf);
$buf = substr($buf, length($df{'postScript'})+1, 250);
($df{'windowsName'}) = unpack("Z*", $buf);
$buf = substr($buf, length($df{'windowsName'})+1, 250);
($df{'psName'}) = unpack("Z*", $buf);
seek($fh, $df{'ExtMetricsOffset'}, 0);
read($fh, $buf, 52);
( $df{'etmSize'},
$df{'PointSize'},
$df{'Orientation'},
$df{'MasterHeight'},
$df{'MinScale'},
$df{'MaxScale'},
$df{'MasterUnits'},
$df{'CapHeight'},
$df{'xHeight'},
$df{'LowerCaseAscent'},
$df{'LowerCaseDescent'},
$df{'Slant'},
$df{'SuperScript'},
$df{'SubScript'},
$df{'SuperScriptSize'},
$df{'SubScriptSize'},
$df{'UnderlineOffset'},
$df{'UnderlineWidth'},
$df{'DoubleUpperUnderlineOffset'},
$df{'DoubleLowerUnderlineOffset'},
$df{'DoubleUpperUnderlineWidth'},
$df{'DoubleLowerUnderlineWidth'},
$df{'StrikeOutOffset'},
$df{'StrikeOutWidth'},
$df{'KernPairs'},
$df{'KernTracks'} ) = unpack('v*', $buf);
$data->{'fontname'} = $df{'psName'};
$data->{'fontname'} =~ s/[^A-Za-z0-9]+//og;
$data->{'apiname'} = join('', map { ucfirst(lc(substr($_, 0, 2))) } split m/[^A-Za-z0-9\s]+/, $df{'windowsName'});
$data->{'upem'} = 1000;
$data->{'fontbbox'} = [-100,-100, $df{'MaxWidth'},$df{'Ascent'}];
$data->{'stemv'} = 0;
$data->{'stemh'} = 0;
$data->{'lastchar'} = $df{'LastChar'}||0; # running max
$data->{'firstchar'} = $df{'FirstChar'}||255; # running min
$data->{'missingwidth'} = $df{'AvgWidth'};
$data->{'maxwidth'} = $df{'MaxWidth'};
$data->{'ascender'} = $df{'Ascent'};
$data->{'descender'} = -$df{'LowerCaseDescent'};
$data->{'flags'} = 0;
# FixedPitch 1
$data->{'flags'} |= 1 if (($df{'PitchAndFamily'} & 1) || ($df{'PitchAndFamily'} & 8)) && !($df{'PitchAndFamily'} & 2);
# Serif 2
$data->{'flags'} |= 2 if ($df{'PitchAndFamily'} & 16) && !($df{'PitchAndFamily'} & 32);
# Symbolic 4
$data->{'flags'} |= 4 if $df{'PitchAndFamily'} & 80;
# Script 8
$data->{'flags'} |= 8 if $df{'PitchAndFamily'} & 64;
# Nonsymbolic 32
$data->{'flags'} |= 32 unless $df{'PitchAndFamily'} & 80;
# Italic 64
$data->{'flags'} |= 64 if $df{'Italic'};
#bit 17 AllCap
#bit 18 SmallCap
#bit 19 ForceBold
$data->{'capheight'} = $df{'CapHeight'};
$data->{'xheight'} = $df{'xHeight'};
$data->{'uni'} = [ unpack('U*', decode('cp1252', pack('C*',(0..255)))) ];
$data->{'char'} = [ map { nameByUni($_) || '.notdef' } @{$data->{'uni'}} ];
$data->{'italicangle'} = -12*$df{'Italic'};
$data->{'isfixedpitch'} = ($df{'PitchAndFamily'} & 8) || ($df{'PitchAndFamily'} & 1);
$data->{'underlineposition'} = -$df{'UnderlineOffset'};
$data->{'underlinethickness'} = $df{'UnderlineWidth'};
seek($fh, $df{'ExtentTable'}, 0);
foreach my $k ($df{'FirstChar'} .. $df{'LastChar'}) {
read($fh, $buf, 2);
my ($wx) = unpack('v', $buf);
$data->{'wx'}->{$data->{'char'}->[$k]} = $wx;
# print STDERR "e: c=$k n='".$data->{'char'}->[$k]."' wx='$wx'\n";
}
$data->{'pfm'} = \%df;
close($fh);
return $data;
} # end of readPFM()
sub readXFM {
( run in 0.654 second using v1.01-cache-2.11-cpan-71847e10f99 )