using CPF.Mac.CoreGraphics;
using System.Runtime.InteropServices;

namespace CPF.Mac.CoreAnimation
{
	public struct CATransform3D
	{
		public float m11;

		public float m12;

		public float m13;

		public float m14;

		public float m21;

		public float m22;

		public float m23;

		public float m24;

		public float m31;

		public float m32;

		public float m33;

		public float m34;

		public float m41;

		public float m42;

		public float m43;

		public float m44;

		public static readonly CATransform3D Identity;

		public bool IsIdentity => CATransform3DIsIdentity(this) != 0;

		public bool IsAffine => CATransform3DIsAffine(this);

		static CATransform3D()
		{
			Identity = default(CATransform3D);
			Identity.m11 = 1f;
			Identity.m22 = 1f;
			Identity.m33 = 1f;
			Identity.m44 = 1f;
		}

		[DllImport("/System/Library/Frameworks/QuartzCore.framework/QuartzCore")]
		private static extern int CATransform3DIsIdentity(CATransform3D t);

		[DllImport("/System/Library/Frameworks/QuartzCore.framework/QuartzCore")]
		private static extern int CATransform3DEqualToTransform(CATransform3D a, CATransform3D b);

		public bool Equals(CATransform3D other)
		{
			return CATransform3DEqualToTransform(this, other) != 0;
		}

		public override bool Equals(object other)
		{
			if (!(other is CATransform3D))
			{
				return false;
			}
			return CATransform3DEqualToTransform(this, (CATransform3D)other) != 0;
		}

		public unsafe override int GetHashCode()
		{
			int num = (int)m11;
			fixed (float* ptr = &m11)
			{
				int* ptr2 = (int*)ptr;
				for (int i = 1; i < 16; i++)
				{
					num ^= ptr2[i];
				}
			}
			return num;
		}

		public static CATransform3D MakeTranslation(float tx, float ty, float tz)
		{
			CATransform3D identity = Identity;
			identity.m41 = tx;
			identity.m42 = ty;
			identity.m43 = tz;
			return identity;
		}

		public static CATransform3D MakeScale(float sx, float sy, float sz)
		{
			CATransform3D identity = Identity;
			identity.m11 = sx;
			identity.m22 = sy;
			identity.m33 = sz;
			return identity;
		}

		[DllImport("/System/Library/Frameworks/QuartzCore.framework/QuartzCore", EntryPoint = "CATransform3DMakeRotation")]
		public static extern CATransform3D MakeRotation(float angle, float x, float y, float z);

		[DllImport("/System/Library/Frameworks/QuartzCore.framework/QuartzCore")]
		private static extern CATransform3D CATransform3DTranslate(CATransform3D t, float tx, float ty, float tz);

		public CATransform3D Translate(float tx, float ty, float tz)
		{
			return CATransform3DTranslate(this, tx, ty, tz);
		}

		[DllImport("/System/Library/Frameworks/QuartzCore.framework/QuartzCore")]
		private static extern CATransform3D CATransform3DScale(CATransform3D t, float sx, float sy, float sz);

		public CATransform3D Scale(float sx, float sy, float sz)
		{
			return CATransform3DScale(this, sx, sy, sz);
		}

		public CATransform3D Scale(float s)
		{
			return CATransform3DScale(this, s, s, s);
		}

		[DllImport("/System/Library/Frameworks/QuartzCore.framework/QuartzCore")]
		private static extern CATransform3D CATransform3DRotate(CATransform3D t, float angle, float x, float y, float z);

		public CATransform3D Rotate(float angle, float x, float y, float z)
		{
			return CATransform3DRotate(this, angle, x, y, z);
		}

		[DllImport("/System/Library/Frameworks/QuartzCore.framework/QuartzCore")]
		private static extern CATransform3D CATransform3DConcat(CATransform3D a, CATransform3D b);

		public CATransform3D Concat(CATransform3D b)
		{
			return CATransform3DConcat(this, b);
		}

		[DllImport("/System/Library/Frameworks/QuartzCore.framework/QuartzCore")]
		private static extern CATransform3D CATransform3DInvert(CATransform3D t);

		public CATransform3D Invert(CATransform3D t)
		{
			return CATransform3DInvert(this);
		}

		[DllImport("/System/Library/Frameworks/QuartzCore.framework/QuartzCore", EntryPoint = "CATransform3DMakeAffineTransform")]
		public static extern CATransform3D MakeFromAffine(CGAffineTransform m);

		[DllImport("/System/Library/Frameworks/QuartzCore.framework/QuartzCore")]
		private static extern bool CATransform3DIsAffine(CATransform3D t);

		[DllImport("/System/Library/Frameworks/QuartzCore.framework/QuartzCore", EntryPoint = "CATransform3DGetAffineTransform")]
		public static extern CGAffineTransform GetAffine(CATransform3D t);

		public override string ToString()
		{
			return $"[{m11} {m12} {m13} {m14}; {m21} {m22} {m23} {m24}; {m31} {m32} {m33} {m34}; {m41} {m42} {m43} {m44}]";
		}
	}
}
