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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
|
%!
% Copyright (C) 2001-2020 Artifex Software, Inc.
% All Rights Reserved.
%
% This software is provided AS-IS with no warranty, either express or
% implied.
%
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
%
% Refer to licensing information at http://www.artifex.com or contact
% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
% CA 94945, U.S.A., +1(415)492-9861, for further information.
%
% Utility program for converting Japanese fonts produced by Macromedia's
% Rollup program to Type 0 fonts suitable for use with Ghostscript.
%
% Rollup produces the following files, where xxx is the font name:
% xxx-H, xxx-SA, xxx-SB, xxx-SK, xxx-SR, xxx-UG
% JIS83-1_COD
% JIS83-1_CSA
% The _COD and _CSA files are large files containing the actual
% character outline data; they may theoretically be shared between
% multiple fonts.
%
% rollconv.ps converts the above to files named:
% fff.ps
% fff.COD
% fff.CSA
% fff.CSR
% where fff is a font file name provided by the user at conversion time.
% The fff.ps file is the actual font file to be loaded with `run'
% or placed in a Fontmap or a directory named by [GS_]FONTPATH;
% the other two files must be present at runtime in a directory that is
% on Ghostscript's search path (-I, GS_LIB, GS_LIB_DEFAULT).
%
% The normal way to invoke this program is
% gsnd -- rollconv.ps xxx fff InDir CDir OutDir
% (assuming that gsnd is an alias for gs -dNODISPLAY), where:
% xxx is the font name;
% fff is the base part of the output file name;
% InDir is the name of the directory containing the xxx-* input files;
% CDir is the name of the directory containing the _COD and _CSA
% input files (typically the same as InDir);
% OutDir is the name of the directory where the output should be written
% (OutDir must already exist).
% For example:
% gsnd -- rollconv.ps HGGothicBPRO gothic /gs/k/rufonts/Gothic \
% /gs/k/rufonts/Gothic /gs/k/gsfonts
% To suppress output messages, you may insert -q:
% gsnd -q -- rollconv.ps ...
%
% This program assumes that the files have been FTP'ed from a Macintosh and
% therefore have 128 bytes of garbage at the beginning. If you have
% transferred them in some manner that avoids this, change true to false
% in the following line.
/fromMac true def
% The FontName of the converted font is xxx-83pv-RKSJ-H. In order to
% use a converted font with Ghostscript, you may either load it explicitly
% at run time, e.g.,
% (gothic.ps) run
% or you may add an entry to the Fontmap file, in the form:
% /HGGothicBPRO-83pv-RKSJ-H (gothic.ps) ;
% which will allow the font to be loaded automatically. After
% loading the font, by either method, you can select it in the usual way:
% /HGGothicBPRO-83pv-RKSJ-H findfont 36 scalefont setfont
% or
% /HGGothicBPRO-83pv-RKSJ-H 36 selectfont
/macrfile % <filename> macrfile <file>
{ (r) file
fromMac
{ % Get rid of the initial Mac garbage (128 characters).
% The garbage at the end is unpredictable,
% so we'll just have to hope that it's all nulls.
dup =string 0 128 getinterval readstring pop pop
}
if
} bind def
/convert % <FName> <OutBase> <InDir> <CDir> <OutDir> convert -
{ /OutDir exch def
/CDir exch def
/InDir exch def
/OutBase exch def
/FName exch def
/inprefix InDir (/) concatstrings FName concatstrings (-) concatstrings def
/inh inprefix (H) concatstrings def
% Open the output file.
/OutDot OutDir (/) concatstrings OutBase concatstrings (.) concatstrings def
/outname OutDot (ps) concatstrings def
QUIET not { (Writing ) print outname = flush } if
/cdfromstr (\(pgfonts/) FName concatstrings (-JIS83-1_) concatstrings def
/cdstr (\() OutBase concatstrings (.) concatstrings def
/out outname (w) file def
/buffer 65000 string def
% Copy the initial comments from the input file.
inh macrfile
{ dup =string readline pop
out 1 index writestring out (\n) writestring
(%%EndComments) eq { exit } if
}
loop
% Write out our preamble.
out (
currentpacking true setpacking
userdict /AltsysCFD3 known { (%END) .skipeof } if
userdict /AltsysCFD3 25 dict dup begin
/beint { 0 exch { exch 8 bitshift add } forall } bind def
/rfile { findlibfile { exch pop } { (r) file } ifelse } bind def
/str 500 string def
/AltRO { } def
/BuildCh % <font> <ccode> <bias> BuildCh -
{ /bias exch def /ccode exch def begin % font
ccode dup 255 and dup bias lt exch 252 gt or { pop 127 } if
dup -8 bitshift -67 mul add % subfonts have 189 chars, not 256
bias sub buildch1
} bind def
/BuildChr % <font> <ccode> BuildChr -
{ /ccode exch def begin % font
ccode buildch1
} bind def
/buildch1
{ 6 mul PGOffsets add
FileNames 0 get rfile dup dup 4 -1 roll setfileposition
(xxxxxx) readstring pop exch closefile
dup 1 3 getinterval beint % COD offset
exch 4 2 getinterval beint % length
dup 0 eq
{ pop pop currentdict end
1000 0 0 0 1 1 0 -1000 500 1000 setcachedevice2
}
{ dup str length gt { /str 1 index string store } if
FileNames 1 get rfile dup dup % offset length file file file
5 -1 roll setfileposition % length file file
str 0 5 -1 roll getinterval readstring pop pop closefile
currentdict end ccode str 1183615869 internaldict /CCRun get exec
}
ifelse
} bind def
/privates 100 dict def
/BuildPr % <stdhw> <stdvw> BuildPr <dict>
{ 2 copy 1000 mul add privates 1 index known
{ privates exch get 3 1 roll pop pop
}
{ 7 dict begin
/MinFeature{16 16}executeonly def
/BlueValues BlueValues def
/StdVW 3 -1 roll 1 array astore def
/StdHW 3 -1 roll 1 array astore def
/password 5839 def
/LanguageGroup 1 def
/Subrs Subrs def
currentdict readonly end
privates 2 index 2 index put exch pop
}
ifelse
} bind def
/FullEncoding
systemdict { pop } forall
systemdict length 512 sub 1 255 { (x) dup 0 4 -1 roll put cvn } for
768 packedarray def
/BlueValues[-250 -250 1100 1100]readonly def
/BuildChar{AltsysCFD3 begin 64 BuildCh end}bind def
/CharStrings 1 dict
dup /.notdef (1py8) noaccess put
readonly def
/CDevProc
{ pop pop pop pop 0 exch -1000 exch 2 div currentfont /FontBBox get 3 get
} bind def
/FontMatrix[0.001 0.0 0.0 0.001 0.0 0.0]readonly def
/Subrs [
(1p|=-D\R) noaccess
(1pyUz) noaccess
(1pyĞi) noaccess
(1p) noaccess
(1p|35rI) noaccess
] noaccess def
end put
%END
) writestring
% Locate and copy the definition of NotDefFont.
out (
FontDirectory /NotDefFont known { (%END) .skipeof } if
) writestring
{ dup =string readline pop
dup (/NotDefFont) eq { exit } if pop
}
loop out exch writestring out (\n) writestring
{ dup =string readline pop
(definefont) search { pop pop pop exit } if
out exch writestring out (\n) writestring
}
loop out (definefont pop
%END
) writestring
% Copy the definitions of the subfonts, moving the
% CharStrings of the Roman supplement to an external file.
% Stack for pattern procedures: infile line
/CSRName OutDot (CSR) concatstrings def
/csr CSRName (w) file def
QUIET not { (Writing ) print CSRName = flush } if
/encoding 256 array def
/patterns [
% Patterns specific to the Roman supplement, in which
% the outlines are in an eexec section.
{ (/Encoding 256 array) {
pop out (/Encoding ) writestring
{ dup buffer readline pop
dup (dup) search { exit } if pop pop
}
loop
{ % Stack: infile dupline postdup (dup) predup
pop pop exch pop
% The top element of the stack is a string beginning with
% an index and value to put into the Encoding.
token pop exch token pop exch pop encoding 3 1 roll put
dup buffer readline pop
dup (dup) search not { pop exit } if
}
loop
out encoding cvx write== out ( cvlit ) writestring
out exch writestring out (\n) writestring
} }
{ (/FontType 1 def) {
pop out (/FontType 4 def\n) writestring
out (/BuildChar{AltsysCFD3 begin BuildChr end}bind def\n) writestring
out (/FileNames[) writestring
2 { out OutBase (.CSR) concatstrings write==only } repeat
out (]def\n) writestring
} }
{ (currentfile eexec) {
pop out (systemdict begin\n) writestring
dup //.eexec_param_dict /eexecDecode filter
} }
{ (dup/CharStrings ) {
% Copy the individual CharStrings to the CSR file,
% recording the lengths and offsets.
pop out (dup/CharStrings AltsysCFD3 /CharStrings get put\n) writestring
/offsets 256 dict def
{ dup token pop % char name
dup dup type /nametype eq exch xcheck not and not { pop exit } if
1 index token pop % length of binary data
2 index token pop pop % skip RD
2 index buffer 0 3 index getinterval readstring pop % charstring
offsets 3 index csr fileposition 16 bitshift 4 index add put
csr exch writestring pop pop
dup buffer readline pop pop % skip ND
}
loop
% We skipped the 'end'; skip the 'readonly put' as well.
2 { dup token pop pop } repeat
out (dup/PGOffsets ) writestring
out csr fileposition write=only
out ( put\n) writestring
encoding
{ offsets exch .knownget not { 0 } if
2 { csr 0 write } repeat
4 { dup -24 bitshift csr exch write 8 bitshift } repeat pop
}
forall
} }
{ (/OtherSubrs[) {
pop
{ dup buffer readline pop
(]noaccess def) search { pop pop pop exit } if pop
}
loop
} }
{ (/Subrs 5 array) {
pop out (/Subrs AltsysCFD3 /Subrs get def\n) writestring
6 { dup buffer readline pop pop } repeat
} }
{ (currentfile closefile) {
pop out (end % systemdict\n) writestring
closefile
} }
% Patterns for other supplements.
{ (pgfonts/) {
{ cdfromstr search not { exit } if
out exch writestring pop out cdstr writestring
}
loop out exch writestring out (\n) writestring
} }
{ (/BuildChar{AltsysCFD3 begin 64 BuildCh end}bind def) {
pop out (\t/BuildChar AltsysCFD3 /BuildChar get def\n) writestring
} }
{ (/CDevProc{pop pop pop pop 0 exch -1000 exch 2 div ) {
pop out (\t/CDevProc AltsysCFD3 /CDevProc get def\n) writestring
} }
{ (/CharStrings 1 dict dup begin) {
pop out (\t/CharStrings AltsysCFD3 /CharStrings get def\n) writestring
2 { dup buffer readline pop pop } repeat
} }
{ (/FontMatrix[0.001 0.0 0.0 0.001 0.0 0.0]def) {
pop out (\t/FontMatrix AltsysCFD3 /FontMatrix get def\n) writestring
} }
{ (/Private 14 dict dup begin) {
pop out (\t/Private) writestring
{ dup buffer readline pop
(end def) search { pop pop pop exit } if
(/Std) search
{ pop pop dup length 3 sub 3 exch getinterval
(]) search pop out ( ) writestring out exch writestring pop
}
if pop
}
loop out ( AltsysCFD3 begin BuildPr end def\n) writestring
} }
{ (UniqueID) { pop } }
{ () {
out exch writestring out (\n) writestring
} }
] def
[ (SR) (SA) (SK) (SB) (UG) ]
{ 0 1 255 { encoding exch /.notdef put } for
inprefix exch concatstrings macrfile
{ dup buffer readline not { pop exit } if
/patterns load
{ 2 copy 0 get search { pop pop pop 1 get exec exit } if pop pop }
forall
}
loop closefile
}
forall
csr closefile
% Copy the definition of the root font.
dup buffer readstring pop out exch writestring closefile
out (
setpacking
) writestring
out closefile
% Remove the Mac garbage from the outline files.
[ (COD) (CSA) ]
{ CDir (/) concatstrings (JIS83-1_) concatstrings
1 index concatstrings macrfile
exch OutDot exch concatstrings
QUIET not { (Writing ) print dup = flush } if
(w) file
% Stack: infile outfile
{ 1 index buffer readstring exch
% Stack: infile outfile noteof substring
2 index exch writestring not { exit } if
}
loop closefile closefile
}
forall
} bind def
% If the program was invoked from the command line, run it now.
[ .shellarguments
{ counttomark 5 eq
{ convert
QUIET not { (Done.\n) print flush } if
}
{ cleartomark
(Usage: gsnd -- rollconv.ps FName OutBase InDir CDir OutDir\n) print
( e.g.: gsnd -- rollconv.ps HGMinchoE mincho HGfonts/Mincho HGfonts/Mincho HGfonts/gs\n) print flush
mark
}
ifelse
}
if pop
|