Class: Fontisan::TrueTypeCollection

Inherits:
BaseCollection show all
Defined in:
lib/fontisan/true_type_collection.rb

Overview

TrueType Collection domain object

Represents a complete TrueType Collection file. Inherits all shared functionality from BaseCollection and implements TTC-specific behavior.

Examples:

Reading and extracting fonts

File.open("Helvetica.ttc", "rb") do |io|
  ttc = TrueTypeCollection.read(io)
  puts ttc.num_fonts  # => 6
  fonts = ttc.extract_fonts(io)  # => [TrueTypeFont, TrueTypeFont, ...]
end

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from BaseCollection

#collection?, #collection_info, #font_count, from_file, #outline_type, #table_names, #valid?, #variation_type, #version, #version_string

Methods included from Collection::SharedLogic

#calculate_table_sharing_for_fonts

Class Method Details

.collection_formatString

Get the collection format identifier

Returns:

  • (String)

    "TTC" for TrueType Collection



32
33
34
# File 'lib/fontisan/true_type_collection.rb', line 32

def self.collection_format
  "TTC"
end

.font_classClass

Get the font class for TrueType collections

Returns:

  • (Class)

    TrueTypeFont class



25
26
27
# File 'lib/fontisan/true_type_collection.rb', line 25

def self.font_class
  TrueTypeFont
end

Instance Method Details

#extract_fonts(io) ⇒ Array<TrueTypeFont>

Extract fonts as TrueTypeFont objects

Reads each font from the TTC file and returns them as TrueTypeFont objects. Uses the base class from_collection method.

Parameters:

  • io (IO)

    Open file handle to read fonts from

Returns:



57
58
59
60
61
# File 'lib/fontisan/true_type_collection.rb', line 57

def extract_fonts(io)
  font_offsets.map do |offset|
    TrueTypeFont.from_collection(io, offset)
  end
end

#font(index, io, mode: LoadingModes::FULL) ⇒ TrueTypeFont?

Get a single font from the collection

Uses the base class from_collection method.

Parameters:

  • index (Integer)

    Index of the font (0-based)

  • io (IO)

    Open file handle

  • mode (Symbol) (defaults to: LoadingModes::FULL)

    Loading mode (:metadata or :full, default: :full)

Returns:

  • (TrueTypeFont, nil)

    Font object or nil if index out of range



44
45
46
47
48
# File 'lib/fontisan/true_type_collection.rb', line 44

def font(index, io, mode: LoadingModes::FULL)
  return nil if index >= num_fonts

  TrueTypeFont.from_collection(io, font_offsets[index], mode: mode)
end

#formatSymbol

High-level pipeline format identifier. Owned by the collection class so the conversion pipeline can dispatch without case statements (OCP).

Returns:

  • (Symbol)

    :ttc



20
# File 'lib/fontisan/true_type_collection.rb', line 20

def format = :ttc

#list_fonts(io) ⇒ CollectionListInfo

List all fonts in the collection with basic metadata

Uses the base class from_collection method.

Parameters:

  • io (IO)

    Open file handle to read fonts from

Returns:

  • (CollectionListInfo)

    List of fonts with metadata



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/fontisan/true_type_collection.rb', line 69

def list_fonts(io)
  fonts = font_offsets.map.with_index do |offset, index|
    font = TrueTypeFont.from_collection(io, offset)

    # Extract basic font info
    name_table = font.table("name")
    post_table = font.table("post")

    family_name = name_table&.english_name(Tables::Name::FAMILY) || "Unknown"
    subfamily_name = name_table&.english_name(Tables::Name::SUBFAMILY) || "Regular"
    postscript_name = name_table&.english_name(Tables::Name::POSTSCRIPT_NAME) || "Unknown"

    # Determine font format
    sfnt = font.header.sfnt_version
    font_format = case sfnt
                  when 0x00010000, 0x74727565 # 0x74727565 = 'true'
                    "TrueType"
                  when 0x4F54544F # 'OTTO'
                    "OpenType"
                  else
                    "Unknown"
                  end

    num_glyphs = post_table&.glyph_names&.length || 0
    num_tables = font.table_names.length

    Models::CollectionFontSummary.new(
      index: index,
      family_name: family_name,
      subfamily_name: subfamily_name,
      postscript_name: postscript_name,
      font_format: font_format,
      num_glyphs: num_glyphs,
      num_tables: num_tables,
    )
  end

  Models::CollectionListInfo.new(
    collection_path: nil, # Will be set by command
    num_fonts: num_fonts,
    fonts: fonts,
  )
end