private Resource <Brush> CreateBrush([NotNull] IStyle style, bool temp)
        {
            lock (_lock)
            {
                SolidColourStyle solidColour = style as SolidColourStyle;
                if (solidColour != null)
                {
                    return(new SolidBrush(solidColour.Colour.ToColor()));
                }

                RandomColourStyle randomColour = style as RandomColourStyle;
                if (randomColour != null)
                {
                    return(new SolidBrush(randomColour.PositionColour.ToColor()));
                }

                LinearGradientStyle linearGradient = style as LinearGradientStyle;
                if (linearGradient != null)
                {
                    ColorBlend blend = new ColorBlend(linearGradient.GradientStops.Count);

                    Debug.Assert(blend.Colors != null, "blend.Colors != null");
                    Debug.Assert(blend.Positions != null, "blend.Positions != null");

                    for (int i = 0; i < linearGradient.GradientStops.Count; i++)
                    {
                        GradientStop stop = linearGradient.GradientStops[i];

                        blend.Colors[i]    = stop.Colour.ToColor();
                        blend.Positions[i] = stop.Position;
                    }

                    return(new LinearGradientBrush(
                               linearGradient.Start.ToPointF(),
                               linearGradient.End.ToPointF(),
                               Color.Black,
                               Color.White)
                    {
                        InterpolationColors = blend,
                        WrapMode = WrapMode.Clamp
                    });
                }

                RadialGradientStyle radialGradient = style as RadialGradientStyle;
                if (radialGradient != null)
                {
                    ColorBlend blend = new ColorBlend(radialGradient.GradientStops.Count);

                    Debug.Assert(blend.Colors != null, "blend.Colors != null");
                    Debug.Assert(blend.Positions != null, "blend.Positions != null");

                    for (int i = 0; i < radialGradient.GradientStops.Count; i++)
                    {
                        GradientStop stop = radialGradient.GradientStops[i];

                        blend.Colors[i]    = stop.Colour.ToColor();
                        blend.Positions[i] = stop.Position;
                    }

                    GraphicsPath path = new GraphicsPath();
                    path.AddEllipse(-1, -1, 1, 1);
                    return(new Resource <Brush>(
                               new PathGradientBrush(path)
                    {
                        WrapMode = WrapMode.Clamp,
                        Transform = radialGradient.GradientTransform.ToMatrix(),
                        InterpolationColors = blend,
                        CenterPoint = radialGradient.UnitOriginOffset.ToPointF()
                    },
                               path));
                }

                ImageStyle image = style as ImageStyle;
                if (image != null)
                {
                    Bitmap bitmap = temp ? Get(image.Image) : Add(image.Image);
                    return(new TextureBrush(bitmap, WrapMode.Clamp)
                    {
                        Transform = image.ImageTransform.ToMatrix()
                    });
                }

                throw new NotSupportedException();
            }
        }
Exemple #2
0
        private Resource <Brush> CreateBrush([NotNull] IStyle style, bool temp)
        {
            lock (_lock)
            {
                SolidColourStyle solidColour = style as SolidColourStyle;
                if (solidColour != null)
                {
                    return(new SolidColorBrush(_renderTarget, solidColour.Colour.ToRawColor4()));
                }

                RandomColourStyle randomColour = style as RandomColourStyle;
                if (randomColour != null)
                {
                    return(new SolidColorBrush(_renderTarget, randomColour.PositionColour.ToRawColor4()));
                }

                LinearGradientStyle linearGradient = style as LinearGradientStyle;
                if (linearGradient != null)
                {
                    GradientStopCollection gradientStops = new GradientStopCollection(
                        _renderTarget,
                        linearGradient.GradientStops.Select(DirectXExtensions.ToGradientStop).ToArray(),
                        Gamma.Linear);

                    return(new Resource <Brush>(
                               new LinearGradientBrush(
                                   _renderTarget,
                                   new LinearGradientBrushProperties
                    {
                        StartPoint = linearGradient.Start.ToRawVector2(),
                        EndPoint = linearGradient.End.ToRawVector2()
                    },
                                   gradientStops),
                               gradientStops));
                }

                RadialGradientStyle radialGradient = style as RadialGradientStyle;
                if (radialGradient != null)
                {
                    GradientStopCollection gradientStops = new GradientStopCollection(
                        _renderTarget,
                        radialGradient.GradientStops.Select(DirectXExtensions.ToGradientStop).ToArray(),
                        Gamma.Linear);

                    return(new Resource <Brush>(
                               new RadialGradientBrush(
                                   _renderTarget,
                                   new RadialGradientBrushProperties
                    {
                        GradientOriginOffset = radialGradient.UnitOriginOffset.ToRawVector2(),
                        RadiusX = 1,
                        RadiusY = 1
                    },
                                   new BrushProperties
                    {
                        Opacity = 1,
                        Transform = radialGradient.GradientTransform.ToRawMatrix3x2()
                    },
                                   gradientStops),
                               gradientStops));
                }

                ImageStyle image = style as ImageStyle;
                if (image != null)
                {
                    Bitmap bitmap = temp ? Get(image.Image) : Add(image.Image);
                    return(new BitmapBrush(
                               _renderTarget,
                               bitmap,
                               new BitmapBrushProperties
                    {
                        // TODO set from style
                        ExtendModeX = ExtendMode.Clamp,
                        ExtendModeY = ExtendMode.Clamp,
                        InterpolationMode = BitmapInterpolationMode.Linear
                    },
                               new BrushProperties
                    {
                        Transform = image.ImageTransform.ToRawMatrix3x2(),
                        Opacity = 1
                    }));
                }

                throw new NotSupportedException();
            }
        }