Sfoglia il codice sorgente

feat(transparency): allow transparency after re-render with Note.PrintObject = false

stem + notehead color set to "#00000000" (transparent in vexflow)
part of #509
sschmid 6 anni fa
parent
commit
52212d667f

+ 5 - 5
src/MusicalScore/Graphical/EngravingRules.ts

@@ -400,11 +400,11 @@ export class EngravingRules {
         this.coloringEnabled = true;
         this.colorBeams = true;
         this.colorFlags = true;
-        this.defaultColorNotehead = undefined; // undefined colors mean black
-        this.defaultColorRest = undefined;
-        this.defaultColorStem = undefined;
-        this.defaultColorLabel = undefined;
-        this.defaultColorTitle = undefined;
+        this.defaultColorNotehead = "#000000"; // black. undefined is only black if a note's color hasn't been changed before.
+        this.defaultColorRest = this.defaultColorNotehead;
+        this.defaultColorStem = this.defaultColorNotehead;
+        this.defaultColorLabel = this.defaultColorNotehead;
+        this.defaultColorTitle = this.defaultColorNotehead;
         this.maxMeasureToDrawIndex = Number.MAX_VALUE;
         this.renderComposer = true;
         this.renderTitle = true;

+ 21 - 3
src/MusicalScore/Graphical/GraphicalVoiceEntry.ts

@@ -45,6 +45,7 @@ export class GraphicalVoiceEntry extends GraphicalObject {
         const defaultColorNotehead: string = EngravingRules.Rules.DefaultColorNotehead;
         const defaultColorRest: string = EngravingRules.Rules.DefaultColorRest;
         const defaultColorStem: string = EngravingRules.Rules.DefaultColorStem;
+        const transparentColor: string = "#00000000"; // transparent color in vexflow
 
         const vfStaveNote: any = (<VexFlowVoiceEntry>(this as any)).vfStaveNote;
         for (let i: number = 0; i < this.notes.length; i++) {
@@ -61,6 +62,11 @@ export class GraphicalVoiceEntry extends GraphicalObject {
                     noteheadColor = EngravingRules.Rules.ColoringSetCurrent.getValue(fundamentalNote);
                 }
             }
+            if (!note.sourceNote.PrintObject) {
+                noteheadColor = transparentColor; // transparent
+            } else if (!noteheadColor) { // revert transparency after PrintObject was set to false, then true again
+                noteheadColor = EngravingRules.Rules.DefaultColorNotehead;
+            }
 
             // DEBUG runtime coloring test
             /*const testColor: string = "#FF0000";
@@ -78,9 +84,9 @@ export class GraphicalVoiceEntry extends GraphicalObject {
                     noteheadColor = defaultColorRest;
                 }
             }
-            if (noteheadColor) {
+            if (noteheadColor && note.sourceNote.PrintObject) {
                 note.sourceNote.NoteheadColor = noteheadColor;
-            } else {
+            } else if (!noteheadColor) {
                 continue;
             }
 
@@ -99,10 +105,22 @@ export class GraphicalVoiceEntry extends GraphicalObject {
         if (!stemColor && defaultColorStem) {
             stemColor = defaultColorStem;
         }
+        let stemTransparent: boolean = true;
+        for (const note of this.parentVoiceEntry.Notes) {
+            if (note.PrintObject) {
+                stemTransparent = false;
+                break;
+            }
+        }
+        if (stemTransparent) {
+            stemColor = transparentColor;
+        }
         const stemStyle: Object = { fillStyle: stemColor, strokeStyle: stemColor };
 
         if (stemColor && vfStaveNote.setStemStyle) {
-            this.parentVoiceEntry.StemColor = stemColor;
+            if (!stemTransparent) {
+                this.parentVoiceEntry.StemColor = stemColor;
+            }
             vfStaveNote.setStemStyle(stemStyle);
             if (vfStaveNote.flag && vfStaveNote.setFlagStyle && EngravingRules.Rules.ColorFlags) {
                 vfStaveNote.setFlagStyle(stemStyle);