Browse Source

Add Brush/Pen.ToImmutable() extension method.

pull/827/head
Steven Kirk 9 years ago
parent
commit
7eec9440b0
  1. 51
      src/Avalonia.Visuals/Media/BrushExtensions.cs
  2. 31
      src/Avalonia.Visuals/Rendering/SceneGraph/BrushDrawOperation.cs
  3. 4
      src/Avalonia.Visuals/Rendering/SceneGraph/GeometryNode.cs
  4. 2
      src/Avalonia.Visuals/Rendering/SceneGraph/LineNode.cs
  5. 2
      src/Avalonia.Visuals/Rendering/SceneGraph/OpacityMaskNode.cs
  6. 4
      src/Avalonia.Visuals/Rendering/SceneGraph/RectangleNode.cs
  7. 7
      src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs
  8. 2
      src/Avalonia.Visuals/Rendering/SceneGraph/TextNode.cs
  9. 2
      src/Skia/Avalonia.Skia/FormattedTextImpl.cs

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

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

4
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;
}

2
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;

2
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;
}

4
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;

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

2
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;

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

Loading…
Cancel
Save