public static HSLColour ToHSL(this HSVColour hsv)
        {
            if (hsv.S == ColourSpaceConstants.ZERO)
            {
                return(new HSLColour(hsv.H, hsv.V, hsv.V, hsv.A));
            }

            var s = 0;
            var l = 0;

            return(new HSLColour(hsv.H, s, l, hsv.A));
        }
        public static SRGBColour ToSRGB(this HSVColour hsv)
        {
            var r = new UnitColourComponent(ColourSpaceConstants.ZERO);
            var g = new UnitColourComponent(ColourSpaceConstants.ZERO);
            var b = new UnitColourComponent(ColourSpaceConstants.ZERO);

            // https://en.wikipedia.org/wiki/HSL_and_HSV#From_HSV
            // http://www.easyrgb.com/en/math.php

            if (hsv.S == ColourSpaceConstants.ZERO)
            {
                var vb = hsv.V.ToByteColour();
                return(new SRGBColour(vb, vb, vb, hsv.A.ToByteColour()));
            }

            // Calcs simplified from Wikipedia and verified to match calcs at EasyRGB
            var h_unit = hsv.H.Value / ColourSpaceConstants.SIXTY;

            while (h_unit >= ColourSpaceConstants.SIX)
            {
                h_unit -= ColourSpaceConstants.SIX;
            }
            var h_int = Math.Floor(h_unit);

            var v     = hsv.V.ToByteColour();
            var var_1 = ((UnitColourComponent)(hsv.V.Value * (ColourSpaceConstants.ONE - hsv.S.Value))).ToByteColour();                                 // 0 + m
            var var_2 = ((UnitColourComponent)(hsv.V.Value * (ColourSpaceConstants.ONE - hsv.S.Value * (h_unit - h_int)))).ToByteColour();              // m + X (1<=H<=2, 3<=H<=4, 5<=H<=6)
            var var_3 = ((UnitColourComponent)(hsv.V.Value * (ColourSpaceConstants.ONE - hsv.S.Value * (1 - (h_unit - h_int))))).ToByteColour();        // m + X (0<=H<=1, 2<=H<=3, 4<=H<=5)

            switch (h_int)
            {
            case 0: return(new SRGBColour(v, var_3, var_1, hsv.A.ToByteColour()));

            case 1: return(new SRGBColour(var_2, v, var_1, hsv.A.ToByteColour()));

            case 2: return(new SRGBColour(var_1, v, var_3, hsv.A.ToByteColour()));

            case 3: return(new SRGBColour(var_1, var_2, v, hsv.A.ToByteColour()));

            case 4: return(new SRGBColour(var_3, var_1, v, hsv.A.ToByteColour()));

            default: return(new SRGBColour(v, var_1, var_2, hsv.A.ToByteColour()));
            }
        }