/// <summary>
        /// Translates the specified <see cref='Color'/> to an Ole color.
        /// </summary>
        public static int ToOle(Color c)
        {
            //    WARNING!!! WARNING!!! WARNING!!! WARNING!!!
            //    WARNING!!! WARNING!!! WARNING!!! WARNING!!!
            //    We must never have another method called ToOle() with a different signature.
            //    This is so that we can push into the runtime a custom marshaller for OLE_COLOR to Color.

            if (ColorUtil.GetIsKnownColor(c))
            {
                switch (c.ToKnownColor())
                {
                case KnownColor.ActiveBorder:
                    return(unchecked ((int)0x8000000A));

                case KnownColor.ActiveCaption:
                    return(unchecked ((int)0x80000002));

                case KnownColor.ActiveCaptionText:
                    return(unchecked ((int)0x80000009));

                case KnownColor.AppWorkspace:
                    return(unchecked ((int)0x8000000C));

                case KnownColor.ButtonFace:
                    return(unchecked ((int)0x8000000F));

                case KnownColor.ButtonHighlight:
                    return(unchecked ((int)0x80000014));

                case KnownColor.ButtonShadow:
                    return(unchecked ((int)0x80000010));

                case KnownColor.Control:
                    return(unchecked ((int)0x8000000F));

                case KnownColor.ControlDark:
                    return(unchecked ((int)0x80000010));

                case KnownColor.ControlDarkDark:
                    return(unchecked ((int)0x80000015));

                case KnownColor.ControlLight:
                    return(unchecked ((int)0x80000016));

                case KnownColor.ControlLightLight:
                    return(unchecked ((int)0x80000014));

                case KnownColor.ControlText:
                    return(unchecked ((int)0x80000012));

                case KnownColor.Desktop:
                    return(unchecked ((int)0x80000001));

                case KnownColor.GradientActiveCaption:
                    return(unchecked ((int)0x8000001B));

                case KnownColor.GradientInactiveCaption:
                    return(unchecked ((int)0x8000001C));

                case KnownColor.GrayText:
                    return(unchecked ((int)0x80000011));

                case KnownColor.Highlight:
                    return(unchecked ((int)0x8000000D));

                case KnownColor.HighlightText:
                    return(unchecked ((int)0x8000000E));

                case KnownColor.HotTrack:
                    return(unchecked ((int)0x8000001A));

                case KnownColor.InactiveBorder:
                    return(unchecked ((int)0x8000000B));

                case KnownColor.InactiveCaption:
                    return(unchecked ((int)0x80000003));

                case KnownColor.InactiveCaptionText:
                    return(unchecked ((int)0x80000013));

                case KnownColor.Info:
                    return(unchecked ((int)0x80000018));

                case KnownColor.InfoText:
                    return(unchecked ((int)0x80000017));

                case KnownColor.Menu:
                    return(unchecked ((int)0x80000004));

                case KnownColor.MenuBar:
                    return(unchecked ((int)0x8000001E));

                case KnownColor.MenuHighlight:
                    return(unchecked ((int)0x8000001D));

                case KnownColor.MenuText:
                    return(unchecked ((int)0x80000007));

                case KnownColor.ScrollBar:
                    return(unchecked ((int)0x80000000));

                case KnownColor.Window:
                    return(unchecked ((int)0x80000005));

                case KnownColor.WindowFrame:
                    return(unchecked ((int)0x80000006));

                case KnownColor.WindowText:
                    return(unchecked ((int)0x80000008));
                }
            }

            return(ToWin32(c));
        }
        /// <summary>
        /// Translates the specified <see cref='Color'/> to an Html string color representation.
        /// </summary>
        public static string ToHtml(Color c)
        {
            string colorString = string.Empty;

            if (c.IsEmpty)
            {
                return(colorString);
            }

            if (ColorUtil.IsSystemColor(c))
            {
                switch (c.ToKnownColor())
                {
                case KnownColor.ActiveBorder:
                    colorString = "activeborder";
                    break;

                case KnownColor.GradientActiveCaption:
                case KnownColor.ActiveCaption:
                    colorString = "activecaption";
                    break;

                case KnownColor.AppWorkspace:
                    colorString = "appworkspace";
                    break;

                case KnownColor.Desktop:
                    colorString = "background";
                    break;

                case KnownColor.Control:
                    colorString = "buttonface";
                    break;

                case KnownColor.ControlLight:
                    colorString = "buttonface";
                    break;

                case KnownColor.ControlDark:
                    colorString = "buttonshadow";
                    break;

                case KnownColor.ControlText:
                    colorString = "buttontext";
                    break;

                case KnownColor.ActiveCaptionText:
                    colorString = "captiontext";
                    break;

                case KnownColor.GrayText:
                    colorString = "graytext";
                    break;

                case KnownColor.HotTrack:
                case KnownColor.Highlight:
                    colorString = "highlight";
                    break;

                case KnownColor.MenuHighlight:
                case KnownColor.HighlightText:
                    colorString = "highlighttext";
                    break;

                case KnownColor.InactiveBorder:
                    colorString = "inactiveborder";
                    break;

                case KnownColor.GradientInactiveCaption:
                case KnownColor.InactiveCaption:
                    colorString = "inactivecaption";
                    break;

                case KnownColor.InactiveCaptionText:
                    colorString = "inactivecaptiontext";
                    break;

                case KnownColor.Info:
                    colorString = "infobackground";
                    break;

                case KnownColor.InfoText:
                    colorString = "infotext";
                    break;

                case KnownColor.MenuBar:
                case KnownColor.Menu:
                    colorString = "menu";
                    break;

                case KnownColor.MenuText:
                    colorString = "menutext";
                    break;

                case KnownColor.ScrollBar:
                    colorString = "scrollbar";
                    break;

                case KnownColor.ControlDarkDark:
                    colorString = "threeddarkshadow";
                    break;

                case KnownColor.ControlLightLight:
                    colorString = "buttonhighlight";
                    break;

                case KnownColor.Window:
                    colorString = "window";
                    break;

                case KnownColor.WindowFrame:
                    colorString = "windowframe";
                    break;

                case KnownColor.WindowText:
                    colorString = "windowtext";
                    break;
                }
            }
            else if (c.IsNamedColor)
            {
                if (c == Color.LightGray)
                {
                    // special case due to mismatch between Html and enum spelling
                    colorString = "LightGrey";
                }
                else
                {
                    colorString = c.Name;
                }
            }
            else
            {
                colorString = "#" + c.R.ToString("X2", null) +
                              c.G.ToString("X2", null) +
                              c.B.ToString("X2", null);
            }

            return(colorString);
        }
        /// <summary>
        /// Translates an Ole color value to a GDI+ <see cref='Color'/>.
        /// </summary>
        public static Color FromOle(int oleColor)
        {
            //    WARNING!!! WARNING!!! WARNING!!! WARNING!!!
            //    WARNING!!! WARNING!!! WARNING!!! WARNING!!!
            //    We must never have another method called ToOle() with a different signature.
            //    This is so that we can push into the runtime a custom marshaller for OLE_COLOR to Color.

            switch (oleColor)
            {
            case unchecked ((int)0x8000000A):
                return(ColorUtil.FromKnownColor(KnownColor.ActiveBorder));

            case unchecked ((int)0x80000002):
                return(ColorUtil.FromKnownColor(KnownColor.ActiveCaption));

            case unchecked ((int)0x80000009):
                return(ColorUtil.FromKnownColor(KnownColor.ActiveCaptionText));

            case unchecked ((int)0x8000000C):
                return(ColorUtil.FromKnownColor(KnownColor.AppWorkspace));

            case unchecked ((int)0x8000000F):
                return(ColorUtil.FromKnownColor(KnownColor.Control));

            case unchecked ((int)0x80000010):
                return(ColorUtil.FromKnownColor(KnownColor.ControlDark));

            case unchecked ((int)0x80000015):
                return(ColorUtil.FromKnownColor(KnownColor.ControlDarkDark));

            case unchecked ((int)0x80000016):
                return(ColorUtil.FromKnownColor(KnownColor.ControlLight));

            case unchecked ((int)0x80000014):
                return(ColorUtil.FromKnownColor(KnownColor.ControlLightLight));

            case unchecked ((int)0x80000012):
                return(ColorUtil.FromKnownColor(KnownColor.ControlText));

            case unchecked ((int)0x80000001):
                return(ColorUtil.FromKnownColor(KnownColor.Desktop));

            case unchecked ((int)0x8000001B):
                return(ColorUtil.FromKnownColor(KnownColor.GradientActiveCaption));

            case unchecked ((int)0x8000001C):
                return(ColorUtil.FromKnownColor(KnownColor.GradientInactiveCaption));

            case unchecked ((int)0x80000011):
                return(ColorUtil.FromKnownColor(KnownColor.GrayText));

            case unchecked ((int)0x8000000D):
                return(ColorUtil.FromKnownColor(KnownColor.Highlight));

            case unchecked ((int)0x8000000E):
                return(ColorUtil.FromKnownColor(KnownColor.HighlightText));

            case unchecked ((int)0x8000001A):
                return(ColorUtil.FromKnownColor(KnownColor.HotTrack));

            case unchecked ((int)0x8000000B):
                return(ColorUtil.FromKnownColor(KnownColor.InactiveBorder));

            case unchecked ((int)0x80000003):
                return(ColorUtil.FromKnownColor(KnownColor.InactiveCaption));

            case unchecked ((int)0x80000013):
                return(ColorUtil.FromKnownColor(KnownColor.InactiveCaptionText));

            case unchecked ((int)0x80000018):
                return(ColorUtil.FromKnownColor(KnownColor.Info));

            case unchecked ((int)0x80000017):
                return(ColorUtil.FromKnownColor(KnownColor.InfoText));

            case unchecked ((int)0x80000004):
                return(ColorUtil.FromKnownColor(KnownColor.Menu));

            case unchecked ((int)0x8000001E):
                return(ColorUtil.FromKnownColor(KnownColor.MenuBar));

            case unchecked ((int)0x8000001D):
                return(ColorUtil.FromKnownColor(KnownColor.MenuHighlight));

            case unchecked ((int)0x80000007):
                return(ColorUtil.FromKnownColor(KnownColor.MenuText));

            case unchecked ((int)0x80000000):
                return(ColorUtil.FromKnownColor(KnownColor.ScrollBar));

            case unchecked ((int)0x80000005):
                return(ColorUtil.FromKnownColor(KnownColor.Window));

            case unchecked ((int)0x80000006):
                return(ColorUtil.FromKnownColor(KnownColor.WindowFrame));

            case unchecked ((int)0x80000008):
                return(ColorUtil.FromKnownColor(KnownColor.WindowText));
            }

            Color color = Color.FromArgb((byte)((oleColor >> Win32RedShift) & 0xFF),
                                         (byte)((oleColor >> Win32GreenShift) & 0xFF),
                                         (byte)((oleColor >> Win32BlueShift) & 0xFF));

            return(KnownColorTable.ArgbToKnownColor(color.ToArgb()));
        }