From 89c33fae6841dd9c35e62cd6e32e9dfeffe0d67e Mon Sep 17 00:00:00 2001 From: mbartlett21 <29034492+mbartlett21@users.noreply.github.com> Date: Fri, 30 May 2025 20:32:40 +1000 Subject: [PATCH] [peek, explorer] Update QOI reader for 3-channel images (#39304) ## Summary of the Pull Request Make sure we account for Bitmap row length being a multiple of 4 when reading Qoi files. ## PR Checklist - [x] **Closes:** #31948 - [ ] **Communication:** Not discussed, but a bug fix - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end user facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx ## Detailed Description of the Pull Request / Additional comments ## Validation Steps Performed Built and run and restarted file explorer. Sample files from my comment on the issue (after rewriting each one to force the thumbnail to regenrate): ![image](https://github.com/user-attachments/assets/5874f958-0f03-4683-abe3-d54c979ad2a1) --- src/common/FilePreviewCommon/QoiImage.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/common/FilePreviewCommon/QoiImage.cs b/src/common/FilePreviewCommon/QoiImage.cs index ac315eb832..fd72cb0e29 100644 --- a/src/common/FilePreviewCommon/QoiImage.cs +++ b/src/common/FilePreviewCommon/QoiImage.cs @@ -92,6 +92,9 @@ namespace Microsoft.PowerToys.FilePreviewCommon var run = 0; var chunksLen = fileSize - QOI_PADDING_LENGTH; + var x = 0; + var rowAdd = bitmapData.Stride - (channels * bitmapData.Width); + for (var dataIndex = 0; dataIndex < dataLength; dataIndex += channels) { if (run > 0) @@ -153,6 +156,14 @@ namespace Microsoft.PowerToys.FilePreviewCommon bitmapPixel[3] = pixel.A; } } + + x++; + if (x == bitmapData.Width) + { + // We align dataIndex with the stride + dataIndex += rowAdd; + x = 0; + } } bitmap.UnlockBits(bitmapData);