Esempio n. 1
0
        /// <summary>
        /// Raised when the <see cref="Color"/> property is modified.
        /// </summary>
        private void OnColorChanged()
        {
            bool isInitializing = !templateApplied && initializingProperty == null;

            if (isInitializing)
            {
                initializingProperty = ColorProperty;
            }

            if (!interlock)
            {
                InternalColor = ColorHSV.FromColor(Color);
                var colorRGBA = InternalColor.ToColor();
                interlock = true;

                SetCurrentValue(RedProperty, (byte)(Math.Round(colorRGBA.R * 255.0f)));
                SetCurrentValue(GreenProperty, (byte)(Math.Round(colorRGBA.G * 255.0f)));
                SetCurrentValue(BlueProperty, (byte)(Math.Round(colorRGBA.B * 255.0f)));
                SetCurrentValue(AlphaProperty, (byte)(Math.Round(colorRGBA.A * 255.0f)));

                SetCurrentValue(HueProperty, InternalColor.H);
                SetCurrentValue(SaturationProperty, InternalColor.S * 100.0f);
                SetCurrentValue(BrightnessProperty, InternalColor.V * 100.0f);
                interlock = false;
            }

            if (!suspendBindingUpdates)
            {
                RenderColorPickerSurface();
            }
            else if (colorPreviewRenderSurface != null)
            {
                colorPreviewRenderSurface.Fill = new SolidColorBrush(Color.ToSystemColor());
            }
            UpdateBinding(ColorProperty);

            if (isInitializing)
            {
                initializingProperty = null;
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Update the color surface brush according to the current <see cref="Hue"/> value.
        /// </summary>
        private void RenderColorPickerSurface()
        {
            if (colorPreviewRenderSurface != null)
            {
                colorPreviewRenderSurface.Fill = new SolidColorBrush(Color.ToSystemColor());
            }
            if (colorPickerRenderSurface != null)
            {
                // Ensure the color picker is loaded
                if (!double.IsNaN(colorPickerRenderSurface.Width) && !double.IsNaN(colorPickerRenderSurface.Height))
                {
                    var width  = (int)colorPickerRenderSurface.Width;
                    var height = (int)colorPickerRenderSurface.Height;

                    PixelFormat pf        = PixelFormats.Bgr32;
                    int         rawStride = (width * pf.BitsPerPixel + 7) / 8;
                    var         rawImage  = new byte[rawStride * height];

                    for (int j = 0; j < height; ++j)
                    {
                        float y = j / (float)(height - 1);

                        for (int i = 0; i < width; ++i)
                        {
                            float x = i / (float)(width - 1);

                            var color4 = new ColorHSV(Hue, x, y, 1.0f).ToColor();
                            var color  = new Color(color4);
                            rawImage[(i + j * width) * 4 + 0] = color.B;
                            rawImage[(i + j * width) * 4 + 1] = color.G;
                            rawImage[(i + j * width) * 4 + 2] = color.R;
                        }
                    }

                    colorPickerRenderSurface.Fill = new DrawingBrush(new ImageDrawing(BitmapSource.Create(width, height, 96, 96, pf, null, rawImage, rawStride), new Rect(0.0f, 0.0f, width, height)));
                }
            }
        }
Esempio n. 3
0
        /// <inheritdoc/>
        public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var brush = value as SolidColorBrush;

            if (brush != null)
            {
                value = brush.Color;
            }

            if (value is Color)
            {
                var color = (Color)value;
                if (targetType == typeof(System.Windows.Media.Color))
                {
                    return(color.ToSystemColor());
                }
                if (targetType == typeof(Color))
                {
                    return(color);
                }
                if (targetType == typeof(Color3))
                {
                    return(color.ToColor3());
                }
                if (targetType == typeof(Color4))
                {
                    return(color.ToColor4());
                }
                if (targetType.IsAssignableFrom(typeof(SolidColorBrush)))
                {
                    return(new SolidColorBrush(color.ToSystemColor()));
                }
                if (targetType == typeof(string))
                {
                    return(ColorExtensions.RgbaToString(color.ToRgba()));
                }
            }
            if (value is Color3)
            {
                var color = (Color3)value;
                if (targetType == typeof(System.Windows.Media.Color))
                {
                    return(color.ToSystemColor());
                }
                if (targetType == typeof(Color))
                {
                    return((Color)color);
                }
                if (targetType == typeof(Color3))
                {
                    return(color);
                }
                if (targetType == typeof(Color4))
                {
                    return(color.ToColor4());
                }
                if (targetType.IsAssignableFrom(typeof(SolidColorBrush)))
                {
                    return(new SolidColorBrush(color.ToSystemColor()));
                }
                if (targetType == typeof(string))
                {
                    return(ColorExtensions.RgbToString(color.ToRgb()));
                }
            }
            if (value is Color4)
            {
                var color = (Color4)value;
                if (targetType == typeof(System.Windows.Media.Color))
                {
                    return(color.ToSystemColor());
                }
                if (targetType == typeof(Color))
                {
                    return((Color)color);
                }
                if (targetType == typeof(Color3))
                {
                    return(color.ToColor3());
                }
                if (targetType == typeof(Color4))
                {
                    return(color);
                }
                if (targetType.IsAssignableFrom(typeof(SolidColorBrush)))
                {
                    return(new SolidColorBrush(color.ToSystemColor()));
                }
                if (targetType == typeof(string))
                {
                    return(ColorExtensions.RgbaToString(color.ToRgba()));
                }
            }
            if (value is System.Windows.Media.Color)
            {
                var wpfColor = (System.Windows.Media.Color)value;
                if (targetType.IsAssignableFrom(typeof(SolidColorBrush)))
                {
                    return(new SolidColorBrush(wpfColor));
                }

                var color = new Color(wpfColor.R, wpfColor.G, wpfColor.B, wpfColor.A);
                if (targetType == typeof(System.Windows.Media.Color))
                {
                    return(color);
                }
                if (targetType == typeof(Color))
                {
                    return(color);
                }
                if (targetType == typeof(Color3))
                {
                    return(color.ToColor3());
                }
                if (targetType == typeof(Color4))
                {
                    return(color.ToColor4());
                }
                if (targetType == typeof(string))
                {
                    return(ColorExtensions.RgbaToString(color.ToRgba()));
                }
            }
            var stringColor = value as string;

            if (stringColor != null)
            {
                var intValue = ColorExtensions.StringToRgba(stringColor);
                if (targetType == typeof(Color))
                {
                    return(Color.FromRgba(intValue));
                }
                if (targetType == typeof(Color3))
                {
                    return(new Color3(intValue));
                }
                if (targetType == typeof(Color4))
                {
                    return(new Color4(intValue));
                }
                if (targetType == typeof(System.Windows.Media.Color))
                {
                    return(System.Windows.Media.Color.FromArgb(
                               (byte)((intValue >> 24) & 255),
                               (byte)(intValue & 255),
                               (byte)((intValue >> 8) & 255),
                               (byte)((intValue >> 16) & 255)));
                }
                if (targetType.IsAssignableFrom(typeof(SolidColorBrush)))
                {
                    return(new SolidColorBrush(System.Windows.Media.Color.FromArgb(
                                                   (byte)((intValue >> 24) & 255),
                                                   (byte)(intValue & 255),
                                                   (byte)((intValue >> 8) & 255),
                                                   (byte)((intValue >> 16) & 255))));
                }
                if (targetType == typeof(string))
                {
                    return(stringColor);
                }
            }

#if DEBUG
            if (value == null || value == DependencyProperty.UnsetValue)
            {
                return(DependencyProperty.UnsetValue);
            }

            throw new NotSupportedException("Requested conversion is not supported.");
#else
            return(DependencyProperty.UnsetValue);
#endif
        }