1 2 3 4 5 6 7 8 9 10 11 12 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
|
require 'ttfunk/table'
module TTFunk
class Table
class Hmtx < Table
attr_reader :metrics
attr_reader :left_side_bearings
attr_reader :widths
def self.encode(hmtx, mapping)
metrics = mapping.keys.sort.map do |new_id|
metric = hmtx.for(mapping[new_id])
[metric.advance_width, metric.left_side_bearing]
end
{ :number_of_metrics => metrics.length,
:table => metrics.flatten.pack("n*") }
end
HorizontalMetric = Struct.new(:advance_width, :left_side_bearing)
def for(glyph_id)
@metrics[glyph_id] ||
HorizontalMetric.new(@metrics.last.advance_width,
@left_side_bearings[glyph_id - @metrics.length])
end
private
def parse!
@metrics = []
file.horizontal_header.number_of_metrics.times do
advance = read(2, "n").first
lsb = read_signed(1).first
@metrics.push HorizontalMetric.new(advance, lsb)
end
lsb_count = file.maximum_profile.num_glyphs - file.horizontal_header.number_of_metrics
@left_side_bearings = read_signed(lsb_count)
@widths = @metrics.map { |metric| metric.advance_width }
@widths += [@widths.last] * @left_side_bearings.length
end
end
end
end
|