diff --git a/include/servicepoint.h b/include/servicepoint.h index e001ddd..02d0688 100644 --- a/include/servicepoint.h +++ b/include/servicepoint.h @@ -640,9 +640,7 @@ extern "C" { void init_env_logger(void); /** - *Clones a [`Bitmap`] instance. - * - * This function is part of the sp_bitmap module. + *Clones a [Bitmap] instance. */ struct Bitmap */*notnull*/ sp_bitmap_clone(struct Bitmap */*notnull*/ instance); @@ -652,8 +650,6 @@ struct Bitmap */*notnull*/ sp_bitmap_clone(struct Bitmap */*notnull*/ instance); * Gets an unsafe reference to the data of the [Bitmap] instance. * * The returned memory is valid for the lifetime of the bitmap. - * - * This function is part of the sp_bitmap module. */ struct ByteSlice sp_bitmap_data_ref_mut(struct Bitmap */*notnull*/ instance); @@ -665,15 +661,11 @@ struct ByteSlice sp_bitmap_data_ref_mut(struct Bitmap */*notnull*/ instance); * # Arguments * * - `value`: the value to set all pixels to - * - * This function is part of the sp_bitmap module. */ void sp_bitmap_fill(struct Bitmap */*notnull*/ instance, bool value); /** - *Deallocates a [`Bitmap`] instance. - * - * This function is part of the sp_bitmap module. + *Deallocates a [Bitmap] instance. */ void sp_bitmap_free(struct Bitmap */*notnull*/ instance); @@ -683,8 +675,6 @@ void sp_bitmap_free(struct Bitmap */*notnull*/ instance); * The provided BitVec gets consumed. * * Returns NULL in case of error. - * - * This function is part of the sp_bitmap module. */ struct Bitmap *sp_bitmap_from_bitvec(size_t width, BitVec */*notnull*/ bitvec); @@ -700,8 +690,6 @@ struct Bitmap *sp_bitmap_from_bitvec(size_t width, BitVec */*notnull*/ bitvec); * # Panics * * - when accessing `x` or `y` out of bounds - * - * This function is part of the sp_bitmap module. */ bool sp_bitmap_get(struct Bitmap */*notnull*/ instance, size_t x, size_t y); @@ -709,15 +697,11 @@ bool sp_bitmap_get(struct Bitmap */*notnull*/ instance, size_t x, size_t y); * Calls [`servicepoint::Bitmap::height`]. * * Gets the height in pixels. - * - * This function is part of the sp_bitmap module. */ size_t sp_bitmap_height(struct Bitmap */*notnull*/ instance); /** * Consumes the Bitmap and returns the contained BitVec. - * - * This function is part of the sp_bitmap module. */ BitVec */*notnull*/ sp_bitmap_into_bitvec(struct Bitmap */*notnull*/ bitmap); @@ -727,8 +711,6 @@ BitVec */*notnull*/ sp_bitmap_into_bitvec(struct Bitmap */*notnull*/ bitmap); * The provided [Bitmap] gets consumed. * * Returns NULL in case of an error. - * - * This function is part of the sp_bitmap module. */ struct Packet *sp_bitmap_into_packet(struct Bitmap */*notnull*/ bitmap, size_t x, @@ -744,8 +726,6 @@ struct Packet *sp_bitmap_into_packet(struct Bitmap */*notnull*/ bitmap, * - `height`: size in pixels in y-direction * * returns: [Bitmap] that contains a copy of the provided data, or NULL in case of an error. - * - * This function is part of the sp_bitmap module. */ struct Bitmap *sp_bitmap_load(size_t width, size_t height, @@ -775,8 +755,6 @@ struct Bitmap *sp_bitmap_load(size_t width, * sp_bitmap_set(grid, 0, 0, false); * sp_bitmap_free(grid); * ``` - * - * This function is part of the sp_bitmap module. */ struct Bitmap *sp_bitmap_new(size_t width, size_t height); @@ -784,8 +762,6 @@ struct Bitmap *sp_bitmap_new(size_t width, size_t height); * Creates a new [Bitmap] with a size matching the screen. * * returns: [Bitmap] initialized to all pixels off. - * - * This function is part of the sp_bitmap module. */ struct Bitmap */*notnull*/ sp_bitmap_new_max_sized(void); @@ -802,8 +778,6 @@ struct Bitmap */*notnull*/ sp_bitmap_new_max_sized(void); * # Panics * * - when accessing `x` or `y` out of bounds - * - * This function is part of the sp_bitmap module. */ void sp_bitmap_set(struct Bitmap */*notnull*/ instance, size_t x, @@ -814,8 +788,6 @@ void sp_bitmap_set(struct Bitmap */*notnull*/ instance, * Calls [`servicepoint::Bitmap::width`]. * * Gets the width in pixels. - * - * This function is part of the sp_bitmap module. */ size_t sp_bitmap_width(struct Bitmap */*notnull*/ instance); @@ -825,15 +797,11 @@ size_t sp_bitmap_width(struct Bitmap */*notnull*/ instance); * Gets an unsafe reference to the data of the [DisplayBitVec] instance. * * The returned memory is valid for the lifetime of the bitvec. - * - * This function is part of the sp_bitvec module. */ struct ByteSlice sp_bitvec_as_raw_mut_slice(BitVec */*notnull*/ instance); /** - *Clones a [`DisplayBitVec`] instance. - * - * This function is part of the sp_bitvec module. + *Clones a [DisplayBitVec] instance. */ BitVec */*notnull*/ sp_bitvec_clone(BitVec */*notnull*/ instance); @@ -845,15 +813,11 @@ BitVec */*notnull*/ sp_bitvec_clone(BitVec */*notnull*/ instance); * # Arguments * * - `value`: the value to set all bits to - * - * This function is part of the sp_bitvec module. */ void sp_bitvec_fill(BitVec */*notnull*/ instance, bool value); /** - *Deallocates a [`DisplayBitVec`] instance. - * - * This function is part of the sp_bitvec module. + *Deallocates a [DisplayBitVec] instance. */ void sp_bitvec_free(BitVec */*notnull*/ instance); @@ -872,8 +836,6 @@ void sp_bitvec_free(BitVec */*notnull*/ instance); * # Panics * * - when accessing `index` out of bounds - * - * This function is part of the sp_bitvec module. */ bool sp_bitvec_get(BitVec */*notnull*/ instance, size_t index); @@ -883,8 +845,6 @@ bool sp_bitvec_get(BitVec */*notnull*/ instance, size_t index); * The provided [DisplayBitVec] gets consumed. * * Returns NULL in case of an error. - * - * This function is part of the sp_bitvec module. */ struct Packet *sp_bitvec_into_packet(BitVec */*notnull*/ bitvec, size_t offset, @@ -895,8 +855,6 @@ struct Packet *sp_bitvec_into_packet(BitVec */*notnull*/ bitvec, * Calls [`servicepoint::DisplayBitVec::is_empty`]. * * Returns true if length is 0. - * - * This function is part of the sp_bitvec module. */ bool sp_bitvec_is_empty(BitVec */*notnull*/ instance); @@ -904,8 +862,6 @@ bool sp_bitvec_is_empty(BitVec */*notnull*/ instance); * Calls [`servicepoint::DisplayBitVec::len`]. * * Gets the length in bits. - * - * This function is part of the sp_bitvec module. */ size_t sp_bitvec_len(BitVec */*notnull*/ instance); @@ -913,8 +869,6 @@ size_t sp_bitvec_len(BitVec */*notnull*/ instance); * Interpret the data as a series of bits and load then into a new [DisplayBitVec] instance. * * returns: [DisplayBitVec] instance containing data. - * - * This function is part of the sp_bitvec module. */ BitVec */*notnull*/ sp_bitvec_load(struct ByteSlice data); @@ -930,8 +884,6 @@ BitVec */*notnull*/ sp_bitvec_load(struct ByteSlice data); * # Panics * * - when `size` is not divisible by 8. - * - * This function is part of the sp_bitvec module. */ BitVec */*notnull*/ sp_bitvec_new(size_t size); @@ -948,15 +900,11 @@ BitVec */*notnull*/ sp_bitvec_new(size_t size); * # Panics * * - when accessing `index` out of bounds - * - * This function is part of the sp_bitvec module. */ void sp_bitvec_set(BitVec */*notnull*/ instance, size_t index, bool value); /** - *Clones a [`BrightnessGrid`] instance. - * - * This function is part of the sp_brightness_grid module. + *Clones a [BrightnessGrid] instance. */ BrightnessGrid */*notnull*/ sp_brightness_grid_clone(BrightnessGrid */*notnull*/ instance); @@ -966,8 +914,6 @@ BrightnessGrid */*notnull*/ sp_brightness_grid_clone(BrightnessGrid */*notnull*/ * Gets an unsafe reference to the data of the instance. * * The returned memory is valid for the lifetime of the grid. - * - * This function is part of the sp_brightness_grid module. */ struct ByteSlice sp_brightness_grid_data_ref_mut(BrightnessGrid */*notnull*/ instance); @@ -979,16 +925,12 @@ struct ByteSlice sp_brightness_grid_data_ref_mut(BrightnessGrid */*notnull*/ ins * # Arguments * * - `value`: the value to set all cells to - * - * This function is part of the sp_brightness_grid module. */ void sp_brightness_grid_fill(BrightnessGrid */*notnull*/ instance, Brightness value); /** - *Deallocates a [`BrightnessGrid`] instance. - * - * This function is part of the sp_brightness_grid module. + *Deallocates a [BrightnessGrid] instance. */ void sp_brightness_grid_free(BrightnessGrid */*notnull*/ instance); @@ -1005,8 +947,6 @@ void sp_brightness_grid_free(BrightnessGrid */*notnull*/ instance); * * # Panics * - When accessing `x` or `y` out of bounds. - * - * This function is part of the sp_brightness_grid module. */ Brightness sp_brightness_grid_get(BrightnessGrid */*notnull*/ instance, size_t x, @@ -1016,8 +956,6 @@ Brightness sp_brightness_grid_get(BrightnessGrid */*notnull*/ instance, * Calls [`servicepoint::BrightnessGrid::height`]. * * Gets the height of the grid. - * - * This function is part of the sp_brightness_grid module. */ size_t sp_brightness_grid_height(BrightnessGrid */*notnull*/ instance); @@ -1027,8 +965,6 @@ size_t sp_brightness_grid_height(BrightnessGrid */*notnull*/ instance); * The provided [BrightnessGrid] gets consumed. * * Returns NULL in case of an error. - * - * This function is part of the sp_brightness_grid module. */ struct Packet *sp_brightness_grid_into_packet(BrightnessGrid */*notnull*/ grid, size_t x, @@ -1040,8 +976,6 @@ struct Packet *sp_brightness_grid_into_packet(BrightnessGrid */*notnull*/ grid, * 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. - * - * This function is part of the sp_brightness_grid module. */ BrightnessGrid *sp_brightness_grid_load(size_t width, size_t height, @@ -1065,8 +999,6 @@ BrightnessGrid *sp_brightness_grid_load(size_t width, * TypedCommand *command = sp_command_char_brightness(grid); * sp_udp_free(connection); * ``` - * - * This function is part of the sp_brightness_grid module. */ BrightnessGrid */*notnull*/ sp_brightness_grid_new(size_t width, size_t height); @@ -1085,8 +1017,6 @@ BrightnessGrid */*notnull*/ sp_brightness_grid_new(size_t width, size_t height); * # Panics * * - When accessing `x` or `y` out of bounds. - * - * This function is part of the sp_brightness_grid module. */ void sp_brightness_grid_set(BrightnessGrid */*notnull*/ instance, size_t x, @@ -1097,15 +1027,11 @@ void sp_brightness_grid_set(BrightnessGrid */*notnull*/ instance, * Calls [`servicepoint::BrightnessGrid::width`]. * * Gets the width of the grid. - * - * This function is part of the sp_brightness_grid module. */ size_t sp_brightness_grid_width(BrightnessGrid */*notnull*/ instance); /** - *Clones a [`CharGrid`] instance. - * - * This function is part of the sp_char_grid module. + *Clones a [CharGrid] instance. */ CharGrid */*notnull*/ sp_char_grid_clone(CharGrid */*notnull*/ instance); @@ -1118,15 +1044,11 @@ CharGrid */*notnull*/ sp_char_grid_clone(CharGrid */*notnull*/ instance); * * - `value`: the value to set all cells to * - when providing values that cannot be converted to Rust's `char`. - * - * This function is part of the sp_char_grid module. */ void sp_char_grid_fill(CharGrid */*notnull*/ instance, uint32_t value); /** - *Deallocates a [`CharGrid`] instance. - * - * This function is part of the sp_char_grid module. + *Deallocates a [CharGrid] instance. */ void sp_char_grid_free(CharGrid */*notnull*/ instance); @@ -1142,8 +1064,6 @@ void sp_char_grid_free(CharGrid */*notnull*/ instance); * # Panics * * - when accessing `x` or `y` out of bounds - * - * This function is part of the sp_char_grid module. */ uint32_t sp_char_grid_get(CharGrid */*notnull*/ instance, size_t x, size_t y); @@ -1151,8 +1071,6 @@ uint32_t sp_char_grid_get(CharGrid */*notnull*/ instance, size_t x, size_t y); * Calls [`servicepoint::CharGrid::height`]. * * Gets the height of the grid. - * - * This function is part of the sp_char_grid module. */ size_t sp_char_grid_height(CharGrid */*notnull*/ instance); @@ -1162,8 +1080,6 @@ size_t sp_char_grid_height(CharGrid */*notnull*/ instance); * The provided [CharGrid] gets consumed. * * Returns NULL in case of an error. - * - * This function is part of the sp_char_grid module. */ struct Packet *sp_char_grid_into_packet(CharGrid */*notnull*/ grid, size_t x, @@ -1173,8 +1089,6 @@ struct Packet *sp_char_grid_into_packet(CharGrid */*notnull*/ grid, * Loads a [CharGrid] with the specified dimensions from the provided data. * * returns: new CharGrid or NULL in case of an error - * - * This function is part of the sp_char_grid module. */ CharGrid *sp_char_grid_load(size_t width, size_t height, struct ByteSlice data); @@ -1191,8 +1105,6 @@ CharGrid *sp_char_grid_load(size_t width, size_t height, struct ByteSlice data); * sp_char_grid_set(grid, 0, 0, '!'); * sp_char_grid_free(grid); * ``` - * - * This function is part of the sp_char_grid module. */ CharGrid */*notnull*/ sp_char_grid_new(size_t width, size_t height); @@ -1212,8 +1124,6 @@ CharGrid */*notnull*/ sp_char_grid_new(size_t width, size_t height); * * - when accessing `x` or `y` out of bounds * - when providing values that cannot be converted to Rust's `char`. - * - * This function is part of the sp_char_grid module. */ void sp_char_grid_set(CharGrid */*notnull*/ instance, size_t x, @@ -1224,22 +1134,16 @@ void sp_char_grid_set(CharGrid */*notnull*/ instance, * Calls [`servicepoint::CharGrid::width`]. * * Gets the width of the grid. - * - * This function is part of the sp_char_grid module. */ size_t sp_char_grid_width(CharGrid */*notnull*/ instance); /** - *Clones a [`BitmapCommand`] instance. - * - * This function is part of the sp_cmd_bitmap module. + *Clones a [BitmapCommand] instance. */ struct BitmapCommand */*notnull*/ sp_cmd_bitmap_clone(struct BitmapCommand */*notnull*/ instance); /** - *Deallocates a [`BitmapCommand`] instance. - * - * This function is part of the sp_cmd_bitmap module. + *Deallocates a [BitmapCommand] instance. */ void sp_cmd_bitmap_free(struct BitmapCommand */*notnull*/ instance); @@ -1248,8 +1152,6 @@ void sp_cmd_bitmap_free(struct BitmapCommand */*notnull*/ instance); * leaving other fields as their default values. * * Rust equivalent: `BitmapCommand::from(bitmap)` - * - * This function is part of the sp_cmd_bitmap module. */ struct BitmapCommand */*notnull*/ sp_cmd_bitmap_from_bitmap(struct Bitmap */*notnull*/ bitmap); @@ -1264,9 +1166,7 @@ struct BitmapCommand */*notnull*/ sp_cmd_bitmap_from_bitmap(struct Bitmap */*not struct Bitmap */*notnull*/ sp_cmd_bitmap_get(struct BitmapCommand */*notnull*/ command); /** - * Gets the value of field `compression` of the [`servicepoint::BitmapCommand`]. - * - * This function is part of the sp_cmd_bitmap module. + *Gets the value of field `compression` of the [`servicepoint::BitmapCommand`]. */ CompressionCode sp_cmd_bitmap_get_compression(struct BitmapCommand */*notnull*/ instance); @@ -1283,8 +1183,6 @@ void sp_cmd_bitmap_get_origin(struct BitmapCommand */*notnull*/ command, * The passed [Bitmap] gets consumed. * * Returns: a new [BitmapCommand] instance. - * - * This function is part of the sp_cmd_bitmap module. */ struct BitmapCommand */*notnull*/ sp_cmd_bitmap_new(struct Bitmap */*notnull*/ bitmap, size_t origin_x, @@ -1298,9 +1196,7 @@ void sp_cmd_bitmap_set(struct BitmapCommand */*notnull*/ command, struct Bitmap */*notnull*/ bitmap); /** - * Sets the value of field `compression` of the [`servicepoint::BitmapCommand`]. - * - * This function is part of the sp_cmd_bitmap module. + *Sets the value of field `compression` of the [`servicepoint::BitmapCommand`]. */ void sp_cmd_bitmap_set_compression(struct BitmapCommand */*notnull*/ instance, CompressionCode value); @@ -1316,22 +1212,16 @@ void sp_cmd_bitmap_set_origin(struct BitmapCommand */*notnull*/ command, * Tries to turn a [BitmapCommand] into a [Packet]. * * Returns: NULL or a [Packet] containing the command. - * - * This function is part of the sp_cmd_bitmap module. */ struct Packet *sp_cmd_bitmap_try_into_packet(struct BitmapCommand */*notnull*/ command); /** - *Clones a [`BitVecCommand`] instance. - * - * This function is part of the sp_cmd_bitvec module. + *Clones a [BitVecCommand] instance. */ struct BitVecCommand */*notnull*/ sp_cmd_bitvec_clone(struct BitVecCommand */*notnull*/ instance); /** - *Deallocates a [`BitVecCommand`] instance. - * - * This function is part of the sp_cmd_bitvec module. + *Deallocates a [BitVecCommand] instance. */ void sp_cmd_bitvec_free(struct BitVecCommand */*notnull*/ instance); @@ -1341,23 +1231,17 @@ void sp_cmd_bitvec_free(struct BitVecCommand */*notnull*/ instance); BitVec *sp_cmd_bitvec_get(struct BitVecCommand */*notnull*/ command); /** - * Gets the value of field `compression` of the [`servicepoint::BitVecCommand`]. - * - * This function is part of the sp_cmd_bitvec module. + *Gets the value of field `compression` of the [`servicepoint::BitVecCommand`]. */ CompressionCode sp_cmd_bitvec_get_compression(struct BitVecCommand */*notnull*/ instance); /** - * Gets the value of field `offset` of the [`servicepoint::BitVecCommand`]. - * - * This function is part of the sp_cmd_bitvec module. + *Gets the value of field `offset` of the [`servicepoint::BitVecCommand`]. */ Offset sp_cmd_bitvec_get_offset(struct BitVecCommand */*notnull*/ instance); /** - * Gets the value of field `operation` of the [`servicepoint::BitVecCommand`]. - * - * This function is part of the sp_cmd_bitvec module. + *Gets the value of field `operation` of the [`servicepoint::BitVecCommand`]. */ BinaryOperation sp_cmd_bitvec_get_operation(struct BitVecCommand */*notnull*/ instance); @@ -1374,8 +1258,6 @@ BinaryOperation sp_cmd_bitvec_get_operation(struct BitVecCommand */*notnull*/ in * For example, [`BinaryOperation::Or`] can be used to turn on some pixels without affecting other pixels. * * The contained [`DisplayBitVec`] is always uncompressed. - * - * This function is part of the sp_cmd_bitvec module. */ struct BitVecCommand */*notnull*/ sp_cmd_bitvec_new(BitVec */*notnull*/ bitvec, size_t offset, @@ -1389,25 +1271,19 @@ void sp_cmd_bitvec_set(struct BitVecCommand */*notnull*/ command, BitVec */*notnull*/ bitvec); /** - * Sets the value of field `compression` of the [`servicepoint::BitVecCommand`]. - * - * This function is part of the sp_cmd_bitvec module. + *Sets the value of field `compression` of the [`servicepoint::BitVecCommand`]. */ void sp_cmd_bitvec_set_compression(struct BitVecCommand */*notnull*/ instance, CompressionCode value); /** - * Sets the value of field `offset` of the [`servicepoint::BitVecCommand`]. - * - * This function is part of the sp_cmd_bitvec module. + *Sets the value of field `offset` of the [`servicepoint::BitVecCommand`]. */ void sp_cmd_bitvec_set_offset(struct BitVecCommand */*notnull*/ instance, Offset value); /** - * Sets the value of field `operation` of the [`servicepoint::BitVecCommand`]. - * - * This function is part of the sp_cmd_bitvec module. + *Sets the value of field `operation` of the [`servicepoint::BitVecCommand`]. */ void sp_cmd_bitvec_set_operation(struct BitVecCommand */*notnull*/ instance, BinaryOperation value); @@ -1416,75 +1292,52 @@ void sp_cmd_bitvec_set_operation(struct BitVecCommand */*notnull*/ instance, * Tries to turn a [BitVecCommand] into a [Packet]. * * Returns: NULL or a [Packet] containing the command. - * - * This function is part of the sp_cmd_bitvec module. */ struct Packet *sp_cmd_bitvec_try_into_packet(struct BitVecCommand */*notnull*/ command); /** - *Clones a [`GlobalBrightnessCommand`] instance. - * - * This function is part of the sp_cmd_brightness_global module. + *Clones a [GlobalBrightnessCommand] instance. */ struct GlobalBrightnessCommand */*notnull*/ sp_cmd_brightness_global_clone(struct GlobalBrightnessCommand */*notnull*/ instance); /** - *Deallocates a [`GlobalBrightnessCommand`] instance. - * - * This function is part of the sp_cmd_brightness_global module. + *Deallocates a [GlobalBrightnessCommand] instance. */ void sp_cmd_brightness_global_free(struct GlobalBrightnessCommand */*notnull*/ instance); /** - * Gets the value of field `brightness` of the [`servicepoint::GlobalBrightnessCommand`]. - * - * This function is part of the sp_cmd_brightness_global module. + *Gets the value of field `brightness` of the [`servicepoint::GlobalBrightnessCommand`]. */ Brightness sp_cmd_brightness_global_get_brightness(struct GlobalBrightnessCommand */*notnull*/ instance); -/** - * Turns the command into a packet - * - * This function is part of the sp_cmd_brightness_global module. - */ struct Packet */*notnull*/ sp_cmd_brightness_global_into_packet(struct GlobalBrightnessCommand */*notnull*/ command); /** * Set the brightness of all tiles to the same value. * * Returns: a new [GlobalBrightnessCommand] instance. - * - * This function is part of the sp_cmd_brightness_global module. */ struct GlobalBrightnessCommand */*notnull*/ sp_cmd_brightness_global_new(Brightness brightness); /** - * Sets the value of field `brightness` of the [`servicepoint::GlobalBrightnessCommand`]. - * - * This function is part of the sp_cmd_brightness_global module. + *Sets the value of field `brightness` of the [`servicepoint::GlobalBrightnessCommand`]. */ void sp_cmd_brightness_global_set_brightness(struct GlobalBrightnessCommand */*notnull*/ instance, Brightness value); /** - *Clones a [`BrightnessGridCommand`] instance. - * - * This function is part of the sp_cmd_brightness_grid module. + *Clones a [BrightnessGridCommand] instance. */ struct BrightnessGridCommand */*notnull*/ sp_cmd_brightness_grid_clone(struct BrightnessGridCommand */*notnull*/ instance); /** - *Deallocates a [`BrightnessGridCommand`] instance. - * - * This function is part of the sp_cmd_brightness_grid module. + *Deallocates a [BrightnessGridCommand] instance. */ void sp_cmd_brightness_grid_free(struct BrightnessGridCommand */*notnull*/ instance); /** * Moves the provided [BrightnessGrid] into a new [BrightnessGridCommand], * leaving other fields as their default values. - * - * This function is part of the sp_cmd_brightness_grid module. */ struct BrightnessGridCommand */*notnull*/ sp_cmd_brightness_grid_from_grid(BrightnessGrid */*notnull*/ grid); @@ -1504,8 +1357,6 @@ void sp_cmd_brightness_grid_get_origin(struct BrightnessGridCommand */*notnull*/ * Tries to turn a [BrightnessGridCommand] into a [Packet]. * * Returns: NULL or a [Packet] containing the command. - * - * This function is part of the sp_cmd_brightness_grid module. */ struct Packet *sp_cmd_brightness_grid_into_packet(struct BrightnessGridCommand */*notnull*/ command); @@ -1515,8 +1366,6 @@ struct Packet *sp_cmd_brightness_grid_into_packet(struct BrightnessGridCommand * * The passed [BrightnessGrid] gets consumed. * * Returns: a new [BrightnessGridCommand] instance. - * - * This function is part of the sp_cmd_brightness_grid module. */ struct BrightnessGridCommand */*notnull*/ sp_cmd_brightness_grid_new(BrightnessGrid */*notnull*/ grid, size_t origin_x, @@ -1536,31 +1385,25 @@ void sp_cmd_brightness_grid_set_origin(struct BrightnessGridCommand */*notnull*/ size_t origin_y); /** - *Clones a [`CharGridCommand`] instance. - * - * This function is part of the sp_cmd_char_grid module. + *Clones a [CharGridCommand] instance. */ struct CharGridCommand */*notnull*/ sp_cmd_char_grid_clone(struct CharGridCommand */*notnull*/ instance); /** - *Deallocates a [`CharGridCommand`] instance. - * - * This function is part of the sp_cmd_char_grid module. + *Deallocates a [CharGridCommand] instance. */ void sp_cmd_char_grid_free(struct CharGridCommand */*notnull*/ instance); /** * Moves the provided [CharGrid] into a new [CharGridCommand], * leaving other fields as their default values. - * - * This function is part of the sp_cmd_char_grid module. */ struct CharGridCommand */*notnull*/ sp_cmd_char_grid_from_grid(CharGrid */*notnull*/ grid); /** * Returns a pointer to the [CharGrid] contained in the [CharGridCommand]. */ -CharGrid */*notnull*/ sp_cmd_char_grid_get(struct CharGridCommand */*notnull*/ command); +CharGrid *sp_cmd_char_grid_get(struct CharGridCommand */*notnull*/ command); /** * Reads the origin field of the [CharGridCommand]. @@ -1575,8 +1418,6 @@ void sp_cmd_char_grid_get_origin(struct CharGridCommand */*notnull*/ command, * The passed [CharGrid] gets consumed. * * Returns: a new [CharGridCommand] instance. - * - * This function is part of the sp_cmd_char_grid module. */ struct CharGridCommand */*notnull*/ sp_cmd_char_grid_new(CharGrid */*notnull*/ grid, size_t origin_x, @@ -1599,15 +1440,11 @@ void sp_cmd_char_grid_set_origin(struct CharGridCommand */*notnull*/ command, * Tries to turn a [CharGridCommand] into a [Packet]. * * Returns: NULL or a [Packet] containing the command. - * - * This function is part of the sp_cmd_char_grid module. */ struct Packet *sp_cmd_char_grid_try_into_packet(struct CharGridCommand */*notnull*/ command); /** - *Deallocates a [`ClearCommand`] instance. - * - * This function is part of the sp_cmd_clear module. + *Deallocates a [ClearCommand] instance. */ void sp_cmd_clear_free(struct ClearCommand */*notnull*/ instance); @@ -1617,30 +1454,22 @@ void sp_cmd_clear_free(struct ClearCommand */*notnull*/ instance); * Does not affect brightness. * * Returns: a new [ClearCommand] instance. - * - * This function is part of the sp_cmd_clear module. */ struct ClearCommand */*notnull*/ sp_cmd_clear_new(void); /** - *Clones a [`Cp437GridCommand`] instance. - * - * This function is part of the sp_cmd_cp437_grid module. + *Clones a [Cp437GridCommand] instance. */ struct Cp437GridCommand */*notnull*/ sp_cmd_cp437_grid_clone(struct Cp437GridCommand */*notnull*/ instance); /** - *Deallocates a [`Cp437GridCommand`] instance. - * - * This function is part of the sp_cmd_cp437_grid module. + *Deallocates a [Cp437GridCommand] instance. */ void sp_cmd_cp437_grid_free(struct Cp437GridCommand */*notnull*/ instance); /** * Moves the provided [Cp437Grid] into a new [Cp437GridCommand], * leaving other fields as their default values. - * - * This function is part of the sp_cmd_cp437_grid module. */ struct Cp437GridCommand */*notnull*/ sp_cmd_cp437_grid_from_grid(Cp437Grid */*notnull*/ grid); @@ -1669,8 +1498,6 @@ void sp_cmd_cp437_grid_get_origin(struct Cp437GridCommand */*notnull*/ command, * The text is sent in the form of a 2D grid of [CP-437] encoded characters. * * The origin is relative to the top-left of the display. - * - * This function is part of the sp_cmd_cp437_grid module. */ struct Cp437GridCommand */*notnull*/ sp_cmd_cp437_grid_new(Cp437Grid */*notnull*/ grid, size_t origin_x, @@ -1697,15 +1524,11 @@ void sp_cmd_cp437_grid_set_origin(struct Cp437GridCommand */*notnull*/ command, * Tries to turn a [Cp437GridCommand] into a [Packet]. * * Returns: NULL or a [Packet] containing the command. - * - * This function is part of the sp_cmd_cp437_grid module. */ struct Packet *sp_cmd_cp437_grid_try_into_packet(struct Cp437GridCommand */*notnull*/ command); /** - *Deallocates a [`FadeOutCommand`] instance. - * - * This function is part of the sp_cmd_fade_out module. + *Deallocates a [FadeOutCommand] instance. */ void sp_cmd_fade_out_free(struct FadeOutCommand */*notnull*/ instance); @@ -1713,8 +1536,6 @@ void sp_cmd_fade_out_free(struct FadeOutCommand */*notnull*/ instance); * A yet-to-be-tested command. * * Returns: a new [FadeOutCommand] instance. - * - * This function is part of the sp_cmd_fade_out module. */ struct FadeOutCommand */*notnull*/ sp_cmd_fade_out_new(void); @@ -1757,9 +1578,7 @@ struct Packet *sp_cmd_generic_into_packet(struct Command command); struct Command sp_cmd_generic_try_from_packet(struct Packet */*notnull*/ packet); /** - *Deallocates a [`HardResetCommand`] instance. - * - * This function is part of the sp_cmd_hard_reset module. + *Deallocates a [HardResetCommand] instance. */ void sp_cmd_hard_reset_free(struct HardResetCommand */*notnull*/ instance); @@ -1769,15 +1588,11 @@ void sp_cmd_hard_reset_free(struct HardResetCommand */*notnull*/ instance); * Please do not send this in your normal program flow. * * Returns: a new [HardResetCommand] instance. - * - * This function is part of the sp_cmd_hard_reset module. */ struct HardResetCommand */*notnull*/ sp_cmd_hard_reset_new(void); /** - *Clones a [`Cp437Grid`] instance. - * - * This function is part of the sp_cp437_grid module. + *Clones a [Cp437Grid] instance. */ Cp437Grid */*notnull*/ sp_cp437_grid_clone(Cp437Grid */*notnull*/ instance); @@ -1787,8 +1602,6 @@ Cp437Grid */*notnull*/ sp_cp437_grid_clone(Cp437Grid */*notnull*/ instance); * Gets an unsafe reference to the data of the grid. * * The returned memory is valid for the lifetime of the instance. - * - * This function is part of the sp_cp437_grid module. */ struct ByteSlice sp_cp437_grid_data_ref_mut(Cp437Grid */*notnull*/ instance); @@ -1801,15 +1614,11 @@ struct ByteSlice sp_cp437_grid_data_ref_mut(Cp437Grid */*notnull*/ instance); * * - `cp437_grid`: instance to write to * - `value`: the value to set all cells to - * - * This function is part of the sp_cp437_grid module. */ void sp_cp437_grid_fill(Cp437Grid */*notnull*/ instance, uint8_t value); /** - *Deallocates a [`Cp437Grid`] instance. - * - * This function is part of the sp_cp437_grid module. + *Deallocates a [Cp437Grid] instance. */ void sp_cp437_grid_free(Cp437Grid */*notnull*/ instance); @@ -1825,8 +1634,6 @@ void sp_cp437_grid_free(Cp437Grid */*notnull*/ instance); * # Panics * * - when accessing `x` or `y` out of bounds - * - * This function is part of the sp_cp437_grid module. */ uint8_t sp_cp437_grid_get(Cp437Grid */*notnull*/ instance, size_t x, size_t y); @@ -1834,8 +1641,6 @@ uint8_t sp_cp437_grid_get(Cp437Grid */*notnull*/ instance, size_t x, size_t y); * Calls [`servicepoint::Cp437Grid::height`]. * * Gets the height of the grid. - * - * This function is part of the sp_cp437_grid module. */ size_t sp_cp437_grid_height(Cp437Grid */*notnull*/ instance); @@ -1845,8 +1650,6 @@ size_t sp_cp437_grid_height(Cp437Grid */*notnull*/ instance); * The provided [Cp437Grid] gets consumed. * * Returns NULL in case of an error. - * - * This function is part of the sp_cp437_grid module. */ struct Packet *sp_cp437_grid_into_packet(Cp437Grid */*notnull*/ grid, size_t x, @@ -1854,8 +1657,6 @@ struct Packet *sp_cp437_grid_into_packet(Cp437Grid */*notnull*/ grid, /** * Loads a [Cp437Grid] with the specified dimensions from the provided data. - * - * This function is part of the sp_cp437_grid module. */ Cp437Grid *sp_cp437_grid_load(size_t width, size_t height, @@ -1865,8 +1666,6 @@ Cp437Grid *sp_cp437_grid_load(size_t width, * Creates a new [Cp437Grid] with the specified dimensions. * * returns: [Cp437Grid] initialized to 0. - * - * This function is part of the sp_cp437_grid module. */ Cp437Grid */*notnull*/ sp_cp437_grid_new(size_t width, size_t height); @@ -1885,8 +1684,6 @@ Cp437Grid */*notnull*/ sp_cp437_grid_new(size_t width, size_t height); * # Panics * * - when accessing `x` or `y` out of bounds - * - * This function is part of the sp_cp437_grid module. */ void sp_cp437_grid_set(Cp437Grid */*notnull*/ instance, size_t x, @@ -1897,22 +1694,16 @@ void sp_cp437_grid_set(Cp437Grid */*notnull*/ instance, * Calls [`servicepoint::Cp437Grid::width`]. * * Gets the width of the grid. - * - * This function is part of the sp_cp437_grid module. */ size_t sp_cp437_grid_width(Cp437Grid */*notnull*/ instance); /** - *Clones a [`Packet`] instance. - * - * This function is part of the sp_packet module. + *Clones a [Packet] instance. */ struct Packet */*notnull*/ sp_packet_clone(struct Packet */*notnull*/ instance); /** - *Deallocates a [`Packet`] instance. - * - * This function is part of the sp_packet module. + *Deallocates a [Packet] instance. */ void sp_packet_free(struct Packet */*notnull*/ instance); @@ -1925,9 +1716,7 @@ struct Packet */*notnull*/ sp_packet_from_parts(struct Header header, struct ByteSlice payload); /** - * Gets the value of field `header` of the [`servicepoint::Packet`]. - * - * This function is part of the sp_packet module. + *Gets the value of field `header` of the [`servicepoint::Packet`]. */ struct Header sp_packet_get_header(struct Packet */*notnull*/ instance); @@ -1958,9 +1747,7 @@ void sp_packet_serialize_to(struct Packet */*notnull*/ packet, struct ByteSlice buffer); /** - * Sets the value of field `header` of the [`servicepoint::Packet`]. - * - * This function is part of the sp_packet module. + *Sets the value of field `header` of the [`servicepoint::Packet`]. */ void sp_packet_set_header(struct Packet */*notnull*/ instance, struct Header value); @@ -1989,9 +1776,7 @@ bool sp_u16_to_command_code(uint16_t code, CommandCode *result); /** - *Deallocates a [`UdpSocket`] instance. - * - * This function is part of the sp_udp module. + *Deallocates a [UdpSocket] instance. */ void sp_udp_free(struct UdpSocket */*notnull*/ instance); diff --git a/src/commands/bitmap_command.rs b/src/commands/bitmap_command.rs index f4c9a7e..3bfcf20 100644 --- a/src/commands/bitmap_command.rs +++ b/src/commands/bitmap_command.rs @@ -1,50 +1,49 @@ use crate::{ - macros::{wrap_clone, wrap_fields, wrap_free, wrap_functions}, + macros::{wrap_clone, wrap_fields, wrap_free}, mem::{heap_move_nonnull, heap_move_ok, heap_remove}, }; use servicepoint::{Bitmap, BitmapCommand, CompressionCode, Origin, Packet}; use std::ptr::NonNull; -wrap_functions!(sp_cmd_bitmap; +/// Sets a window of pixels to the specified values. +/// +/// The passed [Bitmap] gets consumed. +/// +/// Returns: a new [BitmapCommand] instance. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_bitmap_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, + }) +} - /// 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)` +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_bitmap_from_bitmap( + bitmap: NonNull, +) -> NonNull { + heap_move_nonnull(unsafe { heap_remove(bitmap) }.into()) +} - /// 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()) - } - -); +/// Tries to turn a [BitmapCommand] into a [Packet]. +/// +/// Returns: NULL or a [Packet] containing the command. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_bitmap_try_into_packet( + command: NonNull, +) -> *mut Packet { + heap_move_ok(unsafe { heap_remove(command) }.try_into()) +} wrap_clone!(sp_cmd_bitmap::BitmapCommand); wrap_free!(sp_cmd_bitmap::BitmapCommand); diff --git a/src/commands/bitvec_command.rs b/src/commands/bitvec_command.rs index 7dfed38..7ccbf31 100644 --- a/src/commands/bitvec_command.rs +++ b/src/commands/bitvec_command.rs @@ -1,5 +1,5 @@ use crate::{ - macros::{wrap_clone, wrap_fields, wrap_free, wrap_functions}, + macros::{wrap_clone, wrap_fields, wrap_free}, mem::{heap_move_nonnull, heap_move_ok, heap_remove}, }; use servicepoint::{ @@ -8,44 +8,42 @@ use servicepoint::{ }; use std::ptr::NonNull; -wrap_functions!(sp_cmd_bitvec; +/// Set pixel data starting at the pixel offset on screen. +/// +/// The screen will continuously overwrite more pixel data without regarding the offset, meaning +/// once the starting row is full, overwriting will continue on column 0. +/// +/// The [`BinaryOperation`] will be applied on the display comparing old and sent bit. +/// +/// `new_bit = old_bit op sent_bit` +/// +/// For example, [`BinaryOperation::Or`] can be used to turn on some pixels without affecting other pixels. +/// +/// The contained [`DisplayBitVec`] is always uncompressed. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_bitvec_new( + bitvec: NonNull, + offset: usize, + operation: BinaryOperation, + compression: CompressionCode, +) -> NonNull { + heap_move_nonnull(BitVecCommand { + bitvec: unsafe { heap_remove(bitvec) }, + offset, + operation, + compression, + }) +} - /// Set pixel data starting at the pixel offset on screen. - /// - /// The screen will continuously overwrite more pixel data without regarding the offset, meaning - /// once the starting row is full, overwriting will continue on column 0. - /// - /// The [`BinaryOperation`] will be applied on the display comparing old and sent bit. - /// - /// `new_bit = old_bit op sent_bit` - /// - /// For example, [`BinaryOperation::Or`] can be used to turn on some pixels without affecting other pixels. - /// - /// The contained [`DisplayBitVec`] is always uncompressed. - fn new( - bitvec: NonNull, - offset: usize, - operation: BinaryOperation, - compression: CompressionCode, - ) -> NonNull { - heap_move_nonnull(BitVecCommand { - bitvec: unsafe { heap_remove(bitvec) }, - offset, - operation, - compression, - }) - } - - /// Tries to turn a [BitVecCommand] 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()) - } - -); +/// Tries to turn a [BitVecCommand] into a [Packet]. +/// +/// Returns: NULL or a [Packet] containing the command. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_bitvec_try_into_packet( + command: NonNull, +) -> *mut Packet { + heap_move_ok(unsafe { heap_remove(command) }.try_into()) +} wrap_clone!(sp_cmd_bitvec::BitVecCommand); wrap_free!(sp_cmd_bitvec::BitVecCommand); diff --git a/src/commands/brightness_grid_command.rs b/src/commands/brightness_grid_command.rs index b4e6e23..9c5069e 100644 --- a/src/commands/brightness_grid_command.rs +++ b/src/commands/brightness_grid_command.rs @@ -1,46 +1,45 @@ use crate::{ - macros::{wrap_clone, wrap_free, wrap_functions}, + macros::{wrap_clone, wrap_free}, mem::{heap_move_nonnull, heap_move_ok, heap_remove}, }; use servicepoint::{BrightnessGrid, BrightnessGridCommand, Origin, Packet}; use std::ptr::NonNull; -wrap_functions!(sp_cmd_brightness_grid; +/// Set the brightness of individual tiles in a rectangular area of the display. +/// +/// The passed [BrightnessGrid] gets consumed. +/// +/// Returns: a new [BrightnessGridCommand] instance. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_brightness_grid_new( + grid: NonNull, + origin_x: usize, + origin_y: usize, +) -> NonNull { + heap_move_nonnull(BrightnessGridCommand { + grid: unsafe { heap_remove(grid) }, + origin: Origin::new(origin_x, origin_y), + }) +} - /// Set the brightness of individual tiles in a rectangular area of the display. - /// - /// The passed [BrightnessGrid] gets consumed. - /// - /// Returns: a new [BrightnessGridCommand] instance. - fn new( - grid: NonNull, - origin_x: usize, - origin_y: usize, - ) -> NonNull { - heap_move_nonnull(BrightnessGridCommand { - grid: unsafe { heap_remove(grid) }, - origin: Origin::new(origin_x, origin_y), - }) - } +/// Moves the provided [BrightnessGrid] into a new [BrightnessGridCommand], +/// leaving other fields as their default values. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_brightness_grid_from_grid( + grid: NonNull, +) -> NonNull { + heap_move_nonnull(unsafe { heap_remove(grid) }.into()) +} - /// Moves the provided [BrightnessGrid] into a new [BrightnessGridCommand], - /// leaving other fields as their default values. - fn from_grid( - grid: NonNull, - ) -> NonNull { - heap_move_nonnull(unsafe { heap_remove(grid) }.into()) - } - - /// Tries to turn a [BrightnessGridCommand] into a [Packet]. - /// - /// Returns: NULL or a [Packet] containing the command. - fn into_packet( - command: NonNull, - ) -> *mut Packet { - heap_move_ok(unsafe { heap_remove(command) }.try_into()) - } - -); +/// Tries to turn a [BrightnessGridCommand] into a [Packet]. +/// +/// Returns: NULL or a [Packet] containing the command. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_brightness_grid_into_packet( + command: NonNull, +) -> *mut Packet { + heap_move_ok(unsafe { heap_remove(command) }.try_into()) +} wrap_clone!(sp_cmd_brightness_grid::BrightnessGridCommand); wrap_free!(sp_cmd_brightness_grid::BrightnessGridCommand); diff --git a/src/commands/cc_only_commands.rs b/src/commands/cc_only_commands.rs index 234b781..fc73303 100644 --- a/src/commands/cc_only_commands.rs +++ b/src/commands/cc_only_commands.rs @@ -1,43 +1,37 @@ -use crate::{ - macros::{wrap_free, wrap_functions}, - mem::heap_move_nonnull, -}; +use crate::{macros::wrap_free, mem::heap_move_nonnull}; use servicepoint::{ClearCommand, FadeOutCommand, HardResetCommand}; use std::ptr::NonNull; -wrap_functions!(sp_cmd_clear; - /// Set all pixels to the off state. - /// - /// Does not affect brightness. - /// - /// Returns: a new [ClearCommand] instance. - fn new() -> NonNull { - heap_move_nonnull(ClearCommand) - } -); +/// Set all pixels to the off state. +/// +/// Does not affect brightness. +/// +/// Returns: a new [ClearCommand] instance. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_clear_new() -> NonNull { + heap_move_nonnull(ClearCommand) +} wrap_free!(sp_cmd_clear::ClearCommand); -wrap_functions!(sp_cmd_hard_reset; - /// Kills the udp daemon on the display, which usually results in a restart. - /// - /// Please do not send this in your normal program flow. - /// - /// Returns: a new [HardResetCommand] instance. - fn new() -> NonNull { - heap_move_nonnull(HardResetCommand) - } -); +/// Kills the udp daemon on the display, which usually results in a restart. +/// +/// Please do not send this in your normal program flow. +/// +/// Returns: a new [HardResetCommand] instance. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_hard_reset_new() -> NonNull { + heap_move_nonnull(HardResetCommand) +} wrap_free!(sp_cmd_hard_reset::HardResetCommand); -wrap_functions!(sp_cmd_fade_out; - /// A yet-to-be-tested command. - /// - /// Returns: a new [FadeOutCommand] instance. - fn new() -> NonNull { - heap_move_nonnull(FadeOutCommand) - } -); +/// A yet-to-be-tested command. +/// +/// Returns: a new [FadeOutCommand] instance. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_fade_out_new() -> NonNull { + heap_move_nonnull(FadeOutCommand) +} wrap_free!(sp_cmd_fade_out::FadeOutCommand); diff --git a/src/commands/char_grid_command.rs b/src/commands/char_grid_command.rs index 0ef90c0..b895718 100644 --- a/src/commands/char_grid_command.rs +++ b/src/commands/char_grid_command.rs @@ -1,46 +1,45 @@ use crate::{ - macros::{wrap_clone, wrap_free, wrap_functions}, + macros::{wrap_clone, wrap_free}, mem::{heap_move_nonnull, heap_move_ok, heap_remove}, }; use servicepoint::{CharGrid, CharGridCommand, Origin, Packet}; use std::ptr::NonNull; -wrap_functions!(sp_cmd_char_grid; +/// Show UTF-8 encoded text on the screen. +/// +/// The passed [CharGrid] gets consumed. +/// +/// Returns: a new [CharGridCommand] instance. +#[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), + }) +} - /// Show UTF-8 encoded text on the screen. - /// - /// The passed [CharGrid] gets consumed. - /// - /// Returns: a new [CharGridCommand] instance. - fn 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), - }) - } +/// Moves the provided [CharGrid] into a new [CharGridCommand], +/// leaving other fields as their default values. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_char_grid_from_grid( + grid: NonNull, +) -> NonNull { + heap_move_nonnull(unsafe { heap_remove(grid) }.into()) +} - /// Moves the provided [CharGrid] into a new [CharGridCommand], - /// leaving other fields as their default values. - fn from_grid( - grid: NonNull, - ) -> NonNull { - heap_move_nonnull(unsafe { heap_remove(grid) }.into()) - } - - /// Tries to turn a [CharGridCommand] 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()) - } - -); +/// Tries to turn a [CharGridCommand] into a [Packet]. +/// +/// Returns: NULL or a [Packet] containing the command. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_char_grid_try_into_packet( + command: NonNull, +) -> *mut Packet { + heap_move_ok(unsafe { heap_remove(command) }.try_into()) +} wrap_clone!(sp_cmd_char_grid::CharGridCommand); wrap_free!(sp_cmd_char_grid::CharGridCommand); @@ -60,8 +59,8 @@ pub unsafe extern "C" fn sp_cmd_char_grid_set( #[no_mangle] pub unsafe extern "C" fn sp_cmd_char_grid_get( mut command: NonNull, -) -> NonNull { - unsafe { NonNull::from(&mut command.as_mut().grid) } +) -> *mut CharGrid { + unsafe { &mut command.as_mut().grid } } /// Reads the origin field of the [CharGridCommand]. diff --git a/src/commands/cp437_grid_command.rs b/src/commands/cp437_grid_command.rs index da8380a..3f1fa9f 100644 --- a/src/commands/cp437_grid_command.rs +++ b/src/commands/cp437_grid_command.rs @@ -1,46 +1,45 @@ use crate::{ - macros::{wrap_clone, wrap_free, wrap_functions}, + macros::{wrap_clone, wrap_free}, mem::{heap_move_nonnull, heap_move_ok, heap_remove}, }; use servicepoint::{Cp437Grid, Cp437GridCommand, Origin, Packet}; use std::ptr::NonNull; -wrap_functions!(sp_cmd_cp437_grid; +/// Show text on the screen. +/// +/// The text is sent in the form of a 2D grid of [CP-437] encoded characters. +/// +/// The origin is relative to the top-left of the display. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_cp437_grid_new( + grid: NonNull, + origin_x: usize, + origin_y: usize, +) -> NonNull { + heap_move_nonnull(Cp437GridCommand { + grid: unsafe { heap_remove(grid) }, + origin: Origin::new(origin_x, origin_y), + }) +} - /// Show text on the screen. - /// - /// The text is sent in the form of a 2D grid of [CP-437] encoded characters. - /// - /// The origin is relative to the top-left of the display. - fn new( - grid: NonNull, - origin_x: usize, - origin_y: usize, - ) -> NonNull { - heap_move_nonnull(Cp437GridCommand { - grid: unsafe { heap_remove(grid) }, - origin: Origin::new(origin_x, origin_y), - }) - } +/// Moves the provided [Cp437Grid] into a new [Cp437GridCommand], +/// leaving other fields as their default values. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_cp437_grid_from_grid( + grid: NonNull, +) -> NonNull { + heap_move_nonnull(unsafe { heap_remove(grid) }.into()) +} - /// Moves the provided [Cp437Grid] into a new [Cp437GridCommand], - /// leaving other fields as their default values. - fn from_grid( - grid: NonNull, - ) -> NonNull { - heap_move_nonnull(unsafe { heap_remove(grid) }.into()) - } - - /// Tries to turn a [Cp437GridCommand] 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()) - } - -); +/// Tries to turn a [Cp437GridCommand] into a [Packet]. +/// +/// Returns: NULL or a [Packet] containing the command. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_cp437_grid_try_into_packet( + command: NonNull, +) -> *mut Packet { + heap_move_ok(unsafe { heap_remove(command) }.try_into()) +} wrap_clone!(sp_cmd_cp437_grid::Cp437GridCommand); wrap_free!(sp_cmd_cp437_grid::Cp437GridCommand); diff --git a/src/commands/global_brightness_command.rs b/src/commands/global_brightness_command.rs index 35bcbe0..e695ef0 100644 --- a/src/commands/global_brightness_command.rs +++ b/src/commands/global_brightness_command.rs @@ -1,25 +1,26 @@ use crate::{ - macros::{wrap_clone, wrap_fields, wrap_free, wrap_functions}, + macros::{wrap_clone, wrap_fields, wrap_free}, mem::{heap_move_nonnull, heap_remove}, }; use servicepoint::{Brightness, GlobalBrightnessCommand, Packet}; use std::ptr::NonNull; -wrap_functions!(sp_cmd_brightness_global; +/// Set the brightness of all tiles to the same value. +/// +/// Returns: a new [GlobalBrightnessCommand] instance. +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_brightness_global_new( + brightness: Brightness, +) -> NonNull { + heap_move_nonnull(GlobalBrightnessCommand::from(brightness)) +} - /// Set the brightness of all tiles to the same value. - /// - /// Returns: a new [GlobalBrightnessCommand] instance. - fn new(brightness: Brightness) -> NonNull { - heap_move_nonnull(GlobalBrightnessCommand::from(brightness)) - } - - /// Turns the command into a packet - fn into_packet(command: NonNull) -> NonNull { - heap_move_nonnull(unsafe { heap_remove(command) }.into()) - } - -); +#[no_mangle] +pub unsafe extern "C" fn sp_cmd_brightness_global_into_packet( + command: NonNull, +) -> NonNull { + heap_move_nonnull(unsafe { heap_remove(command) }.into()) +} wrap_clone!(sp_cmd_brightness_global::GlobalBrightnessCommand); wrap_free!(sp_cmd_brightness_global::GlobalBrightnessCommand); diff --git a/src/containers/bitmap.rs b/src/containers/bitmap.rs index 6d502d9..9b96d10 100644 --- a/src/containers/bitmap.rs +++ b/src/containers/bitmap.rs @@ -1,6 +1,6 @@ use crate::{ containers::ByteSlice, - macros::{wrap_clone, wrap_free, wrap_functions, wrap_methods}, + macros::{wrap_clone, wrap_free, wrap_method}, mem::{heap_move_nonnull, heap_move_ok, heap_move_some, heap_remove}, }; use servicepoint::{ @@ -9,105 +9,82 @@ use servicepoint::{ }; use std::ptr::NonNull; +/// Creates a new [Bitmap] with the specified dimensions. +/// +/// # Arguments +/// +/// - `width`: size in pixels in x-direction +/// - `height`: size in pixels in y-direction +/// +/// returns: [Bitmap] initialized to all pixels off, or NULL in case of an error. +/// +/// # Errors +/// +/// In the following cases, this function will return NULL: +/// +/// - when the width is not dividable by 8 +/// +/// # Examples +/// +/// ```C +/// Cp437Grid grid = sp_bitmap_new(8, 3); +/// sp_bitmap_fill(grid, true); +/// sp_bitmap_set(grid, 0, 0, false); +/// sp_bitmap_free(grid); +/// ``` +#[no_mangle] +pub unsafe extern "C" fn sp_bitmap_new( + width: usize, + height: usize, +) -> *mut Bitmap { + heap_move_some(Bitmap::new(width, height)) +} + +/// Creates a new [Bitmap] with a size matching the screen. +/// +/// returns: [Bitmap] initialized to all pixels off. +#[no_mangle] +pub unsafe extern "C" fn sp_bitmap_new_max_sized() -> NonNull { + heap_move_nonnull(Bitmap::max_sized()) +} + +/// Loads a [Bitmap] with the specified dimensions from the provided data. +/// +/// # Arguments +/// +/// - `width`: size in pixels in x-direction +/// - `height`: size in pixels in y-direction +/// +/// returns: [Bitmap] that contains a copy of the provided data, or NULL in case of an error. +#[no_mangle] +pub unsafe extern "C" fn sp_bitmap_load( + width: usize, + height: usize, + data: ByteSlice, +) -> *mut Bitmap { + let data = unsafe { data.as_slice() }; + heap_move_ok(Bitmap::load(width, height, data)) +} + +/// 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, +) -> *mut Bitmap { + let bitvec = unsafe { heap_remove(bitvec) }; + heap_move_ok(Bitmap::from_bitvec(width, bitvec)) +} + wrap_clone!(sp_bitmap::Bitmap); wrap_free!(sp_bitmap::Bitmap); -wrap_functions!(sp_bitmap; - - /// Creates a new [Bitmap] with the specified dimensions. - /// - /// # Arguments - /// - /// - `width`: size in pixels in x-direction - /// - `height`: size in pixels in y-direction - /// - /// returns: [Bitmap] initialized to all pixels off, or NULL in case of an error. - /// - /// # Errors - /// - /// In the following cases, this function will return NULL: - /// - /// - when the width is not dividable by 8 - /// - /// # Examples - /// - /// ```C - /// Cp437Grid grid = sp_bitmap_new(8, 3); - /// sp_bitmap_fill(grid, true); - /// sp_bitmap_set(grid, 0, 0, false); - /// sp_bitmap_free(grid); - /// ``` - fn new(width: usize, height: usize) -> *mut Bitmap { - heap_move_some(Bitmap::new(width, height)) - } - - /// Creates a new [Bitmap] with a size matching the screen. - /// - /// returns: [Bitmap] initialized to all pixels off. - fn new_max_sized() -> NonNull { - heap_move_nonnull(Bitmap::max_sized()) - } - - /// Loads a [Bitmap] with the specified dimensions from the provided data. - /// - /// # Arguments - /// - /// - `width`: size in pixels in x-direction - /// - `height`: size in pixels in y-direction - /// - /// returns: [Bitmap] that contains a copy of the provided data, or NULL in case of an error. - fn load( - width: usize, - height: usize, - data: ByteSlice, - ) -> *mut Bitmap { - let data = unsafe { data.as_slice() }; - heap_move_ok(Bitmap::load(width, height, data)) - } - - /// Tries to convert the BitVec to a Bitmap. - /// - /// The provided BitVec gets consumed. - /// - /// Returns NULL in case of error. - fn from_bitvec( - width: usize, - bitvec: NonNull, - ) -> *mut Bitmap { - let bitvec = unsafe { heap_remove(bitvec) }; - heap_move_ok(Bitmap::from_bitvec(width, bitvec)) - } - /// Consumes the Bitmap and returns the contained BitVec. - fn into_bitvec( - bitmap: NonNull - ) -> NonNull { - let bitmap = unsafe { heap_remove(bitmap) }; - heap_move_nonnull(bitmap.into()) - } - - /// Creates a [BitmapCommand] and immediately turns that into a [Packet]. - /// - /// The provided [Bitmap] gets consumed. - /// - /// Returns NULL in case of an error. - fn into_packet( - bitmap: NonNull, - x: usize, - y: usize, - compression: CompressionCode, - ) -> *mut Packet { - let bitmap = unsafe { heap_remove(bitmap) }; - heap_move_ok(Packet::try_from(BitmapCommand { - bitmap, - origin: Origin::new(x, y), - compression, - })) - } -); - -wrap_methods!( +wrap_method!( sp_bitmap::Bitmap; - /// Gets the current value at the specified position. /// /// # Arguments @@ -118,7 +95,10 @@ wrap_methods!( /// /// - when accessing `x` or `y` out of bounds ref fn get(x: usize, y: usize) -> bool; +); +wrap_method!( + sp_bitmap::Bitmap; /// Sets the value of the specified position. /// /// # Arguments @@ -130,25 +110,64 @@ wrap_methods!( /// /// - when accessing `x` or `y` out of bounds mut fn set(x: usize, y: usize, value: bool); +); +wrap_method!( + sp_bitmap::Bitmap; /// Sets the state of all pixels in the [Bitmap]. /// /// # Arguments /// /// - `value`: the value to set all pixels to mut fn fill(value: bool); +); +wrap_method!( + sp_bitmap::Bitmap; /// Gets the width in pixels. ref fn width() -> usize; +); +wrap_method!( + sp_bitmap::Bitmap; /// Gets the height in pixels. ref fn height() -> usize; +); +wrap_method!( + sp_bitmap::Bitmap; /// Gets an unsafe reference to the data of the [Bitmap] instance. /// /// The returned memory is valid for the lifetime of the bitmap. - mut fn data_ref_mut() -> ByteSlice { - - return(slice) { unsafe { ByteSlice::from_slice(slice) } }; - }; + mut fn data_ref_mut() -> ByteSlice; + |slice| unsafe { ByteSlice::from_slice(slice) }; ); + +/// 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 { heap_remove(bitmap) }; + heap_move_nonnull(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, + x: usize, + y: usize, + compression: CompressionCode, +) -> *mut Packet { + let bitmap = unsafe { heap_remove(bitmap) }; + heap_move_ok(Packet::try_from(BitmapCommand { + bitmap, + origin: Origin::new(x, y), + compression, + })) +} diff --git a/src/containers/bitvec.rs b/src/containers/bitvec.rs index e232ab5..aad2a88 100644 --- a/src/containers/bitvec.rs +++ b/src/containers/bitvec.rs @@ -1,6 +1,6 @@ use crate::{ containers::ByteSlice, - macros::{wrap_clone, wrap_free, wrap_functions, wrap_methods}, + macros::{wrap_clone, wrap_free, wrap_method}, mem::{heap_move_nonnull, heap_move_ok, heap_remove}, }; use servicepoint::{ @@ -8,59 +8,38 @@ use servicepoint::{ }; use std::ptr::NonNull; -wrap_functions!(sp_bitvec; +/// Creates a new [DisplayBitVec] instance. +/// +/// # Arguments +/// +/// - `size`: size in bits. +/// +/// returns: [DisplayBitVec] with all bits set to false. +/// +/// # Panics +/// +/// - when `size` is not divisible by 8. +#[no_mangle] +pub unsafe extern "C" fn sp_bitvec_new(size: usize) -> NonNull { + heap_move_nonnull(DisplayBitVec::repeat(false, size)) +} - /// Creates a new [DisplayBitVec] instance. - /// - /// # Arguments - /// - /// - `size`: size in bits. - /// - /// returns: [DisplayBitVec] with all bits set to false. - /// - /// # Panics - /// - /// - when `size` is not divisible by 8. - fn new(size: usize) -> NonNull { - heap_move_nonnull(DisplayBitVec::repeat(false, size)) - } - - /// Interpret the data as a series of bits and load then into a new [DisplayBitVec] instance. - /// - /// returns: [DisplayBitVec] instance containing data. - fn load(data: ByteSlice) -> NonNull { - let data = unsafe { data.as_slice() }; - heap_move_nonnull(DisplayBitVec::from_slice(data)) - } - - /// Creates a [BitVecCommand] and immediately turns that into a [Packet]. - /// - /// The provided [DisplayBitVec] gets consumed. - /// - /// Returns NULL in case of an error. - fn into_packet( - bitvec: NonNull, - offset: usize, - operation: BinaryOperation, - compression: CompressionCode, - ) -> *mut Packet { - let bitvec = unsafe { heap_remove(bitvec) }; - heap_move_ok(Packet::try_from(BitVecCommand { - bitvec, - offset, - operation, - compression, - })) - } - -); +/// Interpret the data as a series of bits and load then into a new [DisplayBitVec] instance. +/// +/// returns: [DisplayBitVec] instance containing data. +#[no_mangle] +pub unsafe extern "C" fn sp_bitvec_load( + data: ByteSlice, +) -> NonNull { + let data = unsafe { data.as_slice() }; + heap_move_nonnull(DisplayBitVec::from_slice(data)) +} wrap_clone!(sp_bitvec::DisplayBitVec); wrap_free!(sp_bitvec::DisplayBitVec); -wrap_methods!( +wrap_method!( sp_bitvec::DisplayBitVec; - /// Gets the value of a bit. /// /// # Arguments @@ -73,11 +52,12 @@ wrap_methods!( /// # Panics /// /// - when accessing `index` out of bounds - ref fn get(index: usize) -> bool { - return(result) { result.map(|x| *x).unwrap_or(false) }; - }; - + ref fn get(index: usize) -> bool; + |result| result.map(|x| *x).unwrap_or(false); +); +wrap_method!( + sp_bitvec::DisplayBitVec; /// Sets the value of a bit. /// /// # Arguments @@ -89,24 +69,56 @@ wrap_methods!( /// /// - when accessing `index` out of bounds mut fn set(index: usize, value: bool); +); +wrap_method!( + sp_bitvec::DisplayBitVec; /// Sets the value of all bits. /// /// # Arguments /// /// - `value`: the value to set all bits to mut fn fill(value: bool); +); +wrap_method!( + sp_bitvec::DisplayBitVec; /// Gets the length in bits. ref fn len() -> usize; +); +wrap_method!( + sp_bitvec::DisplayBitVec; /// Returns true if length is 0. ref fn is_empty() -> bool; +); +wrap_method!( + sp_bitvec::DisplayBitVec; /// Gets an unsafe reference to the data of the [DisplayBitVec] instance. /// /// The returned memory is valid for the lifetime of the bitvec. - mut fn as_raw_mut_slice() -> ByteSlice { - return(slice) { unsafe { ByteSlice::from_slice(slice) } }; - }; + mut fn as_raw_mut_slice() -> ByteSlice; + |slice| unsafe { ByteSlice::from_slice(slice) }; ); + +/// Creates a [BitVecCommand] and immediately turns that into a [Packet]. +/// +/// The provided [DisplayBitVec] gets consumed. +/// +/// Returns NULL in case of an error. +#[no_mangle] +pub unsafe extern "C" fn sp_bitvec_into_packet( + bitvec: NonNull, + offset: usize, + operation: BinaryOperation, + compression: CompressionCode, +) -> *mut Packet { + let bitvec = unsafe { heap_remove(bitvec) }; + heap_move_ok(Packet::try_from(BitVecCommand { + bitvec, + offset, + operation, + compression, + })) +} diff --git a/src/containers/brightness_grid.rs b/src/containers/brightness_grid.rs index 2374b47..54491c2 100644 --- a/src/containers/brightness_grid.rs +++ b/src/containers/brightness_grid.rs @@ -1,7 +1,6 @@ -use crate::macros::wrap_functions; use crate::{ containers::ByteSlice, - macros::{wrap_clone, wrap_free, wrap_methods}, + macros::{wrap_clone, wrap_free, wrap_method}, mem::{heap_move_nonnull, heap_move_ok, heap_move_some, heap_remove}, }; use servicepoint::{ @@ -10,74 +9,54 @@ use servicepoint::{ }; use std::{mem::transmute, ptr::NonNull}; -wrap_functions!(sp_brightness_grid; +/// Creates a new [BrightnessGrid] with the specified dimensions. +/// +/// returns: [BrightnessGrid] initialized to 0. +/// +/// # Examples +/// ```C +/// UdpSocket *connection = sp_udp_open("127.0.0.1:2342"); +/// if (connection == NULL) +/// return 1; +/// +/// BrightnessGrid *grid = sp_brightness_grid_new(2, 2); +/// sp_brightness_grid_set(grid, 0, 0, 0); +/// sp_brightness_grid_set(grid, 1, 1, 10); +/// +/// TypedCommand *command = sp_command_char_brightness(grid); +/// sp_udp_free(connection); +/// ``` +#[no_mangle] +pub unsafe extern "C" fn sp_brightness_grid_new( + width: usize, + height: usize, +) -> NonNull { + heap_move_nonnull(BrightnessGrid::new(width, height)) +} - /// Creates a new [BrightnessGrid] with the specified dimensions. - /// - /// returns: [BrightnessGrid] initialized to 0. - /// - /// # Examples - /// ```C - /// UdpSocket *connection = sp_udp_open("127.0.0.1:2342"); - /// if (connection == NULL) - /// return 1; - /// - /// BrightnessGrid *grid = sp_brightness_grid_new(2, 2); - /// sp_brightness_grid_set(grid, 0, 0, 0); - /// sp_brightness_grid_set(grid, 1, 1, 10); - /// - /// TypedCommand *command = sp_command_char_brightness(grid); - /// sp_udp_free(connection); - /// ``` - fn new( - width: usize, - height: usize, - ) -> NonNull { - heap_move_nonnull(BrightnessGrid::new(width, height)) - } - - /// 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. - fn load( - width: usize, - height: usize, - data: ByteSlice, - ) -> *mut BrightnessGrid { - let data = unsafe { data.as_slice() }; - heap_move_some( - ByteGrid::load(width, height, data) - .map(move |grid| grid.map(Brightness::saturating_from)), - ) - } - - /// Creates a [BrightnessGridCommand] and immediately turns that into a [Packet]. - /// - /// The provided [BrightnessGrid] gets consumed. - /// - /// Returns NULL in case of an error. - fn into_packet( - grid: NonNull, - x: usize, - y: usize, - ) -> *mut Packet { - let grid = unsafe { heap_remove(grid) }; - heap_move_ok(Packet::try_from(BrightnessGridCommand { - grid, - origin: Origin::new(x, y), - })) - } - -); +/// 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. +#[no_mangle] +pub unsafe extern "C" fn sp_brightness_grid_load( + width: usize, + height: usize, + data: ByteSlice, +) -> *mut BrightnessGrid { + let data = unsafe { data.as_slice() }; + heap_move_some( + ByteGrid::load(width, height, data) + .map(move |grid| grid.map(Brightness::saturating_from)), + ) +} wrap_clone!(sp_brightness_grid::BrightnessGrid); wrap_free!(sp_brightness_grid::BrightnessGrid); -wrap_methods!( +wrap_method!( sp_brightness_grid::BrightnessGrid; - /// Gets the current value at the specified position. /// /// # Arguments @@ -89,7 +68,10 @@ wrap_methods!( /// # Panics /// - When accessing `x` or `y` out of bounds. ref fn get(x: usize, y: usize) -> Brightness; +); +wrap_method!( + sp_brightness_grid::BrightnessGrid; /// Sets the value of the specified position. /// /// # Arguments @@ -103,29 +85,58 @@ wrap_methods!( /// /// - When accessing `x` or `y` out of bounds. mut fn set(x: usize, y: usize, value: Brightness); +); +wrap_method!( + sp_brightness_grid::BrightnessGrid; /// Sets the value of all cells. /// /// # Arguments /// /// - `value`: the value to set all cells to mut fn fill(value: Brightness); +); +wrap_method!( + sp_brightness_grid::BrightnessGrid; /// Gets the width of the grid. ref fn width() -> usize; +); +wrap_method!( + sp_brightness_grid::BrightnessGrid; /// Gets the height of the grid. ref fn height() -> usize; +); +wrap_method!( + sp_brightness_grid::BrightnessGrid; /// Gets an unsafe reference to the data of the instance. /// /// The returned memory is valid for the lifetime of the grid. - mut fn data_ref_mut() -> ByteSlice { - return(br_slice) { unsafe { - //noinspection RsAssertEqual - const _: () = assert!(size_of::() == 1); + mut fn data_ref_mut() -> ByteSlice; + |br_slice| unsafe { + //noinspection RsAssertEqual + const _: () = assert!(size_of::() == 1); - ByteSlice::from_slice(transmute::<&mut [Brightness], &mut [u8]>(br_slice)) - }}; + ByteSlice::from_slice(transmute::<&mut [Brightness], &mut [u8]>(br_slice)) }; ); + +/// 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, + x: usize, + y: usize, +) -> *mut Packet { + let grid = unsafe { heap_remove(grid) }; + heap_move_ok(Packet::try_from(BrightnessGridCommand { + grid, + origin: Origin::new(x, y), + })) +} diff --git a/src/containers/char_grid.rs b/src/containers/char_grid.rs index 782e2aa..5db7897 100644 --- a/src/containers/char_grid.rs +++ b/src/containers/char_grid.rs @@ -1,69 +1,49 @@ use crate::{ containers::ByteSlice, - macros::{wrap_clone, wrap_free, wrap_functions, wrap_methods}, + macros::{wrap_clone, wrap_free, wrap_method}, mem::{heap_move_nonnull, heap_move_ok, heap_remove}, }; use servicepoint::{CharGrid, CharGridCommand, Grid, Origin, Packet}; use std::ptr::NonNull; -wrap_functions!(sp_char_grid; +/// Creates a new [CharGrid] with the specified dimensions. +/// +/// returns: [CharGrid] initialized to 0. +/// +/// # Examples +/// +/// ```C +/// CharGrid grid = sp_char_grid_new(4, 3); +/// sp_char_grid_fill(grid, '?'); +/// sp_char_grid_set(grid, 0, 0, '!'); +/// sp_char_grid_free(grid); +/// ``` +#[no_mangle] +pub unsafe extern "C" fn sp_char_grid_new( + width: usize, + height: usize, +) -> NonNull { + heap_move_nonnull(CharGrid::new(width, height)) +} - /// Creates a new [CharGrid] with the specified dimensions. - /// - /// returns: [CharGrid] initialized to 0. - /// - /// # Examples - /// - /// ```C - /// CharGrid grid = sp_char_grid_new(4, 3); - /// sp_char_grid_fill(grid, '?'); - /// sp_char_grid_set(grid, 0, 0, '!'); - /// sp_char_grid_free(grid); - /// ``` - fn new( - width: usize, - height: usize, - ) -> NonNull { - heap_move_nonnull(CharGrid::new(width, height)) - } - - /// Loads a [CharGrid] with the specified dimensions from the provided data. - /// - /// returns: new CharGrid or NULL in case of an error - fn load( - width: usize, - height: usize, - data: ByteSlice, - ) -> *mut CharGrid { - let data = unsafe { data.as_slice() }; - heap_move_ok(CharGrid::load_utf8(width, height, data.to_vec())) - } - - /// Creates a [CharGridCommand] and immediately turns that into a [Packet]. - /// - /// The provided [CharGrid] gets consumed. - /// - /// Returns NULL in case of an error. - fn into_packet( - grid: NonNull, - x: usize, - y: usize, - ) -> *mut Packet { - let grid = unsafe { heap_remove(grid) }; - heap_move_ok(Packet::try_from(CharGridCommand { - grid, - origin: Origin::new(x, y), - })) - } - -); +/// Loads a [CharGrid] with the specified dimensions from the provided data. +/// +/// returns: new CharGrid or NULL in case of an error +#[no_mangle] +pub unsafe extern "C" fn sp_char_grid_load( + width: usize, + height: usize, + data: ByteSlice, +) -> *mut CharGrid { + let data = unsafe { data.as_slice() }; + heap_move_ok(CharGrid::load_utf8(width, height, data.to_vec())) +} wrap_clone!(sp_char_grid::CharGrid); wrap_free!(sp_char_grid::CharGrid); -wrap_methods!( +wrap_method!( sp_char_grid::CharGrid; - /// Returns the current value at the specified position. /// /// # Arguments @@ -73,10 +53,12 @@ wrap_methods!( /// # Panics /// /// - when accessing `x` or `y` out of bounds - ref fn get(x: usize, y: usize) -> u32 { - return(char) { char as u32 }; - }; + ref fn get(x: usize, y: usize) -> u32; + | char | char as u32 +); +wrap_method!( + sp_char_grid::CharGrid; /// Sets the value of the specified position in the grid. /// /// # Arguments @@ -90,23 +72,48 @@ wrap_methods!( /// /// - when accessing `x` or `y` out of bounds /// - when providing values that cannot be converted to Rust's `char`. - mut fn set(x: usize, y: usize, value: u32) { - prepare(value) { char::from_u32(value).unwrap() }; - }; + mut fn set(x: usize, y: usize, value: u32); + let value = char::from_u32(value).unwrap(); +); +wrap_method!( + sp_char_grid::CharGrid; /// Sets the value of all cells in the grid. /// /// # Arguments /// /// - `value`: the value to set all cells to /// - when providing values that cannot be converted to Rust's `char`. - mut fn fill(value: u32) { - prepare(value) { char::from_u32(value).unwrap() }; - }; + mut fn fill(value: u32); + let value = char::from_u32(value).unwrap(); +); +wrap_method!( + sp_char_grid::CharGrid; /// Gets the width of the grid. ref fn width() -> usize; +); +wrap_method!( + sp_char_grid::CharGrid; /// Gets the height of the grid. ref fn height() -> usize; ); + +/// 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, + x: usize, + y: usize, +) -> *mut Packet { + let grid = unsafe { heap_remove(grid) }; + heap_move_ok(Packet::try_from(CharGridCommand { + grid, + origin: Origin::new(x, y), + })) +} diff --git a/src/containers/cp437_grid.rs b/src/containers/cp437_grid.rs index 2ed9aba..5d7b84f 100644 --- a/src/containers/cp437_grid.rs +++ b/src/containers/cp437_grid.rs @@ -1,7 +1,6 @@ -use crate::macros::wrap_functions; use crate::{ containers::ByteSlice, - macros::{wrap_clone, wrap_free, wrap_methods}, + macros::{wrap_clone, wrap_free, wrap_method}, mem::{heap_move_nonnull, heap_move_ok, heap_move_some, heap_remove}, }; use servicepoint::{ @@ -9,51 +8,32 @@ use servicepoint::{ }; use std::ptr::NonNull; -wrap_functions!(sp_cp437_grid; +/// Creates a new [Cp437Grid] with the specified dimensions. +/// +/// returns: [Cp437Grid] initialized to 0. +#[no_mangle] +pub unsafe extern "C" fn sp_cp437_grid_new( + width: usize, + height: usize, +) -> NonNull { + heap_move_nonnull(Cp437Grid::new(width, height)) +} - /// Creates a new [Cp437Grid] with the specified dimensions. - /// - /// returns: [Cp437Grid] initialized to 0. - fn new( - width: usize, - height: usize, - ) -> NonNull { - heap_move_nonnull(Cp437Grid::new(width, height)) - } - - /// Loads a [Cp437Grid] with the specified dimensions from the provided data. - fn load( - width: usize, - height: usize, - data: ByteSlice, - ) -> *mut Cp437Grid { - let data = unsafe { data.as_slice() }; - heap_move_some(Cp437Grid::load(width, height, data)) - } - - /// Creates a [Cp437GridCommand] and immediately turns that into a [Packet]. - /// - /// The provided [Cp437Grid] gets consumed. - /// - /// Returns NULL in case of an error. - fn into_packet( - grid: NonNull, - x: usize, - y: usize, - ) -> *mut Packet { - let grid = unsafe { heap_remove(grid) }; - heap_move_ok(Packet::try_from(Cp437GridCommand { - grid, - origin: Origin::new(x, y), - })) - } - -); +/// Loads a [Cp437Grid] with the specified dimensions from the provided data. +#[no_mangle] +pub unsafe extern "C" fn sp_cp437_grid_load( + width: usize, + height: usize, + data: ByteSlice, +) -> *mut Cp437Grid { + let data = unsafe { data.as_slice() }; + heap_move_some(Cp437Grid::load(width, height, data)) +} wrap_clone!(sp_cp437_grid::Cp437Grid); wrap_free!(sp_cp437_grid::Cp437Grid); -wrap_methods!( +wrap_method!( sp_cp437_grid::Cp437Grid; /// Gets the current value at the specified position. /// @@ -65,7 +45,10 @@ wrap_methods!( /// /// - when accessing `x` or `y` out of bounds ref fn get(x: usize, y: usize) -> u8; +); +wrap_method!( + sp_cp437_grid::Cp437Grid; /// Sets the value at the specified position. /// /// # Arguments @@ -79,7 +62,10 @@ wrap_methods!( /// /// - when accessing `x` or `y` out of bounds mut fn set(x: usize, y: usize, value: u8); +); +wrap_method!( + sp_cp437_grid::Cp437Grid; /// Sets the value of all cells in the grid. /// /// # Arguments @@ -87,17 +73,43 @@ wrap_methods!( /// - `cp437_grid`: instance to write to /// - `value`: the value to set all cells to mut fn fill(value: u8); +); +wrap_method!( + sp_cp437_grid::Cp437Grid; /// Gets the width of the grid. ref fn width() -> usize; +); +wrap_method!( + sp_cp437_grid::Cp437Grid; /// Gets the height of the grid. ref fn height() -> usize; +); +wrap_method!( + sp_cp437_grid::Cp437Grid; /// Gets an unsafe reference to the data of the grid. /// /// The returned memory is valid for the lifetime of the instance. - mut fn data_ref_mut() -> ByteSlice { - return(slice) { unsafe { ByteSlice::from_slice(slice) } }; - }; + mut fn data_ref_mut() -> ByteSlice; + | slice | unsafe { ByteSlice::from_slice(slice) }; ); + +/// 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, + x: usize, + y: usize, +) -> *mut Packet { + let grid = unsafe { heap_remove(grid) }; + heap_move_ok(Packet::try_from(Cp437GridCommand { + grid, + origin: Origin::new(x, y), + })) +} diff --git a/src/macros.rs b/src/macros.rs index 8d4ba47..df21e23 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -1,22 +1,24 @@ macro_rules! wrap_free { ($prefix:ident :: $typ:ty) => { - $crate::macros::wrap_functions!($prefix; - #[doc = concat!("Deallocates a [`", stringify!($typ), "`] instance.")] - fn free(instance: NonNull<$typ>) { + paste::paste! { + #[doc = concat!("Deallocates a [", stringify!($typ), "] instance.")] + #[no_mangle] + pub unsafe extern "C" fn [<$prefix _free>](instance: NonNull<$typ>) { unsafe { $crate::mem::heap_drop(instance) } } - ); + } }; } macro_rules! wrap_clone { ($prefix:ident :: $typ:ty) => { - $crate::macros::wrap_functions!($prefix; - #[doc = concat!("Clones a [`", stringify!($typ), "`] instance.")] - fn clone(instance: NonNull<$typ>) -> NonNull<$typ> { + paste::paste! { + #[doc = concat!("Clones a [", stringify!($typ), "] instance.")] + #[no_mangle] + pub unsafe extern "C" fn [<$prefix _clone>](instance: NonNull<$typ>) -> NonNull<$typ> { unsafe { $crate::mem::heap_clone(instance) } } - ); + } }; } @@ -33,49 +35,39 @@ macro_rules! nonnull_as_mut { } // meta required on purpose, because otherwise the added documentation would suppress warnings -macro_rules! wrap_methods { +macro_rules! wrap_method { ( $prefix:ident :: $object_type:ty; - $( - $(#[$meta:meta])+ - $ref_or_mut:ident fn $function:ident($($param_name:ident: $param_type:ty),*) - $(-> $return_type:ty)? - $({ - $($(prepare($param_let_name:ident) $param_let_expr:block);+;)? - $(return($it:ident) $return_expr:block;)? - })? - ; - )+ + $(#[$meta:meta])+ + $ref_or_mut:ident fn $function:ident($($param_name:ident: $param_type:ty),*) + $(-> $return_type:ty$(; |$it:ident | $return_expr:expr)?)? + $(; let $param_let_name:ident = $param_let_expr:expr)* + $(;)? ) => { paste::paste! { - $crate::macros::wrap_functions!($prefix; - $( - #[doc = concat!(" Calls [`servicepoint::", stringify!($object_type), - "::", stringify!($function), "`].")] - #[doc = ""] - $(#[$meta])* - fn $function( - instance: NonNull<$object_type>, - $($param_name: $param_type),* - ) $(-> $return_type)? { - let instance = unsafe { $crate::macros:: [< nonnull_as_ $ref_or_mut >] !(instance) }; - $($( - $(let $param_let_name = $param_let_expr;)* - )?)? - #[allow( - unused_variables, - reason = "This variable may not be used depending on macro variables" )] - let result = instance.$function($($param_name),*); + #[doc = concat!(" Calls [`servicepoint::", stringify!($object_type), + "::", stringify!($function), "`].")] + #[doc = ""] + $(#[$meta])* + #[no_mangle] + pub unsafe extern "C" fn [<$prefix _ $function>]( + instance: NonNull<$object_type>, + $($param_name: $param_type),* + ) $(-> $return_type)? { + let instance = unsafe { $crate::macros:: [< nonnull_as_ $ref_or_mut >] !(instance) }; + $(let $param_let_name = $param_let_expr;)* + #[allow( + unused_variables, + reason = "This variable may not be used depending on macro variables" )] + let result = instance.$function($($param_name),*); + $( $( - $( - let $it = result; - let result = $return_expr; - )? + let $it = result; + let result = $return_expr; )? - return result; - } - )+ - ); + return result; + )? + } } }; } @@ -102,73 +94,47 @@ macro_rules! wrap_fields { )+ ) => { paste::paste! { - $crate::macros::wrap_functions!($prefix; + $( $( - $( - #[doc = concat!(" Gets the value of field `", stringify!($prop_name), - "` of the [`servicepoint::",stringify!($object_type),"`].")] - $($( - #[doc = ""] - #[$get_meta] - )*)? - fn []( - instance: NonNull<$object_type> - ) -> $prop_type { - let instance = unsafe { $crate::macros::nonnull_as_ref!(instance) }; - let $prop_name = instance.$prop_name; - $($( - let $prop_name = $get_expr; - )?)? - return $prop_name; - } - )? - - $( - #[doc = concat!(" Sets the value of field `", stringify!($prop_name), - "` of the [`servicepoint::",stringify!($object_type),"`].")] - $($( + #[doc = concat!("Gets the value of field `", stringify!($prop_name), + "` of the [`servicepoint::",stringify!($object_type),"`].")] + $($( #[doc = ""] - #[$set_meta] - )*)? - fn []( - instance: NonNull<$object_type>, - value: $prop_type, - ) { - let instance = unsafe { $crate::macros::nonnull_as_mut!(instance) }; - $($( - let $value = value; - let value = $set_expr; - )?)? - instance.$prop_name = value; - } - )? - )+ - ); - } - }; -} - -macro_rules! wrap_functions { - ( - $prefix:ident; - $( - $(#[$meta:meta])+ - fn $function:ident($($param_name:ident: $param_type:ty),*$(,)?) - $(-> $return_type:ty)? - $block:block - )+ - ) => { - ::paste::paste! { - $( - $(#[$meta])* - #[doc = ""] - #[doc = concat!(" This function is part of the ", stringify!($prefix), " module.")] + #[$get_meta] + )*)? #[no_mangle] - pub unsafe extern "C" fn [<$prefix _ $function>]( - $($param_name: $param_type),* - ) $(-> $return_type)? - $block + pub unsafe extern "C" fn [<$prefix _ get _ $prop_name>]( + instance: NonNull<$object_type> + ) -> $prop_type { + let instance = unsafe { $crate::macros::nonnull_as_ref!(instance) }; + let $prop_name = instance.$prop_name; + $($( + let $prop_name = $get_expr; + )?)? + return $prop_name; + } + )? + $( + #[doc = concat!("Sets the value of field `", stringify!($prop_name), + "` of the [`servicepoint::",stringify!($object_type),"`].")] + $($( + #[doc = ""] + #[$set_meta] + )*)? + #[no_mangle] + pub unsafe extern "C" fn [<$prefix _ set _ $prop_name>]( + instance: NonNull<$object_type>, + value: $prop_type, + ) { + let instance = unsafe { $crate::macros::nonnull_as_mut!(instance) }; + $($( + let $value = value; + let value = $set_expr; + )?)? + instance.$prop_name = value; + } + )? )+ } }; @@ -176,5 +142,5 @@ macro_rules! wrap_functions { pub(crate) use { nonnull_as_mut, nonnull_as_ref, wrap_clone, wrap_fields, wrap_free, - wrap_functions, wrap_methods, + wrap_method, };