Browse Source

Add Brush/Pen.ToImmutable() extension method.

Steven Kirk 8 years ago
parent
commit
7eec9440b0

+ 51 - 0
src/Avalonia.Visuals/Media/BrushExtensions.cs

@@ -0,0 +1,51 @@
+using System;
+
+namespace Avalonia.Media
+{
+    /// <summary>
+    /// Extension methods for brush classes.
+    /// </summary>
+    public static class BrushExtensions
+    {
+        /// <summary>
+        /// Converts a brush to an immutable brush.
+        /// </summary>
+        /// <param name="brush">The brush.</param>
+        /// <returns>
+        /// The result of calling <see cref="IMutableBrush.ToImmutable"/> if the brush is mutable,
+        /// otherwise <paramref name="brush"/>.
+        /// </returns>
+        public static IBrush ToImmutable(this IBrush brush)
+        {
+            Contract.Requires<ArgumentNullException>(brush != null);
+
+            return (brush as IMutableBrush)?.ToImmutable() ?? brush;
+        }
+
+        /// <summary>
+        /// Converts a pen to a pen with an immutable brush
+        /// </summary>
+        /// <param name="pen">The pen.</param>
+        /// <returns>
+        /// A copy of the pen with an immutable brush, or <paramref name="pen"/> if the pen's brush
+        /// is already immutable or null.
+        /// </returns>
+        public static Pen ToImmutable(this Pen pen)
+        {
+            Contract.Requires<ArgumentNullException>(pen != null);
+
+            var brush = pen?.Brush?.ToImmutable();
+            return pen == null || ReferenceEquals(pen?.Brush, brush) ?
+                pen :
+                new Pen(
+                    brush,
+                    thickness: pen.Thickness,
+                    dashStyle: pen.DashStyle,
+                    dashCap: pen.DashCap,
+                    startLineCap: pen.StartLineCap,
+                    endLineCap: pen.EndLineCap,
+                    lineJoin: pen.LineJoin,
+                    miterLimit: pen.MiterLimit);
+        }
+    }
+}

+ 0 - 31
src/Avalonia.Visuals/Rendering/SceneGraph/BrushDrawOperation.cs

@@ -27,36 +27,5 @@ namespace Avalonia.Rendering.SceneGraph
 
         /// <inheritdoc/>
         public abstract void Render(IDrawingContextImpl context);
-
-        /// <summary>
-        /// Converts a possibly mutable brush to an immutable brush.
-        /// </summary>
-        /// <param name="brush">The brush.</param>
-        /// <returns>An immutable brush</returns>
-        protected IBrush ToImmutable(IBrush brush)
-        {
-            return (brush as IMutableBrush)?.ToImmutable() ?? brush;
-        }
-
-        /// <summary>
-        /// Converts pen with a possibly mutable brush to a pen with an immutable brush.
-        /// </summary>
-        /// <param name="pen">The pen.</param>
-        /// <returns>A pen with an immutable brush</returns>
-        protected Pen ToImmutable(Pen pen)
-        {
-            var brush = pen?.Brush != null ? ToImmutable(pen.Brush) : null;
-            return pen == null || ReferenceEquals(pen?.Brush, brush) ?
-                pen :
-                new Pen(
-                    brush,
-                    thickness: pen.Thickness,
-                    dashStyle: pen.DashStyle,
-                    dashCap: pen.DashCap,
-                    startLineCap: pen.StartLineCap,
-                    endLineCap: pen.EndLineCap,
-                    lineJoin: pen.LineJoin,
-                    miterLimit: pen.MiterLimit);
-        }
     }
 }

+ 2 - 2
src/Avalonia.Visuals/Rendering/SceneGraph/GeometryNode.cs

@@ -31,8 +31,8 @@ namespace Avalonia.Rendering.SceneGraph
         {
             Bounds = geometry.GetRenderBounds(pen?.Thickness ?? 0).TransformToAABB(transform);
             Transform = transform;
-            Brush = ToImmutable(brush);
-            Pen = ToImmutable(pen);
+            Brush = brush?.ToImmutable();
+            Pen = pen?.ToImmutable();
             Geometry = geometry;
             ChildScenes = childScenes;
         }

+ 1 - 1
src/Avalonia.Visuals/Rendering/SceneGraph/LineNode.cs

@@ -31,7 +31,7 @@ namespace Avalonia.Rendering.SceneGraph
         {
             Bounds = new Rect(P1, P2);
             Transform = transform;
-            Pen = ToImmutable(pen);
+            Pen = pen?.ToImmutable();
             P1 = p1;
             P2 = p2;
             ChildScenes = childScenes;

+ 1 - 1
src/Avalonia.Visuals/Rendering/SceneGraph/OpacityMaskNode.cs

@@ -20,7 +20,7 @@ namespace Avalonia.Rendering.SceneGraph
         /// <param name="childScenes">Child scenes for drawing visual brushes.</param>
         public OpacityMaskNode(IBrush mask, Rect bounds, IDictionary<IVisual, Scene> childScenes = null)
         {
-            Mask = ToImmutable(mask);
+            Mask = mask?.ToImmutable();
             MaskBounds = bounds;
             ChildScenes = childScenes;
         }

+ 2 - 2
src/Avalonia.Visuals/Rendering/SceneGraph/RectangleNode.cs

@@ -33,8 +33,8 @@ namespace Avalonia.Rendering.SceneGraph
         {
             Bounds = rect.TransformToAABB(transform).Inflate(pen?.Thickness ?? 0);
             Transform = transform;
-            Brush = ToImmutable(brush);
-            Pen = ToImmutable(pen);
+            Brush = brush?.ToImmutable();
+            Pen = pen?.ToImmutable();
             Rect = rect;
             CornerRadius = cornerRadius;
             ChildScenes = childScenes;

+ 1 - 6
src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs

@@ -326,7 +326,7 @@ namespace Avalonia.Rendering.SceneGraph
 
             if (node.Visual.OpacityMask != null)
             {
-                layer.OpacityMask = ToImmutable(node.Visual.OpacityMask);
+                layer.OpacityMask = node.Visual.OpacityMask?.ToImmutable();
                 layer.OpacityMaskRect = node.ClipBounds;
             }
             else
@@ -380,10 +380,5 @@ namespace Avalonia.Rendering.SceneGraph
 
             return result;
         }
-
-        private static IBrush ToImmutable(IBrush brush)
-        {
-            return (brush as IMutableBrush)?.ToImmutable() ?? brush;
-        }
     }
 }

+ 1 - 1
src/Avalonia.Visuals/Rendering/SceneGraph/TextNode.cs

@@ -31,7 +31,7 @@ namespace Avalonia.Rendering.SceneGraph
         {
             Bounds = new Rect(origin, text.Size).TransformToAABB(transform);
             Transform = transform;
-            Foreground = ToImmutable(foreground);
+            Foreground = foreground?.ToImmutable();
             Origin = origin;
             Text = text;
             ChildScenes = childScenes;

+ 1 - 1
src/Skia/Avalonia.Skia/FormattedTextImpl.cs

@@ -615,7 +615,7 @@ namespace Avalonia.Skia
 
             if (brush != null)
             {
-                brush = (brush as IMutableBrush)?.ToImmutable() ?? brush;
+                brush = brush.ToImmutable();
                 _foregroundBrushes.Insert(0, new KeyValuePair<FBrushRange, IBrush>(key, brush));
             }
         }