ref: aad36c645ab7b9ab376a935ca7aa63b7d303c46f
dir: /sys/src/cmd/gs/lib/gs_pfile.ps/
% Copyright (C) 1994, 1995 Aladdin Enterprises. 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. % % For more information about licensing, please refer to % http://www.ghostscript.com/licensing/. For information on % commercial licensing, go to http://www.artifex.com/licensing/ or % contact Artifex Software, Inc., 101 Lucas Valley Road #110, % San Rafael, CA 94903, U.S.A., +1(415)492-9861. % $Id: gs_pfile.ps,v 1.5 2003/08/08 18:45:05 ray Exp $ % Runtime support for minimum-space fonts and packed files. % ****** NOTE: This file must be kept consistent with % ****** packfile.ps and wrfont.ps. % ---------------- Packed file support ---------------- % % A packed file is the concatenation of several file groups, each of which % is the result of compressing several files concatenated together. % The packed file begins with a procedure that creates an appropriate % decoding filter for each file group, as follows: % <group-subfile-filter> -proc- <group-decode-filter> % Thus, accessing an individual file requires 4 parameters: % the starting address and length of the outer compressed file, % and the starting address and length of the inner file. /.packedfilefilter % <file> <ostart> <olength> <istart> <ilength> % .packedfilefilter <filter> { 4 index systemdict begin token pop end 6 1 roll % Stack: fproc file ostart olength istart ilength 4 index 5 -1 roll setfileposition % Stack: fproc file olength istart ilength 4 -2 roll () /SubFileDecode filter % Stack: fproc istart ilength ofilter 4 -1 roll exec % Filters don't support setfileposition, so we must skip data % by reading it into a buffer. We rely on the fact that % save/restore don't affect file positions. % Stack: istart ilength dfilter save exch 64000 string % Stack: istart ilength save dfilter scratch 4 index 1 index length idiv { 2 copy readstring pop pop } repeat 2 copy 0 8 -1 roll 2 index length mod getinterval readstring pop pop pop % Stack: ilength save dfilter exch restore exch () /SubFileDecode filter } bind def % Run a packed library file. /.runpackedlibfile % <filename> <ostart> <olength> <istart> <ilength> % .runpackedlibfile { 5 -1 roll findlibfile { exch pop dup 6 2 roll .packedfilefilter currentobjectformat exch 1 setobjectformat run setobjectformat closefile } { 5 1 roll /findlibfile load /undefinedfilename signalerror } ifelse } bind def % ---------------- Compacted font support ---------------- % % Compacted fonts written by wrfont.ps depend on the existence and % specifications of the procedures and data in this section. /.compactfontdefault mark /PaintType 0 /FontMatrix [0.001 0 0 0.001 0 0] readonly /FontType 1 /Encoding StandardEncoding .dicttomark readonly def /.checkexistingfont % <fontname> <uid> <privatesize> <fontsize> % .checkexistingfont % {} (<font> on d-stack) % <fontname> <uid> <privatesize> <fontsize> % .checkexistingfont % -save- --restore-- (<font> on d-stack) { FontDirectory 4 index .knownget { dup /UniqueID .knownget { 4 index eq exch /FontType get 1 eq and } { pop false } ifelse } { false } ifelse { save /restore load 6 2 roll } { {} 5 1 roll } ifelse dict //.compactfontdefault exch .copydict begin dict /Private exch def Private begin /MinFeature {16 16} def /Password 5839 def /UniqueID 1 index def end /UniqueID exch def /FontName exch def } bind def /.knownEncodings [ ISOLatin1Encoding StandardEncoding SymbolEncoding ] readonly def /.readCharStrings % <count> <encrypt> .readCharStrings <dict> { exch dup dict dup 3 -1 roll { currentfile token pop dup type /integertype eq { dup -8 bitshift //.knownEncodings exch get exch 255 and get } if currentfile token pop dup type /nametype eq { 2 index exch get } { % Stack: encrypt dict dict key value 4 index { 4330 exch dup .type1encrypt exch pop } if readonly } ifelse put dup } repeat pop exch pop } bind def