fontisan 0.4.43 → 0.4.44

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 (124) hide show
  1. checksums.yaml +4 -4
  2. data/TODO.bug-fixes/12-type1-generators-duck-typing.md +80 -0
  3. data/TODO.bug-fixes/13-hint-extractor-duck-typing.md +30 -0
  4. data/TODO.bug-fixes/14-font-interface-type-checks.md +82 -0
  5. data/TODO.bug-fixes/15-glyph-type-checks-and-simple-glyph-points-bug.md +49 -0
  6. data/TODO.bug-fixes/16-variation-table-checks.md +31 -0
  7. data/TODO.bug-fixes/17-ufo-and-stitcher-cleanup.md +32 -0
  8. data/TODO.bug-fixes/18-generic-value-and-io-checks.md +56 -0
  9. data/TODO.bug-fixes/19-serialization-migration.md +52 -0
  10. data/TODO.bug-fixes/20-variation-validator-type-checks.md +29 -0
  11. data/TODO.bug-fixes/21-xml-builder-send.md +24 -0
  12. data/TODO.bug-fixes/22-type1-converter-font-info.md +25 -0
  13. data/TODO.bug-fixes/23-boundary-type-checks.md +31 -0
  14. data/TODO.bug-fixes/24-validator-dynamic-field-key.md +25 -0
  15. data/TODO.bug-fixes/25-serialization-migration.md +49 -0
  16. data/TODO.bug-fixes/26-variation-preserver-spec-migration.md +25 -0
  17. data/TODO.bug-fixes/27-table-class-registry.md +50 -0
  18. data/TODO.bug-fixes/28-spec-doubles-cleanup.md +40 -0
  19. data/TODO.bug-fixes/29-strategy-registries.md +30 -0
  20. data/TODO.bug-fixes/README.md +24 -0
  21. data/lib/fontisan/binary/base_record.rb +13 -12
  22. data/lib/fontisan/collection/builder.rb +3 -5
  23. data/lib/fontisan/collection/dfont_builder.rb +4 -11
  24. data/lib/fontisan/collection/writer.rb +1 -1
  25. data/lib/fontisan/commands/pack_command.rb +4 -4
  26. data/lib/fontisan/commands/unpack_command.rb +1 -1
  27. data/lib/fontisan/commands/validate_command.rb +1 -1
  28. data/lib/fontisan/converters/format_converter.rb +2 -2
  29. data/lib/fontisan/converters/glyf_table_builder.rb +1 -1
  30. data/lib/fontisan/converters/outline_converter.rb +2 -6
  31. data/lib/fontisan/converters/table_copier.rb +4 -12
  32. data/lib/fontisan/converters/type1_converter.rb +12 -37
  33. data/lib/fontisan/converters/woff2_encoder.rb +8 -10
  34. data/lib/fontisan/converters/woff_writer.rb +3 -3
  35. data/lib/fontisan/export/exporter.rb +8 -9
  36. data/lib/fontisan/export/table_serializer.rb +71 -186
  37. data/lib/fontisan/export/transformers/font_to_ttx.rb +18 -18
  38. data/lib/fontisan/export/transformers/head_transformer.rb +1 -1
  39. data/lib/fontisan/export/transformers/hhea_transformer.rb +1 -1
  40. data/lib/fontisan/export/transformers/maxp_transformer.rb +1 -1
  41. data/lib/fontisan/export/transformers/name_transformer.rb +1 -1
  42. data/lib/fontisan/export/transformers/os2_transformer.rb +1 -1
  43. data/lib/fontisan/export/transformers/post_transformer.rb +1 -1
  44. data/lib/fontisan/export/ttx_generator.rb +36 -37
  45. data/lib/fontisan/font_writer.rb +1 -1
  46. data/lib/fontisan/glyph_accessor.rb +7 -9
  47. data/lib/fontisan/hints/postscript_hint_extractor.rb +24 -64
  48. data/lib/fontisan/hints/truetype_hint_extractor.rb +1 -1
  49. data/lib/fontisan/models/ttx/tables/binary_table.rb +1 -1
  50. data/lib/fontisan/optimizers/charstring_rewriter.rb +1 -1
  51. data/lib/fontisan/sfnt_font.rb +2 -0
  52. data/lib/fontisan/sfnt_source.rb +28 -0
  53. data/lib/fontisan/stitcher/source.rb +8 -10
  54. data/lib/fontisan/subset/builder.rb +2 -2
  55. data/lib/fontisan/subset/table_strategy/cff2.rb +2 -3
  56. data/lib/fontisan/svg_to_glyf/assembler.rb +59 -20
  57. data/lib/fontisan/svg_to_glyf/document.rb +28 -9
  58. data/lib/fontisan/svg_to_glyf/geometry/normalizer.rb +34 -17
  59. data/lib/fontisan/tables/cff/charstring.rb +3 -0
  60. data/lib/fontisan/tables/cff/dict.rb +6 -3
  61. data/lib/fontisan/tables/cff/index.rb +1 -1
  62. data/lib/fontisan/tables/cff/private_dict_writer.rb +2 -2
  63. data/lib/fontisan/tables/cff/table_builder.rb +1 -1
  64. data/lib/fontisan/tables/cff.rb +3 -0
  65. data/lib/fontisan/tables/cff2/table_builder.rb +2 -4
  66. data/lib/fontisan/tables/cff2.rb +3 -0
  67. data/lib/fontisan/tables/cmap.rb +3 -0
  68. data/lib/fontisan/tables/cvar.rb +3 -0
  69. data/lib/fontisan/tables/fvar.rb +3 -0
  70. data/lib/fontisan/tables/glyf/simple_glyph.rb +9 -0
  71. data/lib/fontisan/tables/glyf.rb +12 -8
  72. data/lib/fontisan/tables/glyf_table.rb +1 -1
  73. data/lib/fontisan/tables/gvar.rb +3 -0
  74. data/lib/fontisan/tables/head.rb +3 -0
  75. data/lib/fontisan/tables/hhea.rb +3 -0
  76. data/lib/fontisan/tables/hmtx.rb +3 -7
  77. data/lib/fontisan/tables/hvar.rb +4 -0
  78. data/lib/fontisan/tables/loca.rb +3 -0
  79. data/lib/fontisan/tables/maxp.rb +3 -0
  80. data/lib/fontisan/tables/mvar.rb +3 -0
  81. data/lib/fontisan/tables/name.rb +3 -0
  82. data/lib/fontisan/tables/os2.rb +3 -0
  83. data/lib/fontisan/tables/post.rb +3 -0
  84. data/lib/fontisan/tables/registry.rb +71 -0
  85. data/lib/fontisan/tables/vvar.rb +3 -0
  86. data/lib/fontisan/tables.rb +2 -0
  87. data/lib/fontisan/type1/afm_generator.rb +12 -65
  88. data/lib/fontisan/type1/charstring_converter.rb +2 -2
  89. data/lib/fontisan/type1/conversion_options.rb +3 -2
  90. data/lib/fontisan/type1/decryptor.rb +1 -1
  91. data/lib/fontisan/type1/generator.rb +14 -9
  92. data/lib/fontisan/type1/inf_generator.rb +10 -35
  93. data/lib/fontisan/type1/pfa_generator.rb +36 -26
  94. data/lib/fontisan/type1/pfb_generator.rb +24 -12
  95. data/lib/fontisan/type1/pfm_generator.rb +14 -31
  96. data/lib/fontisan/type1/ttf_to_type1_converter.rb +30 -24
  97. data/lib/fontisan/ufo/bounds.rb +91 -0
  98. data/lib/fontisan/ufo/compile/fvar.rb +2 -2
  99. data/lib/fontisan/ufo/contour.rb +5 -0
  100. data/lib/fontisan/ufo/convert/from_bin_data.rb +15 -29
  101. data/lib/fontisan/ufo/info.rb +4 -0
  102. data/lib/fontisan/ufo/point.rb +0 -7
  103. data/lib/fontisan/ufo.rb +1 -0
  104. data/lib/fontisan/utilities/brotli_wrapper.rb +3 -5
  105. data/lib/fontisan/utilities/padding.rb +9 -8
  106. data/lib/fontisan/validation/collection_validator.rb +2 -2
  107. data/lib/fontisan/validators/validator.rb +4 -4
  108. data/lib/fontisan/variable/delta_applicator.rb +4 -11
  109. data/lib/fontisan/variable/metric_delta_processor.rb +3 -3
  110. data/lib/fontisan/variable/static_font_builder.rb +19 -23
  111. data/lib/fontisan/variation/instance_font_wrapper.rb +41 -0
  112. data/lib/fontisan/variation/instance_writer.rb +19 -17
  113. data/lib/fontisan/variation/metrics_adjuster.rb +17 -20
  114. data/lib/fontisan/variation/validator.rb +26 -38
  115. data/lib/fontisan/variation/variable_svg_generator.rb +0 -48
  116. data/lib/fontisan/variation/variation_preserver.rb +2 -3
  117. data/lib/fontisan/variation.rb +1 -0
  118. data/lib/fontisan/version.rb +1 -1
  119. data/lib/fontisan/woff2/sfnt_checksum.rb +1 -1
  120. data/lib/fontisan/woff2/table_transformer.rb +22 -29
  121. data/lib/fontisan/woff2_font.rb +9 -8
  122. data/lib/fontisan/woff_font.rb +2 -0
  123. data/lib/fontisan.rb +1 -0
  124. metadata +24 -2
@@ -42,18 +42,17 @@ module Fontisan
42
42
  (@flags & 0x3F) != 0x3F && KNOWN_TAGS[tag_index]&.start_with?(/glyf|loca|hmtx/)
43
43
  end
44
44
 
45
+ TRANSFORM_VERSIONS = {
46
+ "glyf" => TRANSFORM_GLYF_LOCA,
47
+ "loca" => TRANSFORM_GLYF_LOCA,
48
+ "hmtx" => TRANSFORM_HMTX,
49
+ }.freeze
50
+
45
51
  # Get transform version for this table
46
52
  def transform_version
47
53
  return TRANSFORM_NONE unless transformed?
48
54
 
49
- case tag
50
- when "glyf", "loca"
51
- TRANSFORM_GLYF_LOCA
52
- when "hmtx"
53
- TRANSFORM_HMTX
54
- else
55
- TRANSFORM_NONE
56
- end
55
+ TRANSFORM_VERSIONS.fetch(tag, TRANSFORM_NONE)
57
56
  end
58
57
 
59
58
  private
@@ -73,6 +72,8 @@ module Fontisan
73
72
  # puts font.header.flavor
74
73
  # puts font.table_names
75
74
  class Woff2Font
75
+ include SfntSource
76
+
76
77
  # High-level pipeline format identifier. Owned by the font class so the
77
78
  # conversion pipeline can dispatch without case statements (OCP).
78
79
  #
@@ -53,6 +53,8 @@ module Fontisan
53
53
  # woff.to_ttf("output.ttf") # if TrueType flavored
54
54
  # woff.to_otf("output.otf") # if CFF flavored
55
55
  class WoffFont < BinData::Record
56
+ include SfntSource
57
+
56
58
  # High-level pipeline format identifier. Owned by the font class so the
57
59
  # conversion pipeline can dispatch without case statements (OCP).
58
60
  #
data/lib/fontisan.rb CHANGED
@@ -116,6 +116,7 @@ module Fontisan
116
116
  autoload :OpenTypeFontExtensions, "fontisan/open_type_font_extensions"
117
117
  autoload :OutlineExtractor, "fontisan/outline_extractor"
118
118
  autoload :SfntFont, "fontisan/sfnt_font"
119
+ autoload :SfntSource, "fontisan/sfnt_source"
119
120
  autoload :SfntTable, "fontisan/sfnt_table"
120
121
  autoload :SfntBuilder, "fontisan/sfnt_builder"
121
122
  autoload :Stitcher, "fontisan/stitcher"
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.4.43
4
+ version: 0.4.44
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-07-12 00:00:00.000000000 Z
11
+ date: 2026-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -144,6 +144,24 @@ files:
144
144
  - TODO.bug-fixes/09-type1-cff-seac-expansion.md
145
145
  - TODO.bug-fixes/10-ttf-type1-composite-glyphs.md
146
146
  - TODO.bug-fixes/11-remaining-respond-to.md
147
+ - TODO.bug-fixes/12-type1-generators-duck-typing.md
148
+ - TODO.bug-fixes/13-hint-extractor-duck-typing.md
149
+ - TODO.bug-fixes/14-font-interface-type-checks.md
150
+ - TODO.bug-fixes/15-glyph-type-checks-and-simple-glyph-points-bug.md
151
+ - TODO.bug-fixes/16-variation-table-checks.md
152
+ - TODO.bug-fixes/17-ufo-and-stitcher-cleanup.md
153
+ - TODO.bug-fixes/18-generic-value-and-io-checks.md
154
+ - TODO.bug-fixes/19-serialization-migration.md
155
+ - TODO.bug-fixes/20-variation-validator-type-checks.md
156
+ - TODO.bug-fixes/21-xml-builder-send.md
157
+ - TODO.bug-fixes/22-type1-converter-font-info.md
158
+ - TODO.bug-fixes/23-boundary-type-checks.md
159
+ - TODO.bug-fixes/24-validator-dynamic-field-key.md
160
+ - TODO.bug-fixes/25-serialization-migration.md
161
+ - TODO.bug-fixes/26-variation-preserver-spec-migration.md
162
+ - TODO.bug-fixes/27-table-class-registry.md
163
+ - TODO.bug-fixes/28-spec-doubles-cleanup.md
164
+ - TODO.bug-fixes/29-strategy-registries.md
147
165
  - TODO.bug-fixes/README.md
148
166
  - TODO.improvements/01-cbdt-cblc-gid-stable-propagation.md
149
167
  - TODO.improvements/02-collection-outline-priority.md
@@ -490,6 +508,7 @@ files:
490
508
  - lib/fontisan/pipeline/variation_resolver.rb
491
509
  - lib/fontisan/sfnt_builder.rb
492
510
  - lib/fontisan/sfnt_font.rb
511
+ - lib/fontisan/sfnt_source.rb
493
512
  - lib/fontisan/sfnt_table.rb
494
513
  - lib/fontisan/stitcher.rb
495
514
  - lib/fontisan/stitcher/cbdt_propagator.rb
@@ -645,6 +664,7 @@ files:
645
664
  - lib/fontisan/tables/os2_table.rb
646
665
  - lib/fontisan/tables/post.rb
647
666
  - lib/fontisan/tables/post_table.rb
667
+ - lib/fontisan/tables/registry.rb
648
668
  - lib/fontisan/tables/sbix.rb
649
669
  - lib/fontisan/tables/svg.rb
650
670
  - lib/fontisan/tables/variation_common.rb
@@ -678,6 +698,7 @@ files:
678
698
  - lib/fontisan/type1_font.rb
679
699
  - lib/fontisan/ufo.rb
680
700
  - lib/fontisan/ufo/anchor.rb
701
+ - lib/fontisan/ufo/bounds.rb
681
702
  - lib/fontisan/ufo/cli.rb
682
703
  - lib/fontisan/ufo/compile.rb
683
704
  - lib/fontisan/ufo/compile/avar.rb
@@ -800,6 +821,7 @@ files:
800
821
  - lib/fontisan/variation/delta_applier.rb
801
822
  - lib/fontisan/variation/delta_parser.rb
802
823
  - lib/fontisan/variation/inspector.rb
824
+ - lib/fontisan/variation/instance_font_wrapper.rb
803
825
  - lib/fontisan/variation/instance_generator.rb
804
826
  - lib/fontisan/variation/instance_writer.rb
805
827
  - lib/fontisan/variation/interpolator.rb