From fef1bcbcadd7bde4a715e36893e85253ee6472f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lauren=C8=9Biu=20Nicola?= Date: Fri, 2 Jun 2023 11:17:53 +0300 Subject: [PATCH 1/2] Tweak RasterBand::actual_block_size API --- CHANGES.md | 4 ++++ src/raster/rasterband.rs | 8 +++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index c32317039..6cc059a92 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,10 @@ # Changes ## Unreleased +- **Breaking**: `RasterBand::actual_block_size` now takes two `usize` offsets instead of `(isize, isize)` + + - + - Added `GDT_Int8` support - diff --git a/src/raster/rasterband.rs b/src/raster/rasterband.rs index 3690e4aa4..075d3ebe6 100644 --- a/src/raster/rasterband.rs +++ b/src/raster/rasterband.rs @@ -581,14 +581,16 @@ impl<'a> RasterBand<'a> { /// Get actual block size (at the edges) when block size /// does not divide band size. #[cfg(any(all(major_is_2, minor_ge_2), major_ge_3))] // GDAL 2.2 .. 2.x or >= 3 - pub fn actual_block_size(&self, offset: (isize, isize)) -> Result<(usize, usize)> { + pub fn actual_block_size(&self, x: usize, y: usize) -> Result<(usize, usize)> { + let offset_x = x.try_into().expect("`x` offset must fit in `c_int`"); + let offset_y = y.try_into().expect("`y` offset must fit in `c_int`"); let mut block_size_x = 0; let mut block_size_y = 0; let rv = unsafe { gdal_sys::GDALGetActualBlockSize( self.c_rasterband, - offset.0 as libc::c_int, - offset.1 as libc::c_int, + offset_x, + offset_y, &mut block_size_x, &mut block_size_y, ) From ea33ff71dd61eb6bd56aafa01fa702a1b394ba2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lauren=C8=9Biu=20Nicola?= Date: Fri, 2 Jun 2023 11:18:12 +0300 Subject: [PATCH 2/2] Replace asserts with try_into --- src/gcp.rs | 10 +++++----- src/raster/tests.rs | 2 +- src/spatial_ref/srs.rs | 13 ++++--------- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/gcp.rs b/src/gcp.rs index 8f46c1a8d..2b8f23dfe 100644 --- a/src/gcp.rs +++ b/src/gcp.rs @@ -159,10 +159,10 @@ impl Dataset { /// /// Panics if `gcps` has more than [`libc::c_int::MAX`] elements. pub fn set_gcps(&self, gcps: Vec, spatial_ref: &SpatialRef) -> Result<()> { - assert!( - gcps.len() <= libc::c_int::MAX as usize, - "only up to `INT_MAX` GCPs are supported" - ); + let len = gcps + .len() + .try_into() + .expect("only up to `INT_MAX` GCPs are supported"); struct CGcp { id: CString, @@ -205,7 +205,7 @@ impl Dataset { let rv = unsafe { gdal_sys::GDALSetGCPs2( self.c_dataset(), - gdal_gcps.len() as libc::c_int, + len, gdal_gcps.as_ptr(), spatial_ref.to_c_hsrs() as *mut _, ) diff --git a/src/raster/tests.rs b/src/raster/tests.rs index 6fdbf4dc2..4a9c69b0b 100644 --- a/src/raster/tests.rs +++ b/src/raster/tests.rs @@ -515,7 +515,7 @@ fn test_get_rasterband_block_size() { fn test_get_rasterband_actual_block_size() { let dataset = Dataset::open(fixture("tinymarble.png")).unwrap(); let rasterband = dataset.rasterband(1).unwrap(); - let size = rasterband.actual_block_size((0, 0)).unwrap(); + let size = rasterband.actual_block_size(0, 0).unwrap(); #[cfg(any(all(major_ge_3, minor_ge_7), major_ge_4))] assert_eq!(size, (100, 50)); #[cfg(not(any(all(major_is_3, minor_ge_7), major_ge_4)))] diff --git a/src/spatial_ref/srs.rs b/src/spatial_ref/srs.rs index 97d28c97a..64353a4ec 100644 --- a/src/spatial_ref/srs.rs +++ b/src/spatial_ref/srs.rs @@ -568,19 +568,14 @@ impl SpatialRef { /// /// Panics if `child` is greater than [`libc::c_int::MAX`]. pub fn get_attr_value(&self, node_path: &str, child: usize) -> Result> { - assert!( - child <= libc::c_int::MAX as usize, - "`child` must fit in `int`" - ); + let child = child.try_into().expect("`child` must fit in `c_int`"); let c_node_path = CString::new(node_path)?; - let c_ptr_value = unsafe { - gdal_sys::OSRGetAttrValue(self.0, c_node_path.as_ptr(), child as libc::c_int) - }; - if c_ptr_value.is_null() { + let rv = unsafe { gdal_sys::OSRGetAttrValue(self.0, c_node_path.as_ptr(), child) }; + if rv.is_null() { Ok(None) } else { - Ok(Some(_string(c_ptr_value))) + Ok(Some(_string(rv))) } }