summaryrefslogtreecommitdiff
path: root/fonts/pandora/number.mf
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/pandora/number.mf
Initial commit
Diffstat (limited to 'fonts/pandora/number.mf')
-rw-r--r--fonts/pandora/number.mf468
1 files changed, 468 insertions, 0 deletions
diff --git a/fonts/pandora/number.mf b/fonts/pandora/number.mf
new file mode 100644
index 0000000000..09519de8c4
--- /dev/null
+++ b/fonts/pandora/number.mf
@@ -0,0 +1,468 @@
+%*****************************************************************************
+% Copyright (c) 1989 by N. N. Billawala
+%*****************************************************************************
+
+
+% number.mf numerals
+% 10 characters
+
+
+iff OK "0": "The number 0";
+ beginchar("0",num_width_c#+c_mono#,cap#,0);
+ if mono<>0:save circ; circ1=circ2=circ3=1.05; fi
+
+ top z1=(h_stress*w,h+ov_t.uc)//;
+ lft z2=(0,(1-v_stress)*h)//;
+ bot z3=((1-h_stress)*w,-ov_b.uc)//;
+ rt z4=(w,v_stress*h)//;
+
+ circular_shape(y1,y3,x2,x4,minor_curve.uc,bowlstem.uc);
+
+ showpoints(1,2,3,4);
+adjust(.5num_fit_c#+m_a*c_mfit#,.5num_fit_c#+m_a*c_mfit#);
+show_character; endchar;
+
+
+iff OK "1": "The number 1";
+ beginchar("1",num_width_a#+b_mono#,cap#,0);
+
+ save_num(terminal_thickness)=max(.75thin_stem.uc,.3stem.uc);
+ bot z40=(.5w,0); multpos(1,4,40)(stem.uc,0);
+ lft x4l=round x40l; bot y4=0;
+ top z1=(x4,h)//;
+ onaline(1l,4l)(2l,3l); y3l=y3r=cap_bracket_h;
+ onaline(1r,4r)(2r,3r); y2r=y2l=max(h-cap_bracket_h,y3l);
+ y2l:=min(y2l,h-terminal_thickness-(stem.uc*sind max(25-.5oblique,0)));
+
+ p1=fullserif(z4,z1,z3l,z3r,1.25hs,1.25hs)--
+ terminalserif.l(z1,z4,z2l,z2r,1.5pt,max(25-.5oblique,0))--cycle;
+
+ showpoints(1,2,3,4);
+adjust(.5num_fit_a#+m_a*b_mfit#,.5num_fit_a#+m_a*b_mfit#);
+show_character; endchar;
+
+
+
+
+def character_points=
+iff OK "2": "The number 2";
+ beginchar(50+alt8,num_width_b#+b_mono#,cap#,0);
+
+ twotension:=10;
+ z1=(.05w,.9h)//;
+ rt z3r=(w,if inflection_two:.75h else:.7h fi)//;lft z3l=(z3r-(bowlstem.uc,0));
+ top y2r=bot y2l+max(1,major_curve.uc)=h+ov_t.uc;
+ good_x_for(2r)(z1,z3r,.5)a; good_x_for(2l)(z1+(bulb_thickness,0),z3l,.5)b;
+ top lft z5l=(0,max(1,.9stem.uc))//;
+ z4l=.5[z5l,z3l];
+ bot lft z6l=(0,0); z6r=z6l+(0,apex.uc)//;
+ bot rt z8=(.95w,0);
+ bot y7l=top y7r-max(1,.9stem.uc)=0;
+ good_x_for(7l)(z6l,z8,.5)c; good_x_for(7r)(z5r,z8-(tip_thickness,0),.5)d;
+
+ ref1=(z6r-(0,max(1,.8thin_stem.uc)))
+ ..tension atleast twotension and 1..z3r{upward};
+ ref2=z3l{downward}..tension atleast 1 and twotension..z6r;
+ ref3=(-1,y7r)--(w,y7r);
+ ref4=z3l{downward}...z4l...z6r{downward}...z6l;
+
+ if inflection_two:
+ rt z5r=ref4 intersectionpoint ref3+(1.3thin_stem.uc,0); z4r=.5[z5r,z3r];
+ p1=(bulb.tl(z1,z2l,z2r,cs,bulb_thickness,90)soft i_t
+ ref4 if softpath:)softjoin(z6l fi
+ --arm.br(z8,z7r,z7l,.5as,.75tip_thickness,90-arm_angle+.5oblique)soft--
+ z5r if softpath:)softjoin(z5r fi
+ {upward}..z4r...z3r{upward} o_t z2r{left})--cycle;
+ else:
+ rt z5r=ref1 intersectionpoint ref3;
+ (t1,t2)=ref1 intersectiontimes ref3;
+ p1=(bulb.tl(z1,z2l,z2r,cs,bulb_thickness,90)soft i_t
+ ref2 soften(z6r,z6l)
+ arm.br(z8,z7r,z7l,.5as,.75tip_thickness,90-arm_angle+.5oblique)soft--z5r
+ if softpath:)softjoin(z5r fi
+ --subpath(t1,infinity)of ref1 o_t z2r{left})--cycle;
+ fi
+ showpoints(1,2,3,4,5,6,7,8);
+ adjust(.5num_fit_b#+m_a*b_mfit#,.5num_fit_b#+m_a*b_mfit#);
+ show_character; endchar;
+ enddef;
+
+ def number_two=save a,b;
+ vardef a=condition(inflection_two)t; testing_codes; character_points; enddef;
+ vardef b=condition(inflection_two)f; testing_codes; character_points; enddef;
+ if test_all_characters:a;b;else:if inflection_two:a;else:b;fi fi
+ enddef;
+
+ number_two; save number_two;
+
+
+
+ def three_diagonal_top(expr addtocode)=
+iff OK "3": "The number 3";
+ beginchar(51+alt6+addtocode,num_width_b#+b_mono#,cap#,0);
+
+ top z1=(0w,h)//;
+ lft z9=(0,.05h)//;
+ bot lft z10r=(.05w,-ov_b.uc)//;
+ pos10(minor_curve.uc,-90-oblique);
+ z5=if open_tail:(.2w,.57h)//;else:(.3w,.55h)//; fi
+ z3r=(round(.97w),h-apex.uc)//;
+ z40=(.97w,h)//;
+ x5r=x5+.45thin_stem.uc*(cosd (90-oblique));
+ x5l=x5r-.9thin_stem.uc*(cosd (90-oblique));
+ top y2r=bot y2l+max(1,.9stem.uc)=h;
+ top y6r=top y5r=round(y5+.45thin_stem.uc);
+ bot y6l=bot y5l=y5r-max(1,.9thin_stem.uc);
+ bot y8r=top y8l-minor_curve.uc=-ov_b.uc;
+ z4l=z5r;
+ if open_tail:rt z7r=(w,.65[y8r,y6r])//;
+ lft z7l=(x7r-stem.uc,.65[y8l,y6l]);
+ else:rt z7r=(w,v_stress[y8r,y6r])//;
+ lft z7l=(x7r-stem.uc,v_stress[y8l,y6l]); fi
+
+ numeric theta[],phi[],d[];
+ d1=thin_stem.uc;
+ theta1=angle(length(z3r-z5r) +-+ d1,d1);
+ phi1=angle(z3r-z5r)-theta1;
+ multpos(3,4)(thin_stem.uc,phi1-90);
+
+ onaline(3l,4l)(41); y41=y2l;
+ onaline(3r,4r)(42); y42=y5r;
+ good_x_for(2r)(z1,z40,.4)a; good_x_for(2l)(z1+(bulb_thickness,0),z41,.4)b;
+ good_x_for(6r)(z42,z7r,.2)c; good_x_for(6l)(z5l,z7l,.3)d;
+ good_x_for(8r)(z9,z7r,.4)e; good_x_for(8l)(z9+(bulb_thickness,0),z7l,.4)f;
+
+ p1=(arm.tl(z1,z2l,z2r,.5as,.5tip_thickness,90)soft
+ soften(z41,z5r,z5l) z6l{right} i_t z7l{downward} i_t
+ if open_tail:{-(dir (7*h/w))}z10l--z10r{dir(7*h/w)}
+ else:bulb.bl(z9,z8l,z8r,.75cs,.75bulb_thickness,90) fi
+ o_t z7r{upward} o_t z6r{left} soften(z42,z3r,z40) z2r)--cycle;
+
+ showpoints(1,2,3,4,5,6,7,8,9,10,40,41,42);
+ adjust(.5num_fit_b#+m_a*b_mfit#,.5num_fit_b#+m_a*b_mfit#);
+ show_character; endchar;
+ enddef;
+
+ def three_round_top(expr addtocode)=
+iff OK "3": "The number 3";
+ beginchar(51+alt6+addtocode,num_width_b#+b_mono#,cap#,0);
+
+ z1=(.05w,.95h)//;
+ lft z9=(0,.05h)//;
+ bot lft z10r=(.05w,-ov_b.uc)//;
+ pos10(minor_curve.uc,-90-oblique);
+ z5=(.3w,.55h)//;
+ x5r=x5+.45thin_stem.uc*(cosd (90-oblique));
+ x5l=x5r-.9thin_stem.uc*(cosd (90-oblique));
+ top y2r=bot y2l+minor_curve.uc=h+ov_t.uc;
+ top y4r=top y5r=round(y5+.45thin_stem.uc);
+ bot y4l=bot y5l=y5r-max(1,.9thin_stem.uc);
+ y6=.75[y5l,y5r];
+ bot y8r=top y8l-major_curve.uc=-ov_b.uc;
+ rt z3r=(round(.97w),v_stress[y6,y2r])//;
+ lft z3l=(x3r-stem.uc,v_stress[y5r,y2l]);
+ if open_tail:rt z7r=(w,.65[y8r,y6])//;
+ lft z7l=(x7r-stem.uc,.65[y8l,y4l]);
+ else:rt z7r=(w,v_stress[y8r,y6])//;
+ lft z7l=(x7r-stem.uc,v_stress[y8l,y4l]); fi
+ z3=.5[z3l,z3r];
+
+ good_x_for(2r)(z1,z3r,.5)a; good_x_for(2l)(z1+(bulb_thickness,0),z3l,.5)b;
+ good_x_for(4r)(z5r,z3l,.4)c; good_x_for(4l)(z5l,z7l,.4)d;
+ good_x_for(6)(z5,z3,.6)e;
+ good_x_for(8r)(z9,z7r,.4)g; good_x_for(8l)(z9+(bulb_thickness,0),z7l,.4)f;
+
+ p1=(bulb.tl(z1,z2l,z2r,1.2cs,.75bulb_thickness,90)soft i_t
+ z3l{downward} i_t z4r{left} soften(z5r,z5l) z4l{right} i_t z7l{downward}
+ i_t if open_tail:{-(dir (7*h/w))}z10l--z10r{dir(7*h/w)}
+ else:bulb.bl(z9,z8l,z8r,.75cs,.75bulb_thickness,90) fi
+ o_t z7r{upward} o_t
+ z6{left}--(z6+(0,epsilon){right} o_t z3r{upward} o_t z2r{left}))--cycle;
+
+ showpoints(1,2,3,4,5,6,7,8,9);
+ adjust(.5num_fit_b#+m_a*b_mfit#,.5num_fit_b#+m_a*b_mfit#);
+ show_character; endchar;
+ enddef;
+
+
+ vardef number_three=save first,second,third,fourth,addtocode;
+ addtocode:=-1;
+ vardef first=condition(diagonal_three)t; condition(open_tail)t;
+ testing_codes; three_diagonal_top(0); enddef;
+ vardef second=condition(diagonal_three)t; condition(open_tail)f;
+ testing_codes; three_diagonal_top(incr addtocode); enddef;
+ vardef third=condition(diagonal_three)f; condition(open_tail)t;
+ testing_codes; three_round_top(incr addtocode+alt7); enddef;
+ vardef fourth=condition(diagonal_three)f; condition(open_tail)f;
+ testing_codes; three_round_top(incr addtocode); enddef;
+
+ if test_all_characters:first;second;third;fourth;
+ elseif diagonal_three and open_tail:first;
+ elseif diagonal_three and (not open_tail):second;
+ elseif (not diagonal_three) and open_tail:third;
+ elseif (not diagonal_three) and (not open_tail):fourth; fi
+ enddef;
+
+ number_three; save number_three,three_diagonal_top,three_round_top;
+
+
+
+iff OK "4": "The number 4";
+ beginchar(52+alt10,num_width_e#+.5*(d_mono#+e_mono#),cap#,0);
+
+ min_limit(join_radius)(.5minor_curve.uc);
+ top rt z11r=(round(.82w),h)//; multpos(11,13)(max(1,stem.uc),0);
+ rt z13r=(round(.82w),0);
+ bot lft z4l=(0,round(.2h))//; pos4(apex.uc,90-apex_angle);
+ onaline(11r,13r)(10r,12r,23,25);
+ onaline(11l,13l)(12l,20,22,24,26,27);
+ y12l=y12r=min(cap_bracket_h,y4l); y20=y11r-max(thin_stem.uc,.3stem.uc,1);
+ y10=if open_four:.75h else:h fi; y27=y10+thin_stem.uc-stem.uc;
+ y24=y25=y4l; top y23=bot y24+max(1,.9thin_stem.uc);
+ pos10(apex.uc,0-oblique);
+ z3l=z4r;
+ z1r=if open_four:(x13l,h-.5thin_stem.uc)// else:z20 fi; %z1r controls top of 4
+ multpos(1,2,3)(thin_stem.uc,constant_angle(z1r,z3l,thin_stem.uc));
+ onaline(1r,3r)(2r,21); y21=y22=y23; y2r=notch_pos[y20,y21];
+ onaline(2l,3l)(28); y28=y11r; y26=.8[y22,y20];
+ rt z5=(w,y4l)//;
+ ref1=z26--z20--z2r;
+
+ if open_four:
+ p1=(z27--fullserif(z13,z11,z12l,z12r,.75hs,.75hs)
+ soften (z10r,z10) z27)--cycle;
+ p2=(arm.br(z5,z23,z25,.15as,.25tip_thickness,90-arm_angle+.5oblique)
+ soften(z21,z1r,z1l,z4r,z4l) z25)--cycle;
+ else:
+ p1=(z2l soften(z4r,z4l,z24) fullserif(z13,z11,z12l,z12r,.75hs,.75hs)--z25
+ if softpath:)softjoin(z25 fi
+ --arm.br(z5,z23,z25,.15as,.25tip_thickness,90-arm_angle+.5oblique)
+ soften(z23,z11r,z28) z2l)--cycle;
+ p1'=(upnotch(ref1,angle(z20-z22),notch_length.uc) soften(z21,z22) z26)
+ --cycle;
+ fi
+ showpoints(1,2,3,4,5,10,11,12,13,20,21,22,23,24,25,26,27,28);
+adjust(.5num_fit_e#+m_f*.5(d_mfit#+e_mfit#),
+ .5num_fit_e#+m_ff*.5(d_mfit#+e_mfit#));
+show_character; endchar;
+
+
+
+ def character_points=
+iff OK "5": "The number 5";
+ beginchar(53+alt6,num_width_b#+b_mono#,cap#,0);
+
+ top z1=(.9w,h)//;
+ top z3l=(round .05w,h)//; multpos(3,5)(thin_stem.uc,0-oblique);
+ z5l=(round .05w,if open_tail:.6h else:.55h fi)//;
+ lft z9=(0,.05h)//;
+ bot lft z10r=(.05w,-ov_b.uc)//;
+ pos10(minor_curve.uc,-90-oblique);
+
+ top y2r=bot y2l+max(1,.9stem.uc)=h;
+ bot y4l=top y4r-max(1,.9thin_stem.uc)=bot y5l;
+ bot y8r=top y8l-minor_curve.uc=-ov_b.uc;
+ if open_tail:rt z7r=(w,.65[y8r,y4r])//;lft z7l=(x7r-stem.uc,.65[y8l,y4l]);
+ else:rt z7r=(w,v_stress[y8r,y4r])//;
+ lft z7l=(x7r-stem.uc,v_stress[y8l,y4l]); fi
+ onaline(3r,5r)(40,41); y40=y2l; y41=y4r;
+
+ good_x_for(2r)(z3l,z1,.5)a; good_x_for(2l)(z40,z1-(tip_thickness,0),.5)b;
+ good_x_for(4r)(z41,z7r,.4)c; good_x_for(4l)(z5l,z7l,.55)d;
+ good_x_for(8r)(z9,z7r,.4)e; good_x_for(8l)(z9+(bulb_thickness,0),z7l,.4)f;
+
+ if open_tail:
+ p1=(arm.tr(z1,z2l,z2r,.5as,.5tip_thickness,90)soft soften(z3l,z5l)
+ z4l{right} i_t z7l{downward} i_t
+ {-(dir (7*h/w))}z10l--z10r{dir(7*h/w)} o_t
+ z7r{upward} o_t z4r{left} soften(z41,z40) z2l)--cycle;
+ else:
+ p1=(arm.tr(z1,z2l,z2r,.5as,.5tip_thickness,90)soft soften(z3l,z5l)
+ z4l{right} i_t z7l{downward} i_t z8l{left} i_t
+ bulb.bl(z9,z8l,z8r,.75cs,.75bulb_thickness,90)
+ o_t z7r{upward} o_t z4r{left} soften(z41,z40) z2l)--cycle;
+ fi
+ showpoints(1,2,3,4,5,7,8,9,10,40,41);
+ adjust(.5num_fit_b#+m_a*b_mfit#,.5num_fit_b#+m_a*b_mfit#);
+ show_character; endchar;
+ enddef;
+
+ vardef number_five= save a,b;
+ vardef a=condition(open_tail)t; testing_codes; character_points; enddef;
+ vardef b=condition(open_tail)f; testing_codes; character_points; enddef;
+ if test_all_characters:a;b; else:if open_tail:a; else:b; fi fi
+ enddef;
+
+ number_five; save number_five;
+
+
+
+ def character_points=
+iff OK "6": "The number 6";
+ beginchar(54+alt6,num_width_c#+c_mono#,cap#,0);
+
+ save_pairs(good_dir);
+ top z0r=(.9w,h+ov_t.uc)//; pos0(max(1,.9minor_curve.uc),90+taper_angle);
+ z1=(.85w,.98h)//;
+ lft z3r=(0,(1-v_stress)*h)//; rt z3l=z3r+(stem.uc,0);
+ top y2r=bot y2l+minor_curve.uc=h+ov_t.uc;
+ good_x_for(2l)(z3l,z1-(bulb_thickness,0),.7)a; good_x_for(2r)(z3r,z1,.7)b;
+ bot y4r=top y4l-minor_curve.uc=-ov_b.uc;
+ y6r=y6l+max(1,round(.9minor_curve.uc))=.7h;
+ rt z5r=(w,v_stress[y4r,y6r])//;
+ lft z5l=(x5r-stem.uc,v_stress[y4r,y6r]);
+ good_x_for(4l)(z3l,z5l,.5)c; good_x_for(4r)(z3r,z5r,.5)d;
+ y100=(.5ductal)[y6l,y3l];
+
+ ref1=z4l{left} i_t z3l{upward} i_t if open_tail:z0l else: z2l{right} fi;
+ z7l=ref1 intersectionpoint ((0,y5r)..(w,y5r)//);
+ z7r=ref1 intersectionpoint ((0,y100)..(w,y100)//);
+ (t1,t2)=ref1 intersectiontimes ((0,y100)..(w,y100)//);
+ good_x_for(6l)(z7l,z5l,.52)e; good_x_for(6r)(z7r,z5r,.5)f;
+
+ ref2=z6r{left}...z7r;
+ if (angle(direction 1 of ref2)<=-90-oblique)and
+ (angle(direction 1 of ref2)>=-180-oblique):good_dir7=(0,0);
+ else: good_dir7=dir(-90-oblique);fi
+
+ p1'=z6l{left} i_t z7l{downward} i_t z4l{right} i_t z5l{upward} i_t cycle;
+ p1=if open_tail:(z7r+(0,eps){upward} i_t z0l--z0r
+ else:(subpath(t1,infinity) of ref1--
+ bulb.tr(z1,z2l,z2r,.75cs,.75bulb_thickness,90)soft fi
+ o_t z3r{downward} o_t
+ z4r{right} o_t z5r{upward} o_t z6r{left}...z7r{good_dir7})--cycle;
+
+ showpoints(0,1,2,3,4,5,6,7);
+ adjust(.5num_fit_c#+m_a*c_mfit#,.5num_fit_c#+m_a*c_mfit#);
+ show_character; endchar;
+ enddef;
+
+ def number_six=save a,b;
+ vardef a=condition(open_tail)t; testing_codes; character_points; enddef;
+ vardef b=condition(open_tail)f; testing_codes; character_points; enddef;
+ if test_all_characters:a;b;else:if open_tail:a;else:b;fi fi
+ enddef;
+
+ number_six; save number_six;
+
+
+
+iff OK "7": "The number 7";
+ beginchar("7",num_width_b#+b_mono#,cap#,0);
+
+ top z1=(0,h)//;
+ z3r=(w,h-apex.uc)//;
+ z40=(w,h)//;
+ z5l=(.05w,0);
+ z6=(x5l+bowlstem.uc,0);
+ top y2r=bot y2l+max(1,.9stem.uc)=h;
+
+ numeric theta[],phi[],d[];
+ d1=thin_stem.uc;
+ theta1=angle(length(z3r-z5l) +-+ d1,d1);
+ phi1=angle(z3r-z5l)-theta1;
+ multpos(3,5)(thin_stem.uc,phi1-90);
+
+ onaline(3l,5l)(4l,41); y41=y2l; y4l=.5[y5l,y41];
+ z4r=.5[z3r,z5r];
+ good_x_for(2r)(z1,z40,.5)a; good_x_for(2l)(z1+(tip_thickness,0),z41,.5)b;
+
+ p1=(arm.tl(z1,z2l,z2r,.5as,.75tip_thickness,90-arm_angle+oblique)soft--z41
+ if softpath:)softjoin( else:--fi
+ flex(z41,(z4l-(.05w,0)),z5l))softjoin(z5l--z6)softjoin
+ (flex(z6,(z4r-(.05w,0)),z3r))
+ if softpath:softjoin(z3r--z40)softjoin else:--fi (z40--z2r)--cycle;
+
+ showpoints(1,2,3,4,5,6,40,41);
+adjust(.7num_fit_b#+m_e*b_mfit#,.3num_fit_b#+m_ee*b_mfit#);
+show_character; endchar;
+
+
+iff OK "8": "The number 8";
+ beginchar("8",num_width_c#+d_mono#,cap#,0);
+
+ bot z6r=(.5w,-ov_b.uc); top y6l=bot y6r+thin_stem.lc;
+ top z2l=(x6r,h+ov_t.uc)//; bot y2r=top y2l-thin_stem.lc;
+ z4=z8=.55[z6r,z2l];
+ rt z1l=(round(.95w),.5[y4,y2l])//; lft z1r=rt z1l-(thin_stem.lc,0);
+ lft z3l=(round(.05w),.5[y4,y2l])//; rt z3r=lft z3l+(stem.lc,0);
+ z1=.5[z1l,z1r]; z3=.5[z3l,z3r];
+ rt z5r=(w,.5[y6r,y4])//; lft z5l=rt z5r-(stem.lc,0); z5=.5[z5l,z5r];
+ lft z7r=(0,.5[y6r,y4])//; rt z7l=lft z7r+(thin_stem.lc,0); z7=.5[z7l,z7r];
+ good_x_for(2r)(z3r,z1r,.5)a;
+ good_x_for(6l)(z7l,z5l,.5)b;
+
+ ref5=z3..z4..z5; ref6=z1..z8..z7;
+ pos4(max(1,.95stem.lc),
+ (angle(postcontrol 1 of ref5-precontrol 1 of ref5))+90);
+ pos8(max(1,thin_stem.lc),
+ (angle(postcontrol 1 of ref6-precontrol 1 of ref6))+90);
+
+ ref1=z2r{left} i_t z3r{downward} i_t z4r o_t z5r{downward} o_t z6r{left};
+ ref2=z6r{left} o_t z7r{upward} o_t z8l i_t z1r{upward} i_t z2r{left};
+ ref3=z2l{right} o_t z1l{downward} o_t z8r i_t z7l{downward} i_t z6l{right};
+ ref4=z6l{right} i_t z5l{upward} i_t z4l o_t z3l{upward} o_t z2l{right};
+ (t1,t2)=ref1 intersectiontimes ref2; (t3,t4)=ref1 intersectiontimes ref3;
+ (t5,t6)=ref3 intersectiontimes ref4; (t7,t8)=ref2 intersectiontimes ref4;
+
+ p1 =(subpath(0,t4-eps)of ref3)--(subpath(t3+eps,infinity)of ref1)--
+ (subpath(0,t7-eps)of ref2)--(subpath(t8+eps,infinity)of ref4)--cycle;
+ p1'=(subpath(0,t1-eps)of ref1)--(subpath(t2+eps,infinity)of ref2)--cycle;
+ p2'=(subpath(0,t6-eps)of ref4)--(subpath(t5+eps,infinity)of ref3)--cycle;
+
+ showpoints(1,2,3,5,6,7,41,42,43,44);
+adjust(.5num_fit_c#+m_a*d_mfit#,.5num_fit_c#+m_a*d_mfit#);
+show_character; endchar;
+
+
+
+ def character_points=.
+iff OK "9": "The number 9";
+ beginchar(57+alt6,num_width_c#+c_mono#,cap#,0);
+
+ save_pairs(good_dir);
+ bot z0r=(.1w,-ov_b.uc)//; pos0(max(1,.9minor_curve.uc),-90+taper_angle);
+ z1=(.15w,.02h)//;
+ rt z3r=(w,v_stress*h)//; lft z3l=z3r-(stem.uc,0);
+ bot y2r=top y2l-minor_curve.uc=-ov_b.uc;
+ good_x_for(2l)(z3l,z1+(bulb_thickness,0),.7)a; good_x_for(2r)(z3r,z1,.7)b;
+ top y4r=bot y4l+minor_curve.uc=h+ov_t.uc;
+ y6r=y6l-max(1,round(.9minor_curve.uc))=.3h;
+ lft z5r=(0,(1-v_stress)[y4r,y6r])//;
+ rt z5l=(x5r+stem.uc,(1-v_stress)[y4r,y6r]);
+ good_x_for(4l)(z3l,z5l,.5)c; good_x_for(4r)(z3r,z5r,.5)d;
+ y100=(.5ductal)[y6l,y3l];
+
+ ref1=z4l{right} i_t z3l{downward} i_t if open_tail:z0l else:z2l{left} fi;
+ z7l=ref1 intersectionpoint ((0,y5r)..(w,y5r)//);
+ z7r=ref1 intersectionpoint ((0,y100)..(w,y100)//);
+ (t1,t2)=ref1 intersectiontimes ((0,y100)..(w,y100)//);
+ good_x_for(6l)(z7l,z5l,.52)e; good_x_for(6r)(z7r,z5r,.5)f;
+
+ ref2=z6r{right}...z7r;
+ if (angle(direction 1 of ref2)<=90-oblique)and
+ (angle(direction 1 of ref2)>=-oblique):good_dir7=(0,0);
+ else: good_dir7=dir(90-oblique);fi
+
+ p1'=z6l{right} i_t z7l{upward} i_t z4l{left} i_t z5l{downward} i_t cycle;
+ p1 =if open_tail:(z7r-(0,eps){downward} i_t z0l--z0r
+ else:(subpath(t1,infinity) of ref1--
+ bulb.bl(z1,z2l,z2r,.75cs,.75bulb_thickness,90)soft fi
+ o_t z3r{upward} o_t
+ z4r{left} o_t z5r{downward} o_t z6r{right}...z7r{good_dir7})--cycle;
+
+ showpoints(0,1,2,3,4,5,6,7);
+ adjust(.5num_fit_c#+m_a*c_mfit#,.5num_fit_c#+m_a*c_mfit#);
+ show_character; endchar;
+ enddef;
+
+ def number_nine=save a,b;
+ vardef a=condition(open_tail)t; testing_codes; character_points; enddef;
+ vardef b=condition(open_tail)f; testing_codes; character_points; enddef;
+ if test_all_characters:a;b;else:if open_tail:a;else:b;fi fi
+ enddef;
+
+ number_nine; save number_nine;
+
+
+