Browse Source

Fix color and pixel operations. Touches #967 #1002

af/merge-core
James Jackson-South 7 years ago
parent
commit
8abc5786b9
  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. // Licensed under the Apache License, Version 2.0.
using System; using System;
@ -92,10 +92,10 @@ namespace SixLabors.ImageSharp.Processing
// onLocalGradient = Math.Min(0, Math.Max(1, onLocalGradient)); // onLocalGradient = Math.Min(0, Math.Max(1, onLocalGradient));
break; break;
case GradientRepetitionMode.Repeat: case GradientRepetitionMode.Repeat:
positionOnCompleteGradient = positionOnCompleteGradient % 1; positionOnCompleteGradient %= 1;
break; break;
case GradientRepetitionMode.Reflect: case GradientRepetitionMode.Reflect:
positionOnCompleteGradient = positionOnCompleteGradient % 2; positionOnCompleteGradient %= 2;
if (positionOnCompleteGradient > 1) if (positionOnCompleteGradient > 1)
{ {
positionOnCompleteGradient = 2 - positionOnCompleteGradient; positionOnCompleteGradient = 2 - positionOnCompleteGradient;
@ -121,19 +121,12 @@ namespace SixLabors.ImageSharp.Processing
} }
else else
{ {
var fromAsVector = from.Color.ToVector4();
var toAsVector = to.Color.ToVector4();
float onLocalGradient = (positionOnCompleteGradient - from.Ratio) / (to.Ratio - from.Ratio); float onLocalGradient = (positionOnCompleteGradient - from.Ratio) / (to.Ratio - from.Ratio);
// TODO: this should be changeble for different gradienting functions // TODO: this should be changeble for different gradienting functions
Vector4 result = PorterDuffFunctions.NormalSrcOver( return PixelOperations<TPixel>
fromAsVector, .Instance.GetPixelBlender(PixelColorBlendingMode.Normal, PixelAlphaCompositionMode.SrcOver)
toAsVector, .Blend(from.Color.ToPixel<TPixel>(), to.Color.ToPixel<TPixel>(), onLocalGradient);
onLocalGradient);
TPixel resultColor = default;
resultColor.FromVector4(result);
return resultColor;
} }
} }
} }
@ -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. // Licensed under the Apache License, Version 2.0.
using System; 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."); "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(); 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(); Vector2[] points = path.LineSegments.SelectMany(s => s.Flatten()).Select(p => (Vector2)p).ToArray();
this.Start = points.First(); this.Start = points.First();
this.StartColor = startColor.ToVector4(); this.StartColor = (Vector4)startColor;
this.End = points.Last(); this.End = points.Last();
this.EndColor = endColor.ToVector4(); this.EndColor = (Vector4)endColor;
this.length = DistanceBetween(this.End, this.Start); this.length = DistanceBetween(this.End, this.Start);
this.buffer = new PointF[this.path.MaxIntersections]; this.buffer = new PointF[this.path.MaxIntersections];
@ -215,7 +215,7 @@ namespace SixLabors.ImageSharp.Processing
PointF[] points = edges.Select(s => s.Start).ToArray(); PointF[] points = edges.Select(s => s.Start).ToArray();
this.center = points.Aggregate((p1, p2) => p1 + p2) / edges.Count; 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(); 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. // Licensed under the Apache License, Version 2.0.
using System; using System;
@ -61,8 +61,8 @@ namespace SixLabors.ImageSharp.Processing
/// <param name="pattern">The pattern.</param> /// <param name="pattern">The pattern.</param>
internal PatternBrush(Color foreColor, Color backColor, in DenseMatrix<bool> pattern) internal PatternBrush(Color foreColor, Color backColor, in DenseMatrix<bool> pattern)
{ {
var foreColorVector = foreColor.ToVector4(); var foreColorVector = (Vector4)foreColor;
var backColorVector = backColor.ToVector4(); var backColorVector = (Vector4)backColor;
this.pattern = new DenseMatrix<Color>(pattern.Columns, pattern.Rows); this.pattern = new DenseMatrix<Color>(pattern.Columns, pattern.Rows);
this.patternVector = new DenseMatrix<Vector4>(pattern.Columns, pattern.Rows); this.patternVector = new DenseMatrix<Vector4>(pattern.Columns, pattern.Rows);
for (int i = 0; i < pattern.Data.Length; i++) 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"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
@ -119,7 +119,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<InternalsVisibleTo Include="SixLabors.ImageSharp.Drawing" /> <!--<InternalsVisibleTo Include="SixLabors.ImageSharp.Drawing" />-->
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

Loading…
Cancel
Save