public sd2.PathGradientBrush GetBrush(RectangleF rect) { var scale = 1f; var bounds = rect; if (Matrix != null) { bounds = Matrix.Inverse().TransformRectangle(bounds); } scale = GradientHelper.GetRadialScale(Center, Radius, GradientOrigin, bounds); if (brush == null || lastScale != scale) { lastScale = scale; var scaledRect = new RectangleF(GradientOrigin - (GradientOrigin - Center + Radius) * scale, GradientOrigin + (Center + Radius - GradientOrigin) * scale); var path = new sd2.GraphicsPath(); path.AddEllipse(scaledRect.ToSD()); brush = new sd2.PathGradientBrush(path); brush.CenterColor = StartColor.ToSD(); brush.CenterPoint = GradientOrigin.ToSD(); brush.WrapMode = wrapMode.ToSD(); brush.SurroundColors = new[] { EndColor.ToSD() }; if (Matrix != null) { brush.MultiplyTransform(Matrix.ToSD()); } if (scale > 1f) { var paths = GradientHelper.GetGradientStops(StartColor.ToSD(), EndColor.ToSD(), scale, wrapMode); brush.InterpolationColors = new sd2.ColorBlend { Positions = paths.Reverse().Select(r => 1f - r.Item1).ToArray(), Colors = paths.Reverse().Select(r => r.Item2).ToArray() }; } } return(brush); }
public sd2.PathGradientBrush GetBrush(RectangleF rect) { var scale = 1f; var bounds = rect; if (Matrix != null) { bounds = Matrix.Inverse().TransformRectangle(bounds); } scale = GradientHelper.GetRadialScale(Center, Radius, GradientOrigin, bounds); if (brush == null || lastScale != scale) { lastScale = scale; var scaledRect = new RectangleF(GradientOrigin - (GradientOrigin - Center + Radius) * scale, GradientOrigin + (Center + Radius - GradientOrigin) * scale); var path = new sd2.GraphicsPath(); path.AddEllipse(scaledRect.ToSD()); brush = new sd2.PathGradientBrush(path); brush.CenterColor = StartColor.ToSD(); brush.CenterPoint = GradientOrigin.ToSD(); brush.WrapMode = wrapMode.ToSD(); brush.SurroundColors = new[] { EndColor.ToSD() }; if (Matrix != null) brush.MultiplyTransform(Matrix.ToSD()); if (scale > 1f) { var paths = GradientHelper.GetGradientStops(StartColor.ToSD(), EndColor.ToSD(), scale, wrapMode); brush.InterpolationColors = new sd2.ColorBlend { Positions = paths.Reverse().Select(r => 1f - r.Item1).ToArray(), Colors = paths.Reverse().Select(r => r.Item2).ToArray() }; } } return brush; }
public static d.Brush ToGdiPlus(this RadialGradientBrush brush, Rect bounds) { var db = CheckDegenerate(brush); if (db != null) return db; var bt = new BrushTransform(brush, bounds); if (bt.DegenerateBrush != null) return bt.DegenerateBrush; var center = brush.Center; var focus = brush.GradientOrigin; var size = new Vector(brush.RadiusX, brush.RadiusY); if (brush.MappingMode == BrushMappingMode.RelativeToBoundingBox) { center = bt.ToAbsolute.Transform(center); focus = bt.ToAbsolute.Transform(focus); size = bt.ToAbsolute.Transform(size); } var ts = bt.ToBrush.Transform(size); var delta = (int)Math.Ceiling(4 * (bounds.BottomRight - bounds.TopLeft).Length / Math.Min(Math.Abs(ts.X), Math.Abs(ts.Y))); size *= delta; center += (delta - 1) * (center - focus); brush = brush.Clone(); var g = brush.GradientStops; var last = g.Count - 1; var offset = 1.00000001; switch(brush.SpreadMethod) { case GradientSpreadMethod.Pad: g.Add(new GradientStop(g[last].Color, delta)); break; case GradientSpreadMethod.Repeat: for(var i = 0; i < delta; ++i) for(var j = 0; j <= last; ++j) g.Add(new GradientStop(g[j].Color, i + g[j].Offset + (j == last ? 1 : offset))); break; case GradientSpreadMethod.Reflect: for(var i = 0; i < delta; ++i) if (i % 2 == 0) for(var j = 0; j <= last; ++j) g.Add(new GradientStop(g[j].Color, i + (1 - g[j].Offset) + (j == 0 ? 1 : offset))); else for(var j = 0; j <= last; ++j) g.Add(new GradientStop(g[j].Color, i + g[j].Offset + (j == last ? 1 : offset))); break; } var b = new d2.PathGradientBrush(new EllipseGeometry(center, size.X, size.Y).ToGdiPlus()); b.CenterPoint = focus.ToGdiPlus(); b.InterpolationColors = ConvertGradient(brush); b.WrapMode = brush.SpreadMethod.ToGdiPlus(); b.MultiplyTransform(bt.ToBrush.ToGdiPlus(), d2.MatrixOrder.Append); return b; }
public void Transform_Operations () { using (PathGradientBrush pgb = new PathGradientBrush (pts_2f, WrapMode.Clamp)) { Matrix clone = pgb.Transform.Clone (); Matrix mul = clone.Clone (); clone.Multiply (mul, MatrixOrder.Append); pgb.MultiplyTransform (mul, MatrixOrder.Append); Assert.AreEqual (pgb.Transform, clone, "Multiply/Append"); clone.Multiply (mul, MatrixOrder.Prepend); pgb.MultiplyTransform (mul, MatrixOrder.Prepend); Assert.AreEqual (pgb.Transform, clone, "Multiply/Prepend"); clone.Rotate (45, MatrixOrder.Append); pgb.RotateTransform (45, MatrixOrder.Append); Assert.AreEqual (pgb.Transform, clone, "Rotate/Append"); clone.Rotate (45, MatrixOrder.Prepend); pgb.RotateTransform (45, MatrixOrder.Prepend); Assert.AreEqual (pgb.Transform, clone, "Rotate/Prepend"); clone.Scale (0.25f, 2, MatrixOrder.Append); pgb.ScaleTransform (0.25f, 2, MatrixOrder.Append); Assert.AreEqual (pgb.Transform, clone, "Scale/Append"); clone.Scale (0.25f, 2, MatrixOrder.Prepend); pgb.ScaleTransform (0.25f, 2, MatrixOrder.Prepend); Assert.AreEqual (pgb.Transform, clone, "Scale/Prepend"); clone.Translate (10, 20, MatrixOrder.Append); pgb.TranslateTransform (10, 20, MatrixOrder.Append); Assert.AreEqual (pgb.Transform, clone, "Translate/Append"); clone.Translate (30, 40, MatrixOrder.Prepend); pgb.TranslateTransform (30, 40, MatrixOrder.Prepend); Assert.AreEqual (pgb.Transform, clone, "Translate/Prepend"); clone.Reset (); pgb.ResetTransform (); Assert.AreEqual (pgb.Transform, clone, "Reset"); } }
public void MultiplyTransform_NonInvertible () { using (Matrix noninvertible = new Matrix (123, 24, 82, 16, 47, 30)) { using (PathGradientBrush pgb = new PathGradientBrush (pts_2f, WrapMode.Clamp)) { pgb.MultiplyTransform (noninvertible); } } }
public void MultiplyTransform2_Invalid () { using (PathGradientBrush pgb = new PathGradientBrush (pts_2f, WrapMode.Clamp)) { pgb.MultiplyTransform (empty_matrix, (MatrixOrder) Int32.MinValue); } }
public void MultiplyTransform2_Null () { using (PathGradientBrush pgb = new PathGradientBrush (pts_2f, WrapMode.Clamp)) { pgb.MultiplyTransform (null, MatrixOrder.Append); } }
public void MultiplyTransform1_Null () { using (PathGradientBrush pgb = new PathGradientBrush (pts_2f, WrapMode.Clamp)) { pgb.MultiplyTransform (null); } }
public void Rectangle () { using (PathGradientBrush pgb = new PathGradientBrush (pts_2f, WrapMode.TileFlipXY)) { CheckDefaultRectangle ("Original", pgb.Rectangle); pgb.MultiplyTransform (new Matrix (2, 0, 0, 2, 2, 2)); CheckDefaultRectangle ("Multiply", pgb.Rectangle); pgb.ResetTransform (); CheckDefaultRectangle ("Reset", pgb.Rectangle); pgb.RotateTransform (90); CheckDefaultRectangle ("Rotate", pgb.Rectangle); pgb.ScaleTransform (4, 0.25f); CheckDefaultRectangle ("Scale", pgb.Rectangle); pgb.TranslateTransform (-10, -20); CheckDefaultRectangle ("Translate", pgb.Rectangle); pgb.SetBlendTriangularShape (0.5f); CheckDefaultRectangle ("SetBlendTriangularShape", pgb.Rectangle); pgb.SetSigmaBellShape (0.5f); CheckDefaultRectangle ("SetSigmaBellShape", pgb.Rectangle); } }