fontisan 0.2.16 → 0.2.22

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 (318) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +14 -90
  3. data/Gemfile +6 -3
  4. data/README.adoc +257 -1
  5. data/docs/.vitepress/config.ts +68 -8
  6. data/docs/.vitepress/theme/style.css +570 -272
  7. data/docs/CONVERSION_GUIDE.adoc +31 -8
  8. data/docs/EXTRACT_TTC_MIGRATION.md +1 -1
  9. data/docs/WOFF_WOFF2_FORMATS.adoc +53 -0
  10. data/docs/api/conversion-options.md +37 -14
  11. data/docs/api/font-loader.md +21 -15
  12. data/docs/cli/audit.md +337 -0
  13. data/docs/cli/convert.md +20 -1
  14. data/docs/cli/index.md +31 -0
  15. data/docs/guide/color.md +1 -1
  16. data/docs/guide/conversion/options.md +32 -3
  17. data/docs/guide/conversion/ttf-otf.md +1 -1
  18. data/docs/guide/conversion/type1.md +1 -1
  19. data/docs/guide/conversion/web.md +91 -32
  20. data/docs/guide/conversion.md +6 -5
  21. data/docs/guide/formats/woff.md +35 -11
  22. data/docs/guide/index.md +2 -2
  23. data/docs/guide/migrations/extract-ttc.md +1 -1
  24. data/docs/guide/quick-start.md +4 -4
  25. data/docs/guide/type1.md +4 -4
  26. data/docs/guide/woff.md +19 -17
  27. data/docs/index.md +2 -0
  28. data/docs/lychee.toml +5 -1
  29. data/docs/package.json +1 -1
  30. data/docs/public/robots.txt +4 -0
  31. data/docs/scripts/post-build.mjs +81 -0
  32. data/lib/fontisan/audit/codepoint_range_coalescer.rb +41 -0
  33. data/lib/fontisan/audit/context.rb +122 -0
  34. data/lib/fontisan/audit/differ.rb +124 -0
  35. data/lib/fontisan/audit/extractors/aggregations.rb +54 -0
  36. data/lib/fontisan/audit/extractors/base.rb +26 -0
  37. data/lib/fontisan/audit/extractors/color_capabilities.rb +141 -0
  38. data/lib/fontisan/audit/extractors/coverage.rb +48 -0
  39. data/lib/fontisan/audit/extractors/hinting.rb +197 -0
  40. data/lib/fontisan/audit/extractors/identity.rb +52 -0
  41. data/lib/fontisan/audit/extractors/language_coverage.rb +37 -0
  42. data/lib/fontisan/audit/extractors/licensing.rb +79 -0
  43. data/lib/fontisan/audit/extractors/metrics.rb +103 -0
  44. data/lib/fontisan/audit/extractors/opentype_layout.rb +69 -0
  45. data/lib/fontisan/audit/extractors/provenance.rb +29 -0
  46. data/lib/fontisan/audit/extractors/style.rb +32 -0
  47. data/lib/fontisan/audit/extractors/variation_detail.rb +99 -0
  48. data/lib/fontisan/audit/extractors.rb +27 -0
  49. data/lib/fontisan/audit/library_aggregator.rb +83 -0
  50. data/lib/fontisan/audit/library_auditor.rb +90 -0
  51. data/lib/fontisan/audit/registry.rb +60 -0
  52. data/lib/fontisan/audit/style_extractor.rb +80 -0
  53. data/lib/fontisan/audit.rb +20 -0
  54. data/lib/fontisan/base_collection.rb +23 -9
  55. data/lib/fontisan/binary/structures.rb +0 -2
  56. data/lib/fontisan/binary.rb +11 -0
  57. data/lib/fontisan/cldr/aggregator.rb +33 -0
  58. data/lib/fontisan/cldr/cache_manager.rb +110 -0
  59. data/lib/fontisan/cldr/config.rb +59 -0
  60. data/lib/fontisan/cldr/download_error.rb +9 -0
  61. data/lib/fontisan/cldr/downloader.rb +79 -0
  62. data/lib/fontisan/cldr/error.rb +8 -0
  63. data/lib/fontisan/cldr/index.rb +64 -0
  64. data/lib/fontisan/cldr/index_builder.rb +72 -0
  65. data/lib/fontisan/cldr/unicode_set_parser.rb +172 -0
  66. data/lib/fontisan/cldr/unknown_version_error.rb +9 -0
  67. data/lib/fontisan/cldr/version_resolver.rb +91 -0
  68. data/lib/fontisan/cldr.rb +23 -0
  69. data/lib/fontisan/cli/cldr_cli.rb +85 -0
  70. data/lib/fontisan/cli/ucd_cli.rb +97 -0
  71. data/lib/fontisan/cli.rb +201 -2
  72. data/lib/fontisan/collection/builder.rb +0 -4
  73. data/lib/fontisan/collection/dfont_builder.rb +0 -4
  74. data/lib/fontisan/collection/shared_logic.rb +0 -2
  75. data/lib/fontisan/collection/writer.rb +0 -3
  76. data/lib/fontisan/collection.rb +15 -0
  77. data/lib/fontisan/commands/audit_command.rb +123 -0
  78. data/lib/fontisan/commands/audit_compare_command.rb +66 -0
  79. data/lib/fontisan/commands/audit_library_command.rb +46 -0
  80. data/lib/fontisan/commands/base_command.rb +0 -3
  81. data/lib/fontisan/commands/convert_command.rb +25 -20
  82. data/lib/fontisan/commands/dump_table_command.rb +0 -3
  83. data/lib/fontisan/commands/export_command.rb +0 -4
  84. data/lib/fontisan/commands/features_command.rb +0 -3
  85. data/lib/fontisan/commands/instance_command.rb +0 -5
  86. data/lib/fontisan/commands/ls_command.rb +0 -6
  87. data/lib/fontisan/commands/optical_size_command.rb +0 -3
  88. data/lib/fontisan/commands/pack_command.rb +0 -5
  89. data/lib/fontisan/commands/scripts_command.rb +0 -2
  90. data/lib/fontisan/commands/subset_command.rb +0 -3
  91. data/lib/fontisan/commands/unicode_command.rb +0 -3
  92. data/lib/fontisan/commands/unpack_command.rb +0 -7
  93. data/lib/fontisan/commands/validate_command.rb +0 -8
  94. data/lib/fontisan/commands/variable_command.rb +0 -3
  95. data/lib/fontisan/commands.rb +29 -0
  96. data/lib/fontisan/config/cldr.yml +22 -0
  97. data/lib/fontisan/config/conversion_matrix.yml +38 -0
  98. data/lib/fontisan/config/ucd.yml +23 -0
  99. data/lib/fontisan/constants.rb +48 -6
  100. data/lib/fontisan/conversion_options.rb +30 -19
  101. data/lib/fontisan/converters/cff_table_builder.rb +0 -3
  102. data/lib/fontisan/converters/collection_converter.rb +0 -8
  103. data/lib/fontisan/converters/conversion_strategy.rb +161 -46
  104. data/lib/fontisan/converters/format_converter.rb +143 -32
  105. data/lib/fontisan/converters/glyf_table_builder.rb +0 -2
  106. data/lib/fontisan/converters/outline_converter.rb +0 -19
  107. data/lib/fontisan/converters/outline_extraction.rb +0 -5
  108. data/lib/fontisan/converters/outline_optimizer.rb +0 -5
  109. data/lib/fontisan/converters/svg_generator.rb +0 -4
  110. data/lib/fontisan/converters/table_copier.rb +0 -2
  111. data/lib/fontisan/converters/type1_converter.rb +0 -11
  112. data/lib/fontisan/converters/woff2_encoder.rb +49 -20
  113. data/lib/fontisan/converters/woff_writer.rb +211 -282
  114. data/lib/fontisan/converters.rb +21 -0
  115. data/lib/fontisan/dfont_collection.rb +29 -10
  116. data/lib/fontisan/export/exporter.rb +0 -6
  117. data/lib/fontisan/export/transformers/font_to_ttx.rb +0 -9
  118. data/lib/fontisan/export/transformers/head_transformer.rb +0 -2
  119. data/lib/fontisan/export/transformers/hhea_transformer.rb +0 -2
  120. data/lib/fontisan/export/transformers/maxp_transformer.rb +0 -2
  121. data/lib/fontisan/export/transformers/name_transformer.rb +0 -2
  122. data/lib/fontisan/export/transformers/os2_transformer.rb +0 -2
  123. data/lib/fontisan/export/transformers/post_transformer.rb +0 -2
  124. data/lib/fontisan/export/transformers.rb +17 -0
  125. data/lib/fontisan/export.rb +13 -0
  126. data/lib/fontisan/font_loader.rb +189 -328
  127. data/lib/fontisan/font_writer.rb +0 -1
  128. data/lib/fontisan/formatters/audit_diff_text_renderer.rb +122 -0
  129. data/lib/fontisan/formatters/audit_text_renderer.rb +324 -0
  130. data/lib/fontisan/formatters/library_summary_text_renderer.rb +99 -0
  131. data/lib/fontisan/formatters/text_formatter.rb +6 -0
  132. data/lib/fontisan/formatters.rb +12 -0
  133. data/lib/fontisan/hints/hint_converter.rb +0 -1
  134. data/lib/fontisan/hints/postscript_hint_applier.rb +0 -9
  135. data/lib/fontisan/hints/postscript_hint_extractor.rb +0 -2
  136. data/lib/fontisan/hints/truetype_hint_extractor.rb +0 -2
  137. data/lib/fontisan/hints.rb +16 -0
  138. data/lib/fontisan/metrics_calculator.rb +0 -2
  139. data/lib/fontisan/models/all_scripts_features_info.rb +0 -1
  140. data/lib/fontisan/models/audit/audit_axis.rb +30 -0
  141. data/lib/fontisan/models/audit/audit_block.rb +32 -0
  142. data/lib/fontisan/models/audit/audit_diff.rb +77 -0
  143. data/lib/fontisan/models/audit/audit_report.rb +153 -0
  144. data/lib/fontisan/models/audit/codepoint_range.rb +40 -0
  145. data/lib/fontisan/models/audit/codepoint_set_diff.rb +34 -0
  146. data/lib/fontisan/models/audit/color_capabilities.rb +93 -0
  147. data/lib/fontisan/models/audit/duplicate_group.rb +23 -0
  148. data/lib/fontisan/models/audit/embedding_type.rb +76 -0
  149. data/lib/fontisan/models/audit/field_change.rb +28 -0
  150. data/lib/fontisan/models/audit/fs_selection_flags.rb +61 -0
  151. data/lib/fontisan/models/audit/gasp_range.rb +63 -0
  152. data/lib/fontisan/models/audit/hinting.rb +93 -0
  153. data/lib/fontisan/models/audit/library_summary.rb +40 -0
  154. data/lib/fontisan/models/audit/licensing.rb +48 -0
  155. data/lib/fontisan/models/audit/metrics.rb +111 -0
  156. data/lib/fontisan/models/audit/named_instance.rb +41 -0
  157. data/lib/fontisan/models/audit/opentype_layout.rb +40 -0
  158. data/lib/fontisan/models/audit/script_coverage_row.rb +26 -0
  159. data/lib/fontisan/models/audit/script_features.rb +28 -0
  160. data/lib/fontisan/models/audit/variation_detail.rb +44 -0
  161. data/lib/fontisan/models/audit.rb +33 -0
  162. data/lib/fontisan/models/cldr/language_coverage.rb +31 -0
  163. data/lib/fontisan/models/cldr.rb +12 -0
  164. data/lib/fontisan/models/collection_brief_info.rb +0 -1
  165. data/lib/fontisan/models/collection_info.rb +0 -2
  166. data/lib/fontisan/models/collection_list_info.rb +0 -1
  167. data/lib/fontisan/models/collection_validation_report.rb +0 -2
  168. data/lib/fontisan/models/color_glyph.rb +0 -1
  169. data/lib/fontisan/models/font_report.rb +0 -1
  170. data/lib/fontisan/models/ttx/tables.rb +21 -0
  171. data/lib/fontisan/models/ttx/ttfont.rb +0 -8
  172. data/lib/fontisan/models/ttx.rb +14 -0
  173. data/lib/fontisan/models/ucd/ucd.rb +38 -0
  174. data/lib/fontisan/models/ucd/ucd_char.rb +67 -0
  175. data/lib/fontisan/models/ucd.rb +19 -0
  176. data/lib/fontisan/models.rb +47 -0
  177. data/lib/fontisan/open_type_collection.rb +6 -5
  178. data/lib/fontisan/open_type_font.rb +8 -2
  179. data/lib/fontisan/open_type_font_extensions.rb +9 -9
  180. data/lib/fontisan/optimizers/pattern_analyzer.rb +0 -1
  181. data/lib/fontisan/optimizers.rb +14 -0
  182. data/lib/fontisan/outline_extractor.rb +0 -2
  183. data/lib/fontisan/parsers/dfont_parser.rb +0 -1
  184. data/lib/fontisan/parsers.rb +10 -0
  185. data/lib/fontisan/pipeline/format_detector.rb +29 -102
  186. data/lib/fontisan/pipeline/output_writer.rb +11 -9
  187. data/lib/fontisan/pipeline/strategies/instance_strategy.rb +0 -4
  188. data/lib/fontisan/pipeline/strategies/named_strategy.rb +0 -4
  189. data/lib/fontisan/pipeline/strategies/preserve_strategy.rb +0 -2
  190. data/lib/fontisan/pipeline/strategies.rb +14 -0
  191. data/lib/fontisan/pipeline/transformation_pipeline.rb +0 -7
  192. data/lib/fontisan/pipeline/variation_resolver.rb +0 -7
  193. data/lib/fontisan/pipeline.rb +13 -0
  194. data/lib/fontisan/sfnt_font.rb +29 -14
  195. data/lib/fontisan/sfnt_table.rb +0 -4
  196. data/lib/fontisan/subset/builder.rb +0 -6
  197. data/lib/fontisan/subset.rb +13 -0
  198. data/lib/fontisan/svg/font_generator.rb +0 -4
  199. data/lib/fontisan/svg/glyph_generator.rb +0 -2
  200. data/lib/fontisan/svg.rb +12 -0
  201. data/lib/fontisan/tables/cbdt.rb +0 -1
  202. data/lib/fontisan/tables/cblc.rb +0 -1
  203. data/lib/fontisan/tables/cff/charset.rb +0 -1
  204. data/lib/fontisan/tables/cff/charstring.rb +0 -1
  205. data/lib/fontisan/tables/cff/charstring_rebuilder.rb +0 -4
  206. data/lib/fontisan/tables/cff/charstrings_index.rb +0 -3
  207. data/lib/fontisan/tables/cff/dict.rb +0 -1
  208. data/lib/fontisan/tables/cff/encoding.rb +0 -1
  209. data/lib/fontisan/tables/cff/header.rb +0 -2
  210. data/lib/fontisan/tables/cff/hint_operation_injector.rb +0 -2
  211. data/lib/fontisan/tables/cff/index.rb +0 -1
  212. data/lib/fontisan/tables/cff/private_dict.rb +0 -2
  213. data/lib/fontisan/tables/cff/private_dict_writer.rb +0 -2
  214. data/lib/fontisan/tables/cff/table_builder.rb +0 -6
  215. data/lib/fontisan/tables/cff/top_dict.rb +0 -2
  216. data/lib/fontisan/tables/cff.rb +22 -15
  217. data/lib/fontisan/tables/cff2/charstring_parser.rb +0 -2
  218. data/lib/fontisan/tables/cff2/table_builder.rb +0 -11
  219. data/lib/fontisan/tables/cff2/table_reader.rb +0 -2
  220. data/lib/fontisan/tables/cff2.rb +13 -14
  221. data/lib/fontisan/tables/cmap.rb +24 -2
  222. data/lib/fontisan/tables/cmap_table.rb +0 -3
  223. data/lib/fontisan/tables/colr.rb +0 -1
  224. data/lib/fontisan/tables/cpal.rb +0 -1
  225. data/lib/fontisan/tables/cvar.rb +0 -2
  226. data/lib/fontisan/tables/fvar.rb +0 -1
  227. data/lib/fontisan/tables/glyf/compound_glyph_resolver.rb +0 -2
  228. data/lib/fontisan/tables/glyf/glyph_builder.rb +0 -3
  229. data/lib/fontisan/tables/glyf.rb +0 -6
  230. data/lib/fontisan/tables/glyf_table.rb +0 -3
  231. data/lib/fontisan/tables/gpos.rb +0 -2
  232. data/lib/fontisan/tables/gsub.rb +0 -2
  233. data/lib/fontisan/tables/gvar.rb +0 -2
  234. data/lib/fontisan/tables/head.rb +0 -2
  235. data/lib/fontisan/tables/head_table.rb +0 -3
  236. data/lib/fontisan/tables/hhea.rb +0 -2
  237. data/lib/fontisan/tables/hhea_table.rb +0 -3
  238. data/lib/fontisan/tables/hmtx.rb +0 -2
  239. data/lib/fontisan/tables/hmtx_table.rb +0 -3
  240. data/lib/fontisan/tables/hvar.rb +0 -3
  241. data/lib/fontisan/tables/loca.rb +0 -2
  242. data/lib/fontisan/tables/loca_table.rb +0 -3
  243. data/lib/fontisan/tables/maxp.rb +0 -2
  244. data/lib/fontisan/tables/maxp_table.rb +0 -3
  245. data/lib/fontisan/tables/mvar.rb +0 -3
  246. data/lib/fontisan/tables/name.rb +0 -2
  247. data/lib/fontisan/tables/name_table.rb +0 -3
  248. data/lib/fontisan/tables/os2_table.rb +0 -3
  249. data/lib/fontisan/tables/post_table.rb +0 -3
  250. data/lib/fontisan/tables/sbix.rb +0 -1
  251. data/lib/fontisan/tables/svg.rb +0 -1
  252. data/lib/fontisan/tables/variation_common.rb +0 -1
  253. data/lib/fontisan/tables/vvar.rb +0 -3
  254. data/lib/fontisan/tables.rb +54 -0
  255. data/lib/fontisan/true_type_collection.rb +6 -14
  256. data/lib/fontisan/true_type_font.rb +8 -2
  257. data/lib/fontisan/true_type_font_extensions.rb +9 -9
  258. data/lib/fontisan/type1/afm_generator.rb +0 -4
  259. data/lib/fontisan/type1/conversion_options.rb +0 -2
  260. data/lib/fontisan/type1/encodings.rb +0 -2
  261. data/lib/fontisan/type1/generator.rb +0 -8
  262. data/lib/fontisan/type1/pfa_generator.rb +0 -3
  263. data/lib/fontisan/type1/pfb_generator.rb +0 -5
  264. data/lib/fontisan/type1/pfm_generator.rb +0 -4
  265. data/lib/fontisan/type1.rb +42 -69
  266. data/lib/fontisan/type1_font.rb +40 -11
  267. data/lib/fontisan/ucd/aggregator.rb +73 -0
  268. data/lib/fontisan/ucd/cache_manager.rb +111 -0
  269. data/lib/fontisan/ucd/config.rb +59 -0
  270. data/lib/fontisan/ucd/download_error.rb +9 -0
  271. data/lib/fontisan/ucd/downloader.rb +88 -0
  272. data/lib/fontisan/ucd/error.rb +8 -0
  273. data/lib/fontisan/ucd/index.rb +103 -0
  274. data/lib/fontisan/ucd/index_builder.rb +107 -0
  275. data/lib/fontisan/ucd/range_entry.rb +56 -0
  276. data/lib/fontisan/ucd/unknown_version_error.rb +9 -0
  277. data/lib/fontisan/ucd/version_resolver.rb +79 -0
  278. data/lib/fontisan/ucd.rb +23 -0
  279. data/lib/fontisan/utilities/checksum_calculator.rb +0 -1
  280. data/lib/fontisan/utilities.rb +10 -0
  281. data/lib/fontisan/utils.rb +10 -0
  282. data/lib/fontisan/validation/collection_validator.rb +0 -2
  283. data/lib/fontisan/validation.rb +9 -0
  284. data/lib/fontisan/validators/basic_validator.rb +0 -2
  285. data/lib/fontisan/validators/font_book_validator.rb +0 -2
  286. data/lib/fontisan/validators/opentype_validator.rb +0 -2
  287. data/lib/fontisan/validators/profile_loader.rb +0 -5
  288. data/lib/fontisan/validators/validator.rb +0 -2
  289. data/lib/fontisan/validators/web_font_validator.rb +0 -2
  290. data/lib/fontisan/validators.rb +14 -0
  291. data/lib/fontisan/variable/delta_applicator.rb +0 -4
  292. data/lib/fontisan/variable/instancer.rb +0 -3
  293. data/lib/fontisan/variable/static_font_builder.rb +0 -3
  294. data/lib/fontisan/variable.rb +16 -0
  295. data/lib/fontisan/variation/blend_applier.rb +0 -2
  296. data/lib/fontisan/variation/cache.rb +0 -2
  297. data/lib/fontisan/variation/converter.rb +0 -3
  298. data/lib/fontisan/variation/data_extractor.rb +0 -2
  299. data/lib/fontisan/variation/delta_applier.rb +0 -5
  300. data/lib/fontisan/variation/inspector.rb +0 -1
  301. data/lib/fontisan/variation/instance_generator.rb +0 -6
  302. data/lib/fontisan/variation/instance_writer.rb +0 -5
  303. data/lib/fontisan/variation/metrics_adjuster.rb +0 -4
  304. data/lib/fontisan/variation/optimizer.rb +0 -3
  305. data/lib/fontisan/variation/parallel_generator.rb +0 -3
  306. data/lib/fontisan/variation/subsetter.rb +0 -4
  307. data/lib/fontisan/variation/tuple_variation_header.rb +0 -2
  308. data/lib/fontisan/variation/variable_svg_generator.rb +0 -3
  309. data/lib/fontisan/variation/variation_context.rb +0 -3
  310. data/lib/fontisan/variation/variation_preserver.rb +0 -3
  311. data/lib/fontisan/variation.rb +31 -0
  312. data/lib/fontisan/version.rb +1 -1
  313. data/lib/fontisan/woff2.rb +13 -0
  314. data/lib/fontisan/woff2_font.rb +31 -9
  315. data/lib/fontisan/woff_font.rb +31 -2
  316. data/lib/fontisan.rb +124 -196
  317. metadata +128 -7
  318. data/fontisan.gemspec +0 -47
@@ -1,20 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "bindata"
4
- require_relative "constants"
5
- require_relative "loading_modes"
6
- require_relative "utilities/checksum_calculator"
7
- require_relative "sfnt_table"
8
- require_relative "tables/head_table"
9
- require_relative "tables/name_table"
10
- require_relative "tables/os2_table"
11
- require_relative "tables/cmap_table"
12
- require_relative "tables/glyf_table"
13
- require_relative "tables/hhea_table"
14
- require_relative "tables/maxp_table"
15
- require_relative "tables/post_table"
16
- require_relative "tables/hmtx_table"
17
- require_relative "tables/loca_table"
18
4
 
19
5
  module Fontisan
20
6
  # SFNT Offset Table structure
@@ -377,6 +363,35 @@ module Fontisan
377
363
  !find_table_entry(tag).nil?
378
364
  end
379
365
 
366
+ # Whether this object represents a font collection rather than a single
367
+ # font. Each font class is the authority on this question.
368
+ #
369
+ # @return [Boolean]
370
+ def collection? = false
371
+
372
+ # Variation profile of the font, derived from its table set. Used by the
373
+ # conversion pipeline to choose between preserving variation tables and
374
+ # generating a static instance.
375
+ #
376
+ # @return [Symbol] :static, :gvar (TrueType variable), or :cff2 (CFF2 variable)
377
+ def variation_type
378
+ return :static unless has_table?("fvar")
379
+ return :gvar if has_table?("gvar")
380
+ return :cff2 if has_table?("CFF2")
381
+
382
+ :static
383
+ end
384
+
385
+ # Outline representation used by the font. Derived from the table set.
386
+ #
387
+ # @return [Symbol] :truetype (glyf/gvar) or :cff (CFF/CFF2)
388
+ def outline_type
389
+ return :truetype if has_table?("glyf") || has_table?("gvar")
390
+ return :cff if has_table?("CFF ") || has_table?("CFF2")
391
+
392
+ :unknown
393
+ end
394
+
380
395
  # Check if a table is available in the current loading mode
381
396
  #
382
397
  # @param tag [String] The table tag to check
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "constants"
4
- require_relative "loading_modes"
5
-
6
3
  module Fontisan
7
4
  # Base class for SFNT font tables
8
5
  #
@@ -198,7 +195,6 @@ module Fontisan
198
195
  def calculate_checksum
199
196
  load_data! unless data_loaded?
200
197
 
201
- require_relative "utilities/checksum_calculator"
202
198
  Utilities::ChecksumCalculator.calculate_table_checksum(@data)
203
199
  end
204
200
 
@@ -1,11 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "options"
4
- require_relative "profile"
5
- require_relative "glyph_mapping"
6
- require_relative "table_subsetter"
7
- require_relative "../font_writer"
8
-
9
3
  module Fontisan
10
4
  module Subset
11
5
  # Main font subsetting engine
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Autoload hub for the Fontisan::Subset namespace.
4
+
5
+ module Fontisan
6
+ module Subset
7
+ autoload :Builder, "fontisan/subset/builder"
8
+ autoload :GlyphMapping, "fontisan/subset/glyph_mapping"
9
+ autoload :Options, "fontisan/subset/options"
10
+ autoload :Profile, "fontisan/subset/profile"
11
+ autoload :TableSubsetter, "fontisan/subset/table_subsetter"
12
+ end
13
+ end
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "font_face_generator"
4
- require_relative "glyph_generator"
5
- require_relative "view_box_calculator"
6
-
7
3
  module Fontisan
8
4
  module Svg
9
5
  # Generates complete SVG font XML structure
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "view_box_calculator"
4
-
5
3
  module Fontisan
6
4
  module Svg
7
5
  # Generates SVG glyph elements from glyph outlines
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Autoload hub for the Fontisan::Svg namespace.
4
+
5
+ module Fontisan
6
+ module Svg
7
+ autoload :FontFaceGenerator, "fontisan/svg/font_face_generator"
8
+ autoload :FontGenerator, "fontisan/svg/font_generator"
9
+ autoload :GlyphGenerator, "fontisan/svg/glyph_generator"
10
+ autoload :ViewBoxCalculator, "fontisan/svg/view_box_calculator"
11
+ end
12
+ end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "charstring_parser"
4
- require_relative "charstring_builder"
5
- require_relative "index_builder"
6
-
7
3
  module Fontisan
8
4
  module Tables
9
5
  class Cff
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "index"
4
- require_relative "charstring"
5
-
6
3
  module Fontisan
7
4
  module Tables
8
5
  class Cff
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../../binary/base_record"
4
-
5
3
  module Fontisan
6
4
  module Tables
7
5
  class Cff
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../../models/hint"
4
-
5
3
  module Fontisan
6
4
  module Tables
7
5
  class Cff
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "dict"
4
-
5
3
  module Fontisan
6
4
  module Tables
7
5
  class Cff
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "dict_builder"
4
-
5
3
  module Fontisan
6
4
  module Tables
7
5
  class Cff
@@ -1,11 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "private_dict_writer"
4
- require_relative "offset_recalculator"
5
- require_relative "index_builder"
6
- require_relative "dict_builder"
7
- require_relative "charstring_rebuilder"
8
- require_relative "hint_operation_injector"
9
3
  require "stringio"
10
4
 
11
5
  module Fontisan
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "dict"
4
-
5
3
  module Fontisan
6
4
  module Tables
7
5
  class Cff
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -42,6 +41,28 @@ module Fontisan
42
41
  # puts cff.font_count # => 1
43
42
  # puts cff.header.version # => "1.0"
44
43
  class Cff < Binary::BaseRecord
44
+ # Inner namespace autoloads — declared here so Cff::* constants
45
+ # resolve on first reference without require_relative.
46
+ autoload :CFFGlyph, "fontisan/tables/cff/cff_glyph"
47
+ autoload :Charset, "fontisan/tables/cff/charset"
48
+ autoload :CharString, "fontisan/tables/cff/charstring"
49
+ autoload :CharStringBuilder, "fontisan/tables/cff/charstring_builder"
50
+ autoload :CharStringParser, "fontisan/tables/cff/charstring_parser"
51
+ autoload :CharStringRebuilder, "fontisan/tables/cff/charstring_rebuilder"
52
+ autoload :CharstringsIndex, "fontisan/tables/cff/charstrings_index"
53
+ autoload :Dict, "fontisan/tables/cff/dict"
54
+ autoload :DictBuilder, "fontisan/tables/cff/dict_builder"
55
+ autoload :Encoding, "fontisan/tables/cff/encoding"
56
+ autoload :Header, "fontisan/tables/cff/header"
57
+ autoload :HintOperationInjector, "fontisan/tables/cff/hint_operation_injector"
58
+ autoload :Index, "fontisan/tables/cff/index"
59
+ autoload :IndexBuilder, "fontisan/tables/cff/index_builder"
60
+ autoload :OffsetRecalculator, "fontisan/tables/cff/offset_recalculator"
61
+ autoload :PrivateDict, "fontisan/tables/cff/private_dict"
62
+ autoload :PrivateDictWriter, "fontisan/tables/cff/private_dict_writer"
63
+ autoload :TableBuilder, "fontisan/tables/cff/table_builder"
64
+ autoload :TopDict, "fontisan/tables/cff/top_dict"
65
+
45
66
  # OpenType table tag for CFF
46
67
  TAG = "CFF "
47
68
 
@@ -468,19 +489,5 @@ module Fontisan
468
489
  raise CorruptedTableError, "Failed to parse Encoding: #{e.message}"
469
490
  end
470
491
  end
471
-
472
- # Load nested class definitions after the main class is defined
473
- require_relative "cff/header"
474
- require_relative "cff/index"
475
- require_relative "cff/dict"
476
- require_relative "cff/top_dict"
477
- require_relative "cff/private_dict"
478
- require_relative "cff/charstring"
479
- require_relative "cff/charstring_parser"
480
- require_relative "cff/charstring_rebuilder"
481
- require_relative "cff/charstrings_index"
482
- require_relative "cff/charset"
483
- require_relative "cff/encoding"
484
- require_relative "cff/cff_glyph"
485
492
  end
486
493
  end
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../../binary/base_record"
5
- require_relative "../cff/charstring"
6
4
 
7
5
  module Fontisan
8
6
  module Tables
@@ -1,12 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../cff/table_builder"
4
- require_relative "table_reader"
5
- require_relative "private_dict_blend_handler"
6
- require_relative "../cff/charstring_parser"
7
- require_relative "../cff/charstring_builder"
8
- require_relative "../cff/hint_operation_injector"
9
- require_relative "../cff/dict_builder"
10
3
  require "stringio"
11
4
 
12
5
  module Fontisan
@@ -493,8 +486,6 @@ vstore:)
493
486
  # @param dict [Hash] Top DICT hash with integer operator keys
494
487
  # @return [String] Binary DICT data
495
488
  def serialize_top_dict(dict)
496
- require_relative "../cff/dict_builder"
497
-
498
489
  # Convert integer operator keys to symbol keys for DictBuilder
499
490
  symbol_dict = convert_operators_to_symbols(dict)
500
491
  Cff::DictBuilder.build(symbol_dict)
@@ -505,8 +496,6 @@ vstore:)
505
496
  # @param dict [Hash] Private DICT hash
506
497
  # @return [String] Binary DICT data
507
498
  def serialize_private_dict(dict)
508
- require_relative "../cff/dict_builder"
509
-
510
499
  # Convert integer operator keys to symbol keys for DictBuilder
511
500
  symbol_dict = convert_operators_to_symbols(dict)
512
501
  Cff::DictBuilder.build(symbol_dict)
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -233,7 +232,6 @@ module Fontisan
233
232
  # @return [Cff::Index] CharStrings INDEX
234
233
  def read_charstrings(offset)
235
234
  @io.seek(offset)
236
- require_relative "../cff/index"
237
235
  Cff::Index.new(@io, start_offset: offset)
238
236
  end
239
237
 
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -21,6 +20,19 @@ module Fontisan
21
20
  # cff2 = Fontisan::Tables::Cff2.read(data)
22
21
  # num_glyphs = cff2.glyph_count
23
22
  class Cff2 < Binary::BaseRecord
23
+ # Inner namespace autoloads — declared here so Cff2::* constants
24
+ # resolve on first reference without require_relative.
25
+ autoload :BlendOperator, "fontisan/tables/cff2/blend_operator"
26
+ autoload :CharstringParser, "fontisan/tables/cff2/charstring_parser"
27
+ autoload :OperandStack, "fontisan/tables/cff2/operand_stack"
28
+ autoload :PrivateDictBlendHandler,
29
+ "fontisan/tables/cff2/private_dict_blend_handler"
30
+ autoload :RegionMatcher, "fontisan/tables/cff2/region_matcher"
31
+ autoload :TableBuilder, "fontisan/tables/cff2/table_builder"
32
+ autoload :TableReader, "fontisan/tables/cff2/table_reader"
33
+ autoload :VariationDataExtractor,
34
+ "fontisan/tables/cff2/variation_data_extractor"
35
+
24
36
  # CFF2 header structure
25
37
  class Cff2Header < Binary::BaseRecord
26
38
  uint8 :major_version
@@ -105,7 +117,6 @@ module Fontisan
105
117
  return nil if charstring_data.nil?
106
118
 
107
119
  # Parse with CFF2 CharString parser
108
- require_relative "cff2/charstring_parser"
109
120
  CharstringParser.new(
110
121
  charstring_data,
111
122
  @num_axes,
@@ -159,7 +170,6 @@ module Fontisan
159
170
  io = StringIO.new(data)
160
171
  io.seek(offset)
161
172
 
162
- require_relative "cff/index"
163
173
  Cff::Index.new(io, start_offset: offset)
164
174
  rescue StandardError => e
165
175
  warn "Failed to parse Global Subr INDEX: #{e.message}"
@@ -212,7 +222,6 @@ module Fontisan
212
222
  io = StringIO.new(data)
213
223
  io.seek(offset)
214
224
 
215
- require_relative "cff/index"
216
225
  Cff::Index.new(io, start_offset: offset)
217
226
  rescue StandardError => e
218
227
  warn "Failed to parse CharStrings INDEX: #{e.message}"
@@ -334,13 +343,3 @@ module Fontisan
334
343
  end
335
344
  end
336
345
  end
337
-
338
- # Load CFF2 subcomponents
339
- require_relative "cff2/charstring_parser"
340
- require_relative "cff2/blend_operator"
341
- require_relative "cff2/operand_stack"
342
- require_relative "cff2/table_reader"
343
- require_relative "cff2/variation_data_extractor"
344
- require_relative "cff2/region_matcher"
345
- require_relative "cff2/private_dict_blend_handler"
346
- require_relative "cff2/table_builder"
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../binary/base_record"
4
-
5
3
  module Fontisan
6
4
  module Tables
7
5
  # Parser for the 'cmap' (Character to Glyph Index Mapping) table
@@ -347,6 +345,30 @@ module Fontisan
347
345
  false
348
346
  end
349
347
 
348
+ # Distinct subtable formats present in this cmap, sorted ascending.
349
+ #
350
+ # Each encoding record's subtable begins with a uint16 format tag.
351
+ # Returns the unique set of those formats across all records. Useful
352
+ # for audit reports that need to record which cmap subtables
353
+ # contributed to the Unicode mappings.
354
+ #
355
+ # @return [Array<Integer>] sorted unique format numbers
356
+ def subtable_formats
357
+ data = to_binary_s
358
+ records = read_encoding_records(data)
359
+
360
+ formats = records.filter_map do |record|
361
+ subtable_data = extract_subtable_data(record, data)
362
+ next nil unless subtable_data && subtable_data.length >= 2
363
+
364
+ subtable_data[0, 2].unpack1("n")
365
+ end
366
+
367
+ formats.uniq.sort
368
+ rescue StandardError
369
+ []
370
+ end
371
+
350
372
  # Validation helper: Check if glyph indices are within bounds
351
373
  #
352
374
  # @param max_glyph_id [Integer] Maximum valid glyph ID from maxp table
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../sfnt_table"
4
- require_relative "cmap"
5
-
6
3
  module Fontisan
7
4
  module Tables
8
5
  # OOP representation of the 'cmap' (Character to Glyph Index Mapping) table
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../binary/base_record"
5
- require_relative "../variation/tuple_variation_header"
6
4
 
7
5
  module Fontisan
8
6
  module Tables
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../binary/base_record"
5
4
 
6
5
  module Fontisan
7
6
  module Tables
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../../models/outline"
4
-
5
3
  module Fontisan
6
4
  module Tables
7
5
  # Resolves compound glyphs into simple outlines
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../../models/outline"
4
- require_relative "curve_converter"
5
-
6
3
  module Fontisan
7
4
  module Tables
8
5
  # Builds binary TrueType glyph data from universal outline representation
@@ -1,11 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../binary/base_record"
4
- require_relative "glyf/simple_glyph"
5
- require_relative "glyf/compound_glyph"
6
- require_relative "glyf/curve_converter"
7
- require_relative "glyf/glyph_builder"
8
-
9
3
  module Fontisan
10
4
  module Tables
11
5
  # Parser for the 'glyf' (Glyph Data) table
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../sfnt_table"
4
- require_relative "glyf"
5
-
6
3
  module Fontisan
7
4
  module Tables
8
5
  # OOP representation of the 'glyf' (Glyph Data) table
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "layout_common"
4
-
5
3
  module Fontisan
6
4
  module Tables
7
5
  # GPOS (Glyph Positioning) table parser
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "layout_common"
4
-
5
3
  module Fontisan
6
4
  module Tables
7
5
  # GSUB (Glyph Substitution) table parser
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
- require_relative "../binary/base_record"
5
- require_relative "../variation/tuple_variation_header"
6
4
 
7
5
  module Fontisan
8
6
  module Tables
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../binary/base_record"
4
-
5
3
  module Fontisan
6
4
  module Tables
7
5
  # BinData structure for the 'head' (Font Header) table
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../sfnt_table"
4
- require_relative "head"
5
-
6
3
  module Fontisan
7
4
  module Tables
8
5
  # OOP representation of the 'head' (Font Header) table
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../binary/base_record"
4
-
5
3
  module Fontisan
6
4
  module Tables
7
5
  # BinData structure for the 'hhea' (Horizontal Header) table
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../sfnt_table"
4
- require_relative "hhea"
5
-
6
3
  module Fontisan
7
4
  module Tables
8
5
  # OOP representation of the 'hhea' (Horizontal Header) table
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../binary/base_record"
4
-
5
3
  module Fontisan
6
4
  module Tables
7
5
  # Parser for the 'hmtx' (Horizontal Metrics) table