Browse Source

Merge pull request #1999 from SixLabors/af/contiguous-load

Respect PreferContiguousImageBuffers in decoders
pull/2022/head
Anton Firszov 4 years ago
committed by GitHub
parent
commit
f24b02f31c
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConverter{TPixel}.cs
  2. 6
      src/ImageSharp/Image.Decode.cs
  3. 38
      tests/ImageSharp.Tests/Image/LargeImageIntegrationTests.cs

5
src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConverter{TPixel}.cs

@ -111,7 +111,10 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
this.pixelRowsPerStep = majorVerticalSamplingFactor * blockPixelHeight;
// pixel buffer for resulting image
this.pixelBuffer = allocator.Allocate2D<TPixel>(frame.PixelWidth, frame.PixelHeight);
this.pixelBuffer = allocator.Allocate2D<TPixel>(
frame.PixelWidth,
frame.PixelHeight,
this.configuration.PreferContiguousImageBuffers);
this.paddedProxyPixelRow = allocator.Allocate<TPixel>(frame.PixelWidth + 3);
// component processors from spectral to Rgba32

6
src/ImageSharp/Image.Decode.cs

@ -37,8 +37,10 @@ namespace SixLabors.ImageSharp
ImageMetadata metadata)
where TPixel : unmanaged, IPixel<TPixel>
{
Buffer2D<TPixel> uninitializedMemoryBuffer =
configuration.MemoryAllocator.Allocate2D<TPixel>(width, height);
Buffer2D<TPixel> uninitializedMemoryBuffer = configuration.MemoryAllocator.Allocate2D<TPixel>(
width,
height,
configuration.PreferContiguousImageBuffers);
return new Image<TPixel>(configuration, uninitializedMemoryBuffer.FastMemoryGroup, width, height, metadata);
}

38
tests/ImageSharp.Tests/Image/LargeImageIntegrationTests.cs

@ -2,7 +2,10 @@
// Licensed under the Apache License, Version 2.0.
using System;
using System.IO;
using Microsoft.DotNet.RemoteExecutor;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
@ -32,9 +35,40 @@ namespace SixLabors.ImageSharp.Tests
Configuration configuration = Configuration.Default.Clone();
configuration.PreferContiguousImageBuffers = true;
using var image = new Image<Rgba32>(configuration, 8192, 4096);
using var image = new Image<Rgba32>(configuration, 2048, 2048);
Assert.True(image.DangerousTryGetSinglePixelMemory(out Memory<Rgba32> mem));
Assert.Equal(8192 * 4096, mem.Length);
Assert.Equal(2048 * 2048, mem.Length);
}
}
[Theory]
[InlineData("bmp")]
[InlineData("png")]
[InlineData("jpeg")]
[InlineData("gif")]
[InlineData("tiff")]
[InlineData("webp")]
public void PreferContiguousImageBuffers_LoadImage_BufferIsContiguous(string formatOuter)
{
// Run remotely to avoid large allocation in the test process:
RemoteExecutor.Invoke(RunTest, formatOuter).Dispose();
static void RunTest(string formatInner)
{
Configuration configuration = Configuration.Default.Clone();
configuration.PreferContiguousImageBuffers = true;
IImageEncoder encoder = configuration.ImageFormatsManager.FindEncoder(
configuration.ImageFormatsManager.FindFormatByFileExtension(formatInner));
string dir = TestEnvironment.CreateOutputDirectory(".Temp");
string path = Path.Combine(dir, $"{Guid.NewGuid().ToString()}.{formatInner}");
using (Image<Rgba32> temp = new(2048, 2048))
{
temp.Save(path, encoder);
}
using var image = Image.Load<Rgba32>(configuration, path);
File.Delete(path);
Assert.Equal(1, image.GetPixelMemoryGroup().Count);
}
}

Loading…
Cancel
Save