ttfunk 1.5.1 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +60 -0
  5. data/README.md +2 -1
  6. data/lib/ttfunk.rb +45 -0
  7. data/lib/ttfunk/aggregate.rb +15 -0
  8. data/lib/ttfunk/bin_utils.rb +47 -0
  9. data/lib/ttfunk/bit_field.rb +31 -0
  10. data/lib/ttfunk/collection.rb +3 -1
  11. data/lib/ttfunk/directory.rb +6 -0
  12. data/lib/ttfunk/encoded_string.rb +97 -0
  13. data/lib/ttfunk/max.rb +25 -0
  14. data/lib/ttfunk/min.rb +25 -0
  15. data/lib/ttfunk/one_based_array.rb +36 -0
  16. data/lib/ttfunk/otf_encoder.rb +61 -0
  17. data/lib/ttfunk/placeholder.rb +13 -0
  18. data/lib/ttfunk/reader.rb +34 -32
  19. data/lib/ttfunk/resource_file.rb +7 -5
  20. data/lib/ttfunk/sci_form.rb +29 -0
  21. data/lib/ttfunk/sub_table.rb +38 -0
  22. data/lib/ttfunk/subset.rb +2 -0
  23. data/lib/ttfunk/subset/base.rb +61 -120
  24. data/lib/ttfunk/subset/code_page.rb +89 -0
  25. data/lib/ttfunk/subset/mac_roman.rb +5 -42
  26. data/lib/ttfunk/subset/unicode.rb +12 -6
  27. data/lib/ttfunk/subset/unicode_8bit.rb +14 -12
  28. data/lib/ttfunk/subset/windows_1252.rb +5 -47
  29. data/lib/ttfunk/subset_collection.rb +4 -0
  30. data/lib/ttfunk/sum.rb +20 -0
  31. data/lib/ttfunk/table.rb +4 -0
  32. data/lib/ttfunk/table/cff.rb +69 -0
  33. data/lib/ttfunk/table/cff/charset.rb +212 -0
  34. data/lib/ttfunk/table/cff/charsets.rb +14 -0
  35. data/lib/ttfunk/table/cff/charsets/expert.rb +189 -0
  36. data/lib/ttfunk/table/cff/charsets/expert_subset.rb +119 -0
  37. data/lib/ttfunk/table/cff/charsets/iso_adobe.rb +241 -0
  38. data/lib/ttfunk/table/cff/charsets/standard_strings.rb +404 -0
  39. data/lib/ttfunk/table/cff/charstring.rb +487 -0
  40. data/lib/ttfunk/table/cff/charstrings_index.rb +39 -0
  41. data/lib/ttfunk/table/cff/dict.rb +266 -0
  42. data/lib/ttfunk/table/cff/encoding.rb +220 -0
  43. data/lib/ttfunk/table/cff/encodings.rb +12 -0
  44. data/lib/ttfunk/table/cff/encodings/expert.rb +206 -0
  45. data/lib/ttfunk/table/cff/encodings/standard.rb +181 -0
  46. data/lib/ttfunk/table/cff/fd_selector.rb +150 -0
  47. data/lib/ttfunk/table/cff/font_dict.rb +79 -0
  48. data/lib/ttfunk/table/cff/font_index.rb +29 -0
  49. data/lib/ttfunk/table/cff/header.rb +33 -0
  50. data/lib/ttfunk/table/cff/index.rb +125 -0
  51. data/lib/ttfunk/table/cff/one_based_index.rb +31 -0
  52. data/lib/ttfunk/table/cff/path.rb +66 -0
  53. data/lib/ttfunk/table/cff/private_dict.rb +84 -0
  54. data/lib/ttfunk/table/cff/subr_index.rb +19 -0
  55. data/lib/ttfunk/table/cff/top_dict.rb +230 -0
  56. data/lib/ttfunk/table/cff/top_index.rb +16 -0
  57. data/lib/ttfunk/table/cmap.rb +4 -4
  58. data/lib/ttfunk/table/cmap/format00.rb +1 -2
  59. data/lib/ttfunk/table/cmap/format04.rb +11 -3
  60. data/lib/ttfunk/table/cmap/format06.rb +2 -0
  61. data/lib/ttfunk/table/cmap/format10.rb +2 -0
  62. data/lib/ttfunk/table/cmap/format12.rb +2 -0
  63. data/lib/ttfunk/table/cmap/subtable.rb +12 -8
  64. data/lib/ttfunk/table/dsig.rb +50 -0
  65. data/lib/ttfunk/table/glyf.rb +11 -9
  66. data/lib/ttfunk/table/glyf/compound.rb +14 -7
  67. data/lib/ttfunk/table/glyf/path_based.rb +47 -0
  68. data/lib/ttfunk/table/glyf/simple.rb +21 -15
  69. data/lib/ttfunk/table/head.rb +43 -5
  70. data/lib/ttfunk/table/hhea.rb +47 -4
  71. data/lib/ttfunk/table/hmtx.rb +11 -4
  72. data/lib/ttfunk/table/kern.rb +3 -0
  73. data/lib/ttfunk/table/kern/format0.rb +3 -0
  74. data/lib/ttfunk/table/loca.rb +2 -0
  75. data/lib/ttfunk/table/maxp.rb +144 -10
  76. data/lib/ttfunk/table/name.rb +75 -37
  77. data/lib/ttfunk/table/os2.rb +327 -4
  78. data/lib/ttfunk/table/post.rb +8 -1
  79. data/lib/ttfunk/table/post/format10.rb +2 -0
  80. data/lib/ttfunk/table/post/format20.rb +5 -1
  81. data/lib/ttfunk/table/post/format30.rb +2 -0
  82. data/lib/ttfunk/table/post/format40.rb +2 -0
  83. data/lib/ttfunk/table/sbix.rb +2 -0
  84. data/lib/ttfunk/table/simple.rb +2 -0
  85. data/lib/ttfunk/table/vorg.rb +54 -0
  86. data/lib/ttfunk/ttf_encoder.rb +220 -0
  87. metadata +88 -20
  88. metadata.gz.sig +0 -0
  89. data/lib/ttfunk/encoding/mac_roman.rb +0 -100
  90. data/lib/ttfunk/encoding/windows_1252.rb +0 -76
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../table'
2
4
 
3
5
  module TTFunk
@@ -17,6 +19,7 @@ module TTFunk
17
19
 
18
20
  def self.encode(post, mapping)
19
21
  return nil unless post.exists?
22
+
20
23
  post.recode(mapping)
21
24
  end
22
25
 
@@ -82,7 +85,11 @@ module TTFunk
82
85
  end
83
86
 
84
87
  def parse_format!
85
- warn format('postscript table format 0x%08X is not supported', @format)
88
+ warn(
89
+ Kernel.format(
90
+ 'postscript table format 0x%08X is not supported', @format
91
+ )
92
+ )
86
93
  end
87
94
  end
88
95
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TTFunk
2
4
  class Table
3
5
  class Post
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'format10'
2
4
  require 'stringio'
3
5
 
@@ -9,6 +11,8 @@ module TTFunk
9
11
 
10
12
  def glyph_for(code)
11
13
  index = @glyph_name_index[code]
14
+ return '.notdef' unless index
15
+
12
16
  if index <= 257
13
17
  POSTSCRIPT_GLYPHS[index]
14
18
  else
@@ -25,7 +29,7 @@ module TTFunk
25
29
 
26
30
  strings = StringIO.new(io.read(offset + length - io.pos))
27
31
  until strings.eof?
28
- length = strings.read(1).unpack('C').first
32
+ length = strings.read(1).unpack1('C')
29
33
  @names << strings.read(length)
30
34
  end
31
35
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TTFunk
2
4
  class Table
3
5
  class Post
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TTFunk
2
4
  class Table
3
5
  class Post
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../table'
2
4
 
3
5
  module TTFunk
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../table'
2
4
 
3
5
  module TTFunk
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../table'
4
+
5
+ module TTFunk
6
+ class Table
7
+ class Vorg < Table
8
+ TAG = 'VORG'
9
+
10
+ attr_reader :major_version, :minor_version
11
+ attr_reader :default_vert_origin_y, :count
12
+
13
+ def self.encode(vorg)
14
+ return nil unless vorg
15
+
16
+ ''.b.tap do |table|
17
+ table << [
18
+ vorg.major_version, vorg.minor_version,
19
+ vorg.default_vert_origin_y, vorg.count
20
+ ].pack('n*')
21
+
22
+ vorg.origins.each_pair do |glyph_id, vert_origin_y|
23
+ table << [glyph_id, vert_origin_y].pack('n*')
24
+ end
25
+ end
26
+ end
27
+
28
+ def for(glyph_id)
29
+ @origins.fetch(glyph_id, default_vert_origin_y)
30
+ end
31
+
32
+ def tag
33
+ TAG
34
+ end
35
+
36
+ def origins
37
+ @origins ||= {}
38
+ end
39
+
40
+ private
41
+
42
+ def parse!
43
+ @major_version, @minor_version = read(4, 'n*')
44
+ @default_vert_origin_y = read_signed(1).first
45
+ @count = read(2, 'n').first
46
+
47
+ count.times do
48
+ glyph_id = read(2, 'n').first
49
+ origins[glyph_id] = read_signed(1).first
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,220 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TTFunk
4
+ class TTFEncoder
5
+ OPTIMAL_TABLE_ORDER = [
6
+ 'head', 'hhea', 'maxp', 'OS/2', 'hmtx', 'LTSH', 'VDMX',
7
+ 'hdmx', 'cmap', 'fpgm', 'prep', 'cvt ', 'loca', 'glyf',
8
+ 'kern', 'name', 'post', 'gasp', 'PCLT'
9
+ ].freeze
10
+
11
+ attr_reader :original, :subset, :options
12
+
13
+ def initialize(original, subset, options = {})
14
+ @original = original
15
+ @subset = subset
16
+ @options = options
17
+ end
18
+
19
+ def encode
20
+ # https://www.microsoft.com/typography/otspec/otff.htm#offsetTable
21
+ search_range = 2**Math.log2(tables.length).floor * 16
22
+ entry_selector = Math.log2(2**Math.log2(tables.length).floor).to_i
23
+ range_shift = tables.length * 16 - search_range
24
+ range_shift = 0 if range_shift < 0
25
+
26
+ newfont = EncodedString.new
27
+
28
+ newfont << [
29
+ original.directory.scaler_type,
30
+ tables.length,
31
+ search_range,
32
+ entry_selector,
33
+ range_shift
34
+ ].pack('Nn*')
35
+
36
+ # Tables are supposed to be listed in ascending order whereas there is a
37
+ # known optimal order for table data.
38
+ tables.keys.sort.each do |tag|
39
+ newfont << [tag, checksum(tables[tag])].pack('A4N')
40
+ newfont << Placeholder.new(tag, length: 4)
41
+ newfont << [tables[tag].length].pack('N')
42
+ end
43
+
44
+ optimal_table_order.each do |optimal_tag|
45
+ next unless tables.include?(optimal_tag)
46
+
47
+ newfont.resolve_placeholder(optimal_tag, [newfont.length].pack('N'))
48
+ newfont << tables[optimal_tag]
49
+ newfont.align!(4)
50
+ end
51
+
52
+ sum = checksum(newfont)
53
+ adjustment = 0xB1B0AFBA - sum
54
+ newfont.resolve_placeholder(:checksum, [adjustment].pack('N'))
55
+
56
+ newfont.string
57
+ end
58
+
59
+ private
60
+
61
+ def optimal_table_order
62
+ OPTIMAL_TABLE_ORDER +
63
+ (tables.keys - ['DSIG'] - OPTIMAL_TABLE_ORDER) +
64
+ ['DSIG']
65
+ end
66
+
67
+ # "mandatory" tables. Every font should ("should") have these
68
+
69
+ def cmap_table
70
+ @cmap_table ||= subset.new_cmap_table
71
+ end
72
+
73
+ def glyf_table
74
+ @glyf_table ||= TTFunk::Table::Glyf.encode(
75
+ glyphs, new_to_old_glyph, old_to_new_glyph
76
+ )
77
+ end
78
+
79
+ def loca_table
80
+ @loca_table ||= TTFunk::Table::Loca.encode(
81
+ glyf_table[:offsets]
82
+ )
83
+ end
84
+
85
+ def hmtx_table
86
+ @hmtx_table ||= TTFunk::Table::Hmtx.encode(
87
+ original.horizontal_metrics, new_to_old_glyph
88
+ )
89
+ end
90
+
91
+ def hhea_table
92
+ @hhea_table = TTFunk::Table::Hhea.encode(
93
+ original.horizontal_header, hmtx_table, original, new_to_old_glyph
94
+ )
95
+ end
96
+
97
+ def maxp_table
98
+ @maxp_table ||= TTFunk::Table::Maxp.encode(
99
+ original.maximum_profile, old_to_new_glyph
100
+ )
101
+ end
102
+
103
+ def post_table
104
+ @post_table ||= TTFunk::Table::Post.encode(
105
+ original.postscript, new_to_old_glyph
106
+ )
107
+ end
108
+
109
+ def name_table
110
+ @name_table ||= TTFunk::Table::Name.encode(
111
+ original.name, glyf_table.fetch(:table, '')
112
+ )
113
+ end
114
+
115
+ def head_table
116
+ @head_table ||= TTFunk::Table::Head.encode(
117
+ original.header, loca_table, new_to_old_glyph
118
+ )
119
+ end
120
+
121
+ # "optional" tables. Fonts may omit these if they do not need them.
122
+ # Because they apply globally, we can simply copy them over, without
123
+ # modification, if they exist.
124
+
125
+ def os2_table
126
+ @os2_table ||= TTFunk::Table::OS2.encode(original.os2, subset)
127
+ end
128
+
129
+ def cvt_table
130
+ @cvt_table ||= TTFunk::Table::Simple.new(original, 'cvt ').raw
131
+ end
132
+
133
+ def fpgm_table
134
+ @fpgm_table ||= TTFunk::Table::Simple.new(original, 'fpgm').raw
135
+ end
136
+
137
+ def prep_table
138
+ @prep_table ||= TTFunk::Table::Simple.new(original, 'prep').raw
139
+ end
140
+
141
+ def gasp_table
142
+ @gasp_table ||= TTFunk::Table::Simple.new(original, 'gasp').raw
143
+ end
144
+
145
+ def kern_table
146
+ # for PDFs, the kerning info is all included in the PDF as the text is
147
+ # drawn. Thus, the PDF readers do not actually use the kerning info in
148
+ # embedded fonts. If the library is used for something else, the
149
+ # generated subfont may need a kerning table... in that case, you need
150
+ # to opt into it.
151
+ if options[:kerning]
152
+ @kern_table ||= TTFunk::Table::Kern.encode(
153
+ original.kerning, old_to_new_glyph
154
+ )
155
+ end
156
+ end
157
+
158
+ def vorg_table
159
+ @vorg_table ||= TTFunk::Table::Vorg.encode(
160
+ original.vertical_origins
161
+ )
162
+ end
163
+
164
+ def dsig_table
165
+ @dsig_table ||= TTFunk::Table::Dsig.encode(
166
+ original.digital_signature
167
+ )
168
+ end
169
+
170
+ def tables
171
+ @tables ||= {
172
+ 'cmap' => cmap_table[:table],
173
+ 'glyf' => glyf_table[:table],
174
+ 'loca' => loca_table[:table],
175
+ 'kern' => kern_table,
176
+ 'hmtx' => hmtx_table[:table],
177
+ 'hhea' => hhea_table,
178
+ 'maxp' => maxp_table,
179
+ 'OS/2' => os2_table,
180
+ 'post' => post_table,
181
+ 'name' => name_table,
182
+ 'head' => head_table,
183
+ 'prep' => prep_table,
184
+ 'fpgm' => fpgm_table,
185
+ 'cvt ' => cvt_table,
186
+ 'VORG' => vorg_table,
187
+ 'DSIG' => dsig_table,
188
+ 'gasp' => gasp_table
189
+ }.reject { |_tag, table| table.nil? }
190
+ end
191
+
192
+ def glyphs
193
+ subset.glyphs
194
+ end
195
+
196
+ def new_to_old_glyph
197
+ subset.new_to_old_glyph
198
+ end
199
+
200
+ def old_to_new_glyph
201
+ subset.old_to_new_glyph
202
+ end
203
+
204
+ def checksum(data)
205
+ align(raw(data), 4).unpack('N*').reduce(0, :+) & 0xFFFF_FFFF
206
+ end
207
+
208
+ def raw(data)
209
+ data.respond_to?(:unresolved_string) ? data.unresolved_string : data
210
+ end
211
+
212
+ def align(data, width)
213
+ if data.length % width > 0
214
+ data + "\0" * (width - data.length % width)
215
+ else
216
+ data
217
+ end
218
+ end
219
+ end
220
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ttfunk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregory Brown
@@ -9,14 +9,15 @@ authors:
9
9
  - Daniel Nelson
10
10
  - Jonathan Greenberg
11
11
  - James Healy
12
+ - Cameron Dutro
12
13
  autorequire:
13
14
  bindir: bin
14
15
  cert_chain:
15
16
  - |
16
17
  -----BEGIN CERTIFICATE-----
17
- MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQ0wCwYDVQQDDARhbGV4
18
+ MIIDMjCCAhqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADA/MQ0wCwYDVQQDDARhbGV4
18
19
  MRkwFwYKCZImiZPyLGQBGRYJcG9pbnRsZXNzMRMwEQYKCZImiZPyLGQBGRYDb25l
19
- MB4XDTE3MDEwNDExNDAzM1oXDTE4MDEwNDExNDAzM1owPzENMAsGA1UEAwwEYWxl
20
+ MB4XDTE5MTIwMjEwMjAzNVoXDTIwMTIwMTEwMjAzNVowPzENMAsGA1UEAwwEYWxl
20
21
  eDEZMBcGCgmSJomT8ixkARkWCXBvaW50bGVzczETMBEGCgmSJomT8ixkARkWA29u
21
22
  ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM85Us8YQr55o/rMl+J+
22
23
  ula89ODiqjdc0kk+ibzRLCpfaFUJWxEMrhFiApRCopFDMeGXHXjBkfBYsRMFVs0M
@@ -24,17 +25,16 @@ cert_chain:
24
25
  K6f/TAggK0+/K1j1NjT+WSVaMBuyomM067ejwhiQkEA3+tT3oT/paEXCOfEtxOdX
25
26
  1F8VFd2MbmMK6CGgHbFLApfyDBtDx+ydplGZ3IMZg2nPqwYXTPJx+IuRO21ssDad
26
27
  gBMIAvL3wIeezJk2xONvhYg0K5jbIQOPB6zD1/9E6Q0LrwSBDkz5oyOn4PRZxgZ/
27
- OiMCAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFE+A
28
- jBJVt6ie5r83L/znvqjF1RuuMB0GA1UdEQQWMBSBEmFsZXhAcG9pbnRsZXNzLm9u
29
- ZTAdBgNVHRIEFjAUgRJhbGV4QHBvaW50bGVzcy5vbmUwDQYJKoZIhvcNAQEFBQAD
30
- ggEBAEmhsdVfgxHfXtOG6AP3qe7/PBjJPdUzNOkE/elj6TgpdvvJkOZ6QNyyqvpl
31
- CsoDWL0EXPM5pIETaj5z9iBRK9fAi8YNS3zckhBJwhR78cb4+MiCPIBC+iiGx5bw
32
- BFER2ASPeeY4uC0AHWHnURDLdxyZr+xp6pb/TitTAaCm18Kvkk1u60lOa4Jtdb+9
33
- 2U1KICEBoX6UAzdT3N0nZ3VKq/vHVrvV2oePYCMIlNkghWp+VUE91OTBDMjnjjj8
34
- wxx1aB3kGoI0T6JXywKpPnzUt/qji/qpzCNiVJ0RZxzDHyZuL8NEoA9ORZnAIGiW
35
- 5u3JK+T0toNEYkMuV6W8NU+gVyo=
28
+ OiMCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFE+A
29
+ jBJVt6ie5r83L/znvqjF1RuuMA0GCSqGSIb3DQEBCwUAA4IBAQBE9BhVReOpWN3A
30
+ S5L3I9rCVg3aj5/7Z2K3Op6Q1VlCgv9UR+r8wqox9NxA94HAsmOexr5tmRVHO4WC
31
+ nEZRHK9j4MzjKKChiRxLgWh78o/Mwvn2QT6cGCtUzfboWuVKACB5oJyAmfwomhUw
32
+ 4/zDsx6J4v1dDLy3vNu062uYbFLf94qRAo34r5cMt2Z3bC68zrbcRxfUE8fOudkt
33
+ u8IGMi8WtDe3DkNUiV3rZ1XOdcg5q5vJye4wsy+TJ3733jrdqa+XnI7r8joFuJry
34
+ NAnYg0X9IoxXQRCJn85h0SOQBU63TUfKDrERXDy0NLZT6sErDnpx84+ygqpxVAD+
35
+ 4qo2amfe
36
36
  -----END CERTIFICATE-----
37
- date: 2017-04-11 00:00:00.000000000 Z
37
+ date: 2020-01-04 00:00:00.000000000 Z
38
38
  dependencies:
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: rake
@@ -70,14 +70,42 @@ dependencies:
70
70
  requirements:
71
71
  - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: '0.46'
73
+ version: '0.68'
74
74
  type: :development
75
75
  prerelease: false
76
76
  version_requirements: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - "~>"
79
79
  - !ruby/object:Gem::Version
80
- version: '0.46'
80
+ version: '0.68'
81
+ - !ruby/object:Gem::Dependency
82
+ name: rubocop-performance
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '1.1'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '1.1'
95
+ - !ruby/object:Gem::Dependency
96
+ name: rubocop-rspec
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '1.32'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '1.32'
81
109
  - !ruby/object:Gem::Dependency
82
110
  name: yard
83
111
  requirement: !ruby/object:Gem::Requirement
@@ -99,6 +127,7 @@ email:
99
127
  - dnelson@bluejade.com
100
128
  - greenberg@entryway.net
101
129
  - jimmy@deefa.com
130
+ - camertron@gmail.com
102
131
  executables: []
103
132
  extensions: []
104
133
  extra_rdoc_files: []
@@ -110,20 +139,56 @@ files:
110
139
  - LICENSE
111
140
  - README.md
112
141
  - lib/ttfunk.rb
142
+ - lib/ttfunk/aggregate.rb
143
+ - lib/ttfunk/bin_utils.rb
144
+ - lib/ttfunk/bit_field.rb
113
145
  - lib/ttfunk/collection.rb
114
146
  - lib/ttfunk/directory.rb
115
- - lib/ttfunk/encoding/mac_roman.rb
116
- - lib/ttfunk/encoding/windows_1252.rb
147
+ - lib/ttfunk/encoded_string.rb
148
+ - lib/ttfunk/max.rb
149
+ - lib/ttfunk/min.rb
150
+ - lib/ttfunk/one_based_array.rb
151
+ - lib/ttfunk/otf_encoder.rb
152
+ - lib/ttfunk/placeholder.rb
117
153
  - lib/ttfunk/reader.rb
118
154
  - lib/ttfunk/resource_file.rb
155
+ - lib/ttfunk/sci_form.rb
156
+ - lib/ttfunk/sub_table.rb
119
157
  - lib/ttfunk/subset.rb
120
158
  - lib/ttfunk/subset/base.rb
159
+ - lib/ttfunk/subset/code_page.rb
121
160
  - lib/ttfunk/subset/mac_roman.rb
122
161
  - lib/ttfunk/subset/unicode.rb
123
162
  - lib/ttfunk/subset/unicode_8bit.rb
124
163
  - lib/ttfunk/subset/windows_1252.rb
125
164
  - lib/ttfunk/subset_collection.rb
165
+ - lib/ttfunk/sum.rb
126
166
  - lib/ttfunk/table.rb
167
+ - lib/ttfunk/table/cff.rb
168
+ - lib/ttfunk/table/cff/charset.rb
169
+ - lib/ttfunk/table/cff/charsets.rb
170
+ - lib/ttfunk/table/cff/charsets/expert.rb
171
+ - lib/ttfunk/table/cff/charsets/expert_subset.rb
172
+ - lib/ttfunk/table/cff/charsets/iso_adobe.rb
173
+ - lib/ttfunk/table/cff/charsets/standard_strings.rb
174
+ - lib/ttfunk/table/cff/charstring.rb
175
+ - lib/ttfunk/table/cff/charstrings_index.rb
176
+ - lib/ttfunk/table/cff/dict.rb
177
+ - lib/ttfunk/table/cff/encoding.rb
178
+ - lib/ttfunk/table/cff/encodings.rb
179
+ - lib/ttfunk/table/cff/encodings/expert.rb
180
+ - lib/ttfunk/table/cff/encodings/standard.rb
181
+ - lib/ttfunk/table/cff/fd_selector.rb
182
+ - lib/ttfunk/table/cff/font_dict.rb
183
+ - lib/ttfunk/table/cff/font_index.rb
184
+ - lib/ttfunk/table/cff/header.rb
185
+ - lib/ttfunk/table/cff/index.rb
186
+ - lib/ttfunk/table/cff/one_based_index.rb
187
+ - lib/ttfunk/table/cff/path.rb
188
+ - lib/ttfunk/table/cff/private_dict.rb
189
+ - lib/ttfunk/table/cff/subr_index.rb
190
+ - lib/ttfunk/table/cff/top_dict.rb
191
+ - lib/ttfunk/table/cff/top_index.rb
127
192
  - lib/ttfunk/table/cmap.rb
128
193
  - lib/ttfunk/table/cmap/format00.rb
129
194
  - lib/ttfunk/table/cmap/format04.rb
@@ -131,8 +196,10 @@ files:
131
196
  - lib/ttfunk/table/cmap/format10.rb
132
197
  - lib/ttfunk/table/cmap/format12.rb
133
198
  - lib/ttfunk/table/cmap/subtable.rb
199
+ - lib/ttfunk/table/dsig.rb
134
200
  - lib/ttfunk/table/glyf.rb
135
201
  - lib/ttfunk/table/glyf/compound.rb
202
+ - lib/ttfunk/table/glyf/path_based.rb
136
203
  - lib/ttfunk/table/glyf/simple.rb
137
204
  - lib/ttfunk/table/head.rb
138
205
  - lib/ttfunk/table/hhea.rb
@@ -150,6 +217,8 @@ files:
150
217
  - lib/ttfunk/table/post/format40.rb
151
218
  - lib/ttfunk/table/sbix.rb
152
219
  - lib/ttfunk/table/simple.rb
220
+ - lib/ttfunk/table/vorg.rb
221
+ - lib/ttfunk/ttf_encoder.rb
153
222
  homepage: https://prawnpdf.org
154
223
  licenses:
155
224
  - Nonstandard
@@ -164,15 +233,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
164
233
  requirements:
165
234
  - - "~>"
166
235
  - !ruby/object:Gem::Version
167
- version: '2.1'
236
+ version: '2.4'
168
237
  required_rubygems_version: !ruby/object:Gem::Requirement
169
238
  requirements:
170
239
  - - ">="
171
240
  - !ruby/object:Gem::Version
172
241
  version: '0'
173
242
  requirements: []
174
- rubyforge_project:
175
- rubygems_version: 2.6.11
243
+ rubygems_version: 3.0.3
176
244
  signing_key:
177
245
  specification_version: 4
178
246
  summary: TrueType Font Metrics Parser