1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
% Copyright (C) 2001-2018 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., 1305 Grant Avenue - Suite 200, Novato,
% CA 94945, U.S.A., +1(415)492-9861, for further information.
%
% Initialization file for Type 32 fonts.
% ------ Type 32 fonts ------ %
% We need LanguageLevel 2 or higher in order to have defineresource.
languagelevel dup 2 .max .setlanguagelevel
/BitmapFontInit mark
/.makeglyph32 systemdict /.makeglyph32 get
systemdict /.makeglyph32 .undef
/addglyph { % ([wx wy llx lly urx ury] |
% [w0x w0y llx lly urx ury w1x w1y vx vy])
% <bitmap> <cid> <type32font> addglyph -
1 index dup 2 index .removeglyphs
22 string .makeglyph32
% Stack: metrics bitmap cid font metstr
3 index () ne {
% Use G4 encoding to compress the bitmap.
% Define a string large enough to hold the metrics,
% an uncompressed bitmap (worst case = 5x expansion),
% and the 2 RTC codes (3 bytes).
dup length 4 index length 5 mul add 10 add
65535 .min string
% Stack: metrics bitmap cid font metstr buffer
dup 0 3 index putinterval
dup 2 index length 1 index length 1 index sub getinterval
% Stack: metrics bitmap cid font metstr buffer bitbuf
mark /Columns 8 index dup 4 get exch 2 get sub
/Rows 10 index dup 5 get exch 3 get sub
/K -1 /EndOfBlock //true /BlackIs1 //true
.dicttomark /CCITTFaxEncode filter
% Stack: metrics bitmap cid font metstr buffer filter
dup 6 index writestring closefile
% Find the end of the data by scanning backwards for the RTC.
% There are 2 RTCs x 12 bits = 3 bytes to remove.
{
dup dup length 1 sub get 0 ne { exit } if
0 1 index length 1 sub getinterval
} loop
0 1 index length 3 sub getinterval
exch pop % metstr
} if
1 index /CharStrings get 3 index 3 -1 roll put
pop pop pop pop
} obind
/removeall { % <type32font> removeall -
0 65535 2 index removeglyphs pop
} obind
/.removeglyphs systemdict /.removeglyphs get
systemdict /.removeglyphs .undef
/removeglyphs { % <cid_min> <cid_max> <type32font> .removeglyphs -
3 copy .removeglyphs
dup /CharStrings get dup {
% Stack: cidmin cidmax font CharStrings cid bitmap
pop dup 5 index ge { dup 4 index le { 2 copy undef } if } if pop
} forall pop pop pop pop
} obind
.dicttomark /ProcSet defineresource pop
/.cidfonttypes where { pop } { /.cidfonttypes 6 dict def } ifelse
.cidfonttypes begin
4 % CIDFontType 4 = FontType 32
{ dup /FontType 32 .forceput
dup /CharStrings 20 dict .forceput
1 index exch .buildfont32 exch pop
} .bind executeonly def % must be bound and hidden for .forceput
end % .cidfonttypes
% Define the BuildGlyph procedure.
% Since Type 32 fonts are indexed by CID, there is no BuildChar procedure.
% The name %Type32BuildGlyph is known to the interpreter.
(%Type32BuildGlyph) cvn { % <font> <cid> %Type32BuildGlyph -
1 index /CharStrings get
% Stack: font cid CharStrings
dup 2 index .knownget {
exch pop
} {
0 .knownget not {
exch pop % Stack: cid
.getshowoperator /invalidfont signalerror
} if
} ifelse
% Stack: font cid cstr
dup //.getmetrics32 % use // because of .undef below
dup 14 gt {
8 index 8 index 13 3 roll setcachedevice2
} {
4 index 4 index 9 3 roll setcachedevice
} ifelse
% Stack: font cid cstr w h nmetrics llx lly
6 -1 roll 4 -1 roll 1 index length 1 index sub getinterval
% Stack: font cid w h llx lly bitstr
dup () eq {
pop pop pop
} {
mark /Columns 6 index /Rows 7 index /K -1 /EndOfBlock //false /BlackIs1 //true
.dicttomark /CCITTFaxDecode filter 4 index 4 index //true
% Stack: font cid w h llx lly filter w h //true
[ 1 0 0 1 11 -2 roll exch neg exch neg ] 5 -1 roll imagemask
} ifelse
pop pop pop pop
} .bind def
systemdict /.getmetrics32 .undef
buildfontdict 32 /.buildfont32 cvx put
32 dup /FontType defineresource pop
.setlanguagelevel
|