aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Gtk3
diff options
context:
space:
mode:
authorEmmanuel Hansen <emmausssss@gmail.com>2024-08-31 14:32:53 +0000
committerGitHub <noreply@github.com>2024-08-31 11:32:53 -0300
commite0acde04bb032fd056904b909b3fd00c1a6fb996 (patch)
treec3f146228712153af6f277e0e874d83a56b31d06 /src/Ryujinx.Gtk3
parent3c61d560c39d6edf897183fe33b8047c25d2d895 (diff)
Replace ImageSharp with SkiaSharp everywhere (#7030)
* replace ImageSharp with SkiaSharp for inline keyboard applet rendering * fix avalonia inline keyboard input * remove image sharp from gtk3 project * add skiasharp linux assets * fix whitespace * fix format * fix ico image offset when saving shortcut to windows
Diffstat (limited to 'src/Ryujinx.Gtk3')
-rw-r--r--src/Ryujinx.Gtk3/Program.cs7
-rw-r--r--src/Ryujinx.Gtk3/Ryujinx.Gtk3.csproj1
-rw-r--r--src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs39
-rw-r--r--src/Ryujinx.Gtk3/UI/Windows/AvatarWindow.cs29
-rw-r--r--src/Ryujinx.Gtk3/UI/Windows/UserProfilesManagerWindow.cs10
5 files changed, 44 insertions, 42 deletions
diff --git a/src/Ryujinx.Gtk3/Program.cs b/src/Ryujinx.Gtk3/Program.cs
index 8bb65164..745335ac 100644
--- a/src/Ryujinx.Gtk3/Program.cs
+++ b/src/Ryujinx.Gtk3/Program.cs
@@ -13,7 +13,6 @@ using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Common.Helper;
using Ryujinx.UI.Common.SystemInfo;
using Ryujinx.UI.Widgets;
-using SixLabors.ImageSharp.Formats.Jpeg;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -162,12 +161,6 @@ namespace Ryujinx
});
};
- // Sets ImageSharp Jpeg Encoder Quality.
- SixLabors.ImageSharp.Configuration.Default.ImageFormatsManager.SetEncoder(JpegFormat.Instance, new JpegEncoder()
- {
- Quality = 100,
- });
-
string localConfigurationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ReleaseInformation.ConfigName);
string appDataConfigurationPath = Path.Combine(AppDataManager.BaseDirPath, ReleaseInformation.ConfigName);
diff --git a/src/Ryujinx.Gtk3/Ryujinx.Gtk3.csproj b/src/Ryujinx.Gtk3/Ryujinx.Gtk3.csproj
index b4453f9d..722d6080 100644
--- a/src/Ryujinx.Gtk3/Ryujinx.Gtk3.csproj
+++ b/src/Ryujinx.Gtk3/Ryujinx.Gtk3.csproj
@@ -30,7 +30,6 @@
<PackageReference Include="OpenTK.Graphics" />
<PackageReference Include="SPB" />
<PackageReference Include="SharpZipLib" />
- <PackageReference Include="SixLabors.ImageSharp" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs b/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs
index 0e636792..12139e87 100644
--- a/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs
+++ b/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs
@@ -13,16 +13,13 @@ using Ryujinx.Input.HLE;
using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Common.Helper;
using Ryujinx.UI.Widgets;
-using SixLabors.ImageSharp;
-using SixLabors.ImageSharp.Formats.Png;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Processing;
+using SkiaSharp;
using System;
using System.Diagnostics;
using System.IO;
+using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
-using Image = SixLabors.ImageSharp.Image;
using Key = Ryujinx.Input.Key;
using ScalingFilter = Ryujinx.Graphics.GAL.ScalingFilter;
using Switch = Ryujinx.HLE.Switch;
@@ -404,23 +401,31 @@ namespace Ryujinx.UI
return;
}
- Image image = e.IsBgra ? Image.LoadPixelData<Bgra32>(e.Data, e.Width, e.Height)
- : Image.LoadPixelData<Rgba32>(e.Data, e.Width, e.Height);
+ var colorType = e.IsBgra ? SKColorType.Bgra8888 : SKColorType.Rgba8888;
+ using var image = new SKBitmap(new SKImageInfo(e.Width, e.Height, colorType, SKAlphaType.Premul));
- if (e.FlipX)
- {
- image.Mutate(x => x.Flip(FlipMode.Horizontal));
- }
+ Marshal.Copy(e.Data, 0, image.GetPixels(), e.Data.Length);
+ using var surface = SKSurface.Create(image.Info);
+ var canvas = surface.Canvas;
- if (e.FlipY)
+ if (e.FlipX || e.FlipY)
{
- image.Mutate(x => x.Flip(FlipMode.Vertical));
+ canvas.Clear(SKColors.Transparent);
+
+ float scaleX = e.FlipX ? -1 : 1;
+ float scaleY = e.FlipY ? -1 : 1;
+
+ var matrix = SKMatrix.CreateScale(scaleX, scaleY, image.Width / 2f, image.Height / 2f);
+
+ canvas.SetMatrix(matrix);
}
+ canvas.DrawBitmap(image, new SKPoint());
- image.SaveAsPng(path, new PngEncoder()
- {
- ColorType = PngColorType.Rgb,
- });
+ surface.Flush();
+ using var snapshot = surface.Snapshot();
+ using var encoded = snapshot.Encode(SKEncodedImageFormat.Png, 80);
+ using var file = File.OpenWrite(path);
+ encoded.SaveTo(file);
image.Dispose();
diff --git a/src/Ryujinx.Gtk3/UI/Windows/AvatarWindow.cs b/src/Ryujinx.Gtk3/UI/Windows/AvatarWindow.cs
index d9ecd47b..fcd960df 100644
--- a/src/Ryujinx.Gtk3/UI/Windows/AvatarWindow.cs
+++ b/src/Ryujinx.Gtk3/UI/Windows/AvatarWindow.cs
@@ -9,16 +9,13 @@ using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Common.Memory;
using Ryujinx.HLE.FileSystem;
using Ryujinx.UI.Common.Configuration;
-using SixLabors.ImageSharp;
-using SixLabors.ImageSharp.Formats.Png;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Processing;
+using SkiaSharp;
using System;
using System.Buffers.Binary;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
-using Image = SixLabors.ImageSharp.Image;
+using System.Runtime.InteropServices;
namespace Ryujinx.UI.Windows
{
@@ -144,9 +141,11 @@ namespace Ryujinx.UI.Windows
stream.Position = 0;
- Image avatarImage = Image.LoadPixelData<Rgba32>(DecompressYaz0(stream), 256, 256);
+ using var avatarImage = new SKBitmap(new SKImageInfo(256, 256, SKColorType.Rgba8888));
+ var data = DecompressYaz0(stream);
+ Marshal.Copy(data, 0, avatarImage.GetPixels(), data.Length);
- avatarImage.SaveAsPng(streamPng);
+ avatarImage.Encode(streamPng, SKEncodedImageFormat.Png, 80);
_avatarDict.Add(item.FullPath, streamPng.ToArray());
}
@@ -170,15 +169,23 @@ namespace Ryujinx.UI.Windows
{
using MemoryStream streamJpg = MemoryStreamManager.Shared.GetStream();
- Image avatarImage = Image.Load(data, new PngDecoder());
+ using var avatarImage = SKBitmap.Decode(data);
+ using var surface = SKSurface.Create(avatarImage.Info);
- avatarImage.Mutate(x => x.BackgroundColor(new Rgba32(
+ var background = new SKColor(
(byte)(_backgroundColor.Red * 255),
(byte)(_backgroundColor.Green * 255),
(byte)(_backgroundColor.Blue * 255),
(byte)(_backgroundColor.Alpha * 255)
- )));
- avatarImage.SaveAsJpeg(streamJpg);
+ );
+ var canvas = surface.Canvas;
+ canvas.Clear(background);
+ canvas.DrawBitmap(avatarImage, new SKPoint());
+
+ surface.Flush();
+ using var snapshot = surface.Snapshot();
+ using var encoded = snapshot.Encode(SKEncodedImageFormat.Jpeg, 80);
+ encoded.SaveTo(streamJpg);
return streamJpg.ToArray();
}
diff --git a/src/Ryujinx.Gtk3/UI/Windows/UserProfilesManagerWindow.cs b/src/Ryujinx.Gtk3/UI/Windows/UserProfilesManagerWindow.cs
index d1e5fa9f..77afc5d1 100644
--- a/src/Ryujinx.Gtk3/UI/Windows/UserProfilesManagerWindow.cs
+++ b/src/Ryujinx.Gtk3/UI/Windows/UserProfilesManagerWindow.cs
@@ -4,15 +4,13 @@ using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS.Services.Account.Acc;
using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Widgets;
-using SixLabors.ImageSharp;
-using SixLabors.ImageSharp.Processing;
+using SkiaSharp;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
-using Image = SixLabors.ImageSharp.Image;
namespace Ryujinx.UI.Windows
{
@@ -177,13 +175,13 @@ namespace Ryujinx.UI.Windows
private void ProcessProfileImage(byte[] buffer)
{
- using Image image = Image.Load(buffer);
+ using var image = SKBitmap.Decode(buffer);
- image.Mutate(x => x.Resize(256, 256));
+ image.Resize(new SKImageInfo(256, 256), SKFilterQuality.High);
using MemoryStream streamJpg = MemoryStreamManager.Shared.GetStream();
- image.SaveAsJpeg(streamJpg);
+ image.Encode(streamJpg, SKEncodedImageFormat.Jpeg, 80);
_bufferImageProfile = streamJpg.ToArray();
}