Skip to content

Low-hanging fruit codegen optimizations - #2401

Merged
JimBobSquarePants merged 14 commits into
SixLabors:mainfrom
gfoidl:codegen-optimizations
Mar 24, 2023
Merged

JimBobSquarePants merged 14 commits into
SixLabors:mainfrom
gfoidl:codegen-optimizations

Conversation

@gfoidl

@gfoidl gfoidl commented Mar 13, 2023 •

Copy link
Copy Markdown
Contributor

Prerequisites

  • I have written a descriptive pull-request title
  • I have verified that there are no overlapping pull-requests open
  • I have verified that I am following the existing coding patterns and practice as demonstrated in the repository. These follow strict Stylecop rules 👮.
  • I have provided test coverage for my change (where applicable)

Description

Scanned through the code-base (Regex based search) and did some low-hanging fruit optimizations.

  • optimized division by constants
  • for Unsafe.Add-usage tweaked the code / loops to don't emit sign extending movs (movsxd -> mov or movzx)

Sorry for touching so many files...
Cf. #2397 (comment)

Comment thread src/ImageSharp/Formats/Jpeg/Components/Decoder/ArithmeticScanDecoder.cs Outdated

@JimBobSquarePants JimBobSquarePants left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this... I've gone a fair way through but want to comment now.

I think we might need to take a step back and try to find a good balance between creating the best codegen and readability.

I see two issues.

  1. How we're handling loops is inconsistent, sometimes we cast in diffferent ways in the loop declaration nint i = ... (nint)(uint) vs nint i = ... (uint) and sometimes we we cast inside the loop.
  2. We're doing casting during field assignment outside of hotpaths. I don't want to introduce changes that will only have very marginal effect sacrificing readabilty in the process.

Comment thread src/ImageSharp/Common/Helpers/HexConverter.cs Outdated
Comment thread src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs Outdated
Comment thread src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Generated.cs Outdated
Comment thread src/ImageSharp/Formats/Png/PngScanlineProcessor.cs Outdated
Comment thread src/ImageSharp/Formats/Tiff/Compression/TiffBaseCompression.cs Outdated
colorWhite.FromRgba32(Color.White);
ref byte dataRef = ref MemoryMarshal.GetReference(data);
for (nint y = top; y < top + height; y++)
for (nint y = top; y < (nint)(uint)(top + height); y++)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In some places we haven't dont the second explicit cast from uint
e.g. the loops are written as

for (nint y = top; y < (uint)(top + height); y++)

I think we should strive to be super consistent here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Having another thought on this, I think using nuint is the best option.

  • the cast to uint is enough, so no need for (nint)(uint)
  • the compiler errors for for (nuint i = 0; i < span.Length; ++i) whilst there's no error if nint i = 0 is used -- so it's impossible to miss one optimization
  • for 32-bit optimized code is emitted too

Hence I'll update the usages to nuint.

Comment thread src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs Outdated
public static void AddGreenToBlueAndRed(Span<uint> pixelData)
{
if (Avx2.IsSupported)
if (Avx2.IsSupported && pixelData.Length >= 8)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did the length check early and made a do-while-loop.
This prevents the creation* of the vector addGreenToBlueAndRedMaskAvx2 when not needed.
The same on other loops in this file.

* actually it's a memory load from the data-segment in recent .NET versions

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've seen similar in the recent CRC PR to the runtime.

Comment on lines +347 to +349
nint u = n - m;

for (int i = 0; i < u; i += 4)
for (nint i = 0; i < u; i += 4)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because of the n - m the loop with nint is kept. With nuint one has to take care of underflow due the subtraction.

Alternatives with using nuint would be casting to a signed type or having a if + do-while looping construct. I think the nint as used here is simpler.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, that makes sense. Thanks for the additional explanation!

Comment on lines +514 to +517
out uint p3,
out uint p2,
out uint p1,
out uint p0)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The uint here saves lots of casts elsewhere.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep. Very good!

source.Save(
path,
encoder ?? source.GetConfiguration().ImageFormatsManager.FindEncoder(<#= fmt #>Format.Instance));
encoder ?? source.GetConfiguration().ImageFormatsManager.GetEncoder(<#= fmt #>Format.Instance));

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was a left-over from #2317?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wow! I thought I'd redone these. Thanks!!

@JimBobSquarePants

Copy link
Copy Markdown
Member

@gfoidl I'm still reviewing this. There's a LOT to read so it's gonna take me a few nights. Thanks for your patience.

@gfoidl

gfoidl commented Mar 21, 2023

Copy link
Copy Markdown
Contributor Author

No rush (and ultiimately it's up to you when to review 😉).

The pain point with such a PR is lots of touched files. But on the pro side the code-base gets in a consistent and good shape (regarding the micro-optimizations).

@JimBobSquarePants JimBobSquarePants left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is looking really good! Just a few comments and questions.

Comment thread src/ImageSharp/Common/Helpers/Shuffle/IComponentShuffle.cs Outdated
ref byte dBase = ref MemoryMarshal.GetReference(dest);

Shuffle.InverseMMShuffle(this.Control, out int p3, out int p2, out int p1, out int p0);
Shuffle.InverseMMShuffle(this.Control, out uint p3, out uint p2, out uint p1, out uint p0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is one of those. "Why didn't I think of this!" moments. 😁

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, then it would be boring for me 😉.

Comment thread src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs Outdated
Comment on lines +347 to +349
nint u = n - m;

for (int i = 0; i < u; i += 4)
for (nint i = 0; i < u; i += 4)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, that makes sense. Thanks for the additional explanation!

Comment on lines +514 to +517
out uint p3,
out uint p2,
out uint p1,
out uint p0)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep. Very good!

// We can assign the Bgr24 value directly to last three bytes of this instance.
ref byte thisRef = ref Unsafe.As<Abgr32, byte>(ref this);
ref byte thisRefFromB = ref Unsafe.AddByteOffset(ref thisRef, new IntPtr(1));
ref byte thisRefFromB = ref Unsafe.AddByteOffset(ref thisRef, 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wouldn't this be better as (nuint)1u?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AddByteOffset has overloads for nuint and IntPtr, thus C#-compiler picks the nuint overload and treats the literal 1 as nuint-constant. No need for the cast here.

Comment thread src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor{TPixel}.cs Outdated
for (int i = 0; i < this.kernelSize; i++)
{
int currentYIndex = Unsafe.Add(ref sampleRowBase, i);
int currentYIndex = Unsafe.Add(ref sampleRowBase, (uint)i);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cast in the outer loop for consistency?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just below i is needed for slicing as int.
It would be more consistent, but also two casts instead of one in the loop body.

I have no strong opinion what's better here. Consistency or less casts?

@gfoidl gfoidl left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Feedback is addressed / commented.


Once you're happy with the changes I need to push another commit to fix cases like

nuint count = (uint)(source.Length / Vector<float>.Count);
which I de-optimized in a previous commit of this PR (got the wrong casts here in order to emit fastest code).

@JimBobSquarePants

Copy link
Copy Markdown
Member

Feedback is addressed / commented.

Once you're happy with the changes I need to push another commit to fix cases like

nuint count = (uint)(source.Length / Vector<float>.Count);

which I de-optimized in a previous commit of this PR (got the wrong casts here in order to emit fastest code).

Super happy with everything so far! Fire ahead 😄

@gfoidl

gfoidl commented Mar 24, 2023

Copy link
Copy Markdown
Contributor Author

Fire ahead 😄

Here we go: 2bbf1cb (only changed that division by vector length (which I unfortunately optimized, then later de-optimized, and with that commit optimized again -- now it's enough of that ping-poing 😉))

@JimBobSquarePants JimBobSquarePants left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing stuff. Thank you!

@JimBobSquarePants
JimBobSquarePants merged commit 0a1f05b into SixLabors:main Mar 24, 2023
@gfoidl
gfoidl deleted the codegen-optimizations branch March 24, 2023 12:24
@gfoidl gfoidl mentioned this pull request Mar 24, 2023
4 tasks done
xadupre pushed a commit to microsoft/onnxruntime that referenced this pull request Oct 8, 2026
Updated [SixLabors.ImageSharp](https://github.com/SixLabors/ImageSharp)
from 2.1.9 to 4.1.2.

<details>
<summary>Release notes</summary>

_Sourced from [SixLabors.ImageSharp's
releases](https://github.com/SixLabors/ImageSharp/releases)._

## 4.1.2

## What's Changed
* Harden codec and metadata input validation by @​JimBobSquarePants in
SixLabors/ImageSharp#3187
* Fix TIFF decoding of legacy 8-bit color maps by @​JimBobSquarePants in
SixLabors/ImageSharp#3189


**Full Changelog**:
SixLabors/ImageSharp@v4.1.1...v4.1.2

## 4.1.1

## What's Changed
* Fix CCITT decompressor bounds checks and error handling by
@​JimBobSquarePants in SixLabors/ImageSharp#3176


**Full Changelog**:
SixLabors/ImageSharp@v4.1.0...v4.1.1

## 4.1.0

## What's Changed
* GIF: background handling & quantizer overflow fix by
@​JimBobSquarePants in SixLabors/ImageSharp#3133
* Validate PBM max pixel value by @​JimBobSquarePants in
SixLabors/ImageSharp#3134
* Add support for Apple CgBI PNG images by @​Erik-White in
SixLabors/ImageSharp#3136
* Fix GIF transparency handling and dither by @​JimBobSquarePants in
SixLabors/ImageSharp#3143
* Bump codecov/codecov-action from 6 to 7 by @​dependabot[bot] in
SixLabors/ImageSharp#3141
* Add BlendWithCoverage overloads. Optimize Rgba32 compatible shuffling.
by @​JimBobSquarePants in
SixLabors/ImageSharp#3150
* Bump actions/checkout from 6 to 7 by @​dependabot[bot] in
SixLabors/ImageSharp#3146
* Bump actions/cache from 5 to 6 by @​dependabot[bot] in
SixLabors/ImageSharp#3149
* Fix convolution sampling for bounds smaller than the kernel radius by
@​JimBobSquarePants in SixLabors/ImageSharp#3152
* Enhance pixel formats and associated-alpha operations with
optimizations by @​JimBobSquarePants in
SixLabors/ImageSharp#3154
* Bump actions/setup-dotnet from 5 to 6 by @​dependabot[bot] in
SixLabors/ImageSharp#3155
* Fix degeneracy check for resize transforms by @​JimBobSquarePants in
SixLabors/ImageSharp#3157
* Improvements to Apple CgBI PNG handling by @​Erik-White in
SixLabors/ImageSharp#3137
* Clone TIFF profiles into image metadata by @​JimBobSquarePants in
SixLabors/ImageSharp#3159
* Add AOT compiler seeds for pixel formats and ICO, CUR, QOI codecs by
@​JimBobSquarePants in SixLabors/ImageSharp#3160
* Normalize SIMD pipelines using TensorPrimitives_ by
@​JimBobSquarePants in SixLabors/ImageSharp#3161
* Add ANI decoder support by @​Poker-sang in
SixLabors/ImageSharp#2899
* Remove AntialiasThreshold from GraphicsOptions by @​JimBobSquarePants
in SixLabors/ImageSharp#3162
* Add plus and extended pixel blend modes by @​JimBobSquarePants in
SixLabors/ImageSharp#3163
* Fix 16-bit binary PBM sample byte order by @​JimBobSquarePants in
SixLabors/ImageSharp#3164
* Make MemoryAllocator limits configurable and extensible by
@​JimBobSquarePants in SixLabors/ImageSharp#3165

## New Contributors
* @​Erik-White made their first contribution in
SixLabors/ImageSharp#3136

**Full Changelog**:
SixLabors/ImageSharp@v4.0.0...v4.1.0

## 4.0.0

## What's Changed
* Update to net8 by @​stefannikolei in
SixLabors/ImageSharp#2583
* Handle dedup of local palette of 256 length - Main by
@​JimBobSquarePants in SixLabors/ImageSharp#2607
* Replace custom Crc32 by @​JimBobSquarePants in
SixLabors/ImageSharp#2611
* Sync 3.1 DrawImage fixes by @​tocsoft in
SixLabors/ImageSharp#2612
* Fix handling gif encoding for global palettes - Main by
@​JimBobSquarePants in SixLabors/ImageSharp#2615
* Bump actions/setup-dotnet from 3 to 4 by @​dependabot[bot] in
SixLabors/ImageSharp#2613
* Adjusted the casing of the Webp format name by @​jscarle in
SixLabors/ImageSharp#2623
* Fix Paeth Filter decode on platforms that do not support Ssse3 - Main
by @​JimBobSquarePants in
SixLabors/ImageSharp#2620
* Fix WebP animation speed bug by @​marklagendijk in
SixLabors/ImageSharp#2624
* Promote PixelTypeInfo to Pixel by @​stefannikolei in
SixLabors/ImageSharp#2601
* TGA: Treat 32 bit True Color images always as transparent by
@​brianpopow in SixLabors/ImageSharp#2643
* Modernize and optimize pixel format operations across platforms. by
@​JimBobSquarePants in SixLabors/ImageSharp#2645
* Cleanup SimdUtils by @​JimBobSquarePants in
SixLabors/ImageSharp#2654
* Bump actions/cache from 3 to 4 by @​dependabot[bot] in
SixLabors/ImageSharp#2648
* Bump codecov/codecov-action from 3 to 4 by @​dependabot[bot] in
SixLabors/ImageSharp#2657
* Bump NuGet/setup-nuget from 1 to 2 by @​dependabot[bot] in
SixLabors/ImageSharp#2658
* Add v3.1.x fixes #​2673 and #​2674 into main. by @​JimBobSquarePants
in SixLabors/ImageSharp#2675
* Add fixes 2668, 2676, and 2677 to main by @​JimBobSquarePants in
SixLabors/ImageSharp#2678
* Merge 2681 to v4 Main by @​JimBobSquarePants in
SixLabors/ImageSharp#2690
* Add JPEG COM marker support by @​RobertMut in
SixLabors/ImageSharp#2641
* Bump actions/upload-artifact from 3 to 4 by @​dependabot[bot] in
SixLabors/ImageSharp#2625
* Only exit JPEG scan decoding after multiple EOF hits by
@​JimBobSquarePants in SixLabors/ImageSharp#2701
* V4 Ensure VP8X alpha flag is updated correctly. by @​JimBobSquarePants
in SixLabors/ImageSharp#2703
* Fix animated png handling (issue #​2708) by @​SpaceCheetah in
SixLabors/ImageSharp#2710
* Merge latest release from v3 by @​JimBobSquarePants in
SixLabors/ImageSharp#2720
* Fix MacOS jobs by @​antonfirsov in
SixLabors/ImageSharp#2728
* Fix async-over-sync issue in Image.DecodeAsync() by @​kroymann in
SixLabors/ImageSharp#2725
* Fix overflow in MemoryAllocator.Create(options) by @​antonfirsov in
SixLabors/ImageSharp#2730
* GifDecoder: Limit lzw bits to a maximum of 12 bits by @​brianpopow in
SixLabors/ImageSharp#2744
* GifDecoder : Allow skipping bad metadata using identify by
@​JimBobSquarePants in SixLabors/ImageSharp#2749
* Add ICO and CUR file decoder. by @​frg2089 in
SixLabors/ImageSharp#2579
* v4 - Fix off-by-one error when centering a transform. by
@​JimBobSquarePants in SixLabors/ImageSharp#2761
* v4 Fix 2758 by @​JimBobSquarePants in
SixLabors/ImageSharp#2764
* Simplify Color Space Conversion APIs by @​JimBobSquarePants in
SixLabors/ImageSharp#2739
* Webp: Fix Issue 2763 by @​brianpopow in
SixLabors/ImageSharp#2767
* V4 Correctly break during Png decoding by @​JimBobSquarePants in
SixLabors/ImageSharp#2773
* V4 : Fix filtering on PNG encode. by @​JimBobSquarePants in
SixLabors/ImageSharp#2778
* Fix #​2779 buffer overrun by @​KirillAldashkin in
SixLabors/ImageSharp#2780
* Fix ImageMetadata docs typo by @​lofcz in
SixLabors/ImageSharp#2781
* Add API for metadata conversion between formats. by
@​JimBobSquarePants in SixLabors/ImageSharp#2751
* Tiff decoder: Fix issue 2679 by @​brianpopow in
SixLabors/ImageSharp#2789
* Replace PngCrcChunkHandling by @​JimBobSquarePants in
SixLabors/ImageSharp#2786
* Add tagname to debugger visualization for Exif- and Iptc-values, to
facilitate easier debugging and discovery by @​lassevk in
SixLabors/ImageSharp#2787
* V4 - Correctly handle transform spaces when building transform
matrices. by @​JimBobSquarePants in
SixLabors/ImageSharp#2795
* Allow decoding Tiff of different frame size. by @​JimBobSquarePants in
SixLabors/ImageSharp#2788
* Add progressive JPEG encoder by @​ardabada in
SixLabors/ImageSharp#2740
* Fix using dither in BmpEncoder when bit per pixel is <= 4 by @​mistoll
in SixLabors/ImageSharp#2819
* Add QuadDistortion to ProjectiveTransformBuilder by @​Socolin in
SixLabors/ImageSharp#2748
* WEBP : Use Correct Width With AlphaDecoder by @​JimBobSquarePants in
SixLabors/ImageSharp#2823
 ... (truncated)

## 3.1.12

## What's Changed
* v3 : Add Full Metadata Parsing for WEBP Animations by
@​JimBobSquarePants in SixLabors/ImageSharp#3002
* V3: Prevent negative allocation attempt for huge TIFF files by
@​JimBobSquarePants in SixLabors/ImageSharp#3004
* Backport v3 : Tiff decoder: Fix issue 2679 by @​JimBobSquarePants in
SixLabors/ImageSharp#3007


**Full Changelog**:
SixLabors/ImageSharp@v3.1.11...v3.1.12

## 3.1.11

## What's Changed
* Backport V3 - GIF: Check for end of stream when reading comments. by
@​JimBobSquarePants in SixLabors/ImageSharp#2955


**Full Changelog**:
SixLabors/ImageSharp@v3.1.10...v3.1.11

## 3.1.10

## What's Changed
* V3: Remove ExifTagValue.InteroperabilityIndex by @​JimBobSquarePants
in SixLabors/ImageSharp#2939
* V3 TIFF : Allow additional and undefined extra samples by
@​JimBobSquarePants in SixLabors/ImageSharp#2942
* V3 Use EXIF byte order for EXIF encoded strings. by
@​JimBobSquarePants in SixLabors/ImageSharp#2944
* V3 Backport : Reduce the number of memory allocations in lossless WebP
encoder by @​JimBobSquarePants in
SixLabors/ImageSharp#2947


**Full Changelog**:
SixLabors/ImageSharp@v3.1.9...v3.1.10

## 3.1.9

## What's Changed
* V3: Do not attempt to decode iDAT chunks when image is fully decoded.
by @​JimBobSquarePants in
SixLabors/ImageSharp#2927
* V3 - Do not throw exception for non-required chunks. by
@​JimBobSquarePants in SixLabors/ImageSharp#2929
* V3: Do not encode WEBP images exceeding max dimensions by
@​JimBobSquarePants in SixLabors/ImageSharp#2931


**Full Changelog**:
SixLabors/ImageSharp@v3.1.8...v3.1.9

## 3.1.8

## What's Changed
* V3 : Fix GIF, PNG, and WEBP Edge Case Handling by @​JimBobSquarePants
in SixLabors/ImageSharp#2882
* V3 Nested sub ifds parsing fix by @​JimBobSquarePants in
SixLabors/ImageSharp#2913
* V3: Undo horizontal prediction for each tile row in case of tiled
tiff's by @​JimBobSquarePants in
SixLabors/ImageSharp#2914
* V3 - Use BPP from Color Writer for Compressor by @​JimBobSquarePants
in SixLabors/ImageSharp#2915


**Full Changelog**:
SixLabors/ImageSharp@v3.1.7...v3.1.8

## 3.1.7

## What's Changed
* V3 : Decode Chunky Tile Rows Directly. by @​JimBobSquarePants in
SixLabors/ImageSharp#2874
* V3: Gracefully handle LZW overflows by @​JimBobSquarePants in
SixLabors/ImageSharp#2880
* [3.1] Set LangVersion=12 unconditionally by @​antonfirsov in
SixLabors/ImageSharp#2896


**Full Changelog**:
SixLabors/ImageSharp@v3.1.6...v3.1.7

## 3.1.6

## What's Changed
* Mono AOT decoder workaround for slow jpeg decoding. by
@​JimBobSquarePants in SixLabors/ImageSharp#2762
* V3 - Correctly handle transform spaces when building transform
matrices. by @​JimBobSquarePants in
SixLabors/ImageSharp#2791
* Backport : V3 Fix #​2779 buffer overrun by @​JimBobSquarePants in
SixLabors/ImageSharp#2824
* Backport - v3 WEBP : Use Correct Width With AlphaDecoder by
@​JimBobSquarePants in SixLabors/ImageSharp#2827
* Rewrite ChunkedMemoryStream by @​JimBobSquarePants in
SixLabors/ImageSharp#2828


**Full Changelog**:
SixLabors/ImageSharp@v3.1.5...v3.1.6

## 3.1.5

## What's Changed
* [3.1] Fix overflow in MemoryAllocator.Create(options) by @​antonfirsov
in SixLabors/ImageSharp#2731
* v3 - Backport. Handle out of bounds Gif LZW max code by
@​JimBobSquarePants in SixLabors/ImageSharp#2754
* Fix off-by-one error when centering a transform. by
@​JimBobSquarePants in SixLabors/ImageSharp#2760
* v3.1.x Fix 2758 by @​JimBobSquarePants in
SixLabors/ImageSharp#2759
* v3.1.x - Backport Webp: Fix Issue 2763/2692 by @​JimBobSquarePants in
SixLabors/ImageSharp#2768
* Correctly break during Png decoding by @​JimBobSquarePants in
SixLabors/ImageSharp#2769
* Fix filtering on PNG encode. by @​JimBobSquarePants in
SixLabors/ImageSharp#2775


**Full Changelog**:
SixLabors/ImageSharp@v3.1.4...v3.1.5

## 3.1.4

## What's Changed
* Backport - Only exit JPEG scan decoding after multiple EOF hits by
@​JimBobSquarePants in SixLabors/ImageSharp#2702
* Ensure VP8X alpha flag is updated correctly. by @​JimBobSquarePants in
SixLabors/ImageSharp#2699
* Backport APNG fix to release/3.1.x by @​SpaceCheetah in
SixLabors/ImageSharp#2713
* Limit Read Palette Indices by @​JimBobSquarePants in
SixLabors/ImageSharp#2718
* Limit all memory allocations in the MemoryAllocator layer by
@​antonfirsov in SixLabors/ImageSharp#2706
* Clear Pixel Buffers on Decode. by @​JimBobSquarePants in
SixLabors/ImageSharp#2716


**Full Changelog**:
SixLabors/ImageSharp@v3.1.3...v3.1.4

## 3.1.3

## What's Changed
* Make DrawImage processor more robust to bad input. by
@​JimBobSquarePants in SixLabors/ImageSharp#2673
* Don't skip reading data for animation chunks on identify. by
@​JimBobSquarePants in SixLabors/ImageSharp#2674
* Fix AccessViolationException and hard crash with animated webp by
@​JimBobSquarePants in SixLabors/ImageSharp#2676
* Use a smarter approach to determine the transparent index when
encoding palette Pngs. by @​JimBobSquarePants in
SixLabors/ImageSharp#2677
* Limit ancillary PNG chunk size. by @​JimBobSquarePants in
SixLabors/ImageSharp#2681


**Full Changelog**:
SixLabors/ImageSharp@v3.1.2...v3.1.3

## 3.1.2

## What's Changed
* Fix Paeth Filter decode on platforms that do not support Ssse3 by
@​JimBobSquarePants in SixLabors/ImageSharp#2618
* Backport: Fix WebP animation speed bug by @​JimBobSquarePants in
SixLabors/ImageSharp#2637


**Full Changelog**:
SixLabors/ImageSharp@v3.1.1...v3.1.2

## 3.1.1

## What's Changed
* Handle dedup of local palette of 256 length by @​JimBobSquarePants in
SixLabors/ImageSharp#2605
* Correctly calculate foreground Rectangle when negative background
location is set (3.1 fix) by @​tocsoft in
SixLabors/ImageSharp#2609
* Handle case when Foreground image overhangs bottom of background image
during DrawImage Call (3.1 target) by @​tocsoft in
SixLabors/ImageSharp#2610
* Fix handling gif encoding for global palettes. by @​JimBobSquarePants
in SixLabors/ImageSharp#2614


**Full Changelog**:
SixLabors/ImageSharp@v3.1.0...v3.1.1

## 3.1.0

## What's Changed
* Reduced intermediate allocations by @​gfoidl in
SixLabors/ImageSharp#2415
* Port colorconverter YCbCr and YCCk to arm by @​stefannikolei in
SixLabors/ImageSharp#2417
* Added and used Numerics.Vector{128|256}Count extension by @​gfoidl in
SixLabors/ImageSharp#2422
* Improvements around `fixed` by @​gfoidl in
SixLabors/ImageSharp#2418
* Create vector constants inline and not via ROS<byte> by @​gfoidl in
SixLabors/ImageSharp#2419
* More tests for Webp lossless utils by @​brianpopow in
SixLabors/ImageSharp#2424
* Fix incorrect comments by @​hey-red in
SixLabors/ImageSharp#2426
* Fixed invalid jpeg buffer width compliment for scalar color converters
by @​br3aker in SixLabors/ImageSharp#2427
* Update Readme by @​brianpopow in
SixLabors/ImageSharp#2433
* Add AdvSimd in ComponentProcessor by @​stefannikolei in
SixLabors/ImageSharp#2429
* Fix decoding tiled tiff with unequal tile width and height by
@​brianpopow in SixLabors/ImageSharp#2436
* Fix Vp8Residual costs calculation by @​brianpopow in
SixLabors/ImageSharp#2432
* Fix thresholds for Resize kernel tests by @​brianpopow in
SixLabors/ImageSharp#2440
* Tiff: Undo horizontal predictor for cmyk images by @​brianpopow in
SixLabors/ImageSharp#2459
* fix a typo in XML comment for struct `Rgb48` by @​n0099 in
SixLabors/ImageSharp#2463
* Fix #​2467 bmp encoding issue for BMP with 1 bit per pixel and more
pixels per row than divisible by 8. by @​synercoder in
SixLabors/ImageSharp#2471
* Update Directory.Build.targets by @​Pashkinz92 in
SixLabors/ImageSharp#2468
* bugfix in Rational.cs, when both Nominator and Denominator equals to 0
by @​tsardaryanCamenAI in
SixLabors/ImageSharp#2453
* Fix DrawImage offsetting issues and improve API parameter names. by
@​JimBobSquarePants in SixLabors/ImageSharp#2474
* Use more accurate bit for alpha lookup. by @​JimBobSquarePants in
SixLabors/ImageSharp#2473
* Fix for B&W pbm images with width not dividable by 8 by @​ynse01 in
SixLabors/ImageSharp#2481
* Tiff: ccitt compression, fix for issue #​2451 by @​brianpopow in
SixLabors/ImageSharp#2483
* Use `FileOptions.Asynchronous` when doing async IO by @​Neme12 in
SixLabors/ImageSharp#2488
* Allow JFXX as an App0 marker header by @​JimBobSquarePants in
SixLabors/ImageSharp#2482
* Adding QOI support by @​LuisAlfredo92 in
SixLabors/ImageSharp#2446
* Vectorize TrimTransparentPixels in GifEncoderCore by @​gfoidl in
SixLabors/ImageSharp#2500
* Prevent crafted DOS attack. by @​JimBobSquarePants in
SixLabors/ImageSharp#2501
* Reverse automatic include behavior. by @​JimBobSquarePants in
SixLabors/ImageSharp#2515
* Handle EOF in Jpeg bit reader when data is bad to prevent DOS attack.…
by @​JimBobSquarePants in
SixLabors/ImageSharp#2523
* Fix #​2518 by @​antonfirsov in
SixLabors/ImageSharp#2519
* Fix for issue 2504 - IPTC and ICC profile information being lost
during TIFF file save by @​JeffP134 in
SixLabors/ImageSharp#2535
* Preserve Gif color palettes and deduplicate frame pixels. by
@​JimBobSquarePants in SixLabors/ImageSharp#2455
* Bump actions/checkout from 3 to 4 by @​dependabot in
SixLabors/ImageSharp#2530
* Expose and conserve the color palette for indexed png images. by
@​JimBobSquarePants in SixLabors/ImageSharp#2485
* Change ExifTag TimeZoneOffset to Signed Short by @​Cheesebaron in
SixLabors/ImageSharp#2541
* Expose non-nullable configuration to remove AOT limiting null check by
@​JimBobSquarePants in SixLabors/ImageSharp#2514
* Add GPSHPositioningError exif tag by @​Cheesebaron in
SixLabors/ImageSharp#2543
* Disallow allocation attempts of unrepresentable sizes by @​antonfirsov
in SixLabors/ImageSharp#2545
* Add webp decoder option to handle the background color in ANIM chunk
by @​brianpopow in SixLabors/ImageSharp#2547
* Tiff decoding robustness improvements by @​JimBobSquarePants in
SixLabors/ImageSharp#2550
* PBM decoder robustness improvements and BufferedReadStream
observability by @​antonfirsov in
SixLabors/ImageSharp#2551
* Follow up on post-merge discussions in #​2551 by @​antonfirsov in
SixLabors/ImageSharp#2552
* APNG support by @​Poker-sang in
SixLabors/ImageSharp#2511
* WebP - Reduce the allocations in lossless encoding by
@​JimBobSquarePants in SixLabors/ImageSharp#2546
* Animated webp encoder by @​Poker-sang in
SixLabors/ImageSharp#2569
* Fix boxed quantization and update refs by @​JimBobSquarePants in
SixLabors/ImageSharp#2582
* Explicitly set BitsPerPixel and BitsPerSample to 1 for bicolor
compressed images by @​brianpopow in
SixLabors/ImageSharp#2590
* [fix]: Fixed Unknown App0 Marker add profileResolver missing by
@​JoseEliasSantos in SixLabors/ImageSharp#2566
* Png- Do not attempt to read data for chunks of length 0. by
@​JimBobSquarePants in SixLabors/ImageSharp#2561
 ... (truncated)

## 3.0.2

## What's Changed
* Handle EOF in Jpeg bit reader when data is bad to prevent DOS attack.
by @​JimBobSquarePants in
SixLabors/ImageSharp#2516


**Full Changelog**:
SixLabors/ImageSharp@v3.0.1...v3.0.2

## 3.0.1

## What's Changed
* ISSUE #​2385 - Implementing try get pattern to
TryFindFormatByFileExtension(string extension, [NotNullWhen(true)] out
IImageFormat? format) by @​Ollie-Ave in
SixLabors/ImageSharp#2386
* Remove mac specific skips by @​stefannikolei in
SixLabors/ImageSharp#2384
* Add Arm intrinsics to JpegColorConverter RGB by @​stefannikolei in
SixLabors/ImageSharp#2397
* Add arm64 intrinsics for cmyk converter by @​stefannikolei in
SixLabors/ImageSharp#2400
* Low-hanging fruit codegen optimizations by @​gfoidl in
SixLabors/ImageSharp#2401
* Webp: Dont use using statement for encodedAlphaData by @​brianpopow in
SixLabors/ImageSharp#2412
* Fixed wrong division hack by @​gfoidl in
SixLabors/ImageSharp#2413
* Port GrayscalConverter to Arm by @​stefannikolei in
SixLabors/ImageSharp#2409
* Fix RgbScalar by @​stefannikolei in
SixLabors/ImageSharp#2416

## New Contributors
* @​Ollie-Ave made their first contribution in
SixLabors/ImageSharp#2386

**Full Changelog**:
SixLabors/ImageSharp@v3.0.0...v3.0.1

## 3.0.0

## What's Changed
* Use .NET 6 only by @​JimBobSquarePants in
SixLabors/ImageSharp#2098
* Convolution: Border wrapping modes by @​ynse01 in
SixLabors/ImageSharp#2060
* Use ReadOnlySpan<byte> static data compiler optimization in more
places by @​turbedi in SixLabors/ImageSharp#2101
* Add support for decoding jpeg's with arithmetic coding by @​brianpopow
in SixLabors/ImageSharp#2073
* Replace Array.Clear(array, 0, array.Length) calls with
Array.Clear(array) by @​turbedi in
SixLabors/ImageSharp#2103
* Preserve color profile when encoding bitmaps by @​brianpopow in
SixLabors/ImageSharp#2108
* Preserve color profile when encoding webp images by @​brianpopow in
SixLabors/ImageSharp#2109
* Preserve color profile when encoding PNG images by @​brianpopow in
SixLabors/ImageSharp#2110
* Add support for decoding webp images with animations by @​brianpopow
in SixLabors/ImageSharp#1985
* Jpeg compressed tiff: jpeg decoder should handle the conversion from
YCbCr to RGB by @​brianpopow in
SixLabors/ImageSharp#2124
* Deduce color space as YCbCr if component id's are 1, 2, 3 by
@​brianpopow in SixLabors/ImageSharp#2135
* Bump actions/checkout from 2 to 3 by @​dependabot in
SixLabors/ImageSharp#2145
* Bump actions/setup-dotnet from 1 to 2 by @​dependabot in
SixLabors/ImageSharp#2143
* Bump actions/cache from 2 to 3 by @​dependabot in
SixLabors/ImageSharp#2142
* Bump actions/upload-artifact from 2 to 3 by @​dependabot in
SixLabors/ImageSharp#2146
* Bump codecov/codecov-action from 1 to 3 by @​dependabot in
SixLabors/ImageSharp#2144
* Skip invalid markers during jpeg decoding by @​br3aker in
SixLabors/ImageSharp#2147
* Tiff: Performance improvements for Fax4 decompression by @​brianpopow
in SixLabors/ImageSharp#2134
* Fix regression in TIF image loading by @​brianpopow in
SixLabors/ImageSharp#2150
* Used inline SIMD vectors if they are constants by @​gfoidl in
SixLabors/ImageSharp#2122
* Print environment info on tests start by @​JimBobSquarePants in
SixLabors/ImageSharp#2175
* Update License by @​JimBobSquarePants in
SixLabors/ImageSharp#2176
* Jpeg downscaling decoding by @​br3aker in
SixLabors/ImageSharp#2076
* Add support for decoding tiff images with CieLab color space by
@​brianpopow in SixLabors/ImageSharp#2127
* Assembly Trimming Support by @​ds5678 in
SixLabors/ImageSharp#2160
* Jpeg color space deduction fix by @​br3aker in
SixLabors/ImageSharp#2177
* Add support for decoding tiff with webp compressed data by
@​brianpopow in SixLabors/ImageSharp#2128
* Fix issue when writing lossy webp with alpha data by @​brianpopow in
SixLabors/ImageSharp#2173
* Fix run-length encode compression implementation mistake in tga
encoder by @​l1nxy in SixLabors/ImageSharp#2172
* TGA Encoder/Decoder Improvements by @​brianpopow in
SixLabors/ImageSharp#2197
* Tiff: Make sure 1 Bit compression is only used with 1 bit pixel type
by @​brianpopow in SixLabors/ImageSharp#2201
* Refactor `EnumUtils` and make it AOT-friendly. by @​teo-tsirpanis in
SixLabors/ImageSharp#2200
* Jpeg encoder complete rewrite by @​br3aker in
SixLabors/ImageSharp#2120
* Fix IPTC tags written on jpg files that contains non-English
characters can't be correctly displayed on external apps #​2212 by
@​lmerino-ep in SixLabors/ImageSharp#2213
* Identify transparency for indexed PNG correctly by @​brianpopow in
SixLabors/ImageSharp#2215
* Introduce Shared General Decoder Options plus Specialization by
@​JimBobSquarePants in SixLabors/ImageSharp#2180
* Add option to encode 2-bit Bitmap's by @​brianpopow in
SixLabors/ImageSharp#2220
* Fix AdaptiveThresholdProcessor throws IndexOutOfRangeException by
@​brianpopow in SixLabors/ImageSharp#2221
* Relaxed bmp dimensions validation by @​smorokin in
SixLabors/ImageSharp#2192
* Remove obsolete code by @​JimBobSquarePants in
SixLabors/ImageSharp#2189
* Implement Median Blur processor by @​ynse01 in
SixLabors/ImageSharp#2219
* Make TestFile Image threadsafe. by @​JimBobSquarePants in
SixLabors/ImageSharp#2225
* PNG filter improvements by @​saucecontrol in
SixLabors/ImageSharp#2226
* Use File-Scoped Namespaces and Global Implicit Usings by
@​JimBobSquarePants in SixLabors/ImageSharp#2229
* Fix for issue #​2117 by @​brianpopow in
SixLabors/ImageSharp#2230
* Use System.Half for HalfTypeHelper by @​JimBobSquarePants in
SixLabors/ImageSharp#2233
* [Chore] Remove InlineningOption from ThrowHelpers by @​blouflashdb in
SixLabors/ImageSharp#2234
* Implement AutoLevel processor - Attempt 2 by @​ynse01 in
SixLabors/ImageSharp#2235
* Add TryGetLinearlySeparableComponents and tests by @​JimBobSquarePants
in SixLabors/ImageSharp#2224
 ... (truncated)

## 2.1.13

## What's Changed
* V2 backport: 2243 - Ignore unknown chunks for WEBP by @​sonbua in
SixLabors/ImageSharp#2505

## New Contributors
* @​sonbua made their first contribution in
SixLabors/ImageSharp#2505

**Full Changelog**:
SixLabors/ImageSharp@v2.1.12...v2.1.13

## 2.1.12

## What's Changed
* Backport #​2926 to release/2.1.x by @​mus65 in
SixLabors/ImageSharp#2985

## New Contributors
* @​mus65 made their first contribution in
SixLabors/ImageSharp#2985

**Full Changelog**:
SixLabors/ImageSharp@v2.1.11...v2.1.12

## 2.1.11

## What's Changed
* Backport V2 - GIF: Check for end of stream when reading comments. by
@​JimBobSquarePants in SixLabors/ImageSharp#2971


**Full Changelog**:
SixLabors/ImageSharp@v2.1.10...v2.1.11

## 2.1.10

## What's Changed
* Backport #​2859 to release/2.1.x by @​antonfirsov in
SixLabors/ImageSharp#2890
* Backport #​2701 to 2.1.x [copy] by @​antonfirsov in
SixLabors/ImageSharp#2891


**Full Changelog**:
SixLabors/ImageSharp@v2.1.9...v2.1.10

Commits viewable in [compare
view](SixLabors/ImageSharp@v2.1.9...v4.1.2).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=SixLabors.ImageSharp&package-manager=nuget&previous-version=2.1.9&new-version=4.1.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/microsoft/onnxruntime/network/alerts).

</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants