use crate::mem::{ heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove, }; use servicepoint::{BitmapCommand, CharGrid, CharGridCommand, Origin, Packet}; use std::ptr::NonNull; #[no_mangle] pub unsafe extern "C" fn sp_cmd_char_grid_new( grid: NonNull, origin_x: usize, origin_y: usize, ) -> NonNull { heap_move_nonnull(CharGridCommand { grid: unsafe { heap_remove(grid) }, origin: Origin::new(origin_x, origin_y), }) } #[no_mangle] pub unsafe extern "C" fn sp_cmd_char_grid_from_grid( grid: NonNull, ) -> NonNull { heap_move_nonnull(unsafe { heap_remove(grid) }.into()) } #[no_mangle] pub unsafe extern "C" fn sp_cmd_char_grid_into_packet( command: NonNull, ) -> *mut Packet { heap_move_ok(unsafe { heap_remove(command) }.try_into()) } #[no_mangle] pub unsafe extern "C" fn sp_cmd_char_grid_clone( command: NonNull, ) -> NonNull { unsafe { heap_clone(command) } } #[no_mangle] pub unsafe extern "C" fn sp_cmd_char_grid_free( command: NonNull, ) { unsafe { heap_drop(command) } } /// Moves the provided bitmap to be contained in the command. #[no_mangle] pub unsafe extern "C" fn sp_cmd_char_grid_set( mut command: NonNull, grid: NonNull, ) { unsafe { command.as_mut().grid = heap_remove(grid); } } #[no_mangle] pub unsafe extern "C" fn sp_cmd_char_grid_get( mut command: NonNull, ) -> *mut CharGrid { &mut unsafe { command.as_mut() }.grid } #[no_mangle] pub unsafe extern "C" fn sp_cmd_char_grid_get_origin( command: NonNull, origin_x: NonNull, origin_y: NonNull, ) { unsafe { let origin = &command.as_ref().origin; *origin_x.as_ptr() = origin.x; *origin_y.as_ptr() = origin.y; } } #[no_mangle] pub unsafe extern "C" fn sp_cmd_char_grid_set_origin( mut command: NonNull, origin_x: usize, origin_y: usize, ) { unsafe { command.as_mut().origin = Origin::new(origin_x, origin_y); } }