class TTFunk::Table::Kern::Format0

Attributes

attributes[R]
pairs[R]

Public Class Methods

new(attributes = {}) click to toggle source
# File lib/ttfunk/table/kern/format0.rb, line 14
def initialize(attributes = {})
  @attributes = attributes

  num_pairs, *pairs = attributes.delete(:data).unpack('nx6n*')

  @pairs = {}
  num_pairs.times do |i|
    # sanity check, in case there's a bad length somewhere
    break if i * 3 + 2 > pairs.length

    left = pairs[i * 3]
    right = pairs[i * 3 + 1]
    value = to_signed(pairs[i * 3 + 2])
    @pairs[[left, right]] = value
  end
end

Public Instance Methods

cross_stream?() click to toggle source
# File lib/ttfunk/table/kern/format0.rb, line 39
def cross_stream?
  @attributes[:cross]
end
horizontal?() click to toggle source
# File lib/ttfunk/table/kern/format0.rb, line 35
def horizontal?
  !vertical?
end
recode(mapping) click to toggle source
# File lib/ttfunk/table/kern/format0.rb, line 43
def recode(mapping)
  subset = []
  pairs.each do |(left, right), value|
    if mapping[left] && mapping[right]
      subset << [mapping[left], mapping[right], value]
    end
  end

  return if subset.empty?

  num_pairs = subset.length
  search_range = 2 * 2**(Math.log(num_pairs) / Math.log(2)).to_i
  entry_selector = (Math.log(search_range / 2) / Math.log(2)).to_i
  range_shift = (2 * num_pairs) - search_range

  [
    attributes[:version],
    num_pairs * 6 + 14,
    attributes[:coverage],
    num_pairs,
    search_range,
    entry_selector,
    range_shift,
    subset
  ].flatten.pack('n*')
end
vertical?() click to toggle source
# File lib/ttfunk/table/kern/format0.rb, line 31
def vertical?
  @attributes[:vertical]
end