% This is B-FCCSC.MF
% African Computer Modern Roman Caps and Small Caps
% 
% This is a parameter and driver file in one
% Version 1.3
% Date 5-MAR-1998
% 
% (c) Copyright 1991--1998 by J"org Knappen. See fc.rme for copying conditions
% This file is part of the fc-package 
% See fc.rme for more information
%
% J"org Knappen
% Barbarossaring 43
% D 55118 Mainz

if unknown cmbase: input cmbase fi

font_identifier:="FCCSC"; font_size design_size * pt#;

% first come parameters used to set the uppercase letters
% (including some for lowercase that aren't actually used)
% These parameters are nearly the same as the Computer Modern Roman
% parameters.

input c-cmr;
univ_acc_breadth:=0.5;    % zusatz parameter for the universal accent
u#:=                      % unit width
    ((u#*360pt#) + (design_size * 1))/360pt#;

letter_fit#:=             % extra space added to all sidebars
    ((letter_fit#*360pt#) + (design_size * 5))/360pt#;    

ligs:=1;                  % level of ligatures to be included

mode_setup; 
font_setup;

input fcmacros;
input fccoding;
input olddig;  % oldstyle numbers from computer modern
input fcpunct;   
input fcaccent;
input fcrompct;
input uppera;
input upperbcd;
input uppere;
input upperfgh;
input upperij;
input upperklm;
input uppern;
input uppero;
input upperpqr;
input upperst;
input upperuvw;
input upperxyz;

input fcscligt.mf;
font_slant slant; font_x_height x_height#;
if monospace: font_normal_space 9u#; % no stretching or shrinking
 font_quad 18u#;
 font_extra_space 9u#;
else: font_normal_space 6u#+2letter_fit#;
 font_normal_stretch 3u#; font_normal_shrink 2u#;
 font_quad 18u#+4letter_fit#;
 font_extra_space 2u#;
def lig_o_table (expr k) =
             "o" kern k,  open_o kern k, open_o_tilde kern k,
                          o_grave kern k, o_dot kern k, o_hat kern k,
                          o_tilde kern k, o_umlaut kern k, oe_lig kern k,
                          crossed_o kern k, o_dotu kern k, o_uline kern k,
                          o_bar kern k, o_hachek kern k
enddef;
%
def lig_a_table (expr k) =
           "a" kern k,    a_tilde kern k, ae_lig kern k
enddef;
%
def lig_u_table (expr k)=
             "u" kern k, u_dotu kern k, u_tilde kern k, var_u kern k
enddef;
%
def lig_A_table (expr k) =
           "A" kern k,    A_tilde kern k, AE_lig kern k
enddef;
%
def lig_O_table (expr k) =
             "O" kern k,  open_o kern k, open_O_tilde kern k,
                          O_grave kern k, O_dot kern k, O_hat kern k,
                          O_tilde kern k, O_umlaut kern k, OE_lig kern k,
                          crossed_O kern k, O_dotu kern k, O_uline kern k,
                          O_bar kern k, O_hachek kern k
enddef;
%
def lig_U_table (expr k)=
             "U" kern k, U_dotu kern k, U_tilde kern k, var_U kern k
enddef;
%


 k#:=-.5u#; kk#:=-1.5u#; kkk#:=-2u#; % three degrees of kerning
 ligtable "P": "T": hooktop_P: hooktop_T: "Y": hooktop_Y:
            lig_a_table(kk#), lig_A_table(kk#);
 ligtable "F": long_F: "V": "W": 
            if serifs: lig_a_table(kkk#), lig_A_table(kkk#),
            else: lig_a_table(kk#), lig_A_table(kk#), fi
  "K": "X": lig_o_table(k#), lig_O_table(k#), "c" kern k#, "C" kern k#,
            hooktop_c kern k#, hooktop_C kern k#, c_cedilla kern k#, 
            C_cedilla kern k#,
            "g" kern k#, "G" kern k#, "q" kern k#, "Q" kern k#;
 ligtable "O": "D": Edh: hooktop_D: open_O: open_O_tilde: O_grave: O_dot:
          O_hat: O_tilde: O_umlaut: crossed_O: O_dotu: O_bar: O_hachek:
            "x" kern k#, "X" kern k#, "w" kern k#, "W" kern k#,
            lig_a_table(k#), lig_A_table(k#), "v" kern k#, "V" kern k#, 
            "y" kern k#, "Y" kern k#, hooktop_y kern k#, hooktop_Y kern k#;
 ligtable "A": A_tilde: if serifs: "R": fi 
            "c" kern k#, "C" kern k#, hooktop_c kern k#, hooktop_C kern k#, 
            c_cedilla kern k#, C_cedilla kern k#,
            lig_o_table(k#), lig_O_table(k#), "g" kern k#, "G" kern k#,
            lig_u_table(k#), lig_U_table(k#), "q" kern k#, "Q" kern k#,
          "L": latin_Iota:
            "T" kern kk#, "t" kern kk#, long_T kern k#, long_t kern k#,
            "Y" kern kk#, "y" kern kk#, hooktop_Y kern k#, hooktop_y kern k#,
            "V" kern kkk#, "v" kern kkk#, "W" kern kkk#, "w" kern kkk#;
 ligtable "I": "I" kern -k#; fi % Richard III


% now come replacements used to set the lowercase caps
% Since the number of strings is critical in the FC font, I decided to
% overwrite the uppercase settings.

u#:=                % unit width
    (u#*36pt#*16)/(21*36pt#);

width_adj#:=        % width adjustment for certain characters
    width_adj#;

cap_serif_fit#:=    % extra sidebar near uppercase serifs
    (cap_serif_fit#*36pt#*4)/(5*36pt#);

letter_fit#:=       % extra space added to all sidebars
    (letter_fit#*36pt#*24)/(5*360pt#);

body_height#:=      % height of tallest characters
    (body_height#*36pt#*20.0)/(27.0*36pt#);

cap_height#:=       % height of caps
    (cap_height#*36pt#*18.5)/(24.6*36pt#);

x_height#:=         % height of lowercase without ascenders
    (x_height#*3.6pt#*116)/(155*3.6pt#);

bar_height#:=       % height of crossbar in lowercase e
    (bar_height#*36pt#*65)/(87*36pt#);

comma_depth#:=      % depth of comma below baseline
    (comma_depth#*36pt#*52)/(70*36pt#);

stem#:=             % lowercase stem breadth
    (stem#*36pt#*21)/(25*36pt#);

flare#:=            % diameter of bulbs or breadth of terminals
    (flare#*36pt#*25)/(33*36pt#);

cap_hair#:=         % uppercase hairline breadth
    (cap_hair#*3.6pt#*91)/(11*36pt#);

cap_stem#:=         % uppercase stem breadth
    (cap_stem#*36pt#*26)/(32*36pt#);

cap_curve#:=        % uppercase curve breadth
    (cap_curve#*36pt#*31)/(37*36pt#);

cap_ess#:=          % breadth in middle of uppercase s
    (cap_ess#*36pt#*28)/(35*36pt#);

cap_jut#:=          % protrusion of uppercase serifs
    (cap_jut#*36pt#*26)/(37*36pt#);

beak_jut#:=         % horizontal protrusion of beak serifs
    (beak_jut#*36pt#*7)/(10*36pt#);

beak#:=             % vertical protrusion of beak serifs
    (beak#*36pt#*52)/(7*360pt#);

slab#:=             % serif and arm thickness
    (slab#*36pt#*91)/(11*360pt#);

cap_bar#:=          % uppercase bar thickness
    (cap_bar#*36pt#*91)/(11*360pt#);

cap_band#:=         % uppercase thickness above/below lobes
    (cap_band#*36pt#*91)/(11*360pt#);

cap_notch_cut#:=    % max breadth above/below uppercase notches
    cap_notch_cut#;

o#:=                % amount of overshoot for curves
    (o#*36pt#*5)/(8*36pt#);

apex_o#:=           % amount of overshoot for diagonal junctions
    (apex_o#*36pt#*4)/(8*36pt#);

fudge:=             % factor applied to weights of heavy characters
    fudge;

font_setup; % now try again with |lower| settings
extra_endchar:=extra_endchar&"charcode:=charcode+code_offset";
code_offset:=ASCII"a" - ASCII"A";
input uppera;
input upperbcd;
input uppere;
input upperfgh;
input upperij;
input upperklm;
input uppern;
input uppero;
input upperpqr;
input upperst;
input upperuvw;
input upperxyz;

code_offset:=0;
input fccscspu;  % some specials
if not monospace:
 k#:=-.5u#; kk#:=-1.5u#; kkk#:=-2u#; % three degrees of kerning
 ligtable "p": "t": "y": hooktop_p: hooktop_t: hooktop_y:
              lig_a_table(kk#);
 ligtable "f": long_f: "v": "w": 
              lig_a_table(if serifs: kkk# else: kk#\\fi),
          "k": "x": 
              lig_o_table(k#), "c" kern k#, hooktop_c kern k#, 
              c_cedilla kern k#,
              "g" kern k#, "q" kern k#;
 ligtable "o": "d": open_o: open_o_tilde: o_grave: o_dot:
          o_hat: o_tilde: o_umlaut: crossed_o: o_dotu: o_uline:
          o_bar: o_hachek: crossed_d: tailed_d: hooktop_d:
              "x" kern k#, "w" kern k#, lig_a_table(k#),
              "v" kern k#, "y" kern k#, hooktop_y kern k#;
 ligtable "a": if serifs: "r": fi 
              "c" kern k#, c_cedilla kern k#, hooktop_c kern k#, 
              lig_o_table(k#),
              "g" kern k#, "u" kern k#, "q" kern k#,
          "l": latin_iota: oct"033": oct"037":
               "'" kern kk#, "t" kern kk#, long_t kern kk#, "y" kern kk#, 
               hooktop_y kern kk#, "v" kern kkk#, "w" kern kkk#;
 ligtable "i": "i" kern -k#; fi % skiing
bye.
