Browse Source

Add Skew methods and tests.

af/merge-core
James Jackson-South 8 years ago
parent
commit
450a417d34
  1. 58
      src/ImageSharp/Processing/AffineTransformBuilder.cs
  2. 12
      src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs
  3. 76
      src/ImageSharp/Processing/ProjectiveTransformBuilder.cs
  4. 51
      tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs
  5. 30
      tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs
  6. 94
      tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs

58
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));
/// <summary>
/// Prepends a centered skew matrix from the give angles in radians.
/// </summary>
/// <param name="radiansX">The X angle, in radians.</param>
/// <param name="radiansY">The Y angle, in radians.</param>
/// <returns>The <see cref="AffineTransformBuilder"/>.</returns>
public AffineTransformBuilder PrependSkewRadians(float radiansX, float radiansY)
=> this.Prepend(size => TransformUtils.CreateSkewMatrixRadians(radiansX, radiansY, size));
/// <summary>
/// Prepends a skew matrix using the given angles in degrees at the given origin.
/// </summary>
/// <param name="degreesX">The X angle, in degrees.</param>
/// <param name="degreesY">The Y angle, in degrees.</param>
/// <param name="origin">The skew origin point.</param>
/// <returns>The <see cref="AffineTransformBuilder"/>.</returns>
public AffineTransformBuilder PrependSkewDegrees(float degreesX, float degreesY, Vector2 origin)
=> this.PrependSkewRadians(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY), origin);
/// <summary>
/// Prepends a skew matrix using the given angles in radians at the given origin.
/// </summary>
/// <param name="radiansX">The X angle, in radians.</param>
/// <param name="radiansY">The Y angle, in radians.</param>
/// <param name="origin">The skew origin point.</param>
/// <returns>The <see cref="AffineTransformBuilder"/>.</returns>
public AffineTransformBuilder PrependSkewRadians(float radiansX, float radiansY, Vector2 origin)
=> this.PrependMatrix(Matrix3x2.CreateSkew(radiansX, radiansY, origin));
/// <summary>
/// Appends a centered skew matrix from the give angles in degrees.
/// </summary>
@ -154,6 +183,35 @@ namespace SixLabors.ImageSharp.Processing
public AffineTransformBuilder AppendSkewDegrees(float degreesX, float degreesY)
=> this.Append(size => TransformUtils.CreateSkewMatrixDegrees(degreesX, degreesY, size));
/// <summary>
/// Appends a centered skew matrix from the give angles in radians.
/// </summary>
/// <param name="radiansX">The X angle, in radians.</param>
/// <param name="radiansY">The Y angle, in radians.</param>
/// <returns>The <see cref="AffineTransformBuilder"/>.</returns>
public AffineTransformBuilder AppendSkewRadians(float radiansX, float radiansY)
=> this.Append(size => TransformUtils.CreateSkewMatrixRadians(radiansX, radiansY, size));
/// <summary>
/// Appends a skew matrix using the given angles in degrees at the given origin.
/// </summary>
/// <param name="degreesX">The X angle, in degrees.</param>
/// <param name="degreesY">The Y angle, in degrees.</param>
/// <param name="origin">The skew origin point.</param>
/// <returns>The <see cref="AffineTransformBuilder"/>.</returns>
public AffineTransformBuilder AppendSkewDegrees(float degreesX, float degreesY, Vector2 origin)
=> this.AppendSkewRadians(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY), origin);
/// <summary>
/// Appends a skew matrix using the given angles in radians at the given origin.
/// </summary>
/// <param name="radiansX">The X angle, in radians.</param>
/// <param name="radiansY">The Y angle, in radians.</param>
/// <param name="origin">The skew origin point.</param>
/// <returns>The <see cref="AffineTransformBuilder"/>.</returns>
public AffineTransformBuilder AppendSkewRadians(float radiansX, float radiansY, Vector2 origin)
=> this.AppendMatrix(Matrix3x2.CreateSkew(radiansX, radiansY, origin));
/// <summary>
/// Prepends a translation matrix from the given vector.
/// </summary>

12
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));
/// <summary>
/// Creates a centered skew matrix from the give angles in radians and the source size.
/// </summary>
/// <param name="radiansX">The X angle, in radians.</param>
/// <param name="radiansY">The Y angle, in radians.</param>
/// <param name="size">The source image size.</param>
/// <returns>The <see cref="Matrix3x2"/>.</returns>
public static Matrix3x2 CreateSkewMatrixRadians(float radiansX, float radiansY, Size size)
=> CreateCenteredTransformMatrix(
new Rectangle(Point.Empty, size),
Matrix3x2Extensions.CreateSkew(radiansX, radiansY, PointF.Empty));
/// <summary>
/// Gets the centered transform matrix based upon the source and destination rectangles.
/// </summary>

76
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)));
/// <summary>
/// Prepends a centered skew matrix from the give angles in degrees.
/// </summary>
/// <param name="degreesX">The X angle, in degrees.</param>
/// <param name="degreesY">The Y angle, in degrees.</param>
/// <returns>The <see cref="ProjectiveTransformBuilder"/>.</returns>
internal ProjectiveTransformBuilder PrependSkewDegrees(float degreesX, float degreesY)
=> this.PrependSkewRadians(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY));
/// <summary>
/// Prepends a centered skew matrix from the give angles in radians.
/// </summary>
/// <param name="radiansX">The X angle, in radians.</param>
/// <param name="radiansY">The Y angle, in radians.</param>
/// <returns>The <see cref="ProjectiveTransformBuilder"/>.</returns>
public ProjectiveTransformBuilder PrependSkewRadians(float radiansX, float radiansY)
=> this.Prepend(size => new Matrix4x4(TransformUtils.CreateSkewMatrixRadians(radiansX, radiansY, size)));
/// <summary>
/// Prepends a skew matrix using the given angles in degrees at the given origin.
/// </summary>
/// <param name="degreesX">The X angle, in degrees.</param>
/// <param name="degreesY">The Y angle, in degrees.</param>
/// <param name="origin">The skew origin point.</param>
/// <returns>The <see cref="ProjectiveTransformBuilder"/>.</returns>
public ProjectiveTransformBuilder PrependSkewDegrees(float degreesX, float degreesY, Vector2 origin)
=> this.PrependSkewRadians(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY), origin);
/// <summary>
/// Prepends a skew matrix using the given angles in radians at the given origin.
/// </summary>
/// <param name="radiansX">The X angle, in radians.</param>
/// <param name="radiansY">The Y angle, in radians.</param>
/// <param name="origin">The skew origin point.</param>
/// <returns>The <see cref="ProjectiveTransformBuilder"/>.</returns>
public ProjectiveTransformBuilder PrependSkewRadians(float radiansX, float radiansY, Vector2 origin)
=> this.PrependMatrix(new Matrix4x4(Matrix3x2.CreateSkew(radiansX, radiansY, origin)));
/// <summary>
/// Appends a centered skew matrix from the give angles in degrees.
/// </summary>
/// <param name="degreesX">The X angle, in degrees.</param>
/// <param name="degreesY">The Y angle, in degrees.</param>
/// <returns>The <see cref="ProjectiveTransformBuilder"/>.</returns>
internal ProjectiveTransformBuilder AppendSkewDegrees(float degreesX, float degreesY)
=> this.AppendSkewRadians(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY));
/// <summary>
/// Appends a centered skew matrix from the give angles in radians.
/// </summary>
/// <param name="radiansX">The X angle, in radians.</param>
/// <param name="radiansY">The Y angle, in radians.</param>
/// <returns>The <see cref="ProjectiveTransformBuilder"/>.</returns>
public ProjectiveTransformBuilder AppendSkewRadians(float radiansX, float radiansY)
=> this.Append(size => new Matrix4x4(TransformUtils.CreateSkewMatrixRadians(radiansX, radiansY, size)));
/// <summary>
/// Appends a skew matrix using the given angles in degrees at the given origin.
/// </summary>
/// <param name="degreesX">The X angle, in degrees.</param>
/// <param name="degreesY">The Y angle, in degrees.</param>
/// <param name="origin">The skew origin point.</param>
/// <returns>The <see cref="ProjectiveTransformBuilder"/>.</returns>
public ProjectiveTransformBuilder AppendSkewDegrees(float degreesX, float degreesY, Vector2 origin)
=> this.AppendSkewRadians(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY), origin);
/// <summary>
/// Appends a skew matrix using the given angles in radians at the given origin.
/// </summary>
/// <param name="radiansX">The X angle, in radians.</param>
/// <param name="radiansY">The Y angle, in radians.</param>
/// <param name="origin">The skew origin point.</param>
/// <returns>The <see cref="ProjectiveTransformBuilder"/>.</returns>
public ProjectiveTransformBuilder AppendSkewRadians(float radiansX, float radiansY, Vector2 origin)
=> this.AppendMatrix(new Matrix4x4(Matrix3x2.CreateSkew(radiansX, radiansY, origin)));
/// <summary>
/// Prepends a translation matrix from the given vector.
/// </summary>

51
tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs

@ -9,28 +9,55 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms
{
public class AffineTransformBuilderTests : TransformBuilderTestBase<AffineTransformBuilder>
{
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,

30
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);

94
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);
}

Loading…
Cancel
Save