diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2022-10-27 09:47:13 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2022-10-27 09:47:13 +0300 |
commit | 7393388358b1b2ce6b614f99e146569e94853c76 (patch) | |
tree | 67160243113843787f12beb35c5026be70d0bbb1 | |
parent | f128219bda69abacb9f6ee0bc457611f8081c5a2 (diff) |
Moved FindSimilarColor to separate class.
-rw-r--r-- | NesTiler/ColorsFinder.cs | 60 | ||||
-rw-r--r-- | NesTiler/Program.cs | 61 |
2 files changed, 69 insertions, 52 deletions
diff --git a/NesTiler/ColorsFinder.cs b/NesTiler/ColorsFinder.cs new file mode 100644 index 0000000..2772f69 --- /dev/null +++ b/NesTiler/ColorsFinder.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace com.clusterrr.Famicom.NesTiler +{ + class ColorsFinder + { + private readonly Dictionary<byte, Color> colors; + private readonly Dictionary<Color, byte> cache = new(); + + public ColorsFinder(Dictionary<byte, Color> colors) + { + this.colors = colors; + } + + public byte FindSimilarColor(Color color) + { + if (cache.ContainsKey(color)) + return cache[color]; + byte result = byte.MaxValue; + double minDelta = double.MaxValue; + Color c = Color.Transparent; + foreach (var index in colors.Keys) + { + var delta = color.GetDelta(colors[index]); + if (delta < minDelta) + { + minDelta = delta; + result = index; + c = colors[index]; + } + } + if (result == byte.MaxValue) + throw new KeyNotFoundException($"Invalid color: {color}."); + if (cache != null) + cache[color] = result; + return result; + } + + public Color FindSimilarColor(IEnumerable<Color> colors, Color color) + { + Color result = Color.Black; + double minDelta = double.MaxValue; + foreach (var c in colors) + { + var delta = color.GetDelta(c); + if (delta < minDelta) + { + minDelta = delta; + result = c; + } + } + return result; + } + } +} diff --git a/NesTiler/Program.cs b/NesTiler/Program.cs index e34b548..c0cd90d 100644 --- a/NesTiler/Program.cs +++ b/NesTiler/Program.cs @@ -77,11 +77,11 @@ namespace com.clusterrr.Famicom.NesTiler var nameTables = new Dictionary<int, List<int>>();
int tileID = 0;
- // Misc
- var nesColorsCache = new Dictionary<Color, byte>();
-
// Loading and parsing palette JSON
var nesColors = LoadColors(c.ColorsFile);
+ var colorsFinder = new ColorsFinder(nesColors);
+
+ // CSV output
var outTilesCsvLines = !string.IsNullOrEmpty(c.OutTilesCsv) ? new List<string>() : null;
var outPalettesCsvLines = !string.IsNullOrEmpty(c.OutPalettesCsv) ? new List<string>() : null;
@@ -100,7 +100,7 @@ namespace com.clusterrr.Famicom.NesTiler if (c.FixedPalettes[i] == null) continue;
var colorsInPalette = c.FixedPalettes[i]!.ToArray();
for (int j = 0; j < colorsInPalette.Length; j++)
- colorsInPalette[j] = nesColors[FindSimilarColor(nesColors, colorsInPalette[j], nesColorsCache)];
+ colorsInPalette[j] = nesColors[colorsFinder.FindSimilarColor(colorsInPalette[j])];
c.FixedPalettes[i] = new Palette(colorsInPalette);
}
@@ -143,7 +143,7 @@ namespace com.clusterrr.Famicom.NesTiler var color = image.GetPixelColor(x, y);
if (color.A >= 0x80 || c.Mode == Config.TilesMode.Backgrounds)
{
- var similarColor = nesColors[FindSimilarColor(nesColors, color, nesColorsCache)];
+ var similarColor = nesColors[colorsFinder.FindSimilarColor(color)];
image.SetPixelColor(x, y, similarColor);
}
else
@@ -163,7 +163,7 @@ namespace com.clusterrr.Famicom.NesTiler if (c.BgColor.HasValue)
{
// Manually
- bgColor = nesColors[FindSimilarColor(nesColors, c.BgColor.Value, nesColorsCache)];
+ bgColor = nesColors[colorsFinder.FindSimilarColor(c.BgColor.Value)];
calculatedPalettes = CalculatePalettes(images,
c.PaletteEnabled,
c.FixedPalettes,
@@ -264,7 +264,7 @@ namespace com.clusterrr.Famicom.NesTiler }
// Calculate palette as color indices and save them to files
- var bgColorIndex = FindSimilarColor(nesColors, bgColor, nesColorsCache);
+ var bgColorIndex = colorsFinder.FindSimilarColor(bgColor);
for (int p = 0; p < palettes.Length; p++)
{
if (c.PaletteEnabled[p] && c.OutPalette.ContainsKey(p))
@@ -276,7 +276,7 @@ namespace com.clusterrr.Famicom.NesTiler if (palettes[p] == null)
paletteRaw[colorIndex] = 0;
else if (palettes[p]![colorIndex].HasValue)
- paletteRaw[colorIndex] = FindSimilarColor(nesColors, palettes[p]![colorIndex]!.Value, nesColorsCache);
+ paletteRaw[colorIndex] = colorsFinder.FindSimilarColor(palettes[p]![colorIndex]!.Value);
}
File.WriteAllBytes(c.OutPalette[p], paletteRaw);
Trace.WriteLine($"Palette #{p} saved to {c.OutPalette[p]}");
@@ -324,7 +324,7 @@ namespace com.clusterrr.Famicom.NesTiler var cy = (tilePalY * c.TilePalHeight) + y - attributeTableOffset;
if (cy < 0) continue;
var color = image.GetPixelColor((tilePalX * c.TilePalWidth) + x, cy);
- var similarColor = FindSimilarColor(Enumerable.Concat(
+ var similarColor = colorsFinder.FindSimilarColor(Enumerable.Concat(
bestPalette,
new Color[] { bgColor }
), color);
@@ -750,48 +750,5 @@ namespace com.clusterrr.Famicom.NesTiler return result;
}
-
- static byte FindSimilarColor(Dictionary<byte, Color> colors, Color color, Dictionary<Color, byte>? cache = null)
- {
- if (cache != null)
- {
- if (cache.ContainsKey(color))
- return cache[color];
- }
- byte result = byte.MaxValue;
- double minDelta = double.MaxValue;
- Color c = Color.Transparent;
- foreach (var index in colors.Keys)
- {
- var delta = color.GetDelta(colors[index]);
- if (delta < minDelta)
- {
- minDelta = delta;
- result = index;
- c = colors[index];
- }
- }
- if (result == byte.MaxValue)
- throw new KeyNotFoundException($"Invalid color: {color}.");
- if (cache != null)
- cache[color] = result;
- return result;
- }
-
- static Color FindSimilarColor(IEnumerable<Color> colors, Color color)
- {
- Color result = Color.Black;
- double minDelta = double.MaxValue;
- foreach (var c in colors)
- {
- var delta = color.GetDelta(c);
- if (delta < minDelta)
- {
- minDelta = delta;
- result = c;
- }
- }
- return result;
- }
}
}
|