Class: Fontisan::Variation::VariationContext
- Inherits:
-
Object
- Object
- Fontisan::Variation::VariationContext
- Defined in:
- lib/fontisan/variation/variation_context.rb
Overview
Provides shared context for variation operations
This class centralizes the initialization of common variation components (axes, interpolator, region matcher) that are needed by most variation operations. It ensures consistent initialization and validation.
Instance Attribute Summary collapse
-
#axes ⇒ Array<VariationAxisRecord>
readonly
Variation axes.
-
#font ⇒ TrueTypeFont, OpenTypeFont
readonly
Font instance.
-
#fvar ⇒ Fvar?
readonly
Fvar table.
-
#interpolator ⇒ Interpolator
readonly
Coordinate interpolator.
-
#region_matcher ⇒ RegionMatcher
readonly
Region matcher.
Instance Method Summary collapse
-
#axis_count ⇒ Integer
Get number of axes.
-
#axis_tags ⇒ Array<String>
Get axis tags.
-
#default_coordinates ⇒ Hash<String, Float>
Get default coordinates.
-
#find_axis(axis_tag) ⇒ VariationAxisRecord?
Find axis by tag.
-
#has_glyph_variations? ⇒ Boolean
Check if font has glyph variations.
-
#has_metrics_variations? ⇒ Boolean
Check if font has metrics variations.
-
#initialize(font) ⇒ VariationContext
constructor
Initialize variation context.
-
#normalize_coordinates(coordinates) ⇒ Hash<String, Float>
Normalize coordinates to [-1, 1] range.
-
#validate! ⇒ void
Validate that font is a proper variable font.
-
#validate_coordinates(coordinates) ⇒ void
Validate coordinates against axes.
-
#variable_font? ⇒ Boolean
Check if font is a variable font.
-
#variation_type ⇒ Symbol
Get variation type.
Constructor Details
#initialize(font) ⇒ VariationContext
Initialize variation context
Loads fvar table and initializes all common variation components. Does not validate - call validate! explicitly if needed.
52 53 54 55 56 57 58 |
# File 'lib/fontisan/variation/variation_context.rb', line 52 def initialize(font) @font = font @fvar = font.has_table?("fvar") ? font.table("fvar") : nil @axes = @fvar ? @fvar.axes : [] @interpolator = Interpolator.new(@axes) @region_matcher = RegionMatcher.new(@axes) end |
Instance Attribute Details
#axes ⇒ Array<VariationAxisRecord> (readonly)
Returns Variation axes.
38 39 40 |
# File 'lib/fontisan/variation/variation_context.rb', line 38 def axes @axes end |
#font ⇒ TrueTypeFont, OpenTypeFont (readonly)
Returns Font instance.
32 33 34 |
# File 'lib/fontisan/variation/variation_context.rb', line 32 def font @font end |
#fvar ⇒ Fvar? (readonly)
Returns fvar table.
35 36 37 |
# File 'lib/fontisan/variation/variation_context.rb', line 35 def fvar @fvar end |
#interpolator ⇒ Interpolator (readonly)
Returns Coordinate interpolator.
41 42 43 |
# File 'lib/fontisan/variation/variation_context.rb', line 41 def interpolator @interpolator end |
#region_matcher ⇒ RegionMatcher (readonly)
Returns Region matcher.
44 45 46 |
# File 'lib/fontisan/variation/variation_context.rb', line 44 def region_matcher @region_matcher end |
Instance Method Details
#axis_count ⇒ Integer
Get number of axes
98 99 100 |
# File 'lib/fontisan/variation/variation_context.rb', line 98 def axis_count @axes.length end |
#axis_tags ⇒ Array<String>
Get axis tags
117 118 119 |
# File 'lib/fontisan/variation/variation_context.rb', line 117 def @axes.map(&:axis_tag) end |
#default_coordinates ⇒ Hash<String, Float>
Get default coordinates
Returns coordinates at default values for all axes.
160 161 162 163 164 165 166 |
# File 'lib/fontisan/variation/variation_context.rb', line 160 def default_coordinates coordinates = {} @axes.each do |axis| coordinates[axis.axis_tag] = axis.default_value end coordinates end |
#find_axis(axis_tag) ⇒ VariationAxisRecord?
Find axis by tag
110 111 112 |
# File 'lib/fontisan/variation/variation_context.rb', line 110 def find_axis(axis_tag) @axes.find { |axis| axis.axis_tag == axis_tag } end |
#has_glyph_variations? ⇒ Boolean
Check if font has glyph variations
197 198 199 |
# File 'lib/fontisan/variation/variation_context.rb', line 197 def has_glyph_variations? @font.has_table?("gvar") || @font.has_table?("CFF2") end |
#has_metrics_variations? ⇒ Boolean
Check if font has metrics variations
204 205 206 207 208 |
# File 'lib/fontisan/variation/variation_context.rb', line 204 def has_metrics_variations? @font.has_table?("HVAR") || @font.has_table?("VVAR") || @font.has_table?("MVAR") end |
#normalize_coordinates(coordinates) ⇒ Hash<String, Float>
Normalize coordinates to [-1, 1] range
Convenience method that delegates to interpolator.
174 175 176 |
# File 'lib/fontisan/variation/variation_context.rb', line 174 def normalize_coordinates(coordinates) @interpolator.normalize_coordinates(coordinates) end |
#validate! ⇒ void
This method returns an undefined value.
Validate that font is a proper variable font
Checks for fvar table and axes definition. Raises errors if font is not a valid variable font.
73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/fontisan/variation/variation_context.rb', line 73 def validate! unless @fvar raise MissingVariationTableError.new( table: "fvar", message: "Font is not a variable font (missing fvar table)", ) end if @axes.empty? raise InvalidVariationDataError.new( message: "Variable font has no axes defined in fvar table", ) end end |
#validate_coordinates(coordinates) ⇒ void
This method returns an undefined value.
Validate coordinates against axes
Checks that all coordinate values are within valid axis ranges.
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/fontisan/variation/variation_context.rb', line 131 def validate_coordinates(coordinates) coordinates.each do |axis_tag, value| axis = find_axis(axis_tag) unless axis raise InvalidCoordinatesError.new( axis: axis_tag, value: value, range: [], message: "Unknown axis '#{axis_tag}'", ) end if value < axis.min_value || value > axis.max_value raise InvalidCoordinatesError.new( axis: axis_tag, value: value, range: [axis.min_value, axis.max_value], message: "Coordinate #{value} for axis '#{axis_tag}' outside valid range [#{axis.min_value}, #{axis.max_value}]", ) end end end |
#variable_font? ⇒ Boolean
Check if font is a variable font
91 92 93 |
# File 'lib/fontisan/variation/variation_context.rb', line 91 def variable_font? !@fvar.nil? end |
#variation_type ⇒ Symbol
Get variation type
Determines whether font uses TrueType (gvar) or PostScript (CFF2) variation format.
184 185 186 187 188 189 190 191 192 |
# File 'lib/fontisan/variation/variation_context.rb', line 184 def variation_type if @font.has_table?("CFF2") :postscript elsif @font.has_table?("gvar") :truetype else :none end end |