You are on page 1of 3

% 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_cidtt.ps,v 1.8 2003/02/12 22:31:23 igor Exp $


% Redefine CIDFont category with an emulation with True Type fonts.

languagelevel 2 .setlanguagelevel

15 dict begin % a temporary dictionary for local binding.

%------------------Copy the FontEmulationProcs here : -------------------

/FontEmulationProcs /ProcSet findresource {


def
} forall

currentdict /super.complete_instance currentdict /complete_instance get put

%-------Auxiliary procedures for building CIDFontType 2 from TT file -----------

/GenerateCIDMap % <font> GenerateCIDMap <font>


{ begin
% Obtain the maximal CID :
% This implementation doesn't check whether glyphs really present.
Decoding /CIDCount get /CIDCount exch def
% Prepare the CIDMap structure :
/CIDMap [
CIDCount 32767 le {
CIDCount 2 mul string
} {
32767 2 mul string
CIDCount 32767 sub 2 mul string
} ifelse
] def
% Now fill it :
Decoding TT_cmap SubstNWP GDBytes CIDMap .fillCIDMap
currentdict end
} bind def

/load_sfnts % <FontDict> load_sfnts <FontDict>


{ % Read the True Type file from the path /Path, and buld /sfnts,
% skipping glyf and loca.
dup /Path get % <font> (path)
QUIET not {
(Loading a TT font from ) print dup print
( to emulate a CID font ) print 1 index /CIDFontName get =only ( ... ) print
} if
(r) file dup % <font> file file
3 1 roll % file <font> file
1 index /SubfontID .knownget not { 0 } if % file <font> file
SubfontID
.load_tt_font_stripped exch copy % file <font>
QUIET not {
(Done.) =
} if
dup 3 1 roll % <font> file <font>
exch /File exch put % <font>
dup dup /CIDSystemInfo get /Ordering get (.) % <font> () ()
2 index /Decoding get =string cvs % <font> () () ()
concatstrings concatstrings cvn /Decoding exch put % <font>
//ChooseDecoding exec % <font>
//GenerateCIDMap exec % <font>
} bind def

%-----------TrueType-specific methods for category redefinition : -----------

/RefinePath % <FontDict> RefinePath <FontDict>


{ dup begin
Path .libfile {
dup .filename {
currentdict exch /Path exch put
} if
closefile
} {
(Can't find the font file ) print =
/findfont cvx /undefinedfilename signalerror
} ifelse
end
} bind def

/complete_instance % <font_name> <FontDict> <Options> complete_FAPI_Font


<font_name> <FontDict>
{ 1 index /CIDFontType 2 put % Other types are not emulated yet.
//super.complete_instance exec
//RefinePath exec
//load_sfnts exec
} bind def

/IsMyRecord % <raw_record> -> <raw_record> bool


{ dup type /dicttype eq { dup /FileType .knownget { /TrueType eq } { false } ifelse
} { false } ifelse
} bind def

/IsActive % <record> IsActive <bool>


{ pop true
} bind 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
% Redefine the /CIDFont category :
4 dict begin
/CategoryName /CIDFont def
/IsMapFileOptional true 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

/MappedCategoryRedefiner /ProcSet findresource /Redefine get exec

end % the temporary dictionary for local binding.

.setlanguagelevel

You might also like