Class: Fontisan::Tables::Cff::TableBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/fontisan/tables/cff/table_builder.rb

Overview

Rebuilds CFF table with modifications

This builder extracts sections from a source CFF table, applies modifications (e.g., hint parameters to Private DICT), recalculates offsets, and assembles a new CFF table.

Process:

  1. Extract all CFF sections (header, indexes, dicts)
  2. Apply modifications to Private DICT
  3. Recalculate offsets (charstrings, private)
  4. Rebuild Top DICT INDEX with new offsets
  5. Reassemble all sections into new CFF table

Examples:

Rebuild with hints

new_cff = TableBuilder.rebuild(source_cff, {
  private_dict_hints: { blue_values: [-15, 0], std_hw: 70 }
})

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source_cff) ⇒ TableBuilder

Initialize with source CFF

Parameters:

  • source_cff (Cff)

    Source CFF table



40
41
42
43
# File 'lib/fontisan/tables/cff/table_builder.rb', line 40

def initialize(source_cff)
  @source = source_cff
  @sections = extract_sections
end

Class Method Details

.rebuild(source_cff, modifications = {}) ⇒ String

Rebuild CFF table with modifications

Parameters:

  • source_cff (Cff)

    Source CFF table

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

    Modifications to apply

Returns:

  • (String)

    Binary CFF table data



31
32
33
34
35
# File 'lib/fontisan/tables/cff/table_builder.rb', line 31

def self.rebuild(source_cff, modifications = {})
  new(source_cff).tap do |builder|
    builder.apply_modifications(modifications)
  end.serialize
end

Instance Method Details

#apply_modifications(mods) ⇒ Object

Apply modifications to CFF structure

Parameters:

  • mods (Hash)

    Modifications hash



48
49
50
51
# File 'lib/fontisan/tables/cff/table_builder.rb', line 48

def apply_modifications(mods)
  update_private_dict(mods[:private_dict_hints]) if mods[:private_dict_hints]
  update_charstrings(mods[:per_glyph_hints]) if mods[:per_glyph_hints]
end

#serializeString

Serialize to binary CFF table

Returns:

  • (String)

    Binary CFF data



56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/fontisan/tables/cff/table_builder.rb', line 56

def serialize
  # Calculate initial offsets
  offsets = OffsetRecalculator.calculate_offsets(@sections)
  top_dict = extract_top_dict_data
  updated = OffsetRecalculator.update_top_dict(top_dict, offsets)
  rebuild_top_dict_index(updated)

  # Recalculate after Top DICT rebuild (size may change)
  offsets = OffsetRecalculator.calculate_offsets(@sections)
  updated = OffsetRecalculator.update_top_dict(top_dict, offsets)
  rebuild_top_dict_index(updated)

  assemble
end