Browse Source

PixelConversionModifierExtensions.ApplyCompanding() + tests

af/merge-core
Anton Firszov 7 years ago
parent
commit
3c0d9bb487
  1. 18
      src/ImageSharp/PixelFormats/PixelConversionModifiersExtensions.cs
  2. 7
      src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor.cs
  3. 65
      tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelConversionModifiersExtensionsTests.cs

18
src/ImageSharp/PixelFormats/PixelConversionModifiersExtensions.cs

@ -5,6 +5,9 @@ using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.PixelFormats namespace SixLabors.ImageSharp.PixelFormats
{ {
/// <summary>
/// Extension and utility methods for <see cref="PixelConversionModifiers"/>.
/// </summary>
internal static class PixelConversionModifiersExtensions internal static class PixelConversionModifiersExtensions
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@ -16,5 +19,20 @@ namespace SixLabors.ImageSharp.PixelFormats
this PixelConversionModifiers modifiers, this PixelConversionModifiers modifiers,
PixelConversionModifiers removeThis) => PixelConversionModifiers removeThis) =>
modifiers & ~removeThis; modifiers & ~removeThis;
/// <summary>
/// Applies the union of <see cref="PixelConversionModifiers.Scale"/> and <see cref="PixelConversionModifiers.SRgbCompand"/>,
/// if <paramref name="compand"/> is true, returns unmodified <paramref name="originalModifiers"/> otherwise.
/// </summary>
/// <remarks>
/// <see cref="PixelConversionModifiers.Scale"/> and <see cref="PixelConversionModifiers.SRgbCompand"/>
/// should be always used together!
/// </remarks>
public static PixelConversionModifiers ApplyCompanding(
this PixelConversionModifiers originalModifiers,
bool compand) =>
compand
? originalModifiers | PixelConversionModifiers.Scale | PixelConversionModifiers.SRgbCompand
: originalModifiers;
} }
} }

7
src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor.cs

@ -236,11 +236,8 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
int sourceHeight = source.Height; int sourceHeight = source.Height;
PixelConversionModifiers conversionModifiers = PixelConversionModifiers.Premultiply; PixelConversionModifiers conversionModifiers =
if (this.Compand) PixelConversionModifiers.Premultiply.ApplyCompanding(this.Compand);
{
conversionModifiers |= PixelConversionModifiers.Scale | PixelConversionModifiers.SRgbCompand;
}
// Interpolate the image using the calculated weights. // Interpolate the image using the calculated weights.
// A 2-pass 1D algorithm appears to be faster than splitting a 1-pass 2D algorithm // A 2-pass 1D algorithm appears to be faster than splitting a 1-pass 2D algorithm

65
tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelConversionModifiersExtensionsTests.cs

@ -0,0 +1,65 @@
// // Copyright (c) Six Labors and contributors.
// // Licensed under the Apache License, Version 2.0.
// // Copyright (c) Six Labors and contributors.
// // Licensed under the Apache License, Version 2.0.
// // Copyright (c) Six Labors and contributors.
// // Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.PixelFormats;
using Xunit;
namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations
{
public class PixelConversionModifiersExtensionsTests
{
[Theory]
[InlineData(PixelConversionModifiers.None, PixelConversionModifiers.None, true)]
[InlineData(PixelConversionModifiers.None, PixelConversionModifiers.Premultiply, false)]
[InlineData(PixelConversionModifiers.SRgbCompand, PixelConversionModifiers.Premultiply, false)]
[InlineData(
PixelConversionModifiers.Premultiply | PixelConversionModifiers.Scale,
PixelConversionModifiers.Premultiply,
true)]
[InlineData(
PixelConversionModifiers.Premultiply | PixelConversionModifiers.Scale,
PixelConversionModifiers.Premultiply | PixelConversionModifiers.Scale,
true)]
[InlineData(
PixelConversionModifiers.Premultiply | PixelConversionModifiers.Scale,
PixelConversionModifiers.Scale,
true)]
internal void IsDefined(
PixelConversionModifiers baselineModifiers,
PixelConversionModifiers checkModifiers,
bool expected)
{
Assert.Equal(expected, baselineModifiers.IsDefined(checkModifiers));
}
[Theory]
[InlineData(PixelConversionModifiers.Premultiply | PixelConversionModifiers.Scale | PixelConversionModifiers.SRgbCompand,
PixelConversionModifiers.Scale, PixelConversionModifiers.Premultiply | PixelConversionModifiers.SRgbCompand)]
[InlineData(PixelConversionModifiers.None, PixelConversionModifiers.Premultiply, PixelConversionModifiers.None)]
internal void Remove(
PixelConversionModifiers baselineModifiers,
PixelConversionModifiers toRemove,
PixelConversionModifiers expected)
{
PixelConversionModifiers result = baselineModifiers.Remove(toRemove);
Assert.Equal(expected, result);
}
[Theory]
[InlineData(PixelConversionModifiers.Premultiply, false, PixelConversionModifiers.Premultiply)]
[InlineData(PixelConversionModifiers.Premultiply, true, PixelConversionModifiers.Premultiply | PixelConversionModifiers.SRgbCompand | PixelConversionModifiers.Scale)]
internal void ApplyCompanding(
PixelConversionModifiers baselineModifiers,
bool compand,
PixelConversionModifiers expected)
{
PixelConversionModifiers result = baselineModifiers.ApplyCompanding(compand);
Assert.Equal(expected, result);
}
}
}
Loading…
Cancel
Save