public void TestNoFx() { SvgRadialGradientElement elm = Util.GetXmlElement("<radialGradient fy='5' />", "", "radialGradient") as SvgRadialGradientElement; Assert.AreEqual(5, elm.Fx.AnimVal.Value, "fx"); Assert.AreEqual(5, elm.Fy.AnimVal.Value, "fy"); }
public void TestSize() { SvgRadialGradientElement elm = Util.GetXmlElement("<radialGradient cx='1' cy='2' r='3' fx='4' fy='5' />", "", "radialGradient") as SvgRadialGradientElement; Assert.AreEqual(1, elm.Cx.AnimVal.Value, "cx"); Assert.AreEqual(2, elm.Cy.AnimVal.Value, "cy"); Assert.AreEqual(3, elm.R.AnimVal.Value, "r"); Assert.AreEqual(4, elm.Fx.AnimVal.Value, "fx"); Assert.AreEqual(5, elm.Fy.AnimVal.Value, "fy"); }
public override Brush GetBrush(Rect elementBounds, WpfDrawingContext context, Transform viewTransform) { SvgLinearGradientElement linearGrad = _gradientElement as SvgLinearGradientElement; if (linearGrad != null) { return(GetLinearGradientBrush(linearGrad, viewTransform)); } SvgRadialGradientElement radialGrad = _gradientElement as SvgRadialGradientElement; if (radialGrad != null) { return(GetRadialGradientBrush(radialGrad)); } return(new SolidColorBrush(Colors.Black)); }
public override Brush GetBrush(RectangleF bounds) { SvgLinearGradientElement linearGradient = _gradientElement as SvgLinearGradientElement; if (linearGradient != null) { return(GetLinearGradientBrush(linearGradient, bounds)); } SvgRadialGradientElement radialGradient = _gradientElement as SvgRadialGradientElement; if (radialGradient != null) { return(GetRadialGradientBrush(radialGradient, bounds)); } return(new SolidBrush(Color.Black)); }
public Region GetRadialRegion(RectangleF bounds) { SvgRadialGradientElement res = _gradientElement as SvgRadialGradientElement; if (_gradientElement == null) { return(null); } float fCenterX = (float)res.Cx.AnimVal.Value; float fCenterY = (float)res.Cy.AnimVal.Value; float fFocusX = (float)res.Fx.AnimVal.Value; float fFocusY = (float)res.Fy.AnimVal.Value; float fRadius = (float)res.R.AnimVal.Value; float fEffectiveCX = fCenterX; float fEffectiveCY = fCenterY; float fEffectiveFX = fFocusX; float fEffectiveFY = fFocusY; float fEffectiveRadiusX = fRadius; float fEffectiveRadiusY = fRadius; if (res.GradientUnits.AnimVal.Equals((ushort)SvgUnitType.ObjectBoundingBox)) { fEffectiveCX = bounds.Left + fCenterX * (bounds.Width); fEffectiveCY = bounds.Top + fCenterY * (bounds.Height); fEffectiveFX = bounds.Left + fFocusX * (bounds.Width); fEffectiveFY = bounds.Top + fFocusY * (bounds.Height); fEffectiveRadiusX = fRadius * bounds.Width; fEffectiveRadiusY = fRadius * bounds.Height; } GraphicsPath gp2 = new GraphicsPath(); gp2.AddEllipse(fEffectiveCX - fEffectiveRadiusX, fEffectiveCY - fEffectiveRadiusY, 2 * fEffectiveRadiusX, 2 * fEffectiveRadiusY); return(new Region(gp2)); }
public virtual void VisitRadialGradientElement(SvgRadialGradientElement element) => DefaultVisit(element);
private Brush GetRadialGradientBrush(SvgRadialGradientElement res) { double centerX = res.Cx.AnimVal.Value; double centerY = res.Cy.AnimVal.Value; double focusX = res.Fx.AnimVal.Value; double focusY = res.Fy.AnimVal.Value; double radius = res.R.AnimVal.Value; GradientStopCollection gradientStops = GetGradientStops(res.Stops); if (gradientStops == null || gradientStops.Count == 0) { return(null); } RadialGradientBrush brush = new RadialGradientBrush(gradientStops); brush.RadiusX = radius; brush.RadiusY = radius; brush.Center = new Point(centerX, centerY); brush.GradientOrigin = new Point(focusX, focusY); if (res.SpreadMethod != null) { SvgSpreadMethod spreadMethod = (SvgSpreadMethod)res.SpreadMethod.AnimVal; if (spreadMethod != SvgSpreadMethod.None) { brush.SpreadMethod = WpfConvert.ToSpreadMethod(spreadMethod); } } if (res.GradientUnits != null) { SvgUnitType mappingMode = (SvgUnitType)res.GradientUnits.AnimVal; if (mappingMode == SvgUnitType.ObjectBoundingBox) { brush.MappingMode = BrushMappingMode.RelativeToBoundingBox; } else if (mappingMode == SvgUnitType.UserSpaceOnUse) { brush.MappingMode = BrushMappingMode.Absolute; if (res.Fx.AnimVal.UnitType == SvgLengthType.Percentage) { brush.GradientOrigin = brush.Center; } } } MatrixTransform transform = GetTransformMatrix(res); if (transform != null && !transform.Matrix.IsIdentity) { brush.Transform = transform; } string colorInterpolation = res.GetPropertyValue("color-interpolation"); if (!string.IsNullOrWhiteSpace(colorInterpolation)) { if (colorInterpolation == "linearRGB") { brush.ColorInterpolationMode = ColorInterpolationMode.SRgbLinearInterpolation; } else { brush.ColorInterpolationMode = ColorInterpolationMode.ScRgbLinearInterpolation; } } return(brush); }
private PathGradientBrush GetRadialGradientBrush(SvgRadialGradientElement res, RectangleF bounds) { float fCenterX = (float)res.Cx.AnimVal.Value; float fCenterY = (float)res.Cy.AnimVal.Value; float fFocusX = (float)res.Fx.AnimVal.Value; float fFocusY = (float)res.Fy.AnimVal.Value; float fRadius = (float)res.R.AnimVal.Value; float fEffectiveCX = fCenterX; float fEffectiveCY = fCenterY; float fEffectiveFX = fFocusX; float fEffectiveFY = fFocusY; float fEffectiveRadiusX = fRadius; float fEffectiveRadiusY = fRadius; if (res.GradientUnits.AnimVal.Equals(SvgUnitType.ObjectBoundingBox)) { fEffectiveCX = bounds.Left + fCenterX * (bounds.Width); fEffectiveCY = bounds.Top + fCenterY * (bounds.Height); fEffectiveFX = bounds.Left + fFocusX * (bounds.Width); fEffectiveFY = bounds.Top + fFocusY * (bounds.Height); fEffectiveRadiusX = fRadius * bounds.Width; fEffectiveRadiusY = fRadius * bounds.Height; } GraphicsPath gp = new GraphicsPath(); gp.AddEllipse(fEffectiveCX - fEffectiveRadiusX, fEffectiveCY - fEffectiveRadiusY, 2 * fEffectiveRadiusX, 2 * fEffectiveRadiusY); PathGradientBrush brush = new PathGradientBrush(gp); brush.CenterPoint = new PointF(fEffectiveFX, fEffectiveFY); XmlNodeList stops = res.Stops; ColorBlend cb = new ColorBlend(); List <Color> adjcolors = new List <Color>(); List <float> adjpositions = new List <float>(); GetColorsAndPositions(stops, adjpositions, adjcolors); // Need to invert the colors for some bizarre reason adjcolors.Reverse(); adjpositions.Reverse(); for (int i = 0; i < adjpositions.Count; i++) { adjpositions[i] = 1 - adjpositions[i]; } cb.Colors = adjcolors.ToArray(); cb.Positions = adjpositions.ToArray(); brush.InterpolationColors = cb; // ISvgTransformable transElm = (ISvgTransformable)res; // SvgTransformList svgTList = (SvgTransformList)transElm.transform.AnimVal; // brush.Transform = svgTList.matrix.matrix; if (res.GetPropertyValue("color-interpolation") == "linearRGB") { //GdipSetPathGradientGammaCorrection(brush, true); } else { //GdipSetPathGradientGammaCorrection(brush, false); } /* * How to do brush.GammaCorrection = true on a PathGradientBrush? / nikgus * */ return(brush); }
public static RadialGradientBrush ConstructBrush(SvgRadialGradientElement gradient, Rect bounds, Matrix transform) { if (gradient.Stops.Count == 0) { return(null); } double centerX = gradient.Cx.AnimVal.Value; double centerY = gradient.Cy.AnimVal.Value; double focusX = gradient.Fx.AnimVal.Value; double focusY = gradient.Fy.AnimVal.Value; double radius = gradient.R.AnimVal.Value; GradientStopCollection gradientStops = ToGradientStops(gradient.Stops); RadialGradientBrush brush = new RadialGradientBrush(gradientStops); brush.RadiusX = radius; brush.RadiusY = radius; brush.Center = new Point(centerX, centerY); brush.GradientOrigin = new Point(focusX, focusY); if (gradient.SpreadMethod != null) { SvgSpreadMethod spreadMethod = (SvgSpreadMethod)gradient.SpreadMethod.AnimVal; GradientSpreadMethod sm; if (TryGetSpreadMethod(spreadMethod, out sm)) { brush.SpreadMethod = sm; } } SvgUnitType mappingMode = SvgUnitType.ObjectBoundingBox; if (gradient.GradientUnits != null) { mappingMode = (SvgUnitType)gradient.GradientUnits.AnimVal; if (mappingMode == SvgUnitType.ObjectBoundingBox) { brush.MappingMode = BrushMappingMode.RelativeToBoundingBox; } else if (mappingMode == SvgUnitType.UserSpaceOnUse) { brush.MappingMode = BrushMappingMode.Absolute; brush.Center.Offset(bounds.X, bounds.Y); brush.GradientOrigin.Offset(bounds.X, bounds.Y); } } Matrix brushTransform = ToWpfMatrix(((SvgTransformList)gradient.GradientTransform.AnimVal).TotalMatrix); if (mappingMode == SvgUnitType.UserSpaceOnUse) { brushTransform *= transform; } if (!brushTransform.IsIdentity) { brush.Transform = new MatrixTransform(brushTransform); } string colorInterpolation = gradient.GetPropertyValue("color-interpolation"); if (!string.IsNullOrWhiteSpace(colorInterpolation)) { if (colorInterpolation == CssConstants.ValLinearRgb) { brush.ColorInterpolationMode = ColorInterpolationMode.SRgbLinearInterpolation; } else { brush.ColorInterpolationMode = ColorInterpolationMode.ScRgbLinearInterpolation; } } return(brush); }
private CanvasRadialGradientBrush CreateRadialGradient(CanvasDrawingSession session, Rect area, SvgRadialGradientElement element) { if (this.ResourceCache.ContainsKey(element)) { return((CanvasRadialGradientBrush)this.ResourceCache[element]); } var stops = element.ChildNodes.Cast <SvgStopElement>().Select(s => { var alpha = s.Style.StopOpacity.HasValue ? (byte)(255.0F * s.Style.StopOpacity.Value) : (byte)0xff; var stop = new CanvasGradientStop() { Position = s.Offset, Color = Color.FromArgb(alpha, s.Style.StopColor.RgbColor.Red, s.Style.StopColor.RgbColor.Green, s.Style.StopColor.RgbColor.Blue) }; return(stop); }).ToArray(); var m = element.GradientTransform.Result; if (element.GradientUnits == SvgUnitType.ObjectBoundingBox) { m = new SvgMatrix(area.Width, 0.0, 0.0, area.Height, area.X, area.Y) * m; } var transform = new Matrix3x2 { M11 = (float)m.A, M12 = (float)m.B, M21 = (float)m.C, M22 = (float)m.D, M31 = (float)m.E, M32 = (float)m.F }; var centerX = this.LengthConverter.ConvertX(element.CenterX); var centerY = this.LengthConverter.ConvertY(element.CenterY); var focusX = this.LengthConverter.ConvertX(element.FocusX); var focusY = this.LengthConverter.ConvertY(element.FocusY); var radiusX = this.LengthConverter.ConvertX(element.Radius); var radiusY = this.LengthConverter.ConvertY(element.Radius); var spreadMethod = GetSpreadMethod(element.SpreadMethod); var brush = new CanvasRadialGradientBrush(this.ResourceCreator, stops, spreadMethod, CanvasAlphaMode.Straight) { OriginOffset = new Vector2 { X = focusX - centerX, Y = focusY - centerY }, Center = new Vector2 { X = centerX, Y = centerY }, RadiusX = radiusX, RadiusY = radiusY, Transform = transform, }; this.DisposableObjects.Add(brush); this.ResourceCache.Add(element, brush); return(brush); }
private Brush GetRadialGradientBrush(SvgRadialGradientElement res) { var refElem = res.ReferencedElement; double centerX = res.Cx.AnimVal.Value; double centerY = res.Cy.AnimVal.Value; // 'fx', 'fy', and 'fr' define the start circle for the radial gradient. double focusX = res.Fx.AnimVal.Value; double focusY = res.Fy.AnimVal.Value; double radius = res.R.AnimVal.Value; var lengthUnit = res.Cx.AnimVal.UnitType; // If attribute 'fx' is not specified, 'fx' will coincide with the presentational // value of 'cx' for the element whether the value for 'cx' was inherited or not. if (lengthUnit == SvgLengthType.Percentage) { if (!res.HasAttribute("fx") && (refElem == null || !refElem.HasAttribute("fx"))) { focusX = centerX; } else if (focusX.Equals(0.0)) { focusX = centerX; if (focusX > 0 && focusX >= radius) { focusX = (centerX > radius) ? centerX - radius : focusX = radius; } } else { if (focusX > 0 && focusX >= radius) { focusX = (centerX > radius) ? centerX - radius : focusX = radius; } } } lengthUnit = res.Cy.AnimVal.UnitType; // If attribute 'fy' is not specified, 'fy' will coincide with the presentational // value of 'cy' for the element whether the value for 'cy' was inherited or not. if (lengthUnit == SvgLengthType.Percentage) { if (!res.HasAttribute("fy") && (refElem == null || !refElem.HasAttribute("fy"))) { focusY = centerY; } else if (focusY.Equals(0.0)) { focusY = centerY; if (focusY > 0 && focusY >= radius) { focusY = (centerY > radius) ? centerY - radius : focusY = radius; } } else { if (focusY > 0 && focusY >= radius) { focusY = (centerY > radius) ? centerY - radius : focusY = radius; } } } GradientStopCollection gradientStops = GetGradientStops(res.Stops); if (gradientStops == null || gradientStops.Count == 0) { return(null); } RadialGradientBrush brush = new RadialGradientBrush(gradientStops); brush.RadiusX = radius; brush.RadiusY = radius; brush.Center = new Point(centerX, centerY); brush.GradientOrigin = new Point(focusX, focusY); if (res.SpreadMethod != null) { SvgSpreadMethod spreadMethod = (SvgSpreadMethod)res.SpreadMethod.AnimVal; if (spreadMethod != SvgSpreadMethod.None) { brush.SpreadMethod = WpfConvert.ToSpreadMethod(spreadMethod); } } if (res.GradientUnits != null) { SvgUnitType mappingMode = (SvgUnitType)res.GradientUnits.AnimVal; if (mappingMode == SvgUnitType.ObjectBoundingBox) { brush.MappingMode = BrushMappingMode.RelativeToBoundingBox; } else if (mappingMode == SvgUnitType.UserSpaceOnUse) { brush.MappingMode = BrushMappingMode.Absolute; if (res.Fx.AnimVal.UnitType == SvgLengthType.Percentage) { brush.GradientOrigin = brush.Center; } _isUserSpace = true; } } MatrixTransform transform = GetTransformMatrix(res); if (transform != null && !transform.Matrix.IsIdentity) { brush.Transform = transform; } string colorInterpolation = res.GetPropertyValue("color-interpolation"); if (!string.IsNullOrWhiteSpace(colorInterpolation)) { if (string.Equals(colorInterpolation, "linearRGB", StringComparison.OrdinalIgnoreCase)) { brush.ColorInterpolationMode = ColorInterpolationMode.SRgbLinearInterpolation; } else { brush.ColorInterpolationMode = ColorInterpolationMode.ScRgbLinearInterpolation; } } return(brush); }
private PathGradientBrush GetBrush(SvgRadialGradientElement res, RectangleF bounds) { float fCenterX = (float)res.Cx.AnimVal.Value; float fCenterY = (float)res.Cy.AnimVal.Value; float fFocusX = (float)res.Fx.AnimVal.Value; float fFocusY = (float)res.Fy.AnimVal.Value; float fRadius = (float)res.R.AnimVal.Value; float fEffectiveCX = fCenterX; float fEffectiveCY = fCenterY; float fEffectiveFX = fFocusX; float fEffectiveFY = fFocusY; float fEffectiveRadiusX = fRadius; float fEffectiveRadiusY = fRadius; if (res.GradientUnits.AnimVal.Equals((ushort)SvgUnitType.ObjectBoundingBox)) { fEffectiveCX = bounds.Left + fCenterX * (bounds.Width); fEffectiveCY = bounds.Top + fCenterY * (bounds.Height); fEffectiveFX = bounds.Left + fFocusX * (bounds.Width); fEffectiveFY = bounds.Top + fFocusY * (bounds.Height); fEffectiveRadiusX = fRadius * bounds.Width; fEffectiveRadiusY = fRadius * bounds.Height; } GraphicsPath gp = new GraphicsPath(); gp.AddEllipse(fEffectiveCX - fEffectiveRadiusX, fEffectiveCY - fEffectiveRadiusY, 2 * fEffectiveRadiusX, 2 * fEffectiveRadiusY); PathGradientBrush brush = new PathGradientBrush(gp); brush.CenterPoint = new PointF(fEffectiveFX, fEffectiveFY); XmlNodeList stops = res.Stops; //List<Color> adjcolors = new List<Color>(); //List<float> adjpositions = new List<float>(); //GetColorsAndPositions(stops, adjpositions, adjcolors); //// Need to invert the colors for some bizarre reason //adjcolors.Reverse(); //adjpositions.Reverse(); //for (int i = 0; i < adjpositions.Count; i++) //{ // adjpositions[i] = 1 - adjpositions[i]; //} //cb.Colors = adjcolors.ToArray(); //cb.Positions = adjpositions.ToArray(); var gradientStops = this.GetGradientStops(stops); gradientStops.Reverse(); for (int i = 0; i < gradientStops.Count; i++) { gradientStops[i].Offset = 1 - gradientStops[i].Offset; } int stopCount = gradientStops.Count; ColorBlend cb = new ColorBlend(stopCount); var colors = new Color[stopCount]; var positions = new float[stopCount]; for (int i = 0; i < stopCount; i++) { var gradientStop = gradientStops[i]; colors[i] = gradientStop.Color; positions[i] = gradientStop.Offset; } cb.Colors = colors; cb.Positions = positions; brush.InterpolationColors = cb; // ISvgTransformable transElm = (ISvgTransformable)res; // SvgTransformList svgTList = (SvgTransformList)transElm.transform.AnimVal; // brush.Transform = svgTList.matrix.matrix; //if (res.GetPropertyValue("color-interpolation") == CssConstants.ValLinearRgb) //{ // //GdipSetPathGradientGammaCorrection(brush, true); //} //else //{ // //GdipSetPathGradientGammaCorrection(brush, false); //} ///* // * How to do brush.GammaCorrection = true on a PathGradientBrush? / nikgus // * */ return(brush); }
public GdiRadialGradientFill(SvgRadialGradientElement gradientElement) : base(gradientElement) { }
private CanvasRadialGradientBrush CreateRadialGradient(CanvasDrawingSession session, Rect area, SvgRadialGradientElement element) { if (this.ResourceCache.ContainsKey(element)) { return((CanvasRadialGradientBrush)this.ResourceCache[element]); } var stops = element.ChildNodes.Cast <SvgStopElement>().Select(s => { var alpha = s.Style.StopOpacity.HasValue ? (byte)(255.0F * s.Style.StopOpacity.Value) : (byte)0xff; var stop = new CanvasGradientStop() { Position = s.Offset, Color = s.Style.StopColor.StopColorType == SvgStopColorType.CurrentColor ? s.Style.Color.ToPlatformColor(alpha) : s.Style.StopColor?.ToPlatformColor(alpha) ?? Color.FromArgb(alpha, 0, 0, 0) }; return(stop); }).ToArray(); var m = element.GradientTransform.Result; var transform = new Matrix3x2 { M11 = (float)m.A, M12 = (float)m.B, M21 = (float)m.C, M22 = (float)m.D, M31 = (float)m.E, M32 = (float)m.F }; float centerX, centerY, focusX, focusY, radiusX, radiusY; if (element.GradientUnits != SvgUnitType.UserSpaceOnUse) { centerX = this.LengthConverter.ConvertXForOBBU(element.CenterX, (float)area.X, (float)area.Width); centerY = this.LengthConverter.ConvertYForOBBU(element.CenterY, (float)area.Y, (float)area.Height); focusX = this.LengthConverter.ConvertXForOBBU(element.FocusX, (float)area.X, (float)area.Width); focusY = this.LengthConverter.ConvertYForOBBU(element.FocusY, (float)area.Y, (float)area.Height); radiusX = this.LengthConverter.ConvertXForOBBU(element.Radius, (float)area.X, (float)area.Width); radiusY = this.LengthConverter.ConvertYForOBBU(element.Radius, (float)area.Y, (float)area.Height); } else { centerX = this.LengthConverter.ConvertX(element.CenterX); centerY = this.LengthConverter.ConvertY(element.CenterY); focusX = this.LengthConverter.ConvertX(element.FocusX); focusY = this.LengthConverter.ConvertY(element.FocusY); radiusX = this.LengthConverter.ConvertX(element.Radius); radiusY = this.LengthConverter.ConvertY(element.Radius); } var spreadMethod = GetSpreadMethod(element.SpreadMethod); var brush = new CanvasRadialGradientBrush(this.ResourceCreator, stops, spreadMethod, CanvasAlphaMode.Straight) { OriginOffset = new Vector2 { X = focusX - centerX, Y = focusY - centerY }, Center = new Vector2 { X = centerX, Y = centerY }, RadiusX = radiusX, RadiusY = radiusY, Transform = transform, }; this.DisposableObjects.Add(brush); this.ResourceCache.Add(element, brush); return(brush); }
public override PageElement VisitRadialGradientElement(SvgRadialGradientElement element) => null;