From 83456232133ac14d3314f43994c20e37f7698c00 Mon Sep 17 00:00:00 2001 From: winscripter <142818255+winscripter@users.noreply.github.com> Date: Wed, 2 Sep 2026 17:38:31 +0400 Subject: [PATCH] Refactor, optimize 1. Reorder the overflow check in JpegData 2. Prefer switch in JpegData instead of multiple if statements 3. Don't explicitly false initialize acOk and dcOk in JpegData (they're already initialized to false). 4. IFjxlFrameInputSource -> FjxlFrameInputSource (it's an abstract class, I prefix is for interfaces) 5. Document that the JxlSqueeze.Average method is specific to the squeeze transform. 6. Prefer RuntimeUtility.Swap over tuple-based swap (micro-optimization) --- .../Formats/Jxl/IO/Jpeg/Data/JpegData.cs | 33 ++++++++----------- .../Encoder/JxlFastLosslessEncoder.cs | 4 +-- .../Formats/Jxl/Processing/JxlMath.cs | 3 +- .../Modular/Transforms/JxlSqueeze.cs | 4 +++ 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/ImageSharp/Formats/Jxl/IO/Jpeg/Data/JpegData.cs b/src/ImageSharp/Formats/Jxl/IO/Jpeg/Data/JpegData.cs index 9ab957be93..4555442bcb 100644 --- a/src/ImageSharp/Formats/Jxl/IO/Jpeg/Data/JpegData.cs +++ b/src/ImageSharp/Formats/Jxl/IO/Jpeg/Data/JpegData.cs @@ -113,7 +113,7 @@ internal sealed class JpegData : IJxlFields } int len = jpegData.AppData[i].Count - 17; - if (iccPos + len > icc.Length) + if (iccPos > icc.Length - len) { throw new InvalidOperationException("ICC length is less than APP markers: requested " + len + " more bytes, " + (icc.Length - iccPos) + " available"); } @@ -144,24 +144,23 @@ internal sealed class JpegData : IJxlFields info.NumberOfAppMarkers++; } - if (marker == 0xfe) + switch (marker) { - info.NumberOfComMarkers++; - } + case 0xFE: + info.NumberOfComMarkers++; + break; - if (marker == 0xda) - { - info.NumberOfScans++; - } + case 0xDA: + info.NumberOfScans++; + break; - if (marker == 0xff) - { - info.NumberOfIntermarkers++; - } + case 0xFF: + info.NumberOfIntermarkers++; + break; - if (marker == 0xdd) - { - info.HasDri = true; + case 0xDD: + info.HasDri = true; + break; } return true; @@ -919,10 +918,6 @@ internal sealed class JpegData : IJxlFields InlineArray4 acOk = default; InlineArray4 dcOk = default; - // All values of acOk, dcOk by default are false. - acOk[0] = acOk[1] = acOk[2] = acOk[3] = false; - dcOk[0] = dcOk[1] = dcOk[2] = dcOk[3] = false; - Span markerOrderSpan = CollectionsMarshal.AsSpan(this.MarkerOrder); for (int i = 0; i < markerOrderSpan.Length; i++) diff --git a/src/ImageSharp/Formats/Jxl/Processing/Encoder/JxlFastLosslessEncoder.cs b/src/ImageSharp/Formats/Jxl/Processing/Encoder/JxlFastLosslessEncoder.cs index 91263989ef..bea22c76a3 100644 --- a/src/ImageSharp/Formats/Jxl/Processing/Encoder/JxlFastLosslessEncoder.cs +++ b/src/ImageSharp/Formats/Jxl/Processing/Encoder/JxlFastLosslessEncoder.cs @@ -53,7 +53,7 @@ internal sealed class JxlFastLosslessEncoder /// /// Input frame data is stored here. /// - private readonly IFjxlFrameInputSource input; + private readonly FjxlFrameInputSource input; /// /// Image width of the input image. @@ -147,7 +147,7 @@ internal sealed class JxlFastLosslessEncoder /// /// Abstracts access to a raster frame data required for encoding. /// - internal abstract class IFjxlFrameInputSource : IDisposable + internal abstract class FjxlFrameInputSource : IDisposable { /// public abstract void Dispose(); diff --git a/src/ImageSharp/Formats/Jxl/Processing/JxlMath.cs b/src/ImageSharp/Formats/Jxl/Processing/JxlMath.cs index a0042c9c50..f0ab04104e 100644 --- a/src/ImageSharp/Formats/Jxl/Processing/JxlMath.cs +++ b/src/ImageSharp/Formats/Jxl/Processing/JxlMath.cs @@ -3,6 +3,7 @@ using System.Numerics; using System.Runtime.CompilerServices; +using SixLabors.ImageSharp.Common.Helpers; namespace SixLabors.ImageSharp.Formats.Jxl.Processing; @@ -705,7 +706,7 @@ internal static class JxlMath if (x < y) { - (y, x) = (x, y); + RuntimeUtility.Swap(ref x, ref y); } if (x == T.Zero) diff --git a/src/ImageSharp/Formats/Jxl/Processing/Modular/Transforms/JxlSqueeze.cs b/src/ImageSharp/Formats/Jxl/Processing/Modular/Transforms/JxlSqueeze.cs index 6888015825..11752a92c9 100644 --- a/src/ImageSharp/Formats/Jxl/Processing/Modular/Transforms/JxlSqueeze.cs +++ b/src/ImageSharp/Formats/Jxl/Processing/Modular/Transforms/JxlSqueeze.cs @@ -30,6 +30,10 @@ internal static class JxlSqueeze /// /// Computes the average of two integers. /// + /// + /// This method is specific to the Squeeze transform. + /// It is not a generic average method. + /// /// First integer /// Second integer /// The average of x, y.