public override void Paint(float cx, float cy, ICanvas canvas)
{
var tabBarRenderer = (TabBarRenderer)Renderer;
var res = Renderer.Resources;
var startX = cx + X + _parent.OnNotes.Width / 2;
var endX = _beat.NextBeat == null || _beat.Voice != _beat.NextBeat.Voice
? cx + X + _parent.Width
: cx + tabBarRenderer.GetBeatX(_beat.NextBeat);
var startY = cy;
var sizeY = WhammyMaxOffset * Scale;
var old = canvas.TextAlign;
canvas.TextAlign = TextAlign.Center;
if (_beat.WhammyBarPoints.Count >= 2)
{
var dx = (endX - startX) / Beat.WhammyBarMaxPosition;
var dy = sizeY / Beat.WhammyBarMaxValue;
canvas.BeginPath();
for (int i = 0, j = _beat.WhammyBarPoints.Count - 1; i < j; i++)
{
var pt1 = _beat.WhammyBarPoints[i];
var pt2 = _beat.WhammyBarPoints[i + 1];
if (pt1.Value == pt2.Value && i == _beat.WhammyBarPoints.Count - 2)
{
continue;
}
var pt1X = startX + (dx * pt1.Offset);
var pt1Y = startY - (dy * pt1.Value);
var pt2X = startX + (dx * pt2.Offset);
var pt2Y = startY - (dy * pt2.Value);
canvas.MoveTo(pt1X, pt1Y);
canvas.LineTo(pt2X, pt2Y);
if (pt2.Value != 0)
{
var dv = pt2.Value;
var s = "";
if (dv >= 4 || dv <= -4)
{
int steps = dv / 4;
s += steps;
// Quaters
dv -= steps * 4;
}
if (dv > 0)
{
s += BendGlyph.GetFractionSign(dv);
}
if (s != "")
{
// draw label
canvas.Font = res.GraceFont;
//var size = canvas.MeasureText(s);
var sy = pt2Y;
if (pt2Y < pt1Y)
{
sy -= canvas.Font.Size;
}
else
{
sy += 3 * Scale;
}
var sx = pt2X;
canvas.FillText(s, sx, sy);
}
}
}
canvas.Stroke();
}
canvas.TextAlign = old;
}