From c797bb68942686d9c3cdfc9b2a886423fa738c5f Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Sat, 12 Apr 2025 18:35:48 +0200 Subject: [PATCH] add sp_bitmap_into_bitvec --- include/servicepoint.h | 5 +++++ src/bitmap.rs | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/include/servicepoint.h b/include/servicepoint.h index 9edeaf9..2b9b07c 100644 --- a/include/servicepoint.h +++ b/include/servicepoint.h @@ -411,6 +411,11 @@ bool sp_bitmap_get(Bitmap */*notnull*/ bitmap, size_t x, size_t y); */ 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. * diff --git a/src/bitmap.rs b/src/bitmap.rs index c166881..988a6ce 100644 --- a/src/bitmap.rs +++ b/src/bitmap.rs @@ -1,5 +1,5 @@ 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 std::ptr::NonNull; @@ -172,3 +172,12 @@ pub unsafe extern "C" fn sp_bitmap_unsafe_data_ref( ) -> ByteSlice { 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, +) -> NonNull { + let bitmap = unsafe { *Box::from_raw(bitmap.as_ptr()) }; + heap_move_nonnull(SPBitVec(bitmap.into())) +}