diff -r fac275de34e5 -r 76a52e8149e3 rust/mapgen/src/theme.rs --- a/rust/mapgen/src/theme.rs Thu Nov 08 11:34:01 2018 -0500 +++ b/rust/mapgen/src/theme.rs Thu Nov 08 22:22:47 2018 +0300 @@ -23,18 +23,18 @@ impl ThemeSprite { #[inline] + pub fn size(&self) -> Size { + self.pixels.size() + } + + #[inline] pub fn width(&self) -> usize { - self.pixels.size().width + self.size().width } #[inline] pub fn height(&self) -> usize { - self.pixels.size().height - } - - #[inline] - pub fn bounds(&self) -> Size { - self.pixels.size() + self.size().height } #[inline] @@ -51,6 +51,65 @@ pub fn get_pixel(&self, x: usize, y: usize) -> u32 { self.pixels[y][x] } + + pub fn to_transposed(&self) -> ThemeSprite { + let size = self.size().transpose(); + let mut pixels = Vec2D::new(size, 0u32); + for (y, row) in self.pixels.rows().enumerate() { + for (x, v) in row.iter().enumerate() { + pixels[x][y] = *v; + } + } + ThemeSprite { pixels } + } + + pub fn to_tiled(&self) -> TiledSprite { + let size = self.size(); + assert!(size.is_power_of_two()); + let tile_width_shift = size.width.trailing_zeros() as usize + 2; + let mut pixels = vec![0u32; size.area()]; + + for (y, row) in self.pixels.rows().enumerate() { + for (x, v) in row.iter().enumerate() { + pixels[get_tiled_index(x, y, tile_width_shift)] = *v; + } + } + + TiledSprite { tile_width_shift, size, pixels } + } +} + +#[inline] +fn get_tiled_index(x: usize, y: usize, tile_width_shift: usize) -> usize { + (((y >> 2) << tile_width_shift) + ((x >> 2) << 4)) + ((y & 0b11) << 2) + (x & 0b11) +} + +pub struct TiledSprite { + tile_width_shift: usize, + size: Size, + pixels: Vec +} + +impl TiledSprite { + #[inline] + pub fn size(&self) -> Size { + self.size + } + + #[inline] + pub fn width(&self) -> usize { + self.size().width + } + + #[inline] + pub fn height(&self) -> usize { + self.size().height + } + + #[inline] + pub fn get_pixel(&self, x: usize, y: usize) -> u32 { + self.pixels[get_tiled_index(x, y, self.tile_width_shift)] + } } pub struct Theme {