Переглянути джерело

Merge branch 'feature/OSMD-6_Porting' of https://github.com/opensheetmusicdisplay/opensheetmusicdisplay into feature/OSMD-6_Porting

# Conflicts:
#	src/MusicalScore/Graphical/VexFlow/VexFlowMusicSheetCalculator.ts
#	test/MusicalScore/Graphical/VexFlow/VexFlowMeasure.ts
Matthias 9 роки тому
батько
коміт
16fa0f6ace

+ 3 - 1
external/vexflow/vexflow.d.ts

@@ -7,6 +7,7 @@ declare namespace Vex {
 
       public hasMinTotalWidth: boolean;
       public minTotalWidth: number;
+      public joinVoices(voices: Vex.Flow.Voice[]): void;
 
       public preCalculateMinTotalWidth(voices: Voice[]): number;
     }
@@ -30,6 +31,7 @@ declare namespace Vex {
       public addTickables(notes: StaveNote[]): Voice;
       public addTickable(note: StaveNote): Voice;
       public setMode(mode: any): Voice;
+      public draw(ctx: any, stave: Stave): void;
     }
 
     export class StaveNote {
@@ -62,7 +64,7 @@ declare namespace Vex {
       public getNumLines(): number;
       public getLineForY(y: number): number;
       public getModifiers(pos: any, cat: any): Vex.Flow.Clef[]; // FIXME
-      public setContext(ctx: any): void;
+      public setContext(ctx: any): Stave;
       public addModifier(mod: any, pos: any): void;
       public draw(): void;
       public addTimeSignature(sig: string): void;

+ 13 - 3
src/MusicalScore/Graphical/VexFlow/VexFlowMeasure.ts

@@ -11,19 +11,18 @@ import {VexFlowStaffEntry} from "./VexFlowStaffEntry";
 //import {Fraction} from "../../../Common/DataObjects/fraction";
 
 import Vex = require("vexflow");
-import StaveModifier = Vex.Flow.StaveModifier;
 
 export class VexFlowMeasure extends StaffMeasure {
     constructor(staff: Staff, staffLine: StaffLine = undefined, sourceMeasure: SourceMeasure = undefined) {
         super(staff, sourceMeasure, staffLine);
-        // this.MinimumStaffEntriesWidth =
+        this.minimumStaffEntriesWidth = -1;
         this.stave = new Vex.Flow.Stave(0, 0, 0);
         this.voices = {};
         //this.duration = this.parentSourceMeasure.Duration;
     }
 
+    public voices: { [voiceID: number]: Vex.Flow.Voice; };
     private stave: Vex.Flow.Stave;
-    private voices: { [voiceID: number]: Vex.Flow.Voice; };
     //private duration: Fraction;
 
     /**
@@ -169,6 +168,17 @@ export class VexFlowMeasure extends StaffMeasure {
         // TODO
     }
 
+    public draw(canvas: HTMLCanvasElement): void {
+        let renderer: Vex.Flow.Renderer = new Vex.Flow.Renderer(canvas, Vex.Flow.Renderer.Backends.CANVAS);
+        let ctx: any = renderer.getContext();
+        this.stave.setContext(ctx).draw();
+        for (let voiceID in this.voices) {
+            if (this.voices.hasOwnProperty(voiceID)) {
+                this.voices[voiceID].draw(ctx, this.stave);
+            }
+        }
+    }
+
     private increaseBeginInstructionWidth(): void {
         let modifiers: Vex.Flow.StaveModifier[] = this.stave.getModifiers();
         let modifier: Vex.Flow.StaveModifier = modifiers[modifiers.length - 1];

+ 19 - 1
src/MusicalScore/Graphical/VexFlow/VexFlowMusicSheetCalculator.ts

@@ -24,6 +24,7 @@ import {OrnamentContainer} from "../../VoiceData/OrnamentContainer";
 import {ArticulationEnum} from "../../VoiceData/VoiceEntry";
 import {Tuplet} from "../../VoiceData/Tuplet";
 import Dictionary from "typescript-collections/dist/lib/Dictionary";
+import {VexFlowMeasure} from "./VexFlowMeasure";
 import {VexFlowTextMeasurer} from "./VexFlowTextMeasurer";
 //import {VexFlowMeasure} from "./VexFlowMeasure";
 
@@ -58,7 +59,24 @@ export class VexFlowMusicSheetCalculator extends MusicSheetCalculator {
     protected calculateMeasureXLayout(measures: StaffMeasure[]): number {
         // layout the measures in x.
         // return the minimum required x width of this vertically aligned measure set:
-        return 0;
+        let allVoices: Vex.Flow.Voice[] = [];
+        let formatter: Vex.Flow.Formatter = new Vex.Flow.Formatter();
+        for (let measure of measures) {
+            let mvoices:  { [voiceID: number]: Vex.Flow.Voice; } = (measure as VexFlowMeasure).voices;
+            let voices: Vex.Flow.Voice[] = [];
+            for (let voiceID in mvoices) {
+                if (mvoices.hasOwnProperty(voiceID)) {
+                    voices.push(mvoices[voiceID]);
+                    allVoices.push(mvoices[voiceID]);
+    }
+            }
+            formatter.joinVoices(voices);
+        }
+        let width: number = formatter.preCalculateMinTotalWidth(allVoices);
+        for (let measure of measures) {
+            measure.minimumStaffEntriesWidth = width;
+        }
+        return width;
     }
 
     /**

+ 6 - 2
src/MusicalScore/Graphical/VexFlow/VexFlowMusicSheetDrawer.ts

@@ -11,8 +11,12 @@ export class VexFlowMusicSheetDrawer extends MusicSheetDrawer {
     }
 
     protected drawMeasure(measure: StaffMeasure): void {
-        let vfMeasure: VexFlowMeasure = <VexFlowMeasure> measure;
-        throw new Error("not implemented");
+        //let vfMeasure: VexFlowMeasure = <VexFlowMeasure> measure;
+        //throw new Error("not implemented");
+        let canvas: HTMLCanvasElement = document.createElement("canvas");
+        document.body.appendChild(canvas);
+        canvas.width = canvas.height = 100;
+        return (measure as VexFlowMeasure).draw(canvas);
     }
 
     protected applyScreenTransformation(rectangle: RectangleF2D): RectangleF2D {

+ 26 - 2
test/MusicalScore/Graphical/VexFlow/VexFlowMeasure.ts

@@ -1,11 +1,11 @@
 import {MusicSheetCalculator} from "../../../../src/MusicalScore/Graphical/MusicSheetCalculator";
-import {VexFlowGraphicalSymbolFactory} from "../../../../src/MusicalScore/Graphical/VexFlow/VexFlowGraphicalSymbolFactory";
-import {IGraphicalSymbolFactory} from "../../../../src/MusicalScore/Interfaces/IGraphicalSymbolFactory";
 import {GraphicalMusicSheet} from "../../../../src/MusicalScore/Graphical/GraphicalMusicSheet";
 import {IXmlElement} from "../../../../src/Common/FileIO/Xml";
 import {MusicSheet} from "../../../../src/MusicalScore/MusicSheet";
 import {MusicSheetReader} from "../../../../src/MusicalScore/ScoreIO/MusicSheetReader";
 import {VexFlowMusicSheetCalculator} from "../../../../src/MusicalScore/Graphical/VexFlow/VexFlowMusicSheetCalculator";
+import {SourceMeasure} from "../../../../src/MusicalScore/VoiceData/SourceMeasure";
+import {StaffMeasure} from "../../../../src/MusicalScore/Graphical/StaffMeasure";
 
 
 describe("VexFlow Measure Test", () => {
@@ -50,4 +50,28 @@ describe("VexFlow Measure Test", () => {
         console.log(gms);
         done();
     });
+
+    it("Simple Measure", (done: MochaDone) => {
+        let sheet: MusicSheet = new MusicSheet();
+        let measure: SourceMeasure = new SourceMeasure(1);
+        sheet.addMeasure(measure);
+        let calc: MusicSheetCalculator = new VexFlowMusicSheetCalculator();
+        let gms: GraphicalMusicSheet = new GraphicalMusicSheet(sheet, calc);
+        chai.expect(gms.MeasureList.length).to.equal(1);
+        chai.expect(gms.MeasureList[0].length).to.equal(1);
+        let gm: StaffMeasure = gms.MeasureList[0][0];
+        console.log(gm);
+        done();
+    });
+
+    it("Empty Measure", (done: MochaDone) => {
+        let sheet: MusicSheet = new MusicSheet();
+        let measure: SourceMeasure = new SourceMeasure(1);
+        sheet.addMeasure(measure);
+        let calc: MusicSheetCalculator = new VexFlowMusicSheetCalculator();
+        let gms: GraphicalMusicSheet = new GraphicalMusicSheet(sheet, calc);
+        chai.expect(gms.MeasureList.length).to.equal(1);
+        chai.expect(gms.MeasureList[0].length).to.equal(0);
+        done();
+    });
 });

+ 3 - 0
test/MusicalScore/Graphical/VexFlow/VexFlowMusicSheetDrawer.ts

@@ -0,0 +1,3 @@
+/**
+ * Created by acondolu on 22/06/16.
+ */