/// <summary> /// Convert an absolute position in the same coordinate space as the /// given rectangle to a relative position within the bound of the given rectangle /// </summary> private Point GetRelativePosition(EpsRect rect, Point absPosition) { var x = (absPosition.X - rect.Left) / (rect.Right - rect.Left); var y = (absPosition.Y - rect.Top) / (rect.Bottom - rect.Top); return(new Point(x, y)); }
/// <summary> /// Get a brush /// </summary> public GraphicBrush GetBrush(Matrix matrix, EpsRect boundingBox) { var stops = function.GetBoundaryValues(); var linearGradientBrush = new GraphicLinearGradientBrush(); // The whole logic of the shape converter is able to handle both relative and // absolute coordinates of gradients. WPF also allows both mapping modes. But // there is one single case where absolute coordinates don't work: in a <Path/> // object when the stretch mode is other than None. Such a path isn't really // helpfull. That's why all parsers generate relative coordinates. #if GENERATE_RELATIVE_COORDINATES var p0 = coords0 * matrix; linearGradientBrush.StartPoint = GetRelativePosition(boundingBox, p0); var p1 = coords1 * matrix; linearGradientBrush.EndPoint = GetRelativePosition(boundingBox, p1); #else linearGradientBrush.MappingMode = BrushMappingMode.Absolute; var p0 = coords0 * matrix; linearGradientBrush.StartPoint = p0; var p1 = coords1 * matrix; linearGradientBrush.EndPoint = p1; #endif linearGradientBrush.GradientStops = new List <GraphicGradientStop>(); for (int i = 0; i < stops.Count; i++) { var stop = stops[i]; var graphicGradientStop = new GraphicGradientStop(); linearGradientBrush.GradientStops.Add(graphicGradientStop); var color = colorSpace.GetColor(stop.Value); graphicGradientStop.Color = color; graphicGradientStop.Position = stop.Stop; } return(linearGradientBrush); }
/// <summary> /// Get a brush /// </summary> public GraphicBrush GetBrush(Matrix matrix, EpsRect rect) { var linear = new GraphicLinearGradientBrush(); linear.StartPoint = new System.Windows.Point(0, 0); linear.EndPoint = new System.Windows.Point(1, 1); linear.GradientStops = new List <GraphicGradientStop>(); var stop = new GraphicGradientStop(); linear.GradientStops.Add(stop); stop.Color = Colors.Yellow; stop.Position = 0; stop = new GraphicGradientStop(); linear.GradientStops.Add(stop); stop.Color = Colors.Salmon; stop.Position = 1; return(linear); }
/// <summary> /// Get a brush /// </summary> public GraphicBrush GetBrush(Matrix matrix, EpsRect boundingBox) { var stops = function.GetBoundaryValues(); var linearGradientBrush = new GraphicRadialGradientBrush(); // see comment in LinearGradientShading.cs in GetBrush for more details #if GENERATE_RELATIVE_COORDINATES // calculate the start position relative to the object rectangle var center0UserSpace = center0 * matrix; linearGradientBrush.StartPoint = GetRelativePosition(boundingBox, center0UserSpace); // calculate the end position relative to the object rectangle var center1UserSpace = center1 * matrix; linearGradientBrush.EndPoint = GetRelativePosition(boundingBox, center1UserSpace); // get the center point and a point on the outer ring // in user space coordinates var centerPointUserSpace = new Point(0, 0) * matrix; var outerPointUserSpace = new Point(1, 1) * matrix; // get the radii in user space var gradientRadiusXUserSpace = Math.Abs(outerPointUserSpace.X - centerPointUserSpace.X); var gradientRadiusYUserSpace = Math.Abs(outerPointUserSpace.Y - centerPointUserSpace.Y); // get the object's size in the user space, we need the radii relative to this size var objectWidth = Math.Abs(boundingBox.Right - boundingBox.Left); var objectHeight = Math.Abs(boundingBox.Bottom - boundingBox.Top); // calculate the relative radius X var relativeRadiusX = gradientRadiusXUserSpace / objectWidth; linearGradientBrush.RadiusX = radius1 * relativeRadiusX; // calculate the relative radius Y var relativeRadiusY = gradientRadiusYUserSpace / objectHeight; linearGradientBrush.RadiusY = radius1 * relativeRadiusY; #else linearGradientBrush.MappingMode = BrushMappingMode.Absolute; // calculate the start position relative to the object rectangle var center0UserSpace = center0 * matrix; linearGradientBrush.StartPoint = center0UserSpace; // calculate the end position relative to the object rectangle var center1UserSpace = center1 * matrix; linearGradientBrush.EndPoint = center1UserSpace; // calculate the radius X linearGradientBrush.RadiusX = TransformX(radius1, matrix); // calculate the radius Y linearGradientBrush.RadiusY = TransformY(radius1, matrix); #endif linearGradientBrush.GradientStops = new List <GraphicGradientStop>(); if (stops.Count > 0 && !DoubleUtilities.IsZero(stops[0].Stop) && !DoubleUtilities.IsZero(radius0)) { var graphicGradientStop = new GraphicGradientStop(); linearGradientBrush.GradientStops.Add(graphicGradientStop); graphicGradientStop.Color = Colors.Transparent; graphicGradientStop.Position = 0; graphicGradientStop = new GraphicGradientStop(); linearGradientBrush.GradientStops.Add(graphicGradientStop); graphicGradientStop.Color = Colors.Transparent; graphicGradientStop.Position = stops[0].Stop; } for (int i = 0; i < stops.Count; i++) { var stop = stops[i]; var graphicGradientStop = new GraphicGradientStop(); linearGradientBrush.GradientStops.Add(graphicGradientStop); var color = colorSpace.GetColor(stop.Value); graphicGradientStop.Color = color; graphicGradientStop.Position = stop.Stop; } return(linearGradientBrush); }
/// <summary> /// Get a brush /// </summary> public GraphicBrush GetBrush(Matrix parentMatrix, EpsRect rect) { return(shading.GetBrush(matrix * parentMatrix, rect)); }