private void DrawTies(ScoreRendererBase renderer, Note element, double notePositionY) { if (element.TieType == NoteTieType.Start) { measurementService.TieStartSystem = element.Measure?.System; measurementService.TieStartPoint = new Point(scoreService.CursorPositionX + GetNoteheadWidthPx(element, renderer) / 2, notePositionY); measurementService.TieStartElement = element; } else if (element.TieType != NoteTieType.None) //Stop or StopAndStartAnother / Stop lub StopAndStartAnother { var tieEndpointThickness = renderer.GetEngravingDefault("tieEndpointThickness") ?? 1; var tieMidpointThickness = renderer.GetEngravingDefault("tieMidpointThickness") ?? 2; var tiePen = new Pen(element.CoalesceColor(renderer), tieEndpointThickness); double arcHeight = renderer.LinespacesToPixels(2); var modifierY = element.StemDirection == VerticalDirection.Down ? -1 : 1; var arcStartX = measurementService.TieStartPoint.X;// - element.GetNoteheadWidthPx(renderer) / 2; var arcStartY = measurementService.TieStartPoint.Y + renderer.LinespacesToPixels(1) * modifierY; if (renderer.Settings.RenderingMode == ScoreRenderingModes.Panorama || element.Measure?.System == measurementService.TieStartSystem) { double arcWidth = scoreService.CursorPositionX - measurementService.TieStartPoint.X + element.GetNoteheadWidthPx(renderer) / 2 - 2; //-2 to modyfikator, żeby łuki się nie krzyżowały DrawTiesInternal(renderer, arcStartX, arcStartY, arcStartY, arcWidth, arcHeight, modifierY, element, tiePen, tieMidpointThickness); } else { //Draw ties at system breaks var firstHalfOfArcWidth = (measurementService.TieStartElement.Measure?.BarlineLocationX ?? measurementService.TieStartSystem.Width) - measurementService.TieStartElement.TextBlockLocation.X - measurementService.TieStartElement.GetNoteheadWidthPx(renderer) / 2; DrawTiesInternal(renderer, arcStartX, arcStartY, arcStartY + arcHeight * modifierY, firstHalfOfArcWidth, arcHeight, modifierY, measurementService.TieStartElement, tiePen, tieMidpointThickness); var secondHalfOfArcStartX = element.TextBlockLocation.X - 20; var arcStartYSecondHalf = element.TextBlockLocation.Y + renderer.LinespacesToPixels(1) * modifierY; DrawTiesInternal(renderer, secondHalfOfArcStartX, arcStartYSecondHalf, arcStartYSecondHalf, element.TextBlockLocation.X - secondHalfOfArcStartX, arcHeight, modifierY, element, tiePen, tieMidpointThickness); } if (element.TieType == NoteTieType.StopAndStartAnother) { measurementService.TieStartPoint = new Point(scoreService.CursorPositionX + 2, notePositionY); } } }