private void WriteConnectors(SvgWriter w, int systemNumber, PageFormat pageFormat) { List<bool> barlineContinuesDownList = pageFormat.BarlineContinuesDownList; int topVisibleStaffIndex = TopVisibleStaffIndex(); Debug.Assert(barlineContinuesDownList.Count == Staves.Count - topVisibleStaffIndex); Debug.Assert(barlineContinuesDownList[barlineContinuesDownList.Count - 1] == false); Barline barline = null; bool isFirstBarline = true; for(int staffIndex = topVisibleStaffIndex; staffIndex < Staves.Count; staffIndex++) { Staff staff = Staves[staffIndex]; Voice voice = staff.Voices[0]; float barlinesTop = staff.Metrics.StafflinesTop; float barlinesBottom = staff.Metrics.StafflinesBottom; #region set barlinesTop, barlinesBottom switch(staff.NumberOfStafflines) { case 1: barlinesTop -= (staff.Gap * 1.5F); barlinesBottom += (staff.Gap * 1.5F); break; case 2: case 3: case 4: barlinesTop -= staff.Gap; barlinesBottom += staff.Gap; break; default: break; } #endregion set barlinesTop, barlinesBottom #region draw barlines down from staves if(staffIndex < Staves.Count - 1) { BottomEdge bottomEdge = new BottomEdge(staff, 0F, pageFormat.Right, pageFormat.Gap); TopEdge topEdge = new TopEdge(Staves[staffIndex + 1], 0F, pageFormat.Right); isFirstBarline = true; for(int i = 0; i < voice.NoteObjects.Count; ++i) { NoteObject noteObject = voice.NoteObjects[i]; barline = noteObject as Barline; if(barline != null) { // draw grouping barlines between staves if(barlineContinuesDownList[staffIndex - topVisibleStaffIndex] || isFirstBarline) { float top = bottomEdge.YatX(barline.Metrics.OriginX); float bottom = topEdge.YatX(barline.Metrics.OriginX); bool isLastNoteObject = (i == (voice.NoteObjects.Count - 1)); barline.WriteSVG(w, top, bottom, pageFormat.BarlineStrokeWidth, pageFormat.StafflineStemStrokeWidth, isLastNoteObject, true); isFirstBarline = false; } } } } #endregion } }