diff --git a/src.csharp/AlphaTab.Test/VisualTests/VisualTestHelper.cs b/src.csharp/AlphaTab.Test/VisualTests/VisualTestHelper.cs index 0bd1dab01..64cc7e442 100644 --- a/src.csharp/AlphaTab.Test/VisualTests/VisualTestHelper.cs +++ b/src.csharp/AlphaTab.Test/VisualTests/VisualTestHelper.cs @@ -14,9 +14,9 @@ namespace AlphaTab.VisualTests { partial class VisualTestHelper { - private static async Task RunVisualTestScoreWithResize(Score score, IList widths, - IList referenceImages, Settings? settings, IList? tracks, string? message, - double tolerancePercent) + public static async Task RunVisualTestScoreWithResize(Score score, IList widths, + IList referenceImages, Settings? settings = null, IList? tracks = null, string? message = null, + double tolerancePercent = 1.0) { tracks ??= new List { 0 }; PrepareSettingsForTest(ref settings); diff --git a/src/rendering/glyphs/ScoreSlideLineGlyph.ts b/src/rendering/glyphs/ScoreSlideLineGlyph.ts index 7807159f0..4315d99db 100644 --- a/src/rendering/glyphs/ScoreSlideLineGlyph.ts +++ b/src/rendering/glyphs/ScoreSlideLineGlyph.ts @@ -71,7 +71,6 @@ export class ScoreSlideLineGlyph extends Glyph { private drawSlideOut(cx: number, cy: number, canvas: ICanvas): void { let startNoteRenderer: ScoreBarRenderer = this.renderer as ScoreBarRenderer; let sizeX: number = 12 * this.scale; - let startOffsetX: number = 3 * this.scale; let endOffsetX: number = 1 * this.scale; let offsetY: number = 2 * this.scale; let startX: number = 0; @@ -85,16 +84,15 @@ export class ScoreSlideLineGlyph extends Glyph { startX = cx + startNoteRenderer.x + - startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.PostNotes) + - startOffsetX; + startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.PostNotes); startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center); if (this._startNote.slideTarget) { let endNoteRenderer: BarRendererBase | null = this.renderer.scoreRenderer.layout!.getRendererForBar( this.renderer.staff.staveId, this._startNote.slideTarget.beat.voice.bar - ) as BarRendererBase; + ); if (!endNoteRenderer || endNoteRenderer.staff !== startNoteRenderer.staff) { - endX = cx + startNoteRenderer.x + this._parent.x; + endX = cx + startNoteRenderer.x + startNoteRenderer.width; endY = startY; } else { endX = @@ -130,7 +128,7 @@ export class ScoreSlideLineGlyph extends Glyph { endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Bottom); break; case SlideOutType.PickSlideUp: - startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + startOffsetX; + startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right); startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center); endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Top); endX = cx + startNoteRenderer.x + startNoteRenderer.width; @@ -146,7 +144,7 @@ export class ScoreSlideLineGlyph extends Glyph { waves = true; break; case SlideOutType.PickSlideDown: - startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + startOffsetX; + startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right); startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center); endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Bottom); endX = cx + startNoteRenderer.x + startNoteRenderer.width; diff --git a/src/rendering/glyphs/TabSlideLineGlyph.ts b/src/rendering/glyphs/TabSlideLineGlyph.ts index 44399ae98..83315e108 100644 --- a/src/rendering/glyphs/TabSlideLineGlyph.ts +++ b/src/rendering/glyphs/TabSlideLineGlyph.ts @@ -81,12 +81,12 @@ export class TabSlideLineGlyph extends Glyph { startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.PostNotes); startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center); if (this._startNote.slideTarget) { - let endNoteRenderer: BarRendererBase = this.renderer.scoreRenderer.layout!.getRendererForBar( + let endNoteRenderer: BarRendererBase | null = this.renderer.scoreRenderer.layout!.getRendererForBar( this.renderer.staff.staveId, this._startNote.slideTarget.beat.voice.bar - )!; + ); if (!endNoteRenderer || endNoteRenderer.staff !== startNoteRenderer.staff) { - endX = cx + startNoteRenderer.x + this._parent.x; + endX = cx + startNoteRenderer.x + startNoteRenderer.width; endY = startY; } else { endX = diff --git a/test-data/visual-tests/effects-and-annotations/brush - Copy.png b/test-data/visual-tests/effects-and-annotations/brush - Copy.png new file mode 100644 index 000000000..95b189d5e Binary files /dev/null and b/test-data/visual-tests/effects-and-annotations/brush - Copy.png differ diff --git a/test-data/visual-tests/effects-and-annotations/slides-line-break.png b/test-data/visual-tests/effects-and-annotations/slides-line-break.png new file mode 100644 index 000000000..1460d51dd Binary files /dev/null and b/test-data/visual-tests/effects-and-annotations/slides-line-break.png differ diff --git a/test-data/visual-tests/notation-legend/dead-default.png b/test-data/visual-tests/notation-legend/dead-default.png index 716436241..0ca8b5772 100644 Binary files a/test-data/visual-tests/notation-legend/dead-default.png and b/test-data/visual-tests/notation-legend/dead-default.png differ diff --git a/test-data/visual-tests/notation-legend/dead-songbook.png b/test-data/visual-tests/notation-legend/dead-songbook.png index 716436241..0ca8b5772 100644 Binary files a/test-data/visual-tests/notation-legend/dead-songbook.png and b/test-data/visual-tests/notation-legend/dead-songbook.png differ diff --git a/test/visualTests/features/EffectsAndAnnotations.test.ts b/test/visualTests/features/EffectsAndAnnotations.test.ts index cc301e8e2..59032338f 100644 --- a/test/visualTests/features/EffectsAndAnnotations.test.ts +++ b/test/visualTests/features/EffectsAndAnnotations.test.ts @@ -1,3 +1,6 @@ +import { AlphaTexImporter } from '@src/importer/AlphaTexImporter'; +import { ByteBuffer } from '@src/io/ByteBuffer'; +import { Settings } from '@src/Settings'; import { VisualTestHelper } from '@test/visualTests/VisualTestHelper'; describe('EffectsAndAnnotationsTests', () => { @@ -64,6 +67,22 @@ describe('EffectsAndAnnotationsTests', () => { await VisualTestHelper.runVisualTest('effects-and-annotations/slides.gp'); }); + it('slides-line-break', async () => { + const tex = `14.1.2 :8 17.2 15.1 14.1{h} 17.2{ss} | 18.2`; + const settings = new Settings(); + settings.display.barsPerRow = 1; + + const importer = new AlphaTexImporter(); + importer.init(ByteBuffer.fromString(tex), settings); + let score = importer.readScore(); + + await VisualTestHelper.runVisualTestScoreWithResize(score, + [400], + ['effects-and-annotations/slides-line-break.png'], + settings + ); + }); + it('trill', async () => { await VisualTestHelper.runVisualTest('effects-and-annotations/trill.gp'); });