summaryrefslogtreecommitdiff
path: root/fonts/eurosym/src/fey.mf
blob: 468655d50680c4177f05148aa99c39f41de9dad0 (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
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
% Euro symbol for TeX.
%
% History
%  Version 1.4:
%   - correct width
%  Version 1.3:
%   - Licence
%  Version 1.2:
%   - Recieved a gif file containing the official construction of the
%     Euro symbol from Rowland.
%   - Andreas Schwab told me why the checksum mismatches didn't work
%     Unfortunately I couldn't make his patch work so I had to fix
%     this myself although some other things were in there (modes.mf
%     etc.)
%
%  Version 1.1:
%   - finished sometime on August 1998
%
% Design size: 10pt

% Richtmaße (set up in the top level file):
%scaleunit:= 0.425;
  % to be able to enlarge, shrink easily
  % the number here is obtained by comparison with the cmr `C' character.

% this is from c't magazine 11/98, S.211.
% Some things are guessed from the construction.

%firstunit#:= scaleunit * pt#;
%overunder#:= 0.4firstunit#;

unit#:= firstunit# + overunder#;                   % line width is 1:
radiusaussen#:= 6unit#;

% for adjustment settings at special sizes:
hintpt:= 0.415106;  % hppp bei 1pt @ 300dpi
% I noticed the following things to be fixed at small hppp's:
%   - 14.4pt @ 300dpi (7pt @ 600dpi): the bars are too thin
%   - 12pt   @ 300dpi (6pt @ 600dpi): the bars are too close together
%   - 6pt    @ 300dpi: the bars are too thin

def isabout(expr a, b)= (((a/b) < 1.1) and ((a/b) > 0.9)) enddef;

boolean thickenbars;
boolean spacebars;
thickenbars:= isabout (hppp, 14.4hintpt) or isabout (hppp, 6hintpt);
spacebars:=   isabout (hppp, 12hintpt);

bold#= if boldamount>0: 0.5 else: 0.0 fi unit#;
radiusinnen#:= 5unit# - bold#;
olineo#:=  1.5unit# + bold#;
olineu#:=  0.5unit#;
ulineo#:= -0.5unit#;
ulineu#:= -1.5unit# - bold#;

bigangle= 80;

em#:= 15unit#;
ex#:= 2radiusaussen# - overunder#;

eurowidth#:= 0.832em#;
euroheight#:= 1ex#;
eurodepth#:= overunder#;

if doslant:
  slant:= 1/6;
else:
  slant:= 0;
fi

font_quad           1em#;
font_normal_space   1/2em#;
font_normal_stretch 1/3em#;
font_normal_shrink  1/4em#;
font_extra_space    0unit#;
font_slant          slant;
font_x_height       1ex#;
font_coding_scheme  "U";
font_identifier     "eurosym";

message "hppp=" & str [hppp];

define_pixels (em,ex,unit,
               radiusinnen,radiusaussen,
               eurowidth,euroheight,
               bold,
               olineu, olineo, ulineu, ulineo, overunder);

pen open, hpen;
hpen= pencircle scaled 0.03unit;
if boldamount>0:
  open= pencircle scaled 0.5unit;
else:
  open= pencircle scaled 0.3unit;
fi

def drawit (expr a) =
  if dooutline:
    pickup open;
    draw(a);
  else:
    fill(a);
  fi
enddef;

def overdraw (expr a, b, c, d, x, y) =
  draw ((a shifted ((b-a)*d))--(a shifted ((b-a)*c))) shifted (x,y);
enddef;

path baro, baru;
path thepath;
pair refleft, refright;

beginchar(0,eurowidth#,euroheight#,eurodepth#);
  "reference euro glyph with wrong bounding box";
% This is for the designer who wants to see the symbol's construction.

% took some time to see that circles are specified by diameter instead of radius:
  z0= (1/2em+9/16unit, radiusaussen-overunder);
  x0:= good.x (x0);
  y0:= good.y (y0);

  path innerring;  innerring= fullcircle scaled 2radiusinnen shifted z0;
  path outerring;  outerring= fullcircle scaled 2radiusaussen shifted z0;
  % angles start at 3 o'clock, so:
  numeric bigangleup;    bigangleup   =   1/2bigangle;
  numeric bigangledown;  bigangledown = - 1/2bigangle;
  path pa;
  pa= (z0 shifted (left scaled eurowidth)) -- (z0 shifted (right scaled eurowidth));

  t1=  ypart ((z0--(z0 shifted ((dir bigangleup)   scaled eurowidth))) intersectiontimes innerring);
  t2=  ypart ((z0--(z0 shifted ((dir bigangledown) scaled eurowidth))) intersectiontimes innerring);
  t3=  ypart ((z0--(z0 shifted (down scaled eurowidth))) intersectiontimes outerring);
%  t14= ypart ((z0--(z0 shifted (right scaled eurowidth))) intersectiontimes outerring);
  z1=  point t1 of innerring;
  z2=  point t2 of innerring;
  z3=  point t3 of outerring;
%  z14= point t14 of outerring;  This wasn't right.

  path pb, pc, paoo, pao, pau, pauu;
  pb= z3--(z3+((z1-z3) scaled 2));
  pc= z1--(z1 shifted (down scaled euroheight));

  t4= ypart (pb intersectiontimes outerring);
  t5= ypart (pc intersectiontimes outerring);
  z4= point t4 of outerring;
  z5= point t5 of outerring;

  %  path innerh;
  %  path outerh;
  %  innerh= subpath (t1, t2) of innerring;
  %  outerh= subpath (t4, t5) of outerring;
  paoo= pa shifted (0, olineo);
  pao=  pa shifted (0, olineu);
  pau=  pa shifted (0, ulineo);
  pauu= pa shifted (0, ulineu);

  t6= ypart (paoo intersectiontimes pb);
  t7= ypart (pao  intersectiontimes pb);
  t8= ypart (pau  intersectiontimes pb);
%  t9= ypart (pauu intersectiontimes pb);
  z6= point t6 of pb;
  z7= point t7 of pb;
  z8= point t8 of pb;
%  z9= point t9 of pb; % Better sollution:

% I had problems with straightforward approaches to overcome the problem of
% bad looking bars with small sizes.  The complicated approach works in two
% steps.  a) calculate the intersections with the exact positions of the bars,
% b) recalculate he end positions of the bars using good.y().

% Step a):
  z9-z8= z7-z6;

  z11= z0 shifted (-2unit - radiusaussen, olineu);
  z13= z0 shifted (-2unit - radiusaussen, ulineu);
  z10-z11= z6-z7;
  z12-z13= z8-z9;

  t15= ypart ((z6 -- z10) intersectiontimes innerring);
  t16= ypart ((z7 -- z11) intersectiontimes innerring);
  t17= ypart ((z8 -- z12) intersectiontimes innerring);
  t18= ypart ((z9 -- z13) intersectiontimes innerring);
  t19= ypart ((z6 -- z10) intersectiontimes outerring);
  t20= ypart ((z7 -- z11) intersectiontimes outerring);
  t21= ypart ((z8 -- z12) intersectiontimes outerring);
  t22= ypart ((z9 -- z13) intersectiontimes outerring);

  z15= point t15 of innerring;
  z16= point t16 of innerring;
  z17= point t17 of innerring;
  z18= point t18 of innerring;
  z19= point t19 of outerring;
  z20= point t20 of outerring;
  z21= point t21 of outerring;
  z22= point t22 of outerring;
  z23= z0 shifted (-radiusaussen,0);

% Step b):
  y10:= y19:= y15:= y6:= good.y (y6 if thickenbars or spacebars: +0.5 fi);
  y11:= y20:= y16:= y7:= good.y (y7 if spacebars: +0.5 fi);
  y12:= y21:= y17:= y8:= good.y (y8);
  y13:= y22:= y18:= y9:= y8 + (y7-y6);

% Construct the path.  This is more complicated now, too.  We use tX for the
% intersection times /and/ zX for the end points.
  thepath= (subpath (t1, t15) of innerring --
           z15 -- z6 -- z7 -- z16 --
           subpath (t16, t17) of innerring --
           z17 -- z8 -- z9 -- z18 --
           subpath (t18, t2) of innerring --
           z2 -- z5 --
           subpath (t5, t22) of outerring --
           z22 -- z13 -- z12 -- z21 --
           subpath (t21, t20) of outerring --
           z20 -- z11 -- z10 -- z19 --
           subpath (t19, t4) of outerring --
           z4 -- cycle) slanted slant;
  baro= (z6 -- z7 -- z11 -- z10 -- cycle) slanted slant;
  baru= (z8 -- z9 -- z13 -- z12 -- cycle) slanted slant;
  refleft=  z13;
  refright= z4;

  drawit(thepath);
  penlabels (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);

  pickup hpen;
  overdraw (z0, z1, 1.5, 0, 0, 0);
  overdraw (z0, z2, 1.5, 0, 0, 0);
  overdraw (z0, z3, 1.5, -1.5, 0, 0);
  overdraw (z0, z3, 1.5, -1.5, x13-x3, 0);
  overdraw (z0, z3, 1.5, -1.5, x12-x3, 0);
  overdraw (z0, z3, 1.5, -1.5, x23-x3, 0);
  overdraw (z1, z2, 1.5, 0, 0, 0);
  overdraw (z3, z1, 1.5, -0.2, 0, 0);
  overdraw (z3, z1, 1.5, -0.2, x13-x9, 0);
  overdraw (z3, z1, 1.5, -0.2, x11-x7, 0);
endchar;

% Now the real symbols, the first one is for design purposes only and
% could be deleted in the real fonts.  I want to use the paths to
% define the bounding box so Metafont has to calculate them first.
% But I also want to see the penlabels.

% realwidth was once dependent on the resolution, so checksum mismatches
% occur.  Thanks to Andreas Schwab for telling me the reason for
% those mismatches.  This fixes the problem.
%
% A bold correction is added as well.  This is more or less a hack,
% since the width of the Euro symbol character is not necessarily
% equal to the dimensions of the glyph itself.  However, I didn't
% find any specifications.  Until I do, this is the best hack I
% think.
%realwidth= (xpart refright-xpart refleft)/hppp;
realwidth= (2radiusaussen#-10/30bold#) + 0.22unit#;
pair shift; shift= (xpart (-refleft), 0);

% However, these are the real characters:
beginchar(" ",realwidth,euroheight#,eurodepth#); "Space";
  % dunno why. A Space with the dimensions of a Euro symbol
endchar;

%  fill innerh -- reverse outerh -- cycle;
%  fill z10 -- z6 -- z7 -- z11 -- cycle;
%  fill z12 -- z8 -- z9 -- z13 -- cycle;

% The official symbol ``Euro glyph''.
beginchar("e", realwidth, euroheight#,eurodepth#); "Euro glyph";
  drawit(thepath shifted shift);
endchar;

% only the bars for creating symbols with any other font:
beginchar("A", realwidth, euroheight#,eurodepth#); "Euro glyph bars (normal)";
  drawit(baro shifted shift);
  drawit(baru shifted shift);
endchar;

% same as before but only 80% wide; most of the fonts' C's are less wide
% than the Euro glyph.
beginchar("B", realwidth, euroheight#,eurodepth#); "Euro glyph bars (narrow)";
  drawit(baro shifted shift xscaled 0.8);
  drawit(baru shifted shift xscaled 0.8);
endchar;

% same as before but only 110% wide
beginchar("C", realwidth, euroheight#,eurodepth#); "Euro glyph bars (wide)";
  drawit(baro shifted shift xscaled 1.2);
  drawit(baru shifted shift xscaled 1.2);
endchar;