import './point' as Point

export all : class Transform
	public [new xx yx xy yy x y] : begin
		this.xx = xx
		this.yx = yx
		this.xy = xy
		this.yy = yy
		this.x = x
		this.y = y
	public [inverse] : Transform.inverse this
	
	static [Id] : new Transform 1 0 0 1 0 0
	static [transformPoint tfm pt] : new Point
		* pt.x * tfm.xx + pt.y * tfm.yx + tfm.x
		* pt.x * tfm.xy + pt.y * tfm.yy + tfm.y
		* pt.onCurve
		* pt.cubic
		* pt.subdivided
	static [inverse tfm] : begin
		local denom : tfm.xx * tfm.yy - tfm.xy * tfm.yx
		return : new Transform
			* tfm.yy / denom;  * -tfm.yx / denom
			* -tfm.xy / denom; * tfm.xx / denom
			* -(tfm.x * tfm.yy - tfm.y * tfm.yx) / denom
			* -(-tfm.x * tfm.xy + tfm.y * tfm.xx) / denom
	static [untransform tfm pt] : begin
		local xx : pt.x - tfm.x
		local yy : pt.y - tfm.y
		local denom : tfm.xx * tfm.yy - tfm.xy * tfm.yx
		return : new Point
			* (xx * tfm.yy - yy * tfm.yx) / denom
			* (yy * tfm.xx - xx * tfm.xy) / denom
			* pt.onCurve
			* pt.cubic
			* pt.subdivided