ttfunk 1.5.1 → 1.6.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.
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