From 26a0f0bc6fa25087f89b7ef0d40841cab360c679 Mon Sep 17 00:00:00 2001 From: Dmitry Pentin Date: Sat, 19 Jun 2021 05:10:24 +0300 Subject: [PATCH] Fixeds docs, fixed API, fixed if check --- .../Components/Encoder/HuffmanScanEncoder.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs b/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs index 43d7b07b9..c610c2483 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs @@ -286,7 +286,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder } } - if (lastValuableIndex != 63) + // if mcu block contains trailing zeros - we must write end of block (EOB) values indicating that current block is over + // this can be done for any number of trailing zeros + if (lastValuableIndex < Block8x8F.Size - 1) { this.EmitHuff(huffmanTable, 0x00); } @@ -461,14 +463,17 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder /// /// Returns index of the last non-zero element in given mcu block, returns -1 if all elements are zero /// - /// Input mcu. + /// Return range is [1..63]. + /// Mcu block. /// Index of the last non-zero element. [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static int GetLastNonZeroElement(ref Block8x8F block) + private static int GetLastNonZeroElement(ref Block8x8F mcu) { - int index = 63; - ref float elemRef = ref Unsafe.As(ref block); - while (index > -1 && (int)Unsafe.Add(ref elemRef, index) == 0) + int index = Block8x8F.Size - 1; + ref float elemRef = ref Unsafe.As(ref mcu); + + // Index range is [63..0), first element is a DC value which will be emitted even if entire mcu contains only zeros + while (index > 0 && (int)Unsafe.Add(ref elemRef, index) == 0) { index--; }