summaryrefslogtreecommitdiffstats
path: root/src/color/source.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/color/source.rs')
-rw-r--r--src/color/source.rs71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/color/source.rs b/src/color/source.rs
new file mode 100644
index 0000000..5cc9631
--- /dev/null
+++ b/src/color/source.rs
@@ -0,0 +1,71 @@
+//! Sources of colors.
+
+use super::Rgb8;
+
+use image::RgbImage;
+
+/// A source of colors in multidimensional space.
+pub trait ColorSource {
+ /// Get the size of each dimension in this space.
+ fn dimensions(&self) -> &[usize];
+
+ /// Get the color at some particular coordinates.
+ fn get_color(&self, coords: &[usize]) -> Rgb8;
+}
+
+/// The entire RGB space.
+#[derive(Debug)]
+pub struct AllColors {
+ dims: [usize; 3],
+ shifts: [u32; 3],
+}
+
+impl AllColors {
+ /// Create an AllColors source with the given bit depths.
+ pub fn new(r: u32, g: u32, b: u32) -> Self {
+ Self {
+ dims: [1 << r, 1 << g, 1 << b],
+ shifts: [8 - r, 8 - g, 8 - b],
+ }
+ }
+}
+
+impl ColorSource for AllColors {
+ fn dimensions(&self) -> &[usize] {
+ &self.dims
+ }
+
+ fn get_color(&self, coords: &[usize]) -> Rgb8 {
+ Rgb8::from([
+ (coords[0] << self.shifts[0]) as u8,
+ (coords[1] << self.shifts[1]) as u8,
+ (coords[2] << self.shifts[2]) as u8,
+ ])
+ }
+}
+
+/// Colors extracted from an image.
+#[derive(Debug)]
+pub struct ImageColors {
+ dims: [usize; 2],
+ image: RgbImage,
+}
+
+impl From<RgbImage> for ImageColors {
+ fn from(image: RgbImage) -> Self {
+ Self {
+ dims: [image.width() as usize, image.height() as usize],
+ image,
+ }
+ }
+}
+
+impl ColorSource for ImageColors {
+ fn dimensions(&self) -> &[usize] {
+ &self.dims
+ }
+
+ fn get_color(&self, coords: &[usize]) -> Rgb8 {
+ *self.image.get_pixel(coords[0] as u32, coords[1] as u32)
+ }
+}