mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/PCK-Studio.git
synced 2026-05-26 21:35:10 +00:00
Core - Add BlendOption.cs
This commit is contained in:
19
PckStudio.Core/Extensions/BlendOption.cs
Normal file
19
PckStudio.Core/Extensions/BlendOption.cs
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user