fontisan 0.2.17 → 0.2.23
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.yml +6 -0
- data/.rubocop_todo.yml +86 -86
- data/CHANGELOG.md +12 -2
- data/README.adoc +53 -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/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/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 +189 -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.rb +31 -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/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 +26 -0
- data/lib/fontisan/config/cldr.yml +22 -0
- data/lib/fontisan/config/conversion_matrix.yml +38 -0
- data/lib/fontisan/constants.rb +19 -0
- 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 +14 -19
- data/lib/fontisan/font_writer.rb +0 -1
- data/lib/fontisan/formatters.rb +9 -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 +19 -0
- data/lib/fontisan/metrics_calculator.rb +0 -2
- data/lib/fontisan/models/all_scripts_features_info.rb +0 -1
- 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.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 +16 -0
- data/lib/fontisan/pipeline/transformation_pipeline.rb +0 -7
- data/lib/fontisan/pipeline/variation_resolver.rb +0 -7
- data/lib/fontisan/pipeline.rb +14 -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 +23 -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 +55 -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/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 +121 -196
- metadata +46 -2
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "sfnt_font"
|
|
4
|
-
|
|
5
3
|
module Fontisan
|
|
6
4
|
# TrueType Font domain object
|
|
7
5
|
#
|
|
@@ -25,6 +23,14 @@ module Fontisan
|
|
|
25
23
|
# @example Reading from TTC collection
|
|
26
24
|
# ttf = TrueTypeFont.from_collection(io, offset)
|
|
27
25
|
class TrueTypeFont < SfntFont
|
|
26
|
+
extend TrueTypeFontExtensions
|
|
27
|
+
|
|
28
|
+
# High-level pipeline format identifier. Owned by the font class so the
|
|
29
|
+
# conversion pipeline can dispatch without case statements (OCP).
|
|
30
|
+
#
|
|
31
|
+
# @return [Symbol] :ttf
|
|
32
|
+
def format = :ttf
|
|
33
|
+
|
|
28
34
|
# Check if font is TrueType flavored
|
|
29
35
|
#
|
|
30
36
|
# @return [Boolean] true for TrueType fonts
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Fontisan
|
|
4
|
-
#
|
|
5
|
-
|
|
4
|
+
# Extension module for {TrueTypeFont} providing table-based construction.
|
|
5
|
+
#
|
|
6
|
+
# Extended into TrueTypeFont from +true_type_font.rb+ so that
|
|
7
|
+
# +TrueTypeFont.from_tables(...)+ is available whenever the class
|
|
8
|
+
# itself is loaded.
|
|
9
|
+
module TrueTypeFontExtensions
|
|
6
10
|
# Create font from hash of tables
|
|
7
11
|
#
|
|
8
12
|
# This is used during font conversion when we have tables but not a file.
|
|
9
13
|
#
|
|
10
14
|
# @param tables [Hash<String, String>] Map of table tag to binary data
|
|
11
15
|
# @return [TrueTypeFont] New font instance
|
|
12
|
-
def
|
|
13
|
-
# Create minimal header structure
|
|
16
|
+
def from_tables(tables)
|
|
14
17
|
font = new
|
|
15
18
|
font.initialize_storage
|
|
16
19
|
font.loading_mode = LoadingModes::FULL
|
|
17
20
|
|
|
18
|
-
# Store table data
|
|
19
21
|
font.table_data = tables
|
|
20
22
|
|
|
21
|
-
# Build header from tables
|
|
22
23
|
num_tables = tables.size
|
|
23
24
|
max_power = 0
|
|
24
25
|
n = num_tables
|
|
@@ -37,13 +38,12 @@ module Fontisan
|
|
|
37
38
|
font.header.entry_selector = entry_selector
|
|
38
39
|
font.header.range_shift = range_shift
|
|
39
40
|
|
|
40
|
-
# Build table directory
|
|
41
41
|
font.tables.clear
|
|
42
42
|
tables.each_key do |tag|
|
|
43
43
|
entry = TableDirectory.new
|
|
44
44
|
entry.tag = tag
|
|
45
|
-
entry.checksum = 0
|
|
46
|
-
entry.offset = 0
|
|
45
|
+
entry.checksum = 0
|
|
46
|
+
entry.offset = 0
|
|
47
47
|
entry.table_length = tables[tag].bytesize
|
|
48
48
|
font.tables << entry
|
|
49
49
|
end
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "fileutils"
|
|
4
|
-
require_relative "upm_scaler"
|
|
5
|
-
require_relative "encodings"
|
|
6
|
-
require_relative "conversion_options"
|
|
7
|
-
require_relative "afm_generator"
|
|
8
|
-
require_relative "pfm_generator"
|
|
9
|
-
require_relative "pfa_generator"
|
|
10
|
-
require_relative "pfb_generator"
|
|
11
|
-
require_relative "inf_generator"
|
|
12
4
|
|
|
13
5
|
module Fontisan
|
|
14
6
|
module Type1
|
data/lib/fontisan/type1.rb
CHANGED
|
@@ -1,75 +1,48 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# Autoload hub for the Fontisan::Type1 namespace.
|
|
4
|
+
#
|
|
5
|
+
# Adobe Type 1 Font support — PFB/PFA parsing, eexec decryption,
|
|
6
|
+
# CharString decryption, font dictionary parsing, conversion from
|
|
7
|
+
# TTF/OTF, UPM scaling, and multiple encoding support.
|
|
8
|
+
#
|
|
9
|
+
# @example Generate Type 1 formats from TTF
|
|
10
|
+
# font = Fontisan::FontLoader.load("font.ttf")
|
|
11
|
+
# result = Fontisan::Type1::Generator.generate(font)
|
|
12
|
+
# result[:afm] # => AFM file content
|
|
13
|
+
# result[:pfm] # => PFM file content
|
|
14
|
+
# result[:pfb] # => PFB file content
|
|
15
|
+
# result[:inf] # => INF file content
|
|
16
|
+
#
|
|
17
|
+
# @example Generate with specific options
|
|
18
|
+
# options = Fontisan::Type1::ConversionOptions.windows_type1
|
|
19
|
+
# result = Fontisan::Type1::Generator.generate(font, options)
|
|
20
|
+
#
|
|
21
|
+
# @see https://www.adobe.com/devnet/font/pdfs/Type1.pdf
|
|
22
|
+
|
|
3
23
|
module Fontisan
|
|
4
|
-
# Adobe Type 1 Font support
|
|
5
|
-
#
|
|
6
|
-
# [`Type1`](lib/fontisan/type1.rb) provides parsing and conversion
|
|
7
|
-
# capabilities for Adobe Type 1 fonts in PFB (Printer Font Binary)
|
|
8
|
-
# and PFA (Printer Font ASCII) formats.
|
|
9
|
-
#
|
|
10
|
-
# Type 1 fonts were the standard for digital typography in the 1980s-1990s
|
|
11
|
-
# and are still encountered in legacy systems and design workflows.
|
|
12
|
-
#
|
|
13
|
-
# Key features:
|
|
14
|
-
# - PFB and PFA format parsing
|
|
15
|
-
# - eexec decryption for encrypted font portions
|
|
16
|
-
# - CharString decryption with lenIV handling
|
|
17
|
-
# - Font dictionary parsing (FontInfo, Private dict)
|
|
18
|
-
# - Conversion from TTF/OTF to Type 1 formats
|
|
19
|
-
# - UPM scaling for Type 1 compatibility (1000 UPM)
|
|
20
|
-
# - Multiple encoding support (AdobeStandard, ISOLatin1, Unicode)
|
|
21
|
-
#
|
|
22
|
-
# @example Generate Type 1 formats from TTF
|
|
23
|
-
# font = Fontisan::FontLoader.load("font.ttf")
|
|
24
|
-
# result = Fontisan::Type1::Generator.generate(font)
|
|
25
|
-
# result[:afm] # => AFM file content
|
|
26
|
-
# result[:pfm] # => PFM file content
|
|
27
|
-
# result[:pfb] # => PFB file content
|
|
28
|
-
# result[:inf] # => INF file content
|
|
29
|
-
#
|
|
30
|
-
# @example Generate with specific options
|
|
31
|
-
# options = Fontisan::Type1::ConversionOptions.windows_type1
|
|
32
|
-
# result = Fontisan::Type1::Generator.generate(font, options)
|
|
33
|
-
#
|
|
34
|
-
# @see https://www.adobe.com/devnet/font/pdfs/Type1.pdf
|
|
35
24
|
module Type1
|
|
25
|
+
autoload :AGL, "fontisan/type1/agl"
|
|
26
|
+
autoload :AFMGenerator, "fontisan/type1/afm_generator"
|
|
27
|
+
autoload :AFMParser, "fontisan/type1/afm_parser"
|
|
28
|
+
autoload :CffToType1Converter, "fontisan/type1/cff_to_type1_converter"
|
|
29
|
+
autoload :CharStringConverter, "fontisan/type1/charstring_converter"
|
|
30
|
+
autoload :CharStrings, "fontisan/type1/charstrings"
|
|
31
|
+
autoload :ConversionOptions, "fontisan/type1/conversion_options"
|
|
32
|
+
autoload :Decryptor, "fontisan/type1/decryptor"
|
|
33
|
+
autoload :Encodings, "fontisan/type1/encodings"
|
|
34
|
+
autoload :FontDictionary, "fontisan/type1/font_dictionary"
|
|
35
|
+
autoload :Generator, "fontisan/type1/generator"
|
|
36
|
+
autoload :INFGenerator, "fontisan/type1/inf_generator"
|
|
37
|
+
autoload :PFAGenerator, "fontisan/type1/pfa_generator"
|
|
38
|
+
autoload :PFAParser, "fontisan/type1/pfa_parser"
|
|
39
|
+
autoload :PFBGenerator, "fontisan/type1/pfb_generator"
|
|
40
|
+
autoload :PFBParser, "fontisan/type1/pfb_parser"
|
|
41
|
+
autoload :PFMGenerator, "fontisan/type1/pfm_generator"
|
|
42
|
+
autoload :PFMParser, "fontisan/type1/pfm_parser"
|
|
43
|
+
autoload :PrivateDict, "fontisan/type1/private_dict"
|
|
44
|
+
autoload :SeacExpander, "fontisan/type1/seac_expander"
|
|
45
|
+
autoload :TTFToType1Converter, "fontisan/type1/ttf_to_type1_converter"
|
|
46
|
+
autoload :UPMScaler, "fontisan/type1/upm_scaler"
|
|
36
47
|
end
|
|
37
48
|
end
|
|
38
|
-
|
|
39
|
-
# Parsers
|
|
40
|
-
require_relative "type1/pfb_parser"
|
|
41
|
-
require_relative "type1/pfa_parser"
|
|
42
|
-
|
|
43
|
-
# Core components
|
|
44
|
-
require_relative "type1/decryptor"
|
|
45
|
-
require_relative "type1/font_dictionary"
|
|
46
|
-
require_relative "type1/private_dict"
|
|
47
|
-
require_relative "type1/charstrings"
|
|
48
|
-
require_relative "type1/charstring_converter"
|
|
49
|
-
require_relative "type1/cff_to_type1_converter"
|
|
50
|
-
require_relative "type1/seac_expander"
|
|
51
|
-
|
|
52
|
-
# Infrastructure
|
|
53
|
-
require_relative "type1/upm_scaler"
|
|
54
|
-
require_relative "type1/agl"
|
|
55
|
-
require_relative "type1/encodings"
|
|
56
|
-
require_relative "type1/conversion_options"
|
|
57
|
-
|
|
58
|
-
# TTF to Type 1 conversion
|
|
59
|
-
require_relative "type1/ttf_to_type1_converter"
|
|
60
|
-
|
|
61
|
-
# Metrics parsers
|
|
62
|
-
require_relative "type1/afm_parser"
|
|
63
|
-
require_relative "type1/pfm_parser"
|
|
64
|
-
|
|
65
|
-
# Metrics generators
|
|
66
|
-
require_relative "type1/afm_generator"
|
|
67
|
-
require_relative "type1/pfm_generator"
|
|
68
|
-
|
|
69
|
-
# Type 1 font generators
|
|
70
|
-
require_relative "type1/pfa_generator"
|
|
71
|
-
require_relative "type1/pfb_generator"
|
|
72
|
-
require_relative "type1/inf_generator"
|
|
73
|
-
|
|
74
|
-
# Unified generator interface
|
|
75
|
-
require_relative "type1/generator"
|
data/lib/fontisan/type1_font.rb
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "type1"
|
|
4
|
-
|
|
5
3
|
module Fontisan
|
|
6
4
|
# Adobe Type 1 Font handler
|
|
7
5
|
#
|
|
@@ -34,8 +32,38 @@ module Fontisan
|
|
|
34
32
|
# @return [String, nil] File path if loaded from file
|
|
35
33
|
attr_reader :file_path
|
|
36
34
|
|
|
37
|
-
# @return [Symbol]
|
|
38
|
-
|
|
35
|
+
# @return [Symbol] Container variant (:pfb or :pfa) — the on-disk
|
|
36
|
+
# encoding of a Type 1 font (binary vs ASCII). Distinct from
|
|
37
|
+
# {#format}, which is the high-level pipeline format.
|
|
38
|
+
attr_reader :container_format
|
|
39
|
+
|
|
40
|
+
# High-level pipeline format identifier. Owned by the font class so
|
|
41
|
+
# the conversion pipeline can dispatch without case statements (OCP).
|
|
42
|
+
#
|
|
43
|
+
# @return [Symbol] :type1
|
|
44
|
+
def format = :type1
|
|
45
|
+
|
|
46
|
+
# Whether this object represents a font collection rather than a single
|
|
47
|
+
# font. Each font class is the authority on this question.
|
|
48
|
+
#
|
|
49
|
+
# @return [Boolean]
|
|
50
|
+
def collection? = false
|
|
51
|
+
|
|
52
|
+
# Type 1 fonts are not OpenType variable fonts.
|
|
53
|
+
#
|
|
54
|
+
# @return [Symbol] :static
|
|
55
|
+
def variation_type = :static
|
|
56
|
+
|
|
57
|
+
# Outline representation. Type 1 fonts use cubic PostScript CharStrings.
|
|
58
|
+
#
|
|
59
|
+
# @return [Symbol] :postscript
|
|
60
|
+
def outline_type = :postscript
|
|
61
|
+
|
|
62
|
+
# Type 1 fonts have no SFNT table directory; the table-oriented pipeline
|
|
63
|
+
# introspection does not apply.
|
|
64
|
+
#
|
|
65
|
+
# @return [Array<String>] empty
|
|
66
|
+
def table_names = []
|
|
39
67
|
|
|
40
68
|
# @return [Symbol] Loading mode (:metadata or :full)
|
|
41
69
|
attr_reader :loading_mode
|
|
@@ -64,12 +92,13 @@ module Fontisan
|
|
|
64
92
|
# Initialize a new Type1Font instance
|
|
65
93
|
#
|
|
66
94
|
# @param data [String] Font file data (binary or text)
|
|
67
|
-
# @param
|
|
95
|
+
# @param container_format [Symbol] Container variant (:pfb or :pfa,
|
|
96
|
+
# auto-detected if nil)
|
|
68
97
|
# @param file_path [String, nil] Optional file path for reference
|
|
69
98
|
# @param mode [Symbol] Loading mode (:metadata or :full, default: :full)
|
|
70
|
-
def initialize(data,
|
|
99
|
+
def initialize(data, container_format: nil, file_path: nil, mode: :full)
|
|
71
100
|
@file_path = file_path
|
|
72
|
-
@
|
|
101
|
+
@container_format = container_format || detect_format(data)
|
|
73
102
|
@data = data
|
|
74
103
|
@loading_mode = mode
|
|
75
104
|
|
|
@@ -139,7 +168,7 @@ module Fontisan
|
|
|
139
168
|
if @encrypted_portion.nil? || @encrypted_portion.empty?
|
|
140
169
|
@decrypted_data = @clear_text
|
|
141
170
|
else
|
|
142
|
-
encrypted_binary = if @
|
|
171
|
+
encrypted_binary = if @container_format == :pfa
|
|
143
172
|
# Convert hex string to binary
|
|
144
173
|
[@encrypted_portion.gsub(/\s/, "")].pack("H*")
|
|
145
174
|
else
|
|
@@ -226,15 +255,15 @@ module Fontisan
|
|
|
226
255
|
|
|
227
256
|
private
|
|
228
257
|
|
|
229
|
-
# Parse font data based on format
|
|
258
|
+
# Parse font data based on container format
|
|
230
259
|
def parse_font_data
|
|
231
|
-
case @
|
|
260
|
+
case @container_format
|
|
232
261
|
when :pfb
|
|
233
262
|
parse_pfb
|
|
234
263
|
when :pfa
|
|
235
264
|
parse_pfa
|
|
236
265
|
else
|
|
237
|
-
raise Fontisan::Error, "Unknown format: #{@
|
|
266
|
+
raise Fontisan::Error, "Unknown container format: #{@container_format}"
|
|
238
267
|
end
|
|
239
268
|
end
|
|
240
269
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Autoload hub for the Fontisan::Utilities namespace.
|
|
4
|
+
|
|
5
|
+
module Fontisan
|
|
6
|
+
module Utilities
|
|
7
|
+
autoload :BrotliWrapper, "fontisan/utilities/brotli_wrapper"
|
|
8
|
+
autoload :ChecksumCalculator, "fontisan/utilities/checksum_calculator"
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "basic_validator"
|
|
4
|
-
require_relative "font_book_validator"
|
|
5
|
-
require_relative "opentype_validator"
|
|
6
|
-
require_relative "web_font_validator"
|
|
7
|
-
|
|
8
3
|
module Fontisan
|
|
9
4
|
module Validators
|
|
10
5
|
# ProfileLoader manages validation profiles and loads appropriate validators
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Autoload hub for the Fontisan::Validators namespace.
|
|
4
|
+
|
|
5
|
+
module Fontisan
|
|
6
|
+
module Validators
|
|
7
|
+
autoload :BasicValidator, "fontisan/validators/basic_validator"
|
|
8
|
+
autoload :FontBookValidator, "fontisan/validators/font_book_validator"
|
|
9
|
+
autoload :OpenTypeValidator, "fontisan/validators/opentype_validator"
|
|
10
|
+
autoload :ProfileLoader, "fontisan/validators/profile_loader"
|
|
11
|
+
autoload :Validator, "fontisan/validators/validator"
|
|
12
|
+
autoload :WebFontValidator, "fontisan/validators/web_font_validator"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Autoload hub for the Fontisan::Variable namespace.
|
|
4
|
+
|
|
5
|
+
module Fontisan
|
|
6
|
+
module Variable
|
|
7
|
+
autoload :AxisNormalizer, "fontisan/variable/axis_normalizer"
|
|
8
|
+
autoload :DeltaApplicator, "fontisan/variable/delta_applicator"
|
|
9
|
+
autoload :GlyphDeltaProcessor, "fontisan/variable/glyph_delta_processor"
|
|
10
|
+
autoload :Instancer, "fontisan/variable/instancer"
|
|
11
|
+
autoload :MetricDeltaProcessor, "fontisan/variable/metric_delta_processor"
|
|
12
|
+
autoload :RegionMatcher, "fontisan/variable/region_matcher"
|
|
13
|
+
autoload :StaticFontBuilder, "fontisan/variable/static_font_builder"
|
|
14
|
+
autoload :TableUpdater, "fontisan/variable/table_updater"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "interpolator"
|
|
4
|
-
require_relative "region_matcher"
|
|
5
|
-
require_relative "metrics_adjuster"
|
|
6
|
-
require_relative "variation_context"
|
|
7
|
-
require_relative "table_accessor"
|
|
8
|
-
|
|
9
3
|
module Fontisan
|
|
10
4
|
module Variation
|
|
11
5
|
# Generates static font instances from variable fonts
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "../font_writer"
|
|
4
|
-
require_relative "../converters/outline_converter"
|
|
5
|
-
require_relative "../converters/woff_writer"
|
|
6
|
-
require_relative "../error"
|
|
7
|
-
|
|
8
3
|
module Fontisan
|
|
9
4
|
module Variation
|
|
10
5
|
# Writes generated static font instances to files in various formats
|