summaryrefslogtreecommitdiff
path: root/ogonkify/compose.ps
diff options
context:
space:
mode:
Diffstat (limited to 'ogonkify/compose.ps')
-rw-r--r--ogonkify/compose.ps185
1 files changed, 185 insertions, 0 deletions
diff --git a/ogonkify/compose.ps b/ogonkify/compose.ps
new file mode 100644
index 0000000..1d42aee
--- /dev/null
+++ b/ogonkify/compose.ps
@@ -0,0 +1,185 @@
+%!
+% Add composite (i.e. accented) characters to any font
+% By J. Chroboczek <jec@dcs.ed.ac.uk>
+%
+% -- code follows this line --
+%%BeginResource: procset compose 0.8 0
+% Copyright (c) 1996-1999 by J. Chroboczek
+% This code may be distributed under the terms of the
+% GNU Public License, either version 3 of the license, or (at your
+% option) any later version.
+/makeCompositeDict 20 dict def
+makeCompositeDict begin
+/nameUnique { % name nameUnique namexxxxxx
+ dup length exch 1 index string cvs % length (name)
+ 1 index 12 add string dup % length (name) (...) (...)
+ 3 2 roll 0 exch putinterval % length (name...)
+ dup 3 2 roll
+ rand 12 string cvs
+ putinterval
+} bind def
+
+/doMakeComposite
+{
+ /compositeChars exch def
+ /targetEncoding exch def
+ /baseEncoding exch def
+ /newfontname exch def
+ /oldfontname exch def
+ /oldfont oldfontname findfont def
+ /newfont 20 dict def
+ /oldFontMatrix oldfont /FontMatrix get def
+ /oldFontBBox oldfont /FontBBox get cvlit def
+ /oldfontcopy oldfont length dict def
+
+ newfont begin
+ /FontType 3 def
+ /PaintType 0 def % not used
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /FontBBox
+ [
+ oldFontBBox 0 get oldFontBBox 1 get
+ oldFontMatrix transform
+ [1000 0 0 1000 0 0] transform
+ oldFontBBox 2 get oldFontBBox 3 get
+ oldFontMatrix transform
+ [1000 0 0 1000 0 0] transform
+ ] cvx def
+
+ /StrokeWidth 0 def % not used
+
+ /Encoding targetEncoding def
+
+ /Decoding 256 dict def % invert base encoding vector
+ Decoding begin
+ 0 1 255
+ { dup baseEncoding exch get exch def } bind for
+ end
+
+ newfont /compositeChars compositeChars put
+
+ /FontName newfontname def
+
+% make a copy of the original font, reencoding it
+ oldfont
+ oldfontcopy begin
+ {1 index /FID ne
+ {def}
+ {pop pop} ifelse
+ } bind forall
+ end
+ oldfontcopy /Encoding baseEncoding put
+ oldfontname nameUnique oldfontcopy definefont
+ 1000 scalefont /OriginalFont exch def
+
+ /BuildChar % newfont n BuildChar -
+ {
+ exch begin % n
+ /OriginalFont load setfont
+ /Encoding load exch get % glyphName
+ /compositeChars load dup
+ 2 index known % glyphName compositeChars known-p
+ { 1 index get % glyphName [ 65 x y 129 ]
+ dup 0 get ( ) dup % glyphName [...] 65 ( ) ( )
+ 0 3 index put % glyphName [...] 65 (A)
+ dup stringwidth setcharwidth
+ 0 0 moveto
+ show pop % glyphName [...]
+ dup 1 get 1 index 2 get % glyphName [...] x y
+ moveto % glyphName [...]
+ 3 get ( ) dup 3 2 roll % glyphName ( ) ( ) 129
+ 0 exch put % glyphName (')
+ show % glyphName
+ }
+ { pop
+ /Decoding load % glyphName Decoding
+ dup 2 index known % glyphName Decoding known-p
+ { exch get }
+ { pop pop 0 } ifelse % n'
+ ( ) dup 0 3 index put dup % n' (A) (A)
+ stringwidth setcharwidth
+ 0 0 moveto
+ show % n'
+ } ifelse
+ pop
+ end
+ } bind def
+ end % newfont
+ newfontname newfont definefont pop
+} def % doMakeComposite
+
+/fillEuro { % w h --
+ gsave exch 1000 div exch 1000 div scale
+ 955.852 232.172 moveto
+ 904.495 180.815 lineto
+ 829.454 117.848 734.626 83.333 636.667 83.333 curveto
+ 406.667 83.333 220 270 220 500 curveto
+ 220 730 406.667 916.667 636.667 916.667 curveto
+ 759.831 916.667 876.684 862.177 955.852 767.828 curveto
+ 988.474 855.291 lineto
+ 894.851 947.996 768.422 1000 636.667 1000 curveto
+ 360.667 1000 136.667 776 136.667 500 curveto
+ 136.667 224 360.667 0 636.667 0 curveto
+ 753.23 0 866.13 40.725 955.852 115.135 curveto
+ closepath fill
+
+ 869.037 541.667 moveto
+ 901.025 625 lineto
+ 31.989 625 lineto
+ 0 541.667 lineto
+ closepath fill
+
+ 805.059 375 moveto
+ 837.048 458.333 lineto
+ 31.989 458.333 lineto
+ 0 375 lineto
+ closepath fill
+ grestore
+} bind def
+
+/makeEuroCharstring { % w h -- charstring
+ [ /pop cvx % w h mark pop
+ 3 index 0 0 0 % w h mark pop w 0 0 0
+ 7 index 7 index /setcachedevice cvx
+ % w h mark pop w 0 0 0 w h setcachedevice
+ 10 index 10 index /fillEuro load /exec cvx ]
+ cvx bind 3 1 roll pop pop
+} def
+
+/doEurifyFont { % oldname newname --
+ exch
+ findfont dup dup % newname dict dict dict
+ /FontMatrix get matrix invertmatrix % newname dict dict m
+ {} forall pop pop [ 5 1 roll 0 0] makefont setfont % newnamedict
+ 0 0 moveto
+ (5) stringwidth pop % newname dict w
+ (M) false charpath pathbbox 4 1 roll pop pop pop % newnamedict w h
+ 3 2 roll % newname w h dict
+
+ dup length dict dup 3 1 roll begin % newname w h newdict
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ CharStrings dup length 1 add dict dup 3 1 roll begin % newnamew h newdict newdict'
+ {def} forall
+ /Euro % newname w h newdict newdict' /Euro
+ 4 index 4 index makeEuroCharstring def
+ end % newname w h newdict newdict'
+ /CharStrings exch def
+ end
+ 3 1 roll pop pop % newname dict
+ definefont pop
+} bind def
+
+end % makeCompositeDict
+
+% oldfontname newfontname baseEncoding targetEncoding compositeChars --
+/makeComposite
+{
+ makeCompositeDict begin doMakeComposite end
+} bind def
+
+% oldfontname newfontname
+/eurifyFont
+{
+ makeCompositeDict begin doEurifyFont end
+} bind def
+%%EndResource