rbpdf-font 1.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +9 -0
  3. data/MIT-LICENSE +20 -0
  4. data/Rakefile +12 -0
  5. data/lib/fonts/README.z +2 -0
  6. data/lib/fonts/arialunicid0_cw.rb +1738 -0
  7. data/lib/fonts/cid0cs.rb +21 -0
  8. data/lib/fonts/cid0ct.rb +21 -0
  9. data/lib/fonts/cid0jp.rb +21 -0
  10. data/lib/fonts/cid0kr.rb +21 -0
  11. data/lib/fonts/courier.rb +37 -0
  12. data/lib/fonts/dejavu-fonts-ttf-2.35/AUTHORS +56 -0
  13. data/lib/fonts/dejavu-fonts-ttf-2.35/BUGS +3 -0
  14. data/lib/fonts/dejavu-fonts-ttf-2.35/LICENSE +99 -0
  15. data/lib/fonts/dejavu-fonts-ttf-2.35/NEWS +1429 -0
  16. data/lib/fonts/dejavu-fonts-ttf-2.35/README +59 -0
  17. data/lib/fonts/dejavusans.ctg.z +0 -0
  18. data/lib/fonts/dejavusans.rb +551 -0
  19. data/lib/fonts/dejavusans.z +0 -0
  20. data/lib/fonts/dejavusansb.ctg.z +0 -0
  21. data/lib/fonts/dejavusansb.rb +551 -0
  22. data/lib/fonts/dejavusansb.z +0 -0
  23. data/lib/fonts/dejavusansbi.ctg.z +0 -0
  24. data/lib/fonts/dejavusansbi.rb +496 -0
  25. data/lib/fonts/dejavusansbi.z +0 -0
  26. data/lib/fonts/dejavusanscondensed.ctg.z +0 -0
  27. data/lib/fonts/dejavusanscondensed.rb +551 -0
  28. data/lib/fonts/dejavusanscondensed.z +0 -0
  29. data/lib/fonts/dejavusanscondensedb.ctg.z +0 -0
  30. data/lib/fonts/dejavusanscondensedb.rb +551 -0
  31. data/lib/fonts/dejavusanscondensedb.z +0 -0
  32. data/lib/fonts/dejavusanscondensedbi.ctg.z +0 -0
  33. data/lib/fonts/dejavusanscondensedbi.rb +496 -0
  34. data/lib/fonts/dejavusanscondensedbi.z +0 -0
  35. data/lib/fonts/dejavusanscondensedi.ctg.z +0 -0
  36. data/lib/fonts/dejavusanscondensedi.rb +496 -0
  37. data/lib/fonts/dejavusanscondensedi.z +0 -0
  38. data/lib/fonts/dejavusansextralight.ctg.z +0 -0
  39. data/lib/fonts/dejavusansextralight.rb +213 -0
  40. data/lib/fonts/dejavusansextralight.z +0 -0
  41. data/lib/fonts/dejavusansi.ctg.z +0 -0
  42. data/lib/fonts/dejavusansi.rb +496 -0
  43. data/lib/fonts/dejavusansi.z +0 -0
  44. data/lib/fonts/dejavusansmono.ctg.z +0 -0
  45. data/lib/fonts/dejavusansmono.rb +340 -0
  46. data/lib/fonts/dejavusansmono.z +0 -0
  47. data/lib/fonts/dejavusansmonob.ctg.z +0 -0
  48. data/lib/fonts/dejavusansmonob.rb +340 -0
  49. data/lib/fonts/dejavusansmonob.z +0 -0
  50. data/lib/fonts/dejavusansmonobi.ctg.z +0 -0
  51. data/lib/fonts/dejavusansmonobi.rb +282 -0
  52. data/lib/fonts/dejavusansmonobi.z +0 -0
  53. data/lib/fonts/dejavusansmonoi.ctg.z +0 -0
  54. data/lib/fonts/dejavusansmonoi.rb +282 -0
  55. data/lib/fonts/dejavusansmonoi.z +0 -0
  56. data/lib/fonts/dejavuserif.ctg.z +0 -0
  57. data/lib/fonts/dejavuserif.rb +348 -0
  58. data/lib/fonts/dejavuserif.z +0 -0
  59. data/lib/fonts/dejavuserifb.ctg.z +0 -0
  60. data/lib/fonts/dejavuserifb.rb +346 -0
  61. data/lib/fonts/dejavuserifb.z +0 -0
  62. data/lib/fonts/dejavuserifbi.ctg.z +0 -0
  63. data/lib/fonts/dejavuserifbi.rb +347 -0
  64. data/lib/fonts/dejavuserifbi.z +0 -0
  65. data/lib/fonts/dejavuserifcondensed.ctg.z +0 -0
  66. data/lib/fonts/dejavuserifcondensed.rb +348 -0
  67. data/lib/fonts/dejavuserifcondensed.z +0 -0
  68. data/lib/fonts/dejavuserifcondensedb.ctg.z +0 -0
  69. data/lib/fonts/dejavuserifcondensedb.rb +346 -0
  70. data/lib/fonts/dejavuserifcondensedb.z +0 -0
  71. data/lib/fonts/dejavuserifcondensedbi.ctg.z +0 -0
  72. data/lib/fonts/dejavuserifcondensedbi.rb +347 -0
  73. data/lib/fonts/dejavuserifcondensedbi.z +0 -0
  74. data/lib/fonts/dejavuserifcondensedi.ctg.z +0 -0
  75. data/lib/fonts/dejavuserifcondensedi.rb +347 -0
  76. data/lib/fonts/dejavuserifcondensedi.z +0 -0
  77. data/lib/fonts/dejavuserifi.ctg.z +0 -0
  78. data/lib/fonts/dejavuserifi.rb +347 -0
  79. data/lib/fonts/dejavuserifi.z +0 -0
  80. data/lib/fonts/freefont-20080912/AUTHORS +191 -0
  81. data/lib/fonts/freefont-20080912/COPYING +341 -0
  82. data/lib/fonts/freefont-20080912/CREDITS +506 -0
  83. data/lib/fonts/freefont-20080912/ChangeLog +3320 -0
  84. data/lib/fonts/freefont-20080912/INSTALL +81 -0
  85. data/lib/fonts/freefont-20080912/README +108 -0
  86. data/lib/fonts/freemono.ctg.z +0 -0
  87. data/lib/fonts/freemono.rb +204 -0
  88. data/lib/fonts/freemono.z +0 -0
  89. data/lib/fonts/freemonob.ctg.z +0 -0
  90. data/lib/fonts/freemonob.rb +121 -0
  91. data/lib/fonts/freemonob.z +0 -0
  92. data/lib/fonts/freemonobi.ctg.z +0 -0
  93. data/lib/fonts/freemonobi.rb +85 -0
  94. data/lib/fonts/freemonobi.z +0 -0
  95. data/lib/fonts/freemonoi.ctg.z +0 -0
  96. data/lib/fonts/freemonoi.rb +137 -0
  97. data/lib/fonts/freemonoi.z +0 -0
  98. data/lib/fonts/freesans.ctg.z +0 -0
  99. data/lib/fonts/freesans.rb +197 -0
  100. data/lib/fonts/freesans.z +0 -0
  101. data/lib/fonts/freesansb.ctg.z +0 -0
  102. data/lib/fonts/freesansb.rb +137 -0
  103. data/lib/fonts/freesansb.z +0 -0
  104. data/lib/fonts/freesansbi.ctg.z +0 -0
  105. data/lib/fonts/freesansbi.rb +109 -0
  106. data/lib/fonts/freesansbi.z +0 -0
  107. data/lib/fonts/freesansi.ctg.z +0 -0
  108. data/lib/fonts/freesansi.rb +137 -0
  109. data/lib/fonts/freesansi.z +0 -0
  110. data/lib/fonts/freeserif.ctg.z +0 -0
  111. data/lib/fonts/freeserif.rb +286 -0
  112. data/lib/fonts/freeserif.z +0 -0
  113. data/lib/fonts/freeserifb.ctg.z +0 -0
  114. data/lib/fonts/freeserifb.rb +165 -0
  115. data/lib/fonts/freeserifb.z +0 -0
  116. data/lib/fonts/freeserifbi.ctg.z +0 -0
  117. data/lib/fonts/freeserifbi.rb +131 -0
  118. data/lib/fonts/freeserifbi.z +0 -0
  119. data/lib/fonts/freeserifi.ctg.z +0 -0
  120. data/lib/fonts/freeserifi.rb +152 -0
  121. data/lib/fonts/freeserifi.z +0 -0
  122. data/lib/fonts/helvetica.rb +34 -0
  123. data/lib/fonts/helveticab.rb +34 -0
  124. data/lib/fonts/helveticabi.rb +34 -0
  125. data/lib/fonts/helveticai.rb +34 -0
  126. data/lib/fonts/hysmyeongjostdmedium.rb +31 -0
  127. data/lib/fonts/kozgopromedium.rb +47 -0
  128. data/lib/fonts/kozminproregular.rb +46 -0
  129. data/lib/fonts/msungstdlight.rb +23 -0
  130. data/lib/fonts/stsongstdlight.rb +23 -0
  131. data/lib/fonts/symbol.rb +33 -0
  132. data/lib/fonts/times.rb +34 -0
  133. data/lib/fonts/timesb.rb +34 -0
  134. data/lib/fonts/timesbi.rb +34 -0
  135. data/lib/fonts/timesi.rb +34 -0
  136. data/lib/fonts/ttf2ufm/README.TXT +132 -0
  137. data/lib/fonts/ttf2ufm/enc/cp1250.map +251 -0
  138. data/lib/fonts/ttf2ufm/enc/cp1251.map +255 -0
  139. data/lib/fonts/ttf2ufm/enc/cp1252.map +251 -0
  140. data/lib/fonts/ttf2ufm/enc/cp1253.map +239 -0
  141. data/lib/fonts/ttf2ufm/enc/cp1254.map +249 -0
  142. data/lib/fonts/ttf2ufm/enc/cp1255.map +233 -0
  143. data/lib/fonts/ttf2ufm/enc/cp1257.map +244 -0
  144. data/lib/fonts/ttf2ufm/enc/cp1258.map +247 -0
  145. data/lib/fonts/ttf2ufm/enc/cp874.map +225 -0
  146. data/lib/fonts/ttf2ufm/enc/iso-8859-1.map +256 -0
  147. data/lib/fonts/ttf2ufm/enc/iso-8859-11.map +248 -0
  148. data/lib/fonts/ttf2ufm/enc/iso-8859-15.map +256 -0
  149. data/lib/fonts/ttf2ufm/enc/iso-8859-16.map +256 -0
  150. data/lib/fonts/ttf2ufm/enc/iso-8859-2.map +256 -0
  151. data/lib/fonts/ttf2ufm/enc/iso-8859-4.map +256 -0
  152. data/lib/fonts/ttf2ufm/enc/iso-8859-5.map +256 -0
  153. data/lib/fonts/ttf2ufm/enc/iso-8859-7.map +250 -0
  154. data/lib/fonts/ttf2ufm/enc/iso-8859-9.map +256 -0
  155. data/lib/fonts/ttf2ufm/enc/koi8-r.map +256 -0
  156. data/lib/fonts/ttf2ufm/enc/koi8-u.map +256 -0
  157. data/lib/fonts/ttf2ufm/makeallttffonts.rb +48 -0
  158. data/lib/fonts/ttf2ufm/makefont.rb +617 -0
  159. data/lib/fonts/ttf2ufm/ttf2ufm +0 -0
  160. data/lib/fonts/uni2cid_ac15.rb +23613 -0
  161. data/lib/fonts/uni2cid_ag15.rb +30222 -0
  162. data/lib/fonts/uni2cid_aj16.rb +15705 -0
  163. data/lib/fonts/uni2cid_ak12.rb +17530 -0
  164. data/lib/fonts/zapfdingbats.rb +33 -0
  165. data/lib/rbpdf-font.rb +46 -0
  166. data/rbpdf-font.gemspec +35 -0
  167. data/test/rbpdf_font_file_test.rb +118 -0
  168. data/test/test_helper.rb +4 -0
  169. metadata +257 -0
@@ -0,0 +1,48 @@
1
+ #============================================================+
2
+ # File name : makeallttffonts.rb
3
+ # Begin : 2015-09-20
4
+ # Last Update : 2015-09-20
5
+ # License : GNU LGPL (http://www.gnu.org/copyleft/lesser.html)
6
+ # ----------------------------------------------------------------------------
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published by
9
+ # the Free Software Foundation, either version 2.1 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
+ # ----------------------------------------------------------------------------
20
+ # Description : Process all TTF files on current directory to
21
+ # build RBPDF compatible font files.
22
+ #
23
+ # Author: Jun NAITOH
24
+ #============================================================+
25
+
26
+ #
27
+ # Process all TTF files on current directory to build RBPDF compatible font files.
28
+ # @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
29
+ #
30
+
31
+ if RUBY_VERSION < '1.9'
32
+ abort("Error: Ruby 1.8.7 not supported.")
33
+ end
34
+
35
+ require "open3"
36
+
37
+ # read directory for files (only graphics files).
38
+ Dir.glob("*ttf").each{|file|
39
+ basename = File.basename(file, ".*")
40
+ o, s = Open3.capture2('./ttf2ufm -a -F ' + file)
41
+ puts o
42
+ o, s = Open3.capture2('ruby makefont.rb ' + file + ' ' + basename + '.ufm')
43
+ puts o
44
+ }
45
+
46
+ #============================================================+
47
+ # END OF FILE
48
+ #============================================================+
@@ -0,0 +1,617 @@
1
+ #============================================================+
2
+ # File name : makefont.rb
3
+ # Begin : 2004-12-31
4
+ # Last Update : 2010-03-19
5
+ # Version : 1.2.006
6
+ # License : GNU LGPL (http://www.gnu.org/copyleft/lesser.html)
7
+ # ----------------------------------------------------------------------------
8
+ # Copyright (C) 2008 Nicola Asuni - Tecnick.com S.r.l.
9
+ #
10
+ # This program is free software: you can redistribute it and/or modify
11
+ # it under the terms of the GNU Lesser General Public License as published by
12
+ # the Free Software Foundation, either version 2.1 of the License, or
13
+ # (at your option) any later version.
14
+ #
15
+ # This program is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU Lesser General Public License for more details.
19
+ #
20
+ # You should have received a copy of the GNU Lesser General Public License
21
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
22
+ #
23
+ # See LICENSE.TXT file for more information.
24
+ # ----------------------------------------------------------------------------
25
+ #
26
+ # Description : Utility to generate font definition files for RBPDF
27
+ #
28
+ # Authors: Nicola Asuni, Olivier Plathey, Steven Wittens
29
+ #
30
+ # (c) Copyright:
31
+ # Nicola Asuni
32
+ # Tecnick.com S.r.l.
33
+ # Via della Pace, 11
34
+ # 09044 Quartucciu (CA)
35
+ # ITALY
36
+ # www.tecnick.com
37
+ # info@tecnick.com
38
+ #============================================================+
39
+
40
+ #
41
+ # Utility to generate font definition files fot RBPDF.
42
+ # @author Nicola Asuni, Olivier Plathey, Steven Wittens
43
+ # @copyright 2004-2008 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
44
+ # @package com.tecnick.tcpdf
45
+ # @link http://www.tcpdf.org
46
+ # @license http://www.gnu.org/copyleft/lesser.html LGPL
47
+ #
48
+
49
+ #
50
+ # [@param string :fontfile] path to font file (TTF, OTF or PFB).
51
+ # [@param string :fmfile] font metrics file (UFM or AFM).
52
+ # [@param boolean :embedded] Set to false to not embed the font, true otherwise (default).
53
+ # [@param string :enc] Name of the encoding table to use. Omit this parameter for TrueType Unicode, OpenType Unicode and symbolic fonts like Symbol or ZapfDingBats.
54
+ # [@param hash :patch] Optional modification of the encoding
55
+ #
56
+ def MakeFont(fontfile, fmfile, embedded=true, enc='cp1252', patch={})
57
+ # Generate a font definition file
58
+ unless File.exist?(fontfile)
59
+ abort('Error: file not found: ' + fontfile)
60
+ end
61
+ unless File.exist?(fmfile)
62
+ abort('Error: file not found: ' + fmfile)
63
+ end
64
+ cidtogidmap = ''
65
+ map = []
66
+ diff = ''
67
+ dw = 0 # default width
68
+ ffext = fontfile[-3..-1].downcase
69
+ fmext = fmfile[-3..-1].downcase
70
+ type = ''
71
+ if fmext == 'afm'
72
+ if (ffext == 'ttf') or (ffext == 'otf')
73
+ type = 'TrueType'
74
+ elsif ffext == 'pfb'
75
+ type = 'Type1'
76
+ else
77
+ abort('Error: unrecognized font file extension: ' + ffext)
78
+ end
79
+ if enc
80
+ map = ReadMap(enc)
81
+ patch.each {|cc, gn|
82
+ map[cc] = gn
83
+ }
84
+ end
85
+ fm, map = ReadAFM(fmfile, map)
86
+ #if widths['.notdef']
87
+ # dw = widths['.notdef']
88
+ #end
89
+ if enc
90
+ diff = MakeFontEncoding(map)
91
+ end
92
+ fd = MakeFontDescriptor(fm, map.empty?)
93
+ elsif fmext == 'ufm'
94
+ enc = ''
95
+ if (ffext == 'ttf') or (ffext == 'otf')
96
+ type = 'TrueTypeUnicode'
97
+ else
98
+ abort('Error: not a TrueType font: ' + ffext)
99
+ end
100
+ fm, cidtogidmap = ReadUFM(fmfile, cidtogidmap)
101
+ dw = fm['MissingWidth']
102
+ fd = MakeFontDescriptor(fm, false)
103
+ end
104
+ # Start generation
105
+ basename = File.basename(fmfile, ".*").downcase
106
+ s = 'RBPDFFontDescriptor.define(\'' + basename + "') do |font|\n"
107
+ s << " font[:type]='" + type + "'\n"
108
+ s << " font[:name]='" + fm['FontName'] + "'\n"
109
+ s << " font[:desc]=" + fd + "\n"
110
+ if fm['UnderlinePosition'].nil?
111
+ fm['UnderlinePosition'] = -100
112
+ end
113
+ if fm['UnderlineThickness'].nil?
114
+ fm['UnderlineThickness'] = 50
115
+ end
116
+ s << " font[:up]=" + fm['UnderlinePosition'].to_s + "\n"
117
+ s << " font[:ut]=" + fm['UnderlineThickness'].to_s + "\n"
118
+ if dw <= 0
119
+ if fm['Widths'][32] and (fm['Widths'][32].to_i > 0)
120
+ # assign default space width
121
+ dw = fm['Widths'][32].to_i
122
+ else
123
+ dw = 600
124
+ end
125
+ end
126
+ s << " font[:dw]=" + dw.to_s + "\n"
127
+ s << " font[:cw]=" + MakeWidthArray(fm) + "\n"
128
+ s << " font[:enc]='" + enc + "'\n"
129
+ s << " font[:diff]='" + diff + "'\n"
130
+ if embedded
131
+ # Embedded font
132
+ if (type == 'TrueType') or (type == 'TrueTypeUnicode')
133
+ CheckTTF(fontfile)
134
+ end
135
+ f = open(fontfile, 'rb')
136
+ if !f
137
+ abort('Error: Unable to open ' + fontfile)
138
+ end
139
+ file = f.read(File::stat(fontfile).size)
140
+ f.close
141
+ if type == 'Type1'
142
+ # Find first two sections and discard third one
143
+ header = (file[0, 1].unpack('C')[0] == 128)
144
+ if header
145
+ # Strip first binary header
146
+ file = file[6,-1]
147
+ end
148
+ pos = file.index('eexec')
149
+ if pos.nil?
150
+ abort('Error: font file does not seem to be valid Type1')
151
+ end
152
+ size1 = pos + 6
153
+ if header and (file{size1}.unpack('C')[0] == 128)
154
+ # Strip second binary header
155
+ file = file[0, size1] + file[(size1 + 6)..-1]
156
+ end
157
+ pos = file.index('00000000')
158
+ if pos.nil?
159
+ abort('Error: font file does not seem to be valid Type1')
160
+ end
161
+ size2 = pos - size1
162
+ file = file[0, size1 + size2]
163
+ end
164
+ basename = basename.downcase
165
+ if Object.const_defined?(:Zlib)
166
+ cmp = basename + '.z'
167
+ SaveToFile(cmp, Zlib::Deflate.deflate(file, 9), 'b')
168
+ s << ' font[:file]=\'' + cmp + "'\n"
169
+ print "Font file compressed (" + cmp + ")\n"
170
+ unless cidtogidmap.empty?
171
+ cmp = basename + '.ctg.z'
172
+ SaveToFile(cmp, Zlib::Deflate.deflate(cidtogidmap, 9), 'b')
173
+ print "CIDToGIDMap created and compressed (" + cmp + ")\n"
174
+ s << ' font[:ctg]=\'' + cmp + "'\n"
175
+ end
176
+ else
177
+ s << 'file=\'' + File.basename(fontfile, ".*") + "'\n"
178
+ print "Notice: font file could not be compressed (zlib extension not available)\n"
179
+ if !cidtogidmap.empty?
180
+ cmp = basename + '.ctg'
181
+ f = open(cmp, 'wb')
182
+ f.write(cidtogidmap)
183
+ f.close
184
+ print "CIDToGIDMap created (" + cmp + ")\n"
185
+ s << ' font[:ctg]=\'' + cmp + "'\n"
186
+ end
187
+ end
188
+ if type == 'Type1'
189
+ s << ' font[:size1]=' + size1 + "\n"
190
+ s << ' font[:size2]=' + size2 + "\n"
191
+ else
192
+ s << ' font[:originalsize]=' + File::stat(fontfile).size.to_s + "\n"
193
+ end
194
+ else
195
+ # Not embedded font
196
+ s << ' font[:file]=' + "''\n"
197
+ end
198
+ s << "end\n"
199
+ SaveToFile(basename + '.rb',s)
200
+ print "Font definition file generated (" + basename + ".rb)\n"
201
+ end
202
+
203
+ #
204
+ # Read the specified encoding map.
205
+ # [@param string :enc] map name (see /enc/ folder for valid names).
206
+ # [@return array]
207
+ #
208
+ def ReadMap(enc)
209
+ # Read a map file
210
+ file = File.dirname(__FILE__) + '/enc/' + enc.downcase + '.map'
211
+ a = File.open(file).readlines
212
+ if a.empty?
213
+ abort('Error: encoding not found: ' + enc)
214
+ end
215
+ #puts a.length
216
+ cc2gn = []
217
+ a.each {|l|
218
+ if l[0, 1] == '!'
219
+ #puts l
220
+ e = l.rstrip.split(/[ \t]+/)
221
+ cc = e[0][1..-1].hex
222
+ gn = e[2]
223
+ cc2gn[cc] = gn
224
+ end
225
+ }
226
+ 256.times {|i|
227
+ if cc2gn[i].nil?
228
+ cc2gn[i] = '.notdef'
229
+ end
230
+ }
231
+ return cc2gn
232
+ end
233
+
234
+ #
235
+ # Read UFM file
236
+ # [@return hash :fm]
237
+ # [@return string :cidtogidmap]
238
+ #
239
+ def ReadUFM(file, cidtogidmap)
240
+ # Prepare empty CIDToGIDMap
241
+ cidtogidmap = ''.ljust(256 * 256 * 2, "\x00")
242
+ # Read a font metric file
243
+ a = File.open(file).readlines
244
+ if a.empty?
245
+ abort('File not found')
246
+ end
247
+ widths = {}
248
+ fm = {}
249
+ a.each {|l|
250
+ e = l.rstrip.split(' ')
251
+ if e.length < 2
252
+ next
253
+ end
254
+ code = e[0]
255
+ param = e[1]
256
+ if code == 'U'
257
+ # U 827 ; WX 0 ; N squaresubnosp ; G 675
258
+ # Character metrics
259
+ cc = e[1].to_i
260
+ if cc != -1
261
+ gn = e[7]
262
+ w = e[4].to_i
263
+ glyph = e[10].to_i
264
+ widths[cc] = w
265
+ if cc == 'X'.unpack('C')[0]
266
+ fm['CapXHeight'] = e[13]
267
+ end
268
+ # Set GID
269
+ if (cc >= 0) and (cc < 0xFFFF) and glyph
270
+ cidtogidmap[cc * 2, 1] = (glyph >> 8).chr
271
+ cidtogidmap[cc * 2 + 1, 1] = (glyph & 0xFF).chr
272
+ end
273
+ end
274
+ if (gn and (gn == '.notdef')) and fm['MissingWidth'].nil?
275
+ fm['MissingWidth'] = w
276
+ end
277
+ elsif code == 'FontName'
278
+ fm['FontName'] = param
279
+ elsif code == 'Weight'
280
+ fm['Weight'] = param
281
+ elsif code == 'ItalicAngle'
282
+ fm['ItalicAngle'] = param.to_f
283
+ elsif code == 'Ascender'
284
+ fm['Ascender'] = param.to_i
285
+ elsif code == 'Descender'
286
+ fm['Descender'] = param.to_i
287
+ elsif code == 'UnderlineThickness'
288
+ fm['UnderlineThickness'] = param.to_i
289
+ elsif code == 'UnderlinePosition'
290
+ fm['UnderlinePosition'] = param.to_i
291
+ elsif code == 'IsFixedPitch'
292
+ fm['IsFixedPitch'] = (param == 'true')
293
+ elsif code == 'FontBBox'
294
+ fm['FontBBox'] = [e[1], e[2], e[3], e[4]]
295
+ elsif code == 'CapHeight'
296
+ fm['CapHeight'] = param.to_i
297
+ elsif code == 'StdVW'
298
+ fm['StdVW'] = param.to_i
299
+ end
300
+ }
301
+ if fm['MissingWidth'].nil?
302
+ fm['MissingWidth'] = 600
303
+ end
304
+ if fm['FontName'].nil?
305
+ abort('FontName not found')
306
+ end
307
+ fm['Widths'] = widths
308
+ return fm, cidtogidmap
309
+ end
310
+
311
+ #
312
+ # Read AFM file
313
+ # [@return hash :fm]
314
+ # [@return array :map]
315
+ #
316
+ def ReadAFM(file, map)
317
+ # Read a font metric file
318
+ a = File.open(file).readlines
319
+ if a.empty?
320
+ abort('File not found')
321
+ end
322
+ widths = {}
323
+ fm = {}
324
+ fix = {
325
+ 'Edot'=>'Edotaccent',
326
+ 'edot'=>'edotaccent',
327
+ 'Idot'=>'Idotaccent',
328
+ 'Zdot'=>'Zdotaccent',
329
+ 'zdot'=>'zdotaccent',
330
+ 'Odblacute' => 'Ohungarumlaut',
331
+ 'odblacute' => 'ohungarumlaut',
332
+ 'Udblacute'=>'Uhungarumlaut',
333
+ 'udblacute'=>'uhungarumlaut',
334
+ 'Gcedilla'=>'Gcommaaccent',
335
+ 'gcedilla'=>'gcommaaccent',
336
+ 'Kcedilla'=>'Kcommaaccent',
337
+ 'kcedilla'=>'kcommaaccent',
338
+ 'Lcedilla'=>'Lcommaaccent',
339
+ 'lcedilla'=>'lcommaaccent',
340
+ 'Ncedilla'=>'Ncommaaccent',
341
+ 'ncedilla'=>'ncommaaccent',
342
+ 'Rcedilla'=>'Rcommaaccent',
343
+ 'rcedilla'=>'rcommaaccent',
344
+ 'Scedilla'=>'Scommaaccent',
345
+ 'scedilla'=>'scommaaccent',
346
+ 'Tcedilla'=>'Tcommaaccent',
347
+ 'tcedilla'=>'tcommaaccent',
348
+ 'Dslash'=>'Dcroat',
349
+ 'dslash'=>'dcroat',
350
+ 'Dmacron'=>'Dcroat',
351
+ 'dmacron'=>'dcroat',
352
+ 'combininggraveaccent'=>'gravecomb',
353
+ 'combininghookabove'=>'hookabovecomb',
354
+ 'combiningtildeaccent'=>'tildecomb',
355
+ 'combiningacuteaccent'=>'acutecomb',
356
+ 'combiningdotbelow'=>'dotbelowcomb',
357
+ 'dongsign'=>'dong'
358
+ }
359
+ a.each {|l|
360
+ e = l.rstrip.split(' ')
361
+ if e.length < 2
362
+ next
363
+ end
364
+ code = e[0]
365
+ param = e[1]
366
+ if code == 'C'
367
+ # Character metrics
368
+ cc = e[1].to_i
369
+ w = e[4]
370
+ gn = e[7]
371
+ if gn[-4..-1] == '20AC'
372
+ gn = 'Euro'
373
+ end
374
+ if fix[gn]
375
+ # Fix incorrect glyph name
376
+ map.each_with_index {|n, c|
377
+ if n == fix[gn]
378
+ map[c] = gn
379
+ end
380
+ }
381
+ end
382
+ if map.empty?
383
+ # Symbolic font: use built-in encoding
384
+ widths[cc] = w
385
+ else
386
+ widths[gn] = w
387
+ if gn == 'X'
388
+ fm['CapXHeight'] = e[13]
389
+ end
390
+ end
391
+ if gn == '.notdef'
392
+ fm['MissingWidth'] = w
393
+ end
394
+ elsif code == 'FontName'
395
+ fm['FontName'] = param
396
+ elsif code == 'Weight'
397
+ fm['Weight'] = param
398
+ elsif code == 'ItalicAngle'
399
+ fm['ItalicAngle'] = param.to_f
400
+ elsif code == 'Ascender'
401
+ fm['Ascender'] = param.to_i
402
+ elsif code == 'Descender'
403
+ fm['Descender'] = param.to_i
404
+ elsif code == 'UnderlineThickness'
405
+ fm['UnderlineThickness'] = param.to_i
406
+ elsif code == 'UnderlinePosition'
407
+ fm['UnderlinePosition'] = param.to_i
408
+ elsif code == 'IsFixedPitch'
409
+ fm['IsFixedPitch'] = (param == 'true')
410
+ elsif code == 'FontBBox'
411
+ fm['FontBBox'] = [e[1], e[2], e[3], e[4]]
412
+ elsif code == 'CapHeight'
413
+ fm['CapHeight'] = param.to_i
414
+ elsif code == 'StdVW'
415
+ fm['StdVW'] = param.to_i
416
+ end
417
+ }
418
+ if fm['FontName'].nil?
419
+ abort('FontName not found')
420
+ end
421
+ if !map.empty?
422
+ if widths['.notdef'].nil?
423
+ widths['.notdef'] = 600
424
+ end
425
+ if widths['Delta'].nil? and widths['increment']
426
+ widths['Delta'] = widths['increment']
427
+ end
428
+ # Order widths according to map
429
+ 256.times {|i|
430
+ if widths[map[i]].nil?
431
+ print "Warning: character " + map[i] + " is missing\n"
432
+ widths[i] = widths['.notdef']
433
+ else
434
+ widths[i] = widths[map[i]]
435
+ end
436
+ }
437
+ end
438
+ fm['Widths'] = widths
439
+ return fm, map
440
+ end
441
+
442
+ def MakeFontDescriptor(fm, symbolic=false)
443
+ # Ascent
444
+ asc = fm['Ascender'] ? fm['Ascender'] : 1000
445
+ fd = "{'Ascent'=>" + asc.to_s
446
+ # Descent
447
+ desc = fm['Descender'] ? fm['Descender'] : -200
448
+ fd << ",'Descent'=>" + desc.to_s
449
+ # CapHeight
450
+ if fm['CapHeight']
451
+ ch = fm['CapHeight']
452
+ elsif fm['CapXHeight']
453
+ ch = fm['CapXHeight']
454
+ else
455
+ ch = asc
456
+ end
457
+ fd << ",'CapHeight'=>" + ch.to_s
458
+ # Flags
459
+ flags = 0
460
+ if fm['IsFixedPitch'] and (fm['IsFixedPitch'] == true)
461
+ flags += 1<<0
462
+ end
463
+ if symbolic
464
+ flags += 1<<2
465
+ else
466
+ flags += 1<<5
467
+ end
468
+ if fm['ItalicAngle'] and (fm['ItalicAngle'] != 0)
469
+ flags += 1<<6
470
+ end
471
+ fd << ",'Flags'=>" + flags.to_s
472
+ # FontBBox
473
+ if fm['FontBBox']
474
+ fbb = fm['FontBBox']
475
+ else
476
+ fbb = [0, desc - 100, 1000, asc + 100]
477
+ end
478
+ fd << ",'FontBBox'=>'[" + fbb[0].to_s + ' ' + fbb[1].to_s + ' ' + fbb[2].to_s + ' ' + fbb[3].to_s + "]'"
479
+ # ItalicAngle
480
+ ia = fm['ItalicAngle'] ? fm['ItalicAngle'] : 0
481
+ fd << ",'ItalicAngle'=>" + ia.to_s
482
+ # StemV
483
+ if fm['StdVW']
484
+ stemv = fm['StdVW']
485
+ elsif fm['Weight'] and fm['Weight'] =~ /(bold|black)/i
486
+ stemv = 120
487
+ else
488
+ stemv = 70
489
+ end
490
+ fd << ",'StemV'=>" + stemv.to_s
491
+ # MissingWidth
492
+ if fm['MissingWidth']
493
+ fd << ",'MissingWidth'=>" + fm['MissingWidth'].to_s
494
+ end
495
+ fd << '}'
496
+ return fd
497
+ end
498
+
499
+ def MakeWidthArray(fm)
500
+ # Make character width array
501
+ s = '{'
502
+ cw = fm['Widths']
503
+ els = []
504
+ c = -1
505
+ cw.each{|i,w|
506
+ if i.is_a? Integer
507
+ els.push(((((c += 1) % 10) == 0) ? "\n " : '') + i.to_s + '=>' + w.to_s)
508
+ end
509
+ }
510
+ s << els.join(',')
511
+ s << '}'
512
+ return s
513
+ end
514
+
515
+ def MakeFontEncoding(map)
516
+ # Build differences from reference encoding
517
+ ref = ReadMap('cp1252')
518
+ s = ''
519
+ last = 0
520
+ 32.upto(255) {|i|
521
+ if map[i] != ref[i]
522
+ if i != last + 1
523
+ s << i.to_s + ' '
524
+ end
525
+ last = i
526
+ s << '/' + map[i] + ' '
527
+ end
528
+ }
529
+ return s.rstrip
530
+ end
531
+
532
+ def SaveToFile(file, s, mode='b')
533
+ f = open(file, 'w' + mode)
534
+ if !f
535
+ abort('Can\'t write to file ' + file)
536
+ end
537
+ f.write(s)
538
+ f.close
539
+ end
540
+
541
+ def ReadShort(f)
542
+ a = f.read(2).unpack('n1')
543
+ return a[0]
544
+ end
545
+
546
+ def ReadLong(f)
547
+ a = f.read(4).unpack('N1')
548
+ return a[0]
549
+ end
550
+
551
+ def CheckTTF(file)
552
+ # Check if font license allows embedding
553
+ f = open(file, 'rb')
554
+ if !f
555
+ abort('Error: unable to open ' + file)
556
+ end
557
+ # Extract number of tables
558
+ f.seek(4, IO::SEEK_CUR)
559
+ nb = ReadShort(f)
560
+ f.seek(6, IO::SEEK_CUR)
561
+ # Seek OS/2 table
562
+ found = false
563
+ nb.times {|i|
564
+ if f.read(4) == 'OS/2'
565
+ found = true
566
+ break
567
+ end
568
+ f.seek(12, IO::SEEK_CUR)
569
+ }
570
+ if !found
571
+ f.close
572
+ return
573
+ end
574
+ f.seek(4, IO::SEEK_CUR)
575
+ offset = ReadLong(f)
576
+ f.seek(offset, IO::SEEK_SET)
577
+ # Extract fsType flags
578
+ f.seek(8, IO::SEEK_CUR)
579
+ fsType = ReadShort(f)
580
+ rl = (fsType & 0x02) != 0
581
+ pp = (fsType & 0x04) != 0
582
+ e = (fsType & 0x08) != 0
583
+ f.close
584
+ if rl and !pp and !e
585
+ print "Warning: font license does not allow embedding\n"
586
+ end
587
+ end
588
+
589
+ if RUBY_VERSION < '1.9'
590
+ abort("Error: Ruby 1.8.7 not supported.")
591
+ end
592
+
593
+ require 'zlib'
594
+
595
+ arg = ARGV.dup
596
+ if arg.length >= 2
597
+ if arg.length == 3
598
+ arg[3] = arg[2]
599
+ arg[2] = true
600
+ else
601
+ if arg[2].nil?
602
+ arg[2] = true
603
+ end
604
+ if arg[3].nil?
605
+ arg[3] = 'cp1252'
606
+ end
607
+ end
608
+ if arg[4].nil?
609
+ arg[4] = {}
610
+ else
611
+ arg[4] = eval(ARGV[4])
612
+ end
613
+ MakeFont(arg[0], arg[1], arg[2], arg[3], arg[4])
614
+ else
615
+ print "Usage: makefont.rb <ttf/otf/pfb file> <afm/ufm file> <encoding> <patch>\n"
616
+ end
617
+