Module: Fontisan::Ufo::Compile::Stat

Defined in:
lib/fontisan/ufo/compile/stat.rb

Overview

Builds the OpenType STAT (Style Attributes) table.

Describes style attributes for each axis and named instances. Required for proper font matching in operating systems.

Constant Summary collapse

HEADER_SIZE =
20
DESIGN_AXIS_RECORD_SIZE =

tag(4) + nameID(2) + ordering(2)

8
AXIS_VALUE_OFFSET_SIZE =

uint32 per axis value

4

Class Method Summary collapse

Class Method Details

.build(axes:, axis_values: nil, elided_name_id: nil) ⇒ String

Returns STAT table bytes.

Parameters:

  • axes (Array<Hash>)

    axis definitions with tag + name_id + ordering

  • axis_values (Array<Hash>) (defaults to: nil)

    value records per axis

  • elided_name_id (Integer, nil) (defaults to: nil)

    fallback name ID

Returns:

  • (String)

    STAT table bytes



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
# File 'lib/fontisan/ufo/compile/stat.rb', line 21

def self.build(axes:, axis_values: nil, elided_name_id: nil)
  return nil if axes.nil? || axes.empty?

  design_axis_count = axes.size
  axis_value_list = axis_values || []
  axis_value_count = axis_value_list.size

  design_axes = serialize_design_axes(axes)
  value_tables, value_offsets = serialize_axis_values(axis_value_list, design_axes.bytesize)

  header = serialize_header(
    design_axis_count: design_axis_count,
    design_axes_size: design_axes.bytesize,
    axis_value_count: axis_value_count,
    elided_name_id: elided_name_id,
  )

  io = +""
  io << header
  io << design_axes
  axis_value_list.each_index do |i|
    io << [value_offsets[i]].pack("N")
  end
  io << value_tables
  io
end