Module: Fontisan::Ufo::Compile::ItemVariationStore

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

Overview

Shared builder for the ItemVariationStore structure used by HVAR, MVAR, and other variation tables.

The ItemVariationStore consists of:

1. A VariationRegionList (defines axis regions)
2. One or more ItemVariationData (delta sets per item)

Class Method Summary collapse

Class Method Details

.build(axis_count:, master_count:, item_count:, deltas:) ⇒ String

Returns ItemVariationStore bytes.

Parameters:

  • axis_count (Integer)
  • master_count (Integer)

    number of masters (one region per master)

  • item_count (Integer)

    number of items (glyphs for HVAR, metrics for MVAR)

  • deltas (Array<Array<Integer>>)

    deltas[master] = delta value

Returns:

  • (String)

    ItemVariationStore bytes



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

def self.build(axis_count:, master_count:, item_count:, deltas:)
  # Build regions: one per master, each with peak=1.0 on its axis
  regions = build_regions(axis_count, master_count)
  region_list = serialize_region_list(regions, axis_count)

  # Build ItemVariationData: one data block covering all items
  var_data = serialize_variation_data(item_count, master_count, deltas)

  # Assemble the store
  # Header layout: format(uint16) + variationRegionListOffset(uint32)
  # + itemVariationDataCount(uint16) + itemVariationDataOffsets[1](uint32)
  #             = 2 + 4 + 2 + 4 = 12 bytes total before region list
  header_size = 8 # format(2) + regionListOffset(4) + itemVariationDataCount(2)
  offsets_array_size = 4 # one data block → one offset
  region_list_offset = header_size + offsets_array_size
  var_data_offset = region_list_offset + region_list.bytesize

  store = +""
  store << [1].pack("n")                    # format = 1
  store << [region_list_offset].pack("N")   # variationRegionListOffset
  store << [1].pack("n")                    # itemVariationDataCount
  store << [var_data_offset].pack("N")      # itemVariationDataOffsets[0]
  store << region_list
  store << var_data
  store
end