ttfunk 1.0.3 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/GPLv2 +1 -1
- data/README.rdoc +1 -0
- data/lib/ttfunk/subset_collection.rb +5 -1
- data/lib/ttfunk/table/cmap.rb +3 -1
- data/lib/ttfunk/table/cmap/format06.rb +51 -0
- data/lib/ttfunk/table/cmap/format10.rb +52 -0
- data/lib/ttfunk/table/cmap/format12.rb +66 -0
- data/lib/ttfunk/table/cmap/subtable.rb +14 -5
- metadata +80 -38
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ed69e97b1e7115a2f520ccce3e11cc4c45049e0c
|
4
|
+
data.tar.gz: 53b854789acf1d696429c11f205a3563d9181ee4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a629cedf256c3cbb06853f19c17f5aceb8fc6c400cf50e39535905f02a817297f89a17e9f41d8f90ae4f2939eb953031231ab077d62d6e578fd7dc204e16bdaa
|
7
|
+
data.tar.gz: 5a75eb4d88249046dfd77cf45d5a64794a0da8d6a60b0c43f2809d667e0673b6ea6e20b3bb649590b4b38fe41fe9a01884e770407a724a2255ff72e0cc762eec
|
data/GPLv2
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
Version 2, June 1991
|
3
3
|
|
4
4
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
5
|
-
|
5
|
+
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
6
6
|
Everyone is permitted to copy and distribute verbatim copies
|
7
7
|
of this license document, but changing it is not allowed.
|
8
8
|
|
data/README.rdoc
CHANGED
@@ -55,7 +55,11 @@ module TTFunk
|
|
55
55
|
char = @subsets[current_subset].from_unicode(char)
|
56
56
|
|
57
57
|
if parts.empty? || parts.last[0] != current_subset
|
58
|
-
|
58
|
+
encoded_char = char.chr
|
59
|
+
if encoded_char.respond_to?(:force_encoding)
|
60
|
+
encoded_char.force_encoding("ASCII-8BIT")
|
61
|
+
end
|
62
|
+
parts << [current_subset, encoded_char]
|
59
63
|
else
|
60
64
|
parts.last[1] << char
|
61
65
|
end
|
data/lib/ttfunk/table/cmap.rb
CHANGED
@@ -13,7 +13,9 @@ module TTFunk
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def unicode
|
16
|
-
|
16
|
+
# Because most callers just call .first on the result, put tables with highest-number format first.
|
17
|
+
# (Tables with higher format numbers tend to be more complete, especially in higher/astral Unicode ranges.)
|
18
|
+
@unicode ||= @tables.select { |table| table.unicode? }.sort{|a,b| b.format <=> a.format }
|
17
19
|
end
|
18
20
|
|
19
21
|
private
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module TTFunk
|
2
|
+
class Table
|
3
|
+
class Cmap
|
4
|
+
|
5
|
+
module Format06
|
6
|
+
attr_reader :language
|
7
|
+
attr_reader :code_map
|
8
|
+
|
9
|
+
def self.encode(charmap)
|
10
|
+
next_id = 0
|
11
|
+
glyph_map = { 0 => 0 }
|
12
|
+
|
13
|
+
sorted_chars = charmap.keys.sort
|
14
|
+
low_char, high_char = sorted_chars.first, sorted_chars.last
|
15
|
+
entry_count = (1+high_char-low_char)
|
16
|
+
glyph_indexes = Array.new(entry_count, 0)
|
17
|
+
|
18
|
+
new_map = charmap.keys.sort.inject({}) do |map, code|
|
19
|
+
glyph_map[charmap[code]] ||= next_id += 1
|
20
|
+
map[code] = { :old => charmap[code], :new => glyph_map[charmap[code]] }
|
21
|
+
glyph_indexes[code - low_char] = glyph_map[charmap[code]]
|
22
|
+
map
|
23
|
+
end
|
24
|
+
|
25
|
+
subtable = [6, 10+entry_count*2, 0, low_char, entry_count, *glyph_indexes].pack('n*')
|
26
|
+
|
27
|
+
{ :charmap => new_map, :subtable => subtable, :max_glyph_id => next_id+1 }
|
28
|
+
end
|
29
|
+
|
30
|
+
def [](code)
|
31
|
+
@code_map[code] || 0
|
32
|
+
end
|
33
|
+
|
34
|
+
def supported?
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def parse_cmap!
|
40
|
+
length, @language, firstcode, entrycount = read(8, 'nnnn')
|
41
|
+
@code_map = {}
|
42
|
+
(firstcode...(firstcode+entrycount)).each do |code|
|
43
|
+
@code_map[code] = read(2, 'n').first & 0xFFFF
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module TTFunk
|
2
|
+
class Table
|
3
|
+
class Cmap
|
4
|
+
|
5
|
+
module Format10
|
6
|
+
attr_reader :language
|
7
|
+
attr_reader :code_map
|
8
|
+
|
9
|
+
def self.encode(charmap)
|
10
|
+
next_id = 0
|
11
|
+
glyph_map = { 0 => 0 }
|
12
|
+
|
13
|
+
sorted_chars = charmap.keys.sort
|
14
|
+
low_char, high_char = sorted_chars.first, sorted_chars.last
|
15
|
+
entry_count = (1+high_char-low_char)
|
16
|
+
glyph_indexes = Array.new(entry_count, 0)
|
17
|
+
|
18
|
+
new_map = charmap.keys.sort.inject({}) do |map, code|
|
19
|
+
glyph_map[charmap[code]] ||= next_id += 1
|
20
|
+
map[code] = { :old => charmap[code], :new => glyph_map[charmap[code]] }
|
21
|
+
glyph_indexes[code - low_char] = glyph_map[charmap[code]]
|
22
|
+
map
|
23
|
+
end
|
24
|
+
|
25
|
+
subtable = [10, 0, 20+entry_count*4, 0, low_char, entry_count, *glyph_indexes].pack('nnN*')
|
26
|
+
|
27
|
+
{ :charmap => new_map, :subtable => subtable, :max_glyph_id => next_id+1 }
|
28
|
+
end
|
29
|
+
|
30
|
+
def [](code)
|
31
|
+
@code_map[code] || 0
|
32
|
+
end
|
33
|
+
|
34
|
+
def supported?
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def parse_cmap!
|
40
|
+
fractional_version, length, @language, firstcode, entrycount = read(18, 'nNNNN')
|
41
|
+
raise NotImplementedError, "cmap version 10.#{fractional_version} is not supported" if fractional_version != 0
|
42
|
+
@code_map = {}
|
43
|
+
(firstcode...(firstcode+entrycount)).each do |code|
|
44
|
+
@code_map[code] = read(2, 'n').first & 0xFFFF
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module TTFunk
|
2
|
+
class Table
|
3
|
+
class Cmap
|
4
|
+
|
5
|
+
module Format12
|
6
|
+
attr_reader :language
|
7
|
+
attr_reader :code_map
|
8
|
+
|
9
|
+
def self.encode(charmap)
|
10
|
+
next_id = 0
|
11
|
+
glyph_map = { 0 => 0 }
|
12
|
+
range_firstglyphs, range_firstcodes, range_lengths = [], [], []
|
13
|
+
last_glyph = last_code = -999
|
14
|
+
|
15
|
+
new_map = charmap.keys.sort.inject({}) do |map, code|
|
16
|
+
glyph_map[charmap[code]] ||= next_id += 1
|
17
|
+
map[code] = { :old => charmap[code], :new => glyph_map[charmap[code]] }
|
18
|
+
|
19
|
+
if code > last_code+1 || glyph_map[charmap[code]] > last_glyph+1
|
20
|
+
range_firstcodes << code
|
21
|
+
range_firstglyphs << glyph_map[charmap[code]]
|
22
|
+
range_lengths << 1
|
23
|
+
else
|
24
|
+
range_lengths.push(range_lengths.pop) + 1
|
25
|
+
end
|
26
|
+
last_code = code
|
27
|
+
last_glyph = glyph_map[charmap[code]]
|
28
|
+
|
29
|
+
map
|
30
|
+
end
|
31
|
+
|
32
|
+
subtable = [12, 0, 16+12*range_lengths.size, 0, range_lengths.size].pack('nnNNN')
|
33
|
+
range_lengths.each_with_index do |length, i|
|
34
|
+
firstglyph, firstcode = range_firstglyphs[i], range_firstcodes[i]
|
35
|
+
subtable << [firstcode, firstcode+length-1, firstglyph].pack('NNN')
|
36
|
+
end
|
37
|
+
|
38
|
+
{ :charmap => new_map, :subtable => subtable, :max_glyph_id => next_id+1 }
|
39
|
+
end
|
40
|
+
|
41
|
+
def [](code)
|
42
|
+
@code_map[code] || 0
|
43
|
+
end
|
44
|
+
|
45
|
+
def supported?
|
46
|
+
true
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
def parse_cmap!
|
51
|
+
fractional_version, length, @language, groupcount = read(14, 'nNNN')
|
52
|
+
raise NotImplementedError, "cmap version 12.#{fractional_version} is not supported" if fractional_version != 0
|
53
|
+
@code_map = {}
|
54
|
+
(1..groupcount).each do
|
55
|
+
startchar, endchar, startglyph = read(12, 'NNN')
|
56
|
+
(0..(endchar-startchar)).each do |offset|
|
57
|
+
@code_map[startchar+offset] = startglyph+offset
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -13,7 +13,8 @@ module TTFunk
|
|
13
13
|
ENCODING_MAPPINGS = {
|
14
14
|
:mac_roman => { :platform_id => 1, :encoding_id => 0 },
|
15
15
|
# use microsoft unicode, instead of generic unicode, for optimal windows support
|
16
|
-
:unicode => { :platform_id => 3, :encoding_id => 1 }
|
16
|
+
:unicode => { :platform_id => 3, :encoding_id => 1 },
|
17
|
+
:unicode_ucs4 => { :platform_id => 3, :encoding_id => 10 }
|
17
18
|
}
|
18
19
|
|
19
20
|
def self.encode(charmap, encoding)
|
@@ -22,6 +23,8 @@ module TTFunk
|
|
22
23
|
result = Format00.encode(charmap)
|
23
24
|
when :unicode
|
24
25
|
result = Format04.encode(charmap)
|
26
|
+
when :unicode_ucs4
|
27
|
+
result = Format12.encode(charmap)
|
25
28
|
else
|
26
29
|
raise NotImplementedError, "encoding #{encoding.inspect} is not supported"
|
27
30
|
end
|
@@ -44,8 +47,11 @@ module TTFunk
|
|
44
47
|
@format = read(2, "n").first
|
45
48
|
|
46
49
|
case @format
|
47
|
-
when 0
|
48
|
-
when 4
|
50
|
+
when 0 then extend(TTFunk::Table::Cmap::Format00)
|
51
|
+
when 4 then extend(TTFunk::Table::Cmap::Format04)
|
52
|
+
when 6 then extend(TTFunk::Table::Cmap::Format06)
|
53
|
+
when 10 then extend(TTFunk::Table::Cmap::Format10)
|
54
|
+
when 12 then extend(TTFunk::Table::Cmap::Format12)
|
49
55
|
end
|
50
56
|
|
51
57
|
parse_cmap!
|
@@ -53,8 +59,8 @@ module TTFunk
|
|
53
59
|
end
|
54
60
|
|
55
61
|
def unicode?
|
56
|
-
platform_id == 3 && encoding_id == 1 && format
|
57
|
-
platform_id == 0 && format
|
62
|
+
platform_id == 3 && (encoding_id == 1 || encoding_id == 10) && format != 0 ||
|
63
|
+
platform_id == 0 && format != 0
|
58
64
|
end
|
59
65
|
|
60
66
|
def supported?
|
@@ -77,3 +83,6 @@ end
|
|
77
83
|
|
78
84
|
require 'ttfunk/table/cmap/format00'
|
79
85
|
require 'ttfunk/table/cmap/format04'
|
86
|
+
require 'ttfunk/table/cmap/format06'
|
87
|
+
require 'ttfunk/table/cmap/format10'
|
88
|
+
require 'ttfunk/table/cmap/format12'
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ttfunk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Gregory Brown
|
@@ -13,9 +12,50 @@ authors:
|
|
13
12
|
autorequire:
|
14
13
|
bindir: bin
|
15
14
|
cert_chain: []
|
16
|
-
date:
|
17
|
-
|
18
|
-
|
15
|
+
date: 2014-01-21 00:00:00.000000000 Z
|
16
|
+
dependencies:
|
17
|
+
- !ruby/object:Gem::Dependency
|
18
|
+
name: rdoc
|
19
|
+
requirement: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - '>='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '0'
|
24
|
+
type: :development
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
requirements:
|
28
|
+
- - '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: rspec
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: rake
|
47
|
+
requirement: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
type: :development
|
53
|
+
prerelease: false
|
54
|
+
version_requirements: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
19
59
|
description: Get Ya TrueType Funk On! (Font Metrics Parser for Prawn)
|
20
60
|
email:
|
21
61
|
- gregory.t.brown@gmail.com
|
@@ -27,42 +67,45 @@ executables: []
|
|
27
67
|
extensions: []
|
28
68
|
extra_rdoc_files: []
|
29
69
|
files:
|
30
|
-
- lib/ttfunk/encoding/windows_1252.rb
|
31
|
-
- lib/ttfunk/encoding/mac_roman.rb
|
32
70
|
- lib/ttfunk/directory.rb
|
33
|
-
- lib/ttfunk/
|
71
|
+
- lib/ttfunk/encoding/mac_roman.rb
|
72
|
+
- lib/ttfunk/encoding/windows_1252.rb
|
73
|
+
- lib/ttfunk/reader.rb
|
74
|
+
- lib/ttfunk/resource_file.rb
|
75
|
+
- lib/ttfunk/subset/base.rb
|
76
|
+
- lib/ttfunk/subset/mac_roman.rb
|
77
|
+
- lib/ttfunk/subset/unicode.rb
|
78
|
+
- lib/ttfunk/subset/unicode_8bit.rb
|
79
|
+
- lib/ttfunk/subset/windows_1252.rb
|
80
|
+
- lib/ttfunk/subset.rb
|
81
|
+
- lib/ttfunk/subset_collection.rb
|
34
82
|
- lib/ttfunk/table/cmap/format00.rb
|
35
83
|
- lib/ttfunk/table/cmap/format04.rb
|
36
|
-
- lib/ttfunk/table/
|
37
|
-
- lib/ttfunk/table/
|
38
|
-
- lib/ttfunk/table/
|
39
|
-
- lib/ttfunk/table/
|
40
|
-
- lib/ttfunk/table/post/format10.rb
|
41
|
-
- lib/ttfunk/table/post/format30.rb
|
42
|
-
- lib/ttfunk/table/post/format25.rb
|
84
|
+
- lib/ttfunk/table/cmap/format06.rb
|
85
|
+
- lib/ttfunk/table/cmap/format10.rb
|
86
|
+
- lib/ttfunk/table/cmap/format12.rb
|
87
|
+
- lib/ttfunk/table/cmap/subtable.rb
|
43
88
|
- lib/ttfunk/table/cmap.rb
|
44
|
-
- lib/ttfunk/table/os2.rb
|
45
89
|
- lib/ttfunk/table/glyf/compound.rb
|
46
90
|
- lib/ttfunk/table/glyf/simple.rb
|
47
|
-
- lib/ttfunk/table/hhea.rb
|
48
|
-
- lib/ttfunk/table/maxp.rb
|
49
|
-
- lib/ttfunk/table/kern.rb
|
50
91
|
- lib/ttfunk/table/glyf.rb
|
51
92
|
- lib/ttfunk/table/head.rb
|
52
|
-
- lib/ttfunk/table/
|
93
|
+
- lib/ttfunk/table/hhea.rb
|
53
94
|
- lib/ttfunk/table/hmtx.rb
|
54
95
|
- lib/ttfunk/table/kern/format0.rb
|
96
|
+
- lib/ttfunk/table/kern.rb
|
97
|
+
- lib/ttfunk/table/loca.rb
|
98
|
+
- lib/ttfunk/table/maxp.rb
|
55
99
|
- lib/ttfunk/table/name.rb
|
56
|
-
- lib/ttfunk/
|
57
|
-
- lib/ttfunk/
|
58
|
-
- lib/ttfunk/
|
59
|
-
- lib/ttfunk/
|
60
|
-
- lib/ttfunk/
|
61
|
-
- lib/ttfunk/
|
62
|
-
- lib/ttfunk/
|
63
|
-
- lib/ttfunk/
|
100
|
+
- lib/ttfunk/table/os2.rb
|
101
|
+
- lib/ttfunk/table/post/format10.rb
|
102
|
+
- lib/ttfunk/table/post/format20.rb
|
103
|
+
- lib/ttfunk/table/post/format25.rb
|
104
|
+
- lib/ttfunk/table/post/format30.rb
|
105
|
+
- lib/ttfunk/table/post/format40.rb
|
106
|
+
- lib/ttfunk/table/post.rb
|
107
|
+
- lib/ttfunk/table/simple.rb
|
64
108
|
- lib/ttfunk/table.rb
|
65
|
-
- lib/ttfunk/resource_file.rb
|
66
109
|
- lib/ttfunk.rb
|
67
110
|
- data/fonts/comicsans.ttf
|
68
111
|
- data/fonts/DejaVuSans.ttf
|
@@ -73,29 +116,28 @@ files:
|
|
73
116
|
- LICENSE
|
74
117
|
- GPLv2
|
75
118
|
- GPLv3
|
76
|
-
has_rdoc: true
|
77
119
|
homepage:
|
78
120
|
licenses: []
|
121
|
+
metadata: {}
|
79
122
|
post_install_message:
|
80
123
|
rdoc_options: []
|
81
124
|
require_paths:
|
82
125
|
- lib
|
83
126
|
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
-
none: false
|
85
127
|
requirements:
|
86
|
-
- -
|
128
|
+
- - '>='
|
87
129
|
- !ruby/object:Gem::Version
|
88
|
-
version: 1.
|
130
|
+
version: 1.9.3
|
89
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
132
|
requirements:
|
92
|
-
- -
|
133
|
+
- - '>='
|
93
134
|
- !ruby/object:Gem::Version
|
94
|
-
version:
|
135
|
+
version: '0'
|
95
136
|
requirements: []
|
96
137
|
rubyforge_project:
|
97
|
-
rubygems_version:
|
138
|
+
rubygems_version: 2.0.14
|
98
139
|
signing_key:
|
99
|
-
specification_version:
|
140
|
+
specification_version: 4
|
100
141
|
summary: TrueType Font Metrics Parser
|
101
142
|
test_files: []
|
143
|
+
has_rdoc:
|