geometry: cut down on <> noise with associated types
This commit is contained in:
@ -7,20 +7,22 @@ use std::fmt::{Formatter, Debug};
|
||||
use ansi_term::Color;
|
||||
use rgb::Rgb;
|
||||
|
||||
pub trait CoordinateView<CoordData: CoordLimits<Data = CoordData>, Space: CoordinateSpace>: Debug {
|
||||
fn next(&mut self) -> Option<(Coordinates<u8, Virtual>, Coordinates<CoordData, Space>)>;
|
||||
pub trait CoordinateView: Debug {
|
||||
type Space: CoordinateSpace;
|
||||
fn next(&mut self) -> Option<(Coordinates<Virtual>, Coordinates<Self::Space>)>;
|
||||
}
|
||||
|
||||
pub trait PixelMapping<CoordData: CoordLimits<Data = CoordData>, Space: CoordinateSpace> {
|
||||
fn select(&self, rect: &Rectangle<u8, Virtual>) -> impl CoordinateView<CoordData, Space>;
|
||||
fn to_idx(&self, coords: &Coordinates<CoordData, Space>) -> usize;
|
||||
pub trait PixelMapping {
|
||||
type Space: CoordinateSpace;
|
||||
fn select(&self, rect: &Rectangle<Virtual>) -> impl CoordinateView<Space = Self::Space>;
|
||||
fn to_idx(&self, coords: &Coordinates<Self::Space>) -> usize;
|
||||
}
|
||||
|
||||
pub trait DisplayDump<T: PixelMapping<CoordData, Space>, CoordData: CoordLimits<Data = CoordData>, Space: CoordinateSpace> {
|
||||
pub trait DisplayDump<T: PixelMapping> {
|
||||
fn dump(&self, map: &T);
|
||||
}
|
||||
|
||||
impl<const PIXEL_NUM: usize> DisplayDump<LinearPixelMapping, usize, LinearSpace> for [Rgb<u8>; PIXEL_NUM] {
|
||||
impl<const PIXEL_NUM: usize> DisplayDump<LinearPixelMapping> for [Rgb<u8>; PIXEL_NUM] {
|
||||
fn dump(&self, _map: &LinearPixelMapping) {
|
||||
for ref pixel in self {
|
||||
print!("{}", Color::RGB(pixel.r, pixel.g, pixel.b).paint("█"));
|
||||
@ -29,7 +31,7 @@ impl<const PIXEL_NUM: usize> DisplayDump<LinearPixelMapping, usize, LinearSpace>
|
||||
}
|
||||
}
|
||||
|
||||
impl<const PIXEL_NUM: usize> DisplayDump<StrideMapping, u8, StrideSpace> for [Rgb<u8>; PIXEL_NUM] {
|
||||
impl<const PIXEL_NUM: usize> DisplayDump<StrideMapping> for [Rgb<u8>; PIXEL_NUM] {
|
||||
fn dump(&self, map: &StrideMapping) {
|
||||
for y in 0..map.stride_count {
|
||||
let stride = &map.strides[y];
|
||||
@ -55,15 +57,19 @@ impl<const PIXEL_NUM: usize> DisplayDump<StrideMapping, u8, StrideSpace> for [Rg
|
||||
|
||||
#[derive(Debug)]
|
||||
struct LinearCoordView {
|
||||
rect: Rectangle<u8, Virtual>,
|
||||
rect: Rectangle<Virtual>,
|
||||
idx: usize,
|
||||
}
|
||||
|
||||
pub struct LinearSpace {}
|
||||
impl CoordinateSpace for LinearSpace {}
|
||||
pub type LinearCoords = Coordinates<usize, LinearSpace>;
|
||||
impl CoordinateSpace for LinearSpace {
|
||||
type Data = usize;
|
||||
}
|
||||
|
||||
impl CoordinateView<usize, LinearSpace> for LinearCoordView {
|
||||
pub type LinearCoords = Coordinates<LinearSpace>;
|
||||
|
||||
impl CoordinateView for LinearCoordView {
|
||||
type Space = LinearSpace;
|
||||
fn next(&mut self) -> Option<(VirtualCoordinates, LinearCoords)> {
|
||||
if self.idx as u8 == self.rect.bottom_right.x {
|
||||
None
|
||||
@ -88,15 +94,16 @@ impl LinearPixelMapping {
|
||||
}
|
||||
}
|
||||
|
||||
impl PixelMapping<usize, LinearSpace> for LinearPixelMapping {
|
||||
fn select(&self, rect: &Rectangle<u8, Virtual>) -> impl CoordinateView<usize, LinearSpace> {
|
||||
impl PixelMapping for LinearPixelMapping {
|
||||
type Space = LinearSpace;
|
||||
fn select(&self, rect: &Rectangle<Virtual>) -> impl CoordinateView<Space = Self::Space> {
|
||||
LinearCoordView {
|
||||
rect: rect.clone(),
|
||||
idx: 0,
|
||||
}
|
||||
}
|
||||
|
||||
fn to_idx(&self, coords: &Coordinates<usize, LinearSpace>) -> usize {
|
||||
fn to_idx(&self, coords: &Coordinates<LinearSpace>) -> usize {
|
||||
coords.x
|
||||
}
|
||||
}
|
||||
@ -125,7 +132,7 @@ pub struct StrideMapping<const STRIDE_NUM: usize = 24> {
|
||||
pub strides: [Stride; STRIDE_NUM],
|
||||
pub stride_count: usize,
|
||||
pub pixel_count: usize,
|
||||
pub size: Rectangle<usize, StrideSpace>
|
||||
pub size: Rectangle<StrideSpace>
|
||||
}
|
||||
|
||||
impl<const STRIDE_NUM: usize> StrideMapping<STRIDE_NUM> {
|
||||
@ -183,7 +190,7 @@ impl<const STRIDE_NUM: usize> StrideMapping<STRIDE_NUM> {
|
||||
let mut strides = [Stride::default(); STRIDE_NUM];
|
||||
let stride_count = stride_json.len();
|
||||
let mut physical_idx = 0;
|
||||
let mut size: Option<Rectangle<usize, StrideSpace>> = None;//Rectangle::new(Coordinates::new(usize::MAX, usize::MAX), Coordinates::new(0, 0));
|
||||
let mut size: Option<Rectangle<StrideSpace>> = None;//Rectangle::new(Coordinates::new(usize::MAX, usize::MAX), Coordinates::new(0, 0));
|
||||
for stride_idx in 0..stride_count {
|
||||
let json_data = stride_json[stride_idx];
|
||||
let x = json_data.0;
|
||||
@ -230,24 +237,27 @@ impl<const STRIDE_NUM: usize> StrideMapping<STRIDE_NUM> {
|
||||
}
|
||||
}
|
||||
|
||||
impl PixelMapping<u8, StrideSpace> for StrideMapping {
|
||||
fn select(&self, rect: &Rectangle<u8, Virtual>) -> impl CoordinateView<u8, StrideSpace> {
|
||||
impl PixelMapping for StrideMapping {
|
||||
type Space = StrideSpace;
|
||||
fn select(&self, rect: &Rectangle<Virtual>) -> impl CoordinateView<Space = StrideSpace> {
|
||||
StrideView::new(self, rect)
|
||||
}
|
||||
|
||||
fn to_idx(&self, coords: &Coordinates<u8, StrideSpace>) -> usize {
|
||||
fn to_idx(&self, coords: &Coordinates<StrideSpace>) -> usize {
|
||||
self.strides[coords.x as usize].pixel_idx_for_offset(coords.y)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct StrideSpace {}
|
||||
impl CoordinateSpace for StrideSpace {}
|
||||
pub type StrideCoords = Coordinates<u8, StrideSpace>;
|
||||
impl CoordinateSpace for StrideSpace {
|
||||
type Data = u8;
|
||||
}
|
||||
pub type StrideCoords = Coordinates<StrideSpace>;
|
||||
|
||||
struct StrideView<'a> {
|
||||
map: &'a StrideMapping,
|
||||
range: Rectangle<u8, StrideSpace>,
|
||||
range: Rectangle<StrideSpace>,
|
||||
cur: StrideCoords,
|
||||
step_size: VirtualCoordinates
|
||||
}
|
||||
@ -262,9 +272,9 @@ impl<'a> Debug for StrideView<'a> {
|
||||
}
|
||||
|
||||
impl<'a> StrideView<'a> {
|
||||
fn new(map: &'a StrideMapping, rect: &Rectangle<u8, Virtual>) -> Self {
|
||||
fn new(map: &'a StrideMapping, rect: &Rectangle<Virtual>) -> Self {
|
||||
// Zero-index shape of the pixel picking area
|
||||
let range: Rectangle<u8, StrideSpace> = Rectangle::new(
|
||||
let range: Rectangle<StrideSpace> = Rectangle::new(
|
||||
Coordinates::new(
|
||||
scale8(map.size.width() as u8, rect.top_left.x) + map.size.left() as u8,
|
||||
scale8(map.size.height() as u8, rect.top_left.y) + map.size.top() as u8
|
||||
@ -300,7 +310,8 @@ impl<'a> StrideView<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> CoordinateView<u8, StrideSpace> for StrideView<'a> {
|
||||
impl<'a> CoordinateView for StrideView<'a> {
|
||||
type Space = StrideSpace;
|
||||
fn next(&mut self) -> Option<(VirtualCoordinates, StrideCoords)> {
|
||||
// Keep scanning until we reach the far right of the range
|
||||
while self.cur.x <= self.range.bottom_right.x {
|
||||
|
Reference in New Issue
Block a user