Module: TTFunk::Table::Cmap::Format06

Defined in:
lib/ttfunk/table/cmap/format06.rb

Overview

Format 6: Trimmed table mapping.

This module conditionally extends Subtable.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#code_mapHash{Integer => Integer} (readonly)

Code map.

Returns:

  • (Hash{Integer => Integer})


16
17
18
# File 'lib/ttfunk/table/cmap/format06.rb', line 16

def code_map
  @code_map
end

#languageInteger (readonly)

Language.

Returns:

  • (Integer)


12
13
14
# File 'lib/ttfunk/table/cmap/format06.rb', line 12

def language
  @language
end

Class Method Details

.encode(charmap) ⇒ Hash

Encode the encoding record to format 6.

Parameters:

  • charmap (Hash{Integer => Integer})

    a hash mapping character codes to glyph IDs from the original font.

Returns:

  • (Hash)
    • ‘:charmap` (Hash{Integer => Hash}) keys are the characrers in `charset`, values are hashes:

      • ‘:old` (Integer) - glyph ID in the original font.

      • ‘:new` (Integer) - glyph ID in the subset font.

      that maps the characters in charmap to a

    • ‘:subtable` (String) - serialized encoding record.

    • ‘:max_glyph_id` (Integer) - maximum glyph ID in the new font.



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/ttfunk/table/cmap/format06.rb', line 30

def self.encode(charmap)
  next_id = 0
  glyph_map = { 0 => 0 }

  sorted_chars = charmap.keys.sort
  low_char = sorted_chars.first
  high_char = sorted_chars.last
  entry_count = 1 + high_char - low_char
  glyph_indexes = Array.new(entry_count, 0)

  new_map =
    charmap.keys.sort.each_with_object({}) do |code, map|
      glyph_map[charmap[code]] ||= next_id += 1
      map[code] = { old: charmap[code], new: glyph_map[charmap[code]] }
      glyph_indexes[code - low_char] = glyph_map[charmap[code]]
    end

  subtable = [
    6, 10 + (entry_count * 2), 0, low_char, entry_count, *glyph_indexes,
  ].pack('n*')

  { charmap: new_map, subtable: subtable, max_glyph_id: next_id + 1 }
end

Instance Method Details

#[](code) ⇒ Integer

Get glyph ID for character code.

Parameters:

  • code (Integer)

    character code.

Returns:

  • (Integer)

    glyph ID.



58
59
60
# File 'lib/ttfunk/table/cmap/format06.rb', line 58

def [](code)
  @code_map[code] || 0
end

#supported?true

Is this encoding record format supported?

Returns:

  • (true)


65
66
67
# File 'lib/ttfunk/table/cmap/format06.rb', line 65

def supported?
  true
end