'use strict';
const Rac = require('./Rac');
/**
* This namespace lists utility functions attached to an instance of
* `{@link Rac}` used to produce drawable and other objects, and to access
* ready-build convenience objects like `{@link instance.Angle#north}` or
* `{@link instance.Point#zero}`.
*
* Drawable and related objects require a reference to a `rac` instance in
* order to perform drawing operations. These functions build new objects
* using the calling `Rac` instance, and contain ready-made convenience
* objects that are also setup with the same `Rac` instance.
*
* @namespace instance
*/
// Attaches the convenience functions to create objects with this instance
// of Rac. These functions are attached as properties (instead of into the
// prototype) because these are later populated with more properties and
// methods, and thus need to be an independent instance.
//
// Intended to receive the a Rac instance as parameter.
module.exports = function attachInstanceFunctions(rac) {
/**
* Convenience function that creates a new `Color` setup with `this`.
*
* The function also contains additional methods and properties listed in
* `{@link instance.Color}`.
*
* @param {number} r
* @param {number} g
* @param {number} b
* @param {number=} a
*
* @returns {Rac.Color}
*
* @see instance.Color
*/
rac.Color = function makeColor(r, g, b, alpha = 1) {
return new Rac.Color(this, r, g, b, alpha);
};
/**
* Convenience function that creates a new `Stroke` setup with `this`.
*
* The function also contains additional methods and properties listed in
* `{@link instance.Stroke}`.
*
* @param {?number} weight
* @param {?Rac.Color} color
*
* @returns {Rac.Stroke}
*
* @see instance.Stroke
*/
rac.Stroke = function makeStroke(weight, color = null) {
return new Rac.Stroke(this, weight, color);
};
/**
* Convenience function that creates a new `Fill` setup with `this`.
*
* The function also contains additional methods and properties listed in
* `{@link instance.Fill}`.
*
* @param {Rac.Color=} color
* @returns {Rac.Fill}
*
* @see instance.Fill
*/
rac.Fill = function makeFill(color = null) {
return new Rac.Fill(this, color);
};
/**
* Convenience function that creates a new `Style` setup with `this`.
*
* The function also contains additional methods and properties listed in
* `{@link instance.Style}`.
*
* @param {?Rac.Stroke} stroke
* @param {?Rac.Fill} fill
*
* @returns {Rac.Style}
*
* @see instance.Style
*/
rac.Style = function makeStyle(stroke = null, fill = null) {
return new Rac.Style(this, stroke, fill);
};
/**
* Convenience function that creates a new `Angle` setup with `this`.
*
* The function also contains additional methods and properties listed in
* `{@link instance.Angle}`.
*
* @param {number} turn - The turn value of the angle, in the range `[O,1)`
* @returns {Rac.Angle}
*
* @see instance.Angle
*/
rac.Angle = function makeAngle(turn) {
return new Rac.Angle(this, turn);
};
/**
* Convenience function that creates a new `Point` setup with `this`.
*
* The function also contains additional methods and properties listed in
* `{@link instance.Point}`.
*
* @param {number} x
* @param {number} y
*
* @returns {Rac.Point}
*
* @see instance.Point
*/
rac.Point = function makePoint(x, y) {
return new Rac.Point(this, x, y);
};
/**
* Convenience function that creates a new `Ray` setup with `this`.
*
* The function also contains additional methods and properties listed in
* `{@link instance.Ray}`.
*
* @param {number} x
* @param {number} y
* @param {Rac.Angle|number} angle
*
* @returns {Rac.Ray}
*
* @see instance.Ray
*/
rac.Ray = function makeRay(x, y, angle) {
const start = new Rac.Point(this, x, y);
angle = Rac.Angle.from(this, angle);
return new Rac.Ray(this, start, angle);
};
/**
* Convenience function that creates a new `Segment` setup with `this`.
*
* The function also contains additional methods and properties listed in
* `{@link instance.Segment}`.
*
* @param {number} x
* @param {number} y
* @param {Rac.Angle|number} angle
* @param {number} length
*
* @returns {Rac.Segment}
*
* @see instance.Segment
*/
rac.Segment = function makeSegment(x, y, angle, length) {
const start = new Rac.Point(this, x, y);
angle = Rac.Angle.from(this, angle);
const ray = new Rac.Ray(this, start, angle);
return new Rac.Segment(this, ray, length);
};
/**
* Convenience function that creates a new `Arc` setup with `this`.
*
* The function also contains additional methods and properties listed in
* `{@link instance.Arc}`.
*
* @param {number} x
* @param {number} y
* @param {Rac.Angle|number} start
* @param {?Rac.Angle|number} [end=null]
* @param {boolean} [clockwise=true]
*
* @returns {Rac.Arc}
*
* @see instance.Arc
*/
rac.Arc = function makeArc(x, y, radius, start = this.Angle.zero, end = null, clockwise = true) {
const center = new Rac.Point(this, x, y);
start = Rac.Angle.from(this, start);
end = end === null
? start
: Rac.Angle.from(this, end);
return new Rac.Arc(this, center, radius, start, end, clockwise);
};
/**
* Convenience function that creates a new `Text` setup with `this`.
*
* The function also contains additional methods and properties listed in
* `{@link instance.Text}`.
*
* @param {number} x
* @param {number} y
* @param {string} string
* @param {Rac.Text.Format} format
*
* @returns {Rac.Text}
*
* @see instance.Text
*/
rac.Text = function makeText(x, y, string, format) {
const point = new Rac.Point(this, x, y);
return new Rac.Text(this, point, string, format);
};
/**
* Convenience function that creates a new `Bezier` setup with `this`.
*
* The function also contains additional methods and properties listed in
* `{@link instance.Bezier}`.
*
* @param {number} startX
* @param {number} startY
* @param {number} startAnchorX
* @param {number} startAnchorY
* @param {number} endAnchorX
* @param {number} endAnchorY
* @param {number} endX
* @param {number} endY
*
* @returns {Rac.Bezier}
*
* @see instance.Bezier
*/
rac.Bezier = function makeBezier(
startX, startY, startAnchorX, startAnchorY,
endAnchorX, endAnchorY, endX, endY)
{
const start = new Rac.Point(this, startX, startY);
const startAnchor = new Rac.Point(this, startAnchorX, startAnchorY);
const endAnchor = new Rac.Point(this, endAnchorX, endAnchorY);
const end = new Rac.Point(this, endX, endY);
return new Rac.Bezier(this, start, startAnchor, endAnchor, end);
};
}; // attachInstanceFunctions