| #!/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; |