Class: Fontisan::Utilities::ChecksumCalculator

Inherits:
Object
  • Object
show all
Defined in:
lib/fontisan/utilities/checksum_calculator.rb

Overview

ChecksumCalculator provides stateless utility methods for calculating font file checksums.

This class implements the TrueType/OpenType checksum algorithm which sums all uint32 values in a file. The checksum is used to verify file integrity and calculate the checksumAdjustment value stored in the 'head' table.

Examples:

Calculate file checksum

checksum = ChecksumCalculator.calculate_file_checksum("font.ttf")
# => 2842116234

Calculate checksum adjustment

adjustment = ChecksumCalculator.calculate_adjustment(checksum)
# => 1452851062

Class Method Summary collapse

Class Method Details

.calculate_adjustment(file_checksum) ⇒ Integer

Calculate the checksum adjustment value for the 'head' table.

The checksum adjustment is stored at offset 8 in the 'head' table and is calculated as: CHECKSUM_ADJUSTMENT_MAGIC - file_checksum. This value ensures that the checksum of the entire font file equals the magic number.

Examples:

adjustment = ChecksumCalculator.calculate_adjustment(2842116234)
# => 1452851062

Parameters:

  • file_checksum (Integer)

    the calculated file checksum

Returns:

  • (Integer)

    the checksum adjustment value to write to the 'head' table



54
55
56
# File 'lib/fontisan/utilities/checksum_calculator.rb', line 54

def self.calculate_adjustment(file_checksum)
  (Constants::CHECKSUM_ADJUSTMENT_MAGIC - file_checksum) & 0xFFFFFFFF
end

.calculate_checksum_from_io(io) ⇒ Integer

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Calculate checksum from an IO object.

Reads the IO stream in 4-byte chunks and calculates the uint32 checksum. This is the core checksum algorithm implementation.

Parameters:

  • io (IO)

    the IO object to read from

Returns:

  • (Integer)

    the calculated uint32 checksum



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/fontisan/utilities/checksum_calculator.rb', line 83

def self.calculate_checksum_from_io(io)
  io.rewind
  sum = 0

  until io.eof?
    # Read 4 bytes at a time
    bytes = io.read(4)
    break if bytes.nil? || bytes.empty?

    # Pad with zeros if less than 4 bytes
    bytes += "\0" * (4 - bytes.length) if bytes.length < 4

    # Convert to uint32 (network byte order, big-endian)
    value = bytes.unpack1("N")
    sum = (sum + value) & 0xFFFFFFFF
  end

  sum
end

.calculate_file_checksum(file_path) ⇒ Integer

Calculate the checksum of an entire font file.

The checksum is calculated by summing all uint32 (4-byte) values in the file. Files that are not multiples of 4 bytes are padded with zeros. The sum is masked to 32 bits to prevent overflow.

Examples:

checksum = ChecksumCalculator.calculate_file_checksum("font.ttf")
# => 2842116234

Parameters:

  • file_path (String)

    path to the font file

Returns:

  • (Integer)

    the calculated uint32 checksum

Raises:

  • (Errno::ENOENT)

    if the file does not exist

  • (Errno::EACCES)

    if the file cannot be read



35
36
37
38
39
# File 'lib/fontisan/utilities/checksum_calculator.rb', line 35

def self.calculate_file_checksum(file_path)
  File.open(file_path, "rb") do |file|
    calculate_checksum_from_io(file)
  end
end

.calculate_table_checksum(data) ⇒ Integer

Calculate checksum for raw table data.

This method calculates the checksum for a binary string of table data. Used when creating WOFF files or validating table integrity.

Examples:

checksum = ChecksumCalculator.calculate_table_checksum(table_data)
# => 1234567890

Parameters:

  • data (String)

    binary table data

Returns:

  • (Integer)

    the calculated uint32 checksum



69
70
71
72
73
# File 'lib/fontisan/utilities/checksum_calculator.rb', line 69

def self.calculate_table_checksum(data)
  io = StringIO.new(data)
  io.set_encoding(Encoding::BINARY)
  calculate_checksum_from_io(io)
end