Class: Fontisan::Variation::MetricsAdjuster
- Inherits:
-
Object
- Object
- Fontisan::Variation::MetricsAdjuster
- Includes:
- TableAccessor
- Defined in:
- lib/fontisan/variation/metrics_adjuster.rb
Overview
Applies metrics variation deltas to font metrics tables
This class handles applying variation deltas from HVAR, VVAR, and MVAR tables to the corresponding metrics tables (hmtx, vmtx, head, hhea, etc.).
Process:
-
Parse ItemVariationStore from HVAR/VVAR/MVAR
-
Calculate scalars for current coordinates using regions
-
Apply deltas to base metrics
-
Update metrics tables with adjusted values
Instance Attribute Summary collapse
-
#font ⇒ TrueTypeFont, OpenTypeFont
readonly
Font instance.
-
#interpolator ⇒ Interpolator
readonly
Coordinate interpolator.
Instance Method Summary collapse
-
#apply_hvar_deltas(coordinates) ⇒ Boolean
Apply HVAR deltas to horizontal metrics.
-
#apply_mvar_deltas(coordinates) ⇒ Boolean
Apply MVAR deltas to font-wide metrics.
-
#apply_vvar_deltas(coordinates) ⇒ Boolean
Apply VVAR deltas to vertical metrics.
-
#initialize(font, interpolator) ⇒ MetricsAdjuster
constructor
Initialize metrics adjuster.
Methods included from TableAccessor
#clear_variation_cache, #clear_variation_table, #has_variation_table?, #require_variation_table, #variation_table
Constructor Details
#initialize(font, interpolator) ⇒ MetricsAdjuster
Initialize metrics adjuster
36 37 38 39 40 |
# File 'lib/fontisan/variation/metrics_adjuster.rb', line 36 def initialize(font, interpolator) @font = font @interpolator = interpolator @variation_tables = {} end |
Instance Attribute Details
#font ⇒ TrueTypeFont, OpenTypeFont (readonly)
Returns Font instance.
27 28 29 |
# File 'lib/fontisan/variation/metrics_adjuster.rb', line 27 def font @font end |
#interpolator ⇒ Interpolator (readonly)
Returns Coordinate interpolator.
30 31 32 |
# File 'lib/fontisan/variation/metrics_adjuster.rb', line 30 def interpolator @interpolator end |
Instance Method Details
#apply_hvar_deltas(coordinates) ⇒ Boolean
Apply HVAR deltas to horizontal metrics
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/fontisan/variation/metrics_adjuster.rb', line 46 def apply_hvar_deltas(coordinates) return false unless has_variation_table?("HVAR") return false unless has_variation_table?("hmtx") hvar = variation_table("HVAR") return false unless hvar&.item_variation_store # Parse region list and calculate scalars regions = extract_regions_from_store(hvar.item_variation_store) return false if regions.empty? scalars = @interpolator.calculate_scalars(coordinates, regions) # Get hmtx table hmtx = variation_table("hmtx") return false unless hmtx&.parsed? # Get glyph count maxp = variation_table("maxp") glyph_count = maxp ? maxp.num_glyphs : 0 return false if glyph_count.zero? # Apply deltas to each glyph adjusted_metrics = apply_horizontal_metrics_deltas( hvar, hmtx, glyph_count, scalars ) # Rebuild hmtx table with adjusted metrics rebuild_hmtx_table(adjusted_metrics) true end |
#apply_mvar_deltas(coordinates) ⇒ Boolean
Apply MVAR deltas to font-wide metrics
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/fontisan/variation/metrics_adjuster.rb', line 107 def apply_mvar_deltas(coordinates) return false unless has_variation_table?("MVAR") mvar = variation_table("MVAR") return false unless mvar&.item_variation_store # Parse region list and calculate scalars regions = extract_regions_from_store(mvar.item_variation_store) return false if regions.empty? scalars = @interpolator.calculate_scalars(coordinates, regions) # Apply deltas to each metric tag apply_font_wide_metrics_deltas(mvar, scalars) true end |
#apply_vvar_deltas(coordinates) ⇒ Boolean
Apply VVAR deltas to vertical metrics
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/fontisan/variation/metrics_adjuster.rb', line 83 def apply_vvar_deltas(coordinates) return false unless has_variation_table?("VVAR") return false unless has_variation_table?("vmtx") vvar = variation_table("VVAR") return false unless vvar&.item_variation_store # Parse region list and calculate scalars regions = extract_regions_from_store(vvar.item_variation_store) return false if regions.empty? @interpolator.calculate_scalars(coordinates, regions) # Apply deltas to vmtx # Similar to HVAR but for vertical metrics # Placeholder for full implementation true end |