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.



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

def code_map
  @code_map
end

#languageInteger (readonly)

Language.



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.



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.



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?



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

def supported?
  true
end