From 000e55099a69171527daa3f8e974e371df87bfe1 Mon Sep 17 00:00:00 2001
From: Louis <contact@louiscap.co>
Date: Wed, 18 Dec 2024 20:48:34 +0000
Subject: [PATCH] Fix incorrect target colour generation for column palette

---
 .gitignore              |  3 ++-
 src/cli_args.rs         | 13 ++++++++-----
 src/commands/mod.rs     |  2 +-
 src/commands/palette.rs | 24 ++++++++++++++++++------
 src/format.rs           |  2 ++
 5 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/.gitignore b/.gitignore
index 6734315..fa2ce9d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 /target
 .idea/
-exmp/
\ No newline at end of file
+exmp/
+/*.png
\ No newline at end of file
diff --git a/src/cli_args.rs b/src/cli_args.rs
index 8e8090d..af4ea5d 100644
--- a/src/cli_args.rs
+++ b/src/cli_args.rs
@@ -2,7 +2,10 @@ use clap::Parser;
 use image::ImageFormat;
 use serde::{Deserialize, Serialize};
 
-use crate::commands::{Atlas, Extract, Extrude, Flip, Info, Palette, Pipeline, Reduce, Remap, Rotate, Scale, Split, Swap};
+use crate::commands::{
+	Atlas, Extract, Extrude, Flip, Info, Palette, Pipeline, Reduce, Remap, Rotate, Scale, Split,
+	Swap,
+};
 
 use crate::load_image;
 
@@ -51,8 +54,8 @@ pub enum Args {
 	#[clap(name = "info")]
 	#[serde(alias = "info")]
 	Info(Info),
-	#[clap(name = "info")]
-	#[serde(alias = "info")]
+	#[clap(name = "swap")]
+	#[serde(alias = "swap")]
 	Swap(Swap),
 }
 
@@ -109,11 +112,11 @@ impl Args {
 				let image_data = load_image(&swap.input, None)?;
 				let palette_data = load_image(&swap.palette, None)?;
 				let palette_swap = Palette::from_columns(&palette_data)?;
-				let output = Remap::remap_image(image_data, palette_swap)?;
+				let output = Swap::swap_pixels(image_data, palette_swap)?;
 				output
 					.save_with_format(&swap.output, ImageFormat::Png)
 					.map_err(anyhow::Error::from)
-			},
+			}
 			Args::Reduce(reduce) => {
 				if let Some(amount) = reduce.colours {
 					log::info!("Num cols {}", amount);
diff --git a/src/commands/mod.rs b/src/commands/mod.rs
index 7a2d578..0a1ea3c 100644
--- a/src/commands/mod.rs
+++ b/src/commands/mod.rs
@@ -24,4 +24,4 @@ pub use remap::Remap;
 pub use rotate::Rotate;
 pub use scale::Scale;
 pub use split::Split;
-pub use swap::Swap;
\ No newline at end of file
+pub use swap::Swap;
diff --git a/src/commands/palette.rs b/src/commands/palette.rs
index 2778712..f74461c 100644
--- a/src/commands/palette.rs
+++ b/src/commands/palette.rs
@@ -3,12 +3,12 @@ use std::cmp::{min, Ordering};
 use std::collections::hash_map::RandomState;
 use std::collections::{HashMap, HashSet};
 
-use std::io::Write;
 use anyhow::Error;
 use deltae::{Delta, LabValue, DE2000};
 use image::{GenericImage, Pixel, Rgba};
 use num_traits::ToPrimitive;
 use serde::{Deserialize, Serialize};
+use std::io::Write;
 
 use crate::format::PaletteFormat;
 use crate::utils::{new_image, BasicRgba};
@@ -37,7 +37,7 @@ pub fn sort_by_hue(palette: &mut PixelPalette) {
 
 /// Create a palette file containing every distinct colour from the input image
 #[derive(Parser, Clone, Serialize, Deserialize, Debug)]
-#[clap(author, version = "0.3.0")]
+#[clap(author, version = "0.9.0")]
 pub struct Palette {
 	/// The path to the image file
 	#[serde(default)]
@@ -98,6 +98,18 @@ impl Palette {
 
 				out_image.save(self.output.as_str())?;
 			}
+			PaletteFormat::Columns => {
+				let image_width = 2;
+				let image_height = colours.len();
+				let mut out_image = new_image(image_width as u32, image_height as u32);
+
+				for (idx, colour) in colours.iter().enumerate() {
+					out_image.put_pixel(0, idx as u32, Rgba::from(colour));
+					out_image.put_pixel(1, idx as u32, Rgba::from(colour));
+				}
+
+				out_image.save(self.output.as_str())?;
+			}
 			PaletteFormat::Txt => {
 				let mut file = std::fs::File::create(self.output.as_str())?;
 				for colour in colours.iter() {
@@ -129,10 +141,10 @@ impl Palette {
 			]);
 			let left_pixel = BasicRgba::from(data);
 			let data = Rgba::from([
-				left.0[0].to_u8().unwrap(),
-				left.0[1].to_u8().unwrap(),
-				left.0[2].to_u8().unwrap(),
-				left.0[3].to_u8().unwrap(),
+				right.0[0].to_u8().unwrap(),
+				right.0[1].to_u8().unwrap(),
+				right.0[2].to_u8().unwrap(),
+				right.0[3].to_u8().unwrap(),
 			]);
 			let right_pixel = BasicRgba::from(data);
 			mapping.insert(left_pixel, right_pixel);
diff --git a/src/format.rs b/src/format.rs
index eb70c53..9d35924 100644
--- a/src/format.rs
+++ b/src/format.rs
@@ -15,6 +15,8 @@ pub enum PaletteFormat {
 	#[default]
 	#[serde(alias = "png")]
 	Png,
+	#[serde(alias = "columns")]
+	Columns,
 }
 
 #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Debug)]
-- 
GitLab