% Feta (not the Font-En-Tja) music font --  ancient accidentals
% This file is part of LilyPond, the GNU music typesetter.
%
% Copyright (C) 2001--2022 Juergen Reuter <reuter@ipd.uka.de>
%
% The LilyPond font is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version, or under the SIL Open Font License.
%
% LilyPond is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.

fet_begingroup ("accidentals");


%%%%%%%%
%
%
%
% EDITIO MEDICAEA
%
%
%
fet_beginchar ("Ed. Med. flat" , "medicaeaM1");
  set_char_box (0.1 staff_space#, 0.6 staff_space#,
                0.6 staff_space#, 1.0 staff_space#);

  save ellipse, pat, outline, T;
  path ellipse, pat, outline;
  transform T;

  T := identity xscaled 0.50 linethickness
                yscaled 0.22 staff_space;
  pickup pencircle transformed T;
  ellipse := fullcircle transformed T;

  x1 = x2 = 0;
  top y1 = h;
  bot y2 = -d;

  fill get_subpath (ellipse, up, down, z1)
       -- get_subpath (ellipse, down, up, z2)
       -- cycle;

  T := identity xscaled 0.50 linethickness
                yscaled 0.22 staff_space
                rotated -63;
  pickup pencircle transformed T;
  ellipse := fullcircle transformed T;

  z3 = (0.10 staff_space, -0.50 staff_space);
  z4 = (0.40 staff_space, +0.40 staff_space);
  z5 = (0.10 staff_space, +0.40 staff_space);

  pat := z3{(1, 2)}
         .. z4
         .. z5{(-1, -1)};

  % the original envelope curve created with `draw' contains
  % cusps which we avoid
  outline := get_subpath (ellipse, -direction 0 of pat,
                          direction 0 of pat, z3)
             .. get_subpoint (ellipse, direction 1 of pat, z4)
             .. get_subpath (ellipse, direction 2 of pat,
                             -direction 1.8 of pat, z5)
             .. get_subpoint (ellipse, -direction 1 of pat, z4)
                               {-direction 1 of pat}
             .. cycle;

  save shift;
  pair shift;

  % make the outline touch the bounding box
  shift = find_tangent_shift (((w, -d) -- (w, h)), outline,
                              (b, 0), (-b, 0));
  outline := outline shifted shift;

  fill outline;

  labels (1, 2, 3, 4, 5);
fet_endchar;


%%%%%%%%
%
%
%
% EDITIO VATICANA
%
%
%
fet_beginchar ("Ed. Vat. flat" , "vaticanaM1");
  z1 = (0.00 staff_space, +0.80 staff_space);
  z2 = (0.00 staff_space, -0.08 staff_space);
  z3 = (0.25 staff_space, -0.23 staff_space);
  z4 = (0.50 staff_space, -0.24 staff_space);
  z5 = (0.50 staff_space, +0.03 staff_space);
  z6 = (0.25 staff_space, +0.20 staff_space);
  z7 = (0.15 staff_space, +0.26 staff_space);

  save pat, ellipse, T;
  path pat, ellipse;
  transform T;

  T := identity xscaled 0.50 linethickness
                yscaled 0.22 staff_space;
  pickup pencircle transformed T;
  ellipse := fullcircle transformed T;

  pat := z1
         -- z2{down}
         ... z3
         ... {up}z4
         -- z5{up}
         .. z6
         .. z7;

  % the original envelope curve created with `draw' contains
  % cusps which we avoid
  fill get_subpath (ellipse, up, down, z1)
       -- get_subpath (ellipse, down, direction 1.1 of pat, z2)
       ... bot z3
       ... get_subpath (ellipse, direction 2.9 of pat, up, z4)
       -- get_subpath (ellipse, up, direction 4.1 of pat, z5)
       .. top z6
       .. get_subpath (ellipse,
                       direction 6 of pat, -direction 6 of pat, z7)
       .. bot z6
       .. {down}bot lft z5
       -- top lft z4{down}
       ... top z3
       ... top rt z2{up}
       -- cycle;

  set_char_box (0.00 staff_space# + 0.25 linethickness#,
                0.50 staff_space# + 0.25 linethickness#,
                0.23 staff_space# + 0.11 staff_space#,
                0.80 staff_space# + 0.11 staff_space#);

  labels (1, 2, 3, 4, 5, 6, 7);
fet_endchar;


fet_beginchar ("Ed. Vat. natural" , "vaticana0");
  save ellipse, T;
  path ellipse;
  transform T;

  T := identity xscaled 0.80 linethickness
                yscaled 0.22 staff_space;
  pickup pencircle transformed T;
  ellipse := fullcircle transformed T;

  z1 = (0.00 staff_space, +0.65 staff_space);
  z2 = (0.00 staff_space, -0.35 staff_space);

  fill get_subpath (ellipse, up, down, z1)
       -- get_subpath (ellipse, down, up, z2)
       -- cycle;

  pickup penrazor scaled 0.22 staff_space
                  rotated 90;

  z3 = (0.00 staff_space, -0.30 staff_space);
  z4 = (0.40 staff_space, -0.08 staff_space);

  draw z3
       -- z4;

  addto currentpicture also currentpicture
    xscaled -1
    yscaled -1
    shifted (0.40 staff_space, 0.0 staff_space);

  set_char_box (0.00 staff_space# + 0.40 linethickness#,
                0.40 staff_space# + 0.40 linethickness#,
                0.65 staff_space# + 0.11 staff_space#,
                0.65 staff_space# + 0.11 staff_space#);

  labels (1, 2, 3, 4);
fet_endchar;


%%%%%%%%
%
%
%
% MENSURAL NOTATION
%
%
%
fet_beginchar ("mensural sharp" , "mensural1");
  save stemthick;

  define_pixels (stemthick);

  stemthick# = linethickness#;

  save circle, pat, T;
  path circle, pat;
  transform T;

  T := identity scaled 0.8 stemthick;
  pickup pencircle transformed T;
  circle := fullcircle transformed T;

  z1 = 0.4 staff_space * (0.8, 1);
  z1 = -z2;

  pat := get_subpath (circle, z1 - z2, z2 - z1, z1)
         -- get_subpath (circle, z2 - z1, z1 - z2, z2)
         -- cycle;

  fill pat;
  fill pat xscaled -1;
  fill pat shifted (0.20 staff_space, 0);
  fill pat xscaled -1 shifted (0.20 staff_space, 0);

  set_char_box (0.8 * 0.4 staff_space# + 0.4 stemthick#,
                (0.8 * 0.4 + 0.2) * staff_space# + 0.4 stemthick#,
                0.4 staff_space# + 0.4 stemthick#,
                0.4 staff_space# + 0.4 stemthick#);

  labels (1, 2);
fet_endchar;


fet_beginchar ("mensural flat" , "mensuralM1");
  save stemthick;

  define_pixels (stemthick);

  stemthick# = linethickness#;

  save ellipse, pat, outline, T;
  path ellipse, pat, outline;
  transform T;

  T := identity xscaled 1.4 stemthick
                yscaled 0.6 stemthick
                rotated 45;
  pickup pencircle transformed T;
  ellipse := fullcircle transformed T;

  z1 = (0.00 staff_space, +1.80 staff_space);
  z2 = (0.00 staff_space, -0.25 staff_space);
  z3 = (0.35 staff_space, -0.25 staff_space);
  z4 = (0.35 staff_space, +0.25 staff_space);
  z5 = (0.00 staff_space, +0.25 staff_space);

  pat := z2
         .. z3
         .. z4
         .. z5;

  save dirs, s;
  pair dirs[];

  s := 1/4;

  % we approximate `draw pat'
  for i = 2 step s until (length pat + 2):
    dirs[i] := direction (i - 2) of pat;
  endfor;

  outline := get_subpath (ellipse, up, down, z1)
             -- get_subpath (ellipse, down, dirs2, z2)
             for i = (2 + s) step s until (length pat + 2 - s):
               .. get_subpoint (ellipse, dirs[i],
                                point (i - 2) of pat)
             endfor
             .. top z5
             -- bot z5
             for i = (length pat + 2 - s) step -s until 2:
               .. get_subpoint (ellipse, -dirs[i],
                                point (i - 2) of pat)
             endfor
             -- get_subpoint (ellipse, up, z2)
             -- cycle;

  fill outline;

  set_char_box (0.00 staff_space# + 0.75 stemthick#,
                0.40 staff_space# + 0.75 stemthick#,
                0.25 staff_space# + 0.75 stemthick#,
                1.80 staff_space# + 0.75 stemthick#);

  labels (1, 2, 3, 4, 5);
fet_endchar;


fet_beginchar ("Hufnagel flat" , "hufnagelM1");
  save stemthick;

  define_pixels (stemthick);

  stemthick# = linethickness#;

  save ellipse, pat, T;
  path ellipse, pat;
  transform T;

  T := identity xscaled 2.4 stemthick
                yscaled 0.4 stemthick
                rotated 45;
  pickup pencircle transformed T;
  ellipse := fullcircle transformed T;

  z1 = (0.00 staff_space, +1.80 staff_space);
  z2 = (0.00 staff_space, -0.15 staff_space);
  z3 = (0.25 staff_space, -0.30 staff_space);
  z4 = (0.50 staff_space, +0.00 staff_space);
  z5 = (0.30 staff_space, +0.30 staff_space);
  z6 = (0.00 staff_space, +0.15 staff_space);

  pat := z3
         .. z4
         .. z5;

  save t;
  numeric t[];

  % we have to find the envelope intersections (if any)
  t1 = find_envelope_cusp (reverse ellipse, pat, 1/256) + 3;
  if t1 < 3:
    t1 := 3;
  fi;
  t2 = find_envelope_cusp (ellipse, reverse pat, 1/256);
  if t2 < 0:
    t2 := 3;
  else:
    t2 := length pat - t2 + 3;
  fi;

  save dirs, s;
  pair dirs[];

  s := 1/8;

  % we approximate `draw pat'
  for i = 3 step s until 5:
    dirs[i] := direction (i - 3) of pat;
  endfor;

  fill get_subpath (ellipse, up, down, z1)
       -- get_subpath (ellipse, down, z3 - z2, z2)
       -- get_subpoint (ellipse, z3 - z2, z3)
       for i = 3 step s until 5:
         .. get_subpoint (ellipse, dirs[i], point (i - 3) of pat)
       endfor
       .. get_subpoint (ellipse, z6 - z5, z5)
       -- get_subpoint (ellipse, z6 - z5, z6)
       -- get_subpoint (ellipse, z5 - z6, z6)
       -- get_subpoint (ellipse, z5 - z6, z5)
       -- get_subpoint (ellipse, -dirs[5], z5)
       for i = (5 - s) step -s until t2:
         .. get_subpoint (ellipse, -dirs[i], point (i - 3) of pat)
       endfor
       .. get_subpoint (ellipse, -direction (t2 - 3) of pat,
                        point (t2 - 3) of pat)
       -- get_subpoint (ellipse, -direction (t1 - 3) of pat,
                        point (t1 - 3) of pat)
       for i = (floor ((t1 - 3) / s) * s + 3) step -s until (3 + s):
         .. get_subpoint (ellipse, -dirs[i], point (i - 3) of pat)
       endfor
       .. get_subpoint (ellipse, -dirs[3], z3)
       -- get_subpoint (ellipse, z2 - z3, z3)
       -- get_subpoint (ellipse, z2 - z3, z2)
       -- get_subpoint (ellipse, up, z2)
       -- cycle;

  % draw z1
  %      -- z2
  %      -- pat
  %      -- z6;

  set_char_box (0.00 staff_space# + 1.0 stemthick#,
                0.50 staff_space# + 1.0 stemthick#,
                0.30 staff_space# + 0.5 stemthick#,
                1.80 staff_space# + 0.5 stemthick#);

  labels (1, 2, 3, 4, 5, 6);
fet_endchar;


%%%%%%%%%%%%%%%
%%%
%%% Glyphs for Kievan Music Notation
%%%
%%%%%%%%%%%%%%%


fet_beginchar ("Kievan sharp", "kievan1");
  % This draws the sharp.
  % It never occurs in Synodal music and
  % can only be found in some early manuscripts.

  z1 = (0.579 staff_space, 1.459 staff_space);
  z2 = (1.414 staff_space, -0.904 staff_space);
  z3 = (0.187 staff_space, 0.904 staff_space);

  x2 - x1 = x4 - x3;
  y1 - y2 = y3 - y4;

  z5 = (1.296 staff_space, 1.613 staff_space);
  z6 = (0.090 staff_space, -0.864 staff_space);
  z7 = (1.532 staff_space, 0.892 staff_space);

  x5 - x6 = x7 - x8;
  y5 - y6 = y7 - y8;

  pickup pensquare xscaled 0.167staff_space
                   yscaled 0.167staff_space
                   rotated -69.2;
  draw z1{dir -69.2}
       .. {dir -74.1}z2;
  draw z3{dir -69.2}
       .. {dir -74.1}z4;

  pickup pensquare xscaled 0.167staff_space
                   yscaled 0.167staff_space
                   rotated -114.6;
  draw z5{dir -114.6}
       ... {dir -125.0}z6;
  draw z7{dir -114.6}
       ... {dir -125.0}z8;

  set_char_box (0, 1.6 staff_space#,
                1.6 staff_space#, 1.6 staff_space#);
fet_endchar;


fet_beginchar ("Kievan flat", "kievanM1");
  % This draws the flat sign.
  % In Synodal music, the flat only occurs on the high B
  % but it may be used elsewhere in early manuscripts.

  z1 = (0.452 staff_space, 1.772 staff_space);
  z2 = (0.481 staff_space, 1.735 staff_space);
  z3 = (0.464 staff_space, 1.626 staff_space);
  z4 = (0.249 staff_space, 0.322 staff_space);
  z5 = (0.432 staff_space, -0.762 staff_space);
  z6 = (0.611 staff_space, -0.583 staff_space);
  z7 = (0.611 staff_space, 0.224 staff_space);
  z8 = (0.652 staff_space, 0.513 staff_space);
  z9 = (0.900 staff_space, 0.684 staff_space);
  z10 = (0.872 staff_space, 0.640 staff_space);
  z11 = (0.811 staff_space, 0.359 staff_space);
  z12 = (0.811 staff_space, -0.587 staff_space);
  z13 = (0.338 staff_space, -1.063 staff_space);
  z14 = (0.016 staff_space, 0.196 staff_space);
  z15 = (0.204 staff_space, 1.316 staff_space);

  fill z13
       .. z14{up}
       .. z15{dir 70.8}
       .. z1{dir 4.9}
       .. z2
       .. z3
       .. z4{down}
       .. z5
       -- z6
       -- z7{up}
       .. z8
       .. {dir 23}z9
       & z9
       .. z10{dir -135}
       .. {down}z11
       -- z12
       -- z13
       & cycle;

  set_char_box (0, 1.0 staff_space#,
                1.0 staff_space#, 1.8 staff_space#);
fet_endchar;

fet_endgroup ("accidentals");
