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.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +14 -90
- data/Gemfile +6 -3
- data/README.adoc +257 -1
- data/docs/.vitepress/config.ts +68 -8
- data/docs/.vitepress/theme/style.css +570 -272
- data/docs/CONVERSION_GUIDE.adoc +31 -8
- data/docs/EXTRACT_TTC_MIGRATION.md +1 -1
- data/docs/WOFF_WOFF2_FORMATS.adoc +53 -0
- data/docs/api/conversion-options.md +37 -14
- data/docs/api/font-loader.md +21 -15
- data/docs/cli/audit.md +337 -0
- data/docs/cli/convert.md +20 -1
- data/docs/cli/index.md +31 -0
- data/docs/guide/color.md +1 -1
- data/docs/guide/conversion/options.md +32 -3
- data/docs/guide/conversion/ttf-otf.md +1 -1
- data/docs/guide/conversion/type1.md +1 -1
- data/docs/guide/conversion/web.md +91 -32
- data/docs/guide/conversion.md +6 -5
- data/docs/guide/formats/woff.md +35 -11
- data/docs/guide/index.md +2 -2
- data/docs/guide/migrations/extract-ttc.md +1 -1
- data/docs/guide/quick-start.md +4 -4
- data/docs/guide/type1.md +4 -4
- data/docs/guide/woff.md +19 -17
- data/docs/index.md +2 -0
- data/docs/lychee.toml +5 -1
- data/docs/package.json +1 -1
- data/docs/public/robots.txt +4 -0
- data/docs/scripts/post-build.mjs +81 -0
- data/lib/fontisan/audit/codepoint_range_coalescer.rb +41 -0
- data/lib/fontisan/audit/context.rb +122 -0
- data/lib/fontisan/audit/differ.rb +124 -0
- data/lib/fontisan/audit/extractors/aggregations.rb +54 -0
- data/lib/fontisan/audit/extractors/base.rb +26 -0
- data/lib/fontisan/audit/extractors/color_capabilities.rb +141 -0
- data/lib/fontisan/audit/extractors/coverage.rb +48 -0
- data/lib/fontisan/audit/extractors/hinting.rb +197 -0
- data/lib/fontisan/audit/extractors/identity.rb +52 -0
- data/lib/fontisan/audit/extractors/language_coverage.rb +37 -0
- data/lib/fontisan/audit/extractors/licensing.rb +79 -0
- data/lib/fontisan/audit/extractors/metrics.rb +103 -0
- data/lib/fontisan/audit/extractors/opentype_layout.rb +69 -0
- data/lib/fontisan/audit/extractors/provenance.rb +29 -0
- data/lib/fontisan/audit/extractors/style.rb +32 -0
- data/lib/fontisan/audit/extractors/variation_detail.rb +99 -0
- data/lib/fontisan/audit/extractors.rb +27 -0
- data/lib/fontisan/audit/library_aggregator.rb +83 -0
- data/lib/fontisan/audit/library_auditor.rb +90 -0
- data/lib/fontisan/audit/registry.rb +60 -0
- data/lib/fontisan/audit/style_extractor.rb +80 -0
- data/lib/fontisan/audit.rb +20 -0
- data/lib/fontisan/base_collection.rb +23 -9
- data/lib/fontisan/binary/structures.rb +0 -2
- data/lib/fontisan/binary.rb +11 -0
- data/lib/fontisan/cldr/aggregator.rb +33 -0
- data/lib/fontisan/cldr/cache_manager.rb +110 -0
- data/lib/fontisan/cldr/config.rb +59 -0
- data/lib/fontisan/cldr/download_error.rb +9 -0
- data/lib/fontisan/cldr/downloader.rb +79 -0
- data/lib/fontisan/cldr/error.rb +8 -0
- data/lib/fontisan/cldr/index.rb +64 -0
- data/lib/fontisan/cldr/index_builder.rb +72 -0
- data/lib/fontisan/cldr/unicode_set_parser.rb +172 -0
- data/lib/fontisan/cldr/unknown_version_error.rb +9 -0
- data/lib/fontisan/cldr/version_resolver.rb +91 -0
- data/lib/fontisan/cldr.rb +23 -0
- data/lib/fontisan/cli/cldr_cli.rb +85 -0
- data/lib/fontisan/cli/ucd_cli.rb +97 -0
- data/lib/fontisan/cli.rb +201 -2
- data/lib/fontisan/collection/builder.rb +0 -4
- data/lib/fontisan/collection/dfont_builder.rb +0 -4
- data/lib/fontisan/collection/shared_logic.rb +0 -2
- data/lib/fontisan/collection/writer.rb +0 -3
- data/lib/fontisan/collection.rb +15 -0
- data/lib/fontisan/commands/audit_command.rb +123 -0
- data/lib/fontisan/commands/audit_compare_command.rb +66 -0
- data/lib/fontisan/commands/audit_library_command.rb +46 -0
- data/lib/fontisan/commands/base_command.rb +0 -3
- data/lib/fontisan/commands/convert_command.rb +25 -20
- data/lib/fontisan/commands/dump_table_command.rb +0 -3
- data/lib/fontisan/commands/export_command.rb +0 -4
- data/lib/fontisan/commands/features_command.rb +0 -3
- data/lib/fontisan/commands/instance_command.rb +0 -5
- data/lib/fontisan/commands/ls_command.rb +0 -6
- data/lib/fontisan/commands/optical_size_command.rb +0 -3
- data/lib/fontisan/commands/pack_command.rb +0 -5
- data/lib/fontisan/commands/scripts_command.rb +0 -2
- data/lib/fontisan/commands/subset_command.rb +0 -3
- data/lib/fontisan/commands/unicode_command.rb +0 -3
- data/lib/fontisan/commands/unpack_command.rb +0 -7
- data/lib/fontisan/commands/validate_command.rb +0 -8
- data/lib/fontisan/commands/variable_command.rb +0 -3
- data/lib/fontisan/commands.rb +29 -0
- data/lib/fontisan/config/cldr.yml +22 -0
- data/lib/fontisan/config/conversion_matrix.yml +38 -0
- data/lib/fontisan/config/ucd.yml +23 -0
- data/lib/fontisan/constants.rb +48 -6
- data/lib/fontisan/conversion_options.rb +30 -19
- data/lib/fontisan/converters/cff_table_builder.rb +0 -3
- data/lib/fontisan/converters/collection_converter.rb +0 -8
- data/lib/fontisan/converters/conversion_strategy.rb +161 -46
- data/lib/fontisan/converters/format_converter.rb +143 -32
- data/lib/fontisan/converters/glyf_table_builder.rb +0 -2
- data/lib/fontisan/converters/outline_converter.rb +0 -19
- data/lib/fontisan/converters/outline_extraction.rb +0 -5
- data/lib/fontisan/converters/outline_optimizer.rb +0 -5
- data/lib/fontisan/converters/svg_generator.rb +0 -4
- data/lib/fontisan/converters/table_copier.rb +0 -2
- data/lib/fontisan/converters/type1_converter.rb +0 -11
- data/lib/fontisan/converters/woff2_encoder.rb +49 -20
- data/lib/fontisan/converters/woff_writer.rb +211 -282
- data/lib/fontisan/converters.rb +21 -0
- data/lib/fontisan/dfont_collection.rb +29 -10
- data/lib/fontisan/export/exporter.rb +0 -6
- data/lib/fontisan/export/transformers/font_to_ttx.rb +0 -9
- data/lib/fontisan/export/transformers/head_transformer.rb +0 -2
- data/lib/fontisan/export/transformers/hhea_transformer.rb +0 -2
- data/lib/fontisan/export/transformers/maxp_transformer.rb +0 -2
- data/lib/fontisan/export/transformers/name_transformer.rb +0 -2
- data/lib/fontisan/export/transformers/os2_transformer.rb +0 -2
- data/lib/fontisan/export/transformers/post_transformer.rb +0 -2
- data/lib/fontisan/export/transformers.rb +17 -0
- data/lib/fontisan/export.rb +13 -0
- data/lib/fontisan/font_loader.rb +189 -328
- data/lib/fontisan/font_writer.rb +0 -1
- data/lib/fontisan/formatters/audit_diff_text_renderer.rb +122 -0
- data/lib/fontisan/formatters/audit_text_renderer.rb +324 -0
- data/lib/fontisan/formatters/library_summary_text_renderer.rb +99 -0
- data/lib/fontisan/formatters/text_formatter.rb +6 -0
- data/lib/fontisan/formatters.rb +12 -0
- data/lib/fontisan/hints/hint_converter.rb +0 -1
- data/lib/fontisan/hints/postscript_hint_applier.rb +0 -9
- data/lib/fontisan/hints/postscript_hint_extractor.rb +0 -2
- data/lib/fontisan/hints/truetype_hint_extractor.rb +0 -2
- data/lib/fontisan/hints.rb +16 -0
- data/lib/fontisan/metrics_calculator.rb +0 -2
- data/lib/fontisan/models/all_scripts_features_info.rb +0 -1
- data/lib/fontisan/models/audit/audit_axis.rb +30 -0
- data/lib/fontisan/models/audit/audit_block.rb +32 -0
- data/lib/fontisan/models/audit/audit_diff.rb +77 -0
- data/lib/fontisan/models/audit/audit_report.rb +153 -0
- data/lib/fontisan/models/audit/codepoint_range.rb +40 -0
- data/lib/fontisan/models/audit/codepoint_set_diff.rb +34 -0
- data/lib/fontisan/models/audit/color_capabilities.rb +93 -0
- data/lib/fontisan/models/audit/duplicate_group.rb +23 -0
- data/lib/fontisan/models/audit/embedding_type.rb +76 -0
- data/lib/fontisan/models/audit/field_change.rb +28 -0
- data/lib/fontisan/models/audit/fs_selection_flags.rb +61 -0
- data/lib/fontisan/models/audit/gasp_range.rb +63 -0
- data/lib/fontisan/models/audit/hinting.rb +93 -0
- data/lib/fontisan/models/audit/library_summary.rb +40 -0
- data/lib/fontisan/models/audit/licensing.rb +48 -0
- data/lib/fontisan/models/audit/metrics.rb +111 -0
- data/lib/fontisan/models/audit/named_instance.rb +41 -0
- data/lib/fontisan/models/audit/opentype_layout.rb +40 -0
- data/lib/fontisan/models/audit/script_coverage_row.rb +26 -0
- data/lib/fontisan/models/audit/script_features.rb +28 -0
- data/lib/fontisan/models/audit/variation_detail.rb +44 -0
- data/lib/fontisan/models/audit.rb +33 -0
- data/lib/fontisan/models/cldr/language_coverage.rb +31 -0
- data/lib/fontisan/models/cldr.rb +12 -0
- data/lib/fontisan/models/collection_brief_info.rb +0 -1
- data/lib/fontisan/models/collection_info.rb +0 -2
- data/lib/fontisan/models/collection_list_info.rb +0 -1
- data/lib/fontisan/models/collection_validation_report.rb +0 -2
- data/lib/fontisan/models/color_glyph.rb +0 -1
- data/lib/fontisan/models/font_report.rb +0 -1
- data/lib/fontisan/models/ttx/tables.rb +21 -0
- data/lib/fontisan/models/ttx/ttfont.rb +0 -8
- data/lib/fontisan/models/ttx.rb +14 -0
- data/lib/fontisan/models/ucd/ucd.rb +38 -0
- data/lib/fontisan/models/ucd/ucd_char.rb +67 -0
- data/lib/fontisan/models/ucd.rb +19 -0
- data/lib/fontisan/models.rb +47 -0
- data/lib/fontisan/open_type_collection.rb +6 -5
- data/lib/fontisan/open_type_font.rb +8 -2
- data/lib/fontisan/open_type_font_extensions.rb +9 -9
- data/lib/fontisan/optimizers/pattern_analyzer.rb +0 -1
- data/lib/fontisan/optimizers.rb +14 -0
- data/lib/fontisan/outline_extractor.rb +0 -2
- data/lib/fontisan/parsers/dfont_parser.rb +0 -1
- data/lib/fontisan/parsers.rb +10 -0
- data/lib/fontisan/pipeline/format_detector.rb +29 -102
- data/lib/fontisan/pipeline/output_writer.rb +11 -9
- data/lib/fontisan/pipeline/strategies/instance_strategy.rb +0 -4
- data/lib/fontisan/pipeline/strategies/named_strategy.rb +0 -4
- data/lib/fontisan/pipeline/strategies/preserve_strategy.rb +0 -2
- data/lib/fontisan/pipeline/strategies.rb +14 -0
- data/lib/fontisan/pipeline/transformation_pipeline.rb +0 -7
- data/lib/fontisan/pipeline/variation_resolver.rb +0 -7
- data/lib/fontisan/pipeline.rb +13 -0
- data/lib/fontisan/sfnt_font.rb +29 -14
- data/lib/fontisan/sfnt_table.rb +0 -4
- data/lib/fontisan/subset/builder.rb +0 -6
- data/lib/fontisan/subset.rb +13 -0
- data/lib/fontisan/svg/font_generator.rb +0 -4
- data/lib/fontisan/svg/glyph_generator.rb +0 -2
- data/lib/fontisan/svg.rb +12 -0
- data/lib/fontisan/tables/cbdt.rb +0 -1
- data/lib/fontisan/tables/cblc.rb +0 -1
- data/lib/fontisan/tables/cff/charset.rb +0 -1
- data/lib/fontisan/tables/cff/charstring.rb +0 -1
- data/lib/fontisan/tables/cff/charstring_rebuilder.rb +0 -4
- data/lib/fontisan/tables/cff/charstrings_index.rb +0 -3
- data/lib/fontisan/tables/cff/dict.rb +0 -1
- data/lib/fontisan/tables/cff/encoding.rb +0 -1
- data/lib/fontisan/tables/cff/header.rb +0 -2
- data/lib/fontisan/tables/cff/hint_operation_injector.rb +0 -2
- data/lib/fontisan/tables/cff/index.rb +0 -1
- data/lib/fontisan/tables/cff/private_dict.rb +0 -2
- data/lib/fontisan/tables/cff/private_dict_writer.rb +0 -2
- data/lib/fontisan/tables/cff/table_builder.rb +0 -6
- data/lib/fontisan/tables/cff/top_dict.rb +0 -2
- data/lib/fontisan/tables/cff.rb +22 -15
- data/lib/fontisan/tables/cff2/charstring_parser.rb +0 -2
- data/lib/fontisan/tables/cff2/table_builder.rb +0 -11
- data/lib/fontisan/tables/cff2/table_reader.rb +0 -2
- data/lib/fontisan/tables/cff2.rb +13 -14
- data/lib/fontisan/tables/cmap.rb +24 -2
- data/lib/fontisan/tables/cmap_table.rb +0 -3
- data/lib/fontisan/tables/colr.rb +0 -1
- data/lib/fontisan/tables/cpal.rb +0 -1
- data/lib/fontisan/tables/cvar.rb +0 -2
- data/lib/fontisan/tables/fvar.rb +0 -1
- data/lib/fontisan/tables/glyf/compound_glyph_resolver.rb +0 -2
- data/lib/fontisan/tables/glyf/glyph_builder.rb +0 -3
- data/lib/fontisan/tables/glyf.rb +0 -6
- data/lib/fontisan/tables/glyf_table.rb +0 -3
- data/lib/fontisan/tables/gpos.rb +0 -2
- data/lib/fontisan/tables/gsub.rb +0 -2
- data/lib/fontisan/tables/gvar.rb +0 -2
- data/lib/fontisan/tables/head.rb +0 -2
- data/lib/fontisan/tables/head_table.rb +0 -3
- data/lib/fontisan/tables/hhea.rb +0 -2
- data/lib/fontisan/tables/hhea_table.rb +0 -3
- data/lib/fontisan/tables/hmtx.rb +0 -2
- data/lib/fontisan/tables/hmtx_table.rb +0 -3
- data/lib/fontisan/tables/hvar.rb +0 -3
- data/lib/fontisan/tables/loca.rb +0 -2
- data/lib/fontisan/tables/loca_table.rb +0 -3
- data/lib/fontisan/tables/maxp.rb +0 -2
- data/lib/fontisan/tables/maxp_table.rb +0 -3
- data/lib/fontisan/tables/mvar.rb +0 -3
- data/lib/fontisan/tables/name.rb +0 -2
- data/lib/fontisan/tables/name_table.rb +0 -3
- data/lib/fontisan/tables/os2_table.rb +0 -3
- data/lib/fontisan/tables/post_table.rb +0 -3
- data/lib/fontisan/tables/sbix.rb +0 -1
- data/lib/fontisan/tables/svg.rb +0 -1
- data/lib/fontisan/tables/variation_common.rb +0 -1
- data/lib/fontisan/tables/vvar.rb +0 -3
- data/lib/fontisan/tables.rb +54 -0
- data/lib/fontisan/true_type_collection.rb +6 -14
- data/lib/fontisan/true_type_font.rb +8 -2
- data/lib/fontisan/true_type_font_extensions.rb +9 -9
- data/lib/fontisan/type1/afm_generator.rb +0 -4
- data/lib/fontisan/type1/conversion_options.rb +0 -2
- data/lib/fontisan/type1/encodings.rb +0 -2
- data/lib/fontisan/type1/generator.rb +0 -8
- data/lib/fontisan/type1/pfa_generator.rb +0 -3
- data/lib/fontisan/type1/pfb_generator.rb +0 -5
- data/lib/fontisan/type1/pfm_generator.rb +0 -4
- data/lib/fontisan/type1.rb +42 -69
- data/lib/fontisan/type1_font.rb +40 -11
- data/lib/fontisan/ucd/aggregator.rb +73 -0
- data/lib/fontisan/ucd/cache_manager.rb +111 -0
- data/lib/fontisan/ucd/config.rb +59 -0
- data/lib/fontisan/ucd/download_error.rb +9 -0
- data/lib/fontisan/ucd/downloader.rb +88 -0
- data/lib/fontisan/ucd/error.rb +8 -0
- data/lib/fontisan/ucd/index.rb +103 -0
- data/lib/fontisan/ucd/index_builder.rb +107 -0
- data/lib/fontisan/ucd/range_entry.rb +56 -0
- data/lib/fontisan/ucd/unknown_version_error.rb +9 -0
- data/lib/fontisan/ucd/version_resolver.rb +79 -0
- data/lib/fontisan/ucd.rb +23 -0
- data/lib/fontisan/utilities/checksum_calculator.rb +0 -1
- data/lib/fontisan/utilities.rb +10 -0
- data/lib/fontisan/utils.rb +10 -0
- data/lib/fontisan/validation/collection_validator.rb +0 -2
- data/lib/fontisan/validation.rb +9 -0
- data/lib/fontisan/validators/basic_validator.rb +0 -2
- data/lib/fontisan/validators/font_book_validator.rb +0 -2
- data/lib/fontisan/validators/opentype_validator.rb +0 -2
- data/lib/fontisan/validators/profile_loader.rb +0 -5
- data/lib/fontisan/validators/validator.rb +0 -2
- data/lib/fontisan/validators/web_font_validator.rb +0 -2
- data/lib/fontisan/validators.rb +14 -0
- data/lib/fontisan/variable/delta_applicator.rb +0 -4
- data/lib/fontisan/variable/instancer.rb +0 -3
- data/lib/fontisan/variable/static_font_builder.rb +0 -3
- data/lib/fontisan/variable.rb +16 -0
- data/lib/fontisan/variation/blend_applier.rb +0 -2
- data/lib/fontisan/variation/cache.rb +0 -2
- data/lib/fontisan/variation/converter.rb +0 -3
- data/lib/fontisan/variation/data_extractor.rb +0 -2
- data/lib/fontisan/variation/delta_applier.rb +0 -5
- data/lib/fontisan/variation/inspector.rb +0 -1
- data/lib/fontisan/variation/instance_generator.rb +0 -6
- data/lib/fontisan/variation/instance_writer.rb +0 -5
- data/lib/fontisan/variation/metrics_adjuster.rb +0 -4
- data/lib/fontisan/variation/optimizer.rb +0 -3
- data/lib/fontisan/variation/parallel_generator.rb +0 -3
- data/lib/fontisan/variation/subsetter.rb +0 -4
- data/lib/fontisan/variation/tuple_variation_header.rb +0 -2
- data/lib/fontisan/variation/variable_svg_generator.rb +0 -3
- data/lib/fontisan/variation/variation_context.rb +0 -3
- data/lib/fontisan/variation/variation_preserver.rb +0 -3
- data/lib/fontisan/variation.rb +31 -0
- data/lib/fontisan/version.rb +1 -1
- data/lib/fontisan/woff2.rb +13 -0
- data/lib/fontisan/woff2_font.rb +31 -9
- data/lib/fontisan/woff_font.rb +31 -2
- data/lib/fontisan.rb +124 -196
- metadata +128 -7
- data/fontisan.gemspec +0 -47
data/lib/fontisan/sfnt_font.rb
CHANGED
|
@@ -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
|
data/lib/fontisan/sfnt_table.rb
CHANGED
|
@@ -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
|
data/lib/fontisan/svg.rb
ADDED
|
@@ -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
|
data/lib/fontisan/tables/cbdt.rb
CHANGED
data/lib/fontisan/tables/cblc.rb
CHANGED
|
@@ -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
|
data/lib/fontisan/tables/cff.rb
CHANGED
|
@@ -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,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
|
|
data/lib/fontisan/tables/cff2.rb
CHANGED
|
@@ -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"
|
data/lib/fontisan/tables/cmap.rb
CHANGED
|
@@ -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
|
data/lib/fontisan/tables/colr.rb
CHANGED
data/lib/fontisan/tables/cpal.rb
CHANGED
data/lib/fontisan/tables/cvar.rb
CHANGED
data/lib/fontisan/tables/fvar.rb
CHANGED
data/lib/fontisan/tables/glyf.rb
CHANGED
|
@@ -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
|
data/lib/fontisan/tables/gpos.rb
CHANGED
data/lib/fontisan/tables/gsub.rb
CHANGED
data/lib/fontisan/tables/gvar.rb
CHANGED
data/lib/fontisan/tables/head.rb
CHANGED
data/lib/fontisan/tables/hhea.rb
CHANGED