Enhance pixel formats and associated-alpha operations with optimizations - #3154
Merged
Conversation
Introduce Rgba32P, Bgra32P, Argb32P, Abgr32P, NormalizedByte4P, and HalfVector4P. Add representation-aware scalar and bulk conversions, optimized pixel operations, and associated-alpha blending across all Porter-Duff modes. Include comprehensive conversion, layout, blending, and performance coverage.
Refactors `Color` to track both exposed and stored alpha representations, adds `ToScaledVector4(PixelAlphaRepresentation)`, and adjusts pixel conversion paths so associated formats preserve canonical values without unnecessary unpremultiply/reassociate loss. This also updates equality/hash behavior to compare canonical scaled values. SIMD helpers are split into `MultiplyAddEstimate` vs `FusedMultiplyAdd`, with byte-to-float normalization updated to match scalar rounding exactly across vector widths. JPEG converters, resize kernels, and Porter-Duff/associated-alpha blending paths were updated to use the appropriate helper for either fast estimate or strict fused rounding semantics. Tests were expanded substantially (including exhaustive component/alpha cases and fused-order checks), incidental test cleanup was applied, benchmark comment snapshots were refreshed, and one black/white reference output image was updated.
Introduce explicit associated/unassociated pixel conversion APIs across `IPixel` and `PixelOperations`, and rework associated-alpha operations to use representation-aware bulk hooks. Update pixel implementations, converters, blenders, and generated code to consistently apply `Premultiply`/`UnPremultiply` semantics, plus SIMD-backed conversion paths for half and signed formats. Fix codec and processing behavior where alpha handling was incorrect or lossy (notably TIFF/EXR decode/encode, convolution/resize/filter/normalization/dithering paths), and add targeted tests for these cases. Expand AOT compiler roots (including EXR and additional pixel/processor coverage), add a new public API test project for pixel-operations extensibility, and add broad alpha-representation and quantization regression coverage.
Introduces `RgbaHalf` and `RgbaHalfP` plus bulk pixel-operation support, updates AOT seeding, and routes EXR decoding through the new scaled conversions. Also fixes scaled/native range handling for half, SNORM, and signed integer pixel formats, and expands tests for the new layouts and edge cases.
…int values' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
…ating point values'" This reverts commit ba4d1df.
Slice the destination span to source length in `Vector4Converters.RgbaCompatible.FromVector4` so SIMD/scalar tails never process spare destination capacity. Expanded pixel-format tests to run across hardware intrinsic configurations, added dedicated RGB24/BGR24 bulk conversion coverage with sentinel checks for out-of-range writes, and relaxed associated-alpha half packing assertions to treat NaN payload differences as valid IEEE behavior.
This was referenced Aug 12, 2026
This was referenced Aug 22, 2026
IhateTrains
added a commit
to ParadoxGameConverters/ImperatorToCK3
that referenced
this pull request
Aug 23, 2026
Updated [SixLabors.ImageSharp](https://github.com/SixLabors/ImageSharp) from 3.1.12 to 4.1.1. <details> <summary>Release notes</summary> _Sourced from [SixLabors.ImageSharp's releases](https://github.com/SixLabors/ImageSharp/releases)._ ## 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) Commits viewable in [compare view](SixLabors/ImageSharp@v3.1.12...v4.1.1). </details> [](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) </details> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: iht <IhateTrains@users.noreply.github.com>
This was referenced Aug 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Prerequisites
Description
This pull request introduces several improvements and new features to the
ImageSharplibrary, focusing on enhanced AOT (Ahead-Of-Time) compilation support, expanded pixel format handling, and increased alpha representation awareness in theColorstruct. Additionally, a new test project is added to the solution. The most important changes are summarized below.AOT Compiler and Pixel Format Support
Argb32P,Abgr32P,Bgra32P,HalfVector4P,NormalizedByte4P,Rgb96,Rgba128,Rgba32P,RgbaHalf,RgbaHalfP) in both pixel seeding and image cloning withinAotCompilerTools.cs. This ensures these formats are available and optimized for AOT compilation scenarios. [1] [2] [3] [4]ExrEncoder,ExrDecoder, and their core methods in the compilation routines. [1] [2] [3] [4] [5]AutoLevelProcessor,ConvolutionProcessor, andMedianBlurProcessor, to broaden the range of supported image operations in AOT environments. [1] [2]ColorStruct and Alpha Representation EnhancementsColorstruct to explicitly track and expose the alpha representation (Associatedvs.Unassociated) for both the color and its underlying data. This includes new constructor parameters, properties, and improved handling when converting from pixels or vectors. [1] [2]FromPixel,FromScaledVector, and their bulk span-based overloads to properly propagate alpha representation, ensuring accurate color conversions and preventing data loss, especially for associated alpha formats. [1] [2] [3]WithAlphaandToHexmethods to use the correct alpha representation and ensure consistent, precise color manipulation and serialization. [1] [2]Solution and Project Structure
ImageSharp.PublicApi.Testsproject to the solution (ImageSharp.sln), including build configuration and solution folder mapping, to improve public API test coverage. [1] [2] [3]These changes collectively enhance the robustness, flexibility, and future-proofing of
ImageSharpfor both runtime and compile-time scenarios.