summaryrefslogtreecommitdiff
path: root/fonts/capbas/mftools.mf
blob: 0be43c14e3d635170de8e122e95886df4bc21bd7 (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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
%%% @mffile{
%%%     filename="mftools.mf",
%%%     version="",
%%%     date="",
%%%     filetype="mf inputfile",
%%%     package="m-capbas.arj"
%%%     author="Phons Bloemen (PhB)",
%%%     address="Eindhoven U. of Technology,
%%%            Fac. of Electrical Engineering,
%%%            P. O. Box 513, NL-5600 MB Eindhoven
%%%     email="Internet: phons@ei.ele.tue.nl",
%%%     codetable="ISO/ASCII",
%%%     checksumtype="none",
%%%     checksum="0",
%%%     keywords="",
%%%     abstract="Metafont file containing a collection of
%%%        macros to do various funny things to characters.
%%%        Usage: copy a standard font file ('cmtt10.mf') and
%%%        paste a copy of the 'endchar' function from 'plain.mf'
%%%        into it. Edit the 'endchar' function to your wishes
%%%        using these macros. The macros work on the already
%%%        rendered characters before they are stored into the
%%%        font. Let METAFONT run and watch the results!
%%%        Examples of changed 'endchars' in cmbugs.mf and cmgray.mf
%%%        Part of Capital Baseball package"
%%%     copyright="Copyleft (L) Phons Bloemen (PhB),
%%%        according to GNU public licence version 2 or later.
%%%        (1) Do not change this file (even its name)
%%%        (2) if you do make changes, first rename it to some
%%%            other name, and mark your changes clearly.",
%%%     }
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% To 'outline' a picture. Only the 'edge' of a picture remains.
% Thickness of edge controlled by 'th'.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def ooutline (expr th) =
   save v,n;
   cull currentpicture keeping (1,infinity);
   picture v; v:= currentpicture;
   clearit;
   for n = 0 step 45 until 359:
       addto currentpicture also (v shifted ((0,th) rotated n));
       addto currentpicture also -v;
       cull currentpicture keeping (-infinity,-1) withweight -1;
   endfor;
   cull currentpicture keeping (-infinity,-1);
enddef;

def outline (expr th) =
   begingroup;
   save v,n;
   cull currentpicture keeping (1,infinity);
   picture v; v:= currentpicture;
   clearit;
   for n = 0 step 24 until 359:
       addto currentpicture also (v shifted ((0,th) rotated n));
   endfor;
   cull currentpicture keeping (1,infinity);
   addto currentpicture also -v;
   endgroup;
enddef;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% To 'double outline' a picture, with a surrounding line.
% Parameter tha controls the thickness of the surrounding line,
% parameter thb-tha controls the distance between line and picture
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def douboutline (expr thb,tha) =
   begingroup;
   save va,vb;
   picture va,vb; va:=currentpicture;
   outline(tha);
   vb := currentpicture;
   currentpicture := va;
   outline(thb);
   addto currentpicture also va - vb;
   cull currentpicture keeping (1,infinity);
   endgroup;
enddef;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% gentile: generate a tiling pattern
% A pattern of tiles is generated, large enough to cover any
% character in the font. One tile is k*l 'units' long. The units
% are numbered 0 -- (k*l)-1. On the units listed in 't', a dot is
% put down with the pencil typed by 'potlood'. The parameters
% 'ww,hh,dd' outline the largest character in the font.
% Use the gentile macro before doing anything with the font, and
% save the resulting tiling pattern in a separate 'picture'
% variable. This picture variable can then be used by 'tilepic'.
% Parameters:
%   ww: base width of the font (width of letter 'M')
%   hh: base height of font (height of capitals)
%   dd: base depth of font (depth of descenders)
%   k, l: the tile consists of k x l 'pixels'
%   gr: granularity factor. The 'currentpicture' is divided into
%       1/gr x 1/gr pixels, the pixels are grouped together to tiles.
%       A pixels will be of size (w*gr * (h+d)*gr). Low values
%       mean finer patterns, but they consume a lot of Metafonts
%       resources, and may be subject to 'discretization'
%       problems. A big metafont can handle about gr=0.001.
%   potlood: A pencil type. Usually a circular tip.
%   t: a list of numbers, indicating        0,1,2
%      the dots in a tile. A 3 x 3          3,4,5
%      tile is numbered like this:          6,7,8
%      Other tile sizes have similar numberings.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def gentile(expr gr,k,l,ww,hh,dd,potlood,pict)(text t) =
begingroup
   mode_setup;
   charcode:=0;
   charwd:=ww;
   w:=hround(charwd*hppp);
   charht:=hh;
   h:=vround(charht*hppp);
   chardp:=dd;
   d:=vround(chardp*hppp);
   charic:=0; clearxy; clearit; clearpen; scantokens extra_beginchar;
   pickup potlood xscaled (gr*w/1) yscaled(gr*(h+d)/1);
   for c = t :
      drawdot((c mod k)*gr*w,floor(c/k)*gr*(h+d)-d);
      cull currentpicture keeping (1,infinity) withweight 1;
   endfor;
   for a=1,2,4,8,16,32,64,128,256,512,1024,2048:
      exitif ((a * gr * l) > 1);
      b := (a*gr*l*(h+d));
      addto currentpicture also currentpicture shifted (0,b);
      cull currentpicture keeping (1,infinity) withweight 1;
   endfor;
   for a=1,2,4,8,16,32,64,128,256,512,1024,2048:
      exitif ((a * gr * k) > 1);
      b := (a*gr*k*w);
      addto currentpicture also currentpicture shifted (b,0);
      cull currentpicture keeping (1,infinity) withweight 1;
   endfor;
   groundpattern := currentpicture;
   scantokens extra_endchar;
   chardx:=w;     % desired width of the character in pixels
   pixels_per_inch:=pixels_per_inch/mag;
                  %%% otherwise magnification is squared
endgroup;
enddef;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% The current picture is overlaid by a tiling pattern 'til'. The
% pattern may be generated with 'gentile'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def tilepic (expr til) =
   cull currentpicture keeping (1,infinity) withweight 1;
   addto currentpicture also til shifted (0,-d);
   cull currentpicture keeping (2,infinity) withweight 1;
enddef;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% As tilepic, but the current picture is first 'outlined': it
% will become patterned with tile pattern 'til', and with black
% edges. The parameter 'th' controls edge thickness
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def otilepic (expr til,th)=
   save v,n;
   cull currentpicture keeping (1,infinity);
   picture v; v:= currentpicture;
   clearit;
   for n = 0 step 24 until 359:
       addto currentpicture also (v shifted ((0,th) rotated n));
   endfor;
   cull currentpicture keeping (1,infinity);
   cull v keeping (1,infinity) withweight -1;
   addto v also currentpicture;
   addto currentpicture also til shifted (0,-d);
   cull currentpicture keeping (2,2);
   addto currentpicture also v;
   cull currentpicture keeping (1,infinity);
enddef;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% xmirror and ymirror
% Mirrors a picture. This is done around the central vertical
% (horizontal) axis of the character: the line x=.5w (y=.5h)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def xmirror =
   save v,n,t;
   t := tracingequations;
   tracingequations := 1;
   cull currentpicture keeping (1,infinity);
   picture v; v:= currentpicture;
   clearit;
   currentpicture := v reflectedabout ((0,0), (0,h))
                  shifted (w,0);
enddef;

def ymirror =
   save v,n,t;
   t := tracingequations;
   tracingequations := 1;
   cull currentpicture keeping (1,infinity);
   picture v; v:= currentpicture;
   clearit;
   currentpicture := v reflectedabout ((0,0), (w,0))
                  shifted (0,h);
enddef;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% reversevideo
% Inverts a picture. The outer boundary is assumed to be
% rectangular. A box of width w (character width) and
% height h + d. Here w,h,d are defined by 'beginchar'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def reversevideo =
   begingroup;
   save vv,v; picture v,vv;
   cull currentpicture keeping (1,infinity);
   v:= currentpicture;
   clearit;
   fill (0,h)--(w,h)--(w,-d)--(0,-d)--cycle;
   cull currentpicture keeping (1,infinity);
   vv:=currentpicture-v;
   currentpicture:=vv;
   endgroup;
enddef;