Class: Fontisan::Tables::Vvar
- Inherits:
-
Binary::BaseRecord
- Object
- BinData::Record
- Binary::BaseRecord
- Fontisan::Tables::Vvar
- 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
Instance Method Summary collapse
-
#advance_height_delta_set(glyph_id) ⇒ Array<Integer>?
Get advance height delta set for a glyph.
-
#advance_height_mapping ⇒ VariationCommon::DeltaSetIndexMap?
Parse advance height mapping.
-
#bsb_delta_set(glyph_id) ⇒ Array<Integer>?
Get BSB delta set for a glyph.
-
#bsb_mapping ⇒ VariationCommon::DeltaSetIndexMap?
Parse BSB (bottom side bearing) mapping.
-
#item_variation_store ⇒ VariationCommon::ItemVariationStore?
Parse the item variation store.
-
#tsb_delta_set(glyph_id) ⇒ Array<Integer>?
Get TSB delta set for a glyph.
-
#tsb_mapping ⇒ VariationCommon::DeltaSetIndexMap?
Parse TSB (top side bearing) mapping.
-
#v_org_delta_set(glyph_id) ⇒ Array<Integer>?
Get vertical origin delta set for a glyph.
-
#v_org_mapping ⇒ VariationCommon::DeltaSetIndexMap?
Parse vertical origin mapping.
-
#valid? ⇒ Boolean
Check if table is valid.
-
#version ⇒ Float
Get version as a float.
Methods inherited from Binary::BaseRecord
Instance Method Details
#advance_height_delta_set(glyph_id) ⇒ Array<Integer>?
Get advance height delta set for a glyph
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_mapping ⇒ VariationCommon::DeltaSetIndexMap?
Parse advance height mapping
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.}" @advance_height_mapping = nil end |
#bsb_delta_set(glyph_id) ⇒ Array<Integer>?
Get BSB delta set for a glyph
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_mapping ⇒ VariationCommon::DeltaSetIndexMap?
Parse BSB (bottom side bearing) mapping
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.}" @bsb_mapping = nil end |
#item_variation_store ⇒ VariationCommon::ItemVariationStore?
Parse the item variation store
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.}" @item_variation_store = nil end |
#tsb_delta_set(glyph_id) ⇒ Array<Integer>?
Get TSB delta set for a glyph
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_mapping ⇒ VariationCommon::DeltaSetIndexMap?
Parse TSB (top side bearing) mapping
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.}" @tsb_mapping = nil end |
#v_org_delta_set(glyph_id) ⇒ Array<Integer>?
Get vertical origin delta set for a glyph
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_mapping ⇒ VariationCommon::DeltaSetIndexMap?
Parse vertical origin mapping
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.}" @v_org_mapping = nil end |
#valid? ⇒ Boolean
Check if table is valid
226 227 228 |
# File 'lib/fontisan/tables/vvar.rb', line 226 def valid? major_version == 1 && minor_version.zero? end |
#version ⇒ Float
Get version as a float
32 33 34 |
# File 'lib/fontisan/tables/vvar.rb', line 32 def version major_version + (minor_version / 10.0) end |