From bf62d012cebd744518546fe26e2cd08c2ea61469 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Wed, 23 Aug 2023 16:54:26 +0200 Subject: [PATCH 01/65] Feature proposal: Dithering --- Pinta.Effects/CoreEffectsExtension.cs | 11 + .../ForwardErrorDiffusionDitheringEffect.cs | 323 ++++++++++++++++++ 2 files changed, 334 insertions(+) create mode 100644 Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs diff --git a/Pinta.Effects/CoreEffectsExtension.cs b/Pinta.Effects/CoreEffectsExtension.cs index 7f6cf43e1..a8dc5a002 100644 --- a/Pinta.Effects/CoreEffectsExtension.cs +++ b/Pinta.Effects/CoreEffectsExtension.cs @@ -26,6 +26,7 @@ using Mono.Addins; using Pinta.Core; +using Pinta.Effects.Effects; [assembly: Addin ("DefaultEffects", PintaCore.ApplicationVersion, Category = "Core")] [assembly: AddinName ("Default Effects")] @@ -81,6 +82,11 @@ public void Initialize () PintaCore.Effects.RegisterEffect (new TwistEffect ()); PintaCore.Effects.RegisterEffect (new UnfocusEffect ()); PintaCore.Effects.RegisterEffect (new ZoomBlurEffect ()); + + // Effects under development +#if DEBUG + PintaCore.Effects.RegisterEffect (new ForwardErrorDiffusionDitheringEffect ()); +#endif } public void Uninitialize () @@ -126,6 +132,11 @@ public void Uninitialize () PintaCore.Effects.UnregisterInstanceOfEffect (typeof (TwistEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (UnfocusEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (ZoomBlurEffect)); + + // Effects under development +#if DEBUG + PintaCore.Effects.UnregisterInstanceOfEffect (typeof (ForwardErrorDiffusionDitheringEffect)); +#endif } #endregion } diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs new file mode 100644 index 000000000..765e60392 --- /dev/null +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -0,0 +1,323 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using Cairo; +using Pinta.Core; +using Pinta.Gui.Widgets; + +namespace Pinta.Effects.Effects; + +public sealed class ForwardErrorDiffusionDitheringEffect : BaseEffect +{ + public override string Name => Translations.GetString ("Dithering"); + public override bool IsConfigurable => true; + // TODO: Icon + public override string EffectMenuCategory => Translations.GetString ("Test"); // TODO: + public ForwardErrorDiffusionDitheringData Data => (ForwardErrorDiffusionDitheringData) EffectData!; // NRT - Set in constructor + + public ForwardErrorDiffusionDitheringEffect () + { + EffectData = new ForwardErrorDiffusionDitheringData (); + } + + public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan rois) + { + var src_data = src.GetReadOnlyPixelData (); + var original_data = new ColorBgra[src_data.Length]; + src_data.CopyTo (original_data); // Assume this is a writable copy or original + var dst_data = dest.GetPixelData (); + foreach (var rect in rois) { + for (int y = 0; y < rect.Height - Data.DiffusionMatrix.RowsBelow; y++) { + for (int x = Data.DiffusionMatrix.ColumnsToLeft; x < rect.Width - Data.DiffusionMatrix.ColumnsToRight; x++) { + var currentIndex = y * src.Width + x; + var originalPixel = original_data[currentIndex]; + var closestColor = FindClosestPaletteColor (originalPixel); + dst_data[currentIndex] = closestColor; + int errorR = originalPixel.R - closestColor.R; + int errorG = originalPixel.G - closestColor.G; + int errorB = originalPixel.B - closestColor.B; + DistributeError (original_data, x, y, errorR, errorG, errorB, src.Width, src.Height); + } + } + } + } + + private void DistributeError (Span original, int x, int y, int errorR, int errorG, int errorB, int sourceWidth, int sourceHeight) + { + for (int r = 0; r < Data.DiffusionMatrix.Rows; r++) { + for (int c = 0; c < Data.DiffusionMatrix.Columns; c++) { + if (Data.DiffusionMatrix[r, c] is not WeightElement weight) + continue; + var thisY = y + r; + var thisX = x + c - Data.DiffusionMatrix.ColumnsToLeft; + if (thisX >= sourceWidth) + continue; + if (thisY >= sourceHeight) + continue; + int idx = (thisY * sourceWidth) + thisX; + double factor = ((double) weight.Weight) / Data.DiffusionMatrix.TotalWeight; + original[idx] = AddError (original[idx], factor, errorR, errorG, errorB); + } + } + } + + private static ColorBgra AddError (ColorBgra color, double factor, int errorR, int errorG, int errorB) + { + // This function will add the error to the color based on the provided factor + byte newR = (byte) Math.Clamp (color.R + (int) (factor * errorR), byte.MinValue, byte.MaxValue); + byte newG = (byte) Math.Clamp (color.G + (int) (factor * errorG), byte.MinValue, byte.MaxValue); + byte newB = (byte) Math.Clamp (color.B + (int) (factor * errorB), byte.MinValue, byte.MaxValue); + return ColorBgra.FromBgra (newB, newG, newR, 255); + } + + private ColorBgra FindClosestPaletteColor (ColorBgra original) + { + double minDistance = double.MaxValue; + ColorBgra closestColor = ColorBgra.FromBgra (0, 0, 0, 1); + foreach (var paletteColor in Data.Palette) { + double distance = CalculateDistance (original, paletteColor); + if (distance < minDistance) { + minDistance = distance; + closestColor = paletteColor; + } + } + return closestColor; + } + + private static double CalculateDistance (ColorBgra color1, ColorBgra color2) + { + int deltaR = color1.R - color2.R; + int deltaG = color1.G - color2.G; + int deltaB = color1.B - color2.B; + + // Euclidean distance + return Math.Sqrt (deltaR * deltaR + deltaG * deltaG + deltaB * deltaB); + } + + public sealed class ErrorDiffusionMatrix + { + private readonly DiffusionMatrixElement[,] array_2_d; + public int Columns { get; } + public int Rows { get; } + public int TotalWeight { get; } + public int ColumnsToLeft { get; } + public int ColumnsToRight { get; } + public int RowsBelow { get; } + public DiffusionMatrixElement this[int row, int column] => array_2_d[row, column]; + public ErrorDiffusionMatrix (DiffusionMatrixElement[,] array2D) + { + var clone = (DiffusionMatrixElement[,]) array2D.Clone (); + var firstRow = ReadRow (clone, 0); + var firstRowTarget = firstRow.OfType ().Count (); + if (firstRowTarget != 1) throw new ArgumentException ($"First row has to contain exactly one element of type {nameof (TargetPixelElement)}"); + var flattened = Flatten2DArray (clone); + var targetPixels = flattened.OfType ().Count (); + if (targetPixels != 1) throw new ArgumentException ($"Array has to contain exactly one element of type {nameof (TargetPixelElement)}"); + var targetPixelOffset = FirstIndexOfPixel (clone); + var columns = clone.GetLength (1); + var rows = clone.GetLength (0); + ColumnsToLeft = targetPixelOffset; + ColumnsToRight = columns - 1 - targetPixelOffset; + TotalWeight = flattened.OfType ().Select (w => w.Weight).Sum (); + Columns = columns; + Rows = rows; + RowsBelow = rows - 1; + array_2_d = clone; + } + + private static int FirstIndexOfPixel (DiffusionMatrixElement[,] array2D) + { + var columns = array2D.GetLength (1); + for (int i = 0; i < columns; i++) { + if (array2D[0, i].ElementType == DiffusionElementType.TargetPixel) + return i; + } + throw new ArgumentException ($"No item of type {nameof (TargetPixelElement)} found in first row"); + } + + private static IEnumerable ReadRow (T[,] array, int row) + { + var rows = array.GetLength (0); + if (row >= rows) throw new ArgumentOutOfRangeException (nameof (row)); + var columns = array.GetLength (1); + for (int i = 0; i < columns; i++) { + yield return array[row, i]; + } + } + + private static IEnumerable Flatten2DArray (T[,] array) + { + for (int i = 0; i < array.GetLength (0); i++) { + for (int j = 0; j < array.GetLength (1); j++) { + yield return array[i, j]; + } + } + } + } + + public enum DiffusionElementType + { + TargetPixel, + Ignore, + Weight, + } + + public abstract class DiffusionMatrixElement + { + public abstract DiffusionElementType ElementType { get; } + } + + public sealed class TargetPixelElement : DiffusionMatrixElement + { + public static TargetPixelElement Instance { get; } = new TargetPixelElement (); + public override DiffusionElementType ElementType => DiffusionElementType.TargetPixel; + private TargetPixelElement () { } + } + + public sealed class IgnoreElement : DiffusionMatrixElement + { + public static IgnoreElement Instance { get; } = new IgnoreElement (); + public override DiffusionElementType ElementType => DiffusionElementType.Ignore; + private IgnoreElement () { } + } + + public sealed class WeightElement : DiffusionMatrixElement + { + public override DiffusionElementType ElementType => DiffusionElementType.Weight; + public int Weight { get; } + + public WeightElement (int weight) + { + if (weight <= 0) throw new ArgumentOutOfRangeException (nameof (weight), "Weight must be positive"); + Weight = weight; + } + } + + public sealed class ForwardErrorDiffusionDitheringData : EffectData + { + [Caption ("Diffusion Matrix")] + public ErrorDiffusionMatrix DiffusionMatrix { get; set; } = DefaultMatrices.FloydSteinberg; + + private ImmutableArray palette = DefaultPalettes.OldWindows16; + [Caption ("Palette")] + public ImmutableArray Palette { + get => palette; + set { + if (palette.IsDefault) throw new ArgumentException ("Palette array has to be valid", nameof (palette)); + palette = value; + } + } + } + + public static class DefaultMatrices + { + public static ErrorDiffusionMatrix Sierra { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Sierra); + public static ErrorDiffusionMatrix TwoRowSierra { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.TwoRowSierra); + public static ErrorDiffusionMatrix SierraLite { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.SierraLite); + public static ErrorDiffusionMatrix Burkes { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Burkes); + public static ErrorDiffusionMatrix Atkinson { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Atkinson); + public static ErrorDiffusionMatrix Stucki { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Stucki); + public static ErrorDiffusionMatrix JarvisJudiceNinke { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.JarvisJudiceNinke); + public static ErrorDiffusionMatrix FloydSteinberg { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.FloydSteinberg); + public static ErrorDiffusionMatrix FakeFloydSteinberg { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.FakeFloydSteinberg); + } + + private static class DefaultMatrixArrays + { + public static DiffusionMatrixElement[,] Sierra { get; } = { + { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(5), new WeightElement(3), }, + { new WeightElement(2), new WeightElement(4), new WeightElement(5), new WeightElement(4), new WeightElement(2), }, + { IgnoreElement.Instance, new WeightElement(2), new WeightElement(3), new WeightElement(2), IgnoreElement.Instance, }, + }; + + public static DiffusionMatrixElement[,] TwoRowSierra { get; } = { + { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(4), new WeightElement(3), }, + { new WeightElement(1), new WeightElement(2), new WeightElement(3), new WeightElement(2), new WeightElement(1), }, + }; + + public static DiffusionMatrixElement[,] SierraLite { get; } = { + { IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(2), }, + { new WeightElement(1), new WeightElement(1), IgnoreElement.Instance, }, + }; + + public static DiffusionMatrixElement[,] Burkes { get; } = { + { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(8), new WeightElement(4), }, + { new WeightElement(2), new WeightElement(4), new WeightElement(8), new WeightElement(4), new WeightElement(2), }, + }; + + public static DiffusionMatrixElement[,] Atkinson { get; } = { + { IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(1), new WeightElement(1), }, + { new WeightElement(1), new WeightElement(1), new WeightElement(1), IgnoreElement.Instance, }, + { IgnoreElement.Instance, new WeightElement(1), IgnoreElement.Instance, IgnoreElement.Instance, }, + }; + + public static DiffusionMatrixElement[,] Stucki { get; } = { + { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(8), new WeightElement(4), }, + { new WeightElement(2), new WeightElement(4), new WeightElement(8), new WeightElement(4), new WeightElement(2), }, + { new WeightElement(1), new WeightElement(2), new WeightElement(4), new WeightElement(2), new WeightElement(1), }, + }; + + public static DiffusionMatrixElement[,] JarvisJudiceNinke { get; } = { + { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(7), new WeightElement(5), }, + { new WeightElement(3), new WeightElement(5), new WeightElement(7), new WeightElement(5), new WeightElement(3), }, + { new WeightElement(1), new WeightElement(3), new WeightElement(5), new WeightElement(3), new WeightElement(1), }, + }; + + public static DiffusionMatrixElement[,] FloydSteinberg { get; } = { + { IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(7), }, + { new WeightElement(3), new WeightElement(5), new WeightElement(1), } + }; + + public static DiffusionMatrixElement[,] FakeFloydSteinberg { get; } = { + { TargetPixelElement.Instance, new WeightElement(3), }, + { new WeightElement(3), new WeightElement(2), } + }; + } + + private static class DefaultPalettes + { + public static ImmutableArray OldWindows16 => old_windows_16.Value; + public static ImmutableArray WebSafe => web_safe.Value; + + private static readonly Lazy> web_safe; + private static readonly Lazy> old_windows_16; + + static DefaultPalettes () + { + web_safe = new (() => EnumerateWebSafeColorCube ().ToImmutableArray ()); + old_windows_16 = new (() => EnumerateOldWindowsColors ().ToImmutableArray ()); + } + + private static IEnumerable EnumerateOldWindowsColors () + { + yield return ColorBgra.FromBgr (0, 0, 0); // Black + yield return ColorBgra.FromBgr (0, 0, 128); // Blue + yield return ColorBgra.FromBgr (0, 128, 0); // Green + yield return ColorBgra.FromBgr (0, 128, 128); // Cyan + yield return ColorBgra.FromBgr (128, 0, 0); // Red + yield return ColorBgra.FromBgr (128, 0, 128); // Magenta + yield return ColorBgra.FromBgr (128, 64, 0); // Brown + yield return ColorBgra.FromBgr (192, 192, 192); // Light Gray + yield return ColorBgra.FromBgr (128, 128, 128); // Dark Gray + yield return ColorBgra.FromBgr (0, 0, 255); // Light Blue + yield return ColorBgra.FromBgr (0, 255, 0); // Light Green + yield return ColorBgra.FromBgr (0, 255, 255); // Light Cyan + yield return ColorBgra.FromBgr (255, 0, 0); // Light Red + yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta + yield return ColorBgra.FromBgr (255, 255, 0); // Yellow + yield return ColorBgra.FromBgr (255, 255, 255); // White + } + + private static IEnumerable EnumerateWebSafeColorCube () + { + for (byte r = 0; r <= 255; r += 51) { + for (byte g = 0; g <= 255; g += 51) { + for (byte b = 0; b <= 255; b += 51) { + yield return ColorBgra.FromBgr (b, g, r); + } + } + } + } + } +} From 68b14c326629eb26eb39454818eb63ebe99efc94 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Wed, 23 Aug 2023 17:03:19 +0200 Subject: [PATCH 02/65] Fixed spelling mistakes to make the spell checker happy --- .../ForwardErrorDiffusionDitheringEffect.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 765e60392..7313b5060 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -34,30 +34,30 @@ public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan original, int x, int y, int errorR, int errorG, int errorB, int sourceWidth, int sourceHeight) + private void DistributeError (Span original, int x, int y, int errorRed, int errorGreen, int errorBlue, int sourceWidth, int sourceHeight) { for (int r = 0; r < Data.DiffusionMatrix.Rows; r++) { for (int c = 0; c < Data.DiffusionMatrix.Columns; c++) { if (Data.DiffusionMatrix[r, c] is not WeightElement weight) continue; - var thisY = y + r; - var thisX = x + c - Data.DiffusionMatrix.ColumnsToLeft; - if (thisX >= sourceWidth) + var this_y = y + r; + var this_x = x + c - Data.DiffusionMatrix.ColumnsToLeft; + if (this_x >= sourceWidth) continue; - if (thisY >= sourceHeight) + if (this_y >= sourceHeight) continue; - int idx = (thisY * sourceWidth) + thisX; + int idx = (this_y * sourceWidth) + this_x; double factor = ((double) weight.Weight) / Data.DiffusionMatrix.TotalWeight; - original[idx] = AddError (original[idx], factor, errorR, errorG, errorB); + original[idx] = AddError (original[idx], factor, errorRed, errorGreen, errorBlue); } } } From 39d1a29f676c74ecb82ba5d9ddf8ee4e2751a104 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Wed, 23 Aug 2023 17:05:50 +0200 Subject: [PATCH 03/65] Fixed more spelling mistakes to make the spell checker happy --- .../Effects/ForwardErrorDiffusionDitheringEffect.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 7313b5060..91275e357 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -62,12 +62,12 @@ private void DistributeError (Span original, int x, int y, int errorR } } - private static ColorBgra AddError (ColorBgra color, double factor, int errorR, int errorG, int errorB) + private static ColorBgra AddError (ColorBgra color, double factor, int errorRed, int errorGreen, int errorBlue) { // This function will add the error to the color based on the provided factor - byte newR = (byte) Math.Clamp (color.R + (int) (factor * errorR), byte.MinValue, byte.MaxValue); - byte newG = (byte) Math.Clamp (color.G + (int) (factor * errorG), byte.MinValue, byte.MaxValue); - byte newB = (byte) Math.Clamp (color.B + (int) (factor * errorB), byte.MinValue, byte.MaxValue); + byte newR = (byte) Math.Clamp (color.R + (int) (factor * errorRed), byte.MinValue, byte.MaxValue); + byte newG = (byte) Math.Clamp (color.G + (int) (factor * errorGreen), byte.MinValue, byte.MaxValue); + byte newB = (byte) Math.Clamp (color.B + (int) (factor * errorBlue), byte.MinValue, byte.MaxValue); return ColorBgra.FromBgra (newB, newG, newR, 255); } From 00bfc1d0df4dc3d20499e7266de5cf408a0e777a Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Wed, 23 Aug 2023 17:09:57 +0200 Subject: [PATCH 04/65] changed name to variable and used clamping functions in `Utility` --- .../ForwardErrorDiffusionDitheringEffect.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 91275e357..7206fd624 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -24,20 +24,20 @@ public ForwardErrorDiffusionDitheringEffect () public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan rois) { var src_data = src.GetReadOnlyPixelData (); - var original_data = new ColorBgra[src_data.Length]; - src_data.CopyTo (original_data); // Assume this is a writable copy or original + var src_copy = new ColorBgra[src_data.Length]; + src_data.CopyTo (src_copy); // Assume this is a writable copy or original var dst_data = dest.GetPixelData (); foreach (var rect in rois) { for (int y = 0; y < rect.Height - Data.DiffusionMatrix.RowsBelow; y++) { for (int x = Data.DiffusionMatrix.ColumnsToLeft; x < rect.Width - Data.DiffusionMatrix.ColumnsToRight; x++) { var currentIndex = y * src.Width + x; - var originalPixel = original_data[currentIndex]; + var originalPixel = src_copy[currentIndex]; var closestColor = FindClosestPaletteColor (originalPixel); dst_data[currentIndex] = closestColor; int errorRed = originalPixel.R - closestColor.R; int errorGreen = originalPixel.G - closestColor.G; int errorBlue = originalPixel.B - closestColor.B; - DistributeError (original_data, x, y, errorRed, errorGreen, errorBlue, src.Width, src.Height); + DistributeError (src_copy, x, y, errorRed, errorGreen, errorBlue, src.Width, src.Height); } } } @@ -65,9 +65,9 @@ private void DistributeError (Span original, int x, int y, int errorR private static ColorBgra AddError (ColorBgra color, double factor, int errorRed, int errorGreen, int errorBlue) { // This function will add the error to the color based on the provided factor - byte newR = (byte) Math.Clamp (color.R + (int) (factor * errorRed), byte.MinValue, byte.MaxValue); - byte newG = (byte) Math.Clamp (color.G + (int) (factor * errorGreen), byte.MinValue, byte.MaxValue); - byte newB = (byte) Math.Clamp (color.B + (int) (factor * errorBlue), byte.MinValue, byte.MaxValue); + byte newR = Utility.ClampToByte (color.R + (int) (factor * errorRed)); + byte newG = Utility.ClampToByte (color.G + (int) (factor * errorGreen)); + byte newB = Utility.ClampToByte (color.B + (int) (factor * errorBlue)); return ColorBgra.FromBgra (newB, newG, newR, 255); } From c66b6c9255c12957d5d1af1e3f27709d7ea59fcf Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Wed, 23 Aug 2023 17:11:55 +0200 Subject: [PATCH 05/65] Put new effect in `Pinta.Effects` namespace --- Pinta.Effects/CoreEffectsExtension.cs | 1 - Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Pinta.Effects/CoreEffectsExtension.cs b/Pinta.Effects/CoreEffectsExtension.cs index a8dc5a002..9e4deccbd 100644 --- a/Pinta.Effects/CoreEffectsExtension.cs +++ b/Pinta.Effects/CoreEffectsExtension.cs @@ -26,7 +26,6 @@ using Mono.Addins; using Pinta.Core; -using Pinta.Effects.Effects; [assembly: Addin ("DefaultEffects", PintaCore.ApplicationVersion, Category = "Core")] [assembly: AddinName ("Default Effects")] diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 7206fd624..4d4104784 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -6,7 +6,7 @@ using Pinta.Core; using Pinta.Gui.Widgets; -namespace Pinta.Effects.Effects; +namespace Pinta.Effects; public sealed class ForwardErrorDiffusionDitheringEffect : BaseEffect { From 9a181d71e3fbe5205c39cc1c262efd0aae9b6073 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Wed, 23 Aug 2023 18:25:50 +0200 Subject: [PATCH 06/65] Removed unnecessary comment --- Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 4d4104784..dcd244f46 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -25,7 +25,7 @@ public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan Date: Wed, 23 Aug 2023 18:30:27 +0200 Subject: [PATCH 07/65] Added a new default palette --- Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index dcd244f46..8f4447857 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -279,6 +279,7 @@ private static class DefaultPalettes { public static ImmutableArray OldWindows16 => old_windows_16.Value; public static ImmutableArray WebSafe => web_safe.Value; + public static ImmutableArray BlackWhite { get; } private static readonly Lazy> web_safe; private static readonly Lazy> old_windows_16; @@ -287,6 +288,7 @@ static DefaultPalettes () { web_safe = new (() => EnumerateWebSafeColorCube ().ToImmutableArray ()); old_windows_16 = new (() => EnumerateOldWindowsColors ().ToImmutableArray ()); + BlackWhite = ImmutableArray.CreateRange (new[] { ColorBgra.FromBgr (0, 0, 0), ColorBgra.FromBgr (255, 255, 255) }); } private static IEnumerable EnumerateOldWindowsColors () From e35ceea8e85e11cdefca9fe2f13b4dbdda19717f Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Wed, 23 Aug 2023 18:37:54 +0200 Subject: [PATCH 08/65] Corrected overflow that happened when creating web-safe color cube --- .../Effects/ForwardErrorDiffusionDitheringEffect.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 8f4447857..baf0b30f7 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -313,10 +313,10 @@ private static IEnumerable EnumerateOldWindowsColors () private static IEnumerable EnumerateWebSafeColorCube () { - for (byte r = 0; r <= 255; r += 51) { - for (byte g = 0; g <= 255; g += 51) { - for (byte b = 0; b <= 255; b += 51) { - yield return ColorBgra.FromBgr (b, g, r); + for (short r = 0; r <= 255; r += 51) { + for (short g = 0; g <= 255; g += 51) { + for (short b = 0; b <= 255; b += 51) { + yield return ColorBgra.FromBgr ((byte) b, (byte) g, (byte) r); } } } From 186b28c847d987b3d88becc5bd15f66efd63fe94 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Thu, 24 Aug 2023 13:54:46 +0200 Subject: [PATCH 09/65] Overridden `LaunchConfiguration`, as a reminder in the code that it should be implemented --- .../Effects/ForwardErrorDiffusionDitheringEffect.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index baf0b30f7..e830455e8 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -21,6 +21,11 @@ public ForwardErrorDiffusionDitheringEffect () EffectData = new ForwardErrorDiffusionDitheringData (); } + public override void LaunchConfiguration () + { + // TODO: + } + public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan rois) { var src_data = src.GetReadOnlyPixelData (); From 33474f6ce92c7b9929e85f8a23c637234ca9825e Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Thu, 24 Aug 2023 17:19:34 +0200 Subject: [PATCH 10/65] `ForwardErrorDiffusionDitheringData` now has enum-typed fields, so that the standard effect dialog can be used --- .../ForwardErrorDiffusionDitheringEffect.cs | 91 +++++++++++++++---- 1 file changed, 74 insertions(+), 17 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index e830455e8..327e9b9cf 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.ComponentModel; using System.Linq; using Cairo; using Pinta.Core; @@ -32,9 +33,10 @@ public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan original, int x, int y, int errorRed, int errorGreen, int errorBlue, int sourceWidth, int sourceHeight) { - for (int r = 0; r < Data.DiffusionMatrix.Rows; r++) { - for (int c = 0; c < Data.DiffusionMatrix.Columns; c++) { - if (Data.DiffusionMatrix[r, c] is not WeightElement weight) + var diffusionMatrix = GetPredefinedDiffusionMatrix (Data.DiffusionMatrix); + for (int r = 0; r < diffusionMatrix.Rows; r++) { + for (int c = 0; c < diffusionMatrix.Columns; c++) { + if (diffusionMatrix[r, c] is not WeightElement weight) continue; var this_y = y + r; - var this_x = x + c - Data.DiffusionMatrix.ColumnsToLeft; + var this_x = x + c - diffusionMatrix.ColumnsToLeft; if (this_x >= sourceWidth) continue; if (this_y >= sourceHeight) continue; int idx = (this_y * sourceWidth) + this_x; - double factor = ((double) weight.Weight) / Data.DiffusionMatrix.TotalWeight; + double factor = ((double) weight.Weight) / diffusionMatrix.TotalWeight; original[idx] = AddError (original[idx], factor, errorRed, errorGreen, errorBlue); } } @@ -80,7 +83,8 @@ private ColorBgra FindClosestPaletteColor (ColorBgra original) { double minDistance = double.MaxValue; ColorBgra closestColor = ColorBgra.FromBgra (0, 0, 0, 1); - foreach (var paletteColor in Data.Palette) { + var palette = GetPredefinedPalette (Data.Palette); + foreach (var paletteColor in palette) { double distance = CalculateDistance (original, paletteColor); if (distance < minDistance) { minDistance = distance; @@ -199,20 +203,73 @@ public WeightElement (int weight) } } + public enum PredefinedPalettes + { + OldWindows16, + WebSafe, + BlackWhite, + } + + private static ImmutableArray GetPredefinedPalette (PredefinedPalettes choice) + { + switch (choice) { + case PredefinedPalettes.OldWindows16: + return DefaultPalettes.OldWindows16; + case PredefinedPalettes.WebSafe: + return DefaultPalettes.WebSafe; + case PredefinedPalettes.BlackWhite: + return DefaultPalettes.BlackWhite; + default: + throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedPalettes)); + } + } + + public enum PredefinedDiffusionMatrices + { + Sierra, + TwoRowSierra, + SierraLite, + Burkes, + Atkinson, + Stucki, + JarvisJudiceNinke, + FloydSteinberg, + FakeFloydSteinberg, + } + + private static ErrorDiffusionMatrix GetPredefinedDiffusionMatrix (PredefinedDiffusionMatrices choice) + { + switch (choice) { + case PredefinedDiffusionMatrices.Sierra: + return DefaultMatrices.Sierra; + case PredefinedDiffusionMatrices.TwoRowSierra: + return DefaultMatrices.TwoRowSierra; + case PredefinedDiffusionMatrices.SierraLite: + return DefaultMatrices.SierraLite; + case PredefinedDiffusionMatrices.Burkes: + return DefaultMatrices.Burkes; + case PredefinedDiffusionMatrices.Atkinson: + return DefaultMatrices.Atkinson; + case PredefinedDiffusionMatrices.Stucki: + return DefaultMatrices.Stucki; + case PredefinedDiffusionMatrices.JarvisJudiceNinke: + return DefaultMatrices.JarvisJudiceNinke; + case PredefinedDiffusionMatrices.FloydSteinberg: + return DefaultMatrices.FloydSteinberg; + case PredefinedDiffusionMatrices.FakeFloydSteinberg: + return DefaultMatrices.FakeFloydSteinberg; + default: + throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedDiffusionMatrices)); + } + } + public sealed class ForwardErrorDiffusionDitheringData : EffectData { [Caption ("Diffusion Matrix")] - public ErrorDiffusionMatrix DiffusionMatrix { get; set; } = DefaultMatrices.FloydSteinberg; + public PredefinedDiffusionMatrices DiffusionMatrix { get; set; } = PredefinedDiffusionMatrices.FloydSteinberg; - private ImmutableArray palette = DefaultPalettes.OldWindows16; [Caption ("Palette")] - public ImmutableArray Palette { - get => palette; - set { - if (palette.IsDefault) throw new ArgumentException ("Palette array has to be valid", nameof (palette)); - palette = value; - } - } + public PredefinedPalettes Palette { get; set; } = PredefinedPalettes.OldWindows16; } public static class DefaultMatrices From 39a3c1c10bd3da0639c04cfcaed0157cb01ca26b Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Thu, 24 Aug 2023 23:22:22 +0200 Subject: [PATCH 11/65] Added old ms paint palette --- .../ForwardErrorDiffusionDitheringEffect.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 327e9b9cf..7292bdb73 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -208,6 +208,7 @@ public enum PredefinedPalettes OldWindows16, WebSafe, BlackWhite, + OldMsPaint, } private static ImmutableArray GetPredefinedPalette (PredefinedPalettes choice) @@ -219,6 +220,8 @@ private static ImmutableArray GetPredefinedPalette (PredefinedPalette return DefaultPalettes.WebSafe; case PredefinedPalettes.BlackWhite: return DefaultPalettes.BlackWhite; + case PredefinedPalettes.OldMsPaint: + return DefaultPalettes.OldMsPaint; default: throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedPalettes)); } @@ -342,15 +345,18 @@ private static class DefaultPalettes public static ImmutableArray OldWindows16 => old_windows_16.Value; public static ImmutableArray WebSafe => web_safe.Value; public static ImmutableArray BlackWhite { get; } + public static ImmutableArray OldMsPaint => old_ms_paint.Value; private static readonly Lazy> web_safe; private static readonly Lazy> old_windows_16; + private static readonly Lazy> old_ms_paint; static DefaultPalettes () { web_safe = new (() => EnumerateWebSafeColorCube ().ToImmutableArray ()); old_windows_16 = new (() => EnumerateOldWindowsColors ().ToImmutableArray ()); BlackWhite = ImmutableArray.CreateRange (new[] { ColorBgra.FromBgr (0, 0, 0), ColorBgra.FromBgr (255, 255, 255) }); + old_ms_paint = new (() => EnumerateOldMsPaintColors ().ToImmutableArray ()); } private static IEnumerable EnumerateOldWindowsColors () @@ -373,6 +379,39 @@ private static IEnumerable EnumerateOldWindowsColors () yield return ColorBgra.FromBgr (255, 255, 255); // White } + private static IEnumerable EnumerateOldMsPaintColors () + { + // https://wiki.vg-resource.com/ + yield return ColorBgra.FromBgr (0, 0, 0); // Black + yield return ColorBgra.FromBgr (255, 255, 255); // White + yield return ColorBgra.FromBgr (128, 128, 128); // Dark gray + yield return ColorBgra.FromBgr (192, 192, 192); // Light gray + yield return ColorBgra.FromBgr (0, 0, 255); // Red + yield return ColorBgra.FromBgr (0, 0, 128); // Maroon + yield return ColorBgra.FromBgr (0, 255, 255); // Yellow + yield return ColorBgra.FromBgr (0, 128, 128); // Olive + yield return ColorBgra.FromBgr (0, 255, 0); // Lime green + yield return ColorBgra.FromBgr (0, 128, 0); // Green + yield return ColorBgra.FromBgr (255, 255, 0); // Cyan + yield return ColorBgra.FromBgr (128, 128, 0); // Teal + yield return ColorBgra.FromBgr (255, 0, 0); // Blue + yield return ColorBgra.FromBgr (128, 0, 0); // Navy blue + yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta + yield return ColorBgra.FromBgr (128, 0, 128); // Magenta + yield return ColorBgra.FromBgr (128, 255, 255); // Light yellow + yield return ColorBgra.FromBgr (64, 128, 128); // Highball (mossy olive) + yield return ColorBgra.FromBgr (128, 255, 0); // Spring green + yield return ColorBgra.FromBgr (64, 64, 0); // Cyprus (dark teal) + yield return ColorBgra.FromBgr (255, 255, 128); // Electric blue + yield return ColorBgra.FromBgr (255, 128, 0); // Dodger blue + yield return ColorBgra.FromBgr (255, 128, 128); // Light slate blue + yield return ColorBgra.FromBgr (128, 64, 0); // Dark cerulean + yield return ColorBgra.FromBgr (128, 0, 255); // Deep pink + yield return ColorBgra.FromBgr (255, 0, 128); // Electric indigo + yield return ColorBgra.FromBgr (64, 128, 255); // Coral + yield return ColorBgra.FromBgr (0, 64, 128); // Saddle brown + } + private static IEnumerable EnumerateWebSafeColorCube () { for (short r = 0; r <= 255; r += 51) { From 6dcb04b7831f3c6ac0828a012cae019b3308e80c Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Fri, 25 Aug 2023 09:15:07 +0200 Subject: [PATCH 12/65] Launches simple effect dialog --- Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 7292bdb73..4565d3334 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -24,7 +24,7 @@ public ForwardErrorDiffusionDitheringEffect () public override void LaunchConfiguration () { - // TODO: + EffectHelper.LaunchSimpleEffectDialog (this); } public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan rois) From 7739ae24dbf3090013cbe1ecc6ec456a488f6948 Mon Sep 17 00:00:00 2001 From: John Doe Date: Fri, 25 Aug 2023 10:35:36 +0200 Subject: [PATCH 13/65] Debugged in Ubuntu and fixed indexing issues that prevented any pixel from even being changed. Now I must figure out why the effect doesn't work as intended... --- .../ForwardErrorDiffusionDitheringEffect.cs | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 4565d3334..6b26c3f9f 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -30,21 +30,32 @@ public override void LaunchConfiguration () public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan rois) { var src_data = src.GetReadOnlyPixelData (); - var src_copy = new ColorBgra[src_data.Length]; - src_data.CopyTo (src_copy); var dst_data = dest.GetPixelData (); + src_data.CopyTo (dst_data); var diffusionMatrix = GetPredefinedDiffusionMatrix (Data.DiffusionMatrix); +#if DEBUG + System.Console.WriteLine($"ROIs: {rois.Length}"); +#endif foreach (var rect in rois) { - for (int y = 0; y < rect.Height - diffusionMatrix.RowsBelow; y++) { - for (int x = diffusionMatrix.ColumnsToLeft; x < rect.Width - diffusionMatrix.ColumnsToRight; x++) { +#if DEBUG + System.Console.WriteLine($"ROI (top: {rect.Top}, left: {rect.Left}, height: {rect.Height}, width: {rect.Width}, bottom: {rect.Bottom}, right: {rect.Right})"); +#endif + for (int y = rect.Top; y <= rect.Bottom; y++) { +#if DEBUG + System.Console.WriteLine("C"); +#endif + for (int x = rect.Left; x <= rect.Right; x++) { +#if DEBUG + System.Console.WriteLine("D"); +#endif var currentIndex = y * src.Width + x; - var originalPixel = src_copy[currentIndex]; + var originalPixel = src_data[currentIndex]; var closestColor = FindClosestPaletteColor (originalPixel); dst_data[currentIndex] = closestColor; int errorRed = originalPixel.R - closestColor.R; int errorGreen = originalPixel.G - closestColor.G; int errorBlue = originalPixel.B - closestColor.B; - DistributeError (src_copy, x, y, errorRed, errorGreen, errorBlue, src.Width, src.Height); + DistributeError (dst_data, x, y, errorRed, errorGreen, errorBlue, src.Width, src.Height); } } } @@ -59,6 +70,10 @@ private void DistributeError (Span original, int x, int y, int errorR continue; var this_y = y + r; var this_x = x + c - diffusionMatrix.ColumnsToLeft; + if (this_x < 0) + continue; + if (this_y < 0) + continue; if (this_x >= sourceWidth) continue; if (this_y >= sourceHeight) From cc78400bea350fd5cd469c0268a12716b0e75c3c Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Fri, 25 Aug 2023 10:39:47 +0200 Subject: [PATCH 14/65] Fixed formatting --- .../Effects/ForwardErrorDiffusionDitheringEffect.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 6b26c3f9f..a5895280d 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -34,19 +34,19 @@ public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan Date: Fri, 25 Aug 2023 10:40:41 +0200 Subject: [PATCH 15/65] Removed unnecessary class qualification --- .../Effects/ForwardErrorDiffusionDitheringEffect.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index a5895280d..041289667 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -34,19 +34,19 @@ public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan Date: Sun, 27 Aug 2023 15:32:58 +0200 Subject: [PATCH 16/65] Started re-writing the algorithm --- .../Effects/ForwardErrorDiffusionDitheringEffect.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 041289667..be892f695 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -30,6 +30,19 @@ public override void LaunchConfiguration () public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan rois) { var src_data = src.GetReadOnlyPixelData (); + var working_surface = new ColorBgra[src_data.Length]; + src_data.CopyTo(working_surface); + //{ + //for (int i = 0; i < 10; i++) { + //dst_data[i] = ColorBgra.FromBgr(0,0,255); + //} + //return; + //} + var pixelsToTouch = new BitMask(src.Width, src.Height); // Keeping track of pixels inside the ROIs, so that our effect doesn't 'spill over' to pixels outside of them + foreach (var roi in rois) { + pixelsToTouch.Set(roi, true); + } + return; var dst_data = dest.GetPixelData (); src_data.CopyTo (dst_data); var diffusionMatrix = GetPredefinedDiffusionMatrix (Data.DiffusionMatrix); From 8636a6df402760751fcd703f5786643290eb166d Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Sun, 27 Aug 2023 15:36:57 +0200 Subject: [PATCH 17/65] Fixed formatting --- .../ForwardErrorDiffusionDitheringEffect.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index be892f695..7afd82dde 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -31,16 +31,16 @@ public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan Date: Sun, 27 Aug 2023 15:49:49 +0200 Subject: [PATCH 18/65] Another attempt, separating it into a 'working surface' and the destination data itself, So that effect doesn't 'spill over' to pixels outside ROIs --- .../ForwardErrorDiffusionDitheringEffect.cs | 151 ++++++++---------- 1 file changed, 69 insertions(+), 82 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 7afd82dde..fdaaece5d 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -12,11 +12,11 @@ namespace Pinta.Effects; public sealed class ForwardErrorDiffusionDitheringEffect : BaseEffect { public override string Name => Translations.GetString ("Dithering"); - public override bool IsConfigurable => true; - // TODO: Icon - public override string EffectMenuCategory => Translations.GetString ("Test"); // TODO: - public ForwardErrorDiffusionDitheringData Data => (ForwardErrorDiffusionDitheringData) EffectData!; // NRT - Set in constructor - + public override bool IsConfigurable => true; + // TODO: Icon + public override string EffectMenuCategory => Translations.GetString ("Test"); // TODO: + public ForwardErrorDiffusionDitheringData Data => (ForwardErrorDiffusionDitheringData) EffectData!; // NRT - Set in constructor + public ForwardErrorDiffusionDitheringEffect () { EffectData = new ForwardErrorDiffusionDitheringData (); @@ -31,47 +31,34 @@ public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan original, int x, int y, int errorRed, int errorGreen, int errorBlue, int sourceWidth, int sourceHeight) @@ -99,8 +86,8 @@ private void DistributeError (Span original, int x, int y, int errorR } private static ColorBgra AddError (ColorBgra color, double factor, int errorRed, int errorGreen, int errorBlue) - { - // This function will add the error to the color based on the provided factor + { + // This function will add the error to the color based on the provided factor byte newR = Utility.ClampToByte (color.R + (int) (factor * errorRed)); byte newG = Utility.ClampToByte (color.G + (int) (factor * errorGreen)); byte newB = Utility.ClampToByte (color.B + (int) (factor * errorBlue)); @@ -126,9 +113,9 @@ private static double CalculateDistance (ColorBgra color1, ColorBgra color2) { int deltaR = color1.R - color2.R; int deltaG = color1.G - color2.G; - int deltaB = color1.B - color2.B; - - // Euclidean distance + int deltaB = color1.B - color2.B; + + // Euclidean distance return Math.Sqrt (deltaR * deltaR + deltaG * deltaG + deltaB * deltaB); } @@ -389,55 +376,55 @@ static DefaultPalettes () private static IEnumerable EnumerateOldWindowsColors () { - yield return ColorBgra.FromBgr (0, 0, 0); // Black - yield return ColorBgra.FromBgr (0, 0, 128); // Blue - yield return ColorBgra.FromBgr (0, 128, 0); // Green - yield return ColorBgra.FromBgr (0, 128, 128); // Cyan - yield return ColorBgra.FromBgr (128, 0, 0); // Red - yield return ColorBgra.FromBgr (128, 0, 128); // Magenta - yield return ColorBgra.FromBgr (128, 64, 0); // Brown - yield return ColorBgra.FromBgr (192, 192, 192); // Light Gray - yield return ColorBgra.FromBgr (128, 128, 128); // Dark Gray - yield return ColorBgra.FromBgr (0, 0, 255); // Light Blue - yield return ColorBgra.FromBgr (0, 255, 0); // Light Green - yield return ColorBgra.FromBgr (0, 255, 255); // Light Cyan - yield return ColorBgra.FromBgr (255, 0, 0); // Light Red - yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta - yield return ColorBgra.FromBgr (255, 255, 0); // Yellow - yield return ColorBgra.FromBgr (255, 255, 255); // White + yield return ColorBgra.FromBgr (0, 0, 0); // Black + yield return ColorBgra.FromBgr (0, 0, 128); // Blue + yield return ColorBgra.FromBgr (0, 128, 0); // Green + yield return ColorBgra.FromBgr (0, 128, 128); // Cyan + yield return ColorBgra.FromBgr (128, 0, 0); // Red + yield return ColorBgra.FromBgr (128, 0, 128); // Magenta + yield return ColorBgra.FromBgr (128, 64, 0); // Brown + yield return ColorBgra.FromBgr (192, 192, 192); // Light Gray + yield return ColorBgra.FromBgr (128, 128, 128); // Dark Gray + yield return ColorBgra.FromBgr (0, 0, 255); // Light Blue + yield return ColorBgra.FromBgr (0, 255, 0); // Light Green + yield return ColorBgra.FromBgr (0, 255, 255); // Light Cyan + yield return ColorBgra.FromBgr (255, 0, 0); // Light Red + yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta + yield return ColorBgra.FromBgr (255, 255, 0); // Yellow + yield return ColorBgra.FromBgr (255, 255, 255); // White } private static IEnumerable EnumerateOldMsPaintColors () - { - // https://wiki.vg-resource.com/ - yield return ColorBgra.FromBgr (0, 0, 0); // Black - yield return ColorBgra.FromBgr (255, 255, 255); // White - yield return ColorBgra.FromBgr (128, 128, 128); // Dark gray - yield return ColorBgra.FromBgr (192, 192, 192); // Light gray - yield return ColorBgra.FromBgr (0, 0, 255); // Red - yield return ColorBgra.FromBgr (0, 0, 128); // Maroon - yield return ColorBgra.FromBgr (0, 255, 255); // Yellow - yield return ColorBgra.FromBgr (0, 128, 128); // Olive - yield return ColorBgra.FromBgr (0, 255, 0); // Lime green - yield return ColorBgra.FromBgr (0, 128, 0); // Green - yield return ColorBgra.FromBgr (255, 255, 0); // Cyan - yield return ColorBgra.FromBgr (128, 128, 0); // Teal - yield return ColorBgra.FromBgr (255, 0, 0); // Blue - yield return ColorBgra.FromBgr (128, 0, 0); // Navy blue - yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta - yield return ColorBgra.FromBgr (128, 0, 128); // Magenta - yield return ColorBgra.FromBgr (128, 255, 255); // Light yellow - yield return ColorBgra.FromBgr (64, 128, 128); // Highball (mossy olive) - yield return ColorBgra.FromBgr (128, 255, 0); // Spring green - yield return ColorBgra.FromBgr (64, 64, 0); // Cyprus (dark teal) - yield return ColorBgra.FromBgr (255, 255, 128); // Electric blue - yield return ColorBgra.FromBgr (255, 128, 0); // Dodger blue - yield return ColorBgra.FromBgr (255, 128, 128); // Light slate blue - yield return ColorBgra.FromBgr (128, 64, 0); // Dark cerulean - yield return ColorBgra.FromBgr (128, 0, 255); // Deep pink - yield return ColorBgra.FromBgr (255, 0, 128); // Electric indigo - yield return ColorBgra.FromBgr (64, 128, 255); // Coral - yield return ColorBgra.FromBgr (0, 64, 128); // Saddle brown + { + // https://wiki.vg-resource.com/ + yield return ColorBgra.FromBgr (0, 0, 0); // Black + yield return ColorBgra.FromBgr (255, 255, 255); // White + yield return ColorBgra.FromBgr (128, 128, 128); // Dark gray + yield return ColorBgra.FromBgr (192, 192, 192); // Light gray + yield return ColorBgra.FromBgr (0, 0, 255); // Red + yield return ColorBgra.FromBgr (0, 0, 128); // Maroon + yield return ColorBgra.FromBgr (0, 255, 255); // Yellow + yield return ColorBgra.FromBgr (0, 128, 128); // Olive + yield return ColorBgra.FromBgr (0, 255, 0); // Lime green + yield return ColorBgra.FromBgr (0, 128, 0); // Green + yield return ColorBgra.FromBgr (255, 255, 0); // Cyan + yield return ColorBgra.FromBgr (128, 128, 0); // Teal + yield return ColorBgra.FromBgr (255, 0, 0); // Blue + yield return ColorBgra.FromBgr (128, 0, 0); // Navy blue + yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta + yield return ColorBgra.FromBgr (128, 0, 128); // Magenta + yield return ColorBgra.FromBgr (128, 255, 255); // Light yellow + yield return ColorBgra.FromBgr (64, 128, 128); // Highball (mossy olive) + yield return ColorBgra.FromBgr (128, 255, 0); // Spring green + yield return ColorBgra.FromBgr (64, 64, 0); // Cyprus (dark teal) + yield return ColorBgra.FromBgr (255, 255, 128); // Electric blue + yield return ColorBgra.FromBgr (255, 128, 0); // Dodger blue + yield return ColorBgra.FromBgr (255, 128, 128); // Light slate blue + yield return ColorBgra.FromBgr (128, 64, 0); // Dark cerulean + yield return ColorBgra.FromBgr (128, 0, 255); // Deep pink + yield return ColorBgra.FromBgr (255, 0, 128); // Electric indigo + yield return ColorBgra.FromBgr (64, 128, 255); // Coral + yield return ColorBgra.FromBgr (0, 64, 128); // Saddle brown } private static IEnumerable EnumerateWebSafeColorCube () From 400d18cadb99399e498f7fe49f56f2b93150648a Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Sun, 27 Aug 2023 15:50:02 +0200 Subject: [PATCH 19/65] Fixed formatting --- .../ForwardErrorDiffusionDitheringEffect.cs | 126 +++++++++--------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index fdaaece5d..bbe4afe01 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -12,11 +12,11 @@ namespace Pinta.Effects; public sealed class ForwardErrorDiffusionDitheringEffect : BaseEffect { public override string Name => Translations.GetString ("Dithering"); - public override bool IsConfigurable => true; - // TODO: Icon - public override string EffectMenuCategory => Translations.GetString ("Test"); // TODO: - public ForwardErrorDiffusionDitheringData Data => (ForwardErrorDiffusionDitheringData) EffectData!; // NRT - Set in constructor - + public override bool IsConfigurable => true; + // TODO: Icon + public override string EffectMenuCategory => Translations.GetString ("Test"); // TODO: + public ForwardErrorDiffusionDitheringData Data => (ForwardErrorDiffusionDitheringData) EffectData!; // NRT - Set in constructor + public ForwardErrorDiffusionDitheringEffect () { EffectData = new ForwardErrorDiffusionDitheringData (); @@ -31,8 +31,8 @@ public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan original, int x, int y, int errorR } private static ColorBgra AddError (ColorBgra color, double factor, int errorRed, int errorGreen, int errorBlue) - { - // This function will add the error to the color based on the provided factor + { + // This function will add the error to the color based on the provided factor byte newR = Utility.ClampToByte (color.R + (int) (factor * errorRed)); byte newG = Utility.ClampToByte (color.G + (int) (factor * errorGreen)); byte newB = Utility.ClampToByte (color.B + (int) (factor * errorBlue)); @@ -113,9 +113,9 @@ private static double CalculateDistance (ColorBgra color1, ColorBgra color2) { int deltaR = color1.R - color2.R; int deltaG = color1.G - color2.G; - int deltaB = color1.B - color2.B; - - // Euclidean distance + int deltaB = color1.B - color2.B; + + // Euclidean distance return Math.Sqrt (deltaR * deltaR + deltaG * deltaG + deltaB * deltaB); } @@ -376,55 +376,55 @@ static DefaultPalettes () private static IEnumerable EnumerateOldWindowsColors () { - yield return ColorBgra.FromBgr (0, 0, 0); // Black - yield return ColorBgra.FromBgr (0, 0, 128); // Blue - yield return ColorBgra.FromBgr (0, 128, 0); // Green - yield return ColorBgra.FromBgr (0, 128, 128); // Cyan - yield return ColorBgra.FromBgr (128, 0, 0); // Red - yield return ColorBgra.FromBgr (128, 0, 128); // Magenta - yield return ColorBgra.FromBgr (128, 64, 0); // Brown - yield return ColorBgra.FromBgr (192, 192, 192); // Light Gray - yield return ColorBgra.FromBgr (128, 128, 128); // Dark Gray - yield return ColorBgra.FromBgr (0, 0, 255); // Light Blue - yield return ColorBgra.FromBgr (0, 255, 0); // Light Green - yield return ColorBgra.FromBgr (0, 255, 255); // Light Cyan - yield return ColorBgra.FromBgr (255, 0, 0); // Light Red - yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta - yield return ColorBgra.FromBgr (255, 255, 0); // Yellow - yield return ColorBgra.FromBgr (255, 255, 255); // White + yield return ColorBgra.FromBgr (0, 0, 0); // Black + yield return ColorBgra.FromBgr (0, 0, 128); // Blue + yield return ColorBgra.FromBgr (0, 128, 0); // Green + yield return ColorBgra.FromBgr (0, 128, 128); // Cyan + yield return ColorBgra.FromBgr (128, 0, 0); // Red + yield return ColorBgra.FromBgr (128, 0, 128); // Magenta + yield return ColorBgra.FromBgr (128, 64, 0); // Brown + yield return ColorBgra.FromBgr (192, 192, 192); // Light Gray + yield return ColorBgra.FromBgr (128, 128, 128); // Dark Gray + yield return ColorBgra.FromBgr (0, 0, 255); // Light Blue + yield return ColorBgra.FromBgr (0, 255, 0); // Light Green + yield return ColorBgra.FromBgr (0, 255, 255); // Light Cyan + yield return ColorBgra.FromBgr (255, 0, 0); // Light Red + yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta + yield return ColorBgra.FromBgr (255, 255, 0); // Yellow + yield return ColorBgra.FromBgr (255, 255, 255); // White } private static IEnumerable EnumerateOldMsPaintColors () - { - // https://wiki.vg-resource.com/ - yield return ColorBgra.FromBgr (0, 0, 0); // Black - yield return ColorBgra.FromBgr (255, 255, 255); // White - yield return ColorBgra.FromBgr (128, 128, 128); // Dark gray - yield return ColorBgra.FromBgr (192, 192, 192); // Light gray - yield return ColorBgra.FromBgr (0, 0, 255); // Red - yield return ColorBgra.FromBgr (0, 0, 128); // Maroon - yield return ColorBgra.FromBgr (0, 255, 255); // Yellow - yield return ColorBgra.FromBgr (0, 128, 128); // Olive - yield return ColorBgra.FromBgr (0, 255, 0); // Lime green - yield return ColorBgra.FromBgr (0, 128, 0); // Green - yield return ColorBgra.FromBgr (255, 255, 0); // Cyan - yield return ColorBgra.FromBgr (128, 128, 0); // Teal - yield return ColorBgra.FromBgr (255, 0, 0); // Blue - yield return ColorBgra.FromBgr (128, 0, 0); // Navy blue - yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta - yield return ColorBgra.FromBgr (128, 0, 128); // Magenta - yield return ColorBgra.FromBgr (128, 255, 255); // Light yellow - yield return ColorBgra.FromBgr (64, 128, 128); // Highball (mossy olive) - yield return ColorBgra.FromBgr (128, 255, 0); // Spring green - yield return ColorBgra.FromBgr (64, 64, 0); // Cyprus (dark teal) - yield return ColorBgra.FromBgr (255, 255, 128); // Electric blue - yield return ColorBgra.FromBgr (255, 128, 0); // Dodger blue - yield return ColorBgra.FromBgr (255, 128, 128); // Light slate blue - yield return ColorBgra.FromBgr (128, 64, 0); // Dark cerulean - yield return ColorBgra.FromBgr (128, 0, 255); // Deep pink - yield return ColorBgra.FromBgr (255, 0, 128); // Electric indigo - yield return ColorBgra.FromBgr (64, 128, 255); // Coral - yield return ColorBgra.FromBgr (0, 64, 128); // Saddle brown + { + // https://wiki.vg-resource.com/ + yield return ColorBgra.FromBgr (0, 0, 0); // Black + yield return ColorBgra.FromBgr (255, 255, 255); // White + yield return ColorBgra.FromBgr (128, 128, 128); // Dark gray + yield return ColorBgra.FromBgr (192, 192, 192); // Light gray + yield return ColorBgra.FromBgr (0, 0, 255); // Red + yield return ColorBgra.FromBgr (0, 0, 128); // Maroon + yield return ColorBgra.FromBgr (0, 255, 255); // Yellow + yield return ColorBgra.FromBgr (0, 128, 128); // Olive + yield return ColorBgra.FromBgr (0, 255, 0); // Lime green + yield return ColorBgra.FromBgr (0, 128, 0); // Green + yield return ColorBgra.FromBgr (255, 255, 0); // Cyan + yield return ColorBgra.FromBgr (128, 128, 0); // Teal + yield return ColorBgra.FromBgr (255, 0, 0); // Blue + yield return ColorBgra.FromBgr (128, 0, 0); // Navy blue + yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta + yield return ColorBgra.FromBgr (128, 0, 128); // Magenta + yield return ColorBgra.FromBgr (128, 255, 255); // Light yellow + yield return ColorBgra.FromBgr (64, 128, 128); // Highball (mossy olive) + yield return ColorBgra.FromBgr (128, 255, 0); // Spring green + yield return ColorBgra.FromBgr (64, 64, 0); // Cyprus (dark teal) + yield return ColorBgra.FromBgr (255, 255, 128); // Electric blue + yield return ColorBgra.FromBgr (255, 128, 0); // Dodger blue + yield return ColorBgra.FromBgr (255, 128, 128); // Light slate blue + yield return ColorBgra.FromBgr (128, 64, 0); // Dark cerulean + yield return ColorBgra.FromBgr (128, 0, 255); // Deep pink + yield return ColorBgra.FromBgr (255, 0, 128); // Electric indigo + yield return ColorBgra.FromBgr (64, 128, 255); // Coral + yield return ColorBgra.FromBgr (0, 64, 128); // Saddle brown } private static IEnumerable EnumerateWebSafeColorCube () From e351f9e1813740059412ba44e41ca4c1c04426dc Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 27 Aug 2023 16:25:52 +0200 Subject: [PATCH 20/65] I finally understood how the ROIs are being passed as an argument. The color is being quantized but the dithering is not being done. I wonder why --- .../ForwardErrorDiffusionDitheringEffect.cs | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index bbe4afe01..7b3512e7e 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -30,35 +30,21 @@ public override void LaunchConfiguration () public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan rois) { var src_data = src.GetReadOnlyPixelData (); - var working_surface = new ColorBgra[src_data.Length]; - src_data.CopyTo (working_surface); - var pixelsToTouch = new BitMask (src.Width, src.Height); // So that effect doesn't 'spill over' to pixels outside ROIs - foreach (var roi in rois) { - pixelsToTouch.Set (roi, true); - } + var dst_data = dest.GetPixelData (); foreach (var rect in rois) { for (int y = rect.Top; y <= rect.Bottom; y++) { for (int x = rect.Left; x <= rect.Right; x++) { var currentIndex = y * src.Width + x; var originalPixel = src_data[currentIndex]; var closestColor = FindClosestPaletteColor (originalPixel); - working_surface[currentIndex] = closestColor; + dst_data[currentIndex] = closestColor; int errorRed = originalPixel.R - closestColor.R; int errorGreen = originalPixel.G - closestColor.G; int errorBlue = originalPixel.B - closestColor.B; - DistributeError (working_surface, x, y, errorRed, errorGreen, errorBlue, src.Width, src.Height); + DistributeError (dst_data, x, y, errorRed, errorGreen, errorBlue, src.Width, src.Height); } } } - var dst_data = dest.GetPixelData (); - src_data.CopyTo (dst_data); - for (int y = 0; y < pixelsToTouch.Height; y++) { - for (int x = 0; x < pixelsToTouch.Width; x++) { - if (!pixelsToTouch[x, y]) continue; - var index = y * dest.Width + x; - dst_data[index] = working_surface[index]; - } - } } private void DistributeError (Span original, int x, int y, int errorRed, int errorGreen, int errorBlue, int sourceWidth, int sourceHeight) From d4a8f50d3ffb1fcaf61f0314b0bea07e2d2cadb8 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 27 Aug 2023 16:30:19 +0200 Subject: [PATCH 21/65] Finally dithering works --- Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 7b3512e7e..6836a667e 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -35,7 +35,7 @@ public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan Date: Sun, 27 Aug 2023 16:32:02 +0200 Subject: [PATCH 22/65] Fixed formatting --- Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 6836a667e..86c2126f6 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -29,7 +29,7 @@ public override void LaunchConfiguration () public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan rois) { - var src_data = src.GetReadOnlyPixelData (); + //var src_data = src.GetReadOnlyPixelData (); var dst_data = dest.GetPixelData (); foreach (var rect in rois) { for (int y = rect.Top; y <= rect.Bottom; y++) { From 6f54ffabfefbf60c69e84b458ebf096701af1d80 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Mon, 2 Oct 2023 19:52:42 +0200 Subject: [PATCH 23/65] Formatting --- .../ForwardErrorDiffusionDitheringEffect.cs | 113 +++++++----------- 1 file changed, 46 insertions(+), 67 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 86c2126f6..6dc27cc6d 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -29,7 +29,6 @@ public override void LaunchConfiguration () public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan rois) { - //var src_data = src.GetReadOnlyPixelData (); var dst_data = dest.GetPixelData (); foreach (var rect in rois) { for (int y = rect.Top; y <= rect.Bottom; y++) { @@ -158,11 +157,9 @@ private static IEnumerable ReadRow (T[,] array, int row) private static IEnumerable Flatten2DArray (T[,] array) { - for (int i = 0; i < array.GetLength (0); i++) { - for (int j = 0; j < array.GetLength (1); j++) { + for (int i = 0; i < array.GetLength (0); i++) + for (int j = 0; j < array.GetLength (1); j++) yield return array[i, j]; - } - } } } @@ -214,18 +211,13 @@ public enum PredefinedPalettes private static ImmutableArray GetPredefinedPalette (PredefinedPalettes choice) { - switch (choice) { - case PredefinedPalettes.OldWindows16: - return DefaultPalettes.OldWindows16; - case PredefinedPalettes.WebSafe: - return DefaultPalettes.WebSafe; - case PredefinedPalettes.BlackWhite: - return DefaultPalettes.BlackWhite; - case PredefinedPalettes.OldMsPaint: - return DefaultPalettes.OldMsPaint; - default: - throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedPalettes)); - } + return choice switch { + PredefinedPalettes.OldWindows16 => DefaultPalettes.OldWindows16, + PredefinedPalettes.WebSafe => DefaultPalettes.WebSafe, + PredefinedPalettes.BlackWhite => DefaultPalettes.BlackWhite, + PredefinedPalettes.OldMsPaint => DefaultPalettes.OldMsPaint, + _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedPalettes)), + }; } public enum PredefinedDiffusionMatrices @@ -243,28 +235,18 @@ public enum PredefinedDiffusionMatrices private static ErrorDiffusionMatrix GetPredefinedDiffusionMatrix (PredefinedDiffusionMatrices choice) { - switch (choice) { - case PredefinedDiffusionMatrices.Sierra: - return DefaultMatrices.Sierra; - case PredefinedDiffusionMatrices.TwoRowSierra: - return DefaultMatrices.TwoRowSierra; - case PredefinedDiffusionMatrices.SierraLite: - return DefaultMatrices.SierraLite; - case PredefinedDiffusionMatrices.Burkes: - return DefaultMatrices.Burkes; - case PredefinedDiffusionMatrices.Atkinson: - return DefaultMatrices.Atkinson; - case PredefinedDiffusionMatrices.Stucki: - return DefaultMatrices.Stucki; - case PredefinedDiffusionMatrices.JarvisJudiceNinke: - return DefaultMatrices.JarvisJudiceNinke; - case PredefinedDiffusionMatrices.FloydSteinberg: - return DefaultMatrices.FloydSteinberg; - case PredefinedDiffusionMatrices.FakeFloydSteinberg: - return DefaultMatrices.FakeFloydSteinberg; - default: - throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedDiffusionMatrices)); - } + return choice switch { + PredefinedDiffusionMatrices.Sierra => DefaultMatrices.Sierra, + PredefinedDiffusionMatrices.TwoRowSierra => DefaultMatrices.TwoRowSierra, + PredefinedDiffusionMatrices.SierraLite => DefaultMatrices.SierraLite, + PredefinedDiffusionMatrices.Burkes => DefaultMatrices.Burkes, + PredefinedDiffusionMatrices.Atkinson => DefaultMatrices.Atkinson, + PredefinedDiffusionMatrices.Stucki => DefaultMatrices.Stucki, + PredefinedDiffusionMatrices.JarvisJudiceNinke => DefaultMatrices.JarvisJudiceNinke, + PredefinedDiffusionMatrices.FloydSteinberg => DefaultMatrices.FloydSteinberg, + PredefinedDiffusionMatrices.FakeFloydSteinberg => DefaultMatrices.FakeFloydSteinberg, + _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedDiffusionMatrices)), + }; } public sealed class ForwardErrorDiffusionDitheringData : EffectData @@ -292,52 +274,52 @@ public static class DefaultMatrices private static class DefaultMatrixArrays { public static DiffusionMatrixElement[,] Sierra { get; } = { - { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(5), new WeightElement(3), }, - { new WeightElement(2), new WeightElement(4), new WeightElement(5), new WeightElement(4), new WeightElement(2), }, - { IgnoreElement.Instance, new WeightElement(2), new WeightElement(3), new WeightElement(2), IgnoreElement.Instance, }, + { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(5), new WeightElement(3), }, + { new WeightElement(2), new WeightElement(4), new WeightElement(5), new WeightElement(4), new WeightElement(2), }, + { IgnoreElement.Instance, new WeightElement(2), new WeightElement(3), new WeightElement(2), IgnoreElement.Instance, }, }; public static DiffusionMatrixElement[,] TwoRowSierra { get; } = { - { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(4), new WeightElement(3), }, - { new WeightElement(1), new WeightElement(2), new WeightElement(3), new WeightElement(2), new WeightElement(1), }, + { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(4), new WeightElement(3), }, + { new WeightElement(1), new WeightElement(2), new WeightElement(3), new WeightElement(2), new WeightElement(1), }, }; public static DiffusionMatrixElement[,] SierraLite { get; } = { - { IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(2), }, - { new WeightElement(1), new WeightElement(1), IgnoreElement.Instance, }, + { IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(2), }, + { new WeightElement(1), new WeightElement(1), IgnoreElement.Instance, }, }; public static DiffusionMatrixElement[,] Burkes { get; } = { - { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(8), new WeightElement(4), }, - { new WeightElement(2), new WeightElement(4), new WeightElement(8), new WeightElement(4), new WeightElement(2), }, + { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(8), new WeightElement(4), }, + { new WeightElement(2), new WeightElement(4), new WeightElement(8), new WeightElement(4), new WeightElement(2), }, }; public static DiffusionMatrixElement[,] Atkinson { get; } = { - { IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(1), new WeightElement(1), }, - { new WeightElement(1), new WeightElement(1), new WeightElement(1), IgnoreElement.Instance, }, - { IgnoreElement.Instance, new WeightElement(1), IgnoreElement.Instance, IgnoreElement.Instance, }, + { IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(1), new WeightElement(1), }, + { new WeightElement(1), new WeightElement(1), new WeightElement(1), IgnoreElement.Instance, }, + { IgnoreElement.Instance, new WeightElement(1), IgnoreElement.Instance, IgnoreElement.Instance, }, }; public static DiffusionMatrixElement[,] Stucki { get; } = { - { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(8), new WeightElement(4), }, - { new WeightElement(2), new WeightElement(4), new WeightElement(8), new WeightElement(4), new WeightElement(2), }, - { new WeightElement(1), new WeightElement(2), new WeightElement(4), new WeightElement(2), new WeightElement(1), }, + { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(8), new WeightElement(4), }, + { new WeightElement(2), new WeightElement(4), new WeightElement(8), new WeightElement(4), new WeightElement(2), }, + { new WeightElement(1), new WeightElement(2), new WeightElement(4), new WeightElement(2), new WeightElement(1), }, }; public static DiffusionMatrixElement[,] JarvisJudiceNinke { get; } = { - { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(7), new WeightElement(5), }, - { new WeightElement(3), new WeightElement(5), new WeightElement(7), new WeightElement(5), new WeightElement(3), }, - { new WeightElement(1), new WeightElement(3), new WeightElement(5), new WeightElement(3), new WeightElement(1), }, + { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(7), new WeightElement(5), }, + { new WeightElement(3), new WeightElement(5), new WeightElement(7), new WeightElement(5), new WeightElement(3), }, + { new WeightElement(1), new WeightElement(3), new WeightElement(5), new WeightElement(3), new WeightElement(1), }, }; public static DiffusionMatrixElement[,] FloydSteinberg { get; } = { - { IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(7), }, - { new WeightElement(3), new WeightElement(5), new WeightElement(1), } + { IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(7), }, + { new WeightElement(3), new WeightElement(5), new WeightElement(1), } }; public static DiffusionMatrixElement[,] FakeFloydSteinberg { get; } = { - { TargetPixelElement.Instance, new WeightElement(3), }, - { new WeightElement(3), new WeightElement(2), } + { TargetPixelElement.Instance, new WeightElement(3), }, + { new WeightElement(3), new WeightElement(2), } }; } @@ -415,13 +397,10 @@ private static IEnumerable EnumerateOldMsPaintColors () private static IEnumerable EnumerateWebSafeColorCube () { - for (short r = 0; r <= 255; r += 51) { - for (short g = 0; g <= 255; g += 51) { - for (short b = 0; b <= 255; b += 51) { + for (short r = 0; r <= 255; r += 51) + for (short g = 0; g <= 255; g += 51) + for (short b = 0; b <= 255; b += 51) yield return ColorBgra.FromBgr ((byte) b, (byte) g, (byte) r); - } - } - } } } } From 87df8cbb6c4ce7528c571defb21cd87facb52f08 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Mon, 2 Oct 2023 20:21:53 +0200 Subject: [PATCH 24/65] Removed `DiffusionMatrixElement` and inheritors --- .../ForwardErrorDiffusionDitheringEffect.cs | 174 ++++++------------ 1 file changed, 59 insertions(+), 115 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 6dc27cc6d..c93d62fff 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -51,7 +51,8 @@ private void DistributeError (Span original, int x, int y, int errorR var diffusionMatrix = GetPredefinedDiffusionMatrix (Data.DiffusionMatrix); for (int r = 0; r < diffusionMatrix.Rows; r++) { for (int c = 0; c < diffusionMatrix.Columns; c++) { - if (diffusionMatrix[r, c] is not WeightElement weight) + var weight = diffusionMatrix[r, c]; + if (diffusionMatrix[r, c] <= 0) continue; var this_y = y + r; var this_x = x + c - diffusionMatrix.ColumnsToLeft; @@ -64,7 +65,7 @@ private void DistributeError (Span original, int x, int y, int errorR if (this_y >= sourceHeight) continue; int idx = (this_y * sourceWidth) + this_x; - double factor = ((double) weight.Weight) / diffusionMatrix.TotalWeight; + double factor = ((double) weight) / diffusionMatrix.TotalWeight; original[idx] = AddError (original[idx], factor, errorRed, errorGreen, errorBlue); } } @@ -106,55 +107,36 @@ private static double CalculateDistance (ColorBgra color1, ColorBgra color2) public sealed class ErrorDiffusionMatrix { - private readonly DiffusionMatrixElement[,] array_2_d; + private readonly int[,] array_2_d; public int Columns { get; } public int Rows { get; } public int TotalWeight { get; } public int ColumnsToLeft { get; } public int ColumnsToRight { get; } public int RowsBelow { get; } - public DiffusionMatrixElement this[int row, int column] => array_2_d[row, column]; - public ErrorDiffusionMatrix (DiffusionMatrixElement[,] array2D) + public int this[int row, int column] => array_2_d[row, column]; + public ErrorDiffusionMatrix (int[,] array2D, int pixelColumn) { - var clone = (DiffusionMatrixElement[,]) array2D.Clone (); - var firstRow = ReadRow (clone, 0); - var firstRowTarget = firstRow.OfType ().Count (); - if (firstRowTarget != 1) throw new ArgumentException ($"First row has to contain exactly one element of type {nameof (TargetPixelElement)}"); - var flattened = Flatten2DArray (clone); - var targetPixels = flattened.OfType ().Count (); - if (targetPixels != 1) throw new ArgumentException ($"Array has to contain exactly one element of type {nameof (TargetPixelElement)}"); - var targetPixelOffset = FirstIndexOfPixel (clone); - var columns = clone.GetLength (1); + var clone = (int[,]) array2D.Clone (); var rows = clone.GetLength (0); - ColumnsToLeft = targetPixelOffset; - ColumnsToRight = columns - 1 - targetPixelOffset; - TotalWeight = flattened.OfType ().Select (w => w.Weight).Sum (); + if (rows <= 0) throw new ArgumentException ("Array has to have a strictly positive number of rows", nameof (array2D)); + var columns = clone.GetLength (1); + if (columns <= 0) throw new ArgumentException ("Array has to have a strictly positive number of rows", nameof (array2D)); + if (pixelColumn < 0) throw new ArgumentException ("Argument has to refer to a valid column offset", nameof (pixelColumn)); + if (pixelColumn >= columns) throw new ArgumentException ("Argument has to refer to a valid column offset", nameof (pixelColumn)); + if (clone[0, pixelColumn] != 0) throw new ArgumentException ("Target pixel cannot have a nonzero weight"); + var flattened = Flatten2DArray (clone); + if (flattened.Any (w => w < 0)) throw new ArgumentException ("No negative weights", nameof (array2D)); + if (flattened.Take (pixelColumn).Any (w => w != 0)) throw new ArgumentException ("Pixels previous to target cannot have nonzero weights"); + ColumnsToLeft = pixelColumn; + ColumnsToRight = columns - 1 - pixelColumn; + TotalWeight = flattened.Sum (); Columns = columns; Rows = rows; RowsBelow = rows - 1; array_2_d = clone; } - private static int FirstIndexOfPixel (DiffusionMatrixElement[,] array2D) - { - var columns = array2D.GetLength (1); - for (int i = 0; i < columns; i++) { - if (array2D[0, i].ElementType == DiffusionElementType.TargetPixel) - return i; - } - throw new ArgumentException ($"No item of type {nameof (TargetPixelElement)} found in first row"); - } - - private static IEnumerable ReadRow (T[,] array, int row) - { - var rows = array.GetLength (0); - if (row >= rows) throw new ArgumentOutOfRangeException (nameof (row)); - var columns = array.GetLength (1); - for (int i = 0; i < columns; i++) { - yield return array[row, i]; - } - } - private static IEnumerable Flatten2DArray (T[,] array) { for (int i = 0; i < array.GetLength (0); i++) @@ -163,44 +145,6 @@ private static IEnumerable Flatten2DArray (T[,] array) } } - public enum DiffusionElementType - { - TargetPixel, - Ignore, - Weight, - } - - public abstract class DiffusionMatrixElement - { - public abstract DiffusionElementType ElementType { get; } - } - - public sealed class TargetPixelElement : DiffusionMatrixElement - { - public static TargetPixelElement Instance { get; } = new TargetPixelElement (); - public override DiffusionElementType ElementType => DiffusionElementType.TargetPixel; - private TargetPixelElement () { } - } - - public sealed class IgnoreElement : DiffusionMatrixElement - { - public static IgnoreElement Instance { get; } = new IgnoreElement (); - public override DiffusionElementType ElementType => DiffusionElementType.Ignore; - private IgnoreElement () { } - } - - public sealed class WeightElement : DiffusionMatrixElement - { - public override DiffusionElementType ElementType => DiffusionElementType.Weight; - public int Weight { get; } - - public WeightElement (int weight) - { - if (weight <= 0) throw new ArgumentOutOfRangeException (nameof (weight), "Weight must be positive"); - Weight = weight; - } - } - public enum PredefinedPalettes { OldWindows16, @@ -260,66 +204,66 @@ public sealed class ForwardErrorDiffusionDitheringData : EffectData public static class DefaultMatrices { - public static ErrorDiffusionMatrix Sierra { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Sierra); - public static ErrorDiffusionMatrix TwoRowSierra { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.TwoRowSierra); - public static ErrorDiffusionMatrix SierraLite { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.SierraLite); - public static ErrorDiffusionMatrix Burkes { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Burkes); - public static ErrorDiffusionMatrix Atkinson { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Atkinson); - public static ErrorDiffusionMatrix Stucki { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Stucki); - public static ErrorDiffusionMatrix JarvisJudiceNinke { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.JarvisJudiceNinke); - public static ErrorDiffusionMatrix FloydSteinberg { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.FloydSteinberg); - public static ErrorDiffusionMatrix FakeFloydSteinberg { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.FakeFloydSteinberg); + public static ErrorDiffusionMatrix Sierra { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Sierra, 2); + public static ErrorDiffusionMatrix TwoRowSierra { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.TwoRowSierra, 2); + public static ErrorDiffusionMatrix SierraLite { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.SierraLite, 1); + public static ErrorDiffusionMatrix Burkes { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Burkes, 2); + public static ErrorDiffusionMatrix Atkinson { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Atkinson, 1); + public static ErrorDiffusionMatrix Stucki { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Stucki, 2); + public static ErrorDiffusionMatrix JarvisJudiceNinke { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.JarvisJudiceNinke, 2); + public static ErrorDiffusionMatrix FloydSteinberg { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.FloydSteinberg, 1); + public static ErrorDiffusionMatrix FakeFloydSteinberg { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.FakeFloydSteinberg, 0); } private static class DefaultMatrixArrays { - public static DiffusionMatrixElement[,] Sierra { get; } = { - { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(5), new WeightElement(3), }, - { new WeightElement(2), new WeightElement(4), new WeightElement(5), new WeightElement(4), new WeightElement(2), }, - { IgnoreElement.Instance, new WeightElement(2), new WeightElement(3), new WeightElement(2), IgnoreElement.Instance, }, + public static int[,] Sierra { get; } = { + { 0, 0, 0, 5, 3, }, + { 2, 4, 5, 4, 2, }, + { 0, 2, 3, 2, 0, }, }; - public static DiffusionMatrixElement[,] TwoRowSierra { get; } = { - { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(4), new WeightElement(3), }, - { new WeightElement(1), new WeightElement(2), new WeightElement(3), new WeightElement(2), new WeightElement(1), }, + public static int[,] TwoRowSierra { get; } = { + { 0, 0, 0, 4, 3, }, + { 1, 2, 3, 2, 1, }, }; - public static DiffusionMatrixElement[,] SierraLite { get; } = { - { IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(2), }, - { new WeightElement(1), new WeightElement(1), IgnoreElement.Instance, }, + public static int[,] SierraLite { get; } = { + { 0, 0, 2, }, + { 1, 1, 0, }, }; - public static DiffusionMatrixElement[,] Burkes { get; } = { - { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(8), new WeightElement(4), }, - { new WeightElement(2), new WeightElement(4), new WeightElement(8), new WeightElement(4), new WeightElement(2), }, + public static int[,] Burkes { get; } = { + { 0, 0, 0, 8, 4, }, + { 2, 4, 8, 4, 2, }, }; - public static DiffusionMatrixElement[,] Atkinson { get; } = { - { IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(1), new WeightElement(1), }, - { new WeightElement(1), new WeightElement(1), new WeightElement(1), IgnoreElement.Instance, }, - { IgnoreElement.Instance, new WeightElement(1), IgnoreElement.Instance, IgnoreElement.Instance, }, + public static int[,] Atkinson { get; } = { + { 0, 0, 1, 1, }, + { 1, 1, 1, 0, }, + { 0, 1, 0, 0, }, }; - public static DiffusionMatrixElement[,] Stucki { get; } = { - { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(8), new WeightElement(4), }, - { new WeightElement(2), new WeightElement(4), new WeightElement(8), new WeightElement(4), new WeightElement(2), }, - { new WeightElement(1), new WeightElement(2), new WeightElement(4), new WeightElement(2), new WeightElement(1), }, + public static int[,] Stucki { get; } = { + { 0, 0, 0, 8, 4, }, + { 2, 4, 8, 4, 2, }, + { 1, 2, 4, 2, 1, }, }; - public static DiffusionMatrixElement[,] JarvisJudiceNinke { get; } = { - { IgnoreElement.Instance, IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(7), new WeightElement(5), }, - { new WeightElement(3), new WeightElement(5), new WeightElement(7), new WeightElement(5), new WeightElement(3), }, - { new WeightElement(1), new WeightElement(3), new WeightElement(5), new WeightElement(3), new WeightElement(1), }, + public static int[,] JarvisJudiceNinke { get; } = { + { 0, 0, 0, 7, 5, }, + { 3, 5, 7, 5, 3, }, + { 1, 3, 5, 3, 1, }, }; - public static DiffusionMatrixElement[,] FloydSteinberg { get; } = { - { IgnoreElement.Instance, TargetPixelElement.Instance, new WeightElement(7), }, - { new WeightElement(3), new WeightElement(5), new WeightElement(1), } + public static int[,] FloydSteinberg { get; } = { + { 0, 0, 7, }, + { 3, 5, 1, } }; - public static DiffusionMatrixElement[,] FakeFloydSteinberg { get; } = { - { TargetPixelElement.Instance, new WeightElement(3), }, - { new WeightElement(3), new WeightElement(2), } + public static int[,] FakeFloydSteinberg { get; } = { + { 0, 3, }, + { 3, 2, } }; } From f1e02ae3a535e1a07071d363c9b935e88a8981ad Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Thu, 12 Oct 2023 16:39:26 +0200 Subject: [PATCH 25/65] Added missing property --- .../ForwardErrorDiffusionDitheringEffect.cs | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index c93d62fff..87af2c0d5 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -17,6 +17,8 @@ public sealed class ForwardErrorDiffusionDitheringEffect : BaseEffect public override string EffectMenuCategory => Translations.GetString ("Test"); // TODO: public ForwardErrorDiffusionDitheringData Data => (ForwardErrorDiffusionDitheringData) EffectData!; // NRT - Set in constructor + public override bool IsTileable => false; + public ForwardErrorDiffusionDitheringEffect () { EffectData = new ForwardErrorDiffusionDitheringData (); @@ -74,10 +76,12 @@ private void DistributeError (Span original, int x, int y, int errorR private static ColorBgra AddError (ColorBgra color, double factor, int errorRed, int errorGreen, int errorBlue) { // This function will add the error to the color based on the provided factor - byte newR = Utility.ClampToByte (color.R + (int) (factor * errorRed)); - byte newG = Utility.ClampToByte (color.G + (int) (factor * errorGreen)); - byte newB = Utility.ClampToByte (color.B + (int) (factor * errorBlue)); - return ColorBgra.FromBgra (newB, newG, newR, 255); + return ColorBgra.FromBgra ( + b: Utility.ClampToByte (color.B + (int) (factor * errorBlue)), + g: Utility.ClampToByte (color.G + (int) (factor * errorGreen)), + r: Utility.ClampToByte (color.R + (int) (factor * errorRed)), + a: 255 + ); } private ColorBgra FindClosestPaletteColor (ColorBgra original) @@ -87,10 +91,10 @@ private ColorBgra FindClosestPaletteColor (ColorBgra original) var palette = GetPredefinedPalette (Data.Palette); foreach (var paletteColor in palette) { double distance = CalculateDistance (original, paletteColor); - if (distance < minDistance) { - minDistance = distance; - closestColor = paletteColor; - } + if (distance >= minDistance) + continue; + minDistance = distance; + closestColor = paletteColor; } return closestColor; } From 6a25aaef002ecd5cf7a89d18817a3834ec67caf2 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos Date: Wed, 18 Oct 2023 17:46:12 +0200 Subject: [PATCH 26/65] Added properties for dithering --- .../ForwardErrorDiffusionDitheringEffect.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 87af2c0d5..2d266a3b4 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -88,7 +88,7 @@ private ColorBgra FindClosestPaletteColor (ColorBgra original) { double minDistance = double.MaxValue; ColorBgra closestColor = ColorBgra.FromBgra (0, 0, 0, 1); - var palette = GetPredefinedPalette (Data.Palette); + var palette = GetPredefinedPalette (Data.ArbitraryPalette); foreach (var paletteColor in palette) { double distance = CalculateDistance (original, paletteColor); if (distance >= minDistance) @@ -181,6 +181,12 @@ public enum PredefinedDiffusionMatrices FakeFloydSteinberg, } + public enum PaletteMode + { + Optimized, + Arbitrary, + } + private static ErrorDiffusionMatrix GetPredefinedDiffusionMatrix (PredefinedDiffusionMatrices choice) { return choice switch { @@ -202,8 +208,14 @@ public sealed class ForwardErrorDiffusionDitheringData : EffectData [Caption ("Diffusion Matrix")] public PredefinedDiffusionMatrices DiffusionMatrix { get; set; } = PredefinedDiffusionMatrices.FloydSteinberg; + [Caption ("Palette Mode")] + public PaletteMode PaletteMode { get; set; } = PaletteMode.Arbitrary; // TODO: Use + + [Caption ("Colors for Optimized Palette")] + public int ColorsForOptimizedPalette { get; set; } = 256; + [Caption ("Palette")] - public PredefinedPalettes Palette { get; set; } = PredefinedPalettes.OldWindows16; + public PredefinedPalettes ArbitraryPalette { get; set; } = PredefinedPalettes.OldWindows16; // TODO: Better data structure } public static class DefaultMatrices From 09f4850aa27707ae1d7ef88bb909c0d99c408a07 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:32:24 +0100 Subject: [PATCH 27/65] Refactoring --- .../ForwardErrorDiffusionDitheringEffect.cs | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 2d266a3b4..c980a604f 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -38,36 +38,44 @@ public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan original, int x, int y, int errorRed, int errorGreen, int errorBlue, int sourceWidth, int sourceHeight) + private void DistributeError (Span original, PointI location, int errorRed, int errorGreen, int errorBlue, int sourceWidth, int sourceHeight) { var diffusionMatrix = GetPredefinedDiffusionMatrix (Data.DiffusionMatrix); + for (int r = 0; r < diffusionMatrix.Rows; r++) { + for (int c = 0; c < diffusionMatrix.Columns; c++) { + var weight = diffusionMatrix[r, c]; - if (diffusionMatrix[r, c] <= 0) - continue; - var this_y = y + r; - var this_x = x + c - diffusionMatrix.ColumnsToLeft; - if (this_x < 0) - continue; - if (this_y < 0) + + if (weight <= 0) continue; - if (this_x >= sourceWidth) + + PointI thisItem = new ( + X: location.X + c - diffusionMatrix.ColumnsToLeft, + Y: location.Y + r + ); + + if (thisItem.X < 0 || thisItem.X >= sourceWidth) continue; - if (this_y >= sourceHeight) + + if (thisItem.Y < 0 || thisItem.Y >= sourceHeight) continue; - int idx = (this_y * sourceWidth) + this_x; + + int idx = (thisItem.Y * sourceWidth) + thisItem.X; + double factor = ((double) weight) / diffusionMatrix.TotalWeight; + original[idx] = AddError (original[idx], factor, errorRed, errorGreen, errorBlue); } } @@ -88,7 +96,7 @@ private ColorBgra FindClosestPaletteColor (ColorBgra original) { double minDistance = double.MaxValue; ColorBgra closestColor = ColorBgra.FromBgra (0, 0, 0, 1); - var palette = GetPredefinedPalette (Data.ArbitraryPalette); + var palette = GetPredefinedPalette (Data.PaletteChoice); foreach (var paletteColor in palette) { double distance = CalculateDistance (original, paletteColor); if (distance >= minDistance) @@ -181,12 +189,6 @@ public enum PredefinedDiffusionMatrices FakeFloydSteinberg, } - public enum PaletteMode - { - Optimized, - Arbitrary, - } - private static ErrorDiffusionMatrix GetPredefinedDiffusionMatrix (PredefinedDiffusionMatrices choice) { return choice switch { @@ -208,14 +210,11 @@ public sealed class ForwardErrorDiffusionDitheringData : EffectData [Caption ("Diffusion Matrix")] public PredefinedDiffusionMatrices DiffusionMatrix { get; set; } = PredefinedDiffusionMatrices.FloydSteinberg; - [Caption ("Palette Mode")] - public PaletteMode PaletteMode { get; set; } = PaletteMode.Arbitrary; // TODO: Use - [Caption ("Colors for Optimized Palette")] public int ColorsForOptimizedPalette { get; set; } = 256; [Caption ("Palette")] - public PredefinedPalettes ArbitraryPalette { get; set; } = PredefinedPalettes.OldWindows16; // TODO: Better data structure + public PredefinedPalettes PaletteChoice { get; set; } = PredefinedPalettes.OldWindows16; } public static class DefaultMatrices From d8fa12e6893e081aad9c1e44454ab5a4767da347 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 12:02:07 +0100 Subject: [PATCH 28/65] Changed method that was overridden --- .../ForwardErrorDiffusionDitheringEffect.cs | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index c980a604f..1ed78f96c 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -29,21 +29,19 @@ public override void LaunchConfiguration () EffectHelper.LaunchSimpleEffectDialog (this); } - public override void Render (ImageSurface src, ImageSurface dest, ReadOnlySpan rois) + protected override void Render (ImageSurface src, ImageSurface dest, RectangleI roi) { var dst_data = dest.GetPixelData (); - foreach (var rect in rois) { - for (int y = rect.Top; y <= rect.Bottom; y++) { - for (int x = rect.Left; x <= rect.Right; x++) { - var currentIndex = y * src.Width + x; - var originalPixel = dst_data[currentIndex]; - var closestColor = FindClosestPaletteColor (originalPixel); - int errorRed = originalPixel.R - closestColor.R; - int errorGreen = originalPixel.G - closestColor.G; - int errorBlue = originalPixel.B - closestColor.B; - dst_data[currentIndex] = closestColor; - DistributeError (dst_data, new (x, y), errorRed, errorGreen, errorBlue, src.Width, src.Height); - } + for (int y = roi.Top; y <= roi.Bottom; y++) { + for (int x = roi.Left; x <= roi.Right; x++) { + var currentIndex = y * src.Width + x; + var originalPixel = dst_data[currentIndex]; + var closestColor = FindClosestPaletteColor (originalPixel); + int errorRed = originalPixel.R - closestColor.R; + int errorGreen = originalPixel.G - closestColor.G; + int errorBlue = originalPixel.B - closestColor.B; + dst_data[currentIndex] = closestColor; + DistributeError (dst_data, new (x, y), errorRed, errorGreen, errorBlue, src.Width, src.Height); } } } From 213f0bff0bf98508e762f8a8f251d412d4bd04e9 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 12:39:52 +0100 Subject: [PATCH 29/65] Inlined method --- .../ForwardErrorDiffusionDitheringEffect.cs | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 1ed78f96c..581faddfc 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -34,6 +34,7 @@ protected override void Render (ImageSurface src, ImageSurface dest, RectangleI var dst_data = dest.GetPixelData (); for (int y = roi.Top; y <= roi.Bottom; y++) { for (int x = roi.Left; x <= roi.Right; x++) { + var currentIndex = y * src.Width + x; var originalPixel = dst_data[currentIndex]; var closestColor = FindClosestPaletteColor (originalPixel); @@ -41,40 +42,37 @@ protected override void Render (ImageSurface src, ImageSurface dest, RectangleI int errorGreen = originalPixel.G - closestColor.G; int errorBlue = originalPixel.B - closestColor.B; dst_data[currentIndex] = closestColor; - DistributeError (dst_data, new (x, y), errorRed, errorGreen, errorBlue, src.Width, src.Height); - } - } - } - private void DistributeError (Span original, PointI location, int errorRed, int errorGreen, int errorBlue, int sourceWidth, int sourceHeight) - { - var diffusionMatrix = GetPredefinedDiffusionMatrix (Data.DiffusionMatrix); + var diffusionMatrix = GetPredefinedDiffusionMatrix (Data.DiffusionMatrix); + + for (int r = 0; r < diffusionMatrix.Rows; r++) { - for (int r = 0; r < diffusionMatrix.Rows; r++) { + for (int c = 0; c < diffusionMatrix.Columns; c++) { - for (int c = 0; c < diffusionMatrix.Columns; c++) { + var weight = diffusionMatrix[r, c]; - var weight = diffusionMatrix[r, c]; + if (weight <= 0) + continue; - if (weight <= 0) - continue; + PointI thisItem = new ( + X: x + c - diffusionMatrix.ColumnsToLeft, + Y: y + r + ); - PointI thisItem = new ( - X: location.X + c - diffusionMatrix.ColumnsToLeft, - Y: location.Y + r - ); + if (thisItem.X < 0 || thisItem.X >= src.Width) + continue; - if (thisItem.X < 0 || thisItem.X >= sourceWidth) - continue; + if (thisItem.Y < 0 || thisItem.Y >= src.Height) + continue; - if (thisItem.Y < 0 || thisItem.Y >= sourceHeight) - continue; + int idx = (thisItem.Y * src.Width) + thisItem.X; - int idx = (thisItem.Y * sourceWidth) + thisItem.X; + double factor = ((double) weight) / diffusionMatrix.TotalWeight; - double factor = ((double) weight) / diffusionMatrix.TotalWeight; + dst_data[idx] = AddError (dst_data[idx], factor, errorRed, errorGreen, errorBlue); + } + } - original[idx] = AddError (original[idx], factor, errorRed, errorGreen, errorBlue); } } } From d45393d4ffbcb154325ecbbd426408d1dd3bb1bf Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 12:54:16 +0100 Subject: [PATCH 30/65] formatting --- .../Effects/ForwardErrorDiffusionDitheringEffect.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 581faddfc..9d03eb77b 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -32,15 +32,20 @@ public override void LaunchConfiguration () protected override void Render (ImageSurface src, ImageSurface dest, RectangleI roi) { var dst_data = dest.GetPixelData (); + for (int y = roi.Top; y <= roi.Bottom; y++) { + for (int x = roi.Left; x <= roi.Right; x++) { var currentIndex = y * src.Width + x; + var originalPixel = dst_data[currentIndex]; var closestColor = FindClosestPaletteColor (originalPixel); + int errorRed = originalPixel.R - closestColor.R; int errorGreen = originalPixel.G - closestColor.G; int errorBlue = originalPixel.B - closestColor.B; + dst_data[currentIndex] = closestColor; var diffusionMatrix = GetPredefinedDiffusionMatrix (Data.DiffusionMatrix); From 2b8b831e18baeee376fc7ef6f9270c03233479b3 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 13:03:27 +0100 Subject: [PATCH 31/65] Assigning known settings to variables at the beginning of `Render` method --- .../ForwardErrorDiffusionDitheringEffect.cs | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 9d03eb77b..ddcb0f15e 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -31,15 +31,26 @@ public override void LaunchConfiguration () protected override void Render (ImageSurface src, ImageSurface dest, RectangleI roi) { - var dst_data = dest.GetPixelData (); + Span dst_data = dest.GetPixelData (); - for (int y = roi.Top; y <= roi.Bottom; y++) { + ErrorDiffusionMatrix diffusionMatrix = GetPredefinedDiffusionMatrix (Data.DiffusionMatrix); - for (int x = roi.Left; x <= roi.Right; x++) { + int sourceWidth = src.Width; + int sourceHeight = src.Height; - var currentIndex = y * src.Width + x; + int top = roi.Top; + int bottom = roi.Bottom; + int left = roi.Left; + int right = roi.Right; + + for (int y = top; y <= bottom; y++) { + + for (int x = left; x <= right; x++) { + + var currentIndex = y * sourceWidth + x; var originalPixel = dst_data[currentIndex]; + var closestColor = FindClosestPaletteColor (originalPixel); int errorRed = originalPixel.R - closestColor.R; @@ -48,8 +59,6 @@ protected override void Render (ImageSurface src, ImageSurface dest, RectangleI dst_data[currentIndex] = closestColor; - var diffusionMatrix = GetPredefinedDiffusionMatrix (Data.DiffusionMatrix); - for (int r = 0; r < diffusionMatrix.Rows; r++) { for (int c = 0; c < diffusionMatrix.Columns; c++) { @@ -64,13 +73,13 @@ protected override void Render (ImageSurface src, ImageSurface dest, RectangleI Y: y + r ); - if (thisItem.X < 0 || thisItem.X >= src.Width) + if (thisItem.X < 0 || thisItem.X >= sourceWidth) continue; - if (thisItem.Y < 0 || thisItem.Y >= src.Height) + if (thisItem.Y < 0 || thisItem.Y >= sourceHeight) continue; - int idx = (thisItem.Y * src.Width) + thisItem.X; + int idx = (thisItem.Y * sourceWidth) + thisItem.X; double factor = ((double) weight) / diffusionMatrix.TotalWeight; From cbb23c024516856f2a0dc7ccac08e2ec5f718dec Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 13:08:24 +0100 Subject: [PATCH 32/65] `FindClosestPaletteColor` method made `static` --- .../Effects/ForwardErrorDiffusionDitheringEffect.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index ddcb0f15e..852bd248c 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -35,6 +35,8 @@ protected override void Render (ImageSurface src, ImageSurface dest, RectangleI ErrorDiffusionMatrix diffusionMatrix = GetPredefinedDiffusionMatrix (Data.DiffusionMatrix); + ImmutableArray palette = GetPredefinedPalette (Data.PaletteChoice); + int sourceWidth = src.Width; int sourceHeight = src.Height; @@ -51,7 +53,7 @@ protected override void Render (ImageSurface src, ImageSurface dest, RectangleI var originalPixel = dst_data[currentIndex]; - var closestColor = FindClosestPaletteColor (originalPixel); + var closestColor = FindClosestPaletteColor (palette, originalPixel); int errorRed = originalPixel.R - closestColor.R; int errorGreen = originalPixel.G - closestColor.G; @@ -102,11 +104,10 @@ private static ColorBgra AddError (ColorBgra color, double factor, int errorRed, ); } - private ColorBgra FindClosestPaletteColor (ColorBgra original) + private static ColorBgra FindClosestPaletteColor (ImmutableArray palette, ColorBgra original) { double minDistance = double.MaxValue; ColorBgra closestColor = ColorBgra.FromBgra (0, 0, 0, 1); - var palette = GetPredefinedPalette (Data.PaletteChoice); foreach (var paletteColor in palette) { double distance = CalculateDistance (original, paletteColor); if (distance >= minDistance) @@ -333,7 +334,7 @@ private static IEnumerable EnumerateOldWindowsColors () private static IEnumerable EnumerateOldMsPaintColors () { - // https://wiki.vg-resource.com/ + // https://wiki.vg-resource.com/Paint yield return ColorBgra.FromBgr (0, 0, 0); // Black yield return ColorBgra.FromBgr (255, 255, 255); // White yield return ColorBgra.FromBgr (128, 128, 128); // Dark gray From 08611b347e2867ed03df2ac6bd82c6338a37c941 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 15:10:47 +0100 Subject: [PATCH 33/65] Extracted settings --- .../ForwardErrorDiffusionDitheringEffect.cs | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 852bd248c..19e155f6b 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -3,6 +3,7 @@ using System.Collections.Immutable; using System.ComponentModel; using System.Linq; +using Adw; using Cairo; using Pinta.Core; using Pinta.Gui.Widgets; @@ -29,61 +30,63 @@ public override void LaunchConfiguration () EffectHelper.LaunchSimpleEffectDialog (this); } + private sealed record DitheringSettings ( + ErrorDiffusionMatrix diffusionMatrix, + ImmutableArray palette, + int sourceWidth, + int sourceHeight); + + private DitheringSettings CreateSettings (ImageSurface src) + => new ( + diffusionMatrix: GetPredefinedDiffusionMatrix (Data.DiffusionMatrix), + palette: GetPredefinedPalette (Data.PaletteChoice), + sourceWidth: src.Width, + sourceHeight: src.Height + ); + protected override void Render (ImageSurface src, ImageSurface dest, RectangleI roi) { - Span dst_data = dest.GetPixelData (); - - ErrorDiffusionMatrix diffusionMatrix = GetPredefinedDiffusionMatrix (Data.DiffusionMatrix); - - ImmutableArray palette = GetPredefinedPalette (Data.PaletteChoice); - - int sourceWidth = src.Width; - int sourceHeight = src.Height; + DitheringSettings settings = CreateSettings (src); - int top = roi.Top; - int bottom = roi.Bottom; - int left = roi.Left; - int right = roi.Right; - - for (int y = top; y <= bottom; y++) { + Span dst_data = dest.GetPixelData (); - for (int x = left; x <= right; x++) { + for (int y = roi.Top; y <= roi.Bottom; y++) { - var currentIndex = y * sourceWidth + x; + for (int x = roi.Left; x <= roi.Right; x++) { - var originalPixel = dst_data[currentIndex]; + int currentIndex = y * settings.sourceWidth + x; + ColorBgra originalPixel = dst_data[currentIndex]; + ColorBgra closestColor = FindClosestPaletteColor (settings.palette, originalPixel); - var closestColor = FindClosestPaletteColor (palette, originalPixel); + dst_data[currentIndex] = closestColor; int errorRed = originalPixel.R - closestColor.R; int errorGreen = originalPixel.G - closestColor.G; int errorBlue = originalPixel.B - closestColor.B; - dst_data[currentIndex] = closestColor; - - for (int r = 0; r < diffusionMatrix.Rows; r++) { + for (int r = 0; r < settings.diffusionMatrix.Rows; r++) { - for (int c = 0; c < diffusionMatrix.Columns; c++) { + for (int c = 0; c < settings.diffusionMatrix.Columns; c++) { - var weight = diffusionMatrix[r, c]; + var weight = settings.diffusionMatrix[r, c]; if (weight <= 0) continue; PointI thisItem = new ( - X: x + c - diffusionMatrix.ColumnsToLeft, + X: x + c - settings.diffusionMatrix.ColumnsToLeft, Y: y + r ); - if (thisItem.X < 0 || thisItem.X >= sourceWidth) + if (thisItem.X < 0 || thisItem.X >= settings.sourceWidth) continue; - if (thisItem.Y < 0 || thisItem.Y >= sourceHeight) + if (thisItem.Y < 0 || thisItem.Y >= settings.sourceHeight) continue; - int idx = (thisItem.Y * sourceWidth) + thisItem.X; + int idx = (thisItem.Y * settings.sourceWidth) + thisItem.X; - double factor = ((double) weight) / diffusionMatrix.TotalWeight; + double factor = ((double) weight) / settings.diffusionMatrix.TotalWeight; dst_data[idx] = AddError (dst_data[idx], factor, errorRed, errorGreen, errorBlue); } From 4fe3095d152bba521694e27b8a37ff402b4a6420 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 15:15:41 +0100 Subject: [PATCH 34/65] Formatting --- .../Effects/ForwardErrorDiffusionDitheringEffect.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 19e155f6b..57dc65d3a 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -3,7 +3,6 @@ using System.Collections.Immutable; using System.ComponentModel; using System.Linq; -using Adw; using Cairo; using Pinta.Core; using Pinta.Gui.Widgets; @@ -113,8 +112,7 @@ private static ColorBgra FindClosestPaletteColor (ImmutableArray pale ColorBgra closestColor = ColorBgra.FromBgra (0, 0, 0, 1); foreach (var paletteColor in palette) { double distance = CalculateDistance (original, paletteColor); - if (distance >= minDistance) - continue; + if (distance >= minDistance) continue; minDistance = distance; closestColor = paletteColor; } @@ -126,9 +124,7 @@ private static double CalculateDistance (ColorBgra color1, ColorBgra color2) int deltaR = color1.R - color2.R; int deltaG = color1.G - color2.G; int deltaB = color1.B - color2.B; - - // Euclidean distance - return Math.Sqrt (deltaR * deltaR + deltaG * deltaG + deltaB * deltaB); + return Math.Sqrt (deltaR * deltaR + deltaG * deltaG + deltaB * deltaB); // Euclidean distance } public sealed class ErrorDiffusionMatrix From f041ea60fe098b35af0e0a5817143620101453bb Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 15:20:49 +0100 Subject: [PATCH 35/65] Removed unused property --- .../Effects/ForwardErrorDiffusionDitheringEffect.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 57dc65d3a..ba286ffd2 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -11,7 +11,7 @@ namespace Pinta.Effects; public sealed class ForwardErrorDiffusionDitheringEffect : BaseEffect { - public override string Name => Translations.GetString ("Dithering"); + public override string Name => Translations.GetString ("Color"); public override bool IsConfigurable => true; // TODO: Icon public override string EffectMenuCategory => Translations.GetString ("Test"); // TODO: @@ -96,15 +96,12 @@ protected override void Render (ImageSurface src, ImageSurface dest, RectangleI } private static ColorBgra AddError (ColorBgra color, double factor, int errorRed, int errorGreen, int errorBlue) - { - // This function will add the error to the color based on the provided factor - return ColorBgra.FromBgra ( + => ColorBgra.FromBgra ( b: Utility.ClampToByte (color.B + (int) (factor * errorBlue)), g: Utility.ClampToByte (color.G + (int) (factor * errorGreen)), r: Utility.ClampToByte (color.R + (int) (factor * errorRed)), a: 255 ); - } private static ColorBgra FindClosestPaletteColor (ImmutableArray palette, ColorBgra original) { @@ -220,9 +217,6 @@ public sealed class ForwardErrorDiffusionDitheringData : EffectData [Caption ("Diffusion Matrix")] public PredefinedDiffusionMatrices DiffusionMatrix { get; set; } = PredefinedDiffusionMatrices.FloydSteinberg; - [Caption ("Colors for Optimized Palette")] - public int ColorsForOptimizedPalette { get; set; } = 256; - [Caption ("Palette")] public PredefinedPalettes PaletteChoice { get; set; } = PredefinedPalettes.OldWindows16; } From 51393fedf3926fc9f928f7cf8597030920b408fd Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 15:22:06 +0100 Subject: [PATCH 36/65] Moved comment to a place that makes it more readable --- Pinta.Effects/CoreEffectsExtension.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Pinta.Effects/CoreEffectsExtension.cs b/Pinta.Effects/CoreEffectsExtension.cs index 6d36d714c..d9cb06d74 100644 --- a/Pinta.Effects/CoreEffectsExtension.cs +++ b/Pinta.Effects/CoreEffectsExtension.cs @@ -83,8 +83,8 @@ public void Initialize () PintaCore.Effects.RegisterEffect (new UnfocusEffect ()); PintaCore.Effects.RegisterEffect (new ZoomBlurEffect ()); - // Effects under development #if DEBUG + // Effects under development PintaCore.Effects.RegisterEffect (new ForwardErrorDiffusionDitheringEffect ()); #endif } @@ -133,8 +133,8 @@ public void Uninitialize () PintaCore.Effects.UnregisterInstanceOfEffect (typeof (UnfocusEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (ZoomBlurEffect)); - // Effects under development #if DEBUG + // Effects under development PintaCore.Effects.UnregisterInstanceOfEffect (typeof (ForwardErrorDiffusionDitheringEffect)); #endif } From 4c6f8c5e742b1f5976fbbc98af311cfb4365ec9d Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 15:29:15 +0100 Subject: [PATCH 37/65] Formatting and making some calculations more efficient (by removing unnecessary operations) --- .../ForwardErrorDiffusionDitheringEffect.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index ba286ffd2..8121a2c2c 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -105,10 +105,13 @@ private static ColorBgra AddError (ColorBgra color, double factor, int errorRed, private static ColorBgra FindClosestPaletteColor (ImmutableArray palette, ColorBgra original) { + if (palette.IsDefault) throw new ArgumentException ("Palette not initialized", nameof (palette)); + if (palette.Length == 0) throw new ArgumentException ("Palette cannot be empty", nameof (palette)); + if (palette.Length == 1) return palette[0]; double minDistance = double.MaxValue; ColorBgra closestColor = ColorBgra.FromBgra (0, 0, 0, 1); foreach (var paletteColor in palette) { - double distance = CalculateDistance (original, paletteColor); + double distance = CalculateSquaredDistance (original, paletteColor); if (distance >= minDistance) continue; minDistance = distance; closestColor = paletteColor; @@ -116,12 +119,12 @@ private static ColorBgra FindClosestPaletteColor (ImmutableArray pale return closestColor; } - private static double CalculateDistance (ColorBgra color1, ColorBgra color2) + private static double CalculateSquaredDistance (ColorBgra color1, ColorBgra color2) { - int deltaR = color1.R - color2.R; - int deltaG = color1.G - color2.G; - int deltaB = color1.B - color2.B; - return Math.Sqrt (deltaR * deltaR + deltaG * deltaG + deltaB * deltaB); // Euclidean distance + double deltaR = color1.R - color2.R; + double deltaG = color1.G - color2.G; + double deltaB = color1.B - color2.B; + return deltaR * deltaR + deltaG * deltaG + deltaB * deltaB; } public sealed class ErrorDiffusionMatrix From 494e4f6116332ea8ca12978dd9f835d09ea830b9 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 15:32:50 +0100 Subject: [PATCH 38/65] Corrected naming --- Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs index 8121a2c2c..33aa3a28c 100644 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs @@ -11,10 +11,10 @@ namespace Pinta.Effects; public sealed class ForwardErrorDiffusionDitheringEffect : BaseEffect { - public override string Name => Translations.GetString ("Color"); + public override string Name => Translations.GetString ("Dithering"); public override bool IsConfigurable => true; // TODO: Icon - public override string EffectMenuCategory => Translations.GetString ("Test"); // TODO: + public override string EffectMenuCategory => Translations.GetString ("Color"); public ForwardErrorDiffusionDitheringData Data => (ForwardErrorDiffusionDitheringData) EffectData!; // NRT - Set in constructor public override bool IsTileable => false; From dc24b8929655ff17c25f56a1c5a7df5edb34f22e Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 15:39:15 +0100 Subject: [PATCH 39/65] Removed conditional compilation --- Pinta.Effects/CoreEffectsExtension.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Pinta.Effects/CoreEffectsExtension.cs b/Pinta.Effects/CoreEffectsExtension.cs index d9cb06d74..89ac394ae 100644 --- a/Pinta.Effects/CoreEffectsExtension.cs +++ b/Pinta.Effects/CoreEffectsExtension.cs @@ -58,6 +58,7 @@ public void Initialize () PintaCore.Effects.RegisterEffect (new CloudsEffect ()); PintaCore.Effects.RegisterEffect (new EdgeDetectEffect ()); PintaCore.Effects.RegisterEffect (new EmbossEffect ()); + PintaCore.Effects.RegisterEffect (new ForwardErrorDiffusionDitheringEffect ()); PintaCore.Effects.RegisterEffect (new FragmentEffect ()); PintaCore.Effects.RegisterEffect (new FrostedGlassEffect ()); PintaCore.Effects.RegisterEffect (new GaussianBlurEffect ()); @@ -82,11 +83,6 @@ public void Initialize () PintaCore.Effects.RegisterEffect (new TwistEffect ()); PintaCore.Effects.RegisterEffect (new UnfocusEffect ()); PintaCore.Effects.RegisterEffect (new ZoomBlurEffect ()); - -#if DEBUG - // Effects under development - PintaCore.Effects.RegisterEffect (new ForwardErrorDiffusionDitheringEffect ()); -#endif } public void Uninitialize () @@ -108,6 +104,7 @@ public void Uninitialize () PintaCore.Effects.UnregisterInstanceOfEffect (typeof (CloudsEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (EdgeDetectEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (EmbossEffect)); + PintaCore.Effects.UnregisterInstanceOfEffect (typeof (ForwardErrorDiffusionDitheringEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (FragmentEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (FrostedGlassEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (GaussianBlurEffect)); @@ -132,11 +129,6 @@ public void Uninitialize () PintaCore.Effects.UnregisterInstanceOfEffect (typeof (TwistEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (UnfocusEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (ZoomBlurEffect)); - -#if DEBUG - // Effects under development - PintaCore.Effects.UnregisterInstanceOfEffect (typeof (ForwardErrorDiffusionDitheringEffect)); -#endif } #endregion } From 00e6f543f27ae5230615c334051bf113e1593871 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Tue, 9 Jan 2024 16:01:16 +0100 Subject: [PATCH 40/65] Added tests --- .../Pinta.Effects.Tests/Assets/dithering1.png | Bin 0 -> 46815 bytes .../Pinta.Effects.Tests/Assets/dithering2.png | Bin 0 -> 19247 bytes .../Pinta.Effects.Tests/Assets/dithering3.png | Bin 0 -> 45180 bytes tests/Pinta.Effects.Tests/EffectsTest.cs | 27 ++++++++++++++++++ 4 files changed, 27 insertions(+) create mode 100644 tests/Pinta.Effects.Tests/Assets/dithering1.png create mode 100644 tests/Pinta.Effects.Tests/Assets/dithering2.png create mode 100644 tests/Pinta.Effects.Tests/Assets/dithering3.png diff --git a/tests/Pinta.Effects.Tests/Assets/dithering1.png b/tests/Pinta.Effects.Tests/Assets/dithering1.png new file mode 100644 index 0000000000000000000000000000000000000000..26bf6cb54fce14a90ced89990ac30b192f587640 GIT binary patch literal 46815 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

5Jy58ba{jPC7Bj#2s* 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 M07*qoM6N<$f Date: Tue, 9 Jan 2024 16:10:04 +0100 Subject: [PATCH 41/65] Do the tests succeed if I remove this? --- .../Pinta.Effects.Tests/Assets/dithering2.png | Bin 19247 -> 0 bytes .../Pinta.Effects.Tests/Assets/dithering3.png | Bin 45180 -> 0 bytes tests/Pinta.Effects.Tests/EffectsTest.cs | 18 ------------------ 3 files changed, 18 deletions(-) delete mode 100644 tests/Pinta.Effects.Tests/Assets/dithering2.png delete mode 100644 tests/Pinta.Effects.Tests/Assets/dithering3.png diff --git a/tests/Pinta.Effects.Tests/Assets/dithering2.png b/tests/Pinta.Effects.Tests/Assets/dithering2.png deleted file mode 100644 index a947bfa8048c2d8a8a55f8edfd7bce00aa711312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19247 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 M07*qoM6N<$f Date: Tue, 9 Jan 2024 16:13:32 +0100 Subject: [PATCH 42/65] Revert "Do the tests succeed if I remove this?" This reverts commit 4fdd7d5986bbb4696eb6a9d8b45ed505fd0ce135. --- .../Pinta.Effects.Tests/Assets/dithering2.png | Bin 0 -> 19247 bytes .../Pinta.Effects.Tests/Assets/dithering3.png | Bin 0 -> 45180 bytes tests/Pinta.Effects.Tests/EffectsTest.cs | 18 ++++++++++++++++++ 3 files changed, 18 insertions(+) create mode 100644 tests/Pinta.Effects.Tests/Assets/dithering2.png create mode 100644 tests/Pinta.Effects.Tests/Assets/dithering3.png diff --git a/tests/Pinta.Effects.Tests/Assets/dithering2.png b/tests/Pinta.Effects.Tests/Assets/dithering2.png new file mode 100644 index 0000000000000000000000000000000000000000..a947bfa8048c2d8a8a55f8edfd7bce00aa711312 GIT binary patch literal 19247 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 M07*qoM6N<$f Date: Wed, 10 Jan 2024 12:13:31 +0100 Subject: [PATCH 43/65] Renamed dithering effect and extracted some classes into their own files --- Pinta.Effects/Classes/ErrorDiffusionMatrix.cs | 140 +++++++ Pinta.Effects/CoreEffectsExtension.cs | 4 +- Pinta.Effects/Effects/DitheringEffect.cs | 135 +++++++ .../ForwardErrorDiffusionDitheringEffect.cs | 372 ------------------ Pinta.Effects/Utilities/PaletteHelper.cs | 110 ++++++ tests/Pinta.Effects.Tests/EffectsTest.cs | 18 +- 6 files changed, 396 insertions(+), 383 deletions(-) create mode 100644 Pinta.Effects/Classes/ErrorDiffusionMatrix.cs create mode 100644 Pinta.Effects/Effects/DitheringEffect.cs delete mode 100644 Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs create mode 100644 Pinta.Effects/Utilities/PaletteHelper.cs diff --git a/Pinta.Effects/Classes/ErrorDiffusionMatrix.cs b/Pinta.Effects/Classes/ErrorDiffusionMatrix.cs new file mode 100644 index 000000000..f8fa65c7c --- /dev/null +++ b/Pinta.Effects/Classes/ErrorDiffusionMatrix.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; + +namespace Pinta.Effects; + +public enum PredefinedDiffusionMatrices +{ + Sierra, + TwoRowSierra, + SierraLite, + Burkes, + Atkinson, + Stucki, + JarvisJudiceNinke, + FloydSteinberg, + FakeFloydSteinberg, +} + +internal sealed class ErrorDiffusionMatrix +{ + public static ErrorDiffusionMatrix GetPredefined (PredefinedDiffusionMatrices choice) + { + return choice switch { + PredefinedDiffusionMatrices.Sierra => Predefined.Sierra, + PredefinedDiffusionMatrices.TwoRowSierra => Predefined.TwoRowSierra, + PredefinedDiffusionMatrices.SierraLite => Predefined.SierraLite, + PredefinedDiffusionMatrices.Burkes => Predefined.Burkes, + PredefinedDiffusionMatrices.Atkinson => Predefined.Atkinson, + PredefinedDiffusionMatrices.Stucki => Predefined.Stucki, + PredefinedDiffusionMatrices.JarvisJudiceNinke => Predefined.JarvisJudiceNinke, + PredefinedDiffusionMatrices.FloydSteinberg => Predefined.FloydSteinberg, + PredefinedDiffusionMatrices.FakeFloydSteinberg => Predefined.FakeFloydSteinberg, + _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedDiffusionMatrices)), + }; + } + + public static class Predefined + { + public static ErrorDiffusionMatrix Sierra { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Sierra, 2); + public static ErrorDiffusionMatrix TwoRowSierra { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.TwoRowSierra, 2); + public static ErrorDiffusionMatrix SierraLite { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.SierraLite, 1); + public static ErrorDiffusionMatrix Burkes { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Burkes, 2); + public static ErrorDiffusionMatrix Atkinson { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Atkinson, 1); + public static ErrorDiffusionMatrix Stucki { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Stucki, 2); + public static ErrorDiffusionMatrix JarvisJudiceNinke { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.JarvisJudiceNinke, 2); + public static ErrorDiffusionMatrix FloydSteinberg { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.FloydSteinberg, 1); + public static ErrorDiffusionMatrix FakeFloydSteinberg { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.FakeFloydSteinberg, 0); + } + + private static class DefaultMatrixArrays + { + public static int[,] Sierra { get; } = { + { 0, 0, 0, 5, 3, }, + { 2, 4, 5, 4, 2, }, + { 0, 2, 3, 2, 0, }, + }; + + public static int[,] TwoRowSierra { get; } = { + { 0, 0, 0, 4, 3, }, + { 1, 2, 3, 2, 1, }, + }; + + public static int[,] SierraLite { get; } = { + { 0, 0, 2, }, + { 1, 1, 0, }, + }; + + public static int[,] Burkes { get; } = { + { 0, 0, 0, 8, 4, }, + { 2, 4, 8, 4, 2, }, + }; + + public static int[,] Atkinson { get; } = { + { 0, 0, 1, 1, }, + { 1, 1, 1, 0, }, + { 0, 1, 0, 0, }, + }; + + public static int[,] Stucki { get; } = { + { 0, 0, 0, 8, 4, }, + { 2, 4, 8, 4, 2, }, + { 1, 2, 4, 2, 1, }, + }; + + public static int[,] JarvisJudiceNinke { get; } = { + { 0, 0, 0, 7, 5, }, + { 3, 5, 7, 5, 3, }, + { 1, 3, 5, 3, 1, }, + }; + + public static int[,] FloydSteinberg { get; } = { + { 0, 0, 7, }, + { 3, 5, 1, } + }; + + public static int[,] FakeFloydSteinberg { get; } = { + { 0, 3, }, + { 3, 2, } + }; + } + + private readonly int[,] array_2_d; + public int Columns { get; } + public int Rows { get; } + public int TotalWeight { get; } + public int ColumnsToLeft { get; } + public int ColumnsToRight { get; } + public int RowsBelow { get; } + public int this[int row, int column] => array_2_d[row, column]; + public ErrorDiffusionMatrix (int[,] array2D, int pixelColumn) + { + var clone = (int[,]) array2D.Clone (); + var rows = clone.GetLength (0); + if (rows <= 0) throw new ArgumentException ("Array has to have a strictly positive number of rows", nameof (array2D)); + var columns = clone.GetLength (1); + if (columns <= 0) throw new ArgumentException ("Array has to have a strictly positive number of rows", nameof (array2D)); + if (pixelColumn < 0) throw new ArgumentException ("Argument has to refer to a valid column offset", nameof (pixelColumn)); + if (pixelColumn >= columns) throw new ArgumentException ("Argument has to refer to a valid column offset", nameof (pixelColumn)); + if (clone[0, pixelColumn] != 0) throw new ArgumentException ("Target pixel cannot have a nonzero weight"); + var flattened = Flatten2DArray (clone); + if (flattened.Any (w => w < 0)) throw new ArgumentException ("No negative weights", nameof (array2D)); + if (flattened.Take (pixelColumn).Any (w => w != 0)) throw new ArgumentException ("Pixels previous to target cannot have nonzero weights"); + ColumnsToLeft = pixelColumn; + ColumnsToRight = columns - 1 - pixelColumn; + TotalWeight = flattened.Sum (); + Columns = columns; + Rows = rows; + RowsBelow = rows - 1; + array_2_d = clone; + } + + private static IEnumerable Flatten2DArray (T[,] array) + { + for (int i = 0; i < array.GetLength (0); i++) + for (int j = 0; j < array.GetLength (1); j++) + yield return array[i, j]; + } +} diff --git a/Pinta.Effects/CoreEffectsExtension.cs b/Pinta.Effects/CoreEffectsExtension.cs index 89ac394ae..a155ff50d 100644 --- a/Pinta.Effects/CoreEffectsExtension.cs +++ b/Pinta.Effects/CoreEffectsExtension.cs @@ -58,7 +58,7 @@ public void Initialize () PintaCore.Effects.RegisterEffect (new CloudsEffect ()); PintaCore.Effects.RegisterEffect (new EdgeDetectEffect ()); PintaCore.Effects.RegisterEffect (new EmbossEffect ()); - PintaCore.Effects.RegisterEffect (new ForwardErrorDiffusionDitheringEffect ()); + PintaCore.Effects.RegisterEffect (new DitheringEffect ()); PintaCore.Effects.RegisterEffect (new FragmentEffect ()); PintaCore.Effects.RegisterEffect (new FrostedGlassEffect ()); PintaCore.Effects.RegisterEffect (new GaussianBlurEffect ()); @@ -104,7 +104,7 @@ public void Uninitialize () PintaCore.Effects.UnregisterInstanceOfEffect (typeof (CloudsEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (EdgeDetectEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (EmbossEffect)); - PintaCore.Effects.UnregisterInstanceOfEffect (typeof (ForwardErrorDiffusionDitheringEffect)); + PintaCore.Effects.UnregisterInstanceOfEffect (typeof (DitheringEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (FragmentEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (FrostedGlassEffect)); PintaCore.Effects.UnregisterInstanceOfEffect (typeof (GaussianBlurEffect)); diff --git a/Pinta.Effects/Effects/DitheringEffect.cs b/Pinta.Effects/Effects/DitheringEffect.cs new file mode 100644 index 000000000..824f8835b --- /dev/null +++ b/Pinta.Effects/Effects/DitheringEffect.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Immutable; +using Cairo; +using Pinta.Core; +using Pinta.Gui.Widgets; + +namespace Pinta.Effects; + +public sealed class DitheringEffect : BaseEffect +{ + public override string Name => Translations.GetString ("Dithering"); + public override bool IsConfigurable => true; + // TODO: Icon + public override string EffectMenuCategory => Translations.GetString ("Color"); + public DitheringData Data => (DitheringData) EffectData!; // NRT - Set in constructor + + public override bool IsTileable => false; + + public DitheringEffect () + { + EffectData = new DitheringData (); + } + + public override void LaunchConfiguration () + { + EffectHelper.LaunchSimpleEffectDialog (this); + } + + private sealed record DitheringSettings ( + ErrorDiffusionMatrix diffusionMatrix, + ImmutableArray palette, + int sourceWidth, + int sourceHeight); + + private DitheringSettings CreateSettings (ImageSurface src) + => new ( + diffusionMatrix: ErrorDiffusionMatrix.GetPredefined (Data.DiffusionMatrix), + palette: PaletteHelper.GetPredefined (Data.PaletteChoice), + sourceWidth: src.Width, + sourceHeight: src.Height + ); + + protected override void Render (ImageSurface src, ImageSurface dest, RectangleI roi) + { + DitheringSettings settings = CreateSettings (src); + + Span dst_data = dest.GetPixelData (); + + for (int y = roi.Top; y <= roi.Bottom; y++) { + + for (int x = roi.Left; x <= roi.Right; x++) { + + int currentIndex = y * settings.sourceWidth + x; + ColorBgra originalPixel = dst_data[currentIndex]; + ColorBgra closestColor = FindClosestPaletteColor (settings.palette, originalPixel); + + dst_data[currentIndex] = closestColor; + + int errorRed = originalPixel.R - closestColor.R; + int errorGreen = originalPixel.G - closestColor.G; + int errorBlue = originalPixel.B - closestColor.B; + + for (int r = 0; r < settings.diffusionMatrix.Rows; r++) { + + for (int c = 0; c < settings.diffusionMatrix.Columns; c++) { + + var weight = settings.diffusionMatrix[r, c]; + + if (weight <= 0) + continue; + + PointI thisItem = new ( + X: x + c - settings.diffusionMatrix.ColumnsToLeft, + Y: y + r + ); + + if (thisItem.X < 0 || thisItem.X >= settings.sourceWidth) + continue; + + if (thisItem.Y < 0 || thisItem.Y >= settings.sourceHeight) + continue; + + int idx = (thisItem.Y * settings.sourceWidth) + thisItem.X; + + double factor = ((double) weight) / settings.diffusionMatrix.TotalWeight; + + dst_data[idx] = AddError (dst_data[idx], factor, errorRed, errorGreen, errorBlue); + } + } + + } + } + } + + private static ColorBgra AddError (ColorBgra color, double factor, int errorRed, int errorGreen, int errorBlue) + => ColorBgra.FromBgra ( + b: Utility.ClampToByte (color.B + (int) (factor * errorBlue)), + g: Utility.ClampToByte (color.G + (int) (factor * errorGreen)), + r: Utility.ClampToByte (color.R + (int) (factor * errorRed)), + a: 255 + ); + + private static ColorBgra FindClosestPaletteColor (ImmutableArray palette, ColorBgra original) + { + if (palette.IsDefault) throw new ArgumentException ("Palette not initialized", nameof (palette)); + if (palette.Length == 0) throw new ArgumentException ("Palette cannot be empty", nameof (palette)); + if (palette.Length == 1) return palette[0]; + double minDistance = double.MaxValue; + ColorBgra closestColor = ColorBgra.FromBgra (0, 0, 0, 1); + foreach (var paletteColor in palette) { + double distance = CalculateSquaredDistance (original, paletteColor); + if (distance >= minDistance) continue; + minDistance = distance; + closestColor = paletteColor; + } + return closestColor; + } + + private static double CalculateSquaredDistance (ColorBgra color1, ColorBgra color2) + { + double deltaR = color1.R - color2.R; + double deltaG = color1.G - color2.G; + double deltaB = color1.B - color2.B; + return deltaR * deltaR + deltaG * deltaG + deltaB * deltaB; + } + + public sealed class DitheringData : EffectData + { + [Caption ("Diffusion Matrix")] + public PredefinedDiffusionMatrices DiffusionMatrix { get; set; } = PredefinedDiffusionMatrices.FloydSteinberg; + + [Caption ("Palette")] + public PredefinedPalettes PaletteChoice { get; set; } = PredefinedPalettes.OldWindows16; + } +} diff --git a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs b/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs deleted file mode 100644 index 33aa3a28c..000000000 --- a/Pinta.Effects/Effects/ForwardErrorDiffusionDitheringEffect.cs +++ /dev/null @@ -1,372 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.ComponentModel; -using System.Linq; -using Cairo; -using Pinta.Core; -using Pinta.Gui.Widgets; - -namespace Pinta.Effects; - -public sealed class ForwardErrorDiffusionDitheringEffect : BaseEffect -{ - public override string Name => Translations.GetString ("Dithering"); - public override bool IsConfigurable => true; - // TODO: Icon - public override string EffectMenuCategory => Translations.GetString ("Color"); - public ForwardErrorDiffusionDitheringData Data => (ForwardErrorDiffusionDitheringData) EffectData!; // NRT - Set in constructor - - public override bool IsTileable => false; - - public ForwardErrorDiffusionDitheringEffect () - { - EffectData = new ForwardErrorDiffusionDitheringData (); - } - - public override void LaunchConfiguration () - { - EffectHelper.LaunchSimpleEffectDialog (this); - } - - private sealed record DitheringSettings ( - ErrorDiffusionMatrix diffusionMatrix, - ImmutableArray palette, - int sourceWidth, - int sourceHeight); - - private DitheringSettings CreateSettings (ImageSurface src) - => new ( - diffusionMatrix: GetPredefinedDiffusionMatrix (Data.DiffusionMatrix), - palette: GetPredefinedPalette (Data.PaletteChoice), - sourceWidth: src.Width, - sourceHeight: src.Height - ); - - protected override void Render (ImageSurface src, ImageSurface dest, RectangleI roi) - { - DitheringSettings settings = CreateSettings (src); - - Span dst_data = dest.GetPixelData (); - - for (int y = roi.Top; y <= roi.Bottom; y++) { - - for (int x = roi.Left; x <= roi.Right; x++) { - - int currentIndex = y * settings.sourceWidth + x; - ColorBgra originalPixel = dst_data[currentIndex]; - ColorBgra closestColor = FindClosestPaletteColor (settings.palette, originalPixel); - - dst_data[currentIndex] = closestColor; - - int errorRed = originalPixel.R - closestColor.R; - int errorGreen = originalPixel.G - closestColor.G; - int errorBlue = originalPixel.B - closestColor.B; - - for (int r = 0; r < settings.diffusionMatrix.Rows; r++) { - - for (int c = 0; c < settings.diffusionMatrix.Columns; c++) { - - var weight = settings.diffusionMatrix[r, c]; - - if (weight <= 0) - continue; - - PointI thisItem = new ( - X: x + c - settings.diffusionMatrix.ColumnsToLeft, - Y: y + r - ); - - if (thisItem.X < 0 || thisItem.X >= settings.sourceWidth) - continue; - - if (thisItem.Y < 0 || thisItem.Y >= settings.sourceHeight) - continue; - - int idx = (thisItem.Y * settings.sourceWidth) + thisItem.X; - - double factor = ((double) weight) / settings.diffusionMatrix.TotalWeight; - - dst_data[idx] = AddError (dst_data[idx], factor, errorRed, errorGreen, errorBlue); - } - } - - } - } - } - - private static ColorBgra AddError (ColorBgra color, double factor, int errorRed, int errorGreen, int errorBlue) - => ColorBgra.FromBgra ( - b: Utility.ClampToByte (color.B + (int) (factor * errorBlue)), - g: Utility.ClampToByte (color.G + (int) (factor * errorGreen)), - r: Utility.ClampToByte (color.R + (int) (factor * errorRed)), - a: 255 - ); - - private static ColorBgra FindClosestPaletteColor (ImmutableArray palette, ColorBgra original) - { - if (palette.IsDefault) throw new ArgumentException ("Palette not initialized", nameof (palette)); - if (palette.Length == 0) throw new ArgumentException ("Palette cannot be empty", nameof (palette)); - if (palette.Length == 1) return palette[0]; - double minDistance = double.MaxValue; - ColorBgra closestColor = ColorBgra.FromBgra (0, 0, 0, 1); - foreach (var paletteColor in palette) { - double distance = CalculateSquaredDistance (original, paletteColor); - if (distance >= minDistance) continue; - minDistance = distance; - closestColor = paletteColor; - } - return closestColor; - } - - private static double CalculateSquaredDistance (ColorBgra color1, ColorBgra color2) - { - double deltaR = color1.R - color2.R; - double deltaG = color1.G - color2.G; - double deltaB = color1.B - color2.B; - return deltaR * deltaR + deltaG * deltaG + deltaB * deltaB; - } - - public sealed class ErrorDiffusionMatrix - { - private readonly int[,] array_2_d; - public int Columns { get; } - public int Rows { get; } - public int TotalWeight { get; } - public int ColumnsToLeft { get; } - public int ColumnsToRight { get; } - public int RowsBelow { get; } - public int this[int row, int column] => array_2_d[row, column]; - public ErrorDiffusionMatrix (int[,] array2D, int pixelColumn) - { - var clone = (int[,]) array2D.Clone (); - var rows = clone.GetLength (0); - if (rows <= 0) throw new ArgumentException ("Array has to have a strictly positive number of rows", nameof (array2D)); - var columns = clone.GetLength (1); - if (columns <= 0) throw new ArgumentException ("Array has to have a strictly positive number of rows", nameof (array2D)); - if (pixelColumn < 0) throw new ArgumentException ("Argument has to refer to a valid column offset", nameof (pixelColumn)); - if (pixelColumn >= columns) throw new ArgumentException ("Argument has to refer to a valid column offset", nameof (pixelColumn)); - if (clone[0, pixelColumn] != 0) throw new ArgumentException ("Target pixel cannot have a nonzero weight"); - var flattened = Flatten2DArray (clone); - if (flattened.Any (w => w < 0)) throw new ArgumentException ("No negative weights", nameof (array2D)); - if (flattened.Take (pixelColumn).Any (w => w != 0)) throw new ArgumentException ("Pixels previous to target cannot have nonzero weights"); - ColumnsToLeft = pixelColumn; - ColumnsToRight = columns - 1 - pixelColumn; - TotalWeight = flattened.Sum (); - Columns = columns; - Rows = rows; - RowsBelow = rows - 1; - array_2_d = clone; - } - - private static IEnumerable Flatten2DArray (T[,] array) - { - for (int i = 0; i < array.GetLength (0); i++) - for (int j = 0; j < array.GetLength (1); j++) - yield return array[i, j]; - } - } - - public enum PredefinedPalettes - { - OldWindows16, - WebSafe, - BlackWhite, - OldMsPaint, - } - - private static ImmutableArray GetPredefinedPalette (PredefinedPalettes choice) - { - return choice switch { - PredefinedPalettes.OldWindows16 => DefaultPalettes.OldWindows16, - PredefinedPalettes.WebSafe => DefaultPalettes.WebSafe, - PredefinedPalettes.BlackWhite => DefaultPalettes.BlackWhite, - PredefinedPalettes.OldMsPaint => DefaultPalettes.OldMsPaint, - _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedPalettes)), - }; - } - - public enum PredefinedDiffusionMatrices - { - Sierra, - TwoRowSierra, - SierraLite, - Burkes, - Atkinson, - Stucki, - JarvisJudiceNinke, - FloydSteinberg, - FakeFloydSteinberg, - } - - private static ErrorDiffusionMatrix GetPredefinedDiffusionMatrix (PredefinedDiffusionMatrices choice) - { - return choice switch { - PredefinedDiffusionMatrices.Sierra => DefaultMatrices.Sierra, - PredefinedDiffusionMatrices.TwoRowSierra => DefaultMatrices.TwoRowSierra, - PredefinedDiffusionMatrices.SierraLite => DefaultMatrices.SierraLite, - PredefinedDiffusionMatrices.Burkes => DefaultMatrices.Burkes, - PredefinedDiffusionMatrices.Atkinson => DefaultMatrices.Atkinson, - PredefinedDiffusionMatrices.Stucki => DefaultMatrices.Stucki, - PredefinedDiffusionMatrices.JarvisJudiceNinke => DefaultMatrices.JarvisJudiceNinke, - PredefinedDiffusionMatrices.FloydSteinberg => DefaultMatrices.FloydSteinberg, - PredefinedDiffusionMatrices.FakeFloydSteinberg => DefaultMatrices.FakeFloydSteinberg, - _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedDiffusionMatrices)), - }; - } - - public sealed class ForwardErrorDiffusionDitheringData : EffectData - { - [Caption ("Diffusion Matrix")] - public PredefinedDiffusionMatrices DiffusionMatrix { get; set; } = PredefinedDiffusionMatrices.FloydSteinberg; - - [Caption ("Palette")] - public PredefinedPalettes PaletteChoice { get; set; } = PredefinedPalettes.OldWindows16; - } - - public static class DefaultMatrices - { - public static ErrorDiffusionMatrix Sierra { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Sierra, 2); - public static ErrorDiffusionMatrix TwoRowSierra { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.TwoRowSierra, 2); - public static ErrorDiffusionMatrix SierraLite { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.SierraLite, 1); - public static ErrorDiffusionMatrix Burkes { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Burkes, 2); - public static ErrorDiffusionMatrix Atkinson { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Atkinson, 1); - public static ErrorDiffusionMatrix Stucki { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.Stucki, 2); - public static ErrorDiffusionMatrix JarvisJudiceNinke { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.JarvisJudiceNinke, 2); - public static ErrorDiffusionMatrix FloydSteinberg { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.FloydSteinberg, 1); - public static ErrorDiffusionMatrix FakeFloydSteinberg { get; } = new ErrorDiffusionMatrix (DefaultMatrixArrays.FakeFloydSteinberg, 0); - } - - private static class DefaultMatrixArrays - { - public static int[,] Sierra { get; } = { - { 0, 0, 0, 5, 3, }, - { 2, 4, 5, 4, 2, }, - { 0, 2, 3, 2, 0, }, - }; - - public static int[,] TwoRowSierra { get; } = { - { 0, 0, 0, 4, 3, }, - { 1, 2, 3, 2, 1, }, - }; - - public static int[,] SierraLite { get; } = { - { 0, 0, 2, }, - { 1, 1, 0, }, - }; - - public static int[,] Burkes { get; } = { - { 0, 0, 0, 8, 4, }, - { 2, 4, 8, 4, 2, }, - }; - - public static int[,] Atkinson { get; } = { - { 0, 0, 1, 1, }, - { 1, 1, 1, 0, }, - { 0, 1, 0, 0, }, - }; - - public static int[,] Stucki { get; } = { - { 0, 0, 0, 8, 4, }, - { 2, 4, 8, 4, 2, }, - { 1, 2, 4, 2, 1, }, - }; - - public static int[,] JarvisJudiceNinke { get; } = { - { 0, 0, 0, 7, 5, }, - { 3, 5, 7, 5, 3, }, - { 1, 3, 5, 3, 1, }, - }; - - public static int[,] FloydSteinberg { get; } = { - { 0, 0, 7, }, - { 3, 5, 1, } - }; - - public static int[,] FakeFloydSteinberg { get; } = { - { 0, 3, }, - { 3, 2, } - }; - } - - private static class DefaultPalettes - { - public static ImmutableArray OldWindows16 => old_windows_16.Value; - public static ImmutableArray WebSafe => web_safe.Value; - public static ImmutableArray BlackWhite { get; } - public static ImmutableArray OldMsPaint => old_ms_paint.Value; - - private static readonly Lazy> web_safe; - private static readonly Lazy> old_windows_16; - private static readonly Lazy> old_ms_paint; - - static DefaultPalettes () - { - web_safe = new (() => EnumerateWebSafeColorCube ().ToImmutableArray ()); - old_windows_16 = new (() => EnumerateOldWindowsColors ().ToImmutableArray ()); - BlackWhite = ImmutableArray.CreateRange (new[] { ColorBgra.FromBgr (0, 0, 0), ColorBgra.FromBgr (255, 255, 255) }); - old_ms_paint = new (() => EnumerateOldMsPaintColors ().ToImmutableArray ()); - } - - private static IEnumerable EnumerateOldWindowsColors () - { - yield return ColorBgra.FromBgr (0, 0, 0); // Black - yield return ColorBgra.FromBgr (0, 0, 128); // Blue - yield return ColorBgra.FromBgr (0, 128, 0); // Green - yield return ColorBgra.FromBgr (0, 128, 128); // Cyan - yield return ColorBgra.FromBgr (128, 0, 0); // Red - yield return ColorBgra.FromBgr (128, 0, 128); // Magenta - yield return ColorBgra.FromBgr (128, 64, 0); // Brown - yield return ColorBgra.FromBgr (192, 192, 192); // Light Gray - yield return ColorBgra.FromBgr (128, 128, 128); // Dark Gray - yield return ColorBgra.FromBgr (0, 0, 255); // Light Blue - yield return ColorBgra.FromBgr (0, 255, 0); // Light Green - yield return ColorBgra.FromBgr (0, 255, 255); // Light Cyan - yield return ColorBgra.FromBgr (255, 0, 0); // Light Red - yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta - yield return ColorBgra.FromBgr (255, 255, 0); // Yellow - yield return ColorBgra.FromBgr (255, 255, 255); // White - } - - private static IEnumerable EnumerateOldMsPaintColors () - { - // https://wiki.vg-resource.com/Paint - yield return ColorBgra.FromBgr (0, 0, 0); // Black - yield return ColorBgra.FromBgr (255, 255, 255); // White - yield return ColorBgra.FromBgr (128, 128, 128); // Dark gray - yield return ColorBgra.FromBgr (192, 192, 192); // Light gray - yield return ColorBgra.FromBgr (0, 0, 255); // Red - yield return ColorBgra.FromBgr (0, 0, 128); // Maroon - yield return ColorBgra.FromBgr (0, 255, 255); // Yellow - yield return ColorBgra.FromBgr (0, 128, 128); // Olive - yield return ColorBgra.FromBgr (0, 255, 0); // Lime green - yield return ColorBgra.FromBgr (0, 128, 0); // Green - yield return ColorBgra.FromBgr (255, 255, 0); // Cyan - yield return ColorBgra.FromBgr (128, 128, 0); // Teal - yield return ColorBgra.FromBgr (255, 0, 0); // Blue - yield return ColorBgra.FromBgr (128, 0, 0); // Navy blue - yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta - yield return ColorBgra.FromBgr (128, 0, 128); // Magenta - yield return ColorBgra.FromBgr (128, 255, 255); // Light yellow - yield return ColorBgra.FromBgr (64, 128, 128); // Highball (mossy olive) - yield return ColorBgra.FromBgr (128, 255, 0); // Spring green - yield return ColorBgra.FromBgr (64, 64, 0); // Cyprus (dark teal) - yield return ColorBgra.FromBgr (255, 255, 128); // Electric blue - yield return ColorBgra.FromBgr (255, 128, 0); // Dodger blue - yield return ColorBgra.FromBgr (255, 128, 128); // Light slate blue - yield return ColorBgra.FromBgr (128, 64, 0); // Dark cerulean - yield return ColorBgra.FromBgr (128, 0, 255); // Deep pink - yield return ColorBgra.FromBgr (255, 0, 128); // Electric indigo - yield return ColorBgra.FromBgr (64, 128, 255); // Coral - yield return ColorBgra.FromBgr (0, 64, 128); // Saddle brown - } - - private static IEnumerable EnumerateWebSafeColorCube () - { - for (short r = 0; r <= 255; r += 51) - for (short g = 0; g <= 255; g += 51) - for (short b = 0; b <= 255; b += 51) - yield return ColorBgra.FromBgr ((byte) b, (byte) g, (byte) r); - } - } -} diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs new file mode 100644 index 000000000..998db553e --- /dev/null +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -0,0 +1,110 @@ +using Pinta.Core; +using System.Collections.Generic; +using System; +using System.Collections.Immutable; +using System.ComponentModel; + +namespace Pinta.Effects; + +public enum PredefinedPalettes +{ + OldWindows16, + WebSafe, + BlackWhite, + OldMsPaint, +} + +internal static class PaletteHelper +{ + public static ImmutableArray GetPredefined (PredefinedPalettes choice) + { + return choice switch { + PredefinedPalettes.OldWindows16 => Predefined.OldWindows16, + PredefinedPalettes.WebSafe => Predefined.WebSafe, + PredefinedPalettes.BlackWhite => Predefined.BlackWhite, + PredefinedPalettes.OldMsPaint => Predefined.OldMsPaint, + _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedPalettes)), + }; + } + + public static class Predefined + { + public static ImmutableArray OldWindows16 => old_windows_16.Value; + public static ImmutableArray WebSafe => web_safe.Value; + public static ImmutableArray BlackWhite { get; } + public static ImmutableArray OldMsPaint => old_ms_paint.Value; + + private static readonly Lazy> web_safe; + private static readonly Lazy> old_windows_16; + private static readonly Lazy> old_ms_paint; + + static Predefined () + { + web_safe = new (() => EnumerateWebSafeColorCube ().ToImmutableArray ()); + old_windows_16 = new (() => EnumerateOldWindowsColors ().ToImmutableArray ()); + BlackWhite = ImmutableArray.CreateRange (new[] { ColorBgra.FromBgr (0, 0, 0), ColorBgra.FromBgr (255, 255, 255) }); + old_ms_paint = new (() => EnumerateOldMsPaintColors ().ToImmutableArray ()); + } + + private static IEnumerable EnumerateOldWindowsColors () + { + yield return ColorBgra.FromBgr (0, 0, 0); // Black + yield return ColorBgra.FromBgr (0, 0, 128); // Blue + yield return ColorBgra.FromBgr (0, 128, 0); // Green + yield return ColorBgra.FromBgr (0, 128, 128); // Cyan + yield return ColorBgra.FromBgr (128, 0, 0); // Red + yield return ColorBgra.FromBgr (128, 0, 128); // Magenta + yield return ColorBgra.FromBgr (128, 64, 0); // Brown + yield return ColorBgra.FromBgr (192, 192, 192); // Light Gray + yield return ColorBgra.FromBgr (128, 128, 128); // Dark Gray + yield return ColorBgra.FromBgr (0, 0, 255); // Light Blue + yield return ColorBgra.FromBgr (0, 255, 0); // Light Green + yield return ColorBgra.FromBgr (0, 255, 255); // Light Cyan + yield return ColorBgra.FromBgr (255, 0, 0); // Light Red + yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta + yield return ColorBgra.FromBgr (255, 255, 0); // Yellow + yield return ColorBgra.FromBgr (255, 255, 255); // White + } + + private static IEnumerable EnumerateOldMsPaintColors () + { + // https://wiki.vg-resource.com/Paint + yield return ColorBgra.FromBgr (0, 0, 0); // Black + yield return ColorBgra.FromBgr (255, 255, 255); // White + yield return ColorBgra.FromBgr (128, 128, 128); // Dark gray + yield return ColorBgra.FromBgr (192, 192, 192); // Light gray + yield return ColorBgra.FromBgr (0, 0, 255); // Red + yield return ColorBgra.FromBgr (0, 0, 128); // Maroon + yield return ColorBgra.FromBgr (0, 255, 255); // Yellow + yield return ColorBgra.FromBgr (0, 128, 128); // Olive + yield return ColorBgra.FromBgr (0, 255, 0); // Lime green + yield return ColorBgra.FromBgr (0, 128, 0); // Green + yield return ColorBgra.FromBgr (255, 255, 0); // Cyan + yield return ColorBgra.FromBgr (128, 128, 0); // Teal + yield return ColorBgra.FromBgr (255, 0, 0); // Blue + yield return ColorBgra.FromBgr (128, 0, 0); // Navy blue + yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta + yield return ColorBgra.FromBgr (128, 0, 128); // Magenta + yield return ColorBgra.FromBgr (128, 255, 255); // Light yellow + yield return ColorBgra.FromBgr (64, 128, 128); // Highball (mossy olive) + yield return ColorBgra.FromBgr (128, 255, 0); // Spring green + yield return ColorBgra.FromBgr (64, 64, 0); // Cyprus (dark teal) + yield return ColorBgra.FromBgr (255, 255, 128); // Electric blue + yield return ColorBgra.FromBgr (255, 128, 0); // Dodger blue + yield return ColorBgra.FromBgr (255, 128, 128); // Light slate blue + yield return ColorBgra.FromBgr (128, 64, 0); // Dark cerulean + yield return ColorBgra.FromBgr (128, 0, 255); // Deep pink + yield return ColorBgra.FromBgr (255, 0, 128); // Electric indigo + yield return ColorBgra.FromBgr (64, 128, 255); // Coral + yield return ColorBgra.FromBgr (0, 64, 128); // Saddle brown + } + + private static IEnumerable EnumerateWebSafeColorCube () + { + for (short r = 0; r <= 255; r += 51) + for (short g = 0; g <= 255; g += 51) + for (short b = 0; b <= 255; b += 51) + yield return ColorBgra.FromBgr ((byte) b, (byte) g, (byte) r); + } + } +} diff --git a/tests/Pinta.Effects.Tests/EffectsTest.cs b/tests/Pinta.Effects.Tests/EffectsTest.cs index 9acef2c94..2883d2346 100644 --- a/tests/Pinta.Effects.Tests/EffectsTest.cs +++ b/tests/Pinta.Effects.Tests/EffectsTest.cs @@ -57,27 +57,27 @@ public void Clouds () [Test] public void Dithering1 () { - var effect = new ForwardErrorDiffusionDitheringEffect (); - effect.Data.PaletteChoice = ForwardErrorDiffusionDitheringEffect.PredefinedPalettes.OldWindows16; - effect.Data.DiffusionMatrix = ForwardErrorDiffusionDitheringEffect.PredefinedDiffusionMatrices.FloydSteinberg; + var effect = new DitheringEffect (); + effect.Data.PaletteChoice = DitheringEffect.PredefinedPalettes.OldWindows16; + effect.Data.DiffusionMatrix = PredefinedDiffusionMatrices.FloydSteinberg; Utilities.TestEffect (effect, "dithering1.png"); } [Test] public void Dithering2 () { - var effect = new ForwardErrorDiffusionDitheringEffect (); - effect.Data.PaletteChoice = ForwardErrorDiffusionDitheringEffect.PredefinedPalettes.BlackWhite; - effect.Data.DiffusionMatrix = ForwardErrorDiffusionDitheringEffect.PredefinedDiffusionMatrices.FloydSteinberg; + var effect = new DitheringEffect (); + effect.Data.PaletteChoice = DitheringEffect.PredefinedPalettes.BlackWhite; + effect.Data.DiffusionMatrix = PredefinedDiffusionMatrices.FloydSteinberg; Utilities.TestEffect (effect, "dithering2.png"); } [Test] public void Dithering3 () { - var effect = new ForwardErrorDiffusionDitheringEffect (); - effect.Data.PaletteChoice = ForwardErrorDiffusionDitheringEffect.PredefinedPalettes.OldWindows16; - effect.Data.DiffusionMatrix = ForwardErrorDiffusionDitheringEffect.PredefinedDiffusionMatrices.Stucki; + var effect = new DitheringEffect (); + effect.Data.PaletteChoice = DitheringEffect.PredefinedPalettes.OldWindows16; + effect.Data.DiffusionMatrix = PredefinedDiffusionMatrices.Stucki; Utilities.TestEffect (effect, "dithering3.png"); } From 947858e9ca71f6160793d6c531d94db69dd10c46 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Wed, 10 Jan 2024 14:20:01 +0100 Subject: [PATCH 44/65] Copying to dst_data first, just to make sure --- Pinta.Effects/Effects/DitheringEffect.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Pinta.Effects/Effects/DitheringEffect.cs b/Pinta.Effects/Effects/DitheringEffect.cs index 824f8835b..56c37ab29 100644 --- a/Pinta.Effects/Effects/DitheringEffect.cs +++ b/Pinta.Effects/Effects/DitheringEffect.cs @@ -44,8 +44,16 @@ protected override void Render (ImageSurface src, ImageSurface dest, RectangleI { DitheringSettings settings = CreateSettings (src); + ReadOnlySpan src_data = src.GetReadOnlyPixelData (); Span dst_data = dest.GetPixelData (); + for (int y = roi.Top; y <= roi.Bottom; y++) { + for (int x = roi.Left; x <= roi.Right; x++) { + int currentIndex = y * settings.sourceWidth + x; + dst_data[currentIndex] = src_data[currentIndex]; + } + } + for (int y = roi.Top; y <= roi.Bottom; y++) { for (int x = roi.Left; x <= roi.Right; x++) { From 2bfc006177baf730a0a3ebb90b4ab2c0c13a96b7 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Wed, 10 Jan 2024 14:22:46 +0100 Subject: [PATCH 45/65] fixed compilation errors --- tests/Pinta.Effects.Tests/EffectsTest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Pinta.Effects.Tests/EffectsTest.cs b/tests/Pinta.Effects.Tests/EffectsTest.cs index 2883d2346..43227da1d 100644 --- a/tests/Pinta.Effects.Tests/EffectsTest.cs +++ b/tests/Pinta.Effects.Tests/EffectsTest.cs @@ -58,7 +58,7 @@ public void Clouds () public void Dithering1 () { var effect = new DitheringEffect (); - effect.Data.PaletteChoice = DitheringEffect.PredefinedPalettes.OldWindows16; + effect.Data.PaletteChoice = PredefinedPalettes.OldWindows16; effect.Data.DiffusionMatrix = PredefinedDiffusionMatrices.FloydSteinberg; Utilities.TestEffect (effect, "dithering1.png"); } @@ -67,7 +67,7 @@ public void Dithering1 () public void Dithering2 () { var effect = new DitheringEffect (); - effect.Data.PaletteChoice = DitheringEffect.PredefinedPalettes.BlackWhite; + effect.Data.PaletteChoice = PredefinedPalettes.BlackWhite; effect.Data.DiffusionMatrix = PredefinedDiffusionMatrices.FloydSteinberg; Utilities.TestEffect (effect, "dithering2.png"); } @@ -76,7 +76,7 @@ public void Dithering2 () public void Dithering3 () { var effect = new DitheringEffect (); - effect.Data.PaletteChoice = DitheringEffect.PredefinedPalettes.OldWindows16; + effect.Data.PaletteChoice = PredefinedPalettes.OldWindows16; effect.Data.DiffusionMatrix = PredefinedDiffusionMatrices.Stucki; Utilities.TestEffect (effect, "dithering3.png"); } From 1fb54c8ea1d39e729cb3fc614a8ba4b8cd5dbff3 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Thu, 11 Jan 2024 11:59:19 +0100 Subject: [PATCH 46/65] Changed test picture `dithering2.png` --- .../Pinta.Effects.Tests/Assets/dithering2.png | Bin 19247 -> 17757 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/Pinta.Effects.Tests/Assets/dithering2.png b/tests/Pinta.Effects.Tests/Assets/dithering2.png index a947bfa8048c2d8a8a55f8edfd7bce00aa711312..b3fb50bcd89aaceff158e128903836fb7ba5cd61 100644 GIT binary patch literal 17757 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 literal 19247 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 Date: Thu, 11 Jan 2024 12:07:50 +0100 Subject: [PATCH 47/65] Ordered `using`s --- Pinta.Effects/Utilities/PaletteHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index 998db553e..c95bf3365 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -1,8 +1,8 @@ -using Pinta.Core; -using System.Collections.Generic; using System; +using System.Collections.Generic; using System.Collections.Immutable; using System.ComponentModel; +using Pinta.Core; namespace Pinta.Effects; From f1c64a0416bc1fb4f060f85d3186f076290cfc8b Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sat, 13 Jan 2024 16:07:23 +0100 Subject: [PATCH 48/65] Added checks so that when the diffusion matrix is being applied is stays within the bounds of ROI --- Pinta.Effects/Effects/DitheringEffect.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Pinta.Effects/Effects/DitheringEffect.cs b/Pinta.Effects/Effects/DitheringEffect.cs index 56c37ab29..7ae98b487 100644 --- a/Pinta.Effects/Effects/DitheringEffect.cs +++ b/Pinta.Effects/Effects/DitheringEffect.cs @@ -82,6 +82,12 @@ protected override void Render (ImageSurface src, ImageSurface dest, RectangleI Y: y + r ); + if (thisItem.X < roi.Left || thisItem.X >= roi.Right) + continue; + + if (thisItem.Y < roi.Top || thisItem.Y >= roi.Bottom) + continue; + if (thisItem.X < 0 || thisItem.X >= settings.sourceWidth) continue; From b2fa05fd0e61c8d10a7487825dd51ab1447dd776 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sat, 13 Jan 2024 16:29:28 +0100 Subject: [PATCH 49/65] Changed test files --- .../Pinta.Effects.Tests/Assets/dithering1.png | Bin 46815 -> 45803 bytes .../Pinta.Effects.Tests/Assets/dithering2.png | Bin 17757 -> 17711 bytes .../Pinta.Effects.Tests/Assets/dithering3.png | Bin 45180 -> 45706 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/Pinta.Effects.Tests/Assets/dithering1.png b/tests/Pinta.Effects.Tests/Assets/dithering1.png index 26bf6cb54fce14a90ced89990ac30b192f587640..b90dab76b856f646872b194a3291e86de6ef8965 100644 GIT binary patch delta 45771 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 JPDHLkV1f{~)*S!< diff --git a/tests/Pinta.Effects.Tests/Assets/dithering2.png b/tests/Pinta.Effects.Tests/Assets/dithering2.png index b3fb50bcd89aaceff158e128903836fb7ba5cd61..6d998932e99ec8efc2a24efb4728bbd4d959a37d 100644 GIT binary patch delta 16840 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 DNwW;_ delta 16885 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 diff --git a/tests/Pinta.Effects.Tests/Assets/dithering3.png b/tests/Pinta.Effects.Tests/Assets/dithering3.png index 6750bbcd3085b2acdfef2eb797d590fd5c7491b4..e82958ea235c7f1c1f32288502ef78c9cc411955 100644 GIT binary patch literal 45706 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 S1@a~U0000P^M literal 45180 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 M07*qoM6N<$f Date: Sat, 13 Jan 2024 22:33:57 +0100 Subject: [PATCH 50/65] Expanded selection of color palettes --- Pinta.Effects/Utilities/PaletteHelper.cs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index c95bf3365..61ba2257a 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -9,6 +9,7 @@ namespace Pinta.Effects; public enum PredefinedPalettes { OldWindows16, + OldWindows20, WebSafe, BlackWhite, OldMsPaint, @@ -20,6 +21,7 @@ public static ImmutableArray GetPredefined (PredefinedPalettes choice { return choice switch { PredefinedPalettes.OldWindows16 => Predefined.OldWindows16, + PredefinedPalettes.OldWindows20 => Predefined.OldWindows20, PredefinedPalettes.WebSafe => Predefined.WebSafe, PredefinedPalettes.BlackWhite => Predefined.BlackWhite, PredefinedPalettes.OldMsPaint => Predefined.OldMsPaint, @@ -30,24 +32,28 @@ public static ImmutableArray GetPredefined (PredefinedPalettes choice public static class Predefined { public static ImmutableArray OldWindows16 => old_windows_16.Value; + public static ImmutableArray OldWindows20 => old_windows_20.Value; public static ImmutableArray WebSafe => web_safe.Value; public static ImmutableArray BlackWhite { get; } public static ImmutableArray OldMsPaint => old_ms_paint.Value; private static readonly Lazy> web_safe; private static readonly Lazy> old_windows_16; + private static readonly Lazy> old_windows_20; private static readonly Lazy> old_ms_paint; static Predefined () { web_safe = new (() => EnumerateWebSafeColorCube ().ToImmutableArray ()); - old_windows_16 = new (() => EnumerateOldWindowsColors ().ToImmutableArray ()); + old_windows_16 = new (() => EnumerateOldWindows16Colors ().ToImmutableArray ()); + old_windows_20 = new (() => EnumerateOldWindows20Colors ().ToImmutableArray ()); BlackWhite = ImmutableArray.CreateRange (new[] { ColorBgra.FromBgr (0, 0, 0), ColorBgra.FromBgr (255, 255, 255) }); old_ms_paint = new (() => EnumerateOldMsPaintColors ().ToImmutableArray ()); } - private static IEnumerable EnumerateOldWindowsColors () + private static IEnumerable EnumerateOldWindows16Colors () { + // https://en.wikipedia.org/wiki/List_of_software_palettes#Microsoft_Windows_and_IBM_OS/2_default_16-color_palette yield return ColorBgra.FromBgr (0, 0, 0); // Black yield return ColorBgra.FromBgr (0, 0, 128); // Blue yield return ColorBgra.FromBgr (0, 128, 0); // Green @@ -66,6 +72,18 @@ private static IEnumerable EnumerateOldWindowsColors () yield return ColorBgra.FromBgr (255, 255, 255); // White } + private static IEnumerable EnumerateOldWindows20Colors () + { + // https://en.wikipedia.org/wiki/List_of_software_palettes#Microsoft_Windows_default_20-color_palette + foreach (var color in EnumerateOldWindows16Colors ()) + yield return color; + + yield return ColorBgra.FromBgr (240, 251, 255); // Cream + yield return ColorBgra.FromBgr (192, 220, 192); // Money Green + yield return ColorBgra.FromBgr (240, 202, 166); // Sky Blue + yield return ColorBgra.FromBgr (164, 160, 160); // Medium Grey + } + private static IEnumerable EnumerateOldMsPaintColors () { // https://wiki.vg-resource.com/Paint From 9819be8529889fee897910585e432f2eb93901c0 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sat, 13 Jan 2024 22:42:46 +0100 Subject: [PATCH 51/65] Sorted lines in `PaletteHelper` --- Pinta.Effects/Utilities/PaletteHelper.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index 61ba2257a..f7a3cee8d 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -8,11 +8,11 @@ namespace Pinta.Effects; public enum PredefinedPalettes { + BlackWhite, + OldMsPaint, OldWindows16, OldWindows20, WebSafe, - BlackWhite, - OldMsPaint, } internal static class PaletteHelper @@ -20,35 +20,35 @@ internal static class PaletteHelper public static ImmutableArray GetPredefined (PredefinedPalettes choice) { return choice switch { + PredefinedPalettes.BlackWhite => Predefined.BlackWhite, + PredefinedPalettes.OldMsPaint => Predefined.OldMsPaint, PredefinedPalettes.OldWindows16 => Predefined.OldWindows16, PredefinedPalettes.OldWindows20 => Predefined.OldWindows20, PredefinedPalettes.WebSafe => Predefined.WebSafe, - PredefinedPalettes.BlackWhite => Predefined.BlackWhite, - PredefinedPalettes.OldMsPaint => Predefined.OldMsPaint, _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedPalettes)), }; } public static class Predefined { + public static ImmutableArray BlackWhite { get; } + public static ImmutableArray OldMsPaint => old_ms_paint.Value; public static ImmutableArray OldWindows16 => old_windows_16.Value; public static ImmutableArray OldWindows20 => old_windows_20.Value; public static ImmutableArray WebSafe => web_safe.Value; - public static ImmutableArray BlackWhite { get; } - public static ImmutableArray OldMsPaint => old_ms_paint.Value; - private static readonly Lazy> web_safe; private static readonly Lazy> old_windows_16; private static readonly Lazy> old_windows_20; private static readonly Lazy> old_ms_paint; + private static readonly Lazy> web_safe; static Predefined () { - web_safe = new (() => EnumerateWebSafeColorCube ().ToImmutableArray ()); - old_windows_16 = new (() => EnumerateOldWindows16Colors ().ToImmutableArray ()); - old_windows_20 = new (() => EnumerateOldWindows20Colors ().ToImmutableArray ()); BlackWhite = ImmutableArray.CreateRange (new[] { ColorBgra.FromBgr (0, 0, 0), ColorBgra.FromBgr (255, 255, 255) }); old_ms_paint = new (() => EnumerateOldMsPaintColors ().ToImmutableArray ()); + old_windows_16 = new (() => EnumerateOldWindows16Colors ().ToImmutableArray ()); + old_windows_20 = new (() => EnumerateOldWindows20Colors ().ToImmutableArray ()); + web_safe = new (() => EnumerateWebSafeColorCube ().ToImmutableArray ()); } private static IEnumerable EnumerateOldWindows16Colors () From 3a3cfb2de2c0340621bfdf7040533c61702718e5 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sat, 13 Jan 2024 23:11:47 +0100 Subject: [PATCH 52/65] Expanded palette selection further --- Pinta.Effects/Utilities/PaletteHelper.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index f7a3cee8d..5b41a425f 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -12,6 +12,7 @@ public enum PredefinedPalettes OldMsPaint, OldWindows16, OldWindows20, + Rgb3Bit, WebSafe, } @@ -24,6 +25,7 @@ public static ImmutableArray GetPredefined (PredefinedPalettes choice PredefinedPalettes.OldMsPaint => Predefined.OldMsPaint, PredefinedPalettes.OldWindows16 => Predefined.OldWindows16, PredefinedPalettes.OldWindows20 => Predefined.OldWindows20, + PredefinedPalettes.Rgb3Bit => Predefined.Rgb3Bit, PredefinedPalettes.WebSafe => Predefined.WebSafe, _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedPalettes)), }; @@ -35,11 +37,13 @@ public static class Predefined public static ImmutableArray OldMsPaint => old_ms_paint.Value; public static ImmutableArray OldWindows16 => old_windows_16.Value; public static ImmutableArray OldWindows20 => old_windows_20.Value; + public static ImmutableArray Rgb3Bit => rgb_3_bit.Value; public static ImmutableArray WebSafe => web_safe.Value; private static readonly Lazy> old_windows_16; private static readonly Lazy> old_windows_20; private static readonly Lazy> old_ms_paint; + private static readonly Lazy> rgb_3_bit; private static readonly Lazy> web_safe; static Predefined () @@ -48,9 +52,23 @@ static Predefined () old_ms_paint = new (() => EnumerateOldMsPaintColors ().ToImmutableArray ()); old_windows_16 = new (() => EnumerateOldWindows16Colors ().ToImmutableArray ()); old_windows_20 = new (() => EnumerateOldWindows20Colors ().ToImmutableArray ()); + rgb_3_bit = new (() => EnumerateRgb3Bit ().ToImmutableArray ()); web_safe = new (() => EnumerateWebSafeColorCube ().ToImmutableArray ()); } + private static IEnumerable EnumerateRgb3Bit () + { + for (byte i = 0; i < 8; i++) { + bool r = (i & 1) != 0; + bool g = (i & 2) != 0; + bool b = (i & 4) != 0; + yield return ColorBgra.FromBgr ( + b: (byte) (b ? 255 : 0), + g: (byte) (g ? 255 : 0), + r: (byte) (r ? 255 : 0)); + } + } + private static IEnumerable EnumerateOldWindows16Colors () { // https://en.wikipedia.org/wiki/List_of_software_palettes#Microsoft_Windows_and_IBM_OS/2_default_16-color_palette @@ -124,5 +142,7 @@ private static IEnumerable EnumerateWebSafeColorCube () for (short b = 0; b <= 255; b += 51) yield return ColorBgra.FromBgr ((byte) b, (byte) g, (byte) r); } + + } } From 6a725f9c37d1b427761162a886bb9e34bcfe37e1 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sat, 13 Jan 2024 23:59:29 +0100 Subject: [PATCH 53/65] Added another palette --- Pinta.Effects/Utilities/PaletteHelper.cs | 25 +++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index 5b41a425f..8746e262a 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -13,6 +13,7 @@ public enum PredefinedPalettes OldWindows16, OldWindows20, Rgb3Bit, + Rgb666, WebSafe, } @@ -26,6 +27,7 @@ public static ImmutableArray GetPredefined (PredefinedPalettes choice PredefinedPalettes.OldWindows16 => Predefined.OldWindows16, PredefinedPalettes.OldWindows20 => Predefined.OldWindows20, PredefinedPalettes.Rgb3Bit => Predefined.Rgb3Bit, + PredefinedPalettes.Rgb666 => Predefined.Rgb666, PredefinedPalettes.WebSafe => Predefined.WebSafe, _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedPalettes)), }; @@ -38,12 +40,14 @@ public static class Predefined public static ImmutableArray OldWindows16 => old_windows_16.Value; public static ImmutableArray OldWindows20 => old_windows_20.Value; public static ImmutableArray Rgb3Bit => rgb_3_bit.Value; + public static ImmutableArray Rgb666 => rgb_666.Value; public static ImmutableArray WebSafe => web_safe.Value; private static readonly Lazy> old_windows_16; private static readonly Lazy> old_windows_20; private static readonly Lazy> old_ms_paint; private static readonly Lazy> rgb_3_bit; + private static readonly Lazy> rgb_666; private static readonly Lazy> web_safe; static Predefined () @@ -53,19 +57,34 @@ static Predefined () old_windows_16 = new (() => EnumerateOldWindows16Colors ().ToImmutableArray ()); old_windows_20 = new (() => EnumerateOldWindows20Colors ().ToImmutableArray ()); rgb_3_bit = new (() => EnumerateRgb3Bit ().ToImmutableArray ()); + rgb_666 = new (() => EnumerateRgb666 ().ToImmutableArray ()); web_safe = new (() => EnumerateWebSafeColorCube ().ToImmutableArray ()); } + private static IEnumerable EnumerateRgb666 () + { + // https://en.wikipedia.org/wiki/List_of_software_palettes#6_level_RGB + const byte factor = 51; + for (byte r = 0; r < 6; r++) + for (byte g = 0; g < 6; g++) + for (byte b = 0; b < 6; b++) + yield return ColorBgra.FromBgr ( + b: (byte) (b * factor), + g: (byte) (g * factor), + r: (byte) (r * factor)); + } + private static IEnumerable EnumerateRgb3Bit () { + // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#3-bit_RGB for (byte i = 0; i < 8; i++) { bool r = (i & 1) != 0; bool g = (i & 2) != 0; bool b = (i & 4) != 0; yield return ColorBgra.FromBgr ( - b: (byte) (b ? 255 : 0), - g: (byte) (g ? 255 : 0), - r: (byte) (r ? 255 : 0)); + b: b ? byte.MaxValue : byte.MinValue, + g: g ? byte.MaxValue : byte.MinValue, + r: r ? byte.MaxValue : byte.MinValue); } } From 64686879b9a8f0026009347753ebfc0c16ce6da7 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sun, 14 Jan 2024 00:04:10 +0100 Subject: [PATCH 54/65] Added another palette --- Pinta.Effects/Utilities/PaletteHelper.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index 8746e262a..65da77787 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -14,6 +14,7 @@ public enum PredefinedPalettes OldWindows20, Rgb3Bit, Rgb666, + Rgb6Bit, WebSafe, } @@ -28,6 +29,7 @@ public static ImmutableArray GetPredefined (PredefinedPalettes choice PredefinedPalettes.OldWindows20 => Predefined.OldWindows20, PredefinedPalettes.Rgb3Bit => Predefined.Rgb3Bit, PredefinedPalettes.Rgb666 => Predefined.Rgb666, + PredefinedPalettes.Rgb6Bit => Predefined.Rgb6Bit, PredefinedPalettes.WebSafe => Predefined.WebSafe, _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedPalettes)), }; @@ -41,6 +43,7 @@ public static class Predefined public static ImmutableArray OldWindows20 => old_windows_20.Value; public static ImmutableArray Rgb3Bit => rgb_3_bit.Value; public static ImmutableArray Rgb666 => rgb_666.Value; + public static ImmutableArray Rgb6Bit => rgb_6_bit.Value; public static ImmutableArray WebSafe => web_safe.Value; private static readonly Lazy> old_windows_16; @@ -48,6 +51,7 @@ public static class Predefined private static readonly Lazy> old_ms_paint; private static readonly Lazy> rgb_3_bit; private static readonly Lazy> rgb_666; + private static readonly Lazy> rgb_6_bit; private static readonly Lazy> web_safe; static Predefined () @@ -58,6 +62,7 @@ static Predefined () old_windows_20 = new (() => EnumerateOldWindows20Colors ().ToImmutableArray ()); rgb_3_bit = new (() => EnumerateRgb3Bit ().ToImmutableArray ()); rgb_666 = new (() => EnumerateRgb666 ().ToImmutableArray ()); + rgb_6_bit = new (() => EnumerateRgb6Bit ().ToImmutableArray ()); web_safe = new (() => EnumerateWebSafeColorCube ().ToImmutableArray ()); } @@ -74,6 +79,19 @@ private static IEnumerable EnumerateRgb666 () r: (byte) (r * factor)); } + private static IEnumerable EnumerateRgb6Bit () + { + // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#6-bit_RGB + const byte factor = 85; + for (byte r = 0; r < 4; r++) + for (byte g = 0; g < 4; g++) + for (byte b = 0; b < 4; b++) + yield return ColorBgra.FromBgr ( + b: (byte) (b * factor), + g: (byte) (g * factor), + r: (byte) (r * factor)); + } + private static IEnumerable EnumerateRgb3Bit () { // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#3-bit_RGB From 4606508afd55aeb21c5f1f48e9463568d37e15fb Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sun, 14 Jan 2024 00:09:57 +0100 Subject: [PATCH 55/65] Local refactoring --- Pinta.Effects/Utilities/PaletteHelper.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index 65da77787..26c6f0927 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -69,10 +69,11 @@ static Predefined () private static IEnumerable EnumerateRgb666 () { // https://en.wikipedia.org/wiki/List_of_software_palettes#6_level_RGB + const byte levels = 6; const byte factor = 51; - for (byte r = 0; r < 6; r++) - for (byte g = 0; g < 6; g++) - for (byte b = 0; b < 6; b++) + for (byte r = 0; r < levels; r++) + for (byte g = 0; g < levels; g++) + for (byte b = 0; b < levels; b++) yield return ColorBgra.FromBgr ( b: (byte) (b * factor), g: (byte) (g * factor), @@ -82,10 +83,11 @@ private static IEnumerable EnumerateRgb666 () private static IEnumerable EnumerateRgb6Bit () { // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#6-bit_RGB + const byte levels = 4; const byte factor = 85; - for (byte r = 0; r < 4; r++) - for (byte g = 0; g < 4; g++) - for (byte b = 0; b < 4; b++) + for (byte r = 0; r < levels; r++) + for (byte g = 0; g < levels; g++) + for (byte b = 0; b < levels; b++) yield return ColorBgra.FromBgr ( b: (byte) (b * factor), g: (byte) (g * factor), From adfd3e1ea99497e6dba4406bd6f3cd0fd44b9424 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sun, 14 Jan 2024 00:24:48 +0100 Subject: [PATCH 56/65] Removed WebSafe, as it was repeated --- Pinta.Effects/Utilities/PaletteHelper.cs | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index 26c6f0927..fdeb0767c 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -15,7 +15,6 @@ public enum PredefinedPalettes Rgb3Bit, Rgb666, Rgb6Bit, - WebSafe, } internal static class PaletteHelper @@ -30,7 +29,6 @@ public static ImmutableArray GetPredefined (PredefinedPalettes choice PredefinedPalettes.Rgb3Bit => Predefined.Rgb3Bit, PredefinedPalettes.Rgb666 => Predefined.Rgb666, PredefinedPalettes.Rgb6Bit => Predefined.Rgb6Bit, - PredefinedPalettes.WebSafe => Predefined.WebSafe, _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedPalettes)), }; } @@ -44,7 +42,6 @@ public static class Predefined public static ImmutableArray Rgb3Bit => rgb_3_bit.Value; public static ImmutableArray Rgb666 => rgb_666.Value; public static ImmutableArray Rgb6Bit => rgb_6_bit.Value; - public static ImmutableArray WebSafe => web_safe.Value; private static readonly Lazy> old_windows_16; private static readonly Lazy> old_windows_20; @@ -52,7 +49,6 @@ public static class Predefined private static readonly Lazy> rgb_3_bit; private static readonly Lazy> rgb_666; private static readonly Lazy> rgb_6_bit; - private static readonly Lazy> web_safe; static Predefined () { @@ -63,7 +59,6 @@ static Predefined () rgb_3_bit = new (() => EnumerateRgb3Bit ().ToImmutableArray ()); rgb_666 = new (() => EnumerateRgb666 ().ToImmutableArray ()); rgb_6_bit = new (() => EnumerateRgb6Bit ().ToImmutableArray ()); - web_safe = new (() => EnumerateWebSafeColorCube ().ToImmutableArray ()); } private static IEnumerable EnumerateRgb666 () @@ -173,15 +168,5 @@ private static IEnumerable EnumerateOldMsPaintColors () yield return ColorBgra.FromBgr (64, 128, 255); // Coral yield return ColorBgra.FromBgr (0, 64, 128); // Saddle brown } - - private static IEnumerable EnumerateWebSafeColorCube () - { - for (short r = 0; r <= 255; r += 51) - for (short g = 0; g <= 255; g += 51) - for (short b = 0; b <= 255; b += 51) - yield return ColorBgra.FromBgr ((byte) b, (byte) g, (byte) r); - } - - } } From 2dc12475cfb2e1d0a63464a606f022ad24f42f11 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sun, 14 Jan 2024 00:36:19 +0100 Subject: [PATCH 57/65] Created `ColorCube` method to bring many of those palettes together --- Pinta.Effects/Utilities/PaletteHelper.cs | 39 ++++++++++-------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index fdeb0767c..c77915f0b 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.ComponentModel; +using System.Linq; using Pinta.Core; namespace Pinta.Effects; @@ -66,13 +67,7 @@ private static IEnumerable EnumerateRgb666 () // https://en.wikipedia.org/wiki/List_of_software_palettes#6_level_RGB const byte levels = 6; const byte factor = 51; - for (byte r = 0; r < levels; r++) - for (byte g = 0; g < levels; g++) - for (byte b = 0; b < levels; b++) - yield return ColorBgra.FromBgr ( - b: (byte) (b * factor), - g: (byte) (g * factor), - r: (byte) (r * factor)); + return ColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); } private static IEnumerable EnumerateRgb6Bit () @@ -80,27 +75,13 @@ private static IEnumerable EnumerateRgb6Bit () // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#6-bit_RGB const byte levels = 4; const byte factor = 85; - for (byte r = 0; r < levels; r++) - for (byte g = 0; g < levels; g++) - for (byte b = 0; b < levels; b++) - yield return ColorBgra.FromBgr ( - b: (byte) (b * factor), - g: (byte) (g * factor), - r: (byte) (r * factor)); + return ColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); } private static IEnumerable EnumerateRgb3Bit () { // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#3-bit_RGB - for (byte i = 0; i < 8; i++) { - bool r = (i & 1) != 0; - bool g = (i & 2) != 0; - bool b = (i & 4) != 0; - yield return ColorBgra.FromBgr ( - b: b ? byte.MaxValue : byte.MinValue, - g: g ? byte.MaxValue : byte.MinValue, - r: r ? byte.MaxValue : byte.MinValue); - } + return ColorCube (new[] { byte.MinValue, byte.MaxValue }); } private static IEnumerable EnumerateOldWindows16Colors () @@ -168,5 +149,17 @@ private static IEnumerable EnumerateOldMsPaintColors () yield return ColorBgra.FromBgr (64, 128, 255); // Coral yield return ColorBgra.FromBgr (0, 64, 128); // Saddle brown } + + private static IEnumerable ColorCube (IEnumerable valueSequence) + { + ImmutableArray values = valueSequence.ToImmutableArray (); + for (int r = 0; r < values.Length; r++) + for (int g = 0; g < values.Length; g++) + for (int b = 0; b < values.Length; b++) + yield return ColorBgra.FromBgr ( + b: values[b], + g: values[g], + r: values[r]); + } } } From f66b20dffcbf51ead89f94c686f6a113f5494f99 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sun, 14 Jan 2024 00:53:33 +0100 Subject: [PATCH 58/65] Formatting --- Pinta.Effects/Utilities/PaletteHelper.cs | 42 +++++++++++++----------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index c77915f0b..2734d87cc 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -81,7 +81,7 @@ private static IEnumerable EnumerateRgb6Bit () private static IEnumerable EnumerateRgb3Bit () { // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#3-bit_RGB - return ColorCube (new[] { byte.MinValue, byte.MaxValue }); + return ColorCube (ImmutableArray.Create (byte.MinValue, byte.MaxValue)); } private static IEnumerable EnumerateOldWindows16Colors () @@ -120,34 +120,38 @@ private static IEnumerable EnumerateOldWindows20Colors () private static IEnumerable EnumerateOldMsPaintColors () { // https://wiki.vg-resource.com/Paint + yield return ColorBgra.FromBgr (0, 0, 0); // Black - yield return ColorBgra.FromBgr (255, 255, 255); // White - yield return ColorBgra.FromBgr (128, 128, 128); // Dark gray - yield return ColorBgra.FromBgr (192, 192, 192); // Light gray - yield return ColorBgra.FromBgr (0, 0, 255); // Red + yield return ColorBgra.FromBgr (0, 0, 128); // Maroon - yield return ColorBgra.FromBgr (0, 255, 255); // Yellow - yield return ColorBgra.FromBgr (0, 128, 128); // Olive - yield return ColorBgra.FromBgr (0, 255, 0); // Lime green yield return ColorBgra.FromBgr (0, 128, 0); // Green - yield return ColorBgra.FromBgr (255, 255, 0); // Cyan + yield return ColorBgra.FromBgr (0, 128, 128); // Olive + yield return ColorBgra.FromBgr (128, 0, 0); // Navy blue + yield return ColorBgra.FromBgr (128, 0, 128); // Magenta yield return ColorBgra.FromBgr (128, 128, 0); // Teal + yield return ColorBgra.FromBgr (128, 128, 128); // Dark gray + + yield return ColorBgra.FromBgr (0, 0, 255); // Red + yield return ColorBgra.FromBgr (0, 255, 0); // Lime green + yield return ColorBgra.FromBgr (0, 255, 255); // Yellow yield return ColorBgra.FromBgr (255, 0, 0); // Blue - yield return ColorBgra.FromBgr (128, 0, 0); // Navy blue yield return ColorBgra.FromBgr (255, 0, 255); // Light Magenta - yield return ColorBgra.FromBgr (128, 0, 128); // Magenta - yield return ColorBgra.FromBgr (128, 255, 255); // Light yellow + yield return ColorBgra.FromBgr (255, 255, 0); // Cyan + yield return ColorBgra.FromBgr (255, 255, 255); // White + + yield return ColorBgra.FromBgr (0, 64, 128); // Saddle brown + yield return ColorBgra.FromBgr (64, 64, 0); // Cyprus (dark teal) yield return ColorBgra.FromBgr (64, 128, 128); // Highball (mossy olive) + yield return ColorBgra.FromBgr (64, 128, 255); // Coral + yield return ColorBgra.FromBgr (128, 0, 255); // Deep pink + yield return ColorBgra.FromBgr (128, 64, 0); // Dark cerulean yield return ColorBgra.FromBgr (128, 255, 0); // Spring green - yield return ColorBgra.FromBgr (64, 64, 0); // Cyprus (dark teal) - yield return ColorBgra.FromBgr (255, 255, 128); // Electric blue + yield return ColorBgra.FromBgr (128, 255, 255); // Light yellow + yield return ColorBgra.FromBgr (192, 192, 192); // Light gray + yield return ColorBgra.FromBgr (255, 0, 128); // Electric indigo yield return ColorBgra.FromBgr (255, 128, 0); // Dodger blue yield return ColorBgra.FromBgr (255, 128, 128); // Light slate blue - yield return ColorBgra.FromBgr (128, 64, 0); // Dark cerulean - yield return ColorBgra.FromBgr (128, 0, 255); // Deep pink - yield return ColorBgra.FromBgr (255, 0, 128); // Electric indigo - yield return ColorBgra.FromBgr (64, 128, 255); // Coral - yield return ColorBgra.FromBgr (0, 64, 128); // Saddle brown + yield return ColorBgra.FromBgr (255, 255, 128); // Electric blue } private static IEnumerable ColorCube (IEnumerable valueSequence) From a6d126e6d3d98b09e732216c5f465c2126bcd501 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sun, 14 Jan 2024 00:57:58 +0100 Subject: [PATCH 59/65] Made name more specific `RgbColorCube` instead of `ColorCube`, as there may be an `RgbaColorCube` --- Pinta.Effects/Utilities/PaletteHelper.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index 2734d87cc..21c45668f 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -67,7 +67,7 @@ private static IEnumerable EnumerateRgb666 () // https://en.wikipedia.org/wiki/List_of_software_palettes#6_level_RGB const byte levels = 6; const byte factor = 51; - return ColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); + return RgbColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); } private static IEnumerable EnumerateRgb6Bit () @@ -75,13 +75,13 @@ private static IEnumerable EnumerateRgb6Bit () // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#6-bit_RGB const byte levels = 4; const byte factor = 85; - return ColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); + return RgbColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); } private static IEnumerable EnumerateRgb3Bit () { // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#3-bit_RGB - return ColorCube (ImmutableArray.Create (byte.MinValue, byte.MaxValue)); + return RgbColorCube (ImmutableArray.Create (byte.MinValue, byte.MaxValue)); } private static IEnumerable EnumerateOldWindows16Colors () @@ -154,7 +154,7 @@ private static IEnumerable EnumerateOldMsPaintColors () yield return ColorBgra.FromBgr (255, 255, 128); // Electric blue } - private static IEnumerable ColorCube (IEnumerable valueSequence) + private static IEnumerable RgbColorCube (IEnumerable valueSequence) { ImmutableArray values = valueSequence.ToImmutableArray (); for (int r = 0; r < values.Length; r++) From 7875e19269bd581113e42d4b13f7e75b930f1dad Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sun, 14 Jan 2024 01:12:44 +0100 Subject: [PATCH 60/65] Added `Rgb12Bit` palette --- Pinta.Effects/Utilities/PaletteHelper.cs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index 21c45668f..055074c89 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -16,6 +16,7 @@ public enum PredefinedPalettes Rgb3Bit, Rgb666, Rgb6Bit, + Rgb12Bit, } internal static class PaletteHelper @@ -30,6 +31,7 @@ public static ImmutableArray GetPredefined (PredefinedPalettes choice PredefinedPalettes.Rgb3Bit => Predefined.Rgb3Bit, PredefinedPalettes.Rgb666 => Predefined.Rgb666, PredefinedPalettes.Rgb6Bit => Predefined.Rgb6Bit, + PredefinedPalettes.Rgb12Bit => Predefined.Rgb12Bit, _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedPalettes)), }; } @@ -43,6 +45,7 @@ public static class Predefined public static ImmutableArray Rgb3Bit => rgb_3_bit.Value; public static ImmutableArray Rgb666 => rgb_666.Value; public static ImmutableArray Rgb6Bit => rgb_6_bit.Value; + public static ImmutableArray Rgb12Bit => rgb_12_bit.Value; private static readonly Lazy> old_windows_16; private static readonly Lazy> old_windows_20; @@ -50,6 +53,7 @@ public static class Predefined private static readonly Lazy> rgb_3_bit; private static readonly Lazy> rgb_666; private static readonly Lazy> rgb_6_bit; + private static readonly Lazy> rgb_12_bit; static Predefined () { @@ -60,6 +64,7 @@ static Predefined () rgb_3_bit = new (() => EnumerateRgb3Bit ().ToImmutableArray ()); rgb_666 = new (() => EnumerateRgb666 ().ToImmutableArray ()); rgb_6_bit = new (() => EnumerateRgb6Bit ().ToImmutableArray ()); + rgb_12_bit = new (() => EnumerateRgb12Bit ().ToImmutableArray ()); } private static IEnumerable EnumerateRgb666 () @@ -70,6 +75,14 @@ private static IEnumerable EnumerateRgb666 () return RgbColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); } + private static IEnumerable EnumerateRgb12Bit () + { + // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#12-bit_RGB + const byte levels = 16; + const byte factor = 17; + return RgbColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); + } + private static IEnumerable EnumerateRgb6Bit () { // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#6-bit_RGB @@ -81,7 +94,9 @@ private static IEnumerable EnumerateRgb6Bit () private static IEnumerable EnumerateRgb3Bit () { // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#3-bit_RGB - return RgbColorCube (ImmutableArray.Create (byte.MinValue, byte.MaxValue)); + const byte levels = 2; + const byte factor = 255; + return RgbColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); } private static IEnumerable EnumerateOldWindows16Colors () @@ -154,9 +169,8 @@ private static IEnumerable EnumerateOldMsPaintColors () yield return ColorBgra.FromBgr (255, 255, 128); // Electric blue } - private static IEnumerable RgbColorCube (IEnumerable valueSequence) + private static IEnumerable RgbColorCube (ImmutableArray values) { - ImmutableArray values = valueSequence.ToImmutableArray (); for (int r = 0; r < values.Length; r++) for (int g = 0; g < values.Length; g++) for (int b = 0; b < values.Length; b++) @@ -165,5 +179,8 @@ private static IEnumerable RgbColorCube (IEnumerable valueSeque g: values[g], r: values[r]); } + + private static IEnumerable RgbColorCube (IEnumerable valueSequence) + => RgbColorCube (valueSequence.ToImmutableArray ()); } } From 37d67497271b952426abd42c6f0d285eebf37021 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sun, 14 Jan 2024 01:15:26 +0100 Subject: [PATCH 61/65] "Compressed" the logic even further --- Pinta.Effects/Utilities/PaletteHelper.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index 055074c89..531b86ed4 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -72,7 +72,7 @@ private static IEnumerable EnumerateRgb666 () // https://en.wikipedia.org/wiki/List_of_software_palettes#6_level_RGB const byte levels = 6; const byte factor = 51; - return RgbColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); + return RgbColorCube (GenerateCubeSequence (levels, factor)); } private static IEnumerable EnumerateRgb12Bit () @@ -80,7 +80,7 @@ private static IEnumerable EnumerateRgb12Bit () // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#12-bit_RGB const byte levels = 16; const byte factor = 17; - return RgbColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); + return RgbColorCube (GenerateCubeSequence (levels, factor)); } private static IEnumerable EnumerateRgb6Bit () @@ -88,7 +88,7 @@ private static IEnumerable EnumerateRgb6Bit () // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#6-bit_RGB const byte levels = 4; const byte factor = 85; - return RgbColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); + return RgbColorCube (GenerateCubeSequence (levels, factor)); } private static IEnumerable EnumerateRgb3Bit () @@ -96,9 +96,12 @@ private static IEnumerable EnumerateRgb3Bit () // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#3-bit_RGB const byte levels = 2; const byte factor = 255; - return RgbColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); + return RgbColorCube (GenerateCubeSequence (levels, factor)); } + private static IEnumerable GenerateCubeSequence (byte levels, byte factor) + => Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor)); + private static IEnumerable EnumerateOldWindows16Colors () { // https://en.wikipedia.org/wiki/List_of_software_palettes#Microsoft_Windows_and_IBM_OS/2_default_16-color_palette From d618420380e9512409a4068584a5271c55dab3ea Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sun, 14 Jan 2024 01:24:02 +0100 Subject: [PATCH 62/65] Made code even more compact --- Pinta.Effects/Utilities/PaletteHelper.cs | 46 ++++-------------------- 1 file changed, 7 insertions(+), 39 deletions(-) diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index 531b86ed4..0dfba8e6e 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -61,47 +61,12 @@ static Predefined () old_ms_paint = new (() => EnumerateOldMsPaintColors ().ToImmutableArray ()); old_windows_16 = new (() => EnumerateOldWindows16Colors ().ToImmutableArray ()); old_windows_20 = new (() => EnumerateOldWindows20Colors ().ToImmutableArray ()); - rgb_3_bit = new (() => EnumerateRgb3Bit ().ToImmutableArray ()); - rgb_666 = new (() => EnumerateRgb666 ().ToImmutableArray ()); - rgb_6_bit = new (() => EnumerateRgb6Bit ().ToImmutableArray ()); - rgb_12_bit = new (() => EnumerateRgb12Bit ().ToImmutableArray ()); + rgb_3_bit = new (() => RgbColorCube (levels: 2, factor: 255).ToImmutableArray ()); // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#3-bit_RGB + rgb_666 = new (() => RgbColorCube (levels: 6, factor: 51).ToImmutableArray ()); // https://en.wikipedia.org/wiki/List_of_software_palettes#6_level_RGB + rgb_6_bit = new (() => RgbColorCube (levels: 4, factor: 85).ToImmutableArray ()); // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#6-bit_RGB + rgb_12_bit = new (() => RgbColorCube (levels: 16, factor: 17).ToImmutableArray ()); // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#12-bit_RGB } - private static IEnumerable EnumerateRgb666 () - { - // https://en.wikipedia.org/wiki/List_of_software_palettes#6_level_RGB - const byte levels = 6; - const byte factor = 51; - return RgbColorCube (GenerateCubeSequence (levels, factor)); - } - - private static IEnumerable EnumerateRgb12Bit () - { - // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#12-bit_RGB - const byte levels = 16; - const byte factor = 17; - return RgbColorCube (GenerateCubeSequence (levels, factor)); - } - - private static IEnumerable EnumerateRgb6Bit () - { - // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#6-bit_RGB - const byte levels = 4; - const byte factor = 85; - return RgbColorCube (GenerateCubeSequence (levels, factor)); - } - - private static IEnumerable EnumerateRgb3Bit () - { - // https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#3-bit_RGB - const byte levels = 2; - const byte factor = 255; - return RgbColorCube (GenerateCubeSequence (levels, factor)); - } - - private static IEnumerable GenerateCubeSequence (byte levels, byte factor) - => Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor)); - private static IEnumerable EnumerateOldWindows16Colors () { // https://en.wikipedia.org/wiki/List_of_software_palettes#Microsoft_Windows_and_IBM_OS/2_default_16-color_palette @@ -185,5 +150,8 @@ private static IEnumerable RgbColorCube (ImmutableArray values) private static IEnumerable RgbColorCube (IEnumerable valueSequence) => RgbColorCube (valueSequence.ToImmutableArray ()); + + private static IEnumerable RgbColorCube (byte levels, byte factor) + => RgbColorCube (Enumerable.Range (0, levels).Select (i => Utility.ClampToByte (i * factor))); } } From 86a6123e9d95e1954bca89ff24bd558f178c284e Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sun, 14 Jan 2024 04:50:34 +0100 Subject: [PATCH 63/65] Implemented suggested changes --- Pinta.Effects/Classes/ErrorDiffusionMatrix.cs | 20 +++++++++++++++++++ Pinta.Effects/Effects/DitheringEffect.cs | 12 +++-------- Pinta.Effects/Utilities/PaletteHelper.cs | 2 +- tests/Pinta.Effects.Tests/EffectsTest.cs | 6 +++--- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/Pinta.Effects/Classes/ErrorDiffusionMatrix.cs b/Pinta.Effects/Classes/ErrorDiffusionMatrix.cs index f8fa65c7c..9e82e3fd9 100644 --- a/Pinta.Effects/Classes/ErrorDiffusionMatrix.cs +++ b/Pinta.Effects/Classes/ErrorDiffusionMatrix.cs @@ -2,22 +2,42 @@ using System.Collections.Generic; using System.ComponentModel; using System.Linq; +using Pinta.Gui.Widgets; namespace Pinta.Effects; public enum PredefinedDiffusionMatrices { Sierra, + + [Caption ("Two-Row Sierra")] TwoRowSierra, + + [Caption ("Sierra Lite")] SierraLite, + Burkes, + Atkinson, + Stucki, + + [Caption ("Jarvis-Judice-Ninke")] JarvisJudiceNinke, + + [Caption ("Floyd-Steinberg")] FloydSteinberg, + + [Caption ("Floyd-Steinberg Lite")] FakeFloydSteinberg, } +///

+/// Represents the matrix that is used by the dithering algorithm +/// in order to propagate the error (defined as the difference +/// between a pixel's color and the color in a certain palette that is +/// closest to it) forward. +/// internal sealed class ErrorDiffusionMatrix { public static ErrorDiffusionMatrix GetPredefined (PredefinedDiffusionMatrices choice) diff --git a/Pinta.Effects/Effects/DitheringEffect.cs b/Pinta.Effects/Effects/DitheringEffect.cs index 7ae98b487..72c6f1f63 100644 --- a/Pinta.Effects/Effects/DitheringEffect.cs +++ b/Pinta.Effects/Effects/DitheringEffect.cs @@ -34,7 +34,7 @@ private sealed record DitheringSettings ( private DitheringSettings CreateSettings (ImageSurface src) => new ( - diffusionMatrix: ErrorDiffusionMatrix.GetPredefined (Data.DiffusionMatrix), + diffusionMatrix: ErrorDiffusionMatrix.GetPredefined (Data.DitheringMethod), palette: PaletteHelper.GetPredefined (Data.PaletteChoice), sourceWidth: src.Width, sourceHeight: src.Height @@ -88,12 +88,6 @@ protected override void Render (ImageSurface src, ImageSurface dest, RectangleI if (thisItem.Y < roi.Top || thisItem.Y >= roi.Bottom) continue; - if (thisItem.X < 0 || thisItem.X >= settings.sourceWidth) - continue; - - if (thisItem.Y < 0 || thisItem.Y >= settings.sourceHeight) - continue; - int idx = (thisItem.Y * settings.sourceWidth) + thisItem.X; double factor = ((double) weight) / settings.diffusionMatrix.TotalWeight; @@ -140,8 +134,8 @@ private static double CalculateSquaredDistance (ColorBgra color1, ColorBgra colo public sealed class DitheringData : EffectData { - [Caption ("Diffusion Matrix")] - public PredefinedDiffusionMatrices DiffusionMatrix { get; set; } = PredefinedDiffusionMatrices.FloydSteinberg; + [Caption ("Dithering Method")] + public PredefinedDiffusionMatrices DitheringMethod { get; set; } = PredefinedDiffusionMatrices.FloydSteinberg; [Caption ("Palette")] public PredefinedPalettes PaletteChoice { get; set; } = PredefinedPalettes.OldWindows16; diff --git a/Pinta.Effects/Utilities/PaletteHelper.cs b/Pinta.Effects/Utilities/PaletteHelper.cs index 0dfba8e6e..84a133940 100644 --- a/Pinta.Effects/Utilities/PaletteHelper.cs +++ b/Pinta.Effects/Utilities/PaletteHelper.cs @@ -57,7 +57,7 @@ public static class Predefined static Predefined () { - BlackWhite = ImmutableArray.CreateRange (new[] { ColorBgra.FromBgr (0, 0, 0), ColorBgra.FromBgr (255, 255, 255) }); + BlackWhite = ImmutableArray.CreateRange (new[] { ColorBgra.Black, ColorBgra.White }); old_ms_paint = new (() => EnumerateOldMsPaintColors ().ToImmutableArray ()); old_windows_16 = new (() => EnumerateOldWindows16Colors ().ToImmutableArray ()); old_windows_20 = new (() => EnumerateOldWindows20Colors ().ToImmutableArray ()); diff --git a/tests/Pinta.Effects.Tests/EffectsTest.cs b/tests/Pinta.Effects.Tests/EffectsTest.cs index 43227da1d..c8537e084 100644 --- a/tests/Pinta.Effects.Tests/EffectsTest.cs +++ b/tests/Pinta.Effects.Tests/EffectsTest.cs @@ -59,7 +59,7 @@ public void Dithering1 () { var effect = new DitheringEffect (); effect.Data.PaletteChoice = PredefinedPalettes.OldWindows16; - effect.Data.DiffusionMatrix = PredefinedDiffusionMatrices.FloydSteinberg; + effect.Data.DitheringMethod = PredefinedDiffusionMatrices.FloydSteinberg; Utilities.TestEffect (effect, "dithering1.png"); } @@ -68,7 +68,7 @@ public void Dithering2 () { var effect = new DitheringEffect (); effect.Data.PaletteChoice = PredefinedPalettes.BlackWhite; - effect.Data.DiffusionMatrix = PredefinedDiffusionMatrices.FloydSteinberg; + effect.Data.DitheringMethod = PredefinedDiffusionMatrices.FloydSteinberg; Utilities.TestEffect (effect, "dithering2.png"); } @@ -77,7 +77,7 @@ public void Dithering3 () { var effect = new DitheringEffect (); effect.Data.PaletteChoice = PredefinedPalettes.OldWindows16; - effect.Data.DiffusionMatrix = PredefinedDiffusionMatrices.Stucki; + effect.Data.DitheringMethod = PredefinedDiffusionMatrices.Stucki; Utilities.TestEffect (effect, "dithering3.png"); } From b15875a1b4561bd837cfa2f5c525f7ae93085ec6 Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sun, 14 Jan 2024 04:51:56 +0100 Subject: [PATCH 64/65] Changed label --- Pinta.Effects/Effects/DitheringEffect.cs | 6 +++--- tests/Pinta.Effects.Tests/EffectsTest.cs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Pinta.Effects/Effects/DitheringEffect.cs b/Pinta.Effects/Effects/DitheringEffect.cs index 72c6f1f63..a4ca0626e 100644 --- a/Pinta.Effects/Effects/DitheringEffect.cs +++ b/Pinta.Effects/Effects/DitheringEffect.cs @@ -34,7 +34,7 @@ private sealed record DitheringSettings ( private DitheringSettings CreateSettings (ImageSurface src) => new ( - diffusionMatrix: ErrorDiffusionMatrix.GetPredefined (Data.DitheringMethod), + diffusionMatrix: ErrorDiffusionMatrix.GetPredefined (Data.ErrorDiffusionMethod), palette: PaletteHelper.GetPredefined (Data.PaletteChoice), sourceWidth: src.Width, sourceHeight: src.Height @@ -134,8 +134,8 @@ private static double CalculateSquaredDistance (ColorBgra color1, ColorBgra colo public sealed class DitheringData : EffectData { - [Caption ("Dithering Method")] - public PredefinedDiffusionMatrices DitheringMethod { get; set; } = PredefinedDiffusionMatrices.FloydSteinberg; + [Caption ("Error Diffusion Method")] + public PredefinedDiffusionMatrices ErrorDiffusionMethod { get; set; } = PredefinedDiffusionMatrices.FloydSteinberg; [Caption ("Palette")] public PredefinedPalettes PaletteChoice { get; set; } = PredefinedPalettes.OldWindows16; diff --git a/tests/Pinta.Effects.Tests/EffectsTest.cs b/tests/Pinta.Effects.Tests/EffectsTest.cs index c8537e084..09c056fc7 100644 --- a/tests/Pinta.Effects.Tests/EffectsTest.cs +++ b/tests/Pinta.Effects.Tests/EffectsTest.cs @@ -59,7 +59,7 @@ public void Dithering1 () { var effect = new DitheringEffect (); effect.Data.PaletteChoice = PredefinedPalettes.OldWindows16; - effect.Data.DitheringMethod = PredefinedDiffusionMatrices.FloydSteinberg; + effect.Data.ErrorDiffusionMethod = PredefinedDiffusionMatrices.FloydSteinberg; Utilities.TestEffect (effect, "dithering1.png"); } @@ -68,7 +68,7 @@ public void Dithering2 () { var effect = new DitheringEffect (); effect.Data.PaletteChoice = PredefinedPalettes.BlackWhite; - effect.Data.DitheringMethod = PredefinedDiffusionMatrices.FloydSteinberg; + effect.Data.ErrorDiffusionMethod = PredefinedDiffusionMatrices.FloydSteinberg; Utilities.TestEffect (effect, "dithering2.png"); } @@ -77,7 +77,7 @@ public void Dithering3 () { var effect = new DitheringEffect (); effect.Data.PaletteChoice = PredefinedPalettes.OldWindows16; - effect.Data.DitheringMethod = PredefinedDiffusionMatrices.Stucki; + effect.Data.ErrorDiffusionMethod = PredefinedDiffusionMatrices.Stucki; Utilities.TestEffect (effect, "dithering3.png"); } From 1372f7bdd989291377bebebda848d51820b941ad Mon Sep 17 00:00:00 2001 From: Lehonti Ramos <17771375+Lehonti@users.noreply.github.com> Date: Sun, 14 Jan 2024 12:46:52 +0100 Subject: [PATCH 65/65] Added comments for translators --- Pinta.Effects/Classes/ErrorDiffusionMatrix.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Pinta.Effects/Classes/ErrorDiffusionMatrix.cs b/Pinta.Effects/Classes/ErrorDiffusionMatrix.cs index 9e82e3fd9..9d8e1f84b 100644 --- a/Pinta.Effects/Classes/ErrorDiffusionMatrix.cs +++ b/Pinta.Effects/Classes/ErrorDiffusionMatrix.cs @@ -8,28 +8,41 @@ namespace Pinta.Effects; public enum PredefinedDiffusionMatrices { + // Translators: Image dithering matrix named after Frankie Sierra + [Caption ("Sierra")] Sierra, + // Translators: Image dithering matrix named after Frankie Sierra [Caption ("Two-Row Sierra")] TwoRowSierra, + // Translators: Image dithering matrix named after Frankie Sierra [Caption ("Sierra Lite")] SierraLite, + // Translators: Image dithering matrix named after Daniel Burkes + [Caption ("Burkes")] Burkes, + // Translators: Image dithering matrix named after Bill Atkinson + [Caption ("Atkinson")] Atkinson, + // Translators: Image dithering matrix named after Peter Stucki + [Caption ("Stucki")] Stucki, + // Translators: Image dithering matrix named after J. F. Jarvis, C. N. Judice, and W. H. Ninke [Caption ("Jarvis-Judice-Ninke")] JarvisJudiceNinke, + // Translators: Image dithering matrix named after Robert W. Floyd and Louis Steinberg [Caption ("Floyd-Steinberg")] FloydSteinberg, + // Translators: Image dithering matrix named after Robert W. Floyd and Louis Steinberg. Some software may use it and call it Floyd-Steinberg, but it's not the actual Floyd-Steinberg matrix [Caption ("Floyd-Steinberg Lite")] - FakeFloydSteinberg, + FalseFloydSteinberg, } /// @@ -51,7 +64,7 @@ public static ErrorDiffusionMatrix GetPredefined (PredefinedDiffusionMatrices ch PredefinedDiffusionMatrices.Stucki => Predefined.Stucki, PredefinedDiffusionMatrices.JarvisJudiceNinke => Predefined.JarvisJudiceNinke, PredefinedDiffusionMatrices.FloydSteinberg => Predefined.FloydSteinberg, - PredefinedDiffusionMatrices.FakeFloydSteinberg => Predefined.FakeFloydSteinberg, + PredefinedDiffusionMatrices.FalseFloydSteinberg => Predefined.FakeFloydSteinberg, _ => throw new InvalidEnumArgumentException (nameof (choice), (int) choice, typeof (PredefinedDiffusionMatrices)), }; }