diff --git a/src/ImageSharp/Processing/AffineTransformBuilder.cs b/src/ImageSharp/Processing/AffineTransformBuilder.cs
index ef0b24f815..c3d01241c9 100644
--- a/src/ImageSharp/Processing/AffineTransformBuilder.cs
+++ b/src/ImageSharp/Processing/AffineTransformBuilder.cs
@@ -145,6 +145,35 @@ namespace SixLabors.ImageSharp.Processing
public AffineTransformBuilder PrependSkewDegrees(float degreesX, float degreesY)
=> this.Prepend(size => TransformUtils.CreateSkewMatrixDegrees(degreesX, degreesY, size));
+ ///
+ /// Prepends a centered skew matrix from the give angles in radians.
+ ///
+ /// The X angle, in radians.
+ /// The Y angle, in radians.
+ /// The .
+ public AffineTransformBuilder PrependSkewRadians(float radiansX, float radiansY)
+ => this.Prepend(size => TransformUtils.CreateSkewMatrixRadians(radiansX, radiansY, size));
+
+ ///
+ /// Prepends a skew matrix using the given angles in degrees at the given origin.
+ ///
+ /// The X angle, in degrees.
+ /// The Y angle, in degrees.
+ /// The skew origin point.
+ /// The .
+ public AffineTransformBuilder PrependSkewDegrees(float degreesX, float degreesY, Vector2 origin)
+ => this.PrependSkewRadians(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY), origin);
+
+ ///
+ /// Prepends a skew matrix using the given angles in radians at the given origin.
+ ///
+ /// The X angle, in radians.
+ /// The Y angle, in radians.
+ /// The skew origin point.
+ /// The .
+ public AffineTransformBuilder PrependSkewRadians(float radiansX, float radiansY, Vector2 origin)
+ => this.PrependMatrix(Matrix3x2.CreateSkew(radiansX, radiansY, origin));
+
///
/// Appends a centered skew matrix from the give angles in degrees.
///
@@ -154,6 +183,35 @@ namespace SixLabors.ImageSharp.Processing
public AffineTransformBuilder AppendSkewDegrees(float degreesX, float degreesY)
=> this.Append(size => TransformUtils.CreateSkewMatrixDegrees(degreesX, degreesY, size));
+ ///
+ /// Appends a centered skew matrix from the give angles in radians.
+ ///
+ /// The X angle, in radians.
+ /// The Y angle, in radians.
+ /// The .
+ public AffineTransformBuilder AppendSkewRadians(float radiansX, float radiansY)
+ => this.Append(size => TransformUtils.CreateSkewMatrixRadians(radiansX, radiansY, size));
+
+ ///
+ /// Appends a skew matrix using the given angles in degrees at the given origin.
+ ///
+ /// The X angle, in degrees.
+ /// The Y angle, in degrees.
+ /// The skew origin point.
+ /// The .
+ public AffineTransformBuilder AppendSkewDegrees(float degreesX, float degreesY, Vector2 origin)
+ => this.AppendSkewRadians(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY), origin);
+
+ ///
+ /// Appends a skew matrix using the given angles in radians at the given origin.
+ ///
+ /// The X angle, in radians.
+ /// The Y angle, in radians.
+ /// The skew origin point.
+ /// The .
+ public AffineTransformBuilder AppendSkewRadians(float radiansX, float radiansY, Vector2 origin)
+ => this.AppendMatrix(Matrix3x2.CreateSkew(radiansX, radiansY, origin));
+
///
/// Prepends a translation matrix from the given vector.
///
diff --git a/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs b/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs
index 6cef38f8fe..24b15d3098 100644
--- a/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs
+++ b/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs
@@ -46,6 +46,18 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
new Rectangle(Point.Empty, size),
Matrix3x2Extensions.CreateSkewDegrees(degreesX, degreesY, PointF.Empty));
+ ///
+ /// Creates a centered skew matrix from the give angles in radians and the source size.
+ ///
+ /// The X angle, in radians.
+ /// The Y angle, in radians.
+ /// The source image size.
+ /// The .
+ public static Matrix3x2 CreateSkewMatrixRadians(float radiansX, float radiansY, Size size)
+ => CreateCenteredTransformMatrix(
+ new Rectangle(Point.Empty, size),
+ Matrix3x2Extensions.CreateSkew(radiansX, radiansY, PointF.Empty));
+
///
/// Gets the centered transform matrix based upon the source and destination rectangles.
///
diff --git a/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs b/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs
index 5a19b890d9..c29941d071 100644
--- a/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs
+++ b/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs
@@ -152,6 +152,82 @@ namespace SixLabors.ImageSharp.Processing
public ProjectiveTransformBuilder AppendScale(Vector2 scales)
=> this.AppendMatrix(Matrix4x4.CreateScale(new Vector3(scales, 1F)));
+ ///
+ /// Prepends a centered skew matrix from the give angles in degrees.
+ ///
+ /// The X angle, in degrees.
+ /// The Y angle, in degrees.
+ /// The .
+ internal ProjectiveTransformBuilder PrependSkewDegrees(float degreesX, float degreesY)
+ => this.PrependSkewRadians(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY));
+
+ ///
+ /// Prepends a centered skew matrix from the give angles in radians.
+ ///
+ /// The X angle, in radians.
+ /// The Y angle, in radians.
+ /// The .
+ public ProjectiveTransformBuilder PrependSkewRadians(float radiansX, float radiansY)
+ => this.Prepend(size => new Matrix4x4(TransformUtils.CreateSkewMatrixRadians(radiansX, radiansY, size)));
+
+ ///
+ /// Prepends a skew matrix using the given angles in degrees at the given origin.
+ ///
+ /// The X angle, in degrees.
+ /// The Y angle, in degrees.
+ /// The skew origin point.
+ /// The .
+ public ProjectiveTransformBuilder PrependSkewDegrees(float degreesX, float degreesY, Vector2 origin)
+ => this.PrependSkewRadians(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY), origin);
+
+ ///
+ /// Prepends a skew matrix using the given angles in radians at the given origin.
+ ///
+ /// The X angle, in radians.
+ /// The Y angle, in radians.
+ /// The skew origin point.
+ /// The .
+ public ProjectiveTransformBuilder PrependSkewRadians(float radiansX, float radiansY, Vector2 origin)
+ => this.PrependMatrix(new Matrix4x4(Matrix3x2.CreateSkew(radiansX, radiansY, origin)));
+
+ ///
+ /// Appends a centered skew matrix from the give angles in degrees.
+ ///
+ /// The X angle, in degrees.
+ /// The Y angle, in degrees.
+ /// The .
+ internal ProjectiveTransformBuilder AppendSkewDegrees(float degreesX, float degreesY)
+ => this.AppendSkewRadians(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY));
+
+ ///
+ /// Appends a centered skew matrix from the give angles in radians.
+ ///
+ /// The X angle, in radians.
+ /// The Y angle, in radians.
+ /// The .
+ public ProjectiveTransformBuilder AppendSkewRadians(float radiansX, float radiansY)
+ => this.Append(size => new Matrix4x4(TransformUtils.CreateSkewMatrixRadians(radiansX, radiansY, size)));
+
+ ///
+ /// Appends a skew matrix using the given angles in degrees at the given origin.
+ ///
+ /// The X angle, in degrees.
+ /// The Y angle, in degrees.
+ /// The skew origin point.
+ /// The .
+ public ProjectiveTransformBuilder AppendSkewDegrees(float degreesX, float degreesY, Vector2 origin)
+ => this.AppendSkewRadians(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY), origin);
+
+ ///
+ /// Appends a skew matrix using the given angles in radians at the given origin.
+ ///
+ /// The X angle, in radians.
+ /// The Y angle, in radians.
+ /// The skew origin point.
+ /// The .
+ public ProjectiveTransformBuilder AppendSkewRadians(float radiansX, float radiansY, Vector2 origin)
+ => this.AppendMatrix(new Matrix4x4(Matrix3x2.CreateSkew(radiansX, radiansY, origin)));
+
///
/// Prepends a translation matrix from the given vector.
///
diff --git a/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs
index 14b8672641..70159e18ac 100644
--- a/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs
+++ b/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs
@@ -9,28 +9,55 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms
{
public class AffineTransformBuilderTests : TransformBuilderTestBase
{
- protected override void AppendTranslation(AffineTransformBuilder builder, PointF translate) => builder.AppendTranslation(translate);
+ protected override AffineTransformBuilder CreateBuilder(Rectangle rectangle) => new AffineTransformBuilder();
- protected override void AppendScale(AffineTransformBuilder builder, SizeF scale) => builder.AppendScale(scale);
+ protected override void AppendRotationDegrees(AffineTransformBuilder builder, float degrees)
+ => builder.AppendRotationDegrees(degrees);
- protected override void AppendRotationRadians(AffineTransformBuilder builder, float radians) => builder.AppendRotationRadians(radians);
+ protected override void AppendRotationDegrees(AffineTransformBuilder builder, float degrees, Vector2 origin)
+ => builder.AppendRotationDegrees(degrees, origin);
- protected override void AppendRotationRadians(AffineTransformBuilder builder, float radians, Vector2 origin) => builder.AppendRotationRadians(radians, origin);
+ protected override void AppendRotationRadians(AffineTransformBuilder builder, float radians)
+ => builder.AppendRotationRadians(radians);
- protected override void AppendRotationDegrees(AffineTransformBuilder builder, float degrees) => builder.AppendRotationDegrees(degrees);
+ protected override void AppendRotationRadians(AffineTransformBuilder builder, float radians, Vector2 origin)
+ => builder.AppendRotationRadians(radians, origin);
- protected override void AppendRotationDegrees(AffineTransformBuilder builder, float degrees, Vector2 origin) => builder.AppendRotationDegrees(degrees, origin);
+ protected override void AppendScale(AffineTransformBuilder builder, SizeF scale)
+ => builder.AppendScale(scale);
- protected override void PrependTranslation(AffineTransformBuilder builder, PointF translate) => builder.PrependTranslation(translate);
+ protected override void AppendSkewDegrees(AffineTransformBuilder builder, float degreesX, float degreesY)
+ => builder.AppendSkewDegrees(degreesX, degreesY);
- protected override void PrependScale(AffineTransformBuilder builder, SizeF scale) => builder.PrependScale(scale);
+ protected override void AppendSkewDegrees(AffineTransformBuilder builder, float degreesX, float degreesY, Vector2 origin)
+ => builder.AppendSkewDegrees(degreesX, degreesY, origin);
- protected override void PrependRotationRadians(AffineTransformBuilder builder, float radians) => builder.PrependRotationRadians(radians);
+ protected override void AppendSkewRadians(AffineTransformBuilder builder, float radiansX, float radiansY)
+ => builder.AppendSkewRadians(radiansX, radiansY);
- protected override void PrependRotationRadians(AffineTransformBuilder builder, float radians, Vector2 origin) =>
- builder.PrependRotationRadians(radians, origin);
+ protected override void AppendSkewRadians(AffineTransformBuilder builder, float radiansX, float radiansY, Vector2 origin)
+ => builder.AppendSkewRadians(radiansX, radiansY, origin);
- protected override AffineTransformBuilder CreateBuilder(Rectangle rectangle) => new AffineTransformBuilder();
+ protected override void AppendTranslation(AffineTransformBuilder builder, PointF translate)
+ => builder.AppendTranslation(translate);
+
+ protected override void PrependRotationRadians(AffineTransformBuilder builder, float radians)
+ => builder.PrependRotationRadians(radians);
+
+ protected override void PrependRotationRadians(AffineTransformBuilder builder, float radians, Vector2 origin)
+ => builder.PrependRotationRadians(radians, origin);
+
+ protected override void PrependScale(AffineTransformBuilder builder, SizeF scale)
+ => builder.PrependScale(scale);
+
+ protected override void PrependSkewRadians(AffineTransformBuilder builder, float radiansX, float radiansY)
+ => builder.PrependSkewRadians(radiansX, radiansY);
+
+ protected override void PrependSkewRadians(AffineTransformBuilder builder, float radiansX, float radiansY, Vector2 origin)
+ => builder.PrependSkewRadians(radiansX, radiansY, origin);
+
+ protected override void PrependTranslation(AffineTransformBuilder builder, PointF translate)
+ => builder.PrependTranslation(translate);
protected override Vector2 Execute(
AffineTransformBuilder builder,
diff --git a/tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs
index 9f58826cd8..d82cd1689d 100644
--- a/tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs
+++ b/tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs
@@ -11,24 +11,42 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms
{
protected override ProjectiveTransformBuilder CreateBuilder(Rectangle rectangle) => new ProjectiveTransformBuilder();
- protected override void AppendTranslation(ProjectiveTransformBuilder builder, PointF translate) => builder.AppendTranslation(translate);
+ protected override void AppendRotationDegrees(ProjectiveTransformBuilder builder, float degrees) => builder.AppendRotationDegrees(degrees);
- protected override void AppendScale(ProjectiveTransformBuilder builder, SizeF scale) => builder.AppendScale(scale);
+ protected override void AppendRotationDegrees(ProjectiveTransformBuilder builder, float degrees, Vector2 origin) => builder.AppendRotationDegrees(degrees, origin);
protected override void AppendRotationRadians(ProjectiveTransformBuilder builder, float radians) => builder.AppendRotationRadians(radians);
protected override void AppendRotationRadians(ProjectiveTransformBuilder builder, float radians, Vector2 origin) => builder.AppendRotationRadians(radians, origin);
- protected override void AppendRotationDegrees(ProjectiveTransformBuilder builder, float degrees) => builder.AppendRotationDegrees(degrees);
+ protected override void AppendScale(ProjectiveTransformBuilder builder, SizeF scale) => builder.AppendScale(scale);
- protected override void AppendRotationDegrees(ProjectiveTransformBuilder builder, float degrees, Vector2 origin) => builder.AppendRotationDegrees(degrees, origin);
+ protected override void AppendSkewDegrees(ProjectiveTransformBuilder builder, float degreesX, float degreesY)
+ => builder.AppendSkewDegrees(degreesX, degreesY);
- protected override void PrependTranslation(ProjectiveTransformBuilder builder, PointF translate) => builder.PrependTranslation(translate);
+ protected override void AppendSkewDegrees(ProjectiveTransformBuilder builder, float degreesX, float degreesY, Vector2 origin)
+ => builder.AppendSkewDegrees(degreesX, degreesY, origin);
- protected override void PrependScale(ProjectiveTransformBuilder builder, SizeF scale) => builder.PrependScale(scale);
+ protected override void AppendSkewRadians(ProjectiveTransformBuilder builder, float radiansX, float radiansY)
+ => builder.AppendSkewRadians(radiansX, radiansY);
+
+ protected override void AppendSkewRadians(ProjectiveTransformBuilder builder, float radiansX, float radiansY, Vector2 origin)
+ => builder.AppendSkewRadians(radiansX, radiansY, origin);
+
+ protected override void AppendTranslation(ProjectiveTransformBuilder builder, PointF translate) => builder.AppendTranslation(translate);
protected override void PrependRotationRadians(ProjectiveTransformBuilder builder, float radians) => builder.PrependRotationRadians(radians);
+ protected override void PrependScale(ProjectiveTransformBuilder builder, SizeF scale) => builder.PrependScale(scale);
+
+ protected override void PrependSkewRadians(ProjectiveTransformBuilder builder, float radiansX, float radiansY)
+ => builder.PrependSkewRadians(radiansX, radiansY);
+
+ protected override void PrependSkewRadians(ProjectiveTransformBuilder builder, float radiansX, float radiansY, Vector2 origin)
+ => builder.PrependSkewRadians(radiansX, radiansY, origin);
+
+ protected override void PrependTranslation(ProjectiveTransformBuilder builder, PointF translate) => builder.PrependTranslation(translate);
+
protected override void PrependRotationRadians(ProjectiveTransformBuilder builder, float radians, Vector2 origin) =>
builder.PrependRotationRadians(radians, origin);
diff --git a/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs b/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs
index 43ad756e04..71e3b71797 100644
--- a/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs
+++ b/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs
@@ -86,17 +86,17 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms
public void AppendRotationDegrees_WithoutSpecificRotationCenter_RotationIsCenteredAroundImageCenter(
int width,
int height,
- float deg,
+ float degrees,
float x,
float y)
{
var size = new Size(width, height);
TBuilder builder = this.CreateBuilder(size);
- this.AppendRotationDegrees(builder, deg);
+ this.AppendRotationDegrees(builder, degrees);
// TODO: We should also test CreateRotationMatrixDegrees() (and all TransformUtils stuff!) for correctness
- Matrix3x2 matrix = TransformUtils.CreateRotationMatrixDegrees(deg, size);
+ Matrix3x2 matrix = TransformUtils.CreateRotationMatrixDegrees(degrees, size);
var position = new Vector2(x, y);
var expected = Vector2.Transform(position, matrix);
@@ -112,7 +112,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms
public void AppendRotationDegrees_WithRotationCenter(
int width,
int height,
- float deg,
+ float degrees,
float cx,
float cy,
float x,
@@ -122,9 +122,63 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms
TBuilder builder = this.CreateBuilder(size);
var centerPoint = new Vector2(cx, cy);
- this.AppendRotationDegrees(builder, deg, centerPoint);
+ this.AppendRotationDegrees(builder, degrees, centerPoint);
- var matrix = Matrix3x2.CreateRotation(GeometryUtilities.DegreeToRadian(deg), centerPoint);
+ var matrix = Matrix3x2.CreateRotation(GeometryUtilities.DegreeToRadian(degrees), centerPoint);
+
+ var position = new Vector2(x, y);
+ var expected = Vector2.Transform(position, matrix);
+ Vector2 actual = this.Execute(builder, new Rectangle(Point.Empty, size), position);
+
+ Assert.Equal(actual, expected, Comparer);
+ }
+
+ [Theory]
+ [InlineData(200, 100, 10, 10, 42, 84)]
+ [InlineData(200, 100, 100, 100, 42, 84)]
+ [InlineData(100, 200, -10, -10, 42, 84)]
+ public void AppendSkewDegrees_WithoutSpecificSkewCenter_SkewIsCenteredAroundImageCenter(
+ int width,
+ int height,
+ float degreesX,
+ float degreesY,
+ float x,
+ float y)
+ {
+ var size = new Size(width, height);
+ TBuilder builder = this.CreateBuilder(size);
+
+ this.AppendSkewDegrees(builder, degreesX, degreesY);
+
+ Matrix3x2 matrix = TransformUtils.CreateSkewMatrixDegrees(degreesX, degreesY, size);
+
+ var position = new Vector2(x, y);
+ var expected = Vector2.Transform(position, matrix);
+ Vector2 actual = this.Execute(builder, new Rectangle(Point.Empty, size), position);
+ Assert.Equal(actual, expected, Comparer);
+ }
+
+ [Theory]
+ [InlineData(200, 100, 10, 10, 30, 61, 42, 84)]
+ [InlineData(200, 100, 100, 100, 30, 10, 20, 84)]
+ [InlineData(100, 200, -10, -10, 30, 20, 11, 84)]
+ public void AppendSkewDegrees_WithSkewCenter(
+ int width,
+ int height,
+ float degreesX,
+ float degreesY,
+ float cx,
+ float cy,
+ float x,
+ float y)
+ {
+ var size = new Size(width, height);
+ TBuilder builder = this.CreateBuilder(size);
+
+ var centerPoint = new Vector2(cx, cy);
+ this.AppendSkewDegrees(builder, degreesX, degreesY, centerPoint);
+
+ var matrix = Matrix3x2.CreateSkew(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY), centerPoint);
var position = new Vector2(x, y);
var expected = Vector2.Transform(position, matrix);
@@ -144,14 +198,18 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms
// Forwards
this.AppendRotationRadians(b1, pi);
+ this.AppendSkewRadians(b1, pi, pi);
this.AppendScale(b1, new SizeF(2, 0.5f));
this.AppendRotationRadians(b1, pi / 2, new Vector2(-0.5f, -0.1f));
+ this.AppendSkewRadians(b1, pi, pi / 2, new Vector2(-0.5f, -0.1f));
this.AppendTranslation(b1, new PointF(123, 321));
// Backwards
this.PrependTranslation(b2, new PointF(123, 321));
+ this.PrependSkewRadians(b2, pi, pi / 2, new Vector2(-0.5f, -0.1f));
this.PrependRotationRadians(b2, pi / 2, new Vector2(-0.5f, -0.1f));
this.PrependScale(b2, new SizeF(2, 0.5f));
+ this.PrependSkewRadians(b2, pi, pi);
this.PrependRotationRadians(b2, pi);
Vector2 p1 = this.Execute(b1, rectangle, new Vector2(32, 65));
@@ -180,25 +238,37 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms
protected abstract TBuilder CreateBuilder(Rectangle rectangle);
- protected abstract void AppendTranslation(TBuilder builder, PointF translate);
+ protected abstract void AppendRotationDegrees(TBuilder builder, float degrees);
- protected abstract void AppendScale(TBuilder builder, SizeF scale);
+ protected abstract void AppendRotationDegrees(TBuilder builder, float degrees, Vector2 origin);
protected abstract void AppendRotationRadians(TBuilder builder, float radians);
protected abstract void AppendRotationRadians(TBuilder builder, float radians, Vector2 origin);
- protected abstract void PrependTranslation(TBuilder builder, PointF translate);
+ protected abstract void AppendScale(TBuilder builder, SizeF scale);
- protected abstract void PrependScale(TBuilder builder, SizeF scale);
+ protected abstract void AppendSkewDegrees(TBuilder builder, float degreesX, float degreesY);
+
+ protected abstract void AppendSkewDegrees(TBuilder builder, float degreesX, float degreesY, Vector2 origin);
+
+ protected abstract void AppendSkewRadians(TBuilder builder, float radiansX, float radiansY);
+
+ protected abstract void AppendSkewRadians(TBuilder builder, float radiansX, float radiansY, Vector2 origin);
+
+ protected abstract void AppendTranslation(TBuilder builder, PointF translate);
protected abstract void PrependRotationRadians(TBuilder builder, float radians);
protected abstract void PrependRotationRadians(TBuilder builder, float radians, Vector2 origin);
- protected abstract void AppendRotationDegrees(TBuilder builder, float degrees);
+ protected abstract void PrependScale(TBuilder builder, SizeF scale);
- protected abstract void AppendRotationDegrees(TBuilder builder, float degrees, Vector2 origin);
+ protected abstract void PrependSkewRadians(TBuilder builder, float radiansX, float radiansY);
+
+ protected abstract void PrependSkewRadians(TBuilder builder, float radiansX, float radiansY, Vector2 origin);
+
+ protected abstract void PrependTranslation(TBuilder builder, PointF translate);
protected abstract Vector2 Execute(TBuilder builder, Rectangle rectangle, Vector2 sourcePoint);
}