Browse Source

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)
pull/3153/head
winscripter 1 month ago
parent
commit
8345623213
  1. 33
      src/ImageSharp/Formats/Jxl/IO/Jpeg/Data/JpegData.cs
  2. 4
      src/ImageSharp/Formats/Jxl/Processing/Encoder/JxlFastLosslessEncoder.cs
  3. 3
      src/ImageSharp/Formats/Jxl/Processing/JxlMath.cs
  4. 4
      src/ImageSharp/Formats/Jxl/Processing/Modular/Transforms/JxlSqueeze.cs

33
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<bool> acOk = default;
InlineArray4<bool> 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<byte> markerOrderSpan = CollectionsMarshal.AsSpan(this.MarkerOrder);
for (int i = 0; i < markerOrderSpan.Length; i++)

4
src/ImageSharp/Formats/Jxl/Processing/Encoder/JxlFastLosslessEncoder.cs

@ -53,7 +53,7 @@ internal sealed class JxlFastLosslessEncoder
/// <summary>
/// Input frame data is stored here.
/// </summary>
private readonly IFjxlFrameInputSource input;
private readonly FjxlFrameInputSource input;
/// <summary>
/// Image width of the input image.
@ -147,7 +147,7 @@ internal sealed class JxlFastLosslessEncoder
/// <summary>
/// Abstracts access to a raster frame data required for encoding.
/// </summary>
internal abstract class IFjxlFrameInputSource : IDisposable
internal abstract class FjxlFrameInputSource : IDisposable
{
/// <inheritdoc />
public abstract void Dispose();

3
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)

4
src/ImageSharp/Formats/Jxl/Processing/Modular/Transforms/JxlSqueeze.cs

@ -30,6 +30,10 @@ internal static class JxlSqueeze
/// <summary>
/// Computes the average of two integers.
/// </summary>
/// <remarks>
/// This method is specific to the Squeeze transform.
/// It is not a generic average method.
/// </remarks>
/// <param name="x">First integer</param>
/// <param name="y">Second integer</param>
/// <returns>The average of x, y.</returns>

Loading…
Cancel
Save