fontisan 0.2.0 → 0.2.1

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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +270 -131
  3. data/README.adoc +158 -4
  4. data/Rakefile +44 -47
  5. data/lib/fontisan/cli.rb +84 -33
  6. data/lib/fontisan/collection/builder.rb +81 -0
  7. data/lib/fontisan/collection/table_deduplicator.rb +76 -0
  8. data/lib/fontisan/commands/base_command.rb +16 -0
  9. data/lib/fontisan/commands/convert_command.rb +97 -170
  10. data/lib/fontisan/commands/instance_command.rb +71 -80
  11. data/lib/fontisan/commands/validate_command.rb +25 -0
  12. data/lib/fontisan/config/validation_rules.yml +1 -1
  13. data/lib/fontisan/constants.rb +10 -0
  14. data/lib/fontisan/converters/format_converter.rb +150 -1
  15. data/lib/fontisan/converters/outline_converter.rb +80 -18
  16. data/lib/fontisan/converters/woff_writer.rb +1 -1
  17. data/lib/fontisan/font_loader.rb +3 -5
  18. data/lib/fontisan/font_writer.rb +7 -6
  19. data/lib/fontisan/hints/hint_converter.rb +133 -0
  20. data/lib/fontisan/hints/postscript_hint_applier.rb +221 -140
  21. data/lib/fontisan/hints/postscript_hint_extractor.rb +100 -0
  22. data/lib/fontisan/hints/truetype_hint_applier.rb +90 -44
  23. data/lib/fontisan/hints/truetype_hint_extractor.rb +127 -0
  24. data/lib/fontisan/loading_modes.rb +2 -0
  25. data/lib/fontisan/models/font_export.rb +2 -2
  26. data/lib/fontisan/models/hint.rb +173 -1
  27. data/lib/fontisan/models/validation_report.rb +1 -1
  28. data/lib/fontisan/open_type_font.rb +25 -9
  29. data/lib/fontisan/open_type_font_extensions.rb +54 -0
  30. data/lib/fontisan/pipeline/format_detector.rb +249 -0
  31. data/lib/fontisan/pipeline/output_writer.rb +154 -0
  32. data/lib/fontisan/pipeline/strategies/base_strategy.rb +75 -0
  33. data/lib/fontisan/pipeline/strategies/instance_strategy.rb +93 -0
  34. data/lib/fontisan/pipeline/strategies/named_strategy.rb +118 -0
  35. data/lib/fontisan/pipeline/strategies/preserve_strategy.rb +56 -0
  36. data/lib/fontisan/pipeline/transformation_pipeline.rb +411 -0
  37. data/lib/fontisan/pipeline/variation_resolver.rb +165 -0
  38. data/lib/fontisan/tables/cff/charstring.rb +33 -4
  39. data/lib/fontisan/tables/cff/charstring_builder.rb +34 -0
  40. data/lib/fontisan/tables/cff/charstring_parser.rb +237 -0
  41. data/lib/fontisan/tables/cff/charstring_rebuilder.rb +172 -0
  42. data/lib/fontisan/tables/cff/dict_builder.rb +15 -0
  43. data/lib/fontisan/tables/cff/hint_operation_injector.rb +207 -0
  44. data/lib/fontisan/tables/cff/offset_recalculator.rb +70 -0
  45. data/lib/fontisan/tables/cff/private_dict_writer.rb +125 -0
  46. data/lib/fontisan/tables/cff/table_builder.rb +221 -0
  47. data/lib/fontisan/tables/cff.rb +2 -0
  48. data/lib/fontisan/tables/cff2/private_dict_blend_handler.rb +246 -0
  49. data/lib/fontisan/tables/cff2/region_matcher.rb +200 -0
  50. data/lib/fontisan/tables/cff2/table_builder.rb +574 -0
  51. data/lib/fontisan/tables/cff2/table_reader.rb +419 -0
  52. data/lib/fontisan/tables/cff2/variation_data_extractor.rb +212 -0
  53. data/lib/fontisan/tables/cff2.rb +9 -4
  54. data/lib/fontisan/tables/cvar.rb +2 -41
  55. data/lib/fontisan/tables/gvar.rb +2 -41
  56. data/lib/fontisan/true_type_font.rb +24 -9
  57. data/lib/fontisan/true_type_font_extensions.rb +54 -0
  58. data/lib/fontisan/utilities/checksum_calculator.rb +42 -0
  59. data/lib/fontisan/validation/checksum_validator.rb +2 -2
  60. data/lib/fontisan/validation/table_validator.rb +1 -1
  61. data/lib/fontisan/validation/variable_font_validator.rb +218 -0
  62. data/lib/fontisan/variation/converter.rb +120 -13
  63. data/lib/fontisan/variation/instance_writer.rb +341 -0
  64. data/lib/fontisan/variation/tuple_variation_header.rb +51 -0
  65. data/lib/fontisan/variation/variable_svg_generator.rb +268 -0
  66. data/lib/fontisan/variation/variation_preserver.rb +288 -0
  67. data/lib/fontisan/version.rb +1 -1
  68. data/lib/fontisan/version.rb.orig +9 -0
  69. data/lib/fontisan/woff2/glyf_transformer.rb +666 -0
  70. data/lib/fontisan/woff2/hmtx_transformer.rb +164 -0
  71. data/lib/fontisan/woff2_font.rb +475 -470
  72. data/lib/fontisan/woff_font.rb +16 -11
  73. data/lib/fontisan.rb +12 -0
  74. metadata +31 -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
 
@@ -149,9 +153,17 @@ require_relative "fontisan/variation/interpolator"
149
153
  require_relative "fontisan/variation/region_matcher"
150
154
  require_relative "fontisan/variation/metrics_adjuster"
151
155
  require_relative "fontisan/variation/converter"
156
+ require_relative "fontisan/variation/variation_preserver"
152
157
  require_relative "fontisan/variation/delta_parser"
153
158
  require_relative "fontisan/variation/delta_applier"
154
159
  require_relative "fontisan/variation/blend_applier"
160
+ require_relative "fontisan/variation/variable_svg_generator"
161
+
162
+ # Pipeline infrastructure
163
+ require_relative "fontisan/pipeline/format_detector"
164
+ require_relative "fontisan/pipeline/variation_resolver"
165
+ require_relative "fontisan/pipeline/output_writer"
166
+ require_relative "fontisan/pipeline/transformation_pipeline"
155
167
 
156
168
  # Optimization infrastructure
157
169
  require_relative "fontisan/optimizers/pattern_analyzer"
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.1
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-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -217,6 +217,7 @@ files:
217
217
  - lib/fontisan/models/variable_font_info.rb
218
218
  - lib/fontisan/open_type_collection.rb
219
219
  - lib/fontisan/open_type_font.rb
220
+ - lib/fontisan/open_type_font_extensions.rb
220
221
  - lib/fontisan/optimizers/charstring_rewriter.rb
221
222
  - lib/fontisan/optimizers/pattern_analyzer.rb
222
223
  - lib/fontisan/optimizers/stack_tracker.rb
@@ -225,6 +226,14 @@ files:
225
226
  - lib/fontisan/optimizers/subroutine_optimizer.rb
226
227
  - lib/fontisan/outline_extractor.rb
227
228
  - lib/fontisan/parsers/tag.rb
229
+ - lib/fontisan/pipeline/format_detector.rb
230
+ - lib/fontisan/pipeline/output_writer.rb
231
+ - lib/fontisan/pipeline/strategies/base_strategy.rb
232
+ - lib/fontisan/pipeline/strategies/instance_strategy.rb
233
+ - lib/fontisan/pipeline/strategies/named_strategy.rb
234
+ - lib/fontisan/pipeline/strategies/preserve_strategy.rb
235
+ - lib/fontisan/pipeline/transformation_pipeline.rb
236
+ - lib/fontisan/pipeline/variation_resolver.rb
228
237
  - lib/fontisan/subset/builder.rb
229
238
  - lib/fontisan/subset/glyph_mapping.rb
230
239
  - lib/fontisan/subset/options.rb
@@ -239,19 +248,30 @@ files:
239
248
  - lib/fontisan/tables/cff/charset.rb
240
249
  - lib/fontisan/tables/cff/charstring.rb
241
250
  - lib/fontisan/tables/cff/charstring_builder.rb
251
+ - lib/fontisan/tables/cff/charstring_parser.rb
252
+ - lib/fontisan/tables/cff/charstring_rebuilder.rb
242
253
  - lib/fontisan/tables/cff/charstrings_index.rb
243
254
  - lib/fontisan/tables/cff/dict.rb
244
255
  - lib/fontisan/tables/cff/dict_builder.rb
245
256
  - lib/fontisan/tables/cff/encoding.rb
246
257
  - lib/fontisan/tables/cff/header.rb
258
+ - lib/fontisan/tables/cff/hint_operation_injector.rb
247
259
  - lib/fontisan/tables/cff/index.rb
248
260
  - lib/fontisan/tables/cff/index_builder.rb
261
+ - lib/fontisan/tables/cff/offset_recalculator.rb
249
262
  - lib/fontisan/tables/cff/private_dict.rb
263
+ - lib/fontisan/tables/cff/private_dict_writer.rb
264
+ - lib/fontisan/tables/cff/table_builder.rb
250
265
  - lib/fontisan/tables/cff/top_dict.rb
251
266
  - lib/fontisan/tables/cff2.rb
252
267
  - lib/fontisan/tables/cff2/blend_operator.rb
253
268
  - lib/fontisan/tables/cff2/charstring_parser.rb
254
269
  - lib/fontisan/tables/cff2/operand_stack.rb
270
+ - lib/fontisan/tables/cff2/private_dict_blend_handler.rb
271
+ - lib/fontisan/tables/cff2/region_matcher.rb
272
+ - lib/fontisan/tables/cff2/table_builder.rb
273
+ - lib/fontisan/tables/cff2/table_reader.rb
274
+ - lib/fontisan/tables/cff2/variation_data_extractor.rb
255
275
  - lib/fontisan/tables/cmap.rb
256
276
  - lib/fontisan/tables/cvar.rb
257
277
  - lib/fontisan/tables/fvar.rb
@@ -279,6 +299,7 @@ files:
279
299
  - lib/fontisan/tables/vvar.rb
280
300
  - lib/fontisan/true_type_collection.rb
281
301
  - lib/fontisan/true_type_font.rb
302
+ - lib/fontisan/true_type_font_extensions.rb
282
303
  - lib/fontisan/utilities/brotli_wrapper.rb
283
304
  - lib/fontisan/utilities/checksum_calculator.rb
284
305
  - lib/fontisan/utils/thread_pool.rb
@@ -287,6 +308,7 @@ files:
287
308
  - lib/fontisan/validation/structure_validator.rb
288
309
  - lib/fontisan/validation/table_validator.rb
289
310
  - lib/fontisan/validation/validator.rb
311
+ - lib/fontisan/validation/variable_font_validator.rb
290
312
  - lib/fontisan/variable/axis_normalizer.rb
291
313
  - lib/fontisan/variable/delta_applicator.rb
292
314
  - lib/fontisan/variable/glyph_delta_processor.rb
@@ -304,6 +326,7 @@ files:
304
326
  - lib/fontisan/variation/delta_parser.rb
305
327
  - lib/fontisan/variation/inspector.rb
306
328
  - lib/fontisan/variation/instance_generator.rb
329
+ - lib/fontisan/variation/instance_writer.rb
307
330
  - lib/fontisan/variation/interpolator.rb
308
331
  - lib/fontisan/variation/metrics_adjuster.rb
309
332
  - lib/fontisan/variation/optimizer.rb
@@ -311,11 +334,17 @@ files:
311
334
  - lib/fontisan/variation/region_matcher.rb
312
335
  - lib/fontisan/variation/subsetter.rb
313
336
  - lib/fontisan/variation/table_accessor.rb
337
+ - lib/fontisan/variation/tuple_variation_header.rb
314
338
  - lib/fontisan/variation/validator.rb
339
+ - lib/fontisan/variation/variable_svg_generator.rb
315
340
  - lib/fontisan/variation/variation_context.rb
341
+ - lib/fontisan/variation/variation_preserver.rb
316
342
  - lib/fontisan/version.rb
343
+ - lib/fontisan/version.rb.orig
317
344
  - lib/fontisan/woff2/directory.rb
345
+ - lib/fontisan/woff2/glyf_transformer.rb
318
346
  - lib/fontisan/woff2/header.rb
347
+ - lib/fontisan/woff2/hmtx_transformer.rb
319
348
  - lib/fontisan/woff2/table_transformer.rb
320
349
  - lib/fontisan/woff2_font.rb
321
350
  - lib/fontisan/woff_font.rb