9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
# File 'lib/ttfunk/table/cmap/format12.rb', line 9
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.inject({}) do |map, code|
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]]
map
end
subtable = [12, 0, 16+12*range_lengths.size, 0, range_lengths.size].pack('nnNNN')
range_lengths.each_with_index do |length, i|
firstglyph, firstcode = range_firstglyphs[i], range_firstcodes[i]
subtable << [firstcode, firstcode+length-1, firstglyph].pack('NNN')
end
{ :charmap => new_map, :subtable => subtable, :max_glyph_id => next_id+1 }
end
|