Class: Fontisan::Tables::VariationCommon::ItemVariationStore

Inherits:
Binary::BaseRecord
  • Object
show all
Defined in:
lib/fontisan/tables/variation_common.rb

Overview

Item variation store

Hierarchical storage for delta values. Contains variation data entries and a region list that defines variation regions in design space.

Used by: HVAR, VVAR, MVAR tables

Instance Method Summary collapse

Methods inherited from Binary::BaseRecord

#raw_data, read, #valid?

Instance Method Details

#delta_set(outer_index, inner_index) ⇒ Array<Integer>?

Get delta set for specific item

Parameters:

  • outer_index (Integer)

    Outer index (data entry)

  • inner_index (Integer)

    Inner index (item within entry)

Returns:

  • (Array<Integer>, nil)

    Delta values or nil



263
264
265
266
267
268
269
270
# File 'lib/fontisan/tables/variation_common.rb', line 263

def delta_set(outer_index, inner_index)
  return nil if outer_index >= item_variation_data_count

  entry = item_variation_data_entries[outer_index]
  return nil if entry.nil? || inner_index >= entry.item_count

  entry.delta_sets[inner_index]
end

#item_variation_data_entriesArray<ItemVariationData>

Parse all item variation data entries

Returns:



241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/fontisan/tables/variation_common.rb', line 241

def item_variation_data_entries
  return @data_entries if @data_entries
  return @data_entries = [] if item_variation_data_count.zero?

  data = raw_data
  offsets = item_variation_data_offsets

  @data_entries = offsets.map do |data_offset|
    next nil if data_offset >= data.bytesize

    entry_data = data.byteslice(data_offset..-1)
    ItemVariationData.read(entry_data)
  end.compact
rescue StandardError
  @data_entries = []
end

#item_variation_data_offsetsArray<Integer>

Parse item variation data offsets

Returns:

  • (Array<Integer>)

    Offsets to ItemVariationData



223
224
225
226
227
228
229
230
231
232
233
234
235
236
# File 'lib/fontisan/tables/variation_common.rb', line 223

def item_variation_data_offsets
  return @data_offsets if @data_offsets
  return @data_offsets = [] if item_variation_data_count.zero?

  data = raw_data
  offset = 8 # After header fields

  @data_offsets = Array.new(item_variation_data_count) do |i|
    offset_pos = offset + (i * 4)
    next nil if offset_pos + 4 > data.bytesize

    data.byteslice(offset_pos, 4).unpack1("N")
  end.compact
end

#variation_region_listVariationRegionList?

Parse variation region list

Returns:



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

def variation_region_list
  return @variation_region_list if defined?(@variation_region_list)
  return @variation_region_list = nil if variation_region_list_offset.zero?

  data = raw_data
  offset = variation_region_list_offset

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

  region_data = data.byteslice(offset..-1)
  @variation_region_list = VariationRegionList.read(region_data)
rescue StandardError
  @variation_region_list = nil
end