fontisan 0.2.1 → 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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +57 -385
  3. data/README.adoc +1483 -1435
  4. data/Rakefile +3 -2
  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 +10 -3
  9. data/lib/fontisan/collection/builder.rb +2 -1
  10. data/lib/fontisan/collection/offset_calculator.rb +2 -0
  11. data/lib/fontisan/commands/base_command.rb +5 -2
  12. data/lib/fontisan/commands/convert_command.rb +6 -2
  13. data/lib/fontisan/commands/info_command.rb +111 -5
  14. data/lib/fontisan/commands/instance_command.rb +8 -7
  15. data/lib/fontisan/commands/validate_command.rb +4 -1
  16. data/lib/fontisan/constants.rb +24 -24
  17. data/lib/fontisan/converters/format_converter.rb +8 -4
  18. data/lib/fontisan/converters/outline_converter.rb +21 -16
  19. data/lib/fontisan/converters/woff_writer.rb +8 -3
  20. data/lib/fontisan/font_loader.rb +11 -4
  21. data/lib/fontisan/font_writer.rb +2 -0
  22. data/lib/fontisan/formatters/text_formatter.rb +45 -1
  23. data/lib/fontisan/hints/hint_converter.rb +43 -47
  24. data/lib/fontisan/hints/hint_validator.rb +284 -0
  25. data/lib/fontisan/hints/postscript_hint_applier.rb +1 -3
  26. data/lib/fontisan/hints/postscript_hint_extractor.rb +78 -43
  27. data/lib/fontisan/hints/truetype_hint_extractor.rb +22 -26
  28. data/lib/fontisan/hints/truetype_instruction_analyzer.rb +261 -0
  29. data/lib/fontisan/hints/truetype_instruction_generator.rb +266 -0
  30. data/lib/fontisan/loading_modes.rb +4 -4
  31. data/lib/fontisan/models/collection_brief_info.rb +31 -0
  32. data/lib/fontisan/models/font_export.rb +2 -2
  33. data/lib/fontisan/models/font_info.rb +3 -30
  34. data/lib/fontisan/models/hint.rb +22 -23
  35. data/lib/fontisan/models/outline.rb +4 -1
  36. data/lib/fontisan/models/validation_report.rb +1 -1
  37. data/lib/fontisan/open_type_font.rb +3 -1
  38. data/lib/fontisan/optimizers/pattern_analyzer.rb +2 -1
  39. data/lib/fontisan/optimizers/subroutine_generator.rb +1 -1
  40. data/lib/fontisan/pipeline/output_writer.rb +8 -3
  41. data/lib/fontisan/pipeline/transformation_pipeline.rb +8 -3
  42. data/lib/fontisan/subset/table_subsetter.rb +5 -5
  43. data/lib/fontisan/tables/cff/charstring.rb +38 -12
  44. data/lib/fontisan/tables/cff/charstring_parser.rb +23 -11
  45. data/lib/fontisan/tables/cff/charstring_rebuilder.rb +14 -14
  46. data/lib/fontisan/tables/cff/dict_builder.rb +4 -1
  47. data/lib/fontisan/tables/cff/hint_operation_injector.rb +6 -4
  48. data/lib/fontisan/tables/cff/offset_recalculator.rb +1 -1
  49. data/lib/fontisan/tables/cff/private_dict_writer.rb +10 -4
  50. data/lib/fontisan/tables/cff/table_builder.rb +1 -1
  51. data/lib/fontisan/tables/cff2/charstring_parser.rb +14 -8
  52. data/lib/fontisan/tables/cff2/private_dict_blend_handler.rb +7 -6
  53. data/lib/fontisan/tables/cff2/region_matcher.rb +2 -2
  54. data/lib/fontisan/tables/cff2/table_builder.rb +26 -20
  55. data/lib/fontisan/tables/cff2/table_reader.rb +35 -33
  56. data/lib/fontisan/tables/cff2/variation_data_extractor.rb +2 -2
  57. data/lib/fontisan/tables/cff2.rb +1 -1
  58. data/lib/fontisan/tables/glyf/compound_glyph_resolver.rb +2 -1
  59. data/lib/fontisan/tables/glyf/curve_converter.rb +10 -4
  60. data/lib/fontisan/tables/glyf/glyph_builder.rb +27 -10
  61. data/lib/fontisan/tables/name.rb +4 -4
  62. data/lib/fontisan/true_type_font.rb +3 -1
  63. data/lib/fontisan/validation/checksum_validator.rb +2 -2
  64. data/lib/fontisan/variation/cache.rb +3 -1
  65. data/lib/fontisan/variation/converter.rb +2 -1
  66. data/lib/fontisan/variation/delta_applier.rb +2 -1
  67. data/lib/fontisan/variation/inspector.rb +2 -1
  68. data/lib/fontisan/variation/instance_generator.rb +2 -1
  69. data/lib/fontisan/variation/optimizer.rb +6 -3
  70. data/lib/fontisan/variation/subsetter.rb +32 -10
  71. data/lib/fontisan/variation/variation_preserver.rb +4 -1
  72. data/lib/fontisan/version.rb +1 -1
  73. data/lib/fontisan/woff2/glyf_transformer.rb +57 -30
  74. data/lib/fontisan/woff2_font.rb +31 -15
  75. data/lib/fontisan.rb +42 -2
  76. data/scripts/measure_optimization.rb +15 -7
  77. metadata +8 -2
@@ -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.1
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-28 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