+ledgerlinethickness_rounded# := ledgerlinethickness#;
+
+define_pixels (staff_space, stemthickness, stafflinethickness,
+ ledgerlinethickness, linethickness);
+define_whole_pixels (staff_space_rounded);
+define_whole_blacker_pixels (stemthickness_rounded);
+define_whole_vertical_blacker_pixels (stafflinethickness_rounded,
+ ledgerlinethickness_rounded,
+ linethickness_rounded);
+
+if ledgerlinethickness_rounded > 2 stafflinethickness_rounded:
+ ledgerlinethickness_rounded := 2 stafflinethickness_rounded;
+fi;
+
+%
+% Because of the engraving/stamping process, no traditional
+% characters have sharp edges and corners.
+% The following variable controls the amount of `roundness'.
+%
+% This is not a meta variable: it is related to absolute sizes.
+%
+% FIXME: According to [Wanske], only outside corners should be round
+% I don't think we do this anywhere -- jcn
+%
+
+blot_diameter# = .40 pt#;
+if (blot_diameter# * hppp) < 1:
+ blot_diameter# := 1 / hppp;
+fi
+if (blot_diameter# * vppp) < 1:
+ blot_diameter# := 1 / vppp;
+fi
+
+define_pixels (blot_diameter);
+
+
+%
+% symmetry
+% --------
+%
+% Some glyphs have to be positioned exactly between stafflines (clefs,
+% note heads). This needs some care at lower resolutions.
+%
+% Most glyphs use the staffline thickness and the space between two
+% staff lines as the fundamental parameters. The latter is the distance
+% between the middle of one staff line to the middle of the next. To
+% say it differently, the value `staff_space' is the sum of one staff line
+% thickness and the whitespace between two adjacent staff lines.
+%
+% Normally, feta's vertical origin for glyphs is either the middle
+% between two staff lines or the middle of a staff line. For example, the
+% lower edge of the central staff line is at the vertical position
+% `-<staffline thickness> / 2', and the upper edge at
+% `<staffline thickness> / 2'. Here we need a value rounded to an integer
+% (the feta code uses `stafflinethickness_rounded' for that purpose).
+%
+% If we have an odd number of pixels as the staffline thickness, Metafont
+% rounds `-stafflinethickness_rounded / 2' towards zero and
+% `stafflinethickness_rounded / 2' towards infinity. Example: `round -1.5'
+% yields -1, `round 1.5' yields 2. The whitespace between staff lines is
+% handled similarly. If we assume that stafflinethickness_rounded is odd,
+% we have the following cases:
+%
+% o The glyph is centered between three stafflines or five stafflines
+% (clef, `c' meter). We have this:
+%
+% ___________ a
+% ___________ 1
+% ___________ a
+%
+% whitespace
+%
+% ___________ a
+% ...... ___________ 1 .................. x axis
+% ___________ a
+%
+% whitespace
+%
+% ___________ a
+% ___________ 1
+% ___________ a
+%
+% As can be seen, we get symmetry if we split staff lines into two
+% equal parts `a' and a pixel line with thickness 1. Consequently, we
+% use the following algorithm:
+%
+% . Decrease the height `h' by 1 temporarily.
+%
+% . Compute the path for the upper half of the glyph.
+%
+% . Mirror the path at the x axis.
+%
+% . Shift the upper half one pixel up and connect it with the lower path.
+%
+% . Restore height and decrease `d' by 1.
+%
+% o The glyph is centered between two or four staff lines, and the origin is
+% the middle of the whitespace. Assuming that the whitespace consists of
+% an odd number of pixels, we have this:
+%
+% -----------
+% b
+% 1
+% b
+% ___________
+% b
+% .................. 1 ................. x axis
+% b
+% ___________
+% b
+% 1
+% b
+% ___________
+%
+% For symmetrical glyphs, this leads to a similar algorithm as above.
+% Glyphs which can't be constructed from an upper and lower part need
+% to be handled differently, namely to shift up the vertical center by
+% half a pixel:
+%
+% ___________
+% b
+%
+% 0.5
+% .................. 0.5 ................ x axis
+%
+% b
+% ___________
+%
+
+feta_eps := 0;
+feta_shift := 0;
+feta_space_shift := 0;
+
+% Use this for paths with a slant of 45 degrees to assure that
+% the middle point of a penpos gets covered.
+pair feta_offset;
+feta_offset := (0, 0);
+
+if known miterlimit:
+ pickup nullpen;
+else:
+ feta_eps := eps;
+
+ if odd stafflinethickness_rounded:
+ feta_shift := 1;
+ fi;
+
+ if odd (staff_space_rounded - stafflinethickness_rounded):
+ feta_space_shift := 1;
+ fi;
+
+ feta_offset := (0.5, 0.5);
+
+ pickup pencircle scaled 1;
+fi;
+
+feta_fillpen := savepen;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Notehead width and height are defined here.
+%
+%
+% Slope of slash. From scm/grob-description.scm. How to auto-copy?
+slash_slope := 1.7;