Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions src/Graphics/src/Graphics/Color.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,15 @@ namespace Microsoft.Maui.Graphics
/// <summary>
/// Represents an RGBA color with floating-point components in the range of 0.0 to 1.0.
/// </summary>
/// <remarks>
/// <see cref="Color"/> is a sealed record type, so equality (via <see cref="Equals(Color?)"/>, <c>==</c>, and <c>!=</c>)
/// is always value-based, comparing the underlying ARGB representation regardless of how the instance was created.
/// Sealing prevents subclassing, which guarantees this value-based equality can never be silently broken by a derived type.
/// </remarks>
[DebuggerDisplay("Red={Red}, Green={Green}, Blue={Blue}, Alpha={Alpha}")]
[TypeConverter(typeof(Converters.ColorTypeConverter))]
[ImmutableObject(true)]
public record class Color
public sealed record class Color
Comment thread
Shalini-Ashokan marked this conversation as resolved.
{
/// <summary>
/// The red component of the color, ranging from 0.0 to 1.0.
Expand Down Expand Up @@ -119,7 +124,7 @@ public override string ToString()
/// <summary>
/// Determines whether the specified <see cref="Color"/> is equal to the current color using byte-precision comparison.
/// </summary>
public virtual bool Equals(Color? other)
public bool Equals(Color? other)
{
if (other is null)
return false;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
#nullable enable
Microsoft.Maui.Graphics.Color.Color(Microsoft.Maui.Graphics.Color! original) -> void
override Microsoft.Maui.Graphics.Color.Equals(object? obj) -> bool
static Microsoft.Maui.Graphics.Color.operator !=(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
static Microsoft.Maui.Graphics.Color.operator ==(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
virtual Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
virtual Microsoft.Maui.Graphics.Color.EqualityContract.get -> System.Type!
virtual Microsoft.Maui.Graphics.Color.PrintMembers(System.Text.StringBuilder! builder) -> bool
virtual Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
Microsoft.Maui.Graphics.Color.AddLuminosity(float delta) -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.ToArgbHex(bool includeAlpha = false) -> string!
Microsoft.Maui.Graphics.Color.ToRgbaHex(bool includeAlpha = false) -> string!
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
#nullable enable
Microsoft.Maui.Graphics.Color.Color(Microsoft.Maui.Graphics.Color! original) -> void
override Microsoft.Maui.Graphics.Color.Equals(object? obj) -> bool
static Microsoft.Maui.Graphics.Color.operator !=(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
static Microsoft.Maui.Graphics.Color.operator ==(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
virtual Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
virtual Microsoft.Maui.Graphics.Color.EqualityContract.get -> System.Type!
virtual Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
virtual Microsoft.Maui.Graphics.Color.PrintMembers(System.Text.StringBuilder! builder) -> bool
Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
Microsoft.Maui.Graphics.Color.AsPaint() -> Microsoft.Maui.Graphics.Paint!
Microsoft.Maui.Graphics.Color.MultiplyAlpha(float multiplyBy) -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.WithAlpha(float alpha) -> Microsoft.Maui.Graphics.Color!
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
#nullable enable
Microsoft.Maui.Graphics.Color.Color(Microsoft.Maui.Graphics.Color! original) -> void
override Microsoft.Maui.Graphics.Color.Equals(object? obj) -> bool
static Microsoft.Maui.Graphics.Color.operator !=(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
static Microsoft.Maui.Graphics.Color.operator ==(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
virtual Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
virtual Microsoft.Maui.Graphics.Color.EqualityContract.get -> System.Type!
virtual Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
virtual Microsoft.Maui.Graphics.Color.PrintMembers(System.Text.StringBuilder! builder) -> bool
Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
Microsoft.Maui.Graphics.Color.AsPaint() -> Microsoft.Maui.Graphics.Paint!
Microsoft.Maui.Graphics.Color.MultiplyAlpha(float multiplyBy) -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.WithAlpha(float alpha) -> Microsoft.Maui.Graphics.Color!
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
#nullable enable
Microsoft.Maui.Graphics.Color.Color(Microsoft.Maui.Graphics.Color! original) -> void
override Microsoft.Maui.Graphics.Color.Equals(object? obj) -> bool
static Microsoft.Maui.Graphics.Color.operator !=(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
static Microsoft.Maui.Graphics.Color.operator ==(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
virtual Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
virtual Microsoft.Maui.Graphics.Color.EqualityContract.get -> System.Type!
virtual Microsoft.Maui.Graphics.Color.PrintMembers(System.Text.StringBuilder! builder) -> bool
virtual Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
Microsoft.Maui.Graphics.Color.AddLuminosity(float delta) -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.GetComplementary() -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.ToArgbHex(bool includeAlpha = false) -> string!
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
#nullable enable
Microsoft.Maui.Graphics.Color.Color(Microsoft.Maui.Graphics.Color! original) -> void
override Microsoft.Maui.Graphics.Color.Equals(object? obj) -> bool
static Microsoft.Maui.Graphics.Color.operator !=(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
static Microsoft.Maui.Graphics.Color.operator ==(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
virtual Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
virtual Microsoft.Maui.Graphics.Color.EqualityContract.get -> System.Type!
virtual Microsoft.Maui.Graphics.Color.PrintMembers(System.Text.StringBuilder! builder) -> bool
virtual Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
Microsoft.Maui.Graphics.Color.AddLuminosity(float delta) -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.GetComplementary() -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.ToArgbHex(bool includeAlpha = false) -> string!
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
#nullable enable
Microsoft.Maui.Graphics.Color.Color(Microsoft.Maui.Graphics.Color! original) -> void
override Microsoft.Maui.Graphics.Color.Equals(object? obj) -> bool
static Microsoft.Maui.Graphics.Color.operator !=(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
static Microsoft.Maui.Graphics.Color.operator ==(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
virtual Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
virtual Microsoft.Maui.Graphics.Color.EqualityContract.get -> System.Type!
virtual Microsoft.Maui.Graphics.Color.PrintMembers(System.Text.StringBuilder! builder) -> bool
virtual Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
Microsoft.Maui.Graphics.Color.AddLuminosity(float delta) -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.GetComplementary() -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.ToArgbHex(bool includeAlpha = false) -> string!
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
#nullable enable
Microsoft.Maui.Graphics.Color.Color(Microsoft.Maui.Graphics.Color! original) -> void
override Microsoft.Maui.Graphics.Color.Equals(object? obj) -> bool
static Microsoft.Maui.Graphics.Color.operator !=(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
static Microsoft.Maui.Graphics.Color.operator ==(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
virtual Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
virtual Microsoft.Maui.Graphics.Color.EqualityContract.get -> System.Type!
virtual Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
virtual Microsoft.Maui.Graphics.Color.PrintMembers(System.Text.StringBuilder! builder) -> bool
Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
Microsoft.Maui.Graphics.Color.AsPaint() -> Microsoft.Maui.Graphics.Paint!
Microsoft.Maui.Graphics.Color.MultiplyAlpha(float multiplyBy) -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.WithAlpha(float alpha) -> Microsoft.Maui.Graphics.Color!
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
#nullable enable
Microsoft.Maui.Graphics.Color.Color(Microsoft.Maui.Graphics.Color! original) -> void
override Microsoft.Maui.Graphics.Color.Equals(object? obj) -> bool
static Microsoft.Maui.Graphics.Color.operator !=(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
static Microsoft.Maui.Graphics.Color.operator ==(Microsoft.Maui.Graphics.Color? left, Microsoft.Maui.Graphics.Color? right) -> bool
virtual Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
virtual Microsoft.Maui.Graphics.Color.EqualityContract.get -> System.Type!
virtual Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
virtual Microsoft.Maui.Graphics.Color.PrintMembers(System.Text.StringBuilder! builder) -> bool
Microsoft.Maui.Graphics.Color.<Clone>$() -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.Equals(Microsoft.Maui.Graphics.Color? other) -> bool
Microsoft.Maui.Graphics.Color.AsPaint() -> Microsoft.Maui.Graphics.Paint!
Microsoft.Maui.Graphics.Color.MultiplyAlpha(float multiplyBy) -> Microsoft.Maui.Graphics.Color!
Microsoft.Maui.Graphics.Color.WithAlpha(float alpha) -> Microsoft.Maui.Graphics.Color!
Expand Down
32 changes: 32 additions & 0 deletions src/Graphics/tests/Graphics.Tests/ColorUnitTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -468,5 +468,37 @@ public void TestParseAllBuiltInColors()
Assert.Equal(expected, actual);
}
}

[Fact]
public void ColorTypeIsSealed()
{
// Sealing Color guarantees every instance shares the same runtime type, so its
// record-generated equality (based on the ARGB value) can never be broken by a subclass.
Assert.True(typeof(Color).IsSealed);
}

[Fact]
public void EqualsIsValueBasedForSameArgbValue()
{
var color1 = new Color(1f, 0f, 0f, 1f);
var color2 = new Color(1f, 0f, 0f, 1f);

Assert.Equal(color1, color2);
Assert.True(color1 == color2);
Assert.True(color1.Equals(color2));
Assert.True(EqualityComparer<Color>.Default.Equals(color1, color2));
Assert.Equal(color1.GetHashCode(), color2.GetHashCode());
}

[Fact]
public void EqualsIsFalseForDifferentArgbValue()
{
var color1 = new Color(1f, 0f, 0f, 1f);
var color2 = new Color(0f, 1f, 0f, 1f);

Assert.NotEqual(color1, color2);
Assert.True(color1 != color2);
Assert.False(color1.Equals(color2));
}
}
}
Loading