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 }
})

Direct Known Subclasses

Fontisan::Tables::Cff2::TableBuilder

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



46
47
48
49
# File 'lib/fontisan/tables/cff/table_builder.rb', line 46

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



37
38
39
40
41
# File 'lib/fontisan/tables/cff/table_builder.rb', line 37

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



54
55
56
57
# File 'lib/fontisan/tables/cff/table_builder.rb', line 54

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



62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/fontisan/tables/cff/table_builder.rb', line 62

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