Module: TTFunk::Table::Cmap::Format10

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

Overview

Format 10: Trimmed array.

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/format10.rb', line 16

def code_map
  @code_map
end

#languageInteger (readonly)

Language.

Returns:

  • (Integer)


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

def language
  @language
end

Class Method Details

.encode(charmap) ⇒ Hash

Encode the encoding record to format 10.

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
53
# File 'lib/ttfunk/table/cmap/format10.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 = [
    10, 0, 20 + (entry_count * 4), 0, low_char, entry_count,
    *glyph_indexes,
  ].pack('nnN*')

  { 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.



59
60
61
# File 'lib/ttfunk/table/cmap/format10.rb', line 59

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

#supported?true

Is this encoding record format supported?

Returns:

  • (true)


66
67
68
# File 'lib/ttfunk/table/cmap/format10.rb', line 66

def supported?
  true
end