%*****************************************************************************
%        Copyright (c) 1989 by N. N. Billawala
%*****************************************************************************


% pntt9.mf   Pandora Single Pitch 15 characters per inch fits with 9pt

font_identifier:="PNTT";

mode_setup;                             % general setup
input pandor                            % general definitions used in pandora

designsize:= 9pt#;                      % intended "ideal" size for parameters
width#:=     9pt#;                      % width of an em
maxheight#:= 7.75pt#  *.85;             % max height for delimiters,e.g., [,{,(
ascender#:=  7.5pt#   *.85;             % height of ascenders, e.g., on l,h,k
cap#:=       7pt#     *.85;             % height of uppercase, e.g., B,H,L
xheight#:=   5pt#     *.85;             % xheight of lowercase, e.g., x,n,o
descender#:= 2pt#     *.85;             % depth of descenders, e.g., on j,p,q
maxdepth#:=  2.25pt#  *.85;             % max depth for delimiters,e.g., [,{,(
math_axis#:= .5[maxheight#,-maxdepth#]; % vertical alignment for math 

accent_height#:=.3(ascender#-xheight#); % places bottom of accents 
accent_depth#:=min(.5xheight#,.7(ascender#-xheight#)); % character ref box depth

define_whole_vertical_pixels(width,maxheight,ascender,cap,xheight,descender,
  maxdepth,math_axis,accent_depth);

fixed_pitch_characters(true)(15);       % true/false, number of characters per inch
oblique:=0;                             % slant of character reference points

bowlstem.uc#:=.9      *fixed_pt;        % uppercase (uc) bowl width
bowlstem.lc#:=.9      *fixed_pt;        % lowercase (lc) bowl width
stem.uc#:=.9          *fixed_pt;        % uppercase stem width
stem.lc#:=.9          *fixed_pt;        % lowercase stem width
thin_stem.uc#:=.6     *fixed_pt;        % width of thin uppercase stems
thin_stem.lc#:=.6     *fixed_pt;        % width of thin lowercase stems
define_pixels
  (bowlstem.uc,bowlstem.lc,stem.uc,stem.lc,thin_stem.uc,thin_stem.lc);

boldness:=1;
makeknown(fitbasis.lc#)(.21*width#);
makeknown(fitbasis.uc#)(.30*width#);

apex.uc:=inlimit(.9stem.uc)(0,stem.uc); % apex flatness in uppercase
apex.lc:=inlimit(.9stem.lc)(0,stem.lc); % apex flatness in lowercase
ov_t.uc:=.01cap;                        % top curve overshoot for uppercase
ov_t.lc:=.01xheight;                    % top curve overshoot for lowercase
ov_b.uc:=.01cap;                        % bottom curve overshoot for uppercase
ov_b.lc:=.01xheight;                    % bottom curve overshoot for lowercase
ov_apex.uc:=0;                          % apex overshoot for uppercase
ov_apex.lc:=0;                          % apex overshoot for lowercase   
apex_angle:=oblique;                    % for changing the angle at apex 
if xheight<25:lowres_fix(ov_t.lc,ov_b.lc,ov_apex.lc); fi
if cap<70:lowres_fix(ov_t.uc,ov_b.uc,ov_apex.uc); fi

                                        % for SERIFS and ARMS
serif_thickness:=inlimit(0)(eps,.5xheight); % base thickness of horz serifs
terminal_thickness:=serif_thickness;    % base thickness of terminal serifs
tip_thickness:=     serif_thickness;    % base thickness of arms
bulb_thickness:=   .5stem.lc;           % (base) thickness of bulbs
x_bracket_h:=inlimit(.2xheight)(serif_thickness,.5xheight); % lc bracket join
cap_bracket_h:=inlimit(.2cap)(serif_thickness,.5cap);       % uc bracket join
bool(ctrls):=false;                     % for explicit placement of control pts
onbase:=inlimit(0)(0,1);                % places control pt along base of serif
onstem:=inlimit(0)(0,1);                % places control pt along stem of serif
midbracket_pull:=    inlimit(.6)(0,1);  % pulls brackets in on arms and serifs
entasis:=            inlimit(0)(0,1);   % amount of arc in horizontal serif base
terminal_entasis:=   inlimit(0)(0,1);   % amount of arc in terminal serif base
arm_angle:=          inlimit(10)(0,60); % global angle off of 90 degrees
asc_terminal_angle:= inlimit(0)(0,60);  % at ascender height: from 0 deg...h,k,l
x_terminal_angle:=   inlimit(0)(0,60);  % at x-height: from 0 deg...m,n,r
base_terminal_angle:=inlimit(0)(0,60);  % at base line: from 0 deg...u
diag_terminal_angle:=inlimit(0)(0,60);  % on diagonals: from 0 deg...k,v,w,y
hs:=0;                                  % global horizontal serif length
ts:=0;                                  % global terminal serif length
as:=0;                                  % global arm length
cs:=.5pt;                               % global curvedarm length
serif_constant_amt:=0pt;                % adds same length amount to all serifs
bool(bulbs):=false;                     % arms become bulbs if true
bool(bulb_taper):=true;                 % changes bulbs to tapering shape
taper_angle:=if bulb_taper:10 else:0 fi;% if |bulb_taper|, adjusts angle at end
bulb_taper_amt:=0;                      % taper length as a % of limb thickness
c_and_s.lc:=.65stem.lc;                 % c,s bulb length if |bulb_taper|=true
c_and_s.uc:=.85stem.uc;                 % C,G,S bulb length if |bulb_taper|=true
terminal_softness:=0;                   % softness in heel of the terminal serif
arm_softness:=0;                        % softness in the heel of the arm

                                        % ARCHES
arch_thickness.uc:=thin_stem.uc;        % uppercase arch thickness
arch_thickness.lc:=thin_stem.lc;        % lowercase arch thickness
arch_tip.uc:=arch_thickness.uc;         % thinnest part of the uc arch
arch_tip.lc:=arch_thickness.lc;         % thinnest part of the lc arch
arch_reference:=inlimit(.65)(.4,.95);   % puts ref pts between tip/stem
arch_inner_amt:=inlimit(.8)(.4,.95);    % puts arch pts between tip/ref pts
r_arch:=l_arch:=inlimit(.6)(0,1);       % y-value of max outer stress on |r_arch|
bool(ensure_min_archthickness):=true;   % guarantees minimum thickness

                                        % BOWLS
major_curve.uc:=arch_thickness.uc;      % uppercase major bowl curve thickness
major_curve.lc:=arch_thickness.lc;      % lowercase major bowl curve thickness
minor_curve.uc:=.9arch_thickness.uc;    % uppercase minor bowl curve thickness
minor_curve.lc:=.9arch_thickness.lc;    % lowercase minor bowl curve thickness
major_bowl_tip.lc:=major_curve.lc;      % lowercase major bowl tip thickness
minor_bowl_tip.lc:=minor_curve.lc;      % lowercase minor bowl tip thickness
major_bowl_reference:=inlimit(.5)(.4,.95); % puts ref pts between tip/bowlstem
minor_bowl_reference:=inlimit(.5)(.4,.95); % puts ref pts between tip/bowlstem
major_bowl_inner_amt:=inlimit(.9)(.4,.95); % puts arch pts between tip/ref pts 
minor_bowl_inner_amt:=inlimit(.9)(.4,.95); % puts arch pts between tip/ref pts

define_minimums(                        % these values keep a one pixel minimum
  bowlstem.lc,stem.lc,thin_stem.lc,apex.lc,arch_thickness.lc,arch_tip.lc,
  bowlstem.uc,stem.uc,thin_stem.uc,apex.uc,arch_thickness.uc,arch_tip.uc,
  major_curve.lc,minor_curve.lc,major_bowl_tip.lc,minor_bowl_tip.lc,
  major_curve.uc,minor_curve.uc);

                                        % ARCHES and BOWLS and CIRCULAR SHAPES
v_stress:=.52;                          % places point of vert stress on bowl
h_stress:=.53;                          % places horzstress on circular shapes
ductal:=inlimit(.15)(0,1);              % for more ductal strokes: value of 1
minor_ductal.lc:=.1*(xheight-minor_curve.lc-major_curve.lc); % minor curve join
circ1:=inlimit(.9)(.75,1.5);            % tension of outer curve shapes
circ2:=inlimit(.9)(.75,1.5);            % tension of inner curve shapes
circ3:=inlimit(.9)(.75,1.5);            % tension of outer |circular_shapes|
                         
                                        % JUNCTURES and NOTCHES
bool(softjuncture):=false;              % are junctures soft? in junct macro
juncture_opening:=inlimit(0)(0,stem.lc);% indent into stem at juncture
stemcut_angle:=0;                       % cut into stem at angle off of 90
archcut_angle:=0;                       % cuts into regular arch path
notch_length.uc:=.05stem.uc;            % length of corrective notching (uc)
notch_length.lc:=.05stem.lc;            % length of corrective notching (lc)
notch_width:=1;                         % width of corrective notching in pixels
notch_pos:=.3;                          % positions the beginning of the notch
bool(center_notch):=                    % centers all notches
 if(thin_stem.lc/stem.lc)>=.75:true else:false fi;
bool(nonotch):=if(xheight<15)           % if real low resolution
 or(xheight#>15pt#)                     % or large character size
 or(thin_stem.uc/stem.uc<.5):true       % or small thin/thick ratio
 else:false fi;                         %   this overrides notching

                                        % PUNCTUATION, ACCENTS, MATH and PENS
round_dot_diameter:=1.1stem.uc;         % diameter of dots on ;:    
accent_dot_diameter:=stem.lc;           % diameter of dots(!?") and dot accents
comma_dot_indent=inlimit(.25)(0,1);     % indent in the comma macro for the dot 
bool(prime):=false;                     % changes comma to prime 
prime_angle:=-20;                       % angle of prime-like comma
bool(realsoft_accents):=false;          % make accents soft as possible
accent_thin_end:=max(1,.6thin_stem.lc); % thinnest end of accents
accent_thick_end:=max(1,.6stem.lc);     % thickest end of accents
mathlines:=max(1,.45pt);                % thickness of lines in math characters
head_thickness:=max(1,.9mathlines);     % arrowhead thickness
def mathpen=pensquare scaled mathlines enddef;              % for []/=+\#%-\<\>\_|^
blank_space_thickness:=max(1,.7mathlines);                  % for space char
def slashpen=pensquare scaled max(1,.5thin_stem.lc) enddef; % in O-slash chars
def dashpen=pensquare scaled max(1,.75mathlines) enddef;    % for en em

                                        % MISCELLANEOUS
join_radius:=.1pt;                      % global softness for use with softjoin
bool(softpath):=true;                   % softens paths in macros
narrow_amt:=inlimit(.7)(0,1);           % thins strokes if narrow condition=true
w_narrow_amt:=inlimit(.3)(0,1);         % thins strokes especially for eMwW oe
ebar_angle:=0;                          % used on the lowercase e
bool(bold):=false;                      % changes accent shapes if bold

rulepen:=pensquare scaled 1;            % makes screenrules 1 pixel thick
if oblique=0:let //=relax               % lets // do nothing if needed otherwise
  else:def //=slanted sind(oblique/cosd oblique) enddef fi; % // slants ref pts
pair upward,downward; 
 upward=dir(90-oblique);                % "up" along oblique angle
 downward=dir(-90-oblique);             % "down" along oblique angle

                                        % ALTERNATE character specs
bool(test_all_characters):=false;       % allows testing of alternate characters
 alt0:=0; bool(a_full_bowl):=false;     % for half/double bowls on a
 alt1:=0; bool(g_full_bowl):=true;      % for half/double bowls on g
 alt2:=0; bool(spur):=true;             % for pronged terminals on G,a,b,g,q
 alt3:=0; bool(like_lowercase):=false;  % alternate U
 alt4:=0; bool(flat_diagonal_endings):=true; % else teminalserif k,v,w,x,y,V,W,X
 alt5:=0; bool(beveled_join):=false;    % on R,K,k
 alt6:=0; bool(open_tail):=false;       % for 3,5,6,9
 alt7:=0; bool(diagonal_three):=false;  % for diagonal as opposed to round top 3
 alt8:=0; bool(inflection_two):=false;  % for 2 with inflection
 alt9:=0; bool(G_spur):=false;          % spur on G
 alt10:=0;bool(open_four):=true;        % for top of 4 

extra_beginchar:=extra_beginchar&"save t,p,ref; path p[],p[]',ref[];";
extra_beginchar:=extra_beginchar&"w#:=charwd;";          % for adjust def
extra_endchar:=extra_endchar&"wsaved:=w; w:=r-l;";       % for adjust def

for x:="a":
 wanted[byte x]:=true; endfor           % test these characters
let iff=always_iff;                     % tests all chars in the file
  let show_character=draw_outlines; 
  if (mode<>proof):let show_character=fill_all;fi

input tttext                            % Typewriter Text character set


