Browse Source

Fix color and pixel operations. Touches #967 #1002

pull/1055/head
James Jackson-South 7 years ago
parent
commit
096d523a13
  1. 21
      src/ImageSharp.Drawing/Processing/GradientBrush.cs
  2. 4
      src/ImageSharp.Drawing/Processing/ImageBrush.cs
  3. 8
      src/ImageSharp.Drawing/Processing/PathGradientBrush.cs
  4. 8
      src/ImageSharp.Drawing/Processing/PatternBrush.cs
  5. 4
      src/ImageSharp/ImageSharp.csproj

21
src/ImageSharp.Drawing/Processing/GradientBrush.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -92,10 +92,10 @@ namespace SixLabors.ImageSharp.Processing
// onLocalGradient = Math.Min(0, Math.Max(1, onLocalGradient));
break;
case GradientRepetitionMode.Repeat:
positionOnCompleteGradient = positionOnCompleteGradient % 1;
positionOnCompleteGradient %= 1;
break;
case GradientRepetitionMode.Reflect:
positionOnCompleteGradient = positionOnCompleteGradient % 2;
positionOnCompleteGradient %= 2;
if (positionOnCompleteGradient > 1)
{
positionOnCompleteGradient = 2 - positionOnCompleteGradient;
@ -121,19 +121,12 @@ namespace SixLabors.ImageSharp.Processing
}
else
{
var fromAsVector = from.Color.ToVector4();
var toAsVector = to.Color.ToVector4();
float onLocalGradient = (positionOnCompleteGradient - from.Ratio) / (to.Ratio - from.Ratio);
// TODO: this should be changeble for different gradienting functions
Vector4 result = PorterDuffFunctions.NormalSrcOver(
fromAsVector,
toAsVector,
onLocalGradient);
TPixel resultColor = default;
resultColor.FromVector4(result);
return resultColor;
return PixelOperations<TPixel>
.Instance.GetPixelBlender(PixelColorBlendingMode.Normal, PixelAlphaCompositionMode.SrcOver)
.Blend(from.Color.ToPixel<TPixel>(), to.Color.ToPixel<TPixel>(), onLocalGradient);
}
}
}
@ -176,4 +169,4 @@ namespace SixLabors.ImageSharp.Processing
}
}
}
}
}

4
src/ImageSharp.Drawing/Processing/ImageBrush.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -167,4 +167,4 @@ namespace SixLabors.ImageSharp.Processing
}
}
}
}
}

8
src/ImageSharp.Drawing/Processing/PathGradientBrush.cs

@ -105,7 +105,7 @@ namespace SixLabors.ImageSharp.Processing
"One or more color is needed to construct a path gradient brush.");
}
return new Color(colors.Select(c => c.ToVector4()).Aggregate((p1, p2) => p1 + p2) / colors.Length);
return new Color(colors.Select(c => (Vector4)c).Aggregate((p1, p2) => p1 + p2) / colors.Length);
}
private static float DistanceBetween(PointF p1, PointF p2) => ((Vector2)(p2 - p1)).Length();
@ -141,10 +141,10 @@ namespace SixLabors.ImageSharp.Processing
Vector2[] points = path.LineSegments.SelectMany(s => s.Flatten()).Select(p => (Vector2)p).ToArray();
this.Start = points.First();
this.StartColor = startColor.ToVector4();
this.StartColor = (Vector4)startColor;
this.End = points.Last();
this.EndColor = endColor.ToVector4();
this.EndColor = (Vector4)endColor;
this.length = DistanceBetween(this.End, this.Start);
this.buffer = new PointF[this.path.MaxIntersections];
@ -215,7 +215,7 @@ namespace SixLabors.ImageSharp.Processing
PointF[] points = edges.Select(s => s.Start).ToArray();
this.center = points.Aggregate((p1, p2) => p1 + p2) / edges.Count;
this.centerColor = centerColor.ToVector4();
this.centerColor = (Vector4)centerColor;
this.maxDistance = points.Select(p => (Vector2)(p - this.center)).Select(d => d.Length()).Max();
}

8
src/ImageSharp.Drawing/Processing/PatternBrush.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -61,8 +61,8 @@ namespace SixLabors.ImageSharp.Processing
/// <param name="pattern">The pattern.</param>
internal PatternBrush(Color foreColor, Color backColor, in DenseMatrix<bool> pattern)
{
var foreColorVector = foreColor.ToVector4();
var backColorVector = backColor.ToVector4();
var foreColorVector = (Vector4)foreColor;
var backColorVector = (Vector4)backColor;
this.pattern = new DenseMatrix<Color>(pattern.Columns, pattern.Rows);
this.patternVector = new DenseMatrix<Vector4>(pattern.Columns, pattern.Rows);
for (int i = 0; i < pattern.Data.Length; i++)
@ -181,4 +181,4 @@ namespace SixLabors.ImageSharp.Processing
}
}
}
}
}

4
src/ImageSharp/ImageSharp.csproj

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
@ -119,7 +119,7 @@
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="SixLabors.ImageSharp.Drawing" />
<!--<InternalsVisibleTo Include="SixLabors.ImageSharp.Drawing" />-->
</ItemGroup>
<ItemGroup>

Loading…
Cancel
Save