| var sprintf = require('./sprintf'); |
| var spacing = require('../helpers/spacing'); |
| var renderText = require('./text'); |
|
|
| function drawBrace(renderer, params, selectables) { |
| |
| |
| var startY = params.startVoice.staff.absoluteY - spacing.STEP * 10; |
| if (params.endVoice && params.endVoice.staff) |
| params.endY = params.endVoice.staff.absoluteY - spacing.STEP * 2; |
| else if (params.lastContinuedVoice && params.lastContinuedVoice.staff) |
| params.endY = params.lastContinuedVoice.staff.absoluteY - spacing.STEP * 2; |
| else |
| params.endY = params.startVoice.staff.absoluteY - spacing.STEP * 2; |
| return draw(renderer, params.x, startY, params.endY, params.type, params.header, selectables); |
| } |
|
|
| function straightPath(renderer, xLeft, yTop, yBottom, type) { |
| xLeft += spacing.STEP; |
| var xLineWidth = spacing.STEP * 0.75; |
| var yOverlap = spacing.STEP * 0.75; |
| var height = yBottom - yTop; |
| |
| var pathString = sprintf("M %f %f l %f %f l %f %f l %f %f z", |
| xLeft, yTop - yOverlap, |
| 0, height + yOverlap * 2, |
| xLineWidth, 0, |
| 0, - (height + yOverlap * 2) |
| ); |
| |
| var wCurve = spacing.STEP * 2; |
| var hCurve = spacing.STEP; |
| pathString += sprintf("M %f %f q %f %f %f %f q %f %f %f %f z", |
| xLeft + xLineWidth, yTop - yOverlap, |
| wCurve * 0.6, hCurve * 0.2, |
| wCurve, -hCurve, |
| -wCurve * 0.1, hCurve * 0.3, |
| -wCurve, hCurve + spacing.STEP |
| ); |
| |
| pathString += sprintf("M %f %f q %f %f %f %f q %f %f %f %f z", |
| xLeft + xLineWidth, yTop + yOverlap + height, |
| wCurve * 0.6, -hCurve * 0.2, |
| wCurve, hCurve, |
| -wCurve * 0.1, -hCurve * 0.3, |
| -wCurve, -hCurve - spacing.STEP |
| ); |
| return renderer.paper.path({ path: pathString, stroke: renderer.foregroundColor, fill: renderer.foregroundColor, 'class': renderer.controller.classes.generate(type), "data-name": type }); |
| } |
|
|
| function curvyPath(renderer, xLeft, yTop, yBottom, type) { |
| var yHeight = yBottom - yTop; |
|
|
| var pathString = curve(xLeft, |
| yTop, |
| [7.5, -8, 21, 0, 18.5, -10.5, 7.5], |
| [0, yHeight / 5.5, yHeight / 3.14, yHeight / 2, yHeight / 2.93, yHeight / 4.88, 0]); |
|
|
| pathString += curve(xLeft, |
| yTop, |
| [0, 17.5, -7.5, 6.6, -5, 20, 0], |
| [yHeight / 2, yHeight / 1.46, yHeight / 1.22, yHeight, yHeight / 1.19, yHeight / 1.42, yHeight / 2]); |
|
|
| return renderer.paper.path({ path: pathString, stroke: renderer.foregroundColor, fill: renderer.foregroundColor, 'class': renderer.controller.classes.generate(type), "data-name": type }); |
| } |
|
|
| function curve(xLeft, yTop, xCurve, yCurve) { |
| return sprintf("M %f %f C %f %f %f %f %f %f C %f %f %f %f %f %f z", |
| xLeft + xCurve[0], yTop + yCurve[0], |
| xLeft + xCurve[1], yTop + yCurve[1], |
| xLeft + xCurve[2], yTop + yCurve[2], |
| xLeft + xCurve[3], yTop + yCurve[3], |
| xLeft + xCurve[4], yTop + yCurve[4], |
| xLeft + xCurve[5], yTop + yCurve[5], |
| xLeft + xCurve[6], yTop + yCurve[6]); |
| } |
|
|
| var draw = function (renderer, xLeft, yTop, yBottom, type, header, selectables) { |
| var ret; |
| if (header) { |
| renderer.paper.openGroup({ klass: renderer.controller.classes.generate("staff-extra voice-name"), "data-name": type }); |
| var position = yTop + (yBottom - yTop) / 2; |
| position = position - renderer.controller.getTextSize.baselineToCenter(header, "voicefont", 'staff-extra voice-name', 0, 1); |
|
|
| renderText(renderer, { |
| x: renderer.padding.left, |
| y: position, |
| text: header, |
| type: 'voicefont', |
| klass: 'staff-extra voice-name', |
| anchor: 'start', |
| centerVertically: true |
| }); |
| } |
| if (type === "brace") |
| ret = curvyPath(renderer, xLeft, yTop, yBottom, type); |
| else if (type === "bracket") |
| ret = straightPath(renderer, xLeft, yTop, yBottom, type); |
| if (header) { |
| ret = renderer.paper.closeGroup(); |
| } |
| selectables.wrapSvgEl({ el_type: type, startChar: -1, endChar: -1 }, ret); |
|
|
| return ret; |
| }; |
| module.exports = drawBrace; |
|
|