Browse Source

Merge branch 'master' into colorspace-transforms

af/merge-core
James Jackson-South 8 years ago
parent
commit
c021e7988d
  1. 2
      src/ImageSharp.Drawing/Processing/BrushApplicator.cs
  2. 6
      src/ImageSharp/ColorSpaces/CieLab.cs
  3. 6
      src/ImageSharp/ColorSpaces/CieLch.cs
  4. 6
      src/ImageSharp/ColorSpaces/CieLchuv.cs
  5. 6
      src/ImageSharp/ColorSpaces/CieLuv.cs
  6. 6
      src/ImageSharp/ColorSpaces/CieXyz.cs
  7. 2
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs
  8. 2
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.LinearRgb.cs
  9. 2
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs
  10. 10
      src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzToLinearRgbConverter.cs
  11. 2
      src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbAndCieXyzConverterBase.cs
  12. 6
      src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbToCieXyzConverter.cs
  13. 2
      src/ImageSharp/ColorSpaces/Conversion/Implementation/RGBPrimariesChromaticityCoordinates.cs
  14. 8
      src/ImageSharp/ColorSpaces/Conversion/Implementation/RgbWorkingSpace.cs
  15. 6
      src/ImageSharp/ColorSpaces/Hsv.cs
  16. 6
      src/ImageSharp/ColorSpaces/ICompanding.cs
  17. 12
      src/ImageSharp/ColorSpaces/LinearRgb.cs
  18. 13
      src/ImageSharp/ColorSpaces/Rgb.cs
  19. 2
      src/ImageSharp/Common/Constants.cs
  20. 2
      src/ImageSharp/Common/Extensions/Vector4Extensions.cs
  21. 2
      src/ImageSharp/Formats/Bmp/IBmpEncoderOptions.cs
  22. 2
      src/ImageSharp/Formats/Gif/DisposalMethod.cs
  23. 2
      src/ImageSharp/IConfigurationModule.cs
  24. 10
      src/ImageSharp/ImageFrame{TPixel}.cs
  25. 2
      src/ImageSharp/ImageInfoExtensions.cs
  26. 2
      src/ImageSharp/Memory/ArrayPoolMemoryAllocator.cs
  27. 2
      src/ImageSharp/Memory/BasicByteBuffer.cs
  28. 2
      src/ImageSharp/Memory/Buffer2D{T}.cs
  29. 2
      src/ImageSharp/Memory/ManagedBufferBase.cs
  30. 4
      src/ImageSharp/Memory/SimpleGcMemoryAllocator.cs
  31. 2
      src/ImageSharp/MetaData/ImageFrameMetaData.cs
  32. 2
      src/ImageSharp/MetaData/ImageProperty.cs
  33. 7
      src/ImageSharp/MetaData/Profiles/Exif/ExifValue.cs
  34. 5
      src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.cs
  35. 2
      src/ImageSharp/MetaData/Profiles/ICC/IccReader.cs
  36. 2
      src/ImageSharp/MetaData/Profiles/ICC/IccWriter.cs
  37. 88
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/LoadResizeSave.cs
  38. 2
      tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj
  39. 36
      tests/ImageSharp.Benchmarks/Samplers/Resize.cs
  40. 8
      tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs

2
src/ImageSharp.Drawing/Processing/BrushApplicator.cs

@ -24,9 +24,7 @@ namespace SixLabors.ImageSharp.Processing
internal BrushApplicator(ImageFrame<TPixel> target, GraphicsOptions options)
{
this.Target = target;
this.Options = options;
this.Blender = PixelOperations<TPixel>.Instance.GetPixelBlender(options.BlenderMode);
}

6
src/ImageSharp/ColorSpaces/CieLab.cs

@ -111,11 +111,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
}
/// <inheritdoc />
public Vector3 Vector
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => this.backingVector;
}
public Vector3 Vector => this.backingVector;
/// <summary>
/// Compares two <see cref="CieLab"/> objects for equality.

6
src/ImageSharp/ColorSpaces/CieLch.cs

@ -111,11 +111,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
}
/// <inheritdoc />
public Vector3 Vector
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => this.backingVector;
}
public Vector3 Vector => this.backingVector;
/// <summary>
/// Compares two <see cref="CieLch"/> objects for equality.

6
src/ImageSharp/ColorSpaces/CieLchuv.cs

@ -111,11 +111,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
}
/// <inheritdoc />
public Vector3 Vector
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => this.backingVector;
}
public Vector3 Vector => this.backingVector;
/// <summary>
/// Compares two <see cref="CieLchuv"/> objects for equality.

6
src/ImageSharp/ColorSpaces/CieLuv.cs

@ -113,11 +113,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
}
/// <inheritdoc />
public Vector3 Vector
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => this.backingVector;
}
public Vector3 Vector => this.backingVector;
/// <summary>
/// Compares two <see cref="CieLuv"/> objects for equality.

6
src/ImageSharp/ColorSpaces/CieXyz.cs

@ -73,11 +73,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
}
/// <inheritdoc />
public Vector3 Vector
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => this.backingVector;
}
public Vector3 Vector => this.backingVector;
/// <summary>
/// Compares two <see cref="CieXyz"/> objects for equality.

2
src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs

@ -208,7 +208,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
/// </summary>
/// <param name="workingSpace">The source working space</param>
/// <returns>The <see cref="LinearRgbToCieXyzConverter"/></returns>
private LinearRgbToCieXyzConverter GetLinearRgbToCieXyzConverter(IRgbWorkingSpace workingSpace)
private LinearRgbToCieXyzConverter GetLinearRgbToCieXyzConverter(RgbWorkingSpace workingSpace)
{
if (this.linearRgbToCieXyzConverter?.SourceWorkingSpace.Equals(workingSpace) == true)
{

2
src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.LinearRgb.cs

@ -168,7 +168,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
/// </summary>
/// <param name="workingSpace">The target working space</param>
/// <returns>The <see cref="CieXyzToLinearRgbConverter"/></returns>
private CieXyzToLinearRgbConverter GetCieXyxToLinearRgbConverter(IRgbWorkingSpace workingSpace)
private CieXyzToLinearRgbConverter GetCieXyxToLinearRgbConverter(RgbWorkingSpace workingSpace)
{
if (this.cieXyzToLinearRgbConverter != null && this.cieXyzToLinearRgbConverter.TargetWorkingSpace.Equals(workingSpace))
{

2
src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs

@ -63,7 +63,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
/// Gets or sets the target working space used *when creating* RGB colors. (RGB colors on the input already contain the working space information)
/// Defaults to: <see cref="Rgb.DefaultWorkingSpace"/>.
/// </summary>
public IRgbWorkingSpace TargetRgbWorkingSpace { get; set; }
public RgbWorkingSpace TargetRgbWorkingSpace { get; set; }
/// <summary>
/// Gets or sets the chromatic adaptation method used. When null, no adaptation will be performed.

10
src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzToLinearRgbConverter.cs

@ -9,7 +9,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// <summary>
/// Color converter between CieXyz and LinearRgb
/// </summary>
internal class CieXyzToLinearRgbConverter : LinearRgbAndCieXyzConverterBase, IColorConversion<CieXyz, LinearRgb>
internal sealed class CieXyzToLinearRgbConverter : LinearRgbAndCieXyzConverterBase, IColorConversion<CieXyz, LinearRgb>
{
private readonly Matrix4x4 conversionMatrix;
@ -27,7 +27,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// </summary>
/// <param name="workingSpace">The target working space.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public CieXyzToLinearRgbConverter(IRgbWorkingSpace workingSpace)
public CieXyzToLinearRgbConverter(RgbWorkingSpace workingSpace)
{
this.TargetWorkingSpace = workingSpace;
this.conversionMatrix = GetRgbToCieXyzMatrix(workingSpace);
@ -36,11 +36,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// <summary>
/// Gets the target working space
/// </summary>
public IRgbWorkingSpace TargetWorkingSpace
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get;
}
public RgbWorkingSpace TargetWorkingSpace { get; }
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]

2
src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbAndCieXyzConverterBase.cs

@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// </summary>
/// <param name="workingSpace">The Rgb working space.</param>
/// <returns>The <see cref="Matrix4x4"/> based on the chromaticity and working space.</returns>
public static Matrix4x4 GetRgbToCieXyzMatrix(IRgbWorkingSpace workingSpace)
public static Matrix4x4 GetRgbToCieXyzMatrix(RgbWorkingSpace workingSpace)
{
DebugGuard.NotNull(workingSpace, nameof(workingSpace));

6
src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbToCieXyzConverter.cs

@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// <summary>
/// Color converter between LinearRgb and CieXyz
/// </summary>
internal class LinearRgbToCieXyzConverter : LinearRgbAndCieXyzConverterBase, IColorConversion<LinearRgb, CieXyz>
internal sealed class LinearRgbToCieXyzConverter : LinearRgbAndCieXyzConverterBase, IColorConversion<LinearRgb, CieXyz>
{
private readonly Matrix4x4 conversionMatrix;
@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// Initializes a new instance of the <see cref="LinearRgbToCieXyzConverter"/> class.
/// </summary>
/// <param name="workingSpace">The target working space.</param>
public LinearRgbToCieXyzConverter(IRgbWorkingSpace workingSpace)
public LinearRgbToCieXyzConverter(RgbWorkingSpace workingSpace)
{
this.SourceWorkingSpace = workingSpace;
this.conversionMatrix = GetRgbToCieXyzMatrix(workingSpace);
@ -33,7 +33,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// <summary>
/// Gets the source working space
/// </summary>
public IRgbWorkingSpace SourceWorkingSpace { get; }
public RgbWorkingSpace SourceWorkingSpace { get; }
/// <inheritdoc/>
public CieXyz Convert(in LinearRgb input)

2
src/ImageSharp/ColorSpaces/Conversion/Implementation/RGBPrimariesChromaticityCoordinates.cs

@ -7,7 +7,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
{
/// <summary>
/// Represents the chromaticity coordinates of RGB primaries.
/// One of the specifiers of <see cref="IRgbWorkingSpace"/>.
/// One of the specifiers of <see cref="RgbWorkingSpace"/>.
/// </summary>
internal readonly struct RgbPrimariesChromaticityCoordinates : IEquatable<RgbPrimariesChromaticityCoordinates>
{

8
src/ImageSharp/ColorSpaces/Conversion/Implementation/RgbWorkingSpace.cs

@ -4,9 +4,9 @@
namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
{
/// <summary>
/// Trivial implementation of <see cref="IRgbWorkingSpace"/>
/// Trivial implementation of <see cref="RgbWorkingSpace"/>
/// </summary>
internal class RgbWorkingSpace : IRgbWorkingSpace
internal class RgbWorkingSpace
{
/// <summary>
/// Initializes a new instance of the <see cref="RgbWorkingSpace"/> class.
@ -70,14 +70,12 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
return !Equals(left, right);
}
/// <inheritdoc/>
public override bool Equals(object obj)
{
return obj is RgbWorkingSpace other && this.Equals(other);
}
/// <inheritdoc/>
public bool Equals(IRgbWorkingSpace other)
public bool Equals(RgbWorkingSpace other)
{
// TODO: Object.Equals for ICompanding will be slow.
return this.WhitePoint.Equals(other.WhitePoint)

6
src/ImageSharp/ColorSpaces/Hsv.cs

@ -78,11 +78,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
}
/// <inheritdoc/>
public Vector3 Vector
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => this.backingVector;
}
public Vector3 Vector => this.backingVector;
/// <summary>
/// Allows the implicit conversion of an instance of <see cref="Rgba32"/> to a

6
src/ImageSharp/ColorSpaces/ICompanding.cs

@ -1,12 +1,14 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation;
namespace SixLabors.ImageSharp.ColorSpaces
{
/// <summary>
/// Pair of companding functions for <see cref="IRgbWorkingSpace"/>.
/// Pair of companding functions for <see cref="RgbWorkingSpace"/>.
/// Used for conversion to <see cref="CieXyz"/> and backwards.
/// See also: <seealso cref="IRgbWorkingSpace.Companding"/>
/// See also: <seealso cref="RgbWorkingSpace.Companding"/>
/// </summary>
internal interface ICompanding
{

12
src/ImageSharp/ColorSpaces/LinearRgb.cs

@ -2,21 +2,21 @@
// Licensed under the Apache License, Version 2.0.
using System;
using System.ComponentModel;
using System.Numerics;
using System.Runtime.CompilerServices;
using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation;
namespace SixLabors.ImageSharp.ColorSpaces
{
/// <summary>
/// Represents an linear Rgb color with specified <see cref="IRgbWorkingSpace"/> working space
/// Represents an linear Rgb color with specified <see cref="RgbWorkingSpace"/> working space
/// </summary>
internal readonly struct LinearRgb : IColorVector, IEquatable<LinearRgb>, IAlmostEquatable<LinearRgb, float>
{
/// <summary>
/// The default LinearRgb working space.
/// </summary>
public static readonly IRgbWorkingSpace DefaultWorkingSpace = RgbWorkingSpaces.SRgb;
public static readonly RgbWorkingSpace DefaultWorkingSpace = RgbWorkingSpaces.SRgb;
/// <summary>
/// The backing vector for SIMD support.
@ -43,7 +43,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <param name="b">The blue component ranging between 0 and 1.</param>
/// <param name="workingSpace">The rgb working space.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LinearRgb(float r, float g, float b, IRgbWorkingSpace workingSpace)
public LinearRgb(float r, float g, float b, RgbWorkingSpace workingSpace)
: this(new Vector3(r, g, b), workingSpace)
{
}
@ -64,7 +64,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <param name="vector">The vector representing the r, g, b components.</param>
/// <param name="workingSpace">The LinearRgb working space.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LinearRgb(Vector3 vector, IRgbWorkingSpace workingSpace)
public LinearRgb(Vector3 vector, RgbWorkingSpace workingSpace)
: this()
{
// Clamp to 0-1 range.
@ -105,7 +105,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <summary>
/// Gets the LinearRgb color space <seealso cref="RgbWorkingSpaces"/>
/// </summary>
public IRgbWorkingSpace WorkingSpace { get; }
public RgbWorkingSpace WorkingSpace { get; }
/// <inheritdoc />
public Vector3 Vector => this.backingVector;

13
src/ImageSharp/ColorSpaces/Rgb.cs

@ -2,23 +2,22 @@
// Licensed under the Apache License, Version 2.0.
using System;
using System.ComponentModel;
using System.Numerics;
using System.Runtime.CompilerServices;
using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation;
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.ColorSpaces
{
/// <summary>
/// Represents an RGB color with specified <see cref="IRgbWorkingSpace"/> working space
/// Represents an RGB color with specified <see cref="RgbWorkingSpace"/> working space
/// </summary>
internal readonly struct Rgb : IColorVector, IEquatable<Rgb>, IAlmostEquatable<Rgb, float>
{
/// <summary>
/// The default rgb working space
/// </summary>
public static readonly IRgbWorkingSpace DefaultWorkingSpace = RgbWorkingSpaces.SRgb;
public static readonly RgbWorkingSpace DefaultWorkingSpace = RgbWorkingSpaces.SRgb;
/// <summary>
/// The backing vector for SIMD support.
@ -45,7 +44,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <param name="b">The blue component ranging between 0 and 1.</param>
/// <param name="workingSpace">The rgb working space.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Rgb(float r, float g, float b, IRgbWorkingSpace workingSpace)
public Rgb(float r, float g, float b, RgbWorkingSpace workingSpace)
: this(new Vector3(r, g, b), workingSpace)
{
}
@ -66,7 +65,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <param name="vector">The vector representing the r, g, b components.</param>
/// <param name="workingSpace">The rgb working space.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Rgb(Vector3 vector, IRgbWorkingSpace workingSpace)
public Rgb(Vector3 vector, RgbWorkingSpace workingSpace)
: this()
{
// Clamp to 0-1 range.
@ -107,7 +106,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <summary>
/// Gets the Rgb color space <seealso cref="RgbWorkingSpaces"/>
/// </summary>
public IRgbWorkingSpace WorkingSpace { get; }
public RgbWorkingSpace WorkingSpace { get; }
/// <inheritdoc />
public Vector3 Vector => this.backingVector;

2
src/ImageSharp/Common/Constants.cs

@ -18,4 +18,4 @@ namespace SixLabors.ImageSharp
/// </summary>
public static readonly float EpsilonSquared = Epsilon * Epsilon;
}
}
}

2
src/ImageSharp/Common/Extensions/Vector4Extensions.cs

@ -110,4 +110,4 @@ namespace SixLabors.ImageSharp
return MathF.Pow((signal + 0.055F) / 1.055F, 2.4F);
}
}
}
}

2
src/ImageSharp/Formats/Bmp/IBmpEncoderOptions.cs

@ -14,4 +14,4 @@ namespace SixLabors.ImageSharp.Formats.Bmp
/// </summary>
BmpBitsPerPixel BitsPerPixel { get; }
}
}
}

2
src/ImageSharp/Formats/Gif/DisposalMethod.cs

@ -35,4 +35,4 @@ namespace SixLabors.ImageSharp.Formats.Gif
/// </summary>
RestoreToPrevious = 3
}
}
}

2
src/ImageSharp/IConfigurationModule.cs

@ -14,4 +14,4 @@ namespace SixLabors.ImageSharp
/// <param name="configuration">The configuration that will retain the encoders, decodes and mime type detectors.</param>
void Configure(Configuration configuration);
}
}
}

10
src/ImageSharp/ImageFrame{TPixel}.cs

@ -174,16 +174,10 @@ namespace SixLabors.ImageSharp
public TPixel this[int x, int y]
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return this.PixelBuffer[x, y];
}
get => this.PixelBuffer[x, y];
[MethodImpl(MethodImplOptions.AggressiveInlining)]
set
{
this.PixelBuffer[x, y] = value;
}
set => this.PixelBuffer[x, y] = value;
}
/// <summary>

2
src/ImageSharp/ImageInfoExtensions.cs

@ -24,4 +24,4 @@ namespace SixLabors.ImageSharp
/// <returns>The <see cref="Rectangle"/></returns>
public static Rectangle Bounds(this IImageInfo info) => new Rectangle(0, 0, info.Width, info.Height);
}
}
}

2
src/ImageSharp/Memory/ArrayPoolMemoryAllocator.cs

@ -9,7 +9,7 @@ namespace SixLabors.Memory
/// <summary>
/// Implements <see cref="MemoryAllocator"/> by allocating memory from <see cref="ArrayPool{T}"/>.
/// </summary>
public partial class ArrayPoolMemoryAllocator : MemoryAllocator
public sealed partial class ArrayPoolMemoryAllocator : MemoryAllocator
{
/// <summary>
/// The <see cref="ArrayPool{T}"/> for small-to-medium buffers which is not kept clean.

2
src/ImageSharp/Memory/BasicByteBuffer.cs

@ -3,7 +3,7 @@
namespace SixLabors.Memory
{
internal class BasicByteBuffer : BasicArrayBuffer<byte>, IManagedByteBuffer
internal sealed class BasicByteBuffer : BasicArrayBuffer<byte>, IManagedByteBuffer
{
internal BasicByteBuffer(byte[] array)
: base(array)

2
src/ImageSharp/Memory/Buffer2D{T}.cs

@ -12,7 +12,7 @@ namespace SixLabors.Memory
/// interpreted as a 2D region of <see cref="Width"/> x <see cref="Height"/> elements.
/// </summary>
/// <typeparam name="T">The value type.</typeparam>
internal class Buffer2D<T> : IDisposable
internal sealed class Buffer2D<T> : IDisposable
where T : struct
{
/// <summary>

2
src/ImageSharp/Memory/ManagedBufferBase.cs

@ -9,7 +9,7 @@ namespace SixLabors.Memory
/// <summary>
/// Provides a base class for <see cref="IBuffer{T}"/> implementations by implementing pinning logic for <see cref="MemoryManager{T}"/> adaption.
/// </summary>
internal abstract class ManagedBufferBase<T> : System.Buffers.MemoryManager<T>, IBuffer<T>
internal abstract class ManagedBufferBase<T> : MemoryManager<T>, IBuffer<T>
where T : struct
{
private GCHandle pinHandle;

4
src/ImageSharp/Memory/SimpleGcMemoryAllocator.cs

@ -3,7 +3,7 @@
/// <summary>
/// Implements <see cref="MemoryAllocator"/> by newing up arrays by the GC on every allocation requests.
/// </summary>
public class SimpleGcMemoryAllocator : MemoryAllocator
public sealed class SimpleGcMemoryAllocator : MemoryAllocator
{
/// <inheritdoc />
internal override IBuffer<T> Allocate<T>(int length, bool clear)
@ -16,4 +16,4 @@
return new BasicByteBuffer(new byte[length]);
}
}
}
}

2
src/ImageSharp/MetaData/ImageFrameMetaData.cs

@ -56,4 +56,4 @@ namespace SixLabors.ImageSharp.MetaData
return new ImageFrameMetaData(this);
}
}
}
}

2
src/ImageSharp/MetaData/ImageProperty.cs

@ -136,4 +136,4 @@ namespace SixLabors.ImageSharp.MetaData
return this.Name.Equals(other.Name) && Equals(this.Value, other.Value);
}
}
}
}

7
src/ImageSharp/MetaData/Profiles/Exif/ExifValue.cs

@ -147,12 +147,7 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Exif
/// </returns>
public static bool operator ==(ExifValue left, ExifValue right)
{
if (ReferenceEquals(left, right))
{
return true;
}
return left.Equals(right);
return ReferenceEquals(left, right) || left.Equals(right);
}
/// <summary>

5
src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.cs

@ -35,10 +35,7 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
/// <summary>
/// Gets the length in bytes of the raw data
/// </summary>
public int DataLength
{
get { return this.data.Length; }
}
public int DataLength => this.data.Length;
/// <summary>
/// Sets the reading position to the given value

2
src/ImageSharp/MetaData/Profiles/ICC/IccReader.cs

@ -146,4 +146,4 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
return table.ToArray();
}
}
}
}

2
src/ImageSharp/MetaData/Profiles/ICC/IccWriter.cs

@ -93,4 +93,4 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
return table.ToArray();
}
}
}
}

88
tests/ImageSharp.Benchmarks/Codecs/Jpeg/LoadResizeSave.cs

@ -0,0 +1,88 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
using System;
using System.IO;
using SixLabors.ImageSharp.Tests;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using SixLabors.ImageSharp.Processing;
using SDImage = System.Drawing.Image;
using SixLabors.ImageSharp.Formats.Jpeg;
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
[Config(typeof(Config.ShortClr))]
public class LoadResizeSave : BenchmarkBase
{
private readonly Configuration configuration = new Configuration(new JpegConfigurationModule());
private byte[] sourceBytes;
private byte[] destBytes;
private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.TestImage);
[Params(
TestImages.Jpeg.Baseline.Jpeg420Exif
//, TestImages.Jpeg.Baseline.Calliphora
)]
public string TestImage { get; set; }
[Params(false, true)]
public bool EnableParallelExecution { get; set; }
[GlobalSetup]
public void Setup()
{
this.configuration.ParallelOptions.MaxDegreeOfParallelism =
this.EnableParallelExecution ? Environment.ProcessorCount : 1;
if (this.sourceBytes == null)
{
this.sourceBytes = File.ReadAllBytes(this.TestImageFullPath);
}
if (this.destBytes == null)
{
this.destBytes = new byte[this.sourceBytes.Length];
}
}
[Benchmark(Baseline = true)]
public void SystemDrawing()
{
using (var sourceStream = new MemoryStream(this.sourceBytes))
using (var destStream = new MemoryStream(this.destBytes))
using (var source = SDImage.FromStream(sourceStream))
using (var destination = new Bitmap(source.Width / 4, source.Height / 4))
{
using (var graphics = Graphics.FromImage(destination))
{
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.DrawImage(source, 0, 0, 400, 400);
}
destination.Save(destStream, ImageFormat.Jpeg);
}
}
[Benchmark]
public void ImageSharp()
{
using (var source = Image.Load(
this.configuration,
this.sourceBytes,
new JpegDecoder { IgnoreMetadata = true }))
using (var destStream = new MemoryStream(this.destBytes))
{
source.Mutate(c => c.Resize(source.Width / 4, source.Height / 4));
source.SaveAsJpeg(destStream);
}
}
}
}

2
tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj

@ -17,7 +17,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.10.14" />
<PackageReference Include="Colourful" Version="1.2.2" />
<PackageReference Include="Colourful" Version="2.0.0" />
<PackageReference Include="SixLabors.Shapes.Text" Version="1.0.0-dev000081" />
<PackageReference Include="System.Drawing.Common" Version="4.5.0" />
</ItemGroup>

36
tests/ImageSharp.Benchmarks/Samplers/Resize.cs

@ -3,20 +3,38 @@
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace SixLabors.ImageSharp.Benchmarks
{
using System.Drawing;
using System.Drawing.Drawing2D;
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using CoreSize = SixLabors.Primitives.Size;
namespace SixLabors.ImageSharp.Benchmarks
{
using System.Threading.Tasks;
using CoreSize = SixLabors.Primitives.Size;
using SixLabors.ImageSharp.Formats.Jpeg;
[Config(typeof(Config.ShortClr))]
public class Resize : BenchmarkBase
{
private readonly Configuration configuration = new Configuration(new JpegConfigurationModule());
[Params(false, true)]
public bool EnableParallelExecution { get; set; }
[GlobalSetup]
public void Setup()
{
this.configuration.ParallelOptions.MaxDegreeOfParallelism =
this.EnableParallelExecution ? Environment.ProcessorCount : 1;
}
[Benchmark(Baseline = true, Description = "System.Drawing Resize")]
public Size ResizeSystemDrawing()
{
@ -40,7 +58,7 @@ namespace SixLabors.ImageSharp.Benchmarks
[Benchmark(Description = "ImageSharp Resize")]
public CoreSize ResizeCore()
{
using (Image<Rgba32> image = new Image<Rgba32>(2000, 2000))
using (var image = new Image<Rgba32>(this.configuration, 2000, 2000))
{
image.Mutate(x => x.Resize(400, 400));
return new CoreSize(image.Width, image.Height);

8
tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs

@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp.Tests
IEqualityComparer<CieXyChromaticityCoordinates>,
IEqualityComparer<RgbPrimariesChromaticityCoordinates>,
IEqualityComparer<CieXyz>,
IEqualityComparer<IRgbWorkingSpace>
IEqualityComparer<RgbWorkingSpace>
{
private readonly float Eps;
@ -76,9 +76,9 @@ namespace SixLabors.ImageSharp.Tests
throw new NotImplementedException();
}
public bool Equals(IRgbWorkingSpace x, IRgbWorkingSpace y)
public bool Equals(RgbWorkingSpace x, RgbWorkingSpace y)
{
if (x is IRgbWorkingSpace g1 && y is IRgbWorkingSpace g2)
if (x is RgbWorkingSpace g1 && y is RgbWorkingSpace g2)
{
return this.Equals(g1.WhitePoint, g2.WhitePoint)
&& this.Equals(g1.ChromaticityCoordinates, g2.ChromaticityCoordinates);
@ -88,7 +88,7 @@ namespace SixLabors.ImageSharp.Tests
&& this.Equals(x.ChromaticityCoordinates, y.ChromaticityCoordinates);
}
public int GetHashCode(IRgbWorkingSpace obj)
public int GetHashCode(RgbWorkingSpace obj)
{
throw new NotImplementedException();
}

Loading…
Cancel
Save