add functions to convert containers directly into packet
This commit is contained in:
		
							parent
							
								
									e5ef2afb2c
								
							
						
					
					
						commit
						ef7690b6b2
					
				
					 10 changed files with 178 additions and 20 deletions
				
			
		| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
use crate::byte_slice::ByteSlice;
 | 
			
		||||
use crate::{heap_drop, heap_move, heap_move_nonnull, heap_remove, SPBitVec};
 | 
			
		||||
use servicepoint::{Bitmap, DataRef, Grid};
 | 
			
		||||
use servicepoint::{Bitmap, BitmapCommand, CompressionCode, DataRef, Grid, Origin, Packet};
 | 
			
		||||
use std::ptr::NonNull;
 | 
			
		||||
 | 
			
		||||
/// Creates a new [Bitmap] with the specified dimensions.
 | 
			
		||||
| 
						 | 
				
			
			@ -199,3 +199,26 @@ pub unsafe extern "C" fn sp_bitmap_into_bitvec(
 | 
			
		|||
    let bitmap = unsafe { heap_remove(bitmap) };
 | 
			
		||||
    heap_move_nonnull(SPBitVec(bitmap.into()))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Creates a [BitmapCommand] and immediately turns that into a [Packet].
 | 
			
		||||
///
 | 
			
		||||
/// The provided [Bitmap] gets consumed.
 | 
			
		||||
///
 | 
			
		||||
/// Returns NULL in case of an error.
 | 
			
		||||
#[no_mangle]
 | 
			
		||||
pub unsafe extern "C" fn sp_bitmap_into_packet(
 | 
			
		||||
    bitmap: NonNull<Bitmap>,
 | 
			
		||||
    x: usize,
 | 
			
		||||
    y: usize,
 | 
			
		||||
    compression: CompressionCode
 | 
			
		||||
) -> *mut Packet {
 | 
			
		||||
    let bitmap = unsafe { heap_remove(bitmap) };
 | 
			
		||||
    match Packet::try_from(BitmapCommand {
 | 
			
		||||
        bitmap,
 | 
			
		||||
        origin: Origin::new(x, y),
 | 
			
		||||
        compression,
 | 
			
		||||
    }) {
 | 
			
		||||
        Ok(packet) => heap_move(packet),
 | 
			
		||||
        Err(_) => std::ptr::null_mut(),
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
use crate::{heap_drop, heap_move_nonnull, ByteSlice};
 | 
			
		||||
use servicepoint::BitVecU8Msb0;
 | 
			
		||||
use crate::{heap_drop, heap_move, heap_move_nonnull, heap_remove, ByteSlice};
 | 
			
		||||
use servicepoint::{BinaryOperation, BitVecCommand, BitVecU8Msb0, CompressionCode, Packet};
 | 
			
		||||
use std::ptr::NonNull;
 | 
			
		||||
 | 
			
		||||
/// A vector of bits
 | 
			
		||||
| 
						 | 
				
			
			@ -146,3 +146,27 @@ pub unsafe extern "C" fn sp_bitvec_unsafe_data_ref(
 | 
			
		|||
) -> ByteSlice {
 | 
			
		||||
    unsafe { ByteSlice::from_slice((*bit_vec.as_ptr()).0.as_raw_mut_slice()) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Creates a [BitVecCommand] and immediately turns that into a [Packet].
 | 
			
		||||
///
 | 
			
		||||
/// The provided [SPBitVec] gets consumed.
 | 
			
		||||
///
 | 
			
		||||
/// Returns NULL in case of an error.
 | 
			
		||||
#[no_mangle]
 | 
			
		||||
pub unsafe extern "C" fn sp_bitvec_into_packet(
 | 
			
		||||
    bitvec: NonNull<SPBitVec>,
 | 
			
		||||
    offset: usize,
 | 
			
		||||
    operation: BinaryOperation,
 | 
			
		||||
    compression: CompressionCode
 | 
			
		||||
) -> *mut Packet {
 | 
			
		||||
    let bitvec = unsafe { heap_remove(bitvec) }.0;
 | 
			
		||||
    match Packet::try_from(BitVecCommand {
 | 
			
		||||
        bitvec,
 | 
			
		||||
        offset,
 | 
			
		||||
        operation,
 | 
			
		||||
        compression,
 | 
			
		||||
    }) {
 | 
			
		||||
        Ok(packet) => heap_move(packet),
 | 
			
		||||
        Err(_) => std::ptr::null_mut(),
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -175,6 +175,11 @@ pub unsafe extern "C" fn sp_brightness_grid_unsafe_data_ref(
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Creates a [BrightnessGridCommand] and immediately turns that into a [Packet].
 | 
			
		||||
///
 | 
			
		||||
/// The provided [BrightnessGrid] gets consumed.
 | 
			
		||||
///
 | 
			
		||||
/// Returns NULL in case of an error.
 | 
			
		||||
#[no_mangle]
 | 
			
		||||
pub unsafe extern "C" fn sp_brightness_grid_into_packet(
 | 
			
		||||
    grid: NonNull<BrightnessGrid>,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
use crate::{heap_drop, heap_move, heap_move_nonnull, ByteSlice};
 | 
			
		||||
use servicepoint::{CharGrid, Grid};
 | 
			
		||||
use crate::{heap_drop, heap_move, heap_move_nonnull, heap_remove, ByteSlice};
 | 
			
		||||
use servicepoint::{CharGrid, CharGridCommand, Grid, Origin, Packet};
 | 
			
		||||
use std::ptr::NonNull;
 | 
			
		||||
 | 
			
		||||
/// Creates a new [CharGrid] with the specified dimensions.
 | 
			
		||||
| 
						 | 
				
			
			@ -132,3 +132,24 @@ pub unsafe extern "C" fn sp_char_grid_height(
 | 
			
		|||
) -> usize {
 | 
			
		||||
    unsafe { char_grid.as_ref().height() }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Creates a [CharGridCommand] and immediately turns that into a [Packet].
 | 
			
		||||
///
 | 
			
		||||
/// The provided [CharGrid] gets consumed.
 | 
			
		||||
///
 | 
			
		||||
/// Returns NULL in case of an error.
 | 
			
		||||
#[no_mangle]
 | 
			
		||||
pub unsafe extern "C" fn sp_char_grid_into_packet(
 | 
			
		||||
    grid: NonNull<CharGrid>,
 | 
			
		||||
    x: usize,
 | 
			
		||||
    y: usize,
 | 
			
		||||
) -> *mut Packet {
 | 
			
		||||
    let grid = unsafe { heap_remove(grid) };
 | 
			
		||||
    match Packet::try_from(CharGridCommand {
 | 
			
		||||
        grid,
 | 
			
		||||
        origin: Origin::new(x, y),
 | 
			
		||||
    }) {
 | 
			
		||||
        Ok(packet) => heap_move(packet),
 | 
			
		||||
        Err(_) => std::ptr::null_mut(),
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
use crate::{heap_drop, heap_move, heap_move_nonnull, ByteSlice};
 | 
			
		||||
use servicepoint::{Cp437Grid, DataRef, Grid};
 | 
			
		||||
use crate::{heap_drop, heap_move, heap_move_nonnull, heap_remove, ByteSlice};
 | 
			
		||||
use servicepoint::{Cp437Grid, Cp437GridCommand, DataRef, Grid, Origin, Packet};
 | 
			
		||||
use std::ptr::NonNull;
 | 
			
		||||
 | 
			
		||||
/// Creates a new [Cp437Grid] with the specified dimensions.
 | 
			
		||||
| 
						 | 
				
			
			@ -132,3 +132,24 @@ pub unsafe extern "C" fn sp_cp437_grid_unsafe_data_ref(
 | 
			
		|||
) -> ByteSlice {
 | 
			
		||||
    unsafe { ByteSlice::from_slice((*cp437_grid.as_ptr()).data_ref_mut()) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Creates a [Cp437GridCommand] and immediately turns that into a [Packet].
 | 
			
		||||
///
 | 
			
		||||
/// The provided [Cp437Grid] gets consumed.
 | 
			
		||||
///
 | 
			
		||||
/// Returns NULL in case of an error.
 | 
			
		||||
#[no_mangle]
 | 
			
		||||
pub unsafe extern "C" fn sp_cp437_grid_into_packet(
 | 
			
		||||
    grid: NonNull<Cp437Grid>,
 | 
			
		||||
    x: usize,
 | 
			
		||||
    y: usize,
 | 
			
		||||
) -> *mut Packet {
 | 
			
		||||
    let grid = unsafe { heap_remove(grid) };
 | 
			
		||||
    match Packet::try_from(Cp437GridCommand {
 | 
			
		||||
        grid,
 | 
			
		||||
        origin: Origin::new(x, y),
 | 
			
		||||
    }) {
 | 
			
		||||
        Ok(packet) => heap_move(packet),
 | 
			
		||||
        Err(_) => std::ptr::null_mut(),
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -108,6 +108,9 @@ pub unsafe extern "C" fn sp_packet_free(packet: NonNull<Packet>) {
 | 
			
		|||
    unsafe { heap_drop(packet) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Converts u16 into [CommandCode].
 | 
			
		||||
///
 | 
			
		||||
/// If the provided value is not valid, false is returned and result is not changed.
 | 
			
		||||
#[no_mangle]
 | 
			
		||||
pub unsafe extern "C" fn sp_u16_to_command_code(
 | 
			
		||||
    code: u16,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue