Class: Fontisan::Tables::Vvar

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

Overview

Parser for the 'VVAR' (Vertical Metrics Variations) table

The VVAR table provides variation data for vertical metrics including:

  • Advance height variations
  • Top side bearing (TSB) variations

This table uses the ItemVariationStore structure to efficiently store delta values for different regions in the design space.

Reference: OpenType specification, VVAR table

Examples:

Reading a VVAR table

data = font.table_data("VVAR")
vvar = Fontisan::Tables::Vvar.read(data)
advance_deltas = vvar.advance_height_deltas(glyph_id, coordinates)

Instance Method Summary collapse

Methods inherited from Binary::BaseRecord

#raw_data, read

Instance Method Details

#advance_height_delta_set(glyph_id) ⇒ Array<Integer>?

Get advance height delta set for a glyph

Parameters:

  • glyph_id (Integer)

    Glyph ID

Returns:

  • (Array<Integer>, nil)

    Delta values or nil



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/fontisan/tables/vvar.rb', line 135

def advance_height_delta_set(glyph_id)
  return nil unless item_variation_store

  # If no mapping, use glyph_id directly
  if advance_height_mapping.nil?
    return item_variation_store.delta_set(0, glyph_id)
  end

  # Use mapping to get delta set indices
  map_data = advance_height_mapping.map_data
  return nil if glyph_id >= map_data.length

  delta_index = map_data[glyph_id]
  outer_index = (delta_index >> 16) & 0xFFFF
  inner_index = delta_index & 0xFFFF

  item_variation_store.delta_set(outer_index, inner_index)
end

#advance_height_mappingVariationCommon::DeltaSetIndexMap?

Parse advance height mapping

Returns:



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/fontisan/tables/vvar.rb', line 58

def advance_height_mapping
  return @advance_height_mapping if defined?(@advance_height_mapping)
  return @advance_height_mapping = nil if advance_height_mapping_offset.zero?

  data = raw_data
  offset = advance_height_mapping_offset

  return @advance_height_mapping = nil if offset >= data.bytesize

  map_data = data.byteslice(offset..-1)
  @advance_height_mapping = VariationCommon::DeltaSetIndexMap.read(map_data)
rescue StandardError => e
  warn "Failed to parse VVAR advance height mapping: #{e.message}"
  @advance_height_mapping = nil
end

#bsb_delta_set(glyph_id) ⇒ Array<Integer>?

Get BSB delta set for a glyph

Parameters:

  • glyph_id (Integer)

    Glyph ID

Returns:

  • (Array<Integer>, nil)

    Delta values or nil



181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/fontisan/tables/vvar.rb', line 181

def bsb_delta_set(glyph_id)
  return nil unless item_variation_store

  # If no mapping, use glyph_id directly
  if bsb_mapping.nil?
    return item_variation_store.delta_set(0, glyph_id)
  end

  # Use mapping to get delta set indices
  map_data = bsb_mapping.map_data
  return nil if glyph_id >= map_data.length

  delta_index = map_data[glyph_id]
  outer_index = (delta_index >> 16) & 0xFFFF
  inner_index = delta_index & 0xFFFF

  item_variation_store.delta_set(outer_index, inner_index)
end

#bsb_mappingVariationCommon::DeltaSetIndexMap?

Parse BSB (bottom side bearing) mapping

Returns:



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/fontisan/tables/vvar.rb', line 96

def bsb_mapping
  return @bsb_mapping if defined?(@bsb_mapping)
  return @bsb_mapping = nil if bsb_mapping_offset.zero?

  data = raw_data
  offset = bsb_mapping_offset

  return @bsb_mapping = nil if offset >= data.bytesize

  map_data = data.byteslice(offset..-1)
  @bsb_mapping = VariationCommon::DeltaSetIndexMap.read(map_data)
rescue StandardError => e
  warn "Failed to parse VVAR BSB mapping: #{e.message}"
  @bsb_mapping = nil
end

#item_variation_storeVariationCommon::ItemVariationStore?

Parse the item variation store

Returns:



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/fontisan/tables/vvar.rb', line 39

def item_variation_store
  return @item_variation_store if defined?(@item_variation_store)
  return @item_variation_store = nil if item_variation_store_offset.zero?

  data = raw_data
  offset = item_variation_store_offset

  return @item_variation_store = nil if offset >= data.bytesize

  store_data = data.byteslice(offset..-1)
  @item_variation_store = VariationCommon::ItemVariationStore.read(store_data)
rescue StandardError => e
  warn "Failed to parse VVAR item variation store: #{e.message}"
  @item_variation_store = nil
end

#tsb_delta_set(glyph_id) ⇒ Array<Integer>?

Get TSB delta set for a glyph

Parameters:

  • glyph_id (Integer)

    Glyph ID

Returns:

  • (Array<Integer>, nil)

    Delta values or nil



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/fontisan/tables/vvar.rb', line 158

def tsb_delta_set(glyph_id)
  return nil unless item_variation_store

  # If no mapping, use glyph_id directly
  if tsb_mapping.nil?
    return item_variation_store.delta_set(0, glyph_id)
  end

  # Use mapping to get delta set indices
  map_data = tsb_mapping.map_data
  return nil if glyph_id >= map_data.length

  delta_index = map_data[glyph_id]
  outer_index = (delta_index >> 16) & 0xFFFF
  inner_index = delta_index & 0xFFFF

  item_variation_store.delta_set(outer_index, inner_index)
end

#tsb_mappingVariationCommon::DeltaSetIndexMap?

Parse TSB (top side bearing) mapping

Returns:



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/fontisan/tables/vvar.rb', line 77

def tsb_mapping
  return @tsb_mapping if defined?(@tsb_mapping)
  return @tsb_mapping = nil if tsb_mapping_offset.zero?

  data = raw_data
  offset = tsb_mapping_offset

  return @tsb_mapping = nil if offset >= data.bytesize

  map_data = data.byteslice(offset..-1)
  @tsb_mapping = VariationCommon::DeltaSetIndexMap.read(map_data)
rescue StandardError => e
  warn "Failed to parse VVAR TSB mapping: #{e.message}"
  @tsb_mapping = nil
end

#v_org_delta_set(glyph_id) ⇒ Array<Integer>?

Get vertical origin delta set for a glyph

Parameters:

  • glyph_id (Integer)

    Glyph ID

Returns:

  • (Array<Integer>, nil)

    Delta values or nil



204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/fontisan/tables/vvar.rb', line 204

def v_org_delta_set(glyph_id)
  return nil unless item_variation_store

  # If no mapping, use glyph_id directly
  if v_org_mapping.nil?
    return item_variation_store.delta_set(0, glyph_id)
  end

  # Use mapping to get delta set indices
  map_data = v_org_mapping.map_data
  return nil if glyph_id >= map_data.length

  delta_index = map_data[glyph_id]
  outer_index = (delta_index >> 16) & 0xFFFF
  inner_index = delta_index & 0xFFFF

  item_variation_store.delta_set(outer_index, inner_index)
end

#v_org_mappingVariationCommon::DeltaSetIndexMap?

Parse vertical origin mapping

Returns:



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/fontisan/tables/vvar.rb', line 115

def v_org_mapping
  return @v_org_mapping if defined?(@v_org_mapping)
  return @v_org_mapping = nil if v_org_mapping_offset.zero?

  data = raw_data
  offset = v_org_mapping_offset

  return @v_org_mapping = nil if offset >= data.bytesize

  map_data = data.byteslice(offset..-1)
  @v_org_mapping = VariationCommon::DeltaSetIndexMap.read(map_data)
rescue StandardError => e
  warn "Failed to parse VVAR vertical origin mapping: #{e.message}"
  @v_org_mapping = nil
end

#valid?Boolean

Check if table is valid

Returns:

  • (Boolean)

    True if valid



226
227
228
# File 'lib/fontisan/tables/vvar.rb', line 226

def valid?
  major_version == 1 && minor_version.zero?
end

#versionFloat

Get version as a float

Returns:

  • (Float)

    Version number (e.g., 1.0)



32
33
34
# File 'lib/fontisan/tables/vvar.rb', line 32

def version
  major_version + (minor_version / 10.0)
end