Skip to content

Commit 979fd4b

Browse files
committed
fix clef width
1 parent 54ba908 commit 979fd4b

File tree

5 files changed

+47
-18
lines changed

5 files changed

+47
-18
lines changed

src/clef.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ export class Clef extends StaveModifier {
143143

144144
this.setPosition(StaveModifierPosition.BEGIN);
145145
this.setType(type, size, annotation);
146-
this.setWidth(Tables.currentMusicFont().lookupMetric(`clef_${this.size}.width`));
146+
this.setWidth(Glyph.getWidth(this.clef.code, this.clef.point, `clef_${this.size}`));
147147
L('Creating clef:', type);
148148
}
149149

src/stave.ts

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,45 @@ export class Stave extends Element {
854854
}
855855

856856
static formatBegModifiers(staves: Stave[]): void {
857+
const adjustCategoryStartX = (category: Category) => {
858+
let minStartX = 0;
859+
// Calculate min start X for the category
860+
staves.forEach((stave) => {
861+
const modifiers = stave.getModifiers(StaveModifierPosition.BEGIN, category);
862+
// Consider only the first instance
863+
if (modifiers.length > 0 && modifiers[0].getX() > minStartX) minStartX = modifiers[0].getX();
864+
});
865+
let adjustX = 0;
866+
staves.forEach((stave) => {
867+
adjustX = 0;
868+
const modifiers = stave.getModifiers(StaveModifierPosition.BEGIN, category);
869+
// Calculate adjustement required for the stave
870+
modifiers.forEach((modifier) => {
871+
if (minStartX - modifier.getX() > adjustX) adjustX = minStartX - modifier.getX();
872+
});
873+
const allModifiers = stave.getModifiers(StaveModifierPosition.BEGIN);
874+
let bAdjust = false;
875+
// Apply adjustment to all the modifiers in and beyond the category
876+
allModifiers.forEach((modifier) => {
877+
if (modifier.getCategory() === category) bAdjust = true;
878+
if (bAdjust && adjustX > 0) modifier.setX(modifier.getX() + adjustX);
879+
});
880+
// Apply adjustment also to note start.
881+
stave.setNoteStartX(stave.getNoteStartX() + adjustX);
882+
});
883+
};
884+
885+
// Make sure that staves are formatted
886+
staves.forEach((stave) => {
887+
if (!stave.formatted) stave.format();
888+
});
889+
// Align Clefs
890+
adjustCategoryStartX(Category.Clef);
891+
// Align key signatures
892+
adjustCategoryStartX(Category.KeySignature);
893+
// Align time signatures
894+
adjustCategoryStartX(Category.TimeSignature);
895+
857896
let maxX = 0;
858897
// align note start
859898
staves.forEach((stave) => {
@@ -878,20 +917,5 @@ export class Stave extends Element {
878917
if ((modifier as Barline).getType() == BarlineType.REPEAT_BEGIN) modifier.setX(maxX);
879918
});
880919
});
881-
882-
maxX = 0;
883-
// Align time signatures
884-
staves.forEach((stave) => {
885-
const modifiers = stave.getModifiers(StaveModifierPosition.BEGIN, Category.TimeSignature);
886-
modifiers.forEach((modifier) => {
887-
if (modifier.getX() > maxX) maxX = modifier.getX();
888-
});
889-
});
890-
staves.forEach((stave) => {
891-
const modifiers = stave.getModifiers(StaveModifierPosition.BEGIN, Category.TimeSignature);
892-
modifiers.forEach((modifier) => {
893-
modifier.setX(maxX);
894-
});
895-
});
896920
}
897921
}

tests/key_clef_tests.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,16 @@ function keys(options: TestOptions, contextBuilder: ContextBuilder): void {
8181
keySig = new KeySignature(keys[sharp]);
8282
keySig.addToStave(staves[i + clefs.length]);
8383
}
84+
}
85+
86+
Stave.formatBegModifiers(staves);
8487

88+
for (i = 0; i < clefs.length; i++) {
8589
staves[i].setContext(ctx);
8690
staves[i].draw();
8791
staves[i + clefs.length].setContext(ctx);
8892
staves[i + clefs.length].draw();
8993
}
90-
9194
ok(true, 'all pass');
9295
}
9396

tests/percussion_tests.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ function drawNotes(options: TestOptions, contextBuilder: ContextBuilder): void {
100100
function createSingleMeasureTest(setup: (f: Factory) => void) {
101101
return (options: TestOptions): void => {
102102
const f = VexFlowTests.makeFactory(options, 500);
103-
const stave = f.Stave().addClef('percussion');
103+
const stave = f.Stave().addClef('percussion').setTimeSignature('4/4');
104104
setup(f);
105105
f.Formatter().joinVoices(f.getVoices()).formatToStave(f.getVoices(), stave);
106106
f.draw();

tests/timesignature_tests.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ function multiple(options: TestOptions, contextBuilder: ContextBuilder): void {
153153
const stave2 = new Stave(15, 110, 300).addClef('treble').addTimeSignature('4/4').setContext(ctx).draw();
154154
const stave3 = new Stave(15, 220, 300).addClef('bass').addTimeSignature('4/4').setContext(ctx).draw();
155155

156+
Stave.formatBegModifiers([stave1, stave2, stave3]);
157+
156158
new StaveConnector(stave1, stave2).setType('single').setContext(ctx).draw();
157159
new StaveConnector(stave2, stave3).setType('single').setContext(ctx).draw();
158160
new StaveConnector(stave2, stave3).setType('brace').setContext(ctx).draw();

0 commit comments

Comments
 (0)