AlphaTab.Rendering.Glyphs.TieGlyph.PaintTie C# (CSharp) Method

PaintTie() public static method

paints a tie between the two given points
public static PaintTie ( ICanvas canvas, float scale, float x1, float y1, float x2, float y2, bool down = false ) : void
canvas ICanvas
scale float
x1 float
y1 float
x2 float
y2 float
down bool
return void
        public static void PaintTie(ICanvas canvas, float scale, float x1, float y1, float x2, float y2,
            bool down = false)
        {
            // ensure endX > startX
            if (x2 > x1)
            {
                var t = x1;
                x1 = x2;
                x2 = t;
                t = y1;
                y1 = y2;
                y2 = t;
            }
            //
            // calculate control points
            //
            var offset = 15 * scale;
            var size = 4 * scale;
            // normal vector
            var normalVectorX = (y2 - y1);
            var normalVectorY = (x2 - x1);
            var length = (float)Math.Sqrt((normalVectorX * normalVectorX) + (normalVectorY * normalVectorY));
            if (down)
                normalVectorX *= -1;
            else
                normalVectorY *= -1;

            // make to unit vector
            normalVectorX /= length;
            normalVectorY /= length;

            // center of connection
            var centerX = (x2 + x1) / 2;
            var centerY = (y2 + y1) / 2;

            // control points
            var cp1X = centerX + (offset * normalVectorX);
            var cp1Y = centerY + (offset * normalVectorY);
            var cp2X = centerX + ((offset - size) * normalVectorX);
            var cp2Y = centerY + ((offset - size) * normalVectorY);
            canvas.BeginPath();
            canvas.MoveTo(x1, y1);
            canvas.QuadraticCurveTo(cp1X, cp1Y, x2, y2);
            canvas.QuadraticCurveTo(cp2X, cp2Y, x1, y1);
            canvas.ClosePath();
        }

Usage Example

Example #1
0
        public override void Paint(float cx, float cy, ICanvas canvas)
        {
            // only render slur once per staff
            var slurId         = "score.slur." + _startBeat.SlurOrigin.Id;
            var renderer       = Renderer;
            var isSlurRendered = renderer.Staff.GetSharedLayoutData(slurId, false);

            if (!isSlurRendered)
            {
                renderer.Staff.SetSharedLayoutData(slurId, true);

                var startNoteRenderer = Renderer.ScoreRenderer.Layout.GetRendererForBar <BarRendererBase>(Renderer.Staff.StaveId, _startBeat.Voice.Bar);
                var direction         = GetBeamDirection(_startBeat, startNoteRenderer);

                var startX = cx + startNoteRenderer.X;
                var startY = cy + startNoteRenderer.Y;
                if (_startBeat.SlurOrigin.Id == _startBeat.Id)
                {
                    startX += startNoteRenderer.GetBeatX(_startBeat, BeatXPosition.MiddleNotes);
                    var note = direction == BeamDirection.Down ? _startBeat.MinNote : _startBeat.MaxNote;
                    startY += startNoteRenderer.GetNoteY(note);
                }
                else
                {
                    startY += startNoteRenderer.Height;
                }
                var endBeat = _startBeat.SlurOrigin.SlurDestination;

                var   endNoteRenderer = Renderer.ScoreRenderer.Layout.GetRendererForBar <ScoreBarRenderer>(Renderer.Staff.StaveId, endBeat.Voice.Bar);
                float endX;
                float endY;
                if (endNoteRenderer == null || startNoteRenderer.Staff != endNoteRenderer.Staff)
                {
                    endNoteRenderer = (ScoreBarRenderer)startNoteRenderer.Staff.BarRenderers[startNoteRenderer.Staff.BarRenderers.Count - 1];
                    endX            = cx + endNoteRenderer.X + endNoteRenderer.Width;
                    endY            = cy + endNoteRenderer.Y + endNoteRenderer.Height;
                }
                else
                {
                    endX = cx + endNoteRenderer.X + endNoteRenderer.GetBeatX(endBeat, BeatXPosition.MiddleNotes);

                    // if the note stem is pointing towards the slur, we need to let it end on top of the stem.
                    var endBeatHelper = endNoteRenderer.Helpers.GetBeamingHelperForBeat(endBeat);
                    if (endBeatHelper.Direction == direction)
                    {
                        endY = cy + endNoteRenderer.Y + endNoteRenderer.CalculateBeamY(endBeatHelper, endX);
                    }
                    else
                    {
                        var note = direction == BeamDirection.Down ? endBeat.MinNote : endBeat.MaxNote;
                        endY = cy + endNoteRenderer.Y + endNoteRenderer.GetNoteY(note);
                    }
                }

                var height = (endX - startX) * Renderer.Settings.SlurHeightFactor;

                TieGlyph.PaintTie(canvas, Scale, startX, startY, endX, endY, direction == BeamDirection.Down, height);
                canvas.Fill();
            }
        }
All Usage Examples Of AlphaTab.Rendering.Glyphs.TieGlyph::PaintTie