/// <summary> /// Move paddedMetrics above the fixedNoteObject if it is not already. /// </summary> private void MovePaddedMetricsAboveNoteObject(PaddedMetrics paddedMetrics, NoteObject fixedNoteObject) { double verticalOverlap = 0; if (fixedNoteObject.Metrics is ChordMetrics chordMetrics) { verticalOverlap = chordMetrics.OverlapHeight(paddedMetrics, 0F); } else if (fixedNoteObject.Metrics is RestMetrics restMetrics) { verticalOverlap = restMetrics.OverlapHeight(paddedMetrics, 0F); } else if (!(fixedNoteObject is Barline)) { verticalOverlap = fixedNoteObject.Metrics.OverlapHeight(paddedMetrics, 0F); } if (verticalOverlap > 0) { verticalOverlap = (verticalOverlap > paddedMetrics.BottomPadding) ? verticalOverlap : paddedMetrics.BottomPadding; paddedMetrics.Move(0, -verticalOverlap); } }
protected void MoveFramedTextAboveNoteObjects(Metrics framedTextMetrics, List <NoteObject> fixedNoteObjects) { if (framedTextMetrics != null) { double bottomPadding = Gap * 1.5; double xPadding = Gap * 4; PaddedMetrics paddedMetrics = new PaddedMetrics(framedTextMetrics, 0, xPadding, bottomPadding, xPadding); foreach (NoteObject noteObject in fixedNoteObjects) { int overlaps = OverlapsHorizontally(paddedMetrics, noteObject); if (overlaps == 0) { MovePaddedMetricsAboveNoteObject(paddedMetrics, noteObject); } else if (overlaps == 1) // noteObject is left of framedText { if (noteObject is ChordSymbol chordSymbol) { if (chordSymbol.Stem.Direction == VerticalDir.up && chordSymbol.BeamBlock != null) { MoveFramedTextAboveBeamBlock(framedTextMetrics, chordSymbol.BeamBlock); } else if (chordSymbol.ChordMetrics.NoteheadExtendersMetrics != null) { MoveFramedTextAboveNoteheadExtenders(framedTextMetrics, chordSymbol.ChordMetrics.NoteheadExtendersMetrics); } } } else if (overlaps == -1) // noteObject is right of framed text, so we need look no further in these noteObjects. { break; } } } }