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];
if (h.HasBeatLineX(beat))
{
//
// draw line
//
var beatLineX = h.GetBeatLineX(beat) + Scale;
var y1 = cy + Y;
var y2 = cy + Y + Height;
canvas.BeginPath();
canvas.MoveTo(cx + X + beatLineX, y1);
canvas.LineTo(cx + X + beatLineX, y2);
canvas.Stroke();
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;
barStart += Height;
}
for (int barIndex = 0; barIndex < barCount; barIndex++)
{
float barStartX;
float barEndX;
float barStartY;
float barEndY;
var barY = barStart + (barIndex * barSpacing);
//
// Broken Bar to Next
//
if (h.Beats.Count == 1)
{
barStartX = beatLineX;
barEndX = beatLineX + brokenBarOffset;
barStartY = barY;
barEndY = barY;
PaintSingleBar(canvas, cx + X + barStartX, barStartY, cx + X + barEndX, barEndY, barSize);
}
//
// Bar to Next?
//
else 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;
barEndY = barY;
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;
barEndY = barY;
PaintSingleBar(canvas, cx + X + barStartX, barStartY, cx + X + barEndX, barEndY, barSize);
}
}
}
}
}