public override void Render(PrintSuggestion element, ScoreRendererBase renderer)
        {
            if (element.IsSystemBreak && renderer.Settings.RenderingMode != ScoreRenderingModes.Panorama)
            {
                renderer.BreakSystem(renderer.TenthsToPixels(element.SystemDistance ?? scoreService.CurrentScore.DefaultPageSettings.DefaultSystemDistance ?? 0), element.IsPageBreak);

                MusicalSymbolRenderStrategyBase strategy = new ClefRenderStrategy(scoreService)
                {
                    WasSystemChanged = true
                };
                strategy.Render(scoreService.CurrentClef, renderer);

                strategy = new KeyRenderStrategy(scoreService);
                strategy.Render(scoreService.CurrentKey, renderer);

                //Time signature is not rendered in new line.

                //Render measure number:
                renderer.DrawString((scoreService.CurrentMeasureNo).ToString(), MusicFontStyles.LyricsFont,
                                    new Primitives.Point(0, scoreService.CurrentLinePositions[0] - 25), scoreService.CurrentStaff);
            }

            //Issue #44: Jeśli jesteśmy w trybie panoramy, to trzeba uzupełnić line positions dla pozostałych systemów:
            if (renderer.Settings.RenderingMode == ScoreRenderingModes.Panorama)
            {
                var firstSystem = scoreService.Systems.First();
                foreach (var system in scoreService.Systems)
                {
                    system.BuildStaffFragments(firstSystem.LinePositions.ToDictionary(p => scoreService.CurrentScore.Staves[p.Key - 1], p => p.Value));
                }
            }
        }
        public void PerformOnScore(Score score, ScoreRendererBase renderer)
        {
#if DemoVersion
            foreach (var location in new[] {
                new Point(0, 0),
                new Point(renderer.ScoreInformation.Systems.Max(s => s.Width) - 30, 0)
            })
            {
                renderer.DrawString("DEMO", MusicFontStyles.LyricsFont, location, Color.Red, MusicalSymbol.Null);
            }
#endif
        }
예제 #3
0
        public static void TupletMark(IMeasurementService measurementService, IScoreService scoreService, ScoreRendererBase renderer, NoteOrRest element, int beamLoop)
        {
            if (measurementService.TupletState == null)
            {
                throw new Exception("DrawTupletMark was called but no tuplet is currently open in staff.");
            }
            Staff staff = scoreService.CurrentStaff;

            NoteOrRest           firstElementInTuplet = staff.Peek <NoteOrRest>(element, PeekType.BeginningOfTuplet);
            int                  index = staff.Elements.IndexOf(firstElementInTuplet);
            List <MusicalSymbol> elementsUnderTuplet = staff.Elements.GetRange(index, staff.Elements.IndexOf(element) - index);
            var                  elementsUnderTupletForAverageStemLength = elementsUnderTuplet.OfType <Note>().Where(n => MusicalSymbol.DirectionToPlacement(n.StemDirection) == measurementService.TupletState.TupletPlacement).ToList();
            double               averageStemLength = elementsUnderTupletForAverageStemLength.Count == 0 ? 0 : elementsUnderTupletForAverageStemLength.Average(n => n.ActualStemLength);

            averageStemLength += 10;                //Add space
            int    placementMod = measurementService.TupletState.TupletPlacement == VerticalPlacement.Above ? -1 : 1;
            double tupletBracketStartXPosition = firstElementInTuplet.TextBlockLocation.X + 6;
            double tupletBracketStartYPosition = firstElementInTuplet.TextBlockLocation.Y + 25 + averageStemLength * placementMod;
            double tupletBracketEndXPosition   = element.TextBlockLocation.X + 12;
            double tupletBracketEndYPosition   = element.TextBlockLocation.Y + 25 + averageStemLength * placementMod;

            if (measurementService.TupletState.AreSingleBeamsPresentUnderTuplet)                //Draw tuplet bracket
            {
                renderer.DrawLine(new Point(tupletBracketStartXPosition, tupletBracketStartYPosition),
                                  new Point(tupletBracketEndXPosition, tupletBracketEndYPosition), element);
                renderer.DrawLine(new Point(tupletBracketStartXPosition, tupletBracketStartYPosition),
                                  new Point(tupletBracketStartXPosition, firstElementInTuplet.TextBlockLocation.Y + 25 + (averageStemLength - 4) * placementMod), element);
                renderer.DrawLine(new Point(tupletBracketEndXPosition, tupletBracketEndYPosition),
                                  new Point(tupletBracketEndXPosition, element.TextBlockLocation.Y + 25 + (averageStemLength - 4) * placementMod), element);
            }

            double numberOfNotesYTranslation = 0;

            if (measurementService.TupletState.TupletPlacement == VerticalPlacement.Above)
            {
                numberOfNotesYTranslation -= 18;                                                                                        //If text should appear above the tuplet, move a bit to up
            }
            //If bracket is not drawn, move up or down to fill space
            if (!measurementService.TupletState.AreSingleBeamsPresentUnderTuplet)
            {
                numberOfNotesYTranslation += 10 * (measurementService.TupletState.TupletPlacement == VerticalPlacement.Above ? 1 : -1);
            }

            var allElementsUnderTuplet = elementsUnderTuplet.OfType <NoteOrRest>().ToList();

            allElementsUnderTuplet.Add(element);
            var tupletNumber = CalculateTupletNumber(allElementsUnderTuplet);

            renderer.DrawString(Convert.ToString(tupletNumber), MusicFontStyles.LyricsFont,
                                new Point(tupletBracketStartXPosition + (tupletBracketEndXPosition - tupletBracketStartXPosition) / 2 - 6,
                                          tupletBracketStartYPosition + (tupletBracketEndYPosition - tupletBracketStartYPosition) / 2 + numberOfNotesYTranslation), element);
        }
예제 #4
0
        /// <summary>
        /// Draws tuplet mark
        /// </summary>
        /// <param name="measurementService"></param>
        /// <param name="scoreService"></param>
        /// <param name="renderer"></param>
        /// <param name="element"></param>
        public static void TupletMark(IMeasurementService measurementService, IScoreService scoreService, ScoreRendererBase renderer, NoteOrRest element)
        {
            if (measurementService.TupletState == null)
            {
                throw new Exception("DrawTupletMark was called but no tuplet is currently open in staff.");
            }

            var   tupletBracketPen = renderer.CreatePenFromDefaults(element, "tupletBracketThickness", s => s.DefaultTupletBracketThickness);
            Staff staff            = scoreService.CurrentStaff;

            NoteOrRest           firstElementInTuplet = staff.Peek <NoteOrRest>(element, PeekType.BeginningOfTuplet);
            int                  index = staff.Elements.IndexOf(firstElementInTuplet);
            List <MusicalSymbol> elementsUnderTuplet = staff.Elements.GetRange(index, staff.Elements.IndexOf(element) - index + 1);

            var noteGroupBounds = elementsUnderTuplet.OfType <Note>().GetBounds(renderer);

            if (IsDebugMode)
            {
                DrawNoteGroupOutline(renderer, noteGroupBounds, element);
            }

            var boundsOnOneSide = measurementService.TupletState.TupletPlacement == VerticalPlacement.Above ?
                                  new Tuple <Point, Point>(noteGroupBounds.NW, noteGroupBounds.NE) :
                                  new Tuple <Point, Point>(noteGroupBounds.SW, noteGroupBounds.SE);

            int placementMod      = measurementService.TupletState.TupletPlacement == VerticalPlacement.Above ? -1 : 1;
            var bracketDefinition = new TupletBracketDefinition(
                boundsOnOneSide.Item1.X,
                boundsOnOneSide.Item1.Y + renderer.LinespacesToPixels(2) * placementMod,
                boundsOnOneSide.Item2.X,
                boundsOnOneSide.Item2.Y + renderer.LinespacesToPixels(2) * placementMod);

            if (measurementService.TupletState.AreSingleBeamsPresentUnderTuplet)    //Draw tuplet bracket
            {
                renderer.DrawLine(bracketDefinition.StartPoint, bracketDefinition.Point25, tupletBracketPen, element);
                renderer.DrawLine(bracketDefinition.Point75, bracketDefinition.EndPoint, tupletBracketPen, element);
                renderer.DrawLine(bracketDefinition.StartPoint, bracketDefinition.StartPoint.Translate(0, renderer.LinespacesToPixels(-1) * placementMod), tupletBracketPen, element);
                renderer.DrawLine(bracketDefinition.EndPoint, bracketDefinition.EndPoint.Translate(0, renderer.LinespacesToPixels(-1) * placementMod), tupletBracketPen, element);
            }

            var tupletNumber = CalculateTupletNumber(elementsUnderTuplet.OfType <NoteOrRest>());

            var textToWrite  = renderer.Settings.MusicFontProfile.MusicFont.BuildTupletNumber(tupletNumber);
            var fontStyle    = renderer.IsSMuFLFont ? MusicFontStyles.MusicFont : MusicFontStyles.LyricsFont;
            var textSize     = renderer.CanMeasureString ? renderer.MeasureString(fontStyle, textToWrite) : new Size();
            var textPosition = renderer.CanMeasureString ?
                               bracketDefinition.MidPoint.Translate(textSize.Width / -2, textSize.Height / 2) :
                               bracketDefinition.MidPoint.Translate(-3.7, 4.7);

            renderer.DrawString(textToWrite, fontStyle, textPosition, element);
        }
예제 #5
0
        public static void Flag(IBeamingService beamingService, IMeasurementService measurementService, IScoreService scoreService, ScoreRendererBase renderer, Note element, int beamSpaceDirection, int beamNumber, int beamOffset)
        {
            //Rysuj chorągiewkę tylko najniższego dźwięku w akordzie
            //Draw a hook only of the lowest element in a chord
            double xPos = beamingService.CurrentStemPositionX - 4;

            if (element.StemDirection == VerticalDirection.Down)
            {
                if (element.IsGraceNote || element.IsCueNote)
                {
                    renderer.DrawString(element.NoteFlagCharacterRev, MusicFontStyles.GraceNoteFont, new Point(xPos, beamingService.CurrentStemEndPositionY + 11), element);
                }
                else
                {
                    renderer.DrawString(element.NoteFlagCharacterRev, MusicFontStyles.MusicFont, new Point(xPos, beamingService.CurrentStemEndPositionY + 7), element);
                }
            }
            else
            {
                if (element.IsGraceNote || element.IsCueNote)
                {
                    renderer.DrawString(element.NoteFlagCharacter, MusicFontStyles.GraceNoteFont, new Point(xPos + 0.5, beamingService.CurrentStemEndPositionY + 6), element);
                }
                else
                {
                    renderer.DrawString(element.NoteFlagCharacter, MusicFontStyles.MusicFont, new Point(xPos, beamingService.CurrentStemEndPositionY - 1), element);
                }
            }
            if (measurementService.TupletState != null)
            {
                measurementService.TupletState.AreSingleBeamsPresentUnderTuplet = true;
                if (element.Tuplet == TupletType.Stop)
                {
                    TupletMark(measurementService, scoreService, renderer, element, beamNumber);
                    measurementService.TupletState = null;
                }
            }
        }