summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/fonts/source/public/ibycus/ibyacc4.mf
blob: a8acfae64d306c64f1747a35bcf8e2654663e699 (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
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
% Make sure the macros we want to replace are loaded
if unknown gen_acc : readfrom("gen_acc") fi
numeric doing_u; doing_u=0; % flag to position diaeresis

def rough(suffix $,@)(expr dot_size,depth,shear) =
 pickup fine.nib; pos$(dot_size,90);
 if square_dots: pos$'(dot_size,180); z$'=z$; dot($',$);  % squarish dot
  comma_join_:=max(fine.breadth,floor .7dot_size);
  comma_bot_:=max(fine.breadth,floor .5dot_size);
  pos@0(comma_join_,180); pos@1(comma_join_,180);
  pos@2(comma_bot_,180); y@0=y$; y@1=y$l; y@2=y@1+dot_size-depth;
  x@0r=x@1r=x$'r; lft x@2r=good.x(x$-eps);
  filldraw stroke z@0e--z@1e..z@2e;  % tail
 else: pos@1(vair,90); pos@2(vair,180); pos@3(vair,-90);
  z@1r=z$r; y@1l:=y$; lft x@2r=hround(x$-.5depth+.5shear);
  x@3+.5vair=x$+.5dot_size+shear;
  y@2=.5[y@1,y@3]; bot y@3r=vround(top y@1r-depth);
  % position a vertical path through the left side of the bulb
  x@1'=x@1-.5dot_size;
  % At the intersection of that path with SL's tail, get the direction
  pair d@@; d@@=( direction
    (xpart( (z@2{down}...z@3) intersectiontimes ((x@1',0){up}--(x@1',y@1)))) 
    of (z@2{down}...z@3));
  % Tilt a pen at a right angle to that direction
  pos@3'(vair,angle(d@@)-90);
  % Place it at the intersection.  This will be the new end of the tail.
  z@3'=directionpoint d@@ of(z@2{down}...z@3); 
  y_:=ypart((z@1{left}...z@2{down}...z@3)
   intersectiontimes (z$l{left}..{right}z$r)); if y_<0: y_:=1; fi
  filldraw z$r{right}..subpath (0,y_) of (z$l{left}..{right}z$r)--cycle; % dot
  filldraw stroke z@1e{left}...z@2e{down}...{d@@}z@3'e; fi  % tail
 penlabels(@1,@2,@3); enddef;
     
def smooth(suffix $,@)(expr dot_size,depth,shear) =
 pickup fine.nib; pos$(dot_size,90);
 if square_dots: pos$'(dot_size,0); z$'=z$; dot($',$);  % squarish dot
  comma_join_:=max(fine.breadth,floor .7dot_size);
  comma_bot_:=max(fine.breadth,floor .5dot_size);
  pos@0(comma_join_,0); pos@1(comma_join_,0);
  pos@2(comma_bot_,0); y@0=y$; y@1=y$l; y@2=y@1+dot_size-depth;
  x@0r=x@1r=x$'r; rt x@2r=good.x(x$-eps);
  filldraw stroke z@0e--z@1e..z@2e;  % tail
 else: pos@1(vair,90); pos@2(vair,0); pos@3(vair,-90);
  z@1r=z$r; y@1l:=y$; rt x@2r=hround(x$+.5depth+.5shear);
  x@3-.5vair=hround(x$-.5dot_size+shear);
  y@2=.5[y@1,y@3]; bot y@3r=vround(top y@1r-depth);
  path pp; pp = (z@2{down}...z@3);
  % position a vertical path through the right side of the bulb
  x@1'=x@1+.5dot_size;
  % At the intersection of that path with SL's tail, get the direction
  pair d@@; d@@=( direction
    (xpart( (z@2{down}...z@3) intersectiontimes ((x@1',0){up}--(x@1',y@1)))) 
    of (z@2{down}...z@3));
  % Tilt a pen at a right angle to that direction
  pos@3'(vair,angle(d@@)+90);
  % Place it at the intersection.  This will be the new end of the tail.
  z@3'=directionpoint d@@ of(z@2{down}...z@3); 
  y_:=ypart((z@1{right}...z@2{down}...z@3)
   intersectiontimes (z$l{right}..{left}z$r)); if y_<0: y_:=1; fi
  filldraw z$r{left}..subpath (0,y_) of (z$l{right}..{left}z$r)--cycle; % dot
  filldraw stroke z@1e{right}...z@2e{down}...{d@@}z@3'e; fi  % tail
 penlabels(@1,@2,@3); enddef;
     

% Improve spacing with sprit plus accent groups.
% The original spacing was governed by the placement of the accent.
% One of the variables set the position of the accent bottom .5stem
% to the right of center (plus other adjustments).  By increasing this 
% to 1.2stem, we get the accent still within the set-width, but far enough
% right that the breathings (which are placed relative to the bottom
% of the accent) can be pulled to the left by .7stem.  
% This ensures that there will be more than a stem width between
% any element of breathing and any element of either acute or
% grave.

vardef spirit_acute(expr center) text type =
numeric sp_bottom, sp_height;
sp_bottom=h-sp_height=max(.8[h,x_height],x_height+o+separator);
numeric dot_diam#; dot_diam# = 3/4dot_size#;
define_whole_blacker_pixels(dot_diam);
dot_diam:=max(fine.breadth,min(dot_diam,floor(2/3sp_height)));
if serifs: x21-x22=1/6w;
 x21+.5stem=hround(center+.25u+.5vair+(x21-x22)+1.2stem); %lft x22r ~ center+.25u
else: rt x21r=hround (4/5w+.5stem); lft x22l=hround(center+.25u); fi
 begingroup;
  numeric saved_h;
  numeric saved_x_height;
  saved_x_height = x_height;
  saved_h=h;
  save h;
  save x_height;
  h=saved_h + .75vair;
  x_height = saved_x_height + .3vair;
generate_grave; penlabels(21,22);
  endgroup;
if 1type0: %spirit and accent separated by .1u (rough) or .25u (smooth)
 x31=hround(lft x22 if serifs:r-.5sp_height else:l-.5dot_diam fi -.7stem -.25u);
else: x31+.5dot_diam=hround(lft x22 if serifs:r else: l fi -.7stem-.1u); fi
y31+.5dot_diam=h;
if1type0:smooth else:rough fi (31,a,dot_diam,sp_height,0);
enddef;
     

vardef spirit_grave(expr center) text type =
numeric sp_bottom, sp_height;
sp_bottom=h-sp_height=max(.8[h,x_height],x_height+o+separator);
numeric dot_diam#; dot_diam# = 3/4dot_size#;
define_whole_blacker_pixels(dot_diam);
dot_diam:=max(fine.breadth,min(dot_diam,floor(2/3sp_height)));
% x22 is set to the right of x21 by 1/6w.  The tilt is only 1/6w here.
% x21 is set out to the right of the midpoint by the sum of .5stem and 
% .25u.  Let's try a full stem width
%if serifs: x22-x21=1/6w; x21-.5stem=hround(center+.25u);
if serifs: x22-x21=1/6w; x21-1.2stem=hround(center+.25u);
else: rt x22r=hround (4/5w+.5stem); lft x21l=hround(center+.25u); fi
 begingroup;
  numeric saved_h;
  numeric saved_x_height;
  saved_x_height = x_height;
  saved_h=h;
  save h;
  save x_height;
  h=saved_h + .75vair;
  x_height = saved_x_height + .3vair;
generate_grave; penlabels(21,22);
  endgroup;
% In the original, the following spacing adjustments tracked |spirit_acute|.
% This was wrong way round.  When the accent is barytone, lft x21l is nowhere
% near the left edge of the picture, and the crowding effect is the reverse
% of what it is with the oxytone accent.  Added an extra .15u to make
% up for the first problem, and an extra .45u to relieve the crowding
% against the smooth breathing.  But the more general widening set up
% above is more significant. PAM, 10 May, 1997
% remember that "type" is a macro replaced by either < or >
if 1type0: %spirit and accent separated by .65u (rough) or .85u (smooth)
 x31=hround(lft x21l-.5 if serifs:sp_height else:dot_diam fi -.7stem -.45u);
else: x31+.5dot_diam=hround(lft x21l - .7stem -.65u); fi
y31+.5dot_diam=h;
%y31+dot_diam=h;
if1type0:smooth else:rough fi (31,a,dot_diam,sp_height,0);
enddef;

% Reshape the iota subscript, but only for resolutions above 600
% Thin it out so that it can have a slight hook.
% Lengthen both the simple and the refined form, so that the
% simple form drops as low as the tail of eta, and the refined form
% drops to the bottom of the shoulder.  Since we only make it up
% three times, we do not save the picture, but this means that
% all the necessary values must be known when the three iota
% subscript characters are written.  The iota subscript under
% eta will be made shorter to open a larger space under the
% right vertical stroke of eta.

def iota_sub(expr pos_stem) =
if known pic.iota:
  addto currentpicture also pic.iota shifted (hround(pos_stem),0);
else:
  picture temp_picture; temp_picture=currentpicture; clearit;
  pickup fine.nib;
  x51=0; pos51(stem,180); top y51=vround(-o-2separator);
  x52=x51; pos52(stem,180);
  % Use the original simple subscript for lower resolutions.
  if ( ((pixels_per_inch / mag) < 599) or (pixels_per_inch < 420) ) :
    bot y52=-desc_depth;
    filldraw circ_stroke z52e--z51e;
  else :
    % longer iota subscript with narrower tapering stem and slight hook
    bot y52=-iota_dp;
    pos51'(.6[hair,stem],180); pos51''(.3[hair,stem],180);
    pos52'(.3[hair,stem],270); pos53'(.2[hair,stem],0);
    x51'r = x51''r = x51r; 
    bot y52'r = -iota_dp; x53'r = x51l+hair; x52' = 1/2[x51',x53'];
    y51' = y51-separator; top y53' = 5/6[y51,y52]; 
    y51'' = -desc_depth; % y51'' = y53';
    filldraw double_circ_stroke z51'e--z51''e..z52'e..z53'e;
  fi;
% Need to make sure that this is drawn each time (it's only four times).
%%%%%  if not working_hard : picture pic.iota; pic.iota=currentpicture; fi
  currentpicture:=currentpicture shifted (hround(pos_stem),0);
  addto currentpicture also temp_picture;
fi;
enddef;

% Rewrite the width and height management of circumflex
% Put limit on horizontal spread, and give the plain
% circumflex more roll (depends on parameter circ_ht# in parameter file.)
% change the shape to supply points at the ends and a thickening at the
% center.  This is more traditional and gives more shape to the
% squeezed variant.  The ends are set to vair, and the middle to
% mid_width + vair.  (Silvio Levy's mid_width is actually quite small and
% is used at the ends as well as the mid-point.  I use it at the intermediate 
% points.  The result harmonizes well with other proportions.

def generate_circumflex(expr center,squeeze)=
numeric mid_width; mid_width=if squeeze:.1 else: .5 fi [vair,stem];
if serifs:
%pickup fine.nib; pos21(hround(mid_width-eps),180); pos22(vair,90);
% pos23(mid_width,90); pos24(vair,90); pos25(hround(mid_width-eps),180);
pickup fine.nib; pos21(hround(vair-eps),180); pos22(mid_width,90);
 pos23(mid_width+vair,90); pos24(mid_width,90); pos25(hround(vair-eps),180);
 % limit spread of circumflex while retaining scaling for narrow characters.
 lft x21r=w-rt x25l=hround (center-if(w<9u):w/3 else:3u fi); 
 x22-x21=x23-x22=x24-x23=x25-x24;
 % The "squeezed" circumflex tops out at body_height.  
 bot y21=bot y24l=vround(if squeeze:.75else:.6fi[x_height,h]-vair);
 top y22r=top y25=h; y23=.5[y22,y24];
 filldraw stroke z21e{up}...z22e{right}..z23e..{right}z24e...{up}z25e; % stroke
else:
 pos21(vair,-180); pos23(vair,0); y21=y23;
 lft x21r=hround(center-w/3); rt x23r=hround(center+w/3);
 bot y23=vround max(x_height+o+separator,
   if squeeze: 2/3 else: 1/3 fi [x_height,h]-.5mid_width);
 x22=center; pos22(mid_width,90); top y22r=h;
 filldraw stroke z21e{up}...z22e...{down}z23e;
fi
enddef;
     
% The spirit_circumflex height ( Circ_ht#) has been raised
% to give more room to the breathing under it
% Also rewrite the position of x31 below

vardef spirit_circumflex(expr center) text type=
generate_circumflex(center,true);       %variable `squeeze'
numeric sp_bottom, sp_height, sp_top, box_top;
box_top=bot if serifs: y21l else: y22l fi;
sp_top=sp_bottom+sp_height=vround(.15[box_top,x_height]);
sp_top+sp_bottom=box_top+x_height;
numeric dot_diam#; dot_diam# = 5/8dot_size#;
define_whole_blacker_pixels(dot_diam);
pickup fine.nib;
dot_diam:=max(fine.breadth,min(dot_diam,floor(2/3sp_height-eps)));
x31 if1type0:+.5dot_diam fi=hround(center);
% The code that was here was equivalent to x31=hround(center);
% By shifting x31 leftward only for the smooth breathing, we move the
% "optical center" of the smooth breathing to about where
% the "optical center" of the rough breathing is.  This relieves
% the crowding under the downcurve of the circumflex.
y31+.5dot_diam=vround(sp_top);
if1type0:smooth else:rough fi (31,a,dot_diam,sp_height,0);
penlabels(31);
enddef;
     
% Spread out the accented diareses; pull acute a bit to the left 
% and shove grave a bit to the right (1/8u in both instances).
% Raise the accent slightly, and shorten it by changing
% h and x_height within a save group. 10 May, 1997.
% The angle of the accent is governed by the width of iota, since
% this gives the cleanest association of accent and diaeresis.
% The older calculation depended on the width of the underlying character,
% which flattens out the angle and makes the accent crowd the dot it
% is closest to.
% An adjustment is required to raise the dots away from the tips
% of the upsilon.  Once they are spaced out, they bleed into the
% character.  This undoes much of the effect of the raising of
% the accent mentioned above, but since prau+ is about the only
% even slightly common root with a upsilon diaeresis, this does not
% too much matter.

vardef diaeresis_acute(expr center)=
  if serifs: x21-x22=1.25u; x21+.5stem=hround(center+5/6(x21-x22)+.5stem-1/8u);
  else: rt x21r=hround (3.75u+.5stem); lft x22l=hround(center-.5vair); fi
  begingroup;
  numeric saved_h;
  numeric saved_x_height;
  saved_x_height = x_height;
  saved_h=h;
  save h;
  save x_height;
  h=Circ_ht;
  x_height = saved_x_height + 1.5(h - saved_h);
  generate_grave; penlabels(21,22);
  endgroup;
  generate_diaeresis(center,.9dot_size,2.25dot_size,
    if doing_u > 0: .35 else : .5 fi [h,x_height],x_height+separator);
enddef;
     
vardef diaeresis_grave(expr center)=
  if serifs: x22-x21=1.25u; x21-.5stem=hround(center-5/6(x22-x21)-.5stem+1/8u);
  else: lft x21l=hround (1.25u-.5stem); rt x22r=hround(center+.5vair); fi
  begingroup;
  numeric saved_h;
  numeric saved_x_height;
  saved_x_height = x_height;
  saved_h=h;
  save h;
  save x_height;
  h=Circ_ht;
  x_height = saved_x_height + 1.5(h - saved_h);
  generate_grave; penlabels(21,22);
  endgroup;
  generate_diaeresis(center,.9dot_size,2.25dot_size,
    if doing_u > 0: .35 else : .5 fi [h,x_height],x_height+separator);
enddef;
     
vardef generate_underdot(expr center,base)=
  pickup tiny.nib;
  pos31(dot_diam,0); pos32(dot_diam,90); 
  x31l=hround(center+(x31l-x31)); x31=x32;
  y32l=vround(base); y31=y32;  dot(31,32);
  penlabels(31,32);
enddef;

% Set up remapping of Grave and Acute, Asper and Lenis.
% This allows a more natural setting of single quotes, apostrophe 
% and angle brackets.
% Move two accents out of the way of Ibycus
% Xi and digamma. Correct height of "Smooth breathing
% with grave" and "Rough breathing with circumflex"
% composites.
% Slight redesign of freestanding "Iota subscript".
% Reposition Breve and Macron, but these will usually
% be got from the prosody font anyway.
%
def selectaccent expr t =
  currenttitle:= t;
  if t = "Grave accent" :
    code_offset := bary_tone - ASCII"`" ;  let next_ = use_it_
  elseif t = "Acute accent" :
    code_offset := oxy_tone - ASCII"'" ;  let next_ = use_it_
  elseif t = "Rough breathing" : let next_ = lose_it_
  elseif t = "Smooth breathing" : let next_ = lose_it_
  elseif t = "Rough breathing with acute" : let next_ = lose_it_
  elseif t = "Rough breathing with grave" : let next_ = lose_it_
  elseif t = "Rough breathing with circumflex" : let next_ = lose_it_
  elseif t = "Smooth breathing with acute" : let next_ = lose_it_
  elseif t = "Smooth breathing with grave" : let next_ = lose_it_
  elseif t = "Smooth breathing and circumflex" : let next_ = lose_it_
  elseif t = "Diaeresis with circumflex" : let next_ = lose_it_
  elseif t = "Iota subscript" : let next_ = lose_it_
  elseif t = "Breve accent" :
    code_offset := breve - oct"036" ;  let next_ = use_it_
  elseif t = "Macron (bar) accent" :
    code_offset := longum - oct"037";  let next_ = use_it_
  else: code_offset := 0 ; let next_ = use_it_ fi; next_ enddef;

def selectaspirate expr t =
  currenttitle:= t;
  if t = "Italic letter h" :
    code_offset := aspirate - ASCII"h" ;  let next_ = use_it_
  else: let next_ = lose_it_ fi; next_ enddef;

let cmchar = selectaspirate;

input itall

code_offset:=0;
let cmchar = relax;

% Use adjust fit to kern the accents that go with
% uppercase out a bit to the left so that accented uppercase does not
% take more than its proper letterspace.  Should have been applied
% to trailing side bearing too, but there is too much water under
% the bridge now.  Silvio Levy's accents have no
% adjust_fit, and a character with no adjust_fit picks up
% the values of the previous character.

cmchar "Rough breathing";
beginchar(asper_glyph,9u#,acc_ht#,0);
adjust_fit(-4u#,0);
spirit(.5w)<;
endchar;
     
cmchar "Smooth breathing";
beginchar(lenis_glyph,9u#,acc_ht#,0);
adjust_fit(-5u#,0);
spirit(.5w)>;
endchar;
     
cmchar "Rough breathing with acute";
beginchar(asper_oxy,9u#,acc_ht#,0);
adjust_fit(-3u#,0);
spirit_acute(.5w)<;
endchar;
     
cmchar "Rough breathing with grave";
beginchar(asper_bary,9u#,acc_ht#,0);
adjust_fit(-3u#,0);
spirit_grave(.5w)<;
endchar;
     
% Do asper_perispomenon with corrected heights.
cmchar "Rough breathing with circumflex";
beginchar(asper_peri,9u#,Circ_ht#,0);
adjust_fit(-3u#,0);
spirit_circumflex(.5w)<;
endchar;
     
cmchar "Smooth breathing with acute";
beginchar(lenis_oxy,9u#,acc_ht#,0);
adjust_fit(-3u#,0);
spirit_acute(.5w)>;
endchar;
     
% Do lenis_barytone with corrected height.
cmchar "Smooth breathing with grave";
beginchar(lenis_bary,9u#,acc_ht#,0);
adjust_fit(-3u#,0);
spirit_grave(.5w)>;
endchar;

cmchar "Smooth breathing and circumflex";
beginchar(lenis_peri,9u#,Circ_ht#,0);
adjust_fit(-3u#,0);
spirit_circumflex(.5w)>;
endchar;
     
% Provide an alternative for the depth of iota subscript.

cmchar "Iota subscript";
beginchar("|",9u#,0,
  if ( ((pixels_per_inch / mag) < 599) or (pixels_per_inch < 420)) :
	    desc_depth#
  else :
    iota_dp#
  fi );
adjust_fit(0,0);  % Don't omit this---see note following.
iota_sub(.5w);
endchar;

% The adjust_fit macro really ought to be used with all characters,
% because if it isn't, the chardx value (pixel displacement in the
% gf file) will not be recalculated, but will be picked up from
% the last character that did have an adjust_fit line.  Here, I
% leave the sloppy side-effect in place because I know I want
% the few affected accents to have the same 9u width.
%

let cmchar = selectaccent;

readfrom("graccent");

code_offset:=0;
let cmchar = relax;


%                     Zero-width space
% Takes the place of "Diaeresis with circumflex", which cannot occur.
% iota and upsilon only affected by diaeresis when short.
% This is useful for deligaturing sigma. with the  "s|" digraph.
% Besides, it can often help to have a zero-width character available.
% But you can't draw the box so proofing and displaying must be off.
% 
% Adjust_fit has to be used to get a true zero-width. A curious side-effect
% of setting the character width to eps is that the u value is recalculated
% to a colossal negative value.  It is not worth the trouble to discover
% why, since a saved u value will obviate the errors and oversized
% shift values that happen with the recalculated u.  The effect noted here
% is absent from proof mode calculations.  It is only a problem when
% usable rasters are being laid down.
%
begingroup;
numeric saved_u; saved_u:=u;
save u;
save proofing; proofing:=0;
save displaying; displaying:=0;

cmchar "Zero-width Space";
beginchar(null_space, eps,0,0); % The adjust-fit calculation
adjust_fit(-eps,0);             % does a division, so w must be > 0.
endchar;	                % canceling it out with "-eps" is 
		                % unnecessary, but it feels better.

numeric dot_diam#; dot_diam#=max(dot_size#,cap_curve#);


beginchar(doti,eps,0,desc_depth#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-2.5saved_u, -d);
endchar;

beginchar(dotI,eps,0,desc_depth#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-3.25saved_u, -d);
endchar;

beginchar(dote,eps,0,desc_depth#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-3.75saved_u, -d);
endchar;

beginchar(dotbt,eps,0,desc_depth#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-4saved_u, -d);
endchar;

beginchar(dotJdlmnpqu,eps,0,desc_depth#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-4.5saved_u, -d);
endchar;

beginchar(dotkos,eps,0,desc_depth#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-5.25saved_u, -d);
endchar;

beginchar(dotGZ,eps,0,desc_depth#);  % Also upper case Koppa
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-5.5saved_u, -d);
endchar;

beginchar(dotchjz,eps,0,desc_depth# + dot_diam#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-5.5saved_u, -d);
endchar;

beginchar(dotCEVaw,eps,0,desc_depth#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-6saved_u, -d);
endchar;

beginchar(dotBFLNPRSTW,eps,0,desc_depth#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-6.5saved_u, -d);
endchar;

beginchar(dotH,eps,0,desc_depth#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-6.75saved_u, -d);
endchar;

beginchar(dotAOQUXY,eps,0,desc_depth#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-7.25saved_u, -d);
endchar;

beginchar(dotDK,eps,0,desc_depth#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-7.5saved_u, -d);
endchar;

beginchar(dotM,eps,0,desc_depth#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-8.75saved_u, -d);
endchar;

beginchar(dotgx,eps,0,desc_depth# + 1.5dot_diam#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-5.5saved_u, -d);
endchar;

beginchar(dotr,eps,0,desc_depth# + 1.5dot_diam#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-4.5saved_u, -d);
endchar;

beginchar(dotfy,eps,0,desc_depth# + 2dot_diam#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-5.75saved_u, -d);
endchar;

beginchar(dotkoppa,eps,0,desc_depth# + 2dot_diam#);
define_whole_blacker_pixels(dot_diam);
adjust_fit(-eps,0);
generate_underdot(-5saved_u, -d);
endchar;

% The three positions for iota subscript
% Equivalent to Times Ten Greek's /iotasubscripta etc., except that these
% are designed as postpositives kerned strongly to the left.  Setwidth 0
% but I am not sure that the type1 version can get away with that

% /iotasubscripta
beginchar(a_isub,eps,0,iota_dp#);
adjust_fit(-eps,0);
iota_sub(-5saved_u);
endchar;

% The top position of iota subscript under eta is dropped to
% provide better spacing between the letter and the subscript.
%
% /iotasubscripte
beginchar(h_isub,eps,0,iota_dp#);
adjust_fit(-eps,0);
begingroup;
numeric saved_o;
saved_o = o;
save o;
o = 3saved_o;
iota_sub(-6.85saved_u);
endgroup;
endchar;

% /iotasubscripto
beginchar(w_isub,eps,0,iota_dp#);
adjust_fit(-eps,0);
iota_sub(-6saved_u);
endchar;

endgroup;