Class: Fontisan::Variation::InstanceWriter

Inherits:
Object
  • Object
show all
Defined in:
lib/fontisan/variation/instance_writer.rb

Overview

Writes generated static font instances to files in various formats

[‘InstanceWriter`](lib/fontisan/variation/instance_writer.rb) takes instance tables generated by [`InstanceGenerator`](lib/fontisan/variation/instance_generator.rb) and writes them to files in the desired output format. It handles:

  • Format detection from file extension

  • Format conversion when needed (e.g., glyf → CFF for OTF)

  • SFNT version selection based on output format

  • Integration with FontWriter for binary output

  • Integration with OutlineConverter for format conversion

  • Integration with WoffWriter for WOFF packaging

**Supported Output Formats:**

  • TTF (TrueType with glyf outlines)

  • OTF (OpenType with CFF outlines)

  • WOFF (Web Open Font Format)

  • WOFF2 (Web Open Font Format 2.0, future)

Examples:

Write instance to TTF

tables = generator.generate
InstanceWriter.write(tables, 'bold.ttf')

Write instance to OTF with format conversion

tables = generator.generate  # from variable TTF
InstanceWriter.write(tables, 'bold.otf', source_format: :ttf)

Write instance to WOFF

tables = generator.generate
InstanceWriter.write(tables, 'bold.woff')

Constant Summary collapse

SUPPORTED_FORMATS =

Supported output formats

%i[ttf otf woff woff2].freeze
SFNT_VERSION_TRUETYPE =

SFNT version constants

0x00010000
SFNT_VERSION_CFF =

TrueType with glyf

0x4F54544F

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(tables, options = {}) ⇒ InstanceWriter

Initialize writer with instance tables

Parameters:

  • tables (Hash<String, String>)

    Instance tables from InstanceGenerator

  • options (Hash) (defaults to: {})

    Writer options

Options Hash (options):

  • :source_format (Symbol)

    Source format before instancing

  • :optimize (Boolean)

    Enable CFF optimization



81
82
83
84
85
# File 'lib/fontisan/variation/instance_writer.rb', line 81

def initialize(tables, options = {})
  @tables = tables
  @options = options
  validate_tables!
end

Instance Attribute Details

#optionsHash (readonly)

Returns Writer options.

Returns:

  • (Hash)

    Writer options



72
73
74
# File 'lib/fontisan/variation/instance_writer.rb', line 72

def options
  @options
end

#tablesHash<String, String> (readonly)

Returns Instance tables.

Returns:

  • (Hash<String, String>)

    Instance tables



69
70
71
# File 'lib/fontisan/variation/instance_writer.rb', line 69

def tables
  @tables
end

Class Method Details

.write(tables, output_path, options = {}) ⇒ Integer

Write instance tables to file

Parameters:

  • tables (Hash<String, String>)

    Instance tables from InstanceGenerator

  • output_path (String)

    Output file path

  • options (Hash) (defaults to: {})

    Options

Options Hash (options):

  • :format (Symbol)

    Output format (:ttf, :otf, :woff, :woff2)

  • :source_format (Symbol)

    Source format before instancing (:ttf or :otf)

  • :optimize (Boolean)

    Enable CFF optimization for OTF (default: false)

  • :sfnt_version (Integer)

    Override SFNT version

Returns:

  • (Integer)

    Number of bytes written

Raises:

  • (ArgumentError)

    If parameters are invalid

  • (Error)

    If format conversion fails



64
65
66
# File 'lib/fontisan/variation/instance_writer.rb', line 64

def self.write(tables, output_path, options = {})
  new(tables, options).write(output_path)
end

Instance Method Details

#write(output_path) ⇒ Integer

Write instance to file

Parameters:

  • output_path (String)

    Output file path

Returns:

  • (Integer)

    Number of bytes written



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/fontisan/variation/instance_writer.rb', line 91

def write(output_path)
  # Detect output format
  format = detect_output_format(output_path)
  validate_format!(format)

  # Detect source format from tables
  source_format = detect_source_format(@tables)

  # Convert format if needed
  output_tables = if format_conversion_needed?(source_format, format)
                    convert_format(source_format, format)
                  else
                    @tables
                  end

  # Write to file based on format
  case format
  when :ttf, :otf
    write_sfnt(output_tables, output_path, format)
  when :woff
    write_woff(output_tables, output_path, source_format)
  when :woff2
    raise Fontisan::Error,
          "WOFF2 output not yet implemented (planned for Phase 6)"
  end
end