in src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs [1579:1699]
private void UpdateBitmapSources()
{
if (_spectrumOverlayRectangle == null ||
_spectrumOverlayEllipse == null ||
_spectrumRectangle == null ||
_spectrumEllipse == null)
{
return;
}
HsvColor hsvColor = HsvColor;
ColorSpectrumComponents components = Components;
// We'll set the base image and the overlay image based on which component is our third dimension.
// If it's saturation or luminosity, then the base image is that dimension at its minimum value,
// while the overlay image is that dimension at its maximum value.
// If it's hue, then we'll figure out where in the color wheel we are, and then use the two
// colors on either side of our position as our base image and overlay image.
// For example, if our hue is orange, then the base image would be red and the overlay image yellow.
switch (components)
{
case ColorSpectrumComponents.HueValue:
case ColorSpectrumComponents.ValueHue:
{
if (_saturationMinimumBitmap == null ||
_saturationMaximumBitmap == null)
{
return;
}
ImageBrush spectrumBrush = new ImageBrush(_saturationMinimumBitmap);
ImageBrush spectrumOverlayBrush = new ImageBrush(_saturationMaximumBitmap);
_spectrumOverlayRectangle.Opacity = hsvColor.S;
_spectrumOverlayEllipse.Opacity = hsvColor.S;
_spectrumRectangle.Fill = spectrumBrush;
_spectrumEllipse.Fill = spectrumBrush;
_spectrumOverlayRectangle.Fill = spectrumOverlayBrush;
_spectrumOverlayRectangle.Fill = spectrumOverlayBrush;
}
break;
case ColorSpectrumComponents.HueSaturation:
case ColorSpectrumComponents.SaturationHue:
{
if (_valueBitmap == null)
{
return;
}
ImageBrush spectrumBrush = new ImageBrush(_valueBitmap);
ImageBrush spectrumOverlayBrush = new ImageBrush(_valueBitmap);
_spectrumOverlayRectangle.Opacity = 1.0;
_spectrumOverlayEllipse.Opacity = 1.0;
_spectrumRectangle.Fill = spectrumBrush;
_spectrumEllipse.Fill = spectrumBrush;
_spectrumOverlayRectangle.Fill = spectrumOverlayBrush;
_spectrumOverlayRectangle.Fill = spectrumOverlayBrush;
}
break;
case ColorSpectrumComponents.ValueSaturation:
case ColorSpectrumComponents.SaturationValue:
{
if (_hueRedBitmap == null ||
_hueYellowBitmap == null ||
_hueGreenBitmap == null ||
_hueCyanBitmap == null ||
_hueBlueBitmap == null ||
_huePurpleBitmap == null)
{
return;
}
ImageBrush spectrumBrush;
ImageBrush spectrumOverlayBrush;
double sextant = hsvColor.H / 60.0;
if (sextant < 1)
{
spectrumBrush = new ImageBrush(_hueRedBitmap);
spectrumOverlayBrush = new ImageBrush(_hueYellowBitmap);
}
else if (sextant >= 1 && sextant < 2)
{
spectrumBrush = new ImageBrush(_hueYellowBitmap);
spectrumOverlayBrush = new ImageBrush(_hueGreenBitmap);
}
else if (sextant >= 2 && sextant < 3)
{
spectrumBrush = new ImageBrush(_hueGreenBitmap);
spectrumOverlayBrush = new ImageBrush(_hueCyanBitmap);
}
else if (sextant >= 3 && sextant < 4)
{
spectrumBrush = new ImageBrush(_hueCyanBitmap);
spectrumOverlayBrush = new ImageBrush(_hueBlueBitmap);
}
else if (sextant >= 4 && sextant < 5)
{
spectrumBrush = new ImageBrush(_hueBlueBitmap);
spectrumOverlayBrush = new ImageBrush(_huePurpleBitmap);
}
else
{
spectrumBrush = new ImageBrush(_huePurpleBitmap);
spectrumOverlayBrush = new ImageBrush(_hueRedBitmap);
}
_spectrumOverlayRectangle.Opacity = sextant - (int)sextant;
_spectrumOverlayEllipse.Opacity = sextant - (int)sextant;
_spectrumRectangle.Fill = spectrumBrush;
_spectrumEllipse.Fill = spectrumBrush;
_spectrumOverlayRectangle.Fill = spectrumOverlayBrush;
_spectrumOverlayRectangle.Fill = spectrumOverlayBrush;
}
break;
}
}