summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlgs/Resource/Init/gs_cff.ps
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlgs/Resource/Init/gs_cff.ps')
-rw-r--r--Master/tlpkg/tlgs/Resource/Init/gs_cff.ps250
1 files changed, 250 insertions, 0 deletions
diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_cff.ps b/Master/tlpkg/tlgs/Resource/Init/gs_cff.ps
new file mode 100644
index 00000000000..c5e72602a45
--- /dev/null
+++ b/Master/tlpkg/tlgs/Resource/Init/gs_cff.ps
@@ -0,0 +1,250 @@
+% Copyright (C) 2001-2012 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., 7 Mt. Lassen Drive - Suite A-134, San Rafael,
+% CA 94903, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Loader for CFF (compressed) fonts, including OpenType CFFs.
+% The following are not implemented yet:
+% Deleted entries in the Name Index
+% Embedded PostScript
+% Multiple Master fonts
+% Chameleon fonts
+% Synthetic fonts
+
+% ---------------- Font loading machinery ---------------- %
+
+% Augment the FONTPATH machinery so it recognizes OpenType CFF font sets.
+
+/.scanfontheaders where {
+ pop /.scanfontheaders [
+ .scanfontheaders aload pop (OTTO*)
+ ] def
+} if
+
+% Load a font file that might be an OpenType CFF font set.
+
+% <file> .loadfontfile -
+/.loadnonottofontfile /.loadfontfile load def
+/.loadfontfile {
+ dup (12345678) .peekstring pop (wOFFOTTO) eq
+ {
+ .init_wOFF_otto_font_file
+ //true //false
+ }{//true} ifelse
+
+ {
+ dup 4 string .peekstring pop (OTTO) eq
+ {
+ % If this is a font at all, it's an OpenType CFF font set.
+ .init_otto_font_file //true
+ }
+ { //false } ifelse
+ } if
+
+ { % Use a random FontSet resource name. ****** WRONG ******
+ realtime rand xor =string cvs exch //false //false
+ ReadData pop
+ } {
+ % Not a TrueType font.
+ .loadnonottofontfile
+ } ifelse
+} bind def
+
+% <file> .init_otto_font_file <file>
+/.init_otto_font_file {
+ /FontSetInit /ProcSet findresource begin
+ 2 dict begin
+ /f exch def /cff //null def
+ card32 pop card16 6 { next pop } repeat dup {
+ % Stack: numtables tablesleft
+ dup 0 eq {
+ pop pop /.loadottofontfile cvx /invalidfont signalerror
+ } if
+ f 4 string readstring pop (CFF ) eq { sub exit } if
+ f 12 string readstring pop pop 1 sub % skip to next table
+ } loop
+ % Stack: tablesread
+ card32 pop card32 card32
+ % Stack: tablesread start length
+ exch 3 -1 roll 1 add 16 mul 12 add sub
+ f exch subfilefilter flushfile % skip to start
+ f exch subfilefilter end
+} bind def
+
+% <file> .init_otto_font_file <file>
+/.init_wOFF_otto_font_file {
+ /FontSetInit /ProcSet findresource begin
+ 2 dict begin
+ /f exch def /cff //null def
+ 3 {card32 pop} repeat % (wOFF), (OTTO) and file length
+
+ card16
+ 30 { next pop } repeat
+ dup
+ {
+ % Stack: numtables tablesleft
+ dup 0 eq {
+ pop pop /.loadottofontfile cvx /invalidfont signalerror
+ } if
+ f 4 string readstring pop (CFF ) eq { sub exit } if
+ f 12 string readstring pop pop 1 sub % skip to next table
+ } loop
+ % Stack: tablesread
+ 4 { card32 } repeat
+ % Stack: tablesread start complen len checksum
+ pop
+ % Stack: tablesread start complen len
+ 4 -2 roll exch
+ % Stack: complen len start tablesread
+ 1 add 20 mul 44 add sub
+ % Stack: complen len offset
+ f exch subfilefilter flushfile % skip to start
+ % Stack: complen len
+ % the table can legally be uncompressed: complen == len
+ 1 index 1 index eq
+ { exch pop f exch subfilefilter}
+ { pop f exch subfilefilter /FlateDecode filter} ifelse
+ end
+} bind def
+20 dict begin
+
+% ------ Utilities ------ %
+
+/subfilefilter { % <file> <length> subfilefilter <filter>
+ % SubFileDecode interprets a length of 0 as infinite.
+ dup 0 le { pop pop () 0 } if () /SubFileDecode filter
+} bind def
+
+
+/advance { % <n> advance -
+ f cff eq { pos add /pos exch store } { pop } ifelse
+} bind def
+/next { % - next <byte>
+ f read {
+ 1 advance
+ CFFDEBUG { ( ) print dup = } if
+ } {
+ 0
+ CFFDEBUG { ( Out of range access, assuming 0) = } if
+ /pdfformaterror where {
+ pop
+ ( **** Warning: Out of range access to a CFF table, assuming 0.\n)
+ pdfformaterror
+ } if
+ } ifelse
+} bind def
+/next2 { % - next2 <byte1> <byte2>
+ f read {
+ f read {
+ 2 advance
+ CFFDEBUG { ( ) print 1 index =only (,) print dup = } if
+ } {
+ 1 advance
+ CFFDEBUG { ( ) print dup = } if
+ } ifelse
+ } if
+} bind def
+/nextstring { % <length> nextstring <string>
+ dup 0 eq {
+ pop ()
+ } {
+ string f exch readstring pop dup length advance
+ CFFDEBUG { ( ) print dup //== exec } if
+ } ifelse
+} bind def
+
+/card8 % - card8 <card8>
+ /next load
+def
+/card16 { % - card16 <card16>
+ next2 exch 8 bitshift add
+} bind def
+/card32 { % - card32 <card32>
+ card16 16 bitshift card16 add
+} bind def
+/offsetprocs [
+ /card8 load
+ /card16 load
+ { card8 16 bitshift card16 add } bind
+ /card32 load
+] readonly def
+/offsetproc { % <offsize> offsetproc <proc>
+ 1 sub //offsetprocs exch get
+} bind def
+/offset { % <offsize> offset <offset>
+ offsetproc exec
+} bind def
+/sid % - <sid> sid
+ /card16 load
+def
+
+% ------ Main program ------ %
+
+% We need to pass the file as a parameter for the sake of the PDF
+% interpreter. Also for the sake of PDF, a flag forces the font
+% to be defined as <resname> instead of the name embedded in the data.
+% This is needed for subsetted fonts; it is valid if the CFF
+% contains only a single font.
+% Finally, PDF interpreter may request creation of CIDFont out of an
+% ordinary CFF font.
+/StartData { % <resname> <nbytes> StartData -
+ currentfile exch subfilefilter //false //false ReadData pop
+} bind def
+/ReadData { % <resname> <file> <forceresname> <forcecid> ReadData <fontset>
+ % Initialize.
+
+ 30 dict begin
+ /forcecidfont exch def
+ /forceresname exch def
+ /cff exch def
+ /pos 0 def
+ /resname exch cvlit def
+ /DEBUG CFFDEBUG def % bring the binding closer
+ /StringCache 1 dict def % Private DICT may be reused.
+
+ forcecidfont
+ [ { cff 1024 string readstring not { exit } if } loop ]
+ .parsecff /fonts exch def
+
+ resname
+ mark fonts {
+ forceresname { exch pop resname exch } if
+ dup /CIDFontType known { % This is a CIDFont.
+ dup /CIDFontName 3 index put
+ 1 index exch /CIDFont defineresource
+ } { % This is a font.
+ dup /FontName 3 index put
+ dup /FontType 2 put
+ 1 index exch
+ definefont
+ } ifelse
+ } forall .dicttomark
+
+ end % temporary dict
+ end % FontSetInit ProcSet
+ /FontSet defineresource
+
+} bind def
+
+% ---------------- Resource category definition ---------------- %
+
+currentdict end readonly
+
+languagelevel exch 2 .setlanguagelevel
+
+/FontSet /Generic /Category findresource dup length dict .copydict
+/Category defineresource pop
+
+/FontSetInit exch /ProcSet defineresource pop
+
+.setlanguagelevel