From 9a21db12f722ee97fdb90b32260e0d0ed3e643da Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Wed, 19 Nov 2025 21:48:33 +0100 Subject: [PATCH] Core - Add BlendOption.cs --- PckStudio.Core/Extensions/BlendOption.cs | 19 +++++++++++++++++++ PckStudio.Core/Extensions/ImageExtensions.cs | 17 ++++++++++------- 2 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 PckStudio.Core/Extensions/BlendOption.cs diff --git a/PckStudio.Core/Extensions/BlendOption.cs b/PckStudio.Core/Extensions/BlendOption.cs new file mode 100644 index 00000000..fa967d3d --- /dev/null +++ b/PckStudio.Core/Extensions/BlendOption.cs @@ -0,0 +1,19 @@ +using System.Drawing; + +namespace PckStudio.Core.Extensions +{ + public readonly struct BlendOption(Color color, BlendMode blendMode) + { + internal readonly Color Color = color; + internal readonly BlendMode BlendMode = blendMode; + + public static BlendOption Add(Color color) => new BlendOption(color, BlendMode.Add); + public static BlendOption Subtract(Color color) => new BlendOption(color, BlendMode.Subtract); + public static BlendOption Multiply(Color color) => new BlendOption(color, BlendMode.Multiply); + public static BlendOption Average(Color color) => new BlendOption(color, BlendMode.Average); + public static BlendOption DescendingOrder(Color color) => new BlendOption(color, BlendMode.DescendingOrder); + public static BlendOption AscendingOrder(Color color) => new BlendOption(color, BlendMode.AscendingOrder); + public static BlendOption Screen(Color color) => new BlendOption(color, BlendMode.Screen); + public static BlendOption Overlay(Color color) => new BlendOption(color, BlendMode.Overlay); + } +} diff --git a/PckStudio.Core/Extensions/ImageExtensions.cs b/PckStudio.Core/Extensions/ImageExtensions.cs index 8de201ad..36563243 100644 --- a/PckStudio.Core/Extensions/ImageExtensions.cs +++ b/PckStudio.Core/Extensions/ImageExtensions.cs @@ -164,6 +164,9 @@ namespace PckStudio.Core.Extensions } public static Image Blend(this Image image, Color overlayColor, BlendMode mode) + => image.Blend(new BlendOption(overlayColor, mode)); + + public static Image Blend(this Image image, BlendOption blendOption) { if (image is not Bitmap baseImage) return image; @@ -187,9 +190,9 @@ namespace PckStudio.Core.Extensions Unsafe.Write((resultImageData.Scan0 + k).ToPointer(), 0); return; } - var b = ColorExtensions.BlendValues((byte)(color >> 0 & 0xff), overlayColor.B, mode); - var g = ColorExtensions.BlendValues((byte)(color >> 8 & 0xff), overlayColor.G, mode); - var r = ColorExtensions.BlendValues((byte)(color >> 16 & 0xff), overlayColor.R, mode); + var b = ColorExtensions.BlendValues((byte)(color >> 0 & 0xff), blendOption.Color.B, blendOption.BlendMode); + var g = ColorExtensions.BlendValues((byte)(color >> 8 & 0xff), blendOption.Color.G, blendOption.BlendMode); + var r = ColorExtensions.BlendValues((byte)(color >> 16 & 0xff), blendOption.Color.R, blendOption.BlendMode); int blendedValue = a << 24 | r << 16 | g << 8 | b; Unsafe.Write((resultImageData.Scan0 + k).ToPointer(), blendedValue); } @@ -237,12 +240,12 @@ namespace PckStudio.Core.Extensions return bitmapResult; } - public static Image Interpolate(this Image image1, Image image2, double delta) + public static Image Interpolate(this Image source, Image target, double delta) { delta = MathExtensions.Clamp(delta, 0.0, 1.0); - if (image1 is not Bitmap baseImage || image2 is not Bitmap overlayImage || - image1.Width != image2.Width || image1.Height != image2.Height) - return image1; + if (source is not Bitmap baseImage || target is not Bitmap overlayImage || + source.Width != target.Width || source.Height != target.Height) + return source; BitmapData baseImageData = baseImage.LockBits(new Rectangle(Point.Empty, baseImage.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);