123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- %!
- % Copyright (C) 1995, 1996 Aladdin Enterprises. All rights reserved.
- % $Id: rollconv.ps,v 1.4 2002/05/01 23:15:23 igor Exp $
- % 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 (¿1pyÊ8�å) 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
- (¿1py¼öUz) noaccess
- (¿1py½Äži) noaccess
- (¿1pù) noaccess
- (¿1p|35r·I) 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
|