mirror of
https://github.com/gwdevhub/Daybreak.git
synced 2026-07-15 15:19:57 +00:00
Update dependencies + move to StbImageSharp (#1555)
Co-authored-by: Alexandru Macocian <amacocian@microsoft.com>
This commit is contained in:
@@ -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
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user