forked from prawnpdf/ttfunk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
subset_collection.rb
57 lines (48 loc) · 1.33 KB
/
subset_collection.rb
1
2
3
4
5
6
7
8
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
require 'ttfunk/subset'
module TTFunk
class SubsetCollection
def initialize(original)
@original = original
@subsets = [Subset.for(@original, :mac_roman)]
end
def use(characters)
characters.each do |char|
covered = false
@subsets.each_with_index do |subset, i|
if subset.covers?(char)
subset.use(char)
covered = true
break
end
end
if !covered
@subsets << Subset.for(@original, :unicode_8bit)
@subsets.last.use(char)
end
end
end
def convert_text(characters)
parts = []
current_subset = 0
current_char = 0
char = characters[current_char]
loop do
while @subsets[current_subset].includes?(char)
char = @subsets[current_subset].from_unicode(char)
if parts.empty? || parts.last[0] != current_subset
parts << [current_subset, [char]]
else
parts.last[1] << char
end
current_char += 1
return parts if current_char >= characters.length
char = characters[current_char]
end
current_subset = (current_subset + 1) % @subsets.length
end
end
def encode_subsets(options={})
@subsets.map { |subset| subset.encode(options) }
end
end
end