Class: Fontisan::Parsers::DfontParser

Inherits:
Object
  • Object
show all
Defined in:
lib/fontisan/parsers/dfont_parser.rb

Overview

Parser for Apple dfont (Data Fork Font) resource fork format.

dfont files store resource fork data in the data fork, containing TrueType or OpenType SFNT data embedded in a resource fork structure.

Examples:

Extract SFNT from dfont

File.open("font.dfont", "rb") do |io|
  sfnt_data = DfontParser.extract_sfnt(io)
  # sfnt_data is raw SFNT binary
end

Defined Under Namespace

Classes: ResourceHeader, ResourceReference, ResourceType

Class Method Summary collapse

Class Method Details

.dfont?(io) ⇒ Boolean

Check if file is valid dfont resource fork

Parameters:

  • io (IO)

    Open file handle

Returns:

  • (Boolean)


82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/fontisan/parsers/dfont_parser.rb', line 82

def self.dfont?(io)
  io.rewind
  header_bytes = io.read(16)
  io.rewind

  return false if header_bytes.nil? || header_bytes.length < 16

  # Basic sanity check on resource fork structure
  data_offset = header_bytes[0..3].unpack1("N")
  map_offset = header_bytes[4..7].unpack1("N")

  data_offset.positive? && map_offset > data_offset
end

.extract_sfnt(io, index: 0) ⇒ String

Extract SFNT data from dfont file

Parameters:

  • io (IO)

    Open file handle

  • index (Integer) (defaults to: 0)

    Font index for multi-font suitcases (default: 0)

Returns:

  • (String)

    Raw SFNT binary data

Raises:



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/fontisan/parsers/dfont_parser.rb', line 52

def self.extract_sfnt(io, index: 0)
  header = parse_header(io)
  sfnt_resources = find_sfnt_resources(io, header)

  if sfnt_resources.empty?
    raise InvalidFontError, "No sfnt resources found in dfont file"
  end

  if index >= sfnt_resources.length
    raise InvalidFontError,
          "Font index #{index} out of range (dfont has #{sfnt_resources.length} fonts)"
  end

  extract_resource_data(io, header, sfnt_resources[index])
end

.sfnt_count(io) ⇒ Integer

Count number of sfnt resources (fonts) in dfont

Parameters:

  • io (IO)

    Open file handle

Returns:

  • (Integer)

    Number of fonts



72
73
74
75
76
# File 'lib/fontisan/parsers/dfont_parser.rb', line 72

def self.sfnt_count(io)
  header = parse_header(io)
  sfnt_resources = find_sfnt_resources(io, header)
  sfnt_resources.length
end