Update dependencies + move to StbImageSharp (#1555)

Co-authored-by: Alexandru Macocian <amacocian@microsoft.com>
This commit is contained in:
2026-06-29 15:58:20 +02:00
parent 890bb26c01
commit 5edb5ff780
3 changed files with 43 additions and 107 deletions
+1 -1
View File
@@ -66,7 +66,7 @@
<PackageReference Include="Serilog.Sinks.Console" />
<PackageReference Include="Serilog.Sinks.Debug" />
<PackageReference Include="SharpCompress" />
<PackageReference Include="SixLabors.ImageSharp" />
<PackageReference Include="StbImageSharp" />
<PackageReference Include="System.Security.Cryptography.ProtectedData" />
</ItemGroup>
@@ -1,13 +1,10 @@
using System.Collections.Concurrent;
using System.Extensions.Core;
using System.Numerics;
using System.Runtime.InteropServices;
using Daybreak.Shared.Models;
using Daybreak.Shared.Models.ColorPalette;
using Daybreak.Shared.Services.Screenshots;
using Microsoft.Extensions.Logging;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using StbImageSharp;
using static Daybreak.Shared.Models.Themes.Theme;
using Color = System.Drawing.Color;
@@ -65,9 +62,9 @@ public sealed class ScreenshotService(
try
{
using var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
using var image = Image.Load<Rgba32>(fileStream);
var image = ImageResult.FromStream(fileStream, ColorComponents.RedGreenBlueAlpha);
var (dominantColor, isDark) = GetDominantColor(image);
var (dominantColor, isDark) = GetDominantColor(image.Data, image.Width, image.Height);
var closestAccent = GetClosestAccentColor(dominantColor);
var entry = new ScreenshotEntry(path, closestAccent, isDark ? LightDarkMode.Dark : LightDarkMode.Light);
EntryCache[path] = entry;
@@ -81,86 +78,25 @@ public sealed class ScreenshotService(
}
}
private static (Color Color, bool IsDark) GetDominantColor(Image<Rgba32> image)
private static (Color Color, bool IsDark) GetDominantColor(ReadOnlySpan<byte> rgba, int width, int height)
{
long totalR = 0, totalG = 0, totalB = 0;
int pixelCount = 0;
int stride = width * 4; // RGBA, 4 bytes per pixel
image.ProcessPixelRows(accessor =>
// Sample every SampleQuality-th pixel of every SampleQuality-th row for performance.
for (int y = 0; y < height; y += SampleQuality)
{
Span<int> rValues = stackalloc int[Vector<int>.Count];
Span<int> gValues = stackalloc int[Vector<int>.Count];
Span<int> bValues = stackalloc int[Vector<int>.Count];
for (int y = 0; y < accessor.Height; y += SampleQuality)
int rowStart = y * stride;
for (int x = 0; x < width; x += SampleQuality)
{
var rowSpan = accessor.GetRowSpan(y);
var byteSpan = MemoryMarshal.AsBytes(rowSpan);
// Process using SIMD where possible
// Each Rgba32 pixel is 4 bytes: R, G, B, A
var vectorSize = Vector<byte>.Count;
var pixelsPerVector = vectorSize / 4; // 4 bytes per pixel
int x = 0;
// SIMD path: process multiple sampled pixels at once
if (Vector.IsHardwareAccelerated && rowSpan.Length >= pixelsPerVector * SampleQuality)
{
var sumR = Vector<long>.Zero;
var sumG = Vector<long>.Zero;
var sumB = Vector<long>.Zero;
int simdPixelCount = 0;
// Collect sampled pixels for SIMD processing
while (x + (Vector<int>.Count * SampleQuality) <= rowSpan.Length)
{
for (int i = 0; i < Vector<int>.Count && x < rowSpan.Length; i++, x += SampleQuality)
{
var pixel = rowSpan[x];
rValues[i] = pixel.R;
gValues[i] = pixel.G;
bValues[i] = pixel.B;
simdPixelCount++;
}
var rVec = new Vector<int>(rValues);
var gVec = new Vector<int>(gValues);
var bVec = new Vector<int>(bValues);
// Widen to long and accumulate
Vector.Widen(rVec, out var rLow, out var rHigh);
Vector.Widen(gVec, out var gLow, out var gHigh);
Vector.Widen(bVec, out var bLow, out var bHigh);
sumR += rLow + rHigh;
sumG += gLow + gHigh;
sumB += bLow + bHigh;
}
// Sum up the vector lanes
for (int i = 0; i < Vector<long>.Count; i++)
{
totalR += sumR[i];
totalG += sumG[i];
totalB += sumB[i];
}
pixelCount += simdPixelCount;
}
// Scalar fallback for remaining pixels
for (; x < rowSpan.Length; x += SampleQuality)
{
var pixel = rowSpan[x];
totalR += pixel.R;
totalG += pixel.G;
totalB += pixel.B;
pixelCount++;
}
int i = rowStart + (x * 4);
totalR += rgba[i];
totalG += rgba[i + 1];
totalB += rgba[i + 2];
pixelCount++;
}
});
}
if (pixelCount == 0)
{
+27 -27
View File
@@ -4,9 +4,9 @@
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="CommunityToolkit.Authentication.Msal" Version="7.1.4" />
<PackageVersion Include="coverlet.collector" Version="10.0.0" />
<PackageVersion Include="coverlet.collector" Version="10.0.1" />
<PackageVersion Include="DiffPlex" Version="1.9.0" />
<PackageVersion Include="FluentAssertions" Version="8.9.0" />
<PackageVersion Include="FluentAssertions" Version="8.10.0" />
<PackageVersion Include="HtmlAgilityPack" Version="1.12.4" />
<PackageVersion Include="ini-parser-netstandard" Version="2.5.3" />
<PackageVersion Include="MegaApiClient" Version="1.10.5" />
@@ -14,34 +14,34 @@
<PackageVersion Include="MemoryPack.Generator" Version="1.21.4" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="5.3.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="5.3.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components" Version="10.0.7" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="10.0.7" />
<PackageVersion Include="Microsoft.AspNetCore.Components" Version="10.0.9" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="10.0.9" />
<PackageVersion Include="Microsoft.Authentication.WebAssembly.Msal" Version="9.0.8" />
<PackageVersion Include="Microsoft.CorrelationVector" Version="1.0.42" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="10.0.7" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="10.0.7" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.7" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.7" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.7" />
<PackageVersion Include="Microsoft.FluentUI.AspNetCore.Components" Version="4.14.1" />
<PackageVersion Include="Microsoft.FluentUI.AspNetCore.Components.Icons" Version="4.14.1" />
<PackageVersion Include="Microsoft.Identity.Client" Version="4.83.3" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.5.1" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="10.0.9" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="10.0.9" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.9" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.9" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.9" />
<PackageVersion Include="Microsoft.FluentUI.AspNetCore.Components" Version="4.14.3" />
<PackageVersion Include="Microsoft.FluentUI.AspNetCore.Components.Icons" Version="4.14.3" />
<PackageVersion Include="Microsoft.Identity.Client" Version="4.85.2" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.7.0" />
<PackageVersion Include="Microsoft.Web.WebView2" Version="1.0.4022.49" />
<PackageVersion Include="MinHook.NET" Version="1.1.2" />
<PackageVersion Include="MSTest.TestAdapter" Version="4.2.1" />
<PackageVersion Include="MSTest.TestFramework" Version="4.2.1" />
<PackageVersion Include="MSTest.TestAdapter" Version="4.2.3" />
<PackageVersion Include="MSTest.TestFramework" Version="4.2.3" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
<PackageVersion Include="NSubstitute" Version="5.3.0" />
<PackageVersion Include="NSubstitute.Analyzers.CSharp" Version="1.0.17" />
<PackageVersion Include="Net.Sdk.Web.Extensions" Version="0.8.13" />
<PackageVersion Include="Net.Sdk.Web.Extensions.SourceGenerators" Version="0.9.6" />
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.15.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Process" Version="1.15.1-beta.1" />
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.16.0" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.16.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.16.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Process" Version="1.16.0-beta.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.15.1" />
<PackageVersion Include="PeNet" Version="6.0.0" />
<PackageVersion Include="PeNet" Version="6.1.2" />
<PackageVersion Include="Photino.Blazor" Version="4.0.13" />
<PackageVersion Include="Plumsy" Version="1.2.0" />
<PackageVersion Include="securifybv.ShellLink" Version="0.1.0" />
@@ -49,19 +49,19 @@
<PackageVersion Include="Serilog.Enrichers.Environment" Version="3.0.1" />
<PackageVersion Include="Serilog.Enrichers.Thread" Version="4.0.0" />
<PackageVersion Include="Serilog.Extensions.Logging" Version="10.0.0" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="10.0.0" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="10.0.1" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
<PackageVersion Include="Serilog.Sinks.Debug" Version="3.0.0" />
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageVersion Include="SevenZipExtractor" Version="1.0.19" />
<PackageVersion Include="SharpCompress" Version="0.47.4" />
<PackageVersion Include="SixLabors.ImageSharp" Version="3.1.12" />
<PackageVersion Include="Scalar.AspNetCore" Version="2.14.6" />
<PackageVersion Include="SharpCompress" Version="0.49.1" />
<PackageVersion Include="StbImageSharp" Version="2.30.15" />
<PackageVersion Include="Scalar.AspNetCore" Version="2.16.6" />
<PackageVersion Include="Sybil" Version="0.8.4" />
<PackageVersion Include="System.IO.Compression" Version="4.3.0" />
<PackageVersion Include="System.Diagnostics.PerformanceCounter" Version="10.0.7" />
<PackageVersion Include="System.Drawing.Common" Version="10.0.7" />
<PackageVersion Include="System.Security.Cryptography.ProtectedData" Version="10.0.7" />
<PackageVersion Include="System.Diagnostics.PerformanceCounter" Version="10.0.9" />
<PackageVersion Include="System.Drawing.Common" Version="10.0.9" />
<PackageVersion Include="System.Security.Cryptography.ProtectedData" Version="10.0.9" />
<PackageVersion Include="System.Linq.Async" Version="6.0.3" />
<PackageVersion Include="System.Reflection.Metadata" Version="9.0.10" />
<PackageVersion Include="System.Text.Json" Version="9.0.10" />