using System;
using HPPH;
using RGB.NET.Core;
using RGB.NET.Presets.Extensions;
namespace RGB.NET.Presets.Textures;
///
///
/// Represents a texture drawing an .
///
public sealed class ImageTexture : ITexture
{
#region Properties & Fields
private IImage _image;
///
/// The image drawn by this texture.
///
public IImage Image
{
get => _image;
set
{
ArgumentNullException.ThrowIfNull(value);
_image = value;
}
}
///
public Size Size { get; }
///
public Color this[Point point]
{
get
{
int x = (int)MathF.Round((Size.Width - 1) * point.X.Clamp(0, 1));
int y = (int)MathF.Round((Size.Height - 1) * point.Y.Clamp(0, 1));
return Image[x, y].ToColor();
}
}
///
public Color this[Rectangle rectangle]
{
get
{
int x = (int)MathF.Round((Size.Width - 1) * rectangle.Location.X.Clamp(0, 1));
int y = (int)MathF.Round((Size.Height - 1) * rectangle.Location.Y.Clamp(0, 1));
int width = (int)MathF.Round(Size.Width * rectangle.Size.Width.Clamp(0, 1));
int height = (int)MathF.Round(Size.Height * rectangle.Size.Height.Clamp(0, 1));
if ((width == 0) && (rectangle.Size.Width > 0)) width = 1;
if ((height == 0) && (rectangle.Size.Height > 0)) height = 1;
return this[x, y, width, height];
}
}
///
/// Gets the sampled color inside the specified region.
///
/// The x-location of the region.
/// The y-location of the region.
/// The with of the region.
/// The height of the region.
/// The sampled color.
public Color this[int x, int y, int width, int height] => Image[x, y, width, height].Average().ToColor();
#endregion
#region Constructors
///
/// Initializes a new instance of the class.
///
/// The image represented by the texture.
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
public ImageTexture(IImage image)
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
{
this.Image = image;
Size = new Size(image.Width, image.Height);
}
#endregion
}