mirror of https://github.com/SixLabors/ImageSharp
18 changed files with 1470 additions and 49 deletions
@ -0,0 +1,210 @@ |
|||
// <copyright file="Ellipse.cs" company="Six Labors">
|
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
// </copyright>
|
|||
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Numerics; |
|||
|
|||
namespace SixLabors.Primitives |
|||
{ |
|||
internal struct ApproximateFloatComparer |
|||
: IEqualityComparer<float>, |
|||
IEqualityComparer<Vector4>, |
|||
IEqualityComparer<Vector2>, |
|||
IEqualityComparer<Vector3>, |
|||
IEqualityComparer<Matrix3x2>, |
|||
IEqualityComparer<Matrix4x4>, |
|||
IEqualityComparer<PointF> |
|||
|
|||
{ |
|||
private readonly float tolerance; |
|||
const float defaultTolerance = 1e-5f; |
|||
|
|||
public ApproximateFloatComparer(float tolerance = defaultTolerance) |
|||
{ |
|||
this.tolerance = tolerance; |
|||
} |
|||
|
|||
public static bool Equal(float x, float y, float tolerance) |
|||
{ |
|||
float d = x - y; |
|||
|
|||
return d > -tolerance && d < tolerance; |
|||
} |
|||
|
|||
public static bool Equal(float x, float y) |
|||
{ |
|||
return Equal(x, y, defaultTolerance); |
|||
} |
|||
|
|||
public bool Equals(float x, float y) |
|||
{ |
|||
return Equal(x, y, this.tolerance); |
|||
} |
|||
|
|||
public int GetHashCode(float obj) |
|||
{ |
|||
var diff = obj % this.tolerance;// how different from tollerance are we?
|
|||
return (obj - diff).GetHashCode(); |
|||
} |
|||
|
|||
public bool Equals(Vector4 a, Vector4 b) |
|||
{ |
|||
return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y) && this.Equals(a.Z, b.Z) && this.Equals(a.W, b.W); |
|||
} |
|||
|
|||
public int GetHashCode(Vector4 obj) |
|||
{ |
|||
int hash = GetHashCode(obj.X); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.Z)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.W)); |
|||
return hash; |
|||
} |
|||
|
|||
public bool Equals(Vector2 a, Vector2 b) |
|||
{ |
|||
return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y); |
|||
} |
|||
|
|||
public int GetHashCode(Vector2 obj) |
|||
{ |
|||
int hash = GetHashCode(obj.X); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); |
|||
return hash; |
|||
} |
|||
|
|||
public bool Equals(Vector3 a, Vector3 b) |
|||
{ |
|||
return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y) && this.Equals(a.Z, b.Z); |
|||
} |
|||
|
|||
public int GetHashCode(Vector3 obj) |
|||
{ |
|||
int hash = GetHashCode(obj.X); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.Z)); |
|||
return hash; |
|||
} |
|||
|
|||
public static bool Equal(Matrix3x2 a, Matrix3x2 b, float tolerance) |
|||
{ |
|||
return Equal(a.M11, b.M11, tolerance) && |
|||
Equal(a.M12, b.M12, tolerance) && |
|||
Equal(a.M21, b.M21, tolerance) && |
|||
Equal(a.M22, b.M22, tolerance) && |
|||
Equal(a.M31, b.M31, tolerance) && |
|||
Equal(a.M32, b.M32, tolerance); |
|||
} |
|||
|
|||
public static bool Equal(Matrix3x2 a, Matrix3x2 b) |
|||
{ |
|||
return Equal(a, b, defaultTolerance); |
|||
} |
|||
|
|||
public bool Equals(Matrix3x2 a, Matrix3x2 b) |
|||
{ |
|||
return Equal(a, b, this.tolerance); |
|||
} |
|||
|
|||
public int GetHashCode(Matrix3x2 obj) |
|||
{ |
|||
int hash = GetHashCode(obj.M11); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M11)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M12)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M21)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M22)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M31)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M32)); |
|||
return hash; |
|||
} |
|||
|
|||
|
|||
public static bool Equal(Matrix4x4 a, Matrix4x4 b, float tolerance) |
|||
{ |
|||
return |
|||
Equal(a.M11, b.M11, tolerance) && |
|||
Equal(a.M12, b.M12, tolerance) && |
|||
Equal(a.M13, b.M13, tolerance) && |
|||
Equal(a.M14, b.M14, tolerance) && |
|||
|
|||
Equal(a.M21, b.M21, tolerance) && |
|||
Equal(a.M22, b.M22, tolerance) && |
|||
Equal(a.M23, b.M23, tolerance) && |
|||
Equal(a.M24, b.M24, tolerance) && |
|||
|
|||
Equal(a.M31, b.M31, tolerance) && |
|||
Equal(a.M32, b.M32, tolerance) && |
|||
Equal(a.M33, b.M33, tolerance) && |
|||
Equal(a.M34, b.M34, tolerance) && |
|||
|
|||
Equal(a.M41, b.M41, tolerance) && |
|||
Equal(a.M42, b.M42, tolerance) && |
|||
Equal(a.M43, b.M43, tolerance) && |
|||
Equal(a.M44, b.M44, tolerance); |
|||
} |
|||
|
|||
public static bool Equal(Matrix4x4 a, Matrix4x4 b) |
|||
{ |
|||
return Equal(a, b, defaultTolerance); |
|||
} |
|||
|
|||
public bool Equals(Matrix4x4 a, Matrix4x4 b) |
|||
{ |
|||
return Equal(a, b, this.tolerance); |
|||
} |
|||
|
|||
|
|||
public int GetHashCode(Matrix4x4 obj) |
|||
{ |
|||
int hash = GetHashCode(obj.M11); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M12)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M13)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M14)); |
|||
|
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M21)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M22)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M23)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M24)); |
|||
|
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M31)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M32)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M33)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M34)); |
|||
|
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M41)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M42)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M43)); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.M44)); |
|||
return hash; |
|||
} |
|||
|
|||
|
|||
public static bool Equal(PointF a, PointF b, float tolerance) |
|||
{ |
|||
return |
|||
Equal(a.X, b.X, tolerance) && |
|||
Equal(a.Y, b.Y, tolerance); |
|||
} |
|||
|
|||
public static bool Equal(PointF a, PointF b) |
|||
{ |
|||
return Equal(a, b, defaultTolerance); |
|||
} |
|||
|
|||
public bool Equals(PointF a, PointF b) |
|||
{ |
|||
return Equal(a, b, this.tolerance); |
|||
} |
|||
|
|||
|
|||
public int GetHashCode(PointF obj) |
|||
{ |
|||
int hash = GetHashCode(obj.X); |
|||
hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); |
|||
return hash; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Text; |
|||
|
|||
namespace SixLabors.Primitives |
|||
{ |
|||
// lifted from coreFX repo
|
|||
internal static class HashHelpers |
|||
{ |
|||
public static readonly int RandomSeed = Guid.NewGuid().GetHashCode(); |
|||
|
|||
public static int Combine(int h1, int h2) |
|||
{ |
|||
unchecked |
|||
{ |
|||
// RyuJIT optimizes this to use the ROL instruction
|
|||
// Related GitHub pull request: dotnet/coreclr#1830
|
|||
uint rol5 = ((uint)h1 << 5) | ((uint)h1 >> 27); |
|||
return ((int)rol5 + h1) ^ h2; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1 @@ |
|||
/OpenCover.4.6.519 |
|||
File diff suppressed because it is too large
Loading…
Reference in new issue