[Flags]
internal enum MatrixTypes
{
TRANSFORM_IS_IDENTITY = 0,
TRANSFORM_IS_SCALING = 2,
TRANSFORM_IS_TRANSLATION = 1,
TRANSFORM_IS_UNKNOWN = 4
}
internal static void MultiplyMatrix(ref Matrix matrix1, ref Matrix matrix2)
MatrixTypes types = matrix1._type;
MatrixTypes types2 = matrix2._type;
if (types2 != MatrixTypes.TRANSFORM_IS_IDENTITY)
if (types == MatrixTypes.TRANSFORM_IS_IDENTITY)
matrix1 = matrix2;
else if (types2 == MatrixTypes.TRANSFORM_IS_TRANSLATION)
matrix1._offsetX += matrix2._offsetX;
matrix1._offsetY += matrix2._offsetY;
if (types != MatrixTypes.TRANSFORM_IS_UNKNOWN)
matrix1._type |= MatrixTypes.TRANSFORM_IS_TRANSLATION;
else if (types == MatrixTypes.TRANSFORM_IS_TRANSLATION)
double num = matrix1._offsetX;
double num2 = matrix1._offsetY;
matrix1._offsetX = ((num * matrix2._m11) + (num2 * matrix2._m21)) + matrix2._offsetX;
matrix1._offsetY = ((num * matrix2._m12) + (num2 * matrix2._m22)) + matrix2._offsetY;
if (types2 == MatrixTypes.TRANSFORM_IS_UNKNOWN)
matrix1._type = MatrixTypes.TRANSFORM_IS_UNKNOWN;
else
matrix1._type = MatrixTypes.TRANSFORM_IS_SCALING | MatrixTypes.TRANSFORM_IS_TRANSLATION;
switch (((((int)types) << 4) | types2))
case 0x22:
matrix1._m11 *= matrix2._m11;
matrix1._m22 *= matrix2._m22;
return;
case 0x23:
matrix1._offsetX = matrix2._offsetX;
matrix1._offsetY = matrix2._offsetY;
matrix1._type = MatrixTypes.TRANSFORM_IS_SCALING
| MatrixTypes.TRANSFORM_IS_TRANSLATION;
case 0x24:
case 0x34:
case 0x42:
case 0x43:
case 0x44:
matrix1 = new Matrix((matrix1._m11 * matrix2._m11)
+ (matrix1._m12 * matrix2._m21),
(matrix1._m11 * matrix2._m12)
+ (matrix1._m12 * matrix2._m22),
(matrix1._m21 * matrix2._m11)
+ (matrix1._m22 * matrix2._m21),
(matrix1._m21 * matrix2._m12)
+ (matrix1._m22 * matrix2._m22),
((matrix1._offsetX * matrix2._m11)
+ (matrix1._offsetY * matrix2._m21))
+ matrix2._offsetX,
((matrix1._offsetX * matrix2._m12)
+ (matrix1._offsetY * matrix2._m22))
+ matrix2._offsetY);
case 50:
matrix1._offsetX *= matrix2._m11;
matrix1._offsetY *= matrix2._m22;
case 0x33:
matrix1._offsetX = (matrix2._m11 * matrix1._offsetX) + matrix2._offsetX;
matrix1._offsetY = (matrix2._m22 * matrix1._offsetY) + matrix2._offsetY;
internal static Matrix CreateRotationRadians(double angle, double centerX, double centerY)
Matrix matrix = new Matrix();
double num = Math.Sin(angle);
double num2 = Math.Cos(angle);
double offsetX = (centerX * (1.0 - num2)) + (centerY * num);
double offsetY = (centerY * (1.0 - num2)) - (centerX * num);
matrix.SetMatrix(num2, num, -num, num2, offsetX, offsetY, MatrixTypes.TRANSFORM_IS_UNKNOWN);
return matrix;
public override Matrix get_Value()
base.ReadPreamble();
TransformCollection children = this.Children;
if ((children == null) || (children.Count == 0))
return new Matrix();
Matrix matrix = children.Internal_GetItem(0).Value;
for (int i = 1; i < children.Count; i++)
matrix *= children.Internal_GetItem(i).Value;
public abstract Matrix Value { get; }
internal virtual void MultiplyValueByMatrix(ref Matrix result, ref Matrix matrixToMultiplyBy)
result = this.Value;
MatrixUtil.MultiplyMatrix(ref result, ref matrixToMultiplyBy);
internal override void MultiplyValueByMatrix(ref Matrix result, ref Matrix matrixToMultiplyBy)
result = Matrix.Identity;
result._offsetX = this.X;
result._offsetY = this.Y;
result._type = MatrixTypes.TRANSFORM_IS_TRANSLATION;
result._m11 = this.ScaleX;
result._m22 = this.ScaleY;
double centerX = this.CenterX;
double centerY = this.CenterY;
result._type = MatrixTypes.TRANSFORM_IS_SCALING;
if ((centerX != 0.0) || (centerY != 0.0))
result._offsetX = centerX - (centerX * result._m11);
result._offsetY = centerY - (centerY * result._m22);
result._type |= MatrixTypes.TRANSFORM_IS_TRANSLATION;