Class: AFM::Font

Inherits:
Object
  • Object
show all
Defined in:
lib/pdf/reader/width_calculator/built_in.rb

Overview

monkey patch the afm gem to give us access to the metrics by glyph code. I’ve got a pull request to upstream so hopefully this can be removed soon. See github.com/halfbyte/afm/pull/3

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(filename) ⇒ Font

Loading a Font Metrics file by absolute path (no automatic font path resolution)



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/pdf/reader/width_calculator/built_in.rb', line 13

def initialize(filename)
  @metadata = {}
  @char_metrics = {}
  @char_metrics_by_code = {}
  @kern_pairs = []
  File.open(filename) do |file|
    mode = :meta
    file.each_line do |line|
      case(line)
      when /^StartFontMetrics/ ; mode = :meta
      when /^StartCharMetrics/ ; mode = :char_metrics
      when /^EndCharMetrics/ ; mode = :meta
      when /^StartKernData/ ; mode = :kern_data
      when /^StartKernPairs/ ; mode = :kern_pairs
      when /^EndKernPairs/ ; mode = :kern_data
      when /^EndKernData/ ; mode = :meta
      else
        case(mode)
        when :meta
          if match = line.match(/^([\w]+) (.*)$/)
            @metadata[match[1]] = match[2]
          end
        when :char_metrics
          metrics = {}
          metrics[:charcode] = match[1].to_i if match = line.match(/C (-?\d+) *?;/)
          metrics[:wx] = match[1].to_i if match = line.match(/WX (-?\d+) *?;/)
          metrics[:name] = match[1] if match = line.match(/N ([.\w]+) *?;/)
          if match = line.match(/B (-?\d+) (-?\d+) (-?\d+) (-?\d+) *?;/)
            metrics[:boundingbox] = [match[1].to_i, match[2].to_i, match[3].to_i, match[4].to_i]
          end
          @char_metrics[metrics[:name]] = metrics if metrics[:name]
          @char_metrics_by_code[metrics[:charcode]] = metrics if metrics[:charcode] && metrics[:charcode] > 0
        when :kern_pairs
          if match = line.match(/^KPX ([.\w]+) ([.\w]+) (-?\d+)$/)
            @kern_pairs << [match[1], match[2], match[3].to_i]
          end
        end
      end
    end
  end
end

Instance Attribute Details

#char_metrics_by_codeObject (readonly)

Returns the value of attribute char_metrics_by_code.



10
11
12
# File 'lib/pdf/reader/width_calculator/built_in.rb', line 10

def char_metrics_by_code
  @char_metrics_by_code
end