class TTFunk::Table::Hhea

Horizontal Header (‘hhea`) table.

Attributes

advance_width_max[R]

Maximum advance width value in ‘hmtx` table. @return [Integer]

ascent[R]

Typographic ascent. @return [Integer]

caret_offset[R]

Caret offset. @return [Integer]

caret_slope_rise[R]

Caret slope rise. @return [Integer]

caret_slope_run[R]

Caret slope run. @return [Integer]

descent[R]

Typographic descent. @return [Integer]

line_gap[R]

Typographic line gap. @return [Integer]

metric_data_format[R]

Metric data format. ‘0` for current format. @return [Integer]

min_left_side_bearing[R]

Minimum left sidebearing value in ‘hmtx` table for glyphs with contours (empty glyphs should be ignored). @return [Integer]

min_right_side_bearing[R]

Minimum right sidebearing value. @return [Integer]

number_of_metrics[R]

Number of hMetric entries in ‘hmtx` table. @return [Integer]

version[R]

Table version @return [Integer]

x_max_extent[R]

Maximum extent. @return [Integer]

Public Class Methods

encode(hhea, hmtx, original, mapping) click to toggle source

Encode table.

@param hhea [TTFunk::Table::Hhea] table to encode. @param hmtx [TTFunk::Table::Hmtx] @param original [TTFunk::File] original font file. @param mapping [Hash{Integer => Integer}] keys are new glyph IDs, values

are old glyph IDs

@return [String]

# File lib/ttfunk/table/hhea.rb, line 85
def encode(hhea, hmtx, original, mapping)
  ''.b.tap do |table|
    table << [hhea.version].pack('N')
    table << [
      hhea.ascent, hhea.descent, hhea.line_gap,
      *min_max_values_for(original, mapping),
      hhea.caret_slope_rise, hhea.caret_slope_run, hhea.caret_offset,
      0, 0, 0, 0, hhea.metric_data_format, hmtx[:number_of_metrics],
    ].pack('n*')
  end
end

Private Class Methods

min_max_values_for(original, mapping) click to toggle source
# File lib/ttfunk/table/hhea.rb, line 99
def min_max_values_for(original, mapping)
  min_lsb = Min.new
  min_rsb = Min.new
  max_aw = Max.new
  max_extent = Max.new

  mapping.each_value do |old_glyph_id|
    horiz_metrics = original.horizontal_metrics.for(old_glyph_id)
    next unless horiz_metrics

    min_lsb << horiz_metrics.left_side_bearing
    max_aw << horiz_metrics.advance_width

    glyph = original.find_glyph(old_glyph_id)
    next unless glyph

    x_delta = glyph.x_max - glyph.x_min

    min_rsb << (horiz_metrics.advance_width - horiz_metrics.left_side_bearing - x_delta)

    max_extent << (horiz_metrics.left_side_bearing + x_delta)
  end

  [
    max_aw.value_or(0), min_lsb.value_or(0),
    min_rsb.value_or(0), max_extent.value_or(0),
  ]
end

Public Instance Methods

carot_slope_rise() click to toggle source

@deprecated Use {caret_slope_rise} instead. @!parse attr_reader :carot_slope_rise @return [Integer]

# File lib/ttfunk/table/hhea.rb, line 49
def carot_slope_rise
  @caret_slope_rise
end
carot_slope_run() click to toggle source

@deprecated Use {caret_slope_run} instead. @!parse attr_reader :carot_slope_run @return [Integer]

# File lib/ttfunk/table/hhea.rb, line 60
def carot_slope_run
  @caret_slope_run
end

Private Instance Methods

parse!() click to toggle source
# File lib/ttfunk/table/hhea.rb, line 131
def parse!
  @version = read(4, 'N').first
  @ascent, @descent, @line_gap = read_signed(3)
  @advance_width_max = read(2, 'n').first

  @min_left_side_bearing, @min_right_side_bearing, @x_max_extent,
    @caret_slope_rise, @caret_slope_run, @caret_offset,
    _reserved, _reserved, _reserved, _reserved,
    @metric_data_format = read_signed(11)

  @number_of_metrics = read(2, 'n').first
end