Module: TTFunk::Table::Cmap::Format12

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

Overview

Format 12: Segmented coverage.

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

def code_map
  @code_map
end

#languageInteger (readonly)

Language.

Returns:

  • (Integer)


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

def language
  @language
end

Class Method Details

.encode(charmap) ⇒ Hash

Encode the encoding record to format 12.

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
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/ttfunk/table/cmap/format12.rb', line 30

def self.encode(charmap)
  next_id = 0
  glyph_map = { 0 => 0 }
  range_firstglyphs = []
  range_firstcodes = []
  range_lengths = []
  last_glyph = last_code = -999

  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]] }

      if code > last_code + 1 || glyph_map[charmap[code]] > last_glyph + 1
        range_firstcodes << code
        range_firstglyphs << glyph_map[charmap[code]]
        range_lengths << 1
      else
        range_lengths.push(range_lengths.pop) + 1
      end
      last_code = code
      last_glyph = glyph_map[charmap[code]]
    end

  subtable = [
    12, 0, 16 + (12 * range_lengths.size), 0, range_lengths.size,
  ].pack('nnNNN')
  range_lengths.each_with_index do |length, i|
    firstglyph = range_firstglyphs[i]
    firstcode = range_firstcodes[i]
    subtable << [
      firstcode, firstcode + length - 1, firstglyph,
    ].pack('NNN')
  end

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



72
73
74
# File 'lib/ttfunk/table/cmap/format12.rb', line 72

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

#supported?true

Is this encoding record format supported?

Returns:

  • (true)


79
80
81
# File 'lib/ttfunk/table/cmap/format12.rb', line 79

def supported?
  true
end