Compare commits

...

3 commits

Author SHA1 Message Date
Vinzenz Schroeter a418e4f0c3 sp_brightness_grid_load ignore out of range
Some checks failed
Rust / build (pull_request) Failing after 30s
2025-04-12 18:49:12 +02:00
Vinzenz Schroeter 2e468fb47a add sp_bitmap_from_bitvec 2025-04-12 18:41:43 +02:00
Vinzenz Schroeter c797bb6894 add sp_bitmap_into_bitvec 2025-04-12 18:35:48 +02:00
4 changed files with 51 additions and 10 deletions

View file

@ -24,7 +24,7 @@ sort_by = "Name"
[parse] [parse]
parse_deps = true parse_deps = true
include = ["servicepoint"] include = ["servicepoint", "std"]
extra_bindings = ["servicepoint"] extra_bindings = ["servicepoint"]
[parse.expand] [parse.expand]

View file

@ -388,6 +388,15 @@ void sp_bitmap_fill(Bitmap */*notnull*/ bitmap, bool value);
*/ */
void sp_bitmap_free(Bitmap */*notnull*/ bitmap); void sp_bitmap_free(Bitmap */*notnull*/ bitmap);
/**
* Tries to convert the BitVec to a Bitmap.
*
* The provided BitVec gets consumed.
*
* Returns NULL in case of error.
*/
Bitmap *sp_bitmap_from_bitvec(size_t width, SPBitVec */*notnull*/ bitvec);
/** /**
* Gets the current value at the specified position in the [Bitmap]. * Gets the current value at the specified position in the [Bitmap].
* *
@ -411,6 +420,11 @@ bool sp_bitmap_get(Bitmap */*notnull*/ bitmap, size_t x, size_t y);
*/ */
size_t sp_bitmap_height(Bitmap */*notnull*/ bitmap); size_t sp_bitmap_height(Bitmap */*notnull*/ bitmap);
/**
* Consumes the Bitmap and returns the contained BitVec
*/
SPBitVec */*notnull*/ sp_bitmap_into_bitvec(Bitmap */*notnull*/ bitmap);
/** /**
* Loads a [Bitmap] with the specified dimensions from the provided data. * Loads a [Bitmap] with the specified dimensions from the provided data.
* *

View file

@ -1,5 +1,5 @@
use crate::byte_slice::ByteSlice; use crate::byte_slice::ByteSlice;
use crate::{heap_drop, heap_move, heap_move_nonnull}; use crate::{heap_drop, heap_move, heap_move_nonnull, SPBitVec};
use servicepoint::{Bitmap, DataRef, Grid}; use servicepoint::{Bitmap, DataRef, Grid};
use std::ptr::NonNull; use std::ptr::NonNull;
@ -68,6 +68,24 @@ pub unsafe extern "C" fn sp_bitmap_load(
} }
} }
/// Tries to convert the BitVec to a Bitmap.
///
/// The provided BitVec gets consumed.
///
/// Returns NULL in case of error.
#[no_mangle]
pub unsafe extern "C" fn sp_bitmap_from_bitvec(
width: usize,
bitvec: NonNull<SPBitVec>,
) -> *mut Bitmap {
let bitvec = unsafe { *Box::from_raw(bitvec.as_ptr()) };
if let Ok(bitmap) = Bitmap::from_bitvec(width, bitvec.0) {
heap_move(bitmap)
} else {
std::ptr::null_mut()
}
}
/// Clones a [Bitmap]. /// Clones a [Bitmap].
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn sp_bitmap_clone( pub unsafe extern "C" fn sp_bitmap_clone(
@ -172,3 +190,12 @@ pub unsafe extern "C" fn sp_bitmap_unsafe_data_ref(
) -> ByteSlice { ) -> ByteSlice {
unsafe { ByteSlice::from_slice(bitmap.as_mut().data_ref_mut()) } unsafe { ByteSlice::from_slice(bitmap.as_mut().data_ref_mut()) }
} }
/// Consumes the Bitmap and returns the contained BitVec
#[no_mangle]
pub unsafe extern "C" fn sp_bitmap_into_bitvec(
bitmap: NonNull<Bitmap>,
) -> NonNull<SPBitVec> {
let bitmap = unsafe { *Box::from_raw(bitmap.as_ptr()) };
heap_move_nonnull(SPBitVec(bitmap.into()))
}

View file

@ -30,6 +30,8 @@ pub unsafe extern "C" fn sp_brightness_grid_new(
/// Loads a [BrightnessGrid] with the specified dimensions from the provided data. /// Loads a [BrightnessGrid] with the specified dimensions from the provided data.
/// ///
/// Any out of range values will be set to [Brightness::MAX] or [Brightness::MIN].
///
/// returns: new [BrightnessGrid] instance, or NULL in case of an error. /// returns: new [BrightnessGrid] instance, or NULL in case of an error.
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn sp_brightness_grid_load( pub unsafe extern "C" fn sp_brightness_grid_load(
@ -38,14 +40,12 @@ pub unsafe extern "C" fn sp_brightness_grid_load(
data: ByteSlice, data: ByteSlice,
) -> *mut BrightnessGrid { ) -> *mut BrightnessGrid {
let data = unsafe { data.as_slice() }; let data = unsafe { data.as_slice() };
let grid = match ByteGrid::load(width, height, data) {
None => return std::ptr::null_mut(), match ByteGrid::load(width, height, data)
Some(grid) => grid, .map(move |grid| grid.map(Brightness::saturating_from))
}; {
if let Ok(grid) = BrightnessGrid::try_from(grid) { None => std::ptr::null_mut(),
heap_move(grid) Some(grid) => heap_move(grid),
} else {
std::ptr::null_mut()
} }
} }