mirror of https://github.com/SixLabors/ImageSharp
5 changed files with 138 additions and 0 deletions
@ -0,0 +1,24 @@ |
|||
// Copyright (c) Six Labors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.Processing.Processors.Transforms; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Extensions.Transforms |
|||
{ |
|||
/// <summary>
|
|||
/// Defines extensions that allow the application of swizzle operations on an <see cref="Image"/>
|
|||
/// </summary>
|
|||
public static class SwizzleExtensions |
|||
{ |
|||
/// <summary>
|
|||
/// Swizzles an image.
|
|||
/// </summary>
|
|||
/// <param name="source">The image to swizzle.</param>
|
|||
/// <param name="swizzler">The swizzler function.</param>
|
|||
/// <typeparam name="TSwizzler">The swizzler function type.</typeparam>
|
|||
/// <returns>The <see cref="IImageProcessingContext"/> to allow chaining of operations.</returns>
|
|||
public static IImageProcessingContext Swizzle<TSwizzler>(this IImageProcessingContext source, TSwizzler swizzler) |
|||
where TSwizzler : struct, ISwizzler |
|||
=> source.ApplyProcessor(new SwizzleProcessor<TSwizzler>(swizzler)); |
|||
} |
|||
} |
|||
@ -0,0 +1,18 @@ |
|||
// Copyright (c) Six Labors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors.Transforms |
|||
{ |
|||
/// <summary>
|
|||
/// Encapsulate an algorithm to swizzle pixels in an image.
|
|||
/// </summary>
|
|||
public interface ISwizzler |
|||
{ |
|||
/// <summary>
|
|||
/// Applies the swizzle transformation to a given point.
|
|||
/// </summary>
|
|||
/// <param name="point">Point to transform.</param>
|
|||
/// <returns>Transformed point.</returns>
|
|||
Point Transform(Point point); |
|||
} |
|||
} |
|||
@ -0,0 +1,33 @@ |
|||
// Copyright (c) Six Labors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors.Transforms |
|||
{ |
|||
internal class SwizzleProcessor<TSwizzler, TPixel> : ImageProcessor<TPixel> |
|||
where TSwizzler : struct, ISwizzler |
|||
where TPixel : unmanaged, IPixel<TPixel> |
|||
{ |
|||
private readonly TSwizzler swizzler; |
|||
|
|||
public SwizzleProcessor(Configuration configuration, TSwizzler swizzler, Image<TPixel> source, Rectangle sourceRectangle) |
|||
: base(configuration, source, sourceRectangle) |
|||
{ |
|||
this.swizzler = swizzler; |
|||
} |
|||
|
|||
/// <inheritdoc/>
|
|||
protected override void OnFrameApply(ImageFrame<TPixel> source) |
|||
{ |
|||
for (int y = 0; y < source.Height; y++) |
|||
{ |
|||
var pixelRowSpan = source.GetPixelRowSpan(y); |
|||
for (int x = 0; x < source.Width; x++) |
|||
{ |
|||
var newPoint = this.swizzler.Transform(new Point(x, y)); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,32 @@ |
|||
// Copyright (c) Six Labors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors.Transforms |
|||
{ |
|||
/// <summary>
|
|||
/// Defines a swizzle operation on an image.
|
|||
/// </summary>
|
|||
/// <typeparam name="TSwizzler">The swizzle function type.</typeparam>
|
|||
public sealed class SwizzleProcessor<TSwizzler> : IImageProcessor |
|||
where TSwizzler : struct, ISwizzler |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="SwizzleProcessor{TSwizzler}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="swizzler">The swizzler operation.</param>
|
|||
public SwizzleProcessor(TSwizzler swizzler) |
|||
=> this.Swizzler = swizzler; |
|||
|
|||
/// <summary>
|
|||
/// Gets the swizzler operation.
|
|||
/// </summary>
|
|||
public TSwizzler Swizzler { get; } |
|||
|
|||
/// <inheritdoc />
|
|||
public IImageProcessor<TPixel> CreatePixelSpecificProcessor<TPixel>(Configuration configuration, Image<TPixel> source, Rectangle sourceRectangle) |
|||
where TPixel : unmanaged, IPixel<TPixel> |
|||
=> new SwizzleProcessor<TSwizzler, TPixel>(configuration, this, source, sourceRectangle); |
|||
} |
|||
} |
|||
@ -0,0 +1,31 @@ |
|||
// Copyright (c) Six Labors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.Processing.Extensions.Transforms; |
|||
using SixLabors.ImageSharp.Processing.Processors.Transforms; |
|||
using Xunit; |
|||
|
|||
namespace SixLabors.ImageSharp.Tests.Processing.Transforms |
|||
{ |
|||
public class SwizzleTests : BaseImageOperationsExtensionTest |
|||
{ |
|||
private struct InvertXAndYSwizzler : ISwizzler |
|||
{ |
|||
public Point Transform(Point point) => new Point(point.Y, point.X); |
|||
} |
|||
|
|||
[Fact] |
|||
public void RotateDegreesFloatRotateProcessorWithAnglesSet() |
|||
{ |
|||
this.operations.Swizzle(default(InvertXAndYSwizzler)); |
|||
SwizzleProcessor<InvertXAndYSwizzler> processor = this.Verify<SwizzleProcessor<InvertXAndYSwizzler>>(); |
|||
|
|||
// assert that pixels have been changed
|
|||
|
|||
this.operations.Swizzle(default(InvertXAndYSwizzler)); |
|||
SwizzleProcessor<InvertXAndYSwizzler> processor2 = this.Verify<SwizzleProcessor<InvertXAndYSwizzler>>(); |
|||
|
|||
// assert that pixels have been changed (i.e. back to original)
|
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue