class PDF::Reader::CidWidths

A Hash-like object that wraps the array of glyph widths in a CID font and gives us a nice way to query it for specific widths.

there are two ways to calculate a cidfont_glyph_width, that are defined in Section 9.7.4.3 PDF 32000-1:2008 pp 271, the differences are remarked on below. because of these difference that may be contained within the same array, it is a bit difficult to parse this array.

Public Class Methods

new(default, array) click to toggle source
# File lib/pdf/reader/cid_widths.rb, line 21
def initialize(default, array)
  @widths = parse_array(default, array.dup)
end

Private Instance Methods

parse_array(default, array) click to toggle source
# File lib/pdf/reader/cid_widths.rb, line 27
def parse_array(default, array)
  widths  = Hash.new(default)
  params = []
  while array.size > 0
    params << array.shift

    if params.size == 2 && params.last.is_a?(Array)
      widths.merge! parse_first_form(params.first.to_i, Array(params.last))
      params = []
    elsif params.size == 3
      widths.merge! parse_second_form(params[0].to_i, params[1].to_i, params[2].to_i)
      params = []
    end
  end
  widths
end
parse_first_form(first, widths) click to toggle source

this is the form 10 [234 63 234 346 47 234] where width of index 10 is 234, index 11 is 63, etc

# File lib/pdf/reader/cid_widths.rb, line 46
def parse_first_form(first, widths)
  widths.inject({}) { |accum, glyph_width|
    accum[first + accum.size] = glyph_width
    accum
  }
end
parse_second_form(first, final, width) click to toggle source

this is the form 10 20 123 where all index between 10 and 20 have width 123

# File lib/pdf/reader/cid_widths.rb, line 54
def parse_second_form(first, final, width)
  raise MalformedPDFError, "CidWidths: #{first} must be less than #{final}" unless first < final

  (first..final).inject({}) { |accum, index|
    accum[index] = width
    accum
  }
end