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(); } }
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(); } }