2 changed files with 181 additions and 0 deletions
@ -0,0 +1,87 @@ |
|||||
|
// Portions of this source file are adapted from the WinUI project.
|
||||
|
// (https://github.com/microsoft/microsoft-ui-xaml)
|
||||
|
//
|
||||
|
// Licensed to The Avalonia Project under the MIT License.
|
||||
|
|
||||
|
using System.Numerics; |
||||
|
using Avalonia.Media; |
||||
|
|
||||
|
namespace Avalonia.Controls.Primitives |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Contains and allows modification of Hue, Saturation and Value channel values.
|
||||
|
/// </summary>
|
||||
|
/// <remarks>
|
||||
|
/// The is a specialized struct optimized for permanence and memory:
|
||||
|
/// <list type="bullet">
|
||||
|
/// <item>This is not a read-only struct like <see cref="HsvColor"/> and allows editing the fields</item>
|
||||
|
/// <item>Removes the alpha component unnecessary in core calculations</item>
|
||||
|
/// <item>No channel value bounds checks or clamping is done.</item>
|
||||
|
/// </list>
|
||||
|
/// </remarks>
|
||||
|
internal struct Hsv |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// The Hue channel value in the range from 0..359.
|
||||
|
/// </summary>
|
||||
|
public double H; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The Saturation channel value in the range from 0..1.
|
||||
|
/// </summary>
|
||||
|
public double S; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The Value channel value in the range from 0..1.
|
||||
|
/// </summary>
|
||||
|
public double V; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the <see cref="Hsv"/> struct.
|
||||
|
/// </summary>
|
||||
|
/// <param name="h">The Hue channel value in the range from 0..360.</param>
|
||||
|
/// <param name="s">The Saturation channel value in the range from 0..1.</param>
|
||||
|
/// <param name="v">The Value channel value in the range from 0..1.</param>
|
||||
|
public Hsv(double h, double s, double v) |
||||
|
{ |
||||
|
H = h; |
||||
|
S = s; |
||||
|
V = v; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the <see cref="Hsv"/> struct.
|
||||
|
/// </summary>
|
||||
|
/// <param name="hsvColor">An existing <see cref="HsvColor"/> to convert to <see cref="Hsv"/>.</param>
|
||||
|
public Hsv(HsvColor hsvColor) |
||||
|
{ |
||||
|
H = hsvColor.H; |
||||
|
S = hsvColor.S; |
||||
|
V = hsvColor.V; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Converts this <see cref="Hsv"/> struct into a standard <see cref="HsvColor"/>.
|
||||
|
/// </summary>
|
||||
|
/// <param name="alpha">The Alpha channel value in the range from 0..1.</param>
|
||||
|
/// <returns>A new <see cref="HsvColor"/> representing this <see cref="Hsv"/> struct.</returns>
|
||||
|
public HsvColor ToHsvColor(double alpha = 1.0) |
||||
|
{ |
||||
|
// Clamping is done automatically in the constructor
|
||||
|
return HsvColor.FromAhsv(alpha, H, S, V); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns the <see cref="Rgb"/> color model equivalent of this <see cref="Hsv"/> color.
|
||||
|
/// </summary>
|
||||
|
/// <returns>The <see cref="Rgb"/> equivalent color.</returns>
|
||||
|
public Rgb ToRgb() |
||||
|
{ |
||||
|
// Instantiating a Color is unfortunately necessary to use existing conversions
|
||||
|
// Clamping is done internally in the conversion method
|
||||
|
Color color = HsvColor.ToRgb(H, S, V); |
||||
|
|
||||
|
return new Rgb(color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,94 @@ |
|||||
|
// Portions of this source file are adapted from the WinUI project.
|
||||
|
// (https://github.com/microsoft/microsoft-ui-xaml)
|
||||
|
//
|
||||
|
// Licensed to The Avalonia Project under the MIT License.
|
||||
|
|
||||
|
using System; |
||||
|
using Avalonia.Media; |
||||
|
using Avalonia.Utilities; |
||||
|
|
||||
|
namespace Avalonia.Controls.Primitives |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Contains and allows modification of Red, Green and Blue channel values.
|
||||
|
/// </summary>
|
||||
|
/// <remarks>
|
||||
|
/// The is a specialized struct optimized for permanence and memory:
|
||||
|
/// <list type="bullet">
|
||||
|
/// <item>This is not a read-only struct like <see cref="Color"/> and allows editing the fields</item>
|
||||
|
/// <item>Removes the alpha component unnecessary in core calculations</item>
|
||||
|
/// <item>Normalizes RGB channel values in the range of 0..1 to simplify calculations.</item>
|
||||
|
/// <item>No channel value bounds checks or clamping is done.</item>
|
||||
|
/// </list>
|
||||
|
/// </remarks>
|
||||
|
internal struct Rgb |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// The Red channel value in the range from 0..1.
|
||||
|
/// </summary>
|
||||
|
public double R; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The Green channel value in the range from 0..1.
|
||||
|
/// </summary>
|
||||
|
public double G; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The Blue channel value in the range from 0..1.
|
||||
|
/// </summary>
|
||||
|
public double B; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the <see cref="Rgb"/> struct.
|
||||
|
/// </summary>
|
||||
|
/// <param name="r">The Red channel value in the range from 0..1.</param>
|
||||
|
/// <param name="g">The Green channel value in the range from 0..1.</param>
|
||||
|
/// <param name="b">The Blue channel value in the range from 0..1.</param>
|
||||
|
public Rgb(double r, double g, double b) |
||||
|
{ |
||||
|
R = r; |
||||
|
G = g; |
||||
|
B = b; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the <see cref="Rgb"/> struct.
|
||||
|
/// </summary>
|
||||
|
/// <param name="color">An existing <see cref="Color"/> to convert to <see cref="Rgb"/>.</param>
|
||||
|
public Rgb(Color color) |
||||
|
{ |
||||
|
R = color.R / 255.0; |
||||
|
G = color.G / 255.0; |
||||
|
B = color.B / 255.0; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Converts this <see cref="Rgb"/> struct into a standard <see cref="Color"/>.
|
||||
|
/// </summary>
|
||||
|
/// <param name="alpha">The Alpha channel value in the range from 0..1.</param>
|
||||
|
/// <returns>A new <see cref="Color"/> representing this <see cref="Rgb"/> struct.</returns>
|
||||
|
public Color ToColor(double alpha = 1.0) |
||||
|
{ |
||||
|
return Color.FromArgb( |
||||
|
(byte)MathUtilities.Clamp(alpha * 255.0, 0x00, 0xFF), |
||||
|
(byte)MathUtilities.Clamp(R * 255.0, 0x00, 0xFF), |
||||
|
(byte)MathUtilities.Clamp(G * 255.0, 0x00, 0xFF), |
||||
|
(byte)MathUtilities.Clamp(B * 255.0, 0x00, 0xFF)); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns the <see cref="Hsv"/> color model equivalent of this <see cref="Rgb"/> color.
|
||||
|
/// </summary>
|
||||
|
/// <returns>The <see cref="Hsv"/> equivalent color.</returns>
|
||||
|
public Hsv ToHsv() |
||||
|
{ |
||||
|
// Instantiating an HsvColor is unfortunately necessary to use existing conversions
|
||||
|
HsvColor hsvColor = HsvColor.FromRgb( |
||||
|
MathUtilities.Clamp(R, 0.0, 1.0), |
||||
|
MathUtilities.Clamp(G, 0.0, 1.0), |
||||
|
MathUtilities.Clamp(B, 0.0, 1.0)); |
||||
|
|
||||
|
return new Hsv(hsvColor); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue