use crate::{ commands::{wrap_command, wrap_origin_accessors}, macros::{wrap_fields, wrap_functions}, mem::{heap_move_nonnull, heap_move_ok, heap_remove}, }; use servicepoint::{Bitmap, BitmapCommand, CompressionCode, Origin, Packet}; use std::ptr::NonNull; wrap_command!(Bitmap); wrap_fields!(cmd_bitmap::BitmapCommand; prop bitmap: Bitmap { mut get(); move set(value); }; prop compression: CompressionCode { get(); set(value); }; ); wrap_origin_accessors!(cmd_bitmap::BitmapCommand); wrap_functions!(cmd_bitmap; /// Sets a window of pixels to the specified values. /// /// The passed [Bitmap] gets consumed. /// /// Returns: a new [BitmapCommand] instance. fn new( bitmap: NonNull, origin_x: usize, origin_y: usize, compression: CompressionCode, ) -> NonNull { heap_move_nonnull(BitmapCommand { bitmap: unsafe { heap_remove(bitmap) }, origin: Origin::new(origin_x, origin_y), compression, }) } /// Move the provided [Bitmap] into a new [BitmapCommand], /// leaving other fields as their default values. /// /// Rust equivalent: `BitmapCommand::from(bitmap)` fn from_bitmap( bitmap: NonNull, ) -> NonNull { heap_move_nonnull(unsafe { heap_remove(bitmap) }.into()) } /// Tries to turn a [BitmapCommand] into a [Packet]. /// /// Returns: NULL or a [Packet] containing the command. fn try_into_packet( command: NonNull, ) -> *mut Packet { heap_move_ok(unsafe { heap_remove(command) }.try_into()) } );