public override void Paint(float cx, float cy, ICanvas canvas)
{
if (EndNote == null) return;
var startNoteRenderer = Renderer.Layout.GetRendererForBar(Renderer.Staff.StaveId, StartNote.Beat.Voice.Bar);
var endNoteRenderer = Renderer.Layout.GetRendererForBar(Renderer.Staff.StaveId, EndNote.Beat.Voice.Bar);
float startX = 0;
float endX = 0;
float startY = 0;
float endY = 0;
var shouldDraw = false;
var parent = (BeatContainerGlyph)Parent;
// if we are on the tie start, we check if we
// either can draw till the end note, or we just can draw till the bar end
if (!_forEnd)
{
// line break or bar break
if (startNoteRenderer != endNoteRenderer)
{
startX = cx + startNoteRenderer.GetNoteX(StartNote);
// line break: to bar end
if (endNoteRenderer == null || startNoteRenderer.Staff != endNoteRenderer.Staff)
{
endX = cx + parent.X;
}
// bar break: to tie destination
// differs only by addition of EndNote X coordinate
else
{
endX = cx + parent.X;
endX += endNoteRenderer.GetNoteX(EndNote);
}
startY = cy + startNoteRenderer.GetNoteY(StartNote) + YOffset;
endY = startY;
}
else
{
startX = cx + startNoteRenderer.GetNoteX(StartNote);
endX = cx + endNoteRenderer.GetNoteX(EndNote, false);
startY = cy + startNoteRenderer.GetNoteY(StartNote) + YOffset;
endY = cy + endNoteRenderer.GetNoteY(EndNote) + YOffset;
}
shouldDraw = true;
}
// if we draw for the tie end, we only draw a tie if we had a line break between start and end
// in this case there will be a tie from bar start to the note
else if (startNoteRenderer.Staff != endNoteRenderer.Staff)
{
startX = cx;
endX = cx + endNoteRenderer.GetNoteX(EndNote);
startY = cy + endNoteRenderer.GetNoteY(EndNote) + YOffset;
endY = startY;
shouldDraw = true;
}
if (shouldDraw)
{
PaintTie(canvas, Scale, startX, startY, endX, endY,
GetBeamDirection(StartNote, startNoteRenderer) == BeamDirection.Down);
canvas.Fill();
}
}