private void PaintBar(float cx, float cy, ICanvas canvas, BeamingHelper h)
{
for (int i = 0, j = h.Beats.Count; i < j; i++)
{
var beat = h.Beats[i];
//
// draw line
//
var beatLineX = h.GetBeatLineX(beat) + Scale;
var direction = h.Direction;
var y1 = cy + Y + (direction == BeamDirection.Up
? GetScoreY(GetNoteLine(beat.MinNote))
: GetScoreY(GetNoteLine(beat.MaxNote)));
var y2 = cy + Y + CalculateBeamY(h, beatLineX);
canvas.BeginPath();
canvas.MoveTo(cx + X + beatLineX, y1);
canvas.LineTo(cx + X + beatLineX, y2);
canvas.Stroke();
float fingeringY = y2;
if (direction == BeamDirection.Down)
{
fingeringY += canvas.Font.Size * 2f;
}
else if (i != 0)
{
fingeringY -= canvas.Font.Size * 1.5f;
}
PaintFingering(canvas, beat, cx + X + beatLineX, direction, fingeringY);
var brokenBarOffset = 6 * Scale;
var barSpacing = 6 * Scale;
var barSize = 3 * Scale;
var barCount = beat.Duration.GetIndex() - 2;
var barStart = cy + Y;
if (direction == BeamDirection.Down)
{
barSpacing = -barSpacing;
barSize = -barSize;
}
for (var barIndex = 0; barIndex < barCount; barIndex++)
{
float barStartX;
float barEndX;
float barStartY;
float barEndY;
var barY = barStart + (barIndex * barSpacing);
//
// Bar to Next?
//
if (i < h.Beats.Count - 1)
{
// full bar?
if (IsFullBarJoin(beat, h.Beats[i + 1], barIndex))
{
barStartX = beatLineX;
barEndX = h.GetBeatLineX(h.Beats[i + 1]) + Scale;
}
// broken bar?
else if (i == 0 || !IsFullBarJoin(h.Beats[i - 1], beat, barIndex))
{
barStartX = beatLineX;
barEndX = barStartX + brokenBarOffset;
}
else
{
continue;
}
barStartY = barY + CalculateBeamY(h, barStartX);
barEndY = barY + CalculateBeamY(h, barEndX);
PaintSingleBar(canvas, cx + X + barStartX, barStartY, cx + X + barEndX, barEndY, barSize);
}
//
// Broken Bar to Previous?
//
else if (i > 0 && !IsFullBarJoin(beat, h.Beats[i - 1], barIndex))
{
barStartX = beatLineX - brokenBarOffset;
barEndX = beatLineX;
barStartY = barY + CalculateBeamY(h, barStartX);
barEndY = barY + CalculateBeamY(h, barEndX);
PaintSingleBar(canvas, cx + X + barStartX, barStartY, cx + X + barEndX, barEndY, barSize);
}
}
}
}