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); } } } } }