private void PaintFooter(float cx, float cy, ICanvas canvas, BeamingHelper h)
{
var beat = h.Beats[0];
var isGrace = beat.GraceType != GraceType.None;
var scaleMod = isGrace ? NoteHeadGlyph.GraceScale : 1;
//
// draw line
//
var stemSize = GetFooterStemSize(h.ShortestDuration);
var beatLineX = h.GetBeatLineX(beat) + Scale;
var direction = h.Direction;
var topY = GetScoreY(GetNoteLine(beat.MaxNote));
var bottomY = GetScoreY(GetNoteLine(beat.MinNote));
float beamY;
float fingeringY;
if (direction == BeamDirection.Down)
{
bottomY += stemSize * scaleMod;
beamY = bottomY;
fingeringY = cy + Y + bottomY;
}
else
{
topY -= stemSize * scaleMod;
beamY = topY;
fingeringY = cy + Y + topY;
}
PaintFingering(canvas, beat, cx + X + beatLineX, direction, fingeringY);
if (beat.Duration == Duration.Whole || beat.Duration == Duration.DoubleWhole)
{
return;
}
canvas.BeginPath();
canvas.MoveTo(cx + X + beatLineX, cy + Y + topY);
canvas.LineTo(cx + X + beatLineX, cy + Y + bottomY);
canvas.Stroke();
if (isGrace)
{
var graceSizeY = 15 * Scale;
var graceSizeX = 12 * Scale;
canvas.BeginPath();
if (direction == BeamDirection.Down)
{
canvas.MoveTo(cx + X + beatLineX - (graceSizeX / 2), cy + Y + bottomY - graceSizeY);
canvas.LineTo(cx + X + beatLineX + (graceSizeX / 2), cy + Y + bottomY);
}
else
{
canvas.MoveTo(cx + X + beatLineX - (graceSizeX / 2), cy + Y + topY + graceSizeY);
canvas.LineTo(cx + X + beatLineX + (graceSizeX / 2), cy + Y + topY);
}
canvas.Stroke();
}
//
// Draw beam
//
if (beat.Duration > Duration.Quarter)
{
var glyph = new BeamGlyph(beatLineX - Scale / 2f, beamY, beat.Duration, direction, isGrace);
glyph.Renderer = this;
glyph.DoLayout();
glyph.Paint(cx + X, cy + Y, canvas);
}
}