summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlgs/Resource/Init/gs_typ32.ps
blob: 4c2035c70ad5c6128a6bdf5f60d445cb83f0edb8 (plain)
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
134
135
136
137
% Copyright (C) 2001-2021 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
/CIDFontType4
{
  dup /FontType 32 .forceput
  dup /CharStrings 20 dict .forceput
  1 index exch .buildfont32 exch pop
} .bind executeonly odef
.cidfonttypes begin


4 /CIDFontType4 load def % CIDFontType 4 = FontType 32

end		% .cidfonttypes
currentdict /CIDFontType4 .forceundef

% 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