fontisan 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +119 -308
  3. data/README.adoc +1525 -1323
  4. data/Rakefile +45 -47
  5. data/benchmark/variation_quick_bench.rb +4 -4
  6. data/docs/FONT_HINTING.adoc +562 -0
  7. data/docs/VARIABLE_FONT_OPERATIONS.adoc +599 -0
  8. data/lib/fontisan/cli.rb +92 -34
  9. data/lib/fontisan/collection/builder.rb +82 -0
  10. data/lib/fontisan/collection/offset_calculator.rb +2 -0
  11. data/lib/fontisan/collection/table_deduplicator.rb +76 -0
  12. data/lib/fontisan/commands/base_command.rb +21 -2
  13. data/lib/fontisan/commands/convert_command.rb +96 -165
  14. data/lib/fontisan/commands/info_command.rb +111 -5
  15. data/lib/fontisan/commands/instance_command.rb +77 -85
  16. data/lib/fontisan/commands/validate_command.rb +28 -0
  17. data/lib/fontisan/config/validation_rules.yml +1 -1
  18. data/lib/fontisan/constants.rb +34 -24
  19. data/lib/fontisan/converters/format_converter.rb +154 -1
  20. data/lib/fontisan/converters/outline_converter.rb +101 -34
  21. data/lib/fontisan/converters/woff_writer.rb +9 -4
  22. data/lib/fontisan/font_loader.rb +14 -9
  23. data/lib/fontisan/font_writer.rb +9 -6
  24. data/lib/fontisan/formatters/text_formatter.rb +45 -1
  25. data/lib/fontisan/hints/hint_converter.rb +131 -2
  26. data/lib/fontisan/hints/hint_validator.rb +284 -0
  27. data/lib/fontisan/hints/postscript_hint_applier.rb +219 -140
  28. data/lib/fontisan/hints/postscript_hint_extractor.rb +151 -16
  29. data/lib/fontisan/hints/truetype_hint_applier.rb +90 -44
  30. data/lib/fontisan/hints/truetype_hint_extractor.rb +134 -11
  31. data/lib/fontisan/hints/truetype_instruction_analyzer.rb +261 -0
  32. data/lib/fontisan/hints/truetype_instruction_generator.rb +266 -0
  33. data/lib/fontisan/loading_modes.rb +6 -4
  34. data/lib/fontisan/models/collection_brief_info.rb +31 -0
  35. data/lib/fontisan/models/font_info.rb +3 -30
  36. data/lib/fontisan/models/hint.rb +183 -12
  37. data/lib/fontisan/models/outline.rb +4 -1
  38. data/lib/fontisan/open_type_font.rb +28 -10
  39. data/lib/fontisan/open_type_font_extensions.rb +54 -0
  40. data/lib/fontisan/optimizers/pattern_analyzer.rb +2 -1
  41. data/lib/fontisan/optimizers/subroutine_generator.rb +1 -1
  42. data/lib/fontisan/pipeline/format_detector.rb +249 -0
  43. data/lib/fontisan/pipeline/output_writer.rb +159 -0
  44. data/lib/fontisan/pipeline/strategies/base_strategy.rb +75 -0
  45. data/lib/fontisan/pipeline/strategies/instance_strategy.rb +93 -0
  46. data/lib/fontisan/pipeline/strategies/named_strategy.rb +118 -0
  47. data/lib/fontisan/pipeline/strategies/preserve_strategy.rb +56 -0
  48. data/lib/fontisan/pipeline/transformation_pipeline.rb +416 -0
  49. data/lib/fontisan/pipeline/variation_resolver.rb +165 -0
  50. data/lib/fontisan/subset/table_subsetter.rb +5 -5
  51. data/lib/fontisan/tables/cff/charstring.rb +58 -3
  52. data/lib/fontisan/tables/cff/charstring_builder.rb +34 -0
  53. data/lib/fontisan/tables/cff/charstring_parser.rb +249 -0
  54. data/lib/fontisan/tables/cff/charstring_rebuilder.rb +172 -0
  55. data/lib/fontisan/tables/cff/dict_builder.rb +19 -1
  56. data/lib/fontisan/tables/cff/hint_operation_injector.rb +209 -0
  57. data/lib/fontisan/tables/cff/offset_recalculator.rb +70 -0
  58. data/lib/fontisan/tables/cff/private_dict_writer.rb +131 -0
  59. data/lib/fontisan/tables/cff/table_builder.rb +221 -0
  60. data/lib/fontisan/tables/cff.rb +2 -0
  61. data/lib/fontisan/tables/cff2/charstring_parser.rb +14 -8
  62. data/lib/fontisan/tables/cff2/private_dict_blend_handler.rb +247 -0
  63. data/lib/fontisan/tables/cff2/region_matcher.rb +200 -0
  64. data/lib/fontisan/tables/cff2/table_builder.rb +580 -0
  65. data/lib/fontisan/tables/cff2/table_reader.rb +421 -0
  66. data/lib/fontisan/tables/cff2/variation_data_extractor.rb +212 -0
  67. data/lib/fontisan/tables/cff2.rb +10 -5
  68. data/lib/fontisan/tables/cvar.rb +2 -41
  69. data/lib/fontisan/tables/glyf/compound_glyph_resolver.rb +2 -1
  70. data/lib/fontisan/tables/glyf/curve_converter.rb +10 -4
  71. data/lib/fontisan/tables/glyf/glyph_builder.rb +27 -10
  72. data/lib/fontisan/tables/gvar.rb +2 -41
  73. data/lib/fontisan/tables/name.rb +4 -4
  74. data/lib/fontisan/true_type_font.rb +27 -10
  75. data/lib/fontisan/true_type_font_extensions.rb +54 -0
  76. data/lib/fontisan/utilities/checksum_calculator.rb +42 -0
  77. data/lib/fontisan/validation/checksum_validator.rb +2 -2
  78. data/lib/fontisan/validation/table_validator.rb +1 -1
  79. data/lib/fontisan/validation/variable_font_validator.rb +218 -0
  80. data/lib/fontisan/variation/cache.rb +3 -1
  81. data/lib/fontisan/variation/converter.rb +121 -13
  82. data/lib/fontisan/variation/delta_applier.rb +2 -1
  83. data/lib/fontisan/variation/inspector.rb +2 -1
  84. data/lib/fontisan/variation/instance_generator.rb +2 -1
  85. data/lib/fontisan/variation/instance_writer.rb +341 -0
  86. data/lib/fontisan/variation/optimizer.rb +6 -3
  87. data/lib/fontisan/variation/subsetter.rb +32 -10
  88. data/lib/fontisan/variation/tuple_variation_header.rb +51 -0
  89. data/lib/fontisan/variation/variable_svg_generator.rb +268 -0
  90. data/lib/fontisan/variation/variation_preserver.rb +291 -0
  91. data/lib/fontisan/version.rb +1 -1
  92. data/lib/fontisan/version.rb.orig +9 -0
  93. data/lib/fontisan/woff2/glyf_transformer.rb +693 -0
  94. data/lib/fontisan/woff2/hmtx_transformer.rb +164 -0
  95. data/lib/fontisan/woff2_font.rb +489 -468
  96. data/lib/fontisan/woff_font.rb +16 -11
  97. data/lib/fontisan.rb +54 -2
  98. data/scripts/measure_optimization.rb +15 -7
  99. metadata +37 -2
@@ -450,13 +450,8 @@ module Fontisan
450
450
  # @param path [String] Path to the font file
451
451
  # @return [void]
452
452
  def update_checksum_adjustment_in_file(path)
453
- # Calculate file checksum
454
- checksum = Utilities::ChecksumCalculator.calculate_file_checksum(path)
455
-
456
- # Calculate adjustment
457
- adjustment = Utilities::ChecksumCalculator.calculate_adjustment(checksum)
458
-
459
453
  # Find head table position in output file
454
+ head_offset = nil
460
455
  File.open(path, "rb") do |io|
461
456
  io.seek(4) # Skip sfnt_version
462
457
  num_tables = io.read(2).unpack1("n")
@@ -469,15 +464,25 @@ module Fontisan
469
464
  io.read(4) # length
470
465
 
471
466
  if tag == Constants::HEAD_TAG
472
- # Write adjustment to head table (offset 8 within head table)
473
- File.open(path, "r+b") do |write_io|
474
- write_io.seek(offset + 8)
475
- write_io.write([adjustment].pack("N"))
476
- end
467
+ head_offset = offset
477
468
  break
478
469
  end
479
470
  end
480
471
  end
472
+
473
+ return unless head_offset
474
+
475
+ # Use tempfile-based checksum calculation for Windows compatibility
476
+ File.open(path, "r+b") do |io|
477
+ checksum, _tmpfile = Utilities::ChecksumCalculator.calculate_checksum_from_io_with_tempfile(io)
478
+
479
+ # Calculate adjustment
480
+ adjustment = Utilities::ChecksumCalculator.calculate_adjustment(checksum)
481
+
482
+ # Write adjustment to head table (offset 8 within head table)
483
+ io.seek(head_offset + 8)
484
+ io.write([adjustment].pack("N"))
485
+ end
481
486
  end
482
487
  end
483
488
  end
data/lib/fontisan.rb CHANGED
@@ -78,6 +78,10 @@ require_relative "fontisan/open_type_collection"
78
78
  require_relative "fontisan/woff_font"
79
79
  require_relative "fontisan/woff2_font"
80
80
 
81
+ # Font extensions for table-based construction
82
+ require_relative "fontisan/true_type_font_extensions"
83
+ require_relative "fontisan/open_type_font_extensions"
84
+
81
85
  # Font loading
82
86
  require_relative "fontisan/font_loader"
83
87
 
@@ -103,6 +107,7 @@ require_relative "fontisan/models/validation_report"
103
107
  require_relative "fontisan/models/font_export"
104
108
  require_relative "fontisan/models/collection_font_summary"
105
109
  require_relative "fontisan/models/collection_info"
110
+ require_relative "fontisan/models/collection_brief_info"
106
111
  require_relative "fontisan/models/collection_list_info"
107
112
  require_relative "fontisan/models/font_summary"
108
113
  require_relative "fontisan/models/table_sharing_info"
@@ -145,13 +150,19 @@ require_relative "fontisan/variation/interpolator"
145
150
  require_relative "fontisan/variation/region_matcher"
146
151
  require_relative "fontisan/variation/data_extractor"
147
152
  require_relative "fontisan/variation/instance_generator"
148
- require_relative "fontisan/variation/interpolator"
149
- require_relative "fontisan/variation/region_matcher"
150
153
  require_relative "fontisan/variation/metrics_adjuster"
151
154
  require_relative "fontisan/variation/converter"
155
+ require_relative "fontisan/variation/variation_preserver"
152
156
  require_relative "fontisan/variation/delta_parser"
153
157
  require_relative "fontisan/variation/delta_applier"
154
158
  require_relative "fontisan/variation/blend_applier"
159
+ require_relative "fontisan/variation/variable_svg_generator"
160
+
161
+ # Pipeline infrastructure
162
+ require_relative "fontisan/pipeline/format_detector"
163
+ require_relative "fontisan/pipeline/variation_resolver"
164
+ require_relative "fontisan/pipeline/output_writer"
165
+ require_relative "fontisan/pipeline/transformation_pipeline"
155
166
 
156
167
  # Optimization infrastructure
157
168
  require_relative "fontisan/optimizers/pattern_analyzer"
@@ -160,6 +171,17 @@ require_relative "fontisan/optimizers/charstring_rewriter"
160
171
  require_relative "fontisan/optimizers/subroutine_optimizer"
161
172
  require_relative "fontisan/optimizers/subroutine_generator"
162
173
 
174
+ # Hints infrastructure
175
+ require_relative "fontisan/models/hint"
176
+ require_relative "fontisan/hints/truetype_instruction_analyzer"
177
+ require_relative "fontisan/hints/truetype_instruction_generator"
178
+ require_relative "fontisan/hints/truetype_hint_extractor"
179
+ require_relative "fontisan/hints/truetype_hint_applier"
180
+ require_relative "fontisan/hints/postscript_hint_extractor"
181
+ require_relative "fontisan/hints/postscript_hint_applier"
182
+ require_relative "fontisan/hints/hint_converter"
183
+ require_relative "fontisan/hints/hint_validator"
184
+
163
185
  # Commands
164
186
  require_relative "fontisan/commands/base_command"
165
187
  require_relative "fontisan/commands/info_command"
@@ -197,4 +219,34 @@ module Fontisan
197
219
  self.logger = Logger.new($stdout).tap do |log|
198
220
  log.level = Logger::WARN
199
221
  end
222
+
223
+ # Get font information.
224
+ #
225
+ # Supports both full and brief modes. Brief mode uses metadata loading for
226
+ # 5x faster parsing by loading only essential tables (name, head, hhea,
227
+ # maxp, OS/2, post). Returns FontInfo with 13 essential fields in brief mode
228
+ # or all 38 fields in full mode.
229
+ #
230
+ # @param path [String] Path to font file
231
+ # @param brief [Boolean] Use brief mode for fast identification (default: false)
232
+ # @param font_index [Integer] Index for TTC/OTC files (default: 0)
233
+ # @return [Models::FontInfo, Models::CollectionInfo, Models::CollectionBriefInfo] Font information
234
+ #
235
+ # @example Get full info
236
+ # info = Fontisan.info("font.ttf")
237
+ # puts info.family_name
238
+ # puts info.copyright # populated in full mode
239
+ #
240
+ # @example Get brief info (5x faster)
241
+ # info = Fontisan.info("font.ttf", brief: true)
242
+ # puts info.family_name # populated
243
+ # puts info.postscript_name # populated
244
+ # puts info.copyright # nil (not populated in brief mode)
245
+ #
246
+ # @example Serialize to JSON
247
+ # info = Fontisan.info("font.ttf", brief: true)
248
+ # puts info.to_json
249
+ def self.info(path, brief: false, font_index: 0)
250
+ Commands::InfoCommand.new(path, brief: brief, font_index: font_index).run
251
+ end
200
252
  end
@@ -51,21 +51,26 @@ def measure_font(font_path, options = {})
51
51
  puts "RESULTS"
52
52
  puts "-" * 80
53
53
  puts "File Sizes:"
54
- puts " Without optimization: #{format('%10d', size_unopt)} bytes (#{size_per_glyph_unopt} bytes/glyph)"
55
- puts " With optimization: #{format('%10d', size_opt)} bytes (#{size_per_glyph_opt} bytes/glyph)"
54
+ puts " Without optimization: #{format('%10d',
55
+ size_unopt)} bytes (#{size_per_glyph_unopt} bytes/glyph)"
56
+ puts " With optimization: #{format('%10d',
57
+ size_opt)} bytes (#{size_per_glyph_opt} bytes/glyph)"
56
58
  puts " Bytes saved: #{format('%10d', savings)} bytes"
57
59
  puts " Reduction: #{format('%9.2f', reduction_percent)}%"
58
60
 
59
61
  puts "\nProcessing Time:"
60
62
  puts " Without optimization: #{format('%.2f', time_unopt)} seconds"
61
63
  puts " With optimization: #{format('%.2f', time_opt)} seconds"
62
- puts " Overhead: #{format('%.2f', time_opt - time_unopt)} seconds"
64
+ puts " Overhead: #{format('%.2f',
65
+ time_opt - time_unopt)} seconds"
63
66
 
64
67
  if opt_result
65
68
  puts "\nOptimization Details:"
66
69
  puts " Patterns found: #{format('%10d', opt_result[:pattern_count])}"
67
- puts " Patterns selected: #{format('%10d', opt_result[:selected_count])}"
68
- puts " Subroutines: #{format('%10d', opt_result[:local_subrs].length)}"
70
+ puts " Patterns selected: #{format('%10d',
71
+ opt_result[:selected_count])}"
72
+ puts " Subroutines: #{format('%10d',
73
+ opt_result[:local_subrs].length)}"
69
74
  puts " CFF bias: #{format('%10d', opt_result[:bias])}"
70
75
  puts " Est. bytes saved: #{format('%10d', opt_result[:savings])}"
71
76
  end
@@ -103,7 +108,9 @@ def print_summary(results)
103
108
  end
104
109
 
105
110
  # Calculate averages
106
- avg_reduction = (results.sum { |r| r[:reduction_percent] } / results.length).round(2)
111
+ avg_reduction = (results.sum do |r|
112
+ r[:reduction_percent]
113
+ end / results.length).round(2)
107
114
  total_saved = results.sum { |r| r[:savings] }
108
115
 
109
116
  puts "-" * 80
@@ -118,7 +125,8 @@ if __FILE__ == $PROGRAM_NAME
118
125
 
119
126
  if font_paths.empty?
120
127
  # Use fixtures if no arguments provided
121
- fixtures_dir = File.join(File.dirname(__FILE__), "..", "spec", "fixtures", "fonts")
128
+ fixtures_dir = File.join(File.dirname(__FILE__), "..", "spec", "fixtures",
129
+ "fonts")
122
130
  font_paths = Dir.glob(File.join(fixtures_dir, "*.ttf"))
123
131
  end
124
132
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fontisan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-12-17 00:00:00.000000000 Z
11
+ date: 2025-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -117,6 +117,8 @@ files:
117
117
  - Rakefile
118
118
  - benchmark/variation_quick_bench.rb
119
119
  - docs/EXTRACT_TTC_MIGRATION.md
120
+ - docs/FONT_HINTING.adoc
121
+ - docs/VARIABLE_FONT_OPERATIONS.adoc
120
122
  - exe/fontisan
121
123
  - fontisan.gemspec
122
124
  - lib/fontisan.rb
@@ -181,13 +183,17 @@ files:
181
183
  - lib/fontisan/formatters/text_formatter.rb
182
184
  - lib/fontisan/glyph_accessor.rb
183
185
  - lib/fontisan/hints/hint_converter.rb
186
+ - lib/fontisan/hints/hint_validator.rb
184
187
  - lib/fontisan/hints/postscript_hint_applier.rb
185
188
  - lib/fontisan/hints/postscript_hint_extractor.rb
186
189
  - lib/fontisan/hints/truetype_hint_applier.rb
187
190
  - lib/fontisan/hints/truetype_hint_extractor.rb
191
+ - lib/fontisan/hints/truetype_instruction_analyzer.rb
192
+ - lib/fontisan/hints/truetype_instruction_generator.rb
188
193
  - lib/fontisan/loading_modes.rb
189
194
  - lib/fontisan/metrics_calculator.rb
190
195
  - lib/fontisan/models/all_scripts_features_info.rb
196
+ - lib/fontisan/models/collection_brief_info.rb
191
197
  - lib/fontisan/models/collection_font_summary.rb
192
198
  - lib/fontisan/models/collection_info.rb
193
199
  - lib/fontisan/models/collection_list_info.rb
@@ -217,6 +223,7 @@ files:
217
223
  - lib/fontisan/models/variable_font_info.rb
218
224
  - lib/fontisan/open_type_collection.rb
219
225
  - lib/fontisan/open_type_font.rb
226
+ - lib/fontisan/open_type_font_extensions.rb
220
227
  - lib/fontisan/optimizers/charstring_rewriter.rb
221
228
  - lib/fontisan/optimizers/pattern_analyzer.rb
222
229
  - lib/fontisan/optimizers/stack_tracker.rb
@@ -225,6 +232,14 @@ files:
225
232
  - lib/fontisan/optimizers/subroutine_optimizer.rb
226
233
  - lib/fontisan/outline_extractor.rb
227
234
  - lib/fontisan/parsers/tag.rb
235
+ - lib/fontisan/pipeline/format_detector.rb
236
+ - lib/fontisan/pipeline/output_writer.rb
237
+ - lib/fontisan/pipeline/strategies/base_strategy.rb
238
+ - lib/fontisan/pipeline/strategies/instance_strategy.rb
239
+ - lib/fontisan/pipeline/strategies/named_strategy.rb
240
+ - lib/fontisan/pipeline/strategies/preserve_strategy.rb
241
+ - lib/fontisan/pipeline/transformation_pipeline.rb
242
+ - lib/fontisan/pipeline/variation_resolver.rb
228
243
  - lib/fontisan/subset/builder.rb
229
244
  - lib/fontisan/subset/glyph_mapping.rb
230
245
  - lib/fontisan/subset/options.rb
@@ -239,19 +254,30 @@ files:
239
254
  - lib/fontisan/tables/cff/charset.rb
240
255
  - lib/fontisan/tables/cff/charstring.rb
241
256
  - lib/fontisan/tables/cff/charstring_builder.rb
257
+ - lib/fontisan/tables/cff/charstring_parser.rb
258
+ - lib/fontisan/tables/cff/charstring_rebuilder.rb
242
259
  - lib/fontisan/tables/cff/charstrings_index.rb
243
260
  - lib/fontisan/tables/cff/dict.rb
244
261
  - lib/fontisan/tables/cff/dict_builder.rb
245
262
  - lib/fontisan/tables/cff/encoding.rb
246
263
  - lib/fontisan/tables/cff/header.rb
264
+ - lib/fontisan/tables/cff/hint_operation_injector.rb
247
265
  - lib/fontisan/tables/cff/index.rb
248
266
  - lib/fontisan/tables/cff/index_builder.rb
267
+ - lib/fontisan/tables/cff/offset_recalculator.rb
249
268
  - lib/fontisan/tables/cff/private_dict.rb
269
+ - lib/fontisan/tables/cff/private_dict_writer.rb
270
+ - lib/fontisan/tables/cff/table_builder.rb
250
271
  - lib/fontisan/tables/cff/top_dict.rb
251
272
  - lib/fontisan/tables/cff2.rb
252
273
  - lib/fontisan/tables/cff2/blend_operator.rb
253
274
  - lib/fontisan/tables/cff2/charstring_parser.rb
254
275
  - lib/fontisan/tables/cff2/operand_stack.rb
276
+ - lib/fontisan/tables/cff2/private_dict_blend_handler.rb
277
+ - lib/fontisan/tables/cff2/region_matcher.rb
278
+ - lib/fontisan/tables/cff2/table_builder.rb
279
+ - lib/fontisan/tables/cff2/table_reader.rb
280
+ - lib/fontisan/tables/cff2/variation_data_extractor.rb
255
281
  - lib/fontisan/tables/cmap.rb
256
282
  - lib/fontisan/tables/cvar.rb
257
283
  - lib/fontisan/tables/fvar.rb
@@ -279,6 +305,7 @@ files:
279
305
  - lib/fontisan/tables/vvar.rb
280
306
  - lib/fontisan/true_type_collection.rb
281
307
  - lib/fontisan/true_type_font.rb
308
+ - lib/fontisan/true_type_font_extensions.rb
282
309
  - lib/fontisan/utilities/brotli_wrapper.rb
283
310
  - lib/fontisan/utilities/checksum_calculator.rb
284
311
  - lib/fontisan/utils/thread_pool.rb
@@ -287,6 +314,7 @@ files:
287
314
  - lib/fontisan/validation/structure_validator.rb
288
315
  - lib/fontisan/validation/table_validator.rb
289
316
  - lib/fontisan/validation/validator.rb
317
+ - lib/fontisan/validation/variable_font_validator.rb
290
318
  - lib/fontisan/variable/axis_normalizer.rb
291
319
  - lib/fontisan/variable/delta_applicator.rb
292
320
  - lib/fontisan/variable/glyph_delta_processor.rb
@@ -304,6 +332,7 @@ files:
304
332
  - lib/fontisan/variation/delta_parser.rb
305
333
  - lib/fontisan/variation/inspector.rb
306
334
  - lib/fontisan/variation/instance_generator.rb
335
+ - lib/fontisan/variation/instance_writer.rb
307
336
  - lib/fontisan/variation/interpolator.rb
308
337
  - lib/fontisan/variation/metrics_adjuster.rb
309
338
  - lib/fontisan/variation/optimizer.rb
@@ -311,11 +340,17 @@ files:
311
340
  - lib/fontisan/variation/region_matcher.rb
312
341
  - lib/fontisan/variation/subsetter.rb
313
342
  - lib/fontisan/variation/table_accessor.rb
343
+ - lib/fontisan/variation/tuple_variation_header.rb
314
344
  - lib/fontisan/variation/validator.rb
345
+ - lib/fontisan/variation/variable_svg_generator.rb
315
346
  - lib/fontisan/variation/variation_context.rb
347
+ - lib/fontisan/variation/variation_preserver.rb
316
348
  - lib/fontisan/version.rb
349
+ - lib/fontisan/version.rb.orig
317
350
  - lib/fontisan/woff2/directory.rb
351
+ - lib/fontisan/woff2/glyf_transformer.rb
318
352
  - lib/fontisan/woff2/header.rb
353
+ - lib/fontisan/woff2/hmtx_transformer.rb
319
354
  - lib/fontisan/woff2/table_transformer.rb
320
355
  - lib/fontisan/woff2_font.rb
321
356
  - lib/fontisan/woff_font.rb