import {Style} from "./Style";
import {GradientStyle} from "./GradientStyle";
import {Matrix} from "../../math/Matrix";
/**
* Pattern style represents an opaque object describing a pattern, based on an image, a canvas, or a video.
*
* The get method returns a CanvasPattern object https://developer.mozilla.org/en-US/docs/Web/API/CanvasPattern created by the context.createPattern() method.
*
* @class
* @extends {Style}
* @param {CanvasImageSource} source Source element of the pattern.
*/
function PatternStyle(source)
{
Style.call(this);
/**
* Source of the pattern style. Can be a image, video or another canvas element
*
* By default a empty image element is created.
*
* @type {CanvasImageSource}
*/
this.source = source || document.createElement("img");
/**
* Repetition indicates how the pattern image should be repeated.
*
* Possible values are "repeat", "repeat-x", "repeat-y" or "no-repeat".
*
* More information about this attribute here https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/createPattern.
*
* @type {string}
*/
this.repetition = "repeat"
/**
* Transformation matrix applied to the pattern.
*
* The transformation allows to move, rotate and scale the pattern freely
*
* @type {Matrix}
*/
this.matrix = new Matrix();
}
PatternStyle.prototype = Object.create(Style.prototype);
Style.register(PatternStyle, "Pattern");
/**
* Applies an 2x3 transformation matrix representing a linear transform to the pattern.
*
* @param {number[]} transform 2x3 Transformation matrix.
*/
PatternStyle.prototype.setTransform = function(transform)
{
this.matrix.m = transform;
this.needsUpdate = true;
};
PatternStyle.prototype.get = function(context)
{
if(this.needsUpdate || this.cache === null)
{
this.cache = context.createPattern(this.source, this.repetition);
this.cache.setTransform(this.matrix.cssTransform());
this.needsUpdate = false;
}
return this.cache;
};
PatternStyle.prototype.serialize = function ()
{
var data = GradientStyle.prototype.serialize.call(this);
Object.assign(data, {
type: "Pattern",
matrix: this.matrix.m,
repetition: this.repetition,
source: this.source
});
return data;
};
PatternStyle.prototype.parse = function (data)
{
GradientStyle.prototype.parse.call(this, data);
this.matrix = new Matrix(data.matrix);
this.repetition = data.repetition;
this.source = data.source;
};
export {PatternStyle};