Browse Source

Resizing converter no longer depends on avx converter only

pull/2076/head
Dmitry Pentin 4 years ago
parent
commit
a10be094f0
  1. 5
      src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterAvx.cs
  2. 9
      src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterBase.cs
  3. 4
      src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterScalar.cs
  4. 6
      src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterVector.cs
  5. 12
      src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConversion/ResizingSpectralConverter{TPixel}.cs

5
src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterAvx.cs

@ -1,6 +1,7 @@
// Copyright (c) Six Labors.
// Licensed under the Apache License, Version 2.0.
#if SUPPORTS_RUNTIME_INTRINSICS
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;
namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
@ -25,7 +26,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
{
}
public override bool IsAvailable => Avx.IsSupported;
public sealed override bool IsAvailable => Avx.IsSupported;
public sealed override int ElementsPerBatch => Vector256<float>.Count;
}
}
}

9
src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterBase.cs

@ -35,6 +35,15 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
/// </summary>
public abstract bool IsAvailable { get; }
/// <summary>
/// Gets a value indicating how many pixels are processed in a single batch.
/// </summary>
/// <remarks>
/// This generaly should be equal to register size,
/// e.g. 1 for scalar implementation, 8 for AVX implementation and so on.
/// </remarks>
public abstract int ElementsPerBatch { get; }
/// <summary>
/// Gets the <see cref="JpegColorSpace"/> of this converter.
/// </summary>

4
src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterScalar.cs

@ -16,7 +16,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
{
}
public override bool IsAvailable => true;
public sealed override bool IsAvailable => true;
public sealed override int ElementsPerBatch => 1;
}
}
}

6
src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterVector.cs

@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
/// Even though real life data is guaranteed to be of size
/// divisible by 8 newer SIMD instructions like AVX512 won't work with
/// such data out of the box. These converters have fallback code
/// for 'remainder' data.
/// for remainder data.
/// </remarks>
internal abstract class JpegColorConverterVector : JpegColorConverterBase
{
@ -28,7 +28,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
public sealed override bool IsAvailable => Vector.IsHardwareAccelerated && Vector<float>.Count % 4 == 0;
public override void ConvertToRgbInplace(in ComponentValues values)
public sealed override int ElementsPerBatch => Vector<float>.Count;
public sealed override void ConvertToRgbInplace(in ComponentValues values)
{
DebugGuard.IsTrue(this.IsAvailable, $"{this.GetType().Name} converter is not supported on current hardware.");

12
src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConversion/ResizingSpectralConverter{TPixel}.cs

@ -91,10 +91,13 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
int blockPixelSize = 8 / scaleDenominator;
this.pixelRowsPerStep = majorVerticalSamplingFactor * blockPixelSize;
// BUFFER SIZE MUST BE DIVISIBLE BY 8 ATM
// TODO: fix this mess
// color converter
JpegColorConverterBase converter = this.GetColorConverter(frame, jpegData);
this.colorConverter = converter;
int bufferWidth = majorBlockWidth * blockPixelSize;
int correctedBufferWidth = bufferWidth + (8 - (bufferWidth % 8));
int batchSize = converter.ElementsPerBatch;
int correctedBufferWidth = bufferWidth + (batchSize - (bufferWidth % batchSize));
var postProcessorBufferSize = new Size(correctedBufferWidth, this.pixelRowsPerStep);
this.componentProcessors = new JpegComponentPostProcessor8[frame.Components.Length];
@ -102,9 +105,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
{
this.componentProcessors[i] = new JpegComponentPostProcessor8(allocator, frame, jpegData, postProcessorBufferSize, frame.Components[i]);
}
// color converter
this.colorConverter = this.GetColorConverter(frame, jpegData);
}
public override void ConvertStrideBaseline()

Loading…
Cancel
Save