addxchar.ps
TRANSCRIPT
-
7/23/2019 Addxchar.ps
1/6
% 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.%
% Add the Central European and other Adobe extended Latin characters to a% Type 1 font.% Requires -dWRITESYSTEMDICT to disable access protection.
(type1ops.ps) runlibfile
% ---------------- Utilities ---------------- %
/addce_dict 50 dict def
addce_dict begin
% Define the added copyright notice./addednotice (. Portions Copyright (C) 2012 Artifex Software Inc.) def
% Open a font for modification by removing the FID and changing the% FontName. Removing UniqueID and XUID is not necessary, since we% will only be adding characters./openfont { % openfont
-
7/23/2019 Addxchar.ps
2/6
exch pop } { dup glyphcs { dup /hsbw eq { pop exit } if } forall 2 array astore SBW 3 -1 roll 2 index put } ifelse aload pop} def
% Get the CharString for a glyph, as an array./glyphcs { % glyphcs CharStrings exch get 4330 exch dup length string .type1decrypt exch pop dup length lenIV sub lenIV exch getinterval 0 () /SubFileDecode filter [ exch charstack_read ]} def
% Find an occurrence of a value in an array./asearch { % asearch true % asearch false false 0 4 2 roll exch { % Stack: false index value element 2 copy eq { pop pop exch not exch dup exit } if exch 1 add exch } forall pop pop
} def
% Convert an array back to a CharString./csdef { % csdef - charproc_string 4330 exch dup .type1encrypt exch pop readonly CharStrings 3 1 roll put} def
% Split an accented character name./splitaccented { % splitaccented dup =string cvs dup 0 1 getinterval cvn
exch dup length 1 sub 1 exch getinterval cvn} def
% Begin the definition of a 'seac' character.% Defines accent, base, abox, bbox.% The initial dx lines up the origins of the base and the accent./beginseac { % beginseac % -mark- /hsbw /accent exch def /base exch def /abox [accent glyphbbox] def /bbox [base glyphbbox] def [ base glyphsbw /hsbw accent glyphsbw pop dup 4 index sub
} def
% Center the accent over the base of a 'seac' character./centeraccent { % centeraccent bbox 2 get bbox 0 get add 2 div abox 2 get abox 0 get add 2 div sub add} def
% Finish the definition of a 'seac' character.
-
7/23/2019 Addxchar.ps
3/6
/finishseac { % -mark- ... finishseac - exch cvi exch cvi charindex base get charindex accent get /seac ] csdef} def
% ---------------- Main program ---------------- %
% Define accented characters that can be made with seac,% with the accent centered over the character./seacchars [ /Abreve /Amacron /Cacute /Ccaron /Dcaron /Ecaron /Edotaccent /Emacron /Gbreve /Idotaccent /Imacron /Lacute /Nacute /Ncaron /Ohungarumlaut /Omacron /Racute /Rcaron /Sacute /Scedilla /Tcaron /Uhungarumlaut /Umacron /Uogonek /Uring /Zacute /Zdotaccent /abreve /amacron
/cacute /ccaron /ecaron /edotaccent /emacron /gbreve /lacute /nacute /ncaron /ohungarumlaut /omacron /racute /rcaron /sacute /scedilla /uhungarumlaut /umacron /uring /zacute /zdotaccent] def
% Define seac characters where the accent lines up with the right
% edge of the character./seacrightchars [ /Aogonek /Eogonek /Iogonek /aogonek /eogonek /iogonek /uogonek] def
% Define seac characters where the caron becomes an appended quoteright./seaccaronchars [ /dcaron /lcaron /tcaron] def
% Define seac characters using commaaccent./seaccommachars [ /Gcommaaccent /Kcommaaccent /Lcommaaccent /Ncommaaccent /Rcommaaccent
/Scommaaccent /Tcommaaccent /gcommaaccent /kcommaaccent /lcommaaccent /ncommaaccent /rcommaaccent /scommaaccent /tcommaaccent] def
% Define the characters copied from the Symbol font./symbolchars [ /Delta /greaterequal /lessequal /lozenge /notequal /partialdiff /summation] def
-
7/23/2019 Addxchar.ps
4/6
% Define the procedures for editing the commaaccent character.% Delete all the hints, since it's too hard to adjust them./caedit mark /rmoveto { exch commatop sub cvi exch } /hstem { pop pop pop } /vstem 1 index /callothersubr { dup 3 eq { 4 { pop } repeat /skip true def } if } /pop { skip { pop /skip false def } if }.dicttomark def
/addce { % addce
-
7/23/2019 Addxchar.ps
5/6
dup italfactor mul 3 -1 roll add exch } { pop 0 } ifelse } { pop 0 } ifelse finishseac } forall
seacrightchars { splitaccented beginseac bbox 2 get abox 2 get sub add % line up right edges 0 finishseac } forall
/dcroat /d /hyphen beginseac bbox 2 get abox 2 get sub add % line up right edges 0 finishseac
/imacron /dotlessi /macron beginseac centeraccent 0 finishseac
/Lcaron /L /quoteright beginseac bbox 2 get abox 2 get sub add % line up right edges 0 finishseac
seaccaronchars { dup =string cvs 0 1 getinterval cvn /quoteright beginseac % Move the quote to the right of the character. bbox 2 get abox 0 get sub 50 add add % Adjust the character width as well. 4 -1 roll abox 2 get abox 0 get sub 50 add add cvi 4 1 roll 0 finishseac } forall
seaccommachars { dup =string cvs 0 1 getinterval cvn /comma beginseac centeraccent commatop neg % Lower the accent if the character extends below % the baseline bbox 1 get 0 .min add finishseac } forall
% Add the characters from the Symbol font. % We should scale them to match the FontBBox, but we don't.
symbolchars { symbolfont /CharStrings get 1 index get CharStrings 3 1 roll put } forall
% Add the one remaining character.
CharStrings /Dcroat CharStrings /Eth get put
% Recompute the FontBBox, since some of the accented characters
-
7/23/2019 Addxchar.ps
6/6
% may have enlarged it.
/llx 1000 def /lly 1000 def /urx 0 def /ury 0 def CharStrings { pop glyphbbox ury .max /ury exch def urx .max /urx exch def lly .min /lly exch def llx .min /llx exch def } forall /FontBBox llx cvi lly cvi urx ceiling cvi ury ceiling cvi 4 packedarray def
% Restore the Encoding and wrap up.
[/Copyright /Notice] { FontInfo 1 index .knownget { addednotice concatstrings FontInfo 3 1 roll put } { pop } ifelse } forall FontName font openfont dup /Encoding origfont /Encoding get put definefont
end end
} def
currentdict end readonly pop % addce_dict
/addce { addce_dict begin addce end } def
% ---------------- Integration ---------------- %
% We would like to patch the font loader so that it adds the extended% Latin characters automatically. We haven't done this yet.
% ---------------- Test program ---------------- %
/TEST where { pop TEST } { false } ifelse { /FONT where { pop } { /FONT /Palatino-Italic def } ifelse (unprot.ps) runlibfile unprot (wrfont.ps) runlibfile wrfont_dict begin /eexec_encrypt true def /binary_CharStrings true def end save FONT findfont /Latin-CE exch addce setfont (t.ce.pfb) (w) file dup writefont closefile
restore (prfont.ps) runlibfile (t.ce.pfb) (r) file .loadfont /Latin-CE DoFont quit} if