% Copyright (C) 2000 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.
%
% 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_fapi.ps 8954 2008-08-08 04:22:38Z ray $
% Redefine Font and CIDFont categories with FAPI-handeled fonts.
systemdict /.FAPIavailable known { .FAPIavailable } { false } ifelse not {
(%END FAPI) .skipeof
} if
languagelevel 2 .setlanguagelevel
%====================================================================
% Redefine Font category with FAPIfontmap and CIDFont with FAPIfontmap :
15 dict begin % a temporary dictionary for local binding.
/EmbedFontObjectsQuery mark
/.EmbedFontObjects 0
.dicttomark def
/is_device_compatible_to_FAPI % - is_device_compatible_to_FAPI
{ currentdevice //EmbedFontObjectsQuery .getdeviceparams % ...
dup mark eq {
pop true
} {
exch pop exch pop 0 eq
} ifelse
% The code above assumes that only the requested parameter is rendered.
% The commented-out code below may be useful for general case.
% Keeping it for a while.
% counttomark 2 idiv {
% exch /.EmbedFontObjects eq {
% counttomark 1 add 1 roll cleartomark
% 0 eq exit
% } if
% } repeat
% dup mark eq {
% pop true
% } if
} bind def
%----------------------------- Process FAPIconfig -----------------------
/Config
<<
systemdict /FAPIconfig known {/FAPIconfig .systemvar} {(FAPIconfig)} ifelse .runlibfile
/ServerOptions 2 dict
>> def
systemdict /.FAPIconfig //Config put
()
systemdict /UFST_SSdir .knownget {
(UFST_SSdir=) exch concatstrings concatstrings
} if
systemdict /UFST_PlugIn .knownget {
1 index length 0 ne {
exch .filenamelistseparator concatstrings exch
} if
(UFST_PlugIn=) exch concatstrings concatstrings
} if
dup length 0 ne {
//Config /ServerOptions get exch /UFST exch put
} {
pop
} ifelse
%------------------Copy the FontEmulationProcs here : -------------------
/FontEmulationProcs /ProcSet findresource {
def
} forall
currentdict /super.complete_instance currentdict /complete_instance get put
%-----------FAPI-specific methods for category redefinition : -----------
/RefinePath % /key RefinePath
{ exch begin
//Config exch get
/Path exch
Path false .file_name_combine not {
exch
(Can't combine paths ) print print ( and ) print =
/RefinePath cvx /configurationerror signalerror
} if
def
currentdict end
} bind def
/complete_instance % complete_FAPI_Font
{ //super.complete_instance exec
dup /CIDFontName known { /CIDFontPath } { /FontPath } ifelse //RefinePath exec
} bind def
/IsMyRecord % -> bool
{ dup type /dicttype eq { dup /FAPI known } { false } ifelse
} bind def
/IsActive % IsActive
{ pop //is_device_compatible_to_FAPI exec
} bind def
/FontRecordVirtualMethods //RecordVirtualMethodsStub dup length 2 add dict copy begin
/IsActive //IsActive def
/MakeInstance % MakeInstance
{ currentglobal 3 1 roll true setglobal
//FontOptions //complete_instance exec
2 copy //GetSize exec
4 3 roll setglobal
} bind def
currentdict end def
/CIDFontRecordVirtualMethods //RecordVirtualMethodsStub dup length 3 add dict copy begin
/GetCSI //TranslateCSI def
/IsActive //IsActive def
/MakeInstance % MakeInstance
{ currentglobal 3 1 roll true setglobal
//CIDFontOptions //complete_instance exec
2 copy //GetSize exec
4 3 roll setglobal
} bind def
currentdict end def
/ReadFCOfontmap: % ReadFCOfontmap: name dict ...
{ /fontfile exch def
{
currentfile =string readline not {
pop exit
} if
dup length 0 ne {
0 () /SubFileDecode filter
dup token not {
% A comment line
closefile
} {
dup /EndFCOfontmap cvx eq {
pop closefile exit
} if
exch dup token not {
/ReadFCOfontmap: cvx /rangecheck signalerror
} if
exch dup token not {
/StandardEncoding
} {
dup type /nametype ne {
/ReadFCOfontmap: cvx /rangecheck signalerror
} if
} ifelse
findencoding
exch dup token not {
null
} {
dup type /nametype ne {
/ReadFCOfontmap: cvx /rangecheck signalerror
} if
/Decoding findresource
} ifelse
exch closefile % index name enc dec|null
4 3 roll % name enc dec|null index
<< /Path fontfile
/FontType 1
/FAPI /UFST
/SubfontId counttomark 2 add -1 roll
/Decoding counttomark 2 add -1 roll
dup null eq {
pop pop
} if
/Encoding counttomark 2 add -1 roll
>> % dup { exch == = } forall
} ifelse
} {
pop
} ifelse
} loop
currentdict /fontfile undef
} bind def
%----------------------------------The Redefintion---------------------
/MappedCategoryRedefiner /ProcSet findresource /Redefine get /Redefine exch def
% Redefine the /Font category :
4 dict begin
/CategoryName /Font def
/MapFileName systemdict /FAPIfontmap known {/FAPIfontmap .systemvar} {(FAPIfontmap)} ifelse def
/VerifyMap { pop } bind def
/PreprocessRecord %