class TTFunk::Table::Name

Constants

COMPATIBLE_FULL_NAME_ID
DESCRIPTION_NAME_ID
DESIGNER_NAME_ID
DESIGNER_URL_NAME_ID
FONT_FAMILY_NAME_ID
FONT_NAME_NAME_ID
FONT_SUBFAMILY_NAME_ID
LICENSE_NAME_ID
LICENSE_URL_NAME_ID
MANUFACTURER_NAME_ID
POSTSCRIPT_NAME_NAME_ID
PREFERRED_FAMILY_NAME_ID
PREFERRED_SUBFAMILY_NAME_ID
SAMPLE_TEXT_NAME_ID
TRADEMARK_NAME_ID
UNIQUE_SUBFAMILY_NAME_ID
VENDOR_URL_NAME_ID
VERSION_NAME_ID

Attributes

compatible_full[R]
description[R]
designer[R]
designer_url[R]
entries[R]
font_family[R]
font_name[R]
font_subfamily[R]
license[R]
license_url[R]
manufacturer[R]
preferred_family[R]
preferred_subfamily[R]
sample_text[R]
strings[R]
trademark[R]
unique_subfamily[R]
vendor_url[R]
version[R]

Public Class Methods

encode(names, key = '') click to toggle source
# File lib/ttfunk/table/name.rb, line 70
def self.encode(names, key = '')
  tag = Digest::SHA1.hexdigest(key)[0, 6]

  postscript_name = NameString.new(
    "#{tag}+#{names.postscript_name}", 1, 0, 0
  )

  strings = names.strings.dup
  strings[6] = [postscript_name]
  str_count = strings.reduce(0) { |sum, (_, list)| sum + list.length }

  table = [0, str_count, 6 + 12 * str_count].pack('n*')
  strtable = +''

  items = []
  strings.each do |id, list|
    list.each do |string|
      items << [id, string]
    end
  end
  items =
    items.sort_by do |id, string|
      [string.platform_id, string.encoding_id, string.language_id, id]
    end
  items.each do |id, string|
    table << [
      string.platform_id, string.encoding_id, string.language_id, id,
      string.length, strtable.length
    ].pack('n*')
    strtable << string
  end

  table << strtable
end

Public Instance Methods

postscript_name() click to toggle source
# File lib/ttfunk/table/name.rb, line 105
def postscript_name
  return @postscript_name if @postscript_name

  font_family.first || 'unnamed'
end

Private Instance Methods

parse!() click to toggle source
# File lib/ttfunk/table/name.rb, line 113
def parse!
  count, string_offset = read(6, 'x2n*')

  @entries = []
  count.times do
    platform, encoding, language, id, length, start_offset =
      read(12, 'n*')
    @entries << {
      platform_id: platform,
      encoding_id: encoding,
      language_id: language,
      name_id: id,
      length: length,
      offset: offset + string_offset + start_offset,
      text: nil
    }
  end

  @strings = Hash.new { |h, k| h[k] = [] }

  count.times do |i|
    io.pos = @entries[i][:offset]
    @entries[i][:text] = io.read(@entries[i][:length])
    @strings[@entries[i][:name_id]] << NameString.new(
      @entries[i][:text] || '',
      @entries[i][:platform_id],
      @entries[i][:encoding_id],
      @entries[i][:language_id]
    )
  end

  # should only be ONE postscript name

  @copyright = @strings[COPYRIGHT_NAME_ID]
  @font_family = @strings[FONT_FAMILY_NAME_ID]
  @font_subfamily = @strings[FONT_SUBFAMILY_NAME_ID]
  @unique_subfamily = @strings[UNIQUE_SUBFAMILY_NAME_ID]
  @font_name = @strings[FONT_NAME_NAME_ID]
  @version = @strings[VERSION_NAME_ID]

  unless @strings[POSTSCRIPT_NAME_NAME_ID].empty?
    @postscript_name = @strings[POSTSCRIPT_NAME_NAME_ID]
      .first.strip_extended
  end

  @trademark = @strings[TRADEMARK_NAME_ID]
  @manufacturer = @strings[MANUFACTURER_NAME_ID]
  @designer = @strings[DESIGNER_NAME_ID]
  @description = @strings[DESCRIPTION_NAME_ID]
  @vendor_url = @strings[VENDOR_URL_NAME_ID]
  @designer_url = @strings[DESIGNER_URL_NAME_ID]
  @license = @strings[LICENSE_NAME_ID]
  @license_url = @strings[LICENSE_URL_NAME_ID]
  @preferred_family = @strings[PREFERRED_FAMILY_NAME_ID]
  @preferred_subfamily = @strings[PREFERRED_SUBFAMILY_NAME_ID]
  @compatible_full = @strings[COMPATIBLE_FULL_NAME_ID]
  @sample_text = @strings[SAMPLE_TEXT_NAME_ID]
end