Class: Fontisan::Tables::Hhea

Inherits:
Binary::BaseRecord show all
Defined in:
lib/fontisan/tables/hhea.rb

Overview

BinData structure for the ‘hhea’ (Horizontal Header) table

The hhea table contains horizontal layout metrics for the entire font. It defines font-wide horizontal metrics such as ascent, descent, line gap, and the number of horizontal metrics in the hmtx table.

Reference: OpenType specification, hhea table docs.microsoft.com/en-us/typography/opentype/spec/hhea

Examples:

Reading an hhea table

data = File.binread("font.ttf", 36, hhea_offset)
hhea = Fontisan::Tables::Hhea.read(data)
puts hhea.ascent           # => 2048
puts hhea.descent          # => -512
puts hhea.version_number   # => 1.0

Constant Summary collapse

TABLE_SIZE =

Table size in bytes (fixed size)

36

Instance Method Summary collapse

Methods inherited from Binary::BaseRecord

#raw_data, read

Instance Method Details

#valid?Boolean

Check if the table is valid

Returns:

  • (Boolean)

    True if valid, false otherwise



87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/fontisan/tables/hhea.rb', line 87

def valid?
  # Version should be 1.0 (0x00010000)
  return false unless version_raw == 0x00010000

  # Metric data format must be 0
  return false unless metric_data_format.zero?

  # Number of metrics must be at least 1
  return false unless number_of_h_metrics >= 1

  true
end

#valid_advance_width_max?Boolean

Validation helper: Check if advance width max is positive

Maximum advance width should be > 0

Returns:

  • (Boolean)

    True if advance_width_max > 0



150
151
152
# File 'lib/fontisan/tables/hhea.rb', line 150

def valid_advance_width_max?
  advance_width_max&.positive?
end

#valid_ascent_descent?Boolean

Validation helper: Check if ascent/descent values are reasonable

Ascent should be positive, descent should be negative

Returns:

  • (Boolean)

    True if ascent/descent have correct signs



132
133
134
# File 'lib/fontisan/tables/hhea.rb', line 132

def valid_ascent_descent?
  ascent.positive? && descent.negative?
end

#valid_caret_slope?Boolean

Validation helper: Check if caret slope is valid

For vertical text: rise=1, run=0 For horizontal italic: both should be non-zero

Returns:

  • (Boolean)

    True if caret slope values are sensible



160
161
162
163
# File 'lib/fontisan/tables/hhea.rb', line 160

def valid_caret_slope?
  # At least one should be non-zero
  caret_slope_rise != 0 || caret_slope_run != 0
end

#valid_line_gap?Boolean

Validation helper: Check if line gap is non-negative

Line gap should be >= 0

Returns:

  • (Boolean)

    True if line_gap >= 0



141
142
143
# File 'lib/fontisan/tables/hhea.rb', line 141

def valid_line_gap?
  line_gap >= 0
end

#valid_metric_data_format?Boolean

Validation helper: Check if metric data format is valid

Must be 0 for current format

Returns:

  • (Boolean)

    True if format is 0



114
115
116
# File 'lib/fontisan/tables/hhea.rb', line 114

def valid_metric_data_format?
  metric_data_format.zero?
end

#valid_number_of_h_metrics?Boolean

Validation helper: Check if number of h metrics is valid

Must be at least 1

Returns:

  • (Boolean)

    True if number_of_h_metrics >= 1



123
124
125
# File 'lib/fontisan/tables/hhea.rb', line 123

def valid_number_of_h_metrics?
  number_of_h_metrics && number_of_h_metrics >= 1
end

#valid_version?Boolean

Validation helper: Check if version is valid

OpenType spec requires version to be 1.0

Returns:

  • (Boolean)

    True if version is 1.0



105
106
107
# File 'lib/fontisan/tables/hhea.rb', line 105

def valid_version?
  version_raw == 0x00010000
end

#valid_x_max_extent?Boolean

Validation helper: Check if extent is reasonable

x_max_extent should be positive

Returns:

  • (Boolean)

    True if x_max_extent > 0



170
171
172
# File 'lib/fontisan/tables/hhea.rb', line 170

def valid_x_max_extent?
  x_max_extent.positive?
end

#validate!Object

Validate the table and raise error if invalid

Raises:



177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/fontisan/tables/hhea.rb', line 177

def validate!
  unless version_raw == 0x00010000
    message = "Invalid hhea version: expected 0x00010000 (1.0), " \
              "got 0x#{version_raw.to_i.to_s(16).upcase}"
    raise Fontisan::CorruptedTableError, message
  end

  unless metric_data_format.zero?
    message = "Invalid metric data format: expected 0, " \
              "got #{metric_data_format.to_i}"
    raise Fontisan::CorruptedTableError, message
  end

  unless number_of_h_metrics >= 1
    message = "Invalid number of h metrics: must be >= 1, " \
              "got #{number_of_h_metrics.to_i}"
    raise Fontisan::CorruptedTableError, message
  end
end

#versionFloat

Convert version from fixed-point to float

Returns:

  • (Float)

    Version number (typically 1.0)



80
81
82
# File 'lib/fontisan/tables/hhea.rb', line 80

def version
  fixed_to_float(version_raw)
end