213 lines
4.7 KiB
Plaintext
213 lines
4.7 KiB
Plaintext
// Geometric objects
|
|
|
|
// import BoundingBox from './bbox';
|
|
|
|
/**
|
|
* A bézier path containing a set of path commands similar to a SVG path.
|
|
* Paths can be drawn on a context using `draw`.
|
|
* @exports opentype.Path
|
|
* @class
|
|
* @constructor
|
|
*/
|
|
function Path() {
|
|
this.commands = [];
|
|
this.fill = 'black';
|
|
this.stroke = null;
|
|
this.strokeWidth = 1;
|
|
}
|
|
|
|
/**
|
|
* @param {number} x
|
|
* @param {number} y
|
|
*/
|
|
Path.prototype.moveTo = function (x, y) {
|
|
this.commands.push({
|
|
type: 'M',
|
|
x: x,
|
|
y: y,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* @param {number} x
|
|
* @param {number} y
|
|
*/
|
|
Path.prototype.lineTo = function (x, y) {
|
|
this.commands.push({
|
|
type: 'L',
|
|
x: x,
|
|
y: y,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Draws cubic curve
|
|
* @function
|
|
* curveTo
|
|
* @memberof opentype.Path.prototype
|
|
* @param {number} x1 - x of control 1
|
|
* @param {number} y1 - y of control 1
|
|
* @param {number} x2 - x of control 2
|
|
* @param {number} y2 - y of control 2
|
|
* @param {number} x - x of path point
|
|
* @param {number} y - y of path point
|
|
*/
|
|
|
|
/**
|
|
* Draws cubic curve
|
|
* @function
|
|
* bezierCurveTo
|
|
* @memberof opentype.Path.prototype
|
|
* @param {number} x1 - x of control 1
|
|
* @param {number} y1 - y of control 1
|
|
* @param {number} x2 - x of control 2
|
|
* @param {number} y2 - y of control 2
|
|
* @param {number} x - x of path point
|
|
* @param {number} y - y of path point
|
|
* @see curveTo
|
|
*/
|
|
Path.prototype.curveTo = Path.prototype.bezierCurveTo = function (
|
|
x1,
|
|
y1,
|
|
x2,
|
|
y2,
|
|
x,
|
|
y
|
|
) {
|
|
this.commands.push({
|
|
type: 'C',
|
|
x1: x1,
|
|
y1: y1,
|
|
x2: x2,
|
|
y2: y2,
|
|
x: x,
|
|
y: y,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Draws quadratic curve
|
|
* @function
|
|
* quadraticCurveTo
|
|
* @memberof opentype.Path.prototype
|
|
* @param {number} x1 - x of control
|
|
* @param {number} y1 - y of control
|
|
* @param {number} x - x of path point
|
|
* @param {number} y - y of path point
|
|
*/
|
|
|
|
/**
|
|
* Draws quadratic curve
|
|
* @function
|
|
* quadTo
|
|
* @memberof opentype.Path.prototype
|
|
* @param {number} x1 - x of control
|
|
* @param {number} y1 - y of control
|
|
* @param {number} x - x of path point
|
|
* @param {number} y - y of path point
|
|
*/
|
|
Path.prototype.quadTo = Path.prototype.quadraticCurveTo = function (
|
|
x1,
|
|
y1,
|
|
x,
|
|
y
|
|
) {
|
|
this.commands.push({
|
|
type: 'Q',
|
|
x1: x1,
|
|
y1: y1,
|
|
x: x,
|
|
y: y,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Closes the path
|
|
* @function closePath
|
|
* @memberof opentype.Path.prototype
|
|
*/
|
|
|
|
/**
|
|
* Close the path
|
|
* @function close
|
|
* @memberof opentype.Path.prototype
|
|
*/
|
|
Path.prototype.close = Path.prototype.closePath = function () {
|
|
this.commands.push({
|
|
type: 'Z',
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Add the given path or list of commands to the commands of this path.
|
|
* @param {Array} pathOrCommands - another opentype.Path, an opentype.BoundingBox, or an array of commands.
|
|
*/
|
|
Path.prototype.extend = function (pathOrCommands) {
|
|
if (pathOrCommands.commands) {
|
|
pathOrCommands = pathOrCommands.commands;
|
|
}
|
|
// else if (pathOrCommands instanceof BoundingBox) {
|
|
// const box = pathOrCommands;
|
|
// this.moveTo(box.x1, box.y1);
|
|
// this.lineTo(box.x2, box.y1);
|
|
// this.lineTo(box.x2, box.y2);
|
|
// this.lineTo(box.x1, box.y2);
|
|
// this.close();
|
|
// return;
|
|
// }
|
|
|
|
Array.prototype.push.apply(this.commands, pathOrCommands);
|
|
};
|
|
|
|
/**
|
|
* Convert the Path to a string of path data instructions
|
|
* See http://www.w3.org/TR/SVG/paths.html#PathData
|
|
* @param {number} [decimalPlaces=2] - The amount of decimal places for floating-point values
|
|
* @return {string}
|
|
*/
|
|
Path.prototype.toPathData = function (decimalPlaces) {
|
|
decimalPlaces = decimalPlaces !== undefined ? decimalPlaces : 2;
|
|
|
|
function floatToString(v) {
|
|
if (Math.round(v) === v) {
|
|
return '' + Math.round(v);
|
|
} else {
|
|
return v.toFixed(decimalPlaces);
|
|
}
|
|
}
|
|
|
|
function packValues() {
|
|
let s = '';
|
|
for (let i = 0; i < arguments.length; i += 1) {
|
|
const v = arguments[i];
|
|
if (v >= 0 && i > 0) {
|
|
s += ' ';
|
|
}
|
|
|
|
s += floatToString(v);
|
|
}
|
|
|
|
return s;
|
|
}
|
|
|
|
let d = '';
|
|
for (let i = 0; i < this.commands.length; i += 1) {
|
|
const cmd = this.commands[i];
|
|
if (cmd.type === 'M') {
|
|
d += 'M' + packValues(cmd.x, cmd.y);
|
|
} else if (cmd.type === 'L') {
|
|
d += 'L' + packValues(cmd.x, cmd.y);
|
|
} else if (cmd.type === 'C') {
|
|
d += 'C' + packValues(cmd.x1, cmd.y1, cmd.x2, cmd.y2, cmd.x, cmd.y);
|
|
} else if (cmd.type === 'Q') {
|
|
d += 'Q' + packValues(cmd.x1, cmd.y1, cmd.x, cmd.y);
|
|
} else if (cmd.type === 'Z') {
|
|
d += 'Z';
|
|
}
|
|
}
|
|
|
|
return d;
|
|
};
|
|
|
|
export default Path;
|