|
|
var getBarYAt = require('./get-bar-y-at'); |
|
|
|
|
|
function layoutTriplet(element) { |
|
|
|
|
|
if (element.anchor1 && element.anchor2) { |
|
|
element.hasBeam = !!element.anchor1.parent.beam && element.anchor1.parent.beam === element.anchor2.parent.beam; |
|
|
var beam = element.anchor1.parent.beam; |
|
|
|
|
|
|
|
|
if (element.hasBeam && (beam.elems[0] !== element.anchor1.parent || beam.elems[beam.elems.length - 1] !== element.anchor2.parent)) |
|
|
element.hasBeam = false; |
|
|
|
|
|
if (element.hasBeam) { |
|
|
|
|
|
var left = isAbove(beam) ? element.anchor1.x + element.anchor1.w : element.anchor1.x; |
|
|
element.yTextPos = heightAtMidpoint(left, element.anchor2.x, beam); |
|
|
element.yTextPos += isAbove(beam) ? 3 : -2; |
|
|
element.xTextPos = xAtMidpoint(left, element.anchor2.x); |
|
|
element.top = element.yTextPos + 1; |
|
|
element.bottom = element.yTextPos - 2; |
|
|
if (isAbove(beam)) |
|
|
element.endingHeightAbove = 4; |
|
|
} else { |
|
|
|
|
|
|
|
|
|
|
|
element.startNote = Math.max(element.anchor1.parent.top, 9) + 4; |
|
|
element.endNote = Math.max(element.anchor2.parent.top, 9) + 4; |
|
|
|
|
|
if (element.anchor1.parent.type === "rest" && element.anchor2.parent.type !== "rest") |
|
|
element.startNote = element.endNote; |
|
|
else if (element.anchor2.parent.type === "rest" && element.anchor1.parent.type !== "rest") |
|
|
element.endNote = element.startNote; |
|
|
|
|
|
var max = 0; |
|
|
for (var i = 0; i < element.middleElems.length; i++) { |
|
|
max = Math.max(max, element.middleElems[i].top); |
|
|
} |
|
|
max += 4; |
|
|
if (max > element.startNote || max > element.endNote) { |
|
|
element.startNote = max; |
|
|
element.endNote = max; |
|
|
} |
|
|
if (element.flatBeams) { |
|
|
element.startNote = Math.max(element.startNote, element.endNote); |
|
|
element.endNote = Math.max(element.startNote, element.endNote); |
|
|
} |
|
|
|
|
|
element.yTextPos = element.startNote + (element.endNote - element.startNote) / 2; |
|
|
element.xTextPos = element.anchor1.x + (element.anchor2.x + element.anchor2.w - element.anchor1.x) / 2; |
|
|
element.top = element.yTextPos + 1; |
|
|
} |
|
|
} |
|
|
delete element.middleElems; |
|
|
delete element.flatBeams; |
|
|
} |
|
|
|
|
|
function isAbove(beam) { |
|
|
return beam.stemsUp; |
|
|
} |
|
|
|
|
|
|
|
|
function heightAtMidpoint(startX, endX, beam) { |
|
|
if (beam.beams.length === 0) |
|
|
return 0; |
|
|
beam = beam.beams[0]; |
|
|
var midPoint = startX + (endX - startX) / 2; |
|
|
return getBarYAt(beam.startX, beam.startY, beam.endX, beam.endY, midPoint); |
|
|
} |
|
|
|
|
|
function xAtMidpoint(startX, endX) { |
|
|
return startX + (endX - startX) / 2; |
|
|
} |
|
|
|
|
|
module.exports = layoutTriplet; |
|
|
|