satie
Version:
A sheet music renderer for the web
76 lines (66 loc) • 2.38 kB
text/typescript
/**
* This file is part of Satie music engraver <https://github.com/jnetterf/satie>.
* Copyright (C) Joshua Netterfield <joshua.ca> 2015 - present.
*
* Satie is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Satie is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Satie. If not, see <http://www.gnu.org/licenses/>.
*/
import {Component, DOM, PropTypes} from "react";
import {getGlyphCode} from "./private_smufl";
import {toPathData} from "./private_fontManager";
export interface IProps {
key?: string | number;
fill: string;
glyphName: string;
"selection-info"?: string;
transform?: string;
x: number;
y: number;
opacity?: number;
code?: string;
scale?: number;
}
/**
* Most musical elements are rendered as glyphs. Exceptions include
* slurs, ties, dots in dotted notes, ledger lines, and stave lines.
*/
export default class Glyph extends Component<IProps, void> {
static contextTypes = {
renderTarget: PropTypes.oneOf(["svg-web", "svg-export"])
} as any;
context: {
renderTarget?: "svg-web" | "svg-export",
};
render() {
let px = this.props.x;
let py = this.props.y;
if (this.context.renderTarget === "svg-export") {
let pathData = toPathData("Bravura",
getGlyphCode(this.props.glyphName), px, py, 40 * (this.props.scale || 1));
return DOM.path({d: pathData}, null);
}
let text = DOM.text({
className: "mn_",
fill: this.props.fill,
fillOpacity: this.props.opacity,
fontSize: 40 * (this.props.scale || 1),
strokeOpacity: this.props.opacity,
transform: this.props.transform,
x: px,
y: py
},
getGlyphCode(this.props.glyphName)
);
return text;
}
}