use crate::Crs;
use super::{BandDescriptor, GeoTransform};
#[derive(Debug, Clone)]
pub struct RasterProfile {
pub width: u32,
pub height: u32,
pub bands: Vec<BandDescriptor>,
pub geo_transform: GeoTransform,
pub crs: Crs,
pub tile_size: [u32; 2],
pub pyramid_levels: u8,
}
impl RasterProfile {
pub fn tile_grid_dimensions(&self) -> [u32; 2] {
let tw = self.tile_size[0].max(1);
let th = self.tile_size[1].max(1);
[
self.width.saturating_add(tw - 1) / tw,
self.height.saturating_add(th - 1) / th,
]
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::raster::PixelType;
fn rgb_profile(w: u32, h: u32) -> RasterProfile {
RasterProfile {
width: w,
height: h,
bands: vec![
BandDescriptor::new(Some("red".into()), PixelType::U8),
BandDescriptor::new(Some("green".into()), PixelType::U8),
BandDescriptor::new(Some("blue".into()), PixelType::U8),
],
geo_transform: GeoTransform::north_up(0.0, 0.0, 1.0, 1.0),
crs: Crs::Epsg(3857),
tile_size: [256, 256],
pyramid_levels: 1,
}
}
#[test]
fn tile_grid_for_aligned_image() {
let p = rgb_profile(1024, 1024);
assert_eq!(p.tile_grid_dimensions(), [4, 4]);
}
#[test]
fn tile_grid_for_unaligned_image() {
let p = rgb_profile(1000, 1000);
assert_eq!(p.tile_grid_dimensions(), [4, 4]);
}
#[test]
fn tile_grid_for_tiny_image() {
let p = rgb_profile(50, 50);
assert_eq!(p.tile_grid_dimensions(), [1, 1]);
}
}