| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #!/usr/bin/perl
- ## --------------------------------------------------------------------------
- ##
- ## Copyright 1996-2017 The NASM Authors - All Rights Reserved
- ## See the file AUTHORS included with the NASM distribution for
- ## the specific copyright holders.
- ##
- ## Redistribution and use in source and binary forms, with or without
- ## modification, are permitted provided that the following
- ## conditions are met:
- ##
- ## * Redistributions of source code must retain the above copyright
- ## notice, this list of conditions and the following disclaimer.
- ## * Redistributions in binary form must reproduce the above
- ## copyright notice, this list of conditions and the following
- ## disclaimer in the documentation and/or other materials provided
- ## with the distribution.
- ##
- ## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- ## CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- ## INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- ## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- ## NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- ## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- ## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- ## CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- ## OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
- ## EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- ##
- ## --------------------------------------------------------------------------
- #
- # Parse AFM metric file, returns a reference to fontdata
- #
- sub parse_afm_file($$) {
- my($filename, $filetype) = @_;
- my $fontdata = {
- widths => {},
- kern => {}
- };
- my $charmetrics = 0;
- my $kerndata = 0;
- my $charcode, $width, $name;
- my $fontfile = $filename.'.'.$filetype;
- return undef unless ( -f $fontfile );
- $fontdata->{file} = $fontfile;
- $fontdata->{type} = $filetype;
- $fontdata->{scale} = 1000; # AFM metrics always have scale 1000
- return undef unless (open(my $fh, '<', $filename.'.afm'));
- while ( my $line = <$fh> ) {
- if ( $line =~ /^\s*FontName\s+(.*)\s*$/i ) {
- $fontdata->{'name'} = $1;
- } elsif ( $line =~ /^\s*StartCharMetrics\b/i ) {
- $charmetrics = 1;
- } elsif ( $line =~ /^\s*EndCharMetrics\b/i ) {
- $charmetrics = 0;
- } elsif ( $line =~ /^\s*StartKernPairs\b/i ) {
- $kerndata = 1;
- } elsif ( $line =~ /^\s*EndKernPairs\b/i ) {
- $kerndata = 0;
- } elsif ( $charmetrics ) {
- my @data = split(/\s*;\s*/, $line);
- undef $charcode, $width, $name;
- foreach my $d ( @data ) {
- my @dd = split(/\s+/, $d);
- if ( $dd[0] eq 'C' ) {
- $charcode = $dd[1];
- } elsif ( $dd[0] eq 'WX' ) {
- $width = $dd[1];
- } elsif ( $dd[0] eq 'W' ) {
- $width = $dd[2];
- } elsif ( $dd[0] eq 'N' ) {
- $name = $dd[1];
- }
- }
- if ( defined($name) && defined($width) ) {
- $fontdata->{widths}{$name} = $width;
- }
- } elsif ( $kerndata ) {
- my($kpx, $a, $b, $adj) = split(/\s+/, $line);
- if ( $kpx eq 'KPX' ) {
- if (!exists($fontdata->{kern}{$a})) {
- $fontdata->{kern}{$a} = {};
- }
- $fontdata->{kern}{$a}{$b} = $adj;
- }
- }
- }
- return $fontdata;
- }
- 1;
|