Browse Source

Update tests, fix issues

pull/2588/head
James Jackson-South 3 years ago
parent
commit
4b852e6528
  1. 50
      src/ImageSharp/Formats/AnimationUtilities.cs
  2. 2
      src/ImageSharp/Formats/Gif/MetadataExtensions.cs
  3. 2
      src/ImageSharp/Formats/Png/Chunks/PngPhysical.cs
  4. 31
      src/ImageSharp/Formats/Png/PngDecoderCore.cs
  5. 14
      src/ImageSharp/Formats/Png/PngEncoderCore.cs
  6. 2
      src/ImageSharp/Formats/Png/PngMetadata.cs
  7. 14
      src/ImageSharp/Formats/Webp/Chunks/WebpFrameData.cs
  8. 2
      src/ImageSharp/Formats/Webp/MetadataExtensions.cs
  9. 2
      src/ImageSharp/Formats/Webp/WebpAnimationDecoder.cs
  10. 4
      src/ImageSharp/Formats/Webp/WebpBlendMethod.cs
  11. 4
      src/ImageSharp/Formats/Webp/WebpCommonUtils.cs
  12. 25
      src/ImageSharp/Formats/Webp/WebpEncoderCore.cs
  13. 4
      src/ImageSharp/Formats/Webp/WebpFrameMetadata.cs
  14. 14
      tests/ImageSharp.Tests/Formats/GeneralFormatTests.cs
  15. 9
      tests/ImageSharp.Tests/Formats/Gif/GifEncoderTests.cs
  16. 11
      tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs
  17. 10
      tests/ImageSharp.Tests/Formats/WebP/WebpEncoderTests.cs
  18. 4
      tests/ImageSharp.Tests/TestUtilities/ImagingTestCaseUtility.cs
  19. 2
      tests/Images/External/ReferenceOutput/BmpEncoderTests/Encode_8BitColor_WithOctreeQuantizer_rgb32.bmp
  20. 2
      tests/Images/External/ReferenceOutput/BmpEncoderTests/Encode_8BitColor_WithWuQuantizer_rgb32.bmp
  21. 4
      tests/Images/External/ReferenceOutput/DitherTests/ApplyDiffusionFilterInBox_Rgba32_CalliphoraPartial.png
  22. 4
      tests/Images/External/ReferenceOutput/DitherTests/ApplyDitherFilterInBox_Rgba32_CalliphoraPartial.png
  23. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_ShouldNotDependOnSinglePixelType_Bgra32_filter0.png
  24. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_ShouldNotDependOnSinglePixelType_Rgb24_filter0.png
  25. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_ShouldNotDependOnSinglePixelType_Rgba32_filter0.png
  26. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_ShouldNotDependOnSinglePixelType_RgbaVector_filter0.png
  27. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_Atkinson.png
  28. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_Burks.png
  29. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_FloydSteinberg.png
  30. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_JarvisJudiceNinke.png
  31. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_Sierra2.png
  32. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_Sierra3.png
  33. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_SierraLite.png
  34. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_StevensonArce.png
  35. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_Stucki.png
  36. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_Atkinson.png
  37. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_Burks.png
  38. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_FloydSteinberg.png
  39. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_JarvisJudiceNinke.png
  40. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_Sierra2.png
  41. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_Sierra3.png
  42. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_SierraLite.png
  43. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_StevensonArce.png
  44. 4
      tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_Stucki.png
  45. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_ShouldNotDependOnSinglePixelType_Bgra32_filter0.png
  46. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_ShouldNotDependOnSinglePixelType_Rgb24_filter0.png
  47. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_ShouldNotDependOnSinglePixelType_Rgba32_filter0.png
  48. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_ShouldNotDependOnSinglePixelType_RgbaVector_filter0.png
  49. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_Bike_Bayer16x16.png
  50. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_Bike_Bayer2x2.png
  51. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_Bike_Bayer4x4.png
  52. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_Bike_Bayer8x8.png
  53. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_Bike_Ordered3x3.png
  54. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_CalliphoraPartial_Bayer16x16.png
  55. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_CalliphoraPartial_Bayer2x2.png
  56. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_CalliphoraPartial_Bayer4x4.png
  57. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_CalliphoraPartial_Bayer8x8.png
  58. 4
      tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_CalliphoraPartial_Ordered3x3.png
  59. 4
      tests/Images/External/ReferenceOutput/PngEncoderTests/Issue2469_Quantized_Encode_Artifacts_Rgba32_issue_2469.png
  60. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_OctreeQuantizer_ErrorDither.png
  61. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_OctreeQuantizer_NoDither.png
  62. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_OctreeQuantizer_OrderedDither.png
  63. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WebSafePaletteQuantizer_ErrorDither.png
  64. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WebSafePaletteQuantizer_NoDither.png
  65. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WebSafePaletteQuantizer_OrderedDither.png
  66. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WernerPaletteQuantizer_ErrorDither.png
  67. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WernerPaletteQuantizer_NoDither.png
  68. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WernerPaletteQuantizer_OrderedDither.png
  69. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WuQuantizer_ErrorDither.png
  70. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WuQuantizer_NoDither.png
  71. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WuQuantizer_OrderedDither.png
  72. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_OctreeQuantizer_ErrorDither.png
  73. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_OctreeQuantizer_NoDither.png
  74. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_OctreeQuantizer_OrderedDither.png
  75. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WebSafePaletteQuantizer_ErrorDither.png
  76. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WebSafePaletteQuantizer_NoDither.png
  77. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WebSafePaletteQuantizer_OrderedDither.png
  78. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WernerPaletteQuantizer_ErrorDither.png
  79. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WernerPaletteQuantizer_NoDither.png
  80. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WernerPaletteQuantizer_OrderedDither.png
  81. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WuQuantizer_ErrorDither.png
  82. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WuQuantizer_NoDither.png
  83. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WuQuantizer_OrderedDither.png
  84. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_ErrorDither_0.25.png
  85. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_ErrorDither_0.5.png
  86. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_ErrorDither_0.75.png
  87. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_ErrorDither_0.png
  88. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_ErrorDither_1.png
  89. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_OrderedDither_0.25.png
  90. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_OrderedDither_0.5.png
  91. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_OrderedDither_0.75.png
  92. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_OrderedDither_0.png
  93. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_OrderedDither_1.png
  94. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_ErrorDither_0.25.png
  95. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_ErrorDither_0.5.png
  96. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_ErrorDither_0.75.png
  97. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_ErrorDither_0.png
  98. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_ErrorDither_1.png
  99. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_OrderedDither_0.25.png
  100. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_OrderedDither_0.5.png

50
src/ImageSharp/Formats/AnimationUtilities.cs

@ -27,15 +27,19 @@ internal static class AnimationUtilities
/// <param name="currentFrame">The current frame.</param>
/// <param name="resultFrame">The resultant output.</param>
/// <param name="replacement">The value to use when replacing duplicate pixels.</param>
/// <param name="clampingMode">The clamping bound to apply when calculating difference bounds.</param>
/// <returns>The <see cref="ValueTuple{Boolean, Rectangle}"/> representing the operation result.</returns>
public static (bool Difference, Rectangle Bounds) DeDuplicatePixels<TPixel>(
Configuration configuration,
ImageFrame<TPixel>? previousFrame,
ImageFrame<TPixel> currentFrame,
ImageFrame<TPixel> resultFrame,
Vector4 replacement)
Vector4 replacement,
ClampingMode clampingMode = ClampingMode.None)
where TPixel : unmanaged, IPixel<TPixel>
{
// TODO: This would be faster (but more complicated to find diff bounds) if we operated on Rgba32.
// If someone wants to do that, they have my unlimited thanks.
MemoryAllocator memoryAllocator = configuration.MemoryAllocator;
IMemoryOwner<Vector4> buffers = memoryAllocator.Allocate<Vector4>(currentFrame.Width * 3, AllocationOptions.Clean);
Span<Vector4> previous = buffers.GetSpan()[..currentFrame.Width];
@ -78,10 +82,11 @@ internal static class AnimationUtilities
Vector256<float> c = Unsafe.Add(ref currentBase, x);
// Compare the previous and current pixels
Vector256<float> neq = Avx.CompareEqual(p, c);
Vector256<int> mask = neq.AsInt32();
Vector256<int> mask = Avx2.CompareEqual(p.AsInt32(), c.AsInt32());
mask = Avx2.CompareEqual(mask.AsInt64(), Vector256<long>.AllBitsSet).AsInt32();
mask = Avx2.And(mask, Avx2.Shuffle(mask, 0b_01_00_11_10)).AsInt32();
neq = Avx.Xor(neq, Vector256<float>.AllBitsSet);
Vector256<int> neq = Avx2.Xor(mask.AsInt64(), Vector256<long>.AllBitsSet).AsInt32();
int m = Avx2.MoveMask(neq.AsByte());
if (m != 0)
{
@ -95,11 +100,7 @@ internal static class AnimationUtilities
hasDiff = true;
}
// Capture the original alpha values.
mask = Avx2.HorizontalAdd(mask, mask);
mask = Avx2.HorizontalAdd(mask, mask);
mask = Avx2.CompareEqual(mask, Vector256.Create(-4));
// Replace the pixel value with the replacement if the full pixel is matched.
Vector256<float> r = Avx.BlendVariable(c, replacement256, mask.AsSingle());
Unsafe.Add(ref resultBase, x) = r;
@ -153,6 +154,37 @@ internal static class AnimationUtilities
Numerics.Clamp(right, left + 1, resultFrame.Width),
Numerics.Clamp(bottom, top + 1, resultFrame.Height));
// Webp requires even bounds
if (clampingMode == ClampingMode.Even)
{
bounds.Width = Math.Min(resultFrame.Width, bounds.Width + (bounds.X & 1));
bounds.Height = Math.Min(resultFrame.Height, bounds.Height + (bounds.Y & 1));
bounds.X = Math.Max(0, bounds.X - (bounds.X & 1));
bounds.Y = Math.Max(0, bounds.Y - (bounds.Y & 1));
}
return new(hasDiff, bounds);
}
public static void CopySource<TPixel>(ImageFrame<TPixel> source, ImageFrame<TPixel> destination, Rectangle bounds)
where TPixel : unmanaged, IPixel<TPixel>
{
Buffer2DRegion<TPixel> sourceBuffer = source.PixelBuffer.GetRegion(bounds);
Buffer2DRegion<TPixel> destBuffer = destination.PixelBuffer.GetRegion(bounds);
for (int y = 0; y < destination.Height; y++)
{
Span<TPixel> sourceRow = sourceBuffer.DangerousGetRowSpan(y);
Span<TPixel> destRow = destBuffer.DangerousGetRowSpan(y);
sourceRow.CopyTo(destRow);
}
}
}
#pragma warning disable SA1201 // Elements should appear in the correct order
internal enum ClampingMode
#pragma warning restore SA1201 // Elements should appear in the correct order
{
None,
Even,
}

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

@ -83,7 +83,7 @@ public static partial class MetadataExtensions
ColorTableMode = source.ColorTableMode == GifColorTableMode.Global ? FrameColorTableMode.Global : FrameColorTableMode.Local,
Duration = TimeSpan.FromMilliseconds(source.FrameDelay * 10),
DisposalMode = GetMode(source.DisposalMethod),
BlendMode = FrameBlendMode.Over,
BlendMode = source.DisposalMethod == GifDisposalMethod.RestoreToBackground ? FrameBlendMode.Source : FrameBlendMode.Over,
};
private static FrameDisposalMode GetMode(GifDisposalMethod method) => method switch

2
src/ImageSharp/Formats/Png/Chunks/PngPhysical.cs

@ -61,10 +61,10 @@ internal readonly struct PngPhysical
/// <returns>The constructed PngPhysicalChunkData instance.</returns>
public static PngPhysical FromMetadata(ImageMetadata meta)
{
byte unitSpecifier = 0;
uint x;
uint y;
byte unitSpecifier;
switch (meta.ResolutionUnits)
{
case PixelResolutionUnit.AspectRatio:

31
src/ImageSharp/Formats/Png/PngDecoderCore.cs

@ -217,7 +217,7 @@ internal sealed class PngDecoderCore : IImageDecoderInternals
chunk.Length - 4,
currentFrame,
pngMetadata,
this.ReadNextDataChunkAndSkipSeq,
this.ReadNextFrameDataChunk,
currentFrameControl.Value,
cancellationToken);
@ -1719,19 +1719,34 @@ internal sealed class PngDecoderCore : IImageDecoderInternals
}
/// <summary>
/// Reads the next data chunk and skip sequence number.
/// Reads the next animated frame data chunk.
/// </summary>
/// <returns>Count of bytes in the next data chunk, or 0 if there are no more data chunks left.</returns>
private int ReadNextDataChunkAndSkipSeq()
private int ReadNextFrameDataChunk()
{
int length = this.ReadNextDataChunk();
if (this.ReadNextDataChunk() is 0)
if (this.nextChunk != null)
{
return length;
return 0;
}
this.currentStream.Position += 4; // Skip sequence number
return length - 4;
Span<byte> buffer = stackalloc byte[20];
_ = this.currentStream.Read(buffer, 0, 4);
if (this.TryReadChunk(buffer, out PngChunk chunk))
{
if (chunk.Type is PngChunkType.FrameData)
{
chunk.Data?.Dispose();
this.currentStream.Position += 4; // Skip sequence number
return chunk.Length - 4;
}
this.nextChunk = chunk;
}
return 0;
}
/// <summary>

14
src/ImageSharp/Formats/Png/PngEncoderCore.cs

@ -214,6 +214,16 @@ internal sealed class PngEncoderCore : IImageEncoderInternals, IDisposable
ImageFrame<TPixel>? prev = previousDisposal == PngDisposalMethod.RestoreToBackground ? null : previousFrame;
(bool difference, Rectangle bounds) = AnimationUtilities.DeDuplicatePixels(image.Configuration, prev, currentFrame, encodingFrame, Vector4.Zero);
if (difference && previousDisposal != PngDisposalMethod.RestoreToBackground)
{
if (frameMetadata.BlendMethod == PngBlendMethod.Source)
{
// We've potentially introduced transparency within our area of interest
// so we need to overwrite the changed area with the full data.
AnimationUtilities.CopySource(currentFrame, encodingFrame, bounds);
}
}
if (clearTransparency)
{
ClearTransparentPixels(encodingFrame);
@ -258,7 +268,7 @@ internal sealed class PngEncoderCore : IImageEncoderInternals, IDisposable
{
if (image.Metadata.TryGetPngMetadata(out PngMetadata? png))
{
return png;
return (PngMetadata)png.DeepClone();
}
if (image.Metadata.TryGetGifMetadata(out GifMetadata? gif))
@ -282,7 +292,7 @@ internal sealed class PngEncoderCore : IImageEncoderInternals, IDisposable
{
if (frame.Metadata.TryGetPngMetadata(out PngFrameMetadata? png))
{
return png;
return (PngFrameMetadata)png.DeepClone();
}
if (frame.Metadata.TryGetGifMetadata(out GifFrameMetadata? gif))

2
src/ImageSharp/Formats/Png/PngMetadata.cs

@ -100,7 +100,7 @@ public class PngMetadata : IDeepCloneable
if (c == metadata.BackgroundColor)
{
// Png treats background as fully empty
c = default;
c = Color.Transparent;
break;
}
}

14
src/ImageSharp/Formats/Webp/Chunks/WebpFrameData.cs

@ -12,7 +12,7 @@ internal readonly struct WebpFrameData
/// </summary>
public const uint HeaderSize = 16;
public WebpFrameData(uint dataSize, uint x, uint y, uint width, uint height, uint duration, WebpBlendingMethod blendingMethod, WebpDisposalMethod disposalMethod)
public WebpFrameData(uint dataSize, uint x, uint y, uint width, uint height, uint duration, WebpBlendMethod blendingMethod, WebpDisposalMethod disposalMethod)
{
this.DataSize = dataSize;
this.X = x;
@ -32,12 +32,12 @@ internal readonly struct WebpFrameData
width,
height,
duration,
(flags & 2) == 0 ? WebpBlendingMethod.Over : WebpBlendingMethod.Source,
(flags & 2) == 0 ? WebpBlendMethod.Over : WebpBlendMethod.Source,
(flags & 1) == 1 ? WebpDisposalMethod.RestoreToBackground : WebpDisposalMethod.DoNotDispose)
{
}
public WebpFrameData(uint x, uint y, uint width, uint height, uint duration, WebpBlendingMethod blendingMethod, WebpDisposalMethod disposalMethod)
public WebpFrameData(uint x, uint y, uint width, uint height, uint duration, WebpBlendMethod blendingMethod, WebpDisposalMethod disposalMethod)
: this(0, x, y, width, height, duration, blendingMethod, disposalMethod)
{
}
@ -76,7 +76,7 @@ internal readonly struct WebpFrameData
/// <summary>
/// Gets how transparent pixels of the current frame are to be blended with corresponding pixels of the previous canvas.
/// </summary>
public WebpBlendingMethod BlendingMethod { get; }
public WebpBlendMethod BlendingMethod { get; }
/// <summary>
/// Gets how the current frame is to be treated after it has been displayed (before rendering the next frame) on the canvas.
@ -93,7 +93,7 @@ internal readonly struct WebpFrameData
{
byte flags = 0;
if (this.BlendingMethod is WebpBlendingMethod.Source)
if (this.BlendingMethod is WebpBlendMethod.Source)
{
// Set blending flag.
flags |= 2;
@ -107,8 +107,8 @@ internal readonly struct WebpFrameData
long pos = RiffHelper.BeginWriteChunk(stream, (uint)WebpChunkType.FrameData);
WebpChunkParsingUtils.WriteUInt24LittleEndian(stream, this.X / 2);
WebpChunkParsingUtils.WriteUInt24LittleEndian(stream, this.Y / 2);
WebpChunkParsingUtils.WriteUInt24LittleEndian(stream, (uint)Math.Round(this.X / 2f));
WebpChunkParsingUtils.WriteUInt24LittleEndian(stream, (uint)Math.Round(this.Y / 2f));
WebpChunkParsingUtils.WriteUInt24LittleEndian(stream, this.Width - 1);
WebpChunkParsingUtils.WriteUInt24LittleEndian(stream, this.Height - 1);
WebpChunkParsingUtils.WriteUInt24LittleEndian(stream, this.Duration);

2
src/ImageSharp/Formats/Webp/MetadataExtensions.cs

@ -63,7 +63,7 @@ public static partial class MetadataExtensions
ColorTableMode = FrameColorTableMode.Global,
Duration = TimeSpan.FromMilliseconds(source.FrameDelay),
DisposalMode = GetMode(source.DisposalMethod),
BlendMode = source.BlendMethod == WebpBlendingMethod.Over ? FrameBlendMode.Over : FrameBlendMode.Source,
BlendMode = source.BlendMethod == WebpBlendMethod.Over ? FrameBlendMode.Over : FrameBlendMode.Source,
};
private static FrameDisposalMode GetMode(WebpDisposalMethod method) => method switch

2
src/ImageSharp/Formats/Webp/WebpAnimationDecoder.cs

@ -202,7 +202,7 @@ internal class WebpAnimationDecoder : IDisposable
using Buffer2D<TPixel> decodedImageFrame = this.DecodeImageFrameData<TPixel>(frameData, webpInfo);
bool blend = previousFrame != null && frameData.BlendingMethod == WebpBlendingMethod.Over;
bool blend = previousFrame != null && frameData.BlendingMethod == WebpBlendMethod.Over;
DrawDecodedImageFrameOnCanvas(decodedImageFrame, imageFrame, regionRectangle, blend);
previousFrame = currentFrame ?? image.Frames.RootFrame;

4
src/ImageSharp/Formats/Webp/WebpBlendingMethod.cs → src/ImageSharp/Formats/Webp/WebpBlendMethod.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors.
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Webp;
@ -6,7 +6,7 @@ namespace SixLabors.ImageSharp.Formats.Webp;
/// <summary>
/// Indicates how transparent pixels of the current frame are to be blended with corresponding pixels of the previous canvas.
/// </summary>
public enum WebpBlendingMethod
public enum WebpBlendMethod
{
/// <summary>
/// Do not blend. After disposing of the previous frame,

4
src/ImageSharp/Formats/Webp/WebpCommonUtils.cs

@ -20,7 +20,7 @@ internal static class WebpCommonUtils
{
if (image.Metadata.TryGetWebpMetadata(out WebpMetadata? webp))
{
return webp;
return (WebpMetadata)webp.DeepClone();
}
if (image.Metadata.TryGetGifMetadata(out GifMetadata? gif))
@ -44,7 +44,7 @@ internal static class WebpCommonUtils
{
if (frame.Metadata.TryGetWebpFrameMetadata(out WebpFrameMetadata? webp))
{
return webp;
return (WebpFrameMetadata)webp.DeepClone();
}
if (frame.Metadata.TryGetGifMetadata(out GifFrameMetadata? gif))

25
src/ImageSharp/Formats/Webp/WebpEncoderCore.cs

@ -165,7 +165,18 @@ internal sealed class WebpEncoderCore : IImageEncoderInternals
frameMetadata = WebpCommonUtils.GetWebpFrameMetadata(currentFrame);
ImageFrame<TPixel>? prev = previousDisposal == WebpDisposalMethod.RestoreToBackground ? null : previousFrame;
(bool difference, Rectangle bounds) = AnimationUtilities.DeDuplicatePixels(image.Configuration, prev, currentFrame, encodingFrame, Vector4.Zero);
(bool difference, Rectangle bounds) = AnimationUtilities.DeDuplicatePixels(image.Configuration, prev, currentFrame, encodingFrame, Vector4.Zero, ClampingMode.Even);
if (difference && previousDisposal != WebpDisposalMethod.RestoreToBackground)
{
if (frameMetadata.BlendMethod == WebpBlendMethod.Source)
{
// We've potentially introduced transparency within our area of interest
// so we need to overwrite the changed area with the full data.
AnimationUtilities.CopySource(currentFrame, encodingFrame, bounds);
}
}
using Vp8LEncoder animatedEncoder = new(
this.memoryAllocator,
@ -225,7 +236,17 @@ internal sealed class WebpEncoderCore : IImageEncoderInternals
frameMetadata = WebpCommonUtils.GetWebpFrameMetadata(currentFrame);
ImageFrame<TPixel>? prev = previousDisposal == WebpDisposalMethod.RestoreToBackground ? null : previousFrame;
(bool difference, Rectangle bounds) = AnimationUtilities.DeDuplicatePixels(image.Configuration, prev, currentFrame, encodingFrame, Vector4.Zero);
(bool difference, Rectangle bounds) = AnimationUtilities.DeDuplicatePixels(image.Configuration, prev, currentFrame, encodingFrame, Vector4.Zero, ClampingMode.Even);
if (difference && previousDisposal != WebpDisposalMethod.RestoreToBackground)
{
if (frameMetadata.BlendMethod == WebpBlendMethod.Source)
{
// We've potentially introduced transparency within our area of interest
// so we need to overwrite the changed area with the full data.
AnimationUtilities.CopySource(currentFrame, encodingFrame, bounds);
}
}
using Vp8Encoder animatedEncoder = new(
this.memoryAllocator,

4
src/ImageSharp/Formats/Webp/WebpFrameMetadata.cs

@ -29,7 +29,7 @@ public class WebpFrameMetadata : IDeepCloneable
/// <summary>
/// Gets or sets how transparent pixels of the current frame are to be blended with corresponding pixels of the previous canvas.
/// </summary>
public WebpBlendingMethod BlendMethod { get; set; }
public WebpBlendMethod BlendMethod { get; set; }
/// <summary>
/// Gets or sets how the current frame is to be treated after it has been displayed (before rendering the next frame) on the canvas.
@ -49,7 +49,7 @@ public class WebpFrameMetadata : IDeepCloneable
=> new()
{
FrameDelay = (uint)metadata.Duration.Milliseconds,
BlendMethod = metadata.BlendMode == FrameBlendMode.Source ? WebpBlendingMethod.Source : WebpBlendingMethod.Over,
BlendMethod = metadata.BlendMode == FrameBlendMode.Source ? WebpBlendMethod.Source : WebpBlendMethod.Over,
DisposalMethod = metadata.DisposalMode == FrameDisposalMode.RestoreToBackground ? WebpDisposalMethod.RestoreToBackground : WebpDisposalMethod.DoNotDispose
};
}

14
tests/ImageSharp.Tests/Formats/GeneralFormatTests.cs

@ -162,37 +162,37 @@ public class GeneralFormatTests
foreach (TestFile file in Files)
{
using Image<Rgba32> image = file.CreateRgba32Image();
using (FileStream output = File.OpenWrite(Path.Combine(path, $"{file.FileNameWithoutExtension}.bmp")))
using (FileStream output = File.Create(Path.Combine(path, $"{file.FileNameWithoutExtension}.bmp")))
{
image.SaveAsBmp(output);
}
using (FileStream output = File.OpenWrite(Path.Combine(path, $"{file.FileNameWithoutExtension}.jpg")))
using (FileStream output = File.Create(Path.Combine(path, $"{file.FileNameWithoutExtension}.jpg")))
{
image.SaveAsJpeg(output);
}
using (FileStream output = File.OpenWrite(Path.Combine(path, $"{file.FileNameWithoutExtension}.pbm")))
using (FileStream output = File.Create(Path.Combine(path, $"{file.FileNameWithoutExtension}.pbm")))
{
image.SaveAsPbm(output);
}
using (FileStream output = File.OpenWrite(Path.Combine(path, $"{file.FileNameWithoutExtension}.png")))
using (FileStream output = File.Create(Path.Combine(path, $"{file.FileNameWithoutExtension}.png")))
{
image.SaveAsPng(output);
}
using (FileStream output = File.OpenWrite(Path.Combine(path, $"{file.FileNameWithoutExtension}.gif")))
using (FileStream output = File.Create(Path.Combine(path, $"{file.FileNameWithoutExtension}.gif")))
{
image.SaveAsGif(output);
}
using (FileStream output = File.OpenWrite(Path.Combine(path, $"{file.FileNameWithoutExtension}.tga")))
using (FileStream output = File.Create(Path.Combine(path, $"{file.FileNameWithoutExtension}.tga")))
{
image.SaveAsTga(output);
}
using (FileStream output = File.OpenWrite(Path.Combine(path, $"{file.FileNameWithoutExtension}.tiff")))
using (FileStream output = File.Create(Path.Combine(path, $"{file.FileNameWithoutExtension}.tiff")))
{
image.SaveAsTiff(output);
}

9
tests/ImageSharp.Tests/Formats/Gif/GifEncoderTests.cs

@ -360,15 +360,16 @@ public class GifEncoderTests
public static string[] Animated => TestImages.Gif.Animated;
[Theory]//(Skip = "Enable for visual animated testing")]
[Theory(Skip = "Enable for visual animated testing")]
[WithFileCollection(nameof(Animated), PixelTypes.Rgba32)]
public void Encode_Animated_VisualTest<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : unmanaged, IPixel<TPixel>
{
using Image<TPixel> image = provider.GetImage();
//image.DebugSaveMultiFrame(provider);
provider.Utility.SaveTestOutputFile(image, "gif", new GifEncoder() { ColorTableMode = GifColorTableMode.Local}, "animated");
provider.Utility.SaveTestOutputFile(image, "webp", new WebpEncoder() { FileFormat = WebpFileFormatType.Lossless }, "animated");
provider.Utility.SaveTestOutputFile(image, "webp", new WebpEncoder() { FileFormat = WebpFileFormatType.Lossy }, "animated-lossy");
provider.Utility.SaveTestOutputFile(image, "png", new PngEncoder(), "animated");
provider.Utility.SaveTestOutputFile(image, "gif", new GifEncoder(), "animated");
}
}

11
tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs

@ -479,19 +479,16 @@ public partial class PngEncoderTests
}
[Theory]
[WithFile(TestImages.Gif.Giphy, PixelTypes.Rgba32)]
[WithFile(TestImages.Gif.Leo, PixelTypes.Rgba32)]
public void Encode_AnimatedFormatTransform_FromGif<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : unmanaged, IPixel<TPixel>
{
using Image<TPixel> image = provider.GetImage(GifDecoder.Instance);
using MemoryStream memStream = new();
using MemoryStream memStream = new();
image.Save(memStream, PngEncoder);
memStream.Position = 0;
image.Save(provider.Utility.GetTestOutputFileName("png"), new PngEncoder());
image.Save(provider.Utility.GetTestOutputFileName("gif"), new GifEncoder());
using Image<TPixel> output = Image.Load<TPixel>(memStream);
// TODO: Find a better way to compare.
@ -556,10 +553,10 @@ public partial class PngEncoderTests
switch (webpF.BlendMethod)
{
case WebpBlendingMethod.Source:
case WebpBlendMethod.Source:
Assert.Equal(PngBlendMethod.Source, pngF.BlendMethod);
break;
case WebpBlendingMethod.Over:
case WebpBlendMethod.Over:
default:
Assert.Equal(PngBlendMethod.Over, pngF.BlendMethod);
break;

10
tests/ImageSharp.Tests/Formats/WebP/WebpEncoderTests.cs

@ -63,7 +63,7 @@ public class WebpEncoderTests
}
[Theory]
[WithFile(TestImages.Gif.Giphy, PixelTypes.Rgba32)]
[WithFile(TestImages.Gif.Leo, PixelTypes.Rgba32)]
public void Encode_AnimatedFormatTransform_FromGif<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : unmanaged, IPixel<TPixel>
{
@ -115,6 +115,10 @@ public class WebpEncoderTests
image.Save(memStream, new WebpEncoder());
memStream.Position = 0;
provider.Utility.SaveTestOutputFile(image, "gif", new GifEncoder());
provider.Utility.SaveTestOutputFile(image, "png", new PngEncoder());
provider.Utility.SaveTestOutputFile(image, "webp", new WebpEncoder());
using Image<TPixel> output = Image.Load<TPixel>(memStream);
ImageComparer.Exact.VerifySimilarity(output, image);
PngMetadata png = image.Metadata.GetPngMetadata();
@ -132,11 +136,11 @@ public class WebpEncoderTests
switch (pngF.BlendMethod)
{
case PngBlendMethod.Source:
Assert.Equal(WebpBlendingMethod.Source, webpF.BlendMethod);
Assert.Equal(WebpBlendMethod.Source, webpF.BlendMethod);
break;
case PngBlendMethod.Over:
default:
Assert.Equal(WebpBlendingMethod.Over, webpF.BlendMethod);
Assert.Equal(WebpBlendMethod.Over, webpF.BlendMethod);
break;
}

4
tests/ImageSharp.Tests/TestUtilities/ImagingTestCaseUtility.cs

@ -171,7 +171,7 @@ public class ImagingTestCaseUtility
encoder ??= TestEnvironment.GetReferenceEncoder(path);
using (FileStream stream = File.OpenWrite(path))
using (FileStream stream = File.Create(path))
{
image.Save(stream, encoder);
}
@ -227,7 +227,7 @@ public class ImagingTestCaseUtility
{
using Image<TPixel> frameImage = image.Frames.CloneFrame(file.Index);
string filePath = file.FileName;
using FileStream stream = File.OpenWrite(filePath);
using FileStream stream = File.Create(filePath);
frameImage.Save(stream, encoder);
}

2
tests/Images/External/ReferenceOutput/BmpEncoderTests/Encode_8BitColor_WithOctreeQuantizer_rgb32.bmp

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:11375b15df083d98335f4a4baf0717e7fdd6b21ab2132a6815cadc787ac17e7d
oid sha256:23a9d9233314ec08bd3e464f245e69d96566cbb12d2dba36c69bba483d6ba6b8
size 9270

2
tests/Images/External/ReferenceOutput/BmpEncoderTests/Encode_8BitColor_WithWuQuantizer_rgb32.bmp

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e063e97cd8a000de6830adcc3961a7dc41785d40cd4d83af10ca38d96e071362
oid sha256:3052831cb18fecc26f54e29dfe19b538d2e0d3c104ddd7ec5bc8e0adcf56693c
size 9270

4
tests/Images/External/ReferenceOutput/DitherTests/ApplyDiffusionFilterInBox_Rgba32_CalliphoraPartial.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cafc426ac8e8d02a87f67c90e8c1976c5fae0e12b49deae52ad08476f7ed49a4
size 266391
oid sha256:e89597ab9aa006d026a560d1482350739bd93604d9c6726f6730d782c017a0a3
size 273049

4
tests/Images/External/ReferenceOutput/DitherTests/ApplyDitherFilterInBox_Rgba32_CalliphoraPartial.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:98115a7087aced0c28cefa32a57bc72be245886cabeefc4ff7faf7984236218c
size 271226
oid sha256:59d331efd9e6d926eaf90bed1f76b3ba55b2a42d2f83fc512a985cdea97781ec
size 271152

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_ShouldNotDependOnSinglePixelType_Bgra32_filter0.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0369747820c86bb692fc7b75f3519095c9b2a58a885ebd37c871c103d08405a0
size 720
oid sha256:3cee43ebaefd94bcd993b8548f734a0a44b948a532263b8d2ee41b0cd42ab7a9
size 727

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_ShouldNotDependOnSinglePixelType_Rgb24_filter0.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0369747820c86bb692fc7b75f3519095c9b2a58a885ebd37c871c103d08405a0
size 720
oid sha256:3cee43ebaefd94bcd993b8548f734a0a44b948a532263b8d2ee41b0cd42ab7a9
size 727

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_ShouldNotDependOnSinglePixelType_Rgba32_filter0.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0369747820c86bb692fc7b75f3519095c9b2a58a885ebd37c871c103d08405a0
size 720
oid sha256:3cee43ebaefd94bcd993b8548f734a0a44b948a532263b8d2ee41b0cd42ab7a9
size 727

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_ShouldNotDependOnSinglePixelType_RgbaVector_filter0.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f63aebed17504ef50d96ac7e58dc41f5227a83a38810359ed8e9cecda137183b
size 720
oid sha256:2f6df6c76c0f3795c439147fd49d658e52fae5c24a071ee0f4fed7aa096d87d1
size 719

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_Atkinson.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:471eaf2e532b40592c86dc816709d3ae4bbd64892006e00fd611ef6869d3b934
size 52070
oid sha256:c419d6b6cb589f95bff06514e3a5da37d7b5704aa3f9e6f4365fe5e00c6d81d1
size 50670

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_Burks.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:91fb9966a4b3eaefd5533ddf0b98ec08fbf8cbc263e4ebd438895e6d4129dd03
size 61447
oid sha256:90c337c38076fb597ecde87e0e8b5b95c369a90a99e64c5add3b31fc778cb52d
size 61178

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_FloydSteinberg.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d74faa8d188a2915739de64ba9d71b2132b53c8d154db22510c524ae757578a5
size 61183
oid sha256:7ce4b978b800820275635ae8da59212661c74a1b6ba9050ebf052c87315aedef
size 62107

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_JarvisJudiceNinke.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:080cc89d1d6568a2c9b707bf05428ab5febd2951e37223f96e349cc6646d32aa
size 56070
oid sha256:e44a87274d4f4fc5f1a0a849f27108ff8b98410f5d1e5e328236a9c79b9af51b
size 56175

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_Sierra2.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c7589986c1a762d52fe8ffc252e9938ff0e3a9e00b91ea7f5e36d4335b2b7870
size 58502
oid sha256:542285d1c2a375f64680173ca2736399d061009413e8aacf62f785425357f868
size 58538

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_Sierra3.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:934042746c3a9b652069da26b479e2be7cbdb17ab20e41c5e271013a76e96e46
size 58480
oid sha256:b4aa18018421bda728ec9adab4eff235d4f4c683a0bb5328dab386833685ab35
size 57616

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_SierraLite.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:03d5d5cbf1b2c0be736aa2bf726ad4bb04fca77aff393edb9663a7915a794264
size 62418
oid sha256:ec9d5fe07a99a995e889870ac4f6d264360adf1dbc5cb656d5657e096fe7f393
size 61838

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_StevensonArce.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:19a0d8667bfd01e18adbfca778e868ea7a6c43d427f9ae40eb4281d438ef509c
size 54464
oid sha256:b2dd1df6e5fb97b5fdeab6450713432ee1e0a318953b11ab25f4618bde369792
size 54658

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_Bike_Stucki.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:11c1056e013292e0543598f5690625b9bac0420a15fd1f37f6484daa3b8326fa
size 60074
oid sha256:ba66ef358ebcec36932e6d2874827846b31585fcbc0683e26c548fc3706e27e3
size 57294

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_Atkinson.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3fcf9b7e4ee34e80e8811f94940aff09a5392c21019fc86b145d16fd9c6b1cd2
size 57501
oid sha256:9f777e6d61a882da066a00b9d268be5fdbf49bdbccb568eb5bb3d959fe9f4fb0
size 57454

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_Burks.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4f0d9a43d8a47e00f6e5932b57f99565370a7239496fdbe162fb774497c4ef2a
size 59377
oid sha256:2b00d60902d54f911a9b4ab9be225ab589073b9f0efe06019895a75e487eadec
size 59415

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_FloydSteinberg.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d4a64da29f144d4d4c525ea45e56819e02a46030ae09542be01fdd8ffc85a295
size 60377
oid sha256:ded9cb4986e620f5fc11486ccdf81934dff7b3cea7db7e292929d339ecc21714
size 60116

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_JarvisJudiceNinke.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:90fc8048141b2182e4851a48ac5a79c96210eab9e56468fe06f90e7e70a7c180
size 58539
oid sha256:1518a2c1840a8d88767a45c7ba08b904ea471c7422fbb5f2b623f1f219992f83
size 58479

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_Sierra2.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b312bd18eba03a37121bbcfb3b285f97fe22283b51256883ce0235bb8605b757
size 58616
oid sha256:01c6000407f5302a5dd27a88053f795cdb101c791f92e983e6859792ef8a0935
size 58879

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_Sierra3.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:750ccd26984a4d5a370c1af6ca5dd1c9c5c6c66e693f7645130fd1669e3b7b4e
size 58923
oid sha256:11438d8eef23ae6ff5b7d37f0ccc9b6bfe744abb2dc95785a5769c306e51d11b
size 58908

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_SierraLite.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f9d3777a936883a2177a964f24d9ac86c8a106c375583bc9a8fbeb0ec39a7dc6
size 60610
oid sha256:57584582f914c0c059899f9241de006526a14081093b647972c363b00de62a57
size 60492

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_StevensonArce.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f638821c29d852d6fabe4cc4cfe802e386024835ad07ee496a7bec7a930e851b
size 57886
oid sha256:adfc7192b03c29addbc9c19e9eefc5c122d35d3d0fae7dfa65d3390ee5f60502
size 57887

4
tests/Images/External/ReferenceOutput/DitherTests/DiffusionFilter_WorksWithAllErrorDiffusers_CalliphoraPartial_Stucki.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c6e86bfc1594ec4cb8f89a1c92a42778c59aa755ce170a97afb8cab3e623aa79
size 58376
oid sha256:9735370ed168043d1fd176a258f08fcd705dcefc1d5e6841d012e843ec34d7a9
size 58485

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_ShouldNotDependOnSinglePixelType_Bgra32_filter0.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f7e849620a297e29ba11014c54430db01d851e4192650f6e39e0410591244cb5
size 865
oid sha256:a3253003b088c9975725cf321c2fc827547a5feb199f2d1aa515c69bde59deb7
size 871

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_ShouldNotDependOnSinglePixelType_Rgb24_filter0.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f7e849620a297e29ba11014c54430db01d851e4192650f6e39e0410591244cb5
size 865
oid sha256:bb3e3b9b3001e76505fb0e2db7ad200cad2a016c06f1993c60c3cab42c134863
size 867

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_ShouldNotDependOnSinglePixelType_Rgba32_filter0.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f7e849620a297e29ba11014c54430db01d851e4192650f6e39e0410591244cb5
size 865
oid sha256:a3253003b088c9975725cf321c2fc827547a5feb199f2d1aa515c69bde59deb7
size 871

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_ShouldNotDependOnSinglePixelType_RgbaVector_filter0.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f7e849620a297e29ba11014c54430db01d851e4192650f6e39e0410591244cb5
size 865
oid sha256:a3253003b088c9975725cf321c2fc827547a5feb199f2d1aa515c69bde59deb7
size 871

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_Bike_Bayer16x16.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:58c03e354b108033873e2a4c0b043ce15919c4d0630e6ca72ff70b89cbedb979
size 44239
oid sha256:5f844bf243df10178cdc8bd0d49fa8e7722476373c5b2cbc494bdc53eaa7a116
size 44133

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_Bike_Bayer2x2.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f987f4d270568facefc11eee7f81dd156af56c26b69fe3a6d2d2e9818652befa
size 43116
oid sha256:b80161aa7723ac8804a2679fbb1fc8327961166475e1a3567ee7bf1f61b43307
size 41530

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_Bike_Bayer4x4.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ebdad83936e50bbb00fd74b7dd7d2f5a480bb7347aa3d151e7827107cd279bac
size 44441
oid sha256:69e745d55bb37c75c5651713648fb9d2d761b8790b86b67e9a553a7ae6328f0a
size 43625

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_Bike_Bayer8x8.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ccdf5937c30999e3b09071200de2e1db63b606ad9cbf6f7677a7499fb0b52963
size 44252
oid sha256:a2a534bc0862e0d7325e9d6bbdf1c73ddc356bd621dfdc64a9c0c04399a93e00
size 43807

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_Bike_Ordered3x3.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:baf70b732646d7c6cec60cfbe569ec673418dfb2dd0b5937bccfb91d9821d586
size 45053
oid sha256:4ba2d0740f6d614725125c393ed8cf19e0dc648a82b114de5b8531a97e828351
size 43868

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_CalliphoraPartial_Bayer16x16.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f6a1eae610ed730e4cec41693829929ba8db674886c2bd558f1b8893d2b76802
size 51201
oid sha256:a980061a57ac57351b4ccedb34f915319373759753cf2d28fb604a968b87fb2f
size 50640

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_CalliphoraPartial_Bayer2x2.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ba674e0236c2e146c64a7f3e224c702030769304cd0fd624d1989536da341659
size 52814
oid sha256:4b64630a74a435fde316a2d6be140ef54b04fecbf5fa76e31014d92c9cd925db
size 52298

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_CalliphoraPartial_Bayer4x4.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:316231c8d837f864cf62dcc79fdce698dc8c45c0327372de42c2b89eac1d9f81
size 51851
oid sha256:3535fa1a240cc7c11e9bb233333894f8782ec67ac36708c8ee3baf905c2d3f65
size 51268

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_CalliphoraPartial_Bayer8x8.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b58144146585f50960dfd6ac5dc3f52238160287ae5f9b18c6796962cc3d2fd2
size 51550
oid sha256:e2d47f277bc904ed8c3b3bbfe636b647884511de39661bfd34cdcb2abe9f6a13
size 50818

4
tests/Images/External/ReferenceOutput/DitherTests/DitherFilter_WorksWithAllDitherers_CalliphoraPartial_Ordered3x3.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6515be764d7026a87cfeea2d58344c404e4f15908139a25f413d51cc7cc61a0c
size 52216
oid sha256:ed86ea3844a13de5247bcb409c70ca4a8051cb18b6a3c298a5665f4573f89490
size 51756

4
tests/Images/External/ReferenceOutput/PngEncoderTests/Issue2469_Quantized_Encode_Artifacts_Rgba32_issue_2469.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ef5a85b2adde25b5f343a18420fe787f5e159029a361a15ef2d6322eb7bb81fb
size 944597
oid sha256:968a3cfdec62a89823e711f7ed15e3c456a8e44b8f9d46268dd312693e04be00
size 1028911

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_OctreeQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f4d36c8f7e5d5c0d798af5fb6bfad28ed0d628b880bea81efe0d54ac1fde86b2
size 265268
oid sha256:62b08eae3bbcc99c2dace7156dae8e37786416e1e428455417b3efc7cdcbd56a
size 240453

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_OctreeQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9f165908729d723818b6c5843bd75298d987448e2cd4278dfe3f388a62025add
size 238396
oid sha256:f240153a429da26fbe2ffcbce71ceeae47225c261002c242c34b2747823d0f9a
size 231151

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_OctreeQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:34eaa0696da00838e591b2c48e7797641521f7f3feb01abbd774591c4dd6f200
size 265546
oid sha256:7700134ca070ccef3f027b70534a811e4a388d05b421ca91d9176d84310ddfc0
size 237380

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WebSafePaletteQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:531594a2e47710545d96d0fd9a8cc86983233420172e0ced28df050df1a5e039
size 239844
oid sha256:4e46eddb5225c37cfe20a4d94af0eabd1def78eb379a17d9cdae5fae0866d2bb
size 208360

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WebSafePaletteQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4f1462733e02d499b0d8c61ab835a27c7fee560fdc7fc521d20ec09bb4ccc80f
size 216030
oid sha256:4e46eddb5225c37cfe20a4d94af0eabd1def78eb379a17d9cdae5fae0866d2bb
size 208360

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WebSafePaletteQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7e6d91a3ec4f974af675dc360fd5fd623ec8773cdbc88c0a3a6506880838718a
size 226727
oid sha256:344efea18d09c8c9b23d7c06a8e865c271dc6acdc9330b589d9ebe15b48c285f
size 215670

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WernerPaletteQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:620463c14de12abb4f2cab3ee6259ad8cbb24c688212729535f41ebf492a8836
size 224490
oid sha256:c32da9b861ac38306d1bfcae6384e4cdf449cfdb9de1fee3fdb6975e4096aea6
size 212659

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WernerPaletteQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c68eba122814b5470e5f2e03e34190ff79e84e4b431ad8227355ce7ffcd4a6a7
size 220192
oid sha256:c32da9b861ac38306d1bfcae6384e4cdf449cfdb9de1fee3fdb6975e4096aea6
size 212659

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WernerPaletteQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6dbd3189b559941f91dd6e0aa15b34a3e5081477400678c2396c6a66d398876f
size 230883
oid sha256:60fcd8cf74e595b9f5add7ef6924e4ed801f3835b7d2873bbc79e0b61b98bb0f
size 218566

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WuQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:274c3e57f186c47bb070dfd2a79b8353032f9d91d03a3ab9ecb3aec13fdd9855
size 273333
oid sha256:3a650e180ee2f073f5d06ef343f5d14cde568777a21d8f419dae6c23f36bfb66
size 255237

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WuQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:df63a3d12e2998d5242b64169ac86e3df7ab4be585a80daddc3e3888dfcb7095
size 262298
oid sha256:934c4a8fd38d2d360dd1b69627043895975ee33ed63e2b1e514b8c6f8451c3f0
size 253854

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WuQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:457a0b4e27a09440ff4e13792b68fb5a9da82b7ce6129ea15a5ea8dcd99bd522
size 274300
oid sha256:38a6c8caeef772c51508954483810ecf4aa13168a8ec33af266cde028ee19f75
size 249584

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_OctreeQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fd007786164af8f410bd9738c0a072fc75d1f9b50145e5c191c9e3df345341a5
size 318778
oid sha256:649e8a71ba3328af6a48a0afe8747433bce459bed50ba5f4108343265f07cdf2
size 314905

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_OctreeQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0203ecb9e4665e7c3992b7da4777c6d35b539790506fc9ca2acbcbc2bdb5db18
size 303979
oid sha256:d484a8d20c288de3f30b6c8ea2cecb6893d618d96e8a9079c0003ee49c798967
size 303608

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_OctreeQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:62cdce27fc46a38a16995df8ed1501f65091d69315288479b1d613b1d87c8239
size 321123
oid sha256:6b935deeff7a6f9be835f1975513b0063090d52e5d4178da1ce8575909729164
size 320831

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WebSafePaletteQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:08ace2edc5089a7742c1c8005126dcce850b1adf9c017b12db6892f4daeef1bb
size 271721
oid sha256:c14e3f64a9fa9487c4828bc931338525663177828d65f31928b1acf6f5c1d3a7
size 269542

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WebSafePaletteQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3a2aae04edebcaca9b95f30963201794887fa0eac954b64c68bfe529b14fa9be
size 269397
oid sha256:c14e3f64a9fa9487c4828bc931338525663177828d65f31928b1acf6f5c1d3a7
size 269542

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WebSafePaletteQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2f3e9a338a5ae37c88ce0c348e0b655429220da051db3352779c277bb2dcb441
size 270622
oid sha256:fc2c4df81110029eeaf07419c6a5a823faba757aacf776241ad3171370f70338
size 271393

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WernerPaletteQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6ac7cdcc2fbee0572a369bed29c51e1c9056a4f09c4e0750ecb34d65daf403d4
size 287741
oid sha256:4812a323ca35208e55faf476d342202b320a302df9475f40f8d96161e09ae7ea
size 284361

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WernerPaletteQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:752760327cc1416c171a920f1e0e95e34eae6d78bd0c7393a3be427bf3c8e55c
size 284481
oid sha256:4812a323ca35208e55faf476d342202b320a302df9475f40f8d96161e09ae7ea
size 284361

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WernerPaletteQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:293459538454e07bc9ea1e9df1fa5b0eb986fde7de42f6c25b43e4c8859bd28a
size 285370
oid sha256:5022fb7d43ec6885efcd6e7513ad92019f28febb91e7e2b61c421bf96cfbb76c
size 285270

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WuQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:be7812accadc6347d6df43c308f7293596f92d0d90cf0b6a8e48fac1f4144fc0
size 320157
oid sha256:eb153e0e3c50cc038f8ab215646dd2a1739e748fa4a7a04ef34ea2f6d8e0c22a
size 318803

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WuQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ff094e6bafe81e818bcbac69018dcfe29366389dfca0d63d8e05ef42896ffe1d
size 317309
oid sha256:0e09d63aaf5365a1f4ac44beef9f203c4217a7e158703d44b2b1007c413b1f0c
size 318179

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WuQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ee0778aac671365dd0afae06cdcf8f36243bd9815f684b975f83e297bb694e63
size 323979
oid sha256:563e9bf52b4ac7be22bc15e6aaf8b39e508eb7e31cb90986fe559ac88ba40829
size 324538

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_ErrorDither_0.25.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:033bb9e0ce89ffe4abda4d409af5741958d4035f9c9824c28d7598d72c4db96f
size 13818
oid sha256:d96528a2950fb583ff1a1c00e7e13861fc582bd62b72deccaafb73f2cdd15b10
size 20936

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_ErrorDither_0.5.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9c6617ebf10f2fe1608fbc2a3c75f1a86ff4e3835b5d3fd7fcc2e5d0a4e5bbb1
size 14380
oid sha256:d96528a2950fb583ff1a1c00e7e13861fc582bd62b72deccaafb73f2cdd15b10
size 20936

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_ErrorDither_0.75.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5bb52f047f410e2b0bdcd8d186043f0d3b03835f39007775608fb05365ac9a20
size 14616
oid sha256:d96528a2950fb583ff1a1c00e7e13861fc582bd62b72deccaafb73f2cdd15b10
size 20936

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_ErrorDither_0.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:033bb9e0ce89ffe4abda4d409af5741958d4035f9c9824c28d7598d72c4db96f
size 13818
oid sha256:d96528a2950fb583ff1a1c00e7e13861fc582bd62b72deccaafb73f2cdd15b10
size 20936

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_ErrorDither_1.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:47e0924ddbf191dca8932eb46b9c533d0983b9fbce956026b392d5fe589fb90a
size 14630
oid sha256:d96528a2950fb583ff1a1c00e7e13861fc582bd62b72deccaafb73f2cdd15b10
size 20936

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_OrderedDither_0.25.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4ede7ffc5d07a09c7c5706e8e2554897d29acaabf71701191b0f689f2c22ae71
size 17826
oid sha256:14dfcd85d0331448c1e3ff447e7e789ad4fc24618b6a9c5d05468bdd6a2f2209
size 20804

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_OrderedDither_0.5.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f91c7f1f687c73dd909b629e40f703740270042507c47aa3834ccd38bf289dc3
size 19394
oid sha256:8e7df6174aad752e0f3846eeef5efc4bfc70b80e3622a54eba59f6dcd4673d87
size 21802

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_OrderedDither_0.75.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2b836ab4e0f1c95fe5d553bf5bca37eac402ba431268d25e4641e86c952f5fdd
size 19802
oid sha256:95c739dd75b7be9dea10c12dd69ea60095ac617de491a2ba8063c86cd1bd9aa3
size 22060

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_OrderedDither_0.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:033bb9e0ce89ffe4abda4d409af5741958d4035f9c9824c28d7598d72c4db96f
size 13818
oid sha256:d96528a2950fb583ff1a1c00e7e13861fc582bd62b72deccaafb73f2cdd15b10
size 20936

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_OctreeQuantizer_OrderedDither_1.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:00bcd2ac107f45cb31efee44de275dd597eae6d2d4fda71c397416ff5f2f0914
size 20175
oid sha256:f49ea178ca76bd1b2165b0b700a558433d27e22b07b3b35be3fdf3a1868d7ad6
size 22371

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_ErrorDither_0.25.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b04b71b0a4718e5b3f91c33c23ef792fc81a67c9fef7b9e4d80bdb9dce3539dd
size 9107
oid sha256:7bf316a54f0add7d92287fddc9cc3744d4be1a7ba7c6881d83d3f45356d2c53e
size 8627

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_ErrorDither_0.5.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e0125454d2c3859d8457202856e21591ab96f61e2a29c3f017af29bf03961c48
size 8883
oid sha256:97c36988a937893cf106b7b7986fff32d0d90c882ed292010fc1172b1a149d22
size 9388

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_ErrorDither_0.75.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:213ebd9fc7a190ad7226b487387edb9452284193cee4c4720448d7e19ef38e76
size 11149
oid sha256:5e167ecea77962fa0b8376f1217cbba64c90c77e67213b229fba1c6122d2bc06
size 11011

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_ErrorDither_0.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:43b21e948795abb52ebbbf94e785542e55488cc7f17996e2b92404ca8ad1a7cb
size 7844
oid sha256:b7fd78e11b8de40f646218597ec1ebccddbca7a6d901e5c87848ae1d9e0de361
size 8390

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_ErrorDither_1.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0bb8f730a43a8f58e4269905014461bab8dc8b47387ec86a84c1064b1cdabe14
size 11813
oid sha256:45f3bf5ae0e8061811eebd3328f1d8f7d54dc7b213f6324148c36292509a8ee5
size 12761

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_OrderedDither_0.25.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7500be583beb22759dec7e5bbb2a8d2230054366bfbd0e39bf10fdc8af63eb58
size 8925
oid sha256:36b1193c16c585918655bae2d98e4105b92cfab66ad903995f2af6b316e8b4a4
size 9060

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationWithDitheringScale_david_WebSafePaletteQuantizer_OrderedDither_0.5.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c48da7aad9c0aad576293d7085f9ddb2ea90a76d53bea54cbe0cb7aef71c7bb4
size 9136
oid sha256:71d5c7b4addc49a13e0adb60dc53b463845957ea5df490cd476f011b6770373e
size 9633

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save