diff --git a/Source/AlphaTab/Audio/MidiTickLookup.cs b/Source/AlphaTab/Audio/MidiTickLookup.cs index 8eafb5035..605bc6dd2 100644 --- a/Source/AlphaTab/Audio/MidiTickLookup.cs +++ b/Source/AlphaTab/Audio/MidiTickLookup.cs @@ -248,7 +248,9 @@ public MidiTickLookupFindBeatResult FindBeat(Track[] tracks, int tick) var result = new MidiTickLookupFindBeatResult(); result.CurrentBeat = beat.Beat; result.NextBeat = nextBeat == null ? null : nextBeat.Beat; - result.Duration = MidiUtils.TicksToMillis(beat.End - beat.Start, masterBar.Tempo); + result.Duration = nextBeat == null + ? MidiUtils.TicksToMillis(beat.End - beat.Start, masterBar.Tempo) + : MidiUtils.TicksToMillis(nextBeat.Start - beat.Start, masterBar.Tempo); return result; } diff --git a/Source/AlphaTab/Rendering/BarRendererFactory.cs b/Source/AlphaTab/Rendering/BarRendererFactory.cs index 0b14b4274..4f944e846 100644 --- a/Source/AlphaTab/Rendering/BarRendererFactory.cs +++ b/Source/AlphaTab/Rendering/BarRendererFactory.cs @@ -8,6 +8,7 @@ namespace AlphaTab.Rendering internal abstract class BarRendererFactory { public bool IsInAccolade { get; set; } + public bool IsRelevantForBoundsLookup { get; set; } public bool HideOnMultiTrack { get; set; } public bool HideOnPercussionTrack { get; set; } public abstract string StaffId { get; } @@ -15,6 +16,7 @@ internal abstract class BarRendererFactory protected BarRendererFactory() { IsInAccolade = true; + IsRelevantForBoundsLookup = true; HideOnPercussionTrack = false; HideOnMultiTrack = false; } diff --git a/Source/AlphaTab/Rendering/EffectBarRendererFactory.cs b/Source/AlphaTab/Rendering/EffectBarRendererFactory.cs index 38a84d152..229efdf2a 100644 --- a/Source/AlphaTab/Rendering/EffectBarRendererFactory.cs +++ b/Source/AlphaTab/Rendering/EffectBarRendererFactory.cs @@ -14,6 +14,7 @@ public EffectBarRendererFactory(string staffId, IEffectBarRendererInfo[] infos) _infos = infos; _staffId = staffId; IsInAccolade = false; + IsRelevantForBoundsLookup = false; } public override BarRendererBase Create(ScoreRenderer renderer, Bar bar) diff --git a/Source/AlphaTab/Rendering/Staves/Staff.cs b/Source/AlphaTab/Rendering/Staves/Staff.cs index 4e19a916f..58a261b7d 100644 --- a/Source/AlphaTab/Rendering/Staves/Staff.cs +++ b/Source/AlphaTab/Rendering/Staves/Staff.cs @@ -86,6 +86,7 @@ public void SetSharedLayoutData(string key, T def) } public bool IsInAccolade => _factory.IsInAccolade; + public bool IsRelevantForBoundsLookup => _factory.IsRelevantForBoundsLookup; public void RegisterStaffTop(float offset) { diff --git a/Source/AlphaTab/Rendering/Staves/StaveGroup.cs b/Source/AlphaTab/Rendering/Staves/StaveGroup.cs index c74c82b91..882357ac1 100644 --- a/Source/AlphaTab/Rendering/Staves/StaveGroup.cs +++ b/Source/AlphaTab/Rendering/Staves/StaveGroup.cs @@ -229,7 +229,7 @@ public void AddStaff(Track track, Staff staff) staff.StaveGroup = this; staff.Index = _allStaves.Count; _allStaves.Add(staff); - group.Staves.Add(staff); + group.AddStaff(staff); if (staff.IsInAccolade) { @@ -458,44 +458,51 @@ private void BuildBoundingsLookup(float cx, float cy) }; Layout.Renderer.BoundsLookup.AddStaveGroup(staveGroupBounds); - var masterBarBoundsLookup = new FastList(); + var masterBarBoundsLookup = new FastDictionary(); for (var i = 0; i < Staves.Count; i++) { - for (int j = 0, k = Staves[i].FirstStaffInAccolade.BarRenderers.Count; j < k; j++) + foreach (var staff in Staves[i].StavesRelevantForBoundsLookup) { - var renderer = Staves[i].FirstStaffInAccolade.BarRenderers[j]; - - if (i == 0) + foreach (var renderer in staff.BarRenderers) { - var masterBarBounds = new MasterBarBounds(); - masterBarBounds.Index = renderer.Bar.MasterBar.Index; - masterBarBounds.IsFirstOfLine = renderer.IsFirstOfLine; - masterBarBounds.RealBounds = new Bounds - { - X = x + renderer.X, - Y = realTop, - W = renderer.Width, - H = realHeight - }; - masterBarBounds.VisualBounds = new Bounds + MasterBarBounds masterBarBounds; + if (!masterBarBoundsLookup.ContainsKey(renderer.Bar.MasterBar.Index)) { - X = x + renderer.X, - Y = visualTop, - W = renderer.Width, - H = visualHeight - }; - masterBarBounds.LineAlignedBounds = new Bounds + masterBarBounds = new MasterBarBounds(); + masterBarBounds.Index = renderer.Bar.MasterBar.Index; + masterBarBounds.IsFirstOfLine = renderer.IsFirstOfLine; + masterBarBounds.RealBounds = new Bounds + { + X = x + renderer.X, + Y = realTop, + W = renderer.Width, + H = realHeight + }; + masterBarBounds.VisualBounds = new Bounds + { + X = x + renderer.X, + Y = visualTop, + W = renderer.Width, + H = visualHeight + }; + masterBarBounds.LineAlignedBounds = new Bounds + { + X = x + renderer.X, + Y = lineTop, + W = renderer.Width, + H = lineHeight + }; + Layout.Renderer.BoundsLookup.AddMasterBar(masterBarBounds); + masterBarBoundsLookup[masterBarBounds.Index] = masterBarBounds; + } + else { - X = x + renderer.X, - Y = lineTop, - W = renderer.Width, - H = lineHeight - }; - Layout.Renderer.BoundsLookup.AddMasterBar(masterBarBounds); - masterBarBoundsLookup.Add(masterBarBounds); - } + masterBarBounds = masterBarBoundsLookup[renderer.Bar.MasterBar.Index]; + } + - renderer.BuildBoundingsLookup(masterBarBoundsLookup[j], x, cy + Y + _firstStaffInAccolade.Y); + renderer.BuildBoundingsLookup(masterBarBounds, x, cy + Y + staff.Y); + } } } } diff --git a/Source/AlphaTab/Rendering/Staves/StaveTrackGroup.cs b/Source/AlphaTab/Rendering/Staves/StaveTrackGroup.cs index aa4a308dd..2cf2fef24 100644 --- a/Source/AlphaTab/Rendering/Staves/StaveTrackGroup.cs +++ b/Source/AlphaTab/Rendering/Staves/StaveTrackGroup.cs @@ -8,6 +8,7 @@ internal class StaveTrackGroup public Track Track { get; set; } public StaveGroup StaveGroup { get; set; } public FastList Staves { get; set; } + public FastList StavesRelevantForBoundsLookup { get; set; } public Staff FirstStaffInAccolade { get; set; } public Staff LastStaffInAccolade { get; set; } @@ -17,6 +18,16 @@ public StaveTrackGroup(StaveGroup staveGroup, Track track) StaveGroup = staveGroup; Track = track; Staves = new FastList(); + StavesRelevantForBoundsLookup = new FastList(); + } + + public void AddStaff(Staff staff) + { + Staves.Add(staff); + if (staff.IsRelevantForBoundsLookup) + { + StavesRelevantForBoundsLookup.Add(staff); + } } } } diff --git a/appveyor.yml b/appveyor.yml index 88d386087..f58b5002a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -42,7 +42,6 @@ install: - npm install -g jasmine-core - npm install -g karma - npm install -g karma-jasmine - - npm install -g karma-cli - npm install -g karma-chrome-launcher - npm install -g puppeteer - npm install -g karma-trx-reporter