diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 16:53:33 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 16:53:33 +0300 |
commit | e463eb40363ff4c68b1d903f4e0cdd0ac1c5977f (patch) | |
tree | d5e9f57c28f026cb21de3bd77cc10cd7f64aaa85 /sys/lib/ghostscript/gs_fapi.ps | |
parent | b41b9034225ab3e49980d9de55c141011b6383b0 (diff) |
Import sources from 2011-03-30 iso image - sys/lib
Diffstat (limited to 'sys/lib/ghostscript/gs_fapi.ps')
-rwxr-xr-x | sys/lib/ghostscript/gs_fapi.ps | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/sys/lib/ghostscript/gs_fapi.ps b/sys/lib/ghostscript/gs_fapi.ps new file mode 100755 index 000000000..500fa9c64 --- /dev/null +++ b/sys/lib/ghostscript/gs_fapi.ps @@ -0,0 +1,268 @@ +% Copyright (C) 2000 artofcode LLC. 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,v 1.25 2003/04/12 18:08:18 ray Exp $ +% 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 <bool> +{ currentdevice //EmbedFontObjectsQuery .getdeviceparams % <mark> <name> <value> ... + 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 +<< +%% Replace 1 (FAPIconfig) + (FAPIconfig) .runlibfile +>> def + +%------------------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 % <FontDict> /key RefinePath <FontDict> +{ exch begin + //Config exch get + /Path exch + Path false .file_name_combine not { + exch + (Can't combine paths ) print print ( and ) print = + /RefinePath /configurationerror signalerror + } if + def + currentdict end +} bind def + +/complete_instance % <font_name> <FontDict> <Options> complete_FAPI_Font <font_name> <FontDict> +{ //super.complete_instance exec + dup /CIDFontName known { /CIDFontPath } { /FontPath } ifelse //RefinePath exec +} bind def + +/IsMyRecord % <raw_record> -> <raw_record> bool +{ dup type /dicttype eq { dup /FAPI known } { false } ifelse +} bind def + +/IsActive % <record> IsActive <bool> +{ pop //is_device_compatible_to_FAPI exec +} bind def + +/FontRecordVirtualMethods //RecordVirtualMethodsStub dup length 2 add dict copy begin + /IsActive //IsActive def + /MakeInstance % <Name> <record> MakeInstance <Name> <Instance> <size> + { //FontOptions //complete_instance exec + 2 copy //GetSize exec + } bind def +currentdict end def + +/CIDFontRecordVirtualMethods //RecordVirtualMethodsStub dup length 3 add dict copy begin + /GetCSI //TranslateCSI def + /IsActive //IsActive def + /MakeInstance % <Name> <record> MakeInstance <Name> <Instance> <size> + { //CIDFontOptions //complete_instance exec + 2 copy //GetSize exec + } bind def +currentdict end def + +%----------------------------------The Redefintion--------------------- + +/MappedCategoryRedefiner /ProcSet findresource /Redefine get /Redefine exch def + +% Redefine the /Font category : +4 dict begin + /CategoryName /Font def + /MapFileName (FAPIfontmap) def + /VerifyMap { pop } bind def + /PreprocessRecord % <map> <Name> <raw_record> PreprocessRecord <map> <Name> <record> <bool> + { //IsMyRecord exec dup { + pop dup /RecordVirtualMethods //FontRecordVirtualMethods put + true + } if + } bind def +currentdict end Redefine + +% Redefine the /CIDFont category : +4 dict begin + /CategoryName /CIDFont def + /MapFileName (FAPIcidfmap) def + /VerifyMap { pop } bind def + /PreprocessRecord % <map> <Name> <raw_record> PreprocessRecord <map> <Name> <record> <bool> + { //IsMyRecord exec dup { + pop dup /RecordVirtualMethods //CIDFontRecordVirtualMethods put + true + } if + } bind def +currentdict end Redefine + +%==================== A hook for buildfont* operators ==================== + +% The procedure .FAPIhook redirects PS fonts to FAPI on necessity. +% This depends on the following conditions : +% +% 1. If font dictionary has /FAPI entry, it is a font listed in FAPIconfig.FontPath, +% and must be build with .FAPIrebuildfont, or a copy of a font, which was +% built with .FAPIrebuildfont . +% +% 2. If the font dictionary has /PathLoad entry, and has no /FAPI entry, +% it is an installed PS font, which is described in lib/fontmap or +% in GS_FONTPATH. .loadfont inserts /PathLoad entry for this case +% (see gs_fonts.ps). +% +% Installed fonts are being loaded with GS font loader, +% the they are passed to FAPI is same way as embedded fonts are. +% We do so because UFST cannot read fonts, which don't +% follow Type 1/42 file format strongly. +% +% 3. Executing .loadfont, we place /FAPI_hook_disable in the 0th +% element of some procedure on the execution stack - see gs_fonts.ps . +% If FAPI_hook finds /FAPI_hook_disable in there, +% it knows that it is called for a disk font during +% its internal definefont. +% +% 4. If font dictionary has no /FAPI entry, and has no /Path entry, +% and if we are not in .loadfont context, it is an embedded font. +% +% 5. Two entries to be defined in lib/FAPIconfig to control the hooking of PS fonts : +% HookDiskFonts and HookEmbeddedFonts . +% They specify arrays of font types (integers) to be redirected with FAPI. +% HookDiskFonts controls disk PS fonts (which fall into (2) and (3) ). +% HookEmbeddedFonts controls fonts being embedded into documents. +% +% 7. We apply the operator .passtoFAPI for checking whether FAPI can handle a font. +% If so, we insert /FAPI entry into the font dictionary and convert it +% with .FAPIrebuildfont . Otherwise the font is handled with the native GS font renderer. + +/FAPI_hook_debug % <proc> FAPI_hook_debug - +FAPIDEBUG { {exec} } { {pop} } ifelse +bind def + +/FAPI_hook_warn % <proc> FAPI_hook_debug - +QUIET { {pop} } { {exec} } ifelse +bind def + +/FAPI_is_hook_disabled % - FAPI_is_hook_disabled <bool> +{ % checks whether execution stack contains packedarray started with /FAPI_hook_disable . + /FAPI_hook_disable /MappedCategoryRedefiner /ProcSet findresource /execstack_lookup get exec + null ne +} bind def + +/FAPIhook_aux % <string|name> <font_dict> .FAPIhook <string|name> <font> +{ % name <<font>> + { (FAPIhook ) print 1 index = } //FAPI_hook_debug exec + dup /FAPI known { + { //PrintFontRef exec ( is mapped to FAPI=) print dup /FAPI get = } //FAPI_hook_warn exec + true //.FAPIrebuildfont //ChooseDecoding exec + } { + dup /PathLoad known dup { + { (PathLoad known for the font ) print //PrintFontRef exec (.) = } //FAPI_hook_debug exec + } { + pop //FAPI_is_hook_disabled exec dup + { pop + { (FAPIhook is in .loadfont context for the font ) print //PrintFontRef exec (.) = } //FAPI_hook_debug exec + true + } if + } ifelse + { /HookDiskFonts } { /HookEmbeddedFonts } ifelse + //Config exch get % name <<font>> [types] + 1 index //GetFontType exec //FindInArray exec % name <<font>> bHook + { { (Trying to render the font ) print //PrintFontRef exec ( with FAPI...) = } //FAPI_hook_debug exec + //.FAPIpassfont { + { //PrintFontRef exec ( is being rendered with FAPI=) print dup /FAPI get = } //FAPI_hook_warn exec + false //.FAPIrebuildfont //ChooseDecoding exec + } { + { (Can't render ) print //PrintFontRef exec ( with FAPI, will do with native GS renderer.) = } //FAPI_hook_warn exec + } ifelse + } { + { (The font ) print //PrintFontRef exec ( doesn't need to render with FAPI.) = } //FAPI_hook_debug exec + } ifelse + } ifelse +} bind def + +/FAPIhook % <string|name> <font_dict> .FAPIhook <string|name> <font> +{ //is_device_compatible_to_FAPI exec + { //FAPIhook_aux exec + } { + { (FAPIhook is disabled for the current device.) = } //FAPI_hook_debug exec + } ifelse +} bind def + +% ------------------ Redefine .buildfont* with FAPI : ----------------------- + +/.buildfont1 +{ //.buildfont1 exec //FAPIhook exec +} bind % 'odef' is below. + +/.buildfont2 +{ //.buildfont2 exec //FAPIhook exec +} bind % 'odef' is below. + +/.buildfont42 +{ //.buildfont42 exec //FAPIhook exec +} bind % 'odef' is below. + +/.buildfont9 +{ //.buildfont9 exec //FAPIhook exec +} bind % 'odef' is below. + +/.buildfont10 +{ //.buildfont10 exec //FAPIhook exec +} bind % 'odef' is below. + +/.buildfont11 +{ //.buildfont11 exec //FAPIhook exec +} bind % 'odef' is below. + +end % the temporary dictionary for local binding. +odef odef odef odef odef odef + +.setlanguagelevel + +%END FAPI |