wip remove newtypes, re-export constants from base lib
This commit is contained in:
parent
d215f7199e
commit
bb90af3a57
|
@ -25,6 +25,7 @@ sort_by = "Name"
|
|||
[parse]
|
||||
parse_deps = true
|
||||
include = ["servicepoint"]
|
||||
extra_bindings = ["servicepoint"]
|
||||
|
||||
[parse.expand]
|
||||
features = ["full"]
|
||||
|
|
|
@ -6,13 +6,13 @@ int main(void) {
|
|||
if (connection == NULL)
|
||||
return 1;
|
||||
|
||||
Bitmap *pixels = sp_bitmap_new(SP_PIXEL_WIDTH, SP_PIXEL_HEIGHT);
|
||||
Bitmap *pixels = sp_bitmap_new(PIXEL_WIDTH, PIXEL_HEIGHT);
|
||||
if (pixels == NULL)
|
||||
return 1;
|
||||
|
||||
sp_bitmap_fill(pixels, true);
|
||||
|
||||
Command *command = sp_command_bitmap_linear_win(0, 0, pixels, SP_COMPRESSION_CODE_UNCOMPRESSED);
|
||||
Command *command = sp_command_bitmap_linear_win(0, 0, pixels, COMPRESSION_CODE_UNCOMPRESSED);
|
||||
if (command == NULL)
|
||||
return 1;
|
||||
|
||||
|
|
|
@ -8,6 +8,35 @@
|
|||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* pixel count on whole screen
|
||||
*/
|
||||
#define PIXEL_COUNT (PIXEL_WIDTH * PIXEL_HEIGHT)
|
||||
|
||||
/**
|
||||
* Display height in pixels
|
||||
*
|
||||
* # Examples
|
||||
*
|
||||
* ```rust
|
||||
* # use servicepoint::{PIXEL_HEIGHT, PIXEL_WIDTH, Bitmap};
|
||||
* let grid = Bitmap::new(PIXEL_WIDTH, PIXEL_HEIGHT);
|
||||
* ```
|
||||
*/
|
||||
#define PIXEL_HEIGHT (TILE_HEIGHT * TILE_SIZE)
|
||||
|
||||
/**
|
||||
* Display width in pixels
|
||||
*
|
||||
* # Examples
|
||||
*
|
||||
* ```rust
|
||||
* # use servicepoint::{PIXEL_HEIGHT, PIXEL_WIDTH, Bitmap};
|
||||
* let grid = Bitmap::new(PIXEL_WIDTH, PIXEL_HEIGHT);
|
||||
* ```
|
||||
*/
|
||||
#define PIXEL_WIDTH (TILE_WIDTH * TILE_SIZE)
|
||||
|
||||
/**
|
||||
* Count of possible brightness values
|
||||
*/
|
||||
|
@ -23,40 +52,60 @@
|
|||
*/
|
||||
#define SP_BRIGHTNESS_MIN 0
|
||||
|
||||
/**
|
||||
* pixel count on whole screen
|
||||
*/
|
||||
#define SP_PIXEL_COUNT (SP_PIXEL_WIDTH * SP_PIXEL_HEIGHT)
|
||||
|
||||
/**
|
||||
* Display height in pixels
|
||||
*/
|
||||
#define SP_PIXEL_HEIGHT (SP_TILE_HEIGHT * SP_TILE_SIZE)
|
||||
|
||||
/**
|
||||
* Display width in pixels
|
||||
*/
|
||||
#define SP_PIXEL_WIDTH (SP_TILE_WIDTH * SP_TILE_SIZE)
|
||||
|
||||
/**
|
||||
* Display tile count in the y-direction
|
||||
*
|
||||
* # Examples
|
||||
*
|
||||
* ```rust
|
||||
* # use servicepoint::{Cp437Grid, TILE_HEIGHT, TILE_WIDTH};
|
||||
* let grid = Cp437Grid::new(TILE_WIDTH, TILE_HEIGHT);
|
||||
* ```
|
||||
*/
|
||||
#define SP_TILE_HEIGHT 20
|
||||
#define TILE_HEIGHT 20
|
||||
|
||||
/**
|
||||
* size of a single tile in one dimension
|
||||
*/
|
||||
#define SP_TILE_SIZE 8
|
||||
#define TILE_SIZE 8
|
||||
|
||||
/**
|
||||
* Display tile count in the x-direction
|
||||
*
|
||||
* # Examples
|
||||
*
|
||||
* ```rust
|
||||
* # use servicepoint::{Cp437Grid, TILE_HEIGHT, TILE_WIDTH};
|
||||
* let grid = Cp437Grid::new(TILE_WIDTH, TILE_HEIGHT);
|
||||
* ```
|
||||
*/
|
||||
#define SP_TILE_WIDTH 56
|
||||
#define TILE_WIDTH 56
|
||||
|
||||
/**
|
||||
* Specifies the kind of compression to use.
|
||||
* Specifies the kind of compression to use. Availability depends on features.
|
||||
*
|
||||
* # Examples
|
||||
*
|
||||
* ```rust
|
||||
* # use servicepoint::*;
|
||||
* // create command without payload compression
|
||||
* # let pixels = Bitmap::max_sized();
|
||||
* _ = BitmapCommand {
|
||||
* origin: Origin::ZERO,
|
||||
* bitmap: pixels,
|
||||
* compression: CompressionCode::Uncompressed
|
||||
* };
|
||||
*
|
||||
* // create command with payload compressed with lzma and appropriate header flags
|
||||
* # let pixels = Bitmap::max_sized();
|
||||
* _ = BitmapCommand {
|
||||
* origin: Origin::ZERO,
|
||||
* bitmap: pixels,
|
||||
* compression: CompressionCode::Lzma
|
||||
* };
|
||||
* ```
|
||||
*/
|
||||
enum SPCompressionCode
|
||||
enum CompressionCode
|
||||
#ifdef __cplusplus
|
||||
: uint16_t
|
||||
#endif // __cplusplus
|
||||
|
@ -64,26 +113,26 @@ enum SPCompressionCode
|
|||
/**
|
||||
* no compression
|
||||
*/
|
||||
SP_COMPRESSION_CODE_UNCOMPRESSED = 0,
|
||||
COMPRESSION_CODE_UNCOMPRESSED = 0,
|
||||
/**
|
||||
* compress using flate2 with zlib header
|
||||
*/
|
||||
SP_COMPRESSION_CODE_ZLIB = 26490,
|
||||
COMPRESSION_CODE_ZLIB = 26490,
|
||||
/**
|
||||
* compress using bzip2
|
||||
*/
|
||||
SP_COMPRESSION_CODE_BZIP2 = 25210,
|
||||
COMPRESSION_CODE_BZIP2 = 25210,
|
||||
/**
|
||||
* compress using lzma
|
||||
*/
|
||||
SP_COMPRESSION_CODE_LZMA = 27770,
|
||||
COMPRESSION_CODE_LZMA = 27770,
|
||||
/**
|
||||
* compress using Zstandard
|
||||
*/
|
||||
SP_COMPRESSION_CODE_ZSTD = 31347,
|
||||
COMPRESSION_CODE_ZSTD = 31347,
|
||||
};
|
||||
#ifndef __cplusplus
|
||||
typedef uint16_t SPCompressionCode;
|
||||
typedef uint16_t CompressionCode;
|
||||
#endif // __cplusplus
|
||||
|
||||
/**
|
||||
|
@ -245,22 +294,6 @@ typedef ValueGrid_char CharGrid;
|
|||
*/
|
||||
typedef ValueGrid_u8 Cp437Grid;
|
||||
|
||||
/**
|
||||
* A C-wrapper for grid containing codepage 437 characters.
|
||||
*
|
||||
* The encoding is currently not enforced.
|
||||
*
|
||||
* # Examples
|
||||
*
|
||||
* ```C
|
||||
* Cp437Grid grid = sp_cp437_grid_new(4, 3);
|
||||
* sp_cp437_grid_fill(grid, '?');
|
||||
* sp_cp437_grid_set(grid, 0, 0, '!');
|
||||
* sp_cp437_grid_free(grid);
|
||||
* ```
|
||||
*/
|
||||
typedef Cp437Grid SPCp437Grid;
|
||||
|
||||
/**
|
||||
* A raw header.
|
||||
*
|
||||
|
@ -1189,7 +1222,7 @@ size_t sp_char_grid_width(const CharGrid *char_grid);
|
|||
*/
|
||||
Command *sp_command_bitmap_linear(size_t offset,
|
||||
SPBitVec *bit_vec,
|
||||
SPCompressionCode compression);
|
||||
CompressionCode compression);
|
||||
|
||||
/**
|
||||
* Set pixel data according to an and-mask starting at the offset.
|
||||
|
@ -1220,7 +1253,7 @@ Command *sp_command_bitmap_linear(size_t offset,
|
|||
*/
|
||||
Command *sp_command_bitmap_linear_and(size_t offset,
|
||||
SPBitVec *bit_vec,
|
||||
SPCompressionCode compression);
|
||||
CompressionCode compression);
|
||||
|
||||
/**
|
||||
* Set pixel data according to an or-mask starting at the offset.
|
||||
|
@ -1251,7 +1284,7 @@ Command *sp_command_bitmap_linear_and(size_t offset,
|
|||
*/
|
||||
Command *sp_command_bitmap_linear_or(size_t offset,
|
||||
SPBitVec *bit_vec,
|
||||
SPCompressionCode compression);
|
||||
CompressionCode compression);
|
||||
|
||||
/**
|
||||
* Sets a window of pixels to the specified values.
|
||||
|
@ -1278,7 +1311,7 @@ Command *sp_command_bitmap_linear_or(size_t offset,
|
|||
Command *sp_command_bitmap_linear_win(size_t x,
|
||||
size_t y,
|
||||
Bitmap *bitmap,
|
||||
SPCompressionCode compression);
|
||||
CompressionCode compression);
|
||||
|
||||
/**
|
||||
* Set pixel data according to a xor-mask starting at the offset.
|
||||
|
@ -1309,7 +1342,7 @@ Command *sp_command_bitmap_linear_win(size_t x,
|
|||
*/
|
||||
Command *sp_command_bitmap_linear_xor(size_t offset,
|
||||
SPBitVec *bit_vec,
|
||||
SPCompressionCode compression);
|
||||
CompressionCode compression);
|
||||
|
||||
/**
|
||||
* Set the brightness of all tiles to the same value.
|
||||
|
@ -1417,7 +1450,7 @@ Command *sp_command_clone(const Command *command);
|
|||
*/
|
||||
Command *sp_command_cp437_data(size_t x,
|
||||
size_t y,
|
||||
SPCp437Grid *grid);
|
||||
Cp437Grid *grid);
|
||||
|
||||
/**
|
||||
* A yet-to-be-tested command.
|
||||
|
@ -1631,7 +1664,7 @@ bool sp_connection_send_packet(const UdpConnection *connection, Packet *packet);
|
|||
* - the returned instance is freed in some way, either by using a consuming function or
|
||||
* by explicitly calling `sp_cp437_grid_free`.
|
||||
*/
|
||||
SPCp437Grid *sp_cp437_grid_clone(const SPCp437Grid *cp437_grid);
|
||||
Cp437Grid *sp_cp437_grid_clone(const Cp437Grid *cp437_grid);
|
||||
|
||||
/**
|
||||
* Sets the value of all cells in the [SPCp437Grid].
|
||||
|
@ -1652,7 +1685,7 @@ SPCp437Grid *sp_cp437_grid_clone(const SPCp437Grid *cp437_grid);
|
|||
* - `cp437_grid` points to a valid [SPCp437Grid]
|
||||
* - `cp437_grid` is not written to or read from concurrently
|
||||
*/
|
||||
void sp_cp437_grid_fill(SPCp437Grid *cp437_grid, uint8_t value);
|
||||
void sp_cp437_grid_fill(Cp437Grid *cp437_grid, uint8_t value);
|
||||
|
||||
/**
|
||||
* Deallocates a [SPCp437Grid].
|
||||
|
@ -1671,7 +1704,7 @@ void sp_cp437_grid_fill(SPCp437Grid *cp437_grid, uint8_t value);
|
|||
*
|
||||
* [SPCommand]: [crate::SPCommand]
|
||||
*/
|
||||
void sp_cp437_grid_free(SPCp437Grid *cp437_grid);
|
||||
void sp_cp437_grid_free(Cp437Grid *cp437_grid);
|
||||
|
||||
/**
|
||||
* Gets the current value at the specified position.
|
||||
|
@ -1693,7 +1726,7 @@ void sp_cp437_grid_free(SPCp437Grid *cp437_grid);
|
|||
* - `cp437_grid` points to a valid [SPCp437Grid]
|
||||
* - `cp437_grid` is not written to concurrently
|
||||
*/
|
||||
uint8_t sp_cp437_grid_get(const SPCp437Grid *cp437_grid, size_t x, size_t y);
|
||||
uint8_t sp_cp437_grid_get(const Cp437Grid *cp437_grid, size_t x, size_t y);
|
||||
|
||||
/**
|
||||
* Gets the height of the [SPCp437Grid] instance.
|
||||
|
@ -1712,7 +1745,7 @@ uint8_t sp_cp437_grid_get(const SPCp437Grid *cp437_grid, size_t x, size_t y);
|
|||
*
|
||||
* - `cp437_grid` points to a valid [SPCp437Grid]
|
||||
*/
|
||||
size_t sp_cp437_grid_height(const SPCp437Grid *cp437_grid);
|
||||
size_t sp_cp437_grid_height(const Cp437Grid *cp437_grid);
|
||||
|
||||
/**
|
||||
* Loads a [SPCp437Grid] with the specified dimensions from the provided data.
|
||||
|
@ -1733,10 +1766,10 @@ size_t sp_cp437_grid_height(const SPCp437Grid *cp437_grid);
|
|||
* - the returned instance is freed in some way, either by using a consuming function or
|
||||
* by explicitly calling `sp_cp437_grid_free`.
|
||||
*/
|
||||
SPCp437Grid *sp_cp437_grid_load(size_t width,
|
||||
size_t height,
|
||||
const uint8_t *data,
|
||||
size_t data_length);
|
||||
Cp437Grid *sp_cp437_grid_load(size_t width,
|
||||
size_t height,
|
||||
const uint8_t *data,
|
||||
size_t data_length);
|
||||
|
||||
/**
|
||||
* Creates a new [SPCp437Grid] with the specified dimensions.
|
||||
|
@ -1750,8 +1783,8 @@ SPCp437Grid *sp_cp437_grid_load(size_t width,
|
|||
* - the returned instance is freed in some way, either by using a consuming function or
|
||||
* by explicitly calling `sp_cp437_grid_free`.
|
||||
*/
|
||||
SPCp437Grid *sp_cp437_grid_new(size_t width,
|
||||
size_t height);
|
||||
Cp437Grid *sp_cp437_grid_new(size_t width,
|
||||
size_t height);
|
||||
|
||||
/**
|
||||
* Sets the value of the specified position in the [SPCp437Grid].
|
||||
|
@ -1778,7 +1811,7 @@ SPCp437Grid *sp_cp437_grid_new(size_t width,
|
|||
*
|
||||
* [SPBitVec]: [crate::SPBitVec]
|
||||
*/
|
||||
void sp_cp437_grid_set(SPCp437Grid *cp437_grid,
|
||||
void sp_cp437_grid_set(Cp437Grid *cp437_grid,
|
||||
size_t x,
|
||||
size_t y,
|
||||
uint8_t value);
|
||||
|
@ -1800,7 +1833,7 @@ void sp_cp437_grid_set(SPCp437Grid *cp437_grid,
|
|||
* - the returned memory range is never accessed after the passed [SPCp437Grid] has been freed
|
||||
* - the returned memory range is never accessed concurrently, either via the [SPCp437Grid] or directly
|
||||
*/
|
||||
SPByteSlice sp_cp437_grid_unsafe_data_ref(SPCp437Grid *cp437_grid);
|
||||
SPByteSlice sp_cp437_grid_unsafe_data_ref(Cp437Grid *cp437_grid);
|
||||
|
||||
/**
|
||||
* Gets the width of the [SPCp437Grid] instance.
|
||||
|
@ -1819,7 +1852,7 @@ SPByteSlice sp_cp437_grid_unsafe_data_ref(SPCp437Grid *cp437_grid);
|
|||
*
|
||||
* - `cp437_grid` points to a valid [SPCp437Grid]
|
||||
*/
|
||||
size_t sp_cp437_grid_width(const SPCp437Grid *cp437_grid);
|
||||
size_t sp_cp437_grid_width(const Cp437Grid *cp437_grid);
|
||||
|
||||
/**
|
||||
* Clones a [SPPacket].
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
use std::ptr::NonNull;
|
||||
|
||||
#[repr(C)]
|
||||
/// Represents a span of memory (`&mut [u8]` ) as a struct usable by C code.
|
||||
///
|
||||
/// You should not create an instance of this type in your C code.
|
||||
|
@ -16,6 +15,7 @@ use std::ptr::NonNull;
|
|||
/// the function returning this type.
|
||||
/// - an instance of this created from C is never passed to a consuming function, as the rust code
|
||||
/// will try to free the memory of a potentially separate allocator.
|
||||
#[repr(C)]
|
||||
pub struct SPByteSlice {
|
||||
/// The start address of the memory
|
||||
pub start: NonNull<u8>,
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
//!
|
||||
//! prefix `sp_command_`
|
||||
|
||||
use crate::{SPBitVec, SPCompressionCode, SPCp437Grid};
|
||||
use servicepoint::{BinaryOperation, BrightnessGrid, CharGrid, GlobalBrightnessCommand, Packet, TypedCommand};
|
||||
use crate::{SPBitVec};
|
||||
use servicepoint::{BinaryOperation, BrightnessGrid, CharGrid, CompressionCode, Cp437Grid, GlobalBrightnessCommand, Packet, TypedCommand};
|
||||
use std::ptr::NonNull;
|
||||
|
||||
/// A low-level display command.
|
||||
|
@ -225,7 +225,7 @@ pub unsafe extern "C" fn sp_command_char_brightness(
|
|||
pub unsafe extern "C" fn sp_command_bitmap_linear(
|
||||
offset: usize,
|
||||
bit_vec: *mut SPBitVec,
|
||||
compression: SPCompressionCode,
|
||||
compression: CompressionCode,
|
||||
) -> *mut TypedCommand {
|
||||
unsafe {
|
||||
sp_command_bitmap_linear_internal(
|
||||
|
@ -266,7 +266,7 @@ pub unsafe extern "C" fn sp_command_bitmap_linear(
|
|||
pub unsafe extern "C" fn sp_command_bitmap_linear_and(
|
||||
offset: usize,
|
||||
bit_vec: *mut SPBitVec,
|
||||
compression: SPCompressionCode,
|
||||
compression: CompressionCode,
|
||||
) -> *mut TypedCommand {
|
||||
unsafe {
|
||||
sp_command_bitmap_linear_internal(
|
||||
|
@ -307,7 +307,7 @@ pub unsafe extern "C" fn sp_command_bitmap_linear_and(
|
|||
pub unsafe extern "C" fn sp_command_bitmap_linear_or(
|
||||
offset: usize,
|
||||
bit_vec: *mut SPBitVec,
|
||||
compression: SPCompressionCode,
|
||||
compression: CompressionCode,
|
||||
) -> *mut TypedCommand {
|
||||
unsafe {
|
||||
sp_command_bitmap_linear_internal(
|
||||
|
@ -348,7 +348,7 @@ pub unsafe extern "C" fn sp_command_bitmap_linear_or(
|
|||
pub unsafe extern "C" fn sp_command_bitmap_linear_xor(
|
||||
offset: usize,
|
||||
bit_vec: *mut SPBitVec,
|
||||
compression: SPCompressionCode,
|
||||
compression: CompressionCode,
|
||||
) -> *mut TypedCommand {
|
||||
unsafe {
|
||||
sp_command_bitmap_linear_internal(
|
||||
|
@ -364,7 +364,7 @@ pub unsafe extern "C" fn sp_command_bitmap_linear_xor(
|
|||
unsafe fn sp_command_bitmap_linear_internal(
|
||||
offset: usize,
|
||||
bit_vec: *mut SPBitVec,
|
||||
compression: SPCompressionCode,
|
||||
compression: CompressionCode,
|
||||
operation: BinaryOperation,
|
||||
) -> *mut TypedCommand {
|
||||
assert!(!bit_vec.is_null());
|
||||
|
@ -405,14 +405,14 @@ unsafe fn sp_command_bitmap_linear_internal(
|
|||
pub unsafe extern "C" fn sp_command_cp437_data(
|
||||
x: usize,
|
||||
y: usize,
|
||||
grid: *mut SPCp437Grid,
|
||||
grid: *mut Cp437Grid,
|
||||
) -> NonNull<TypedCommand> {
|
||||
assert!(!grid.is_null());
|
||||
let grid = *unsafe { Box::from_raw(grid) };
|
||||
let result = Box::new(
|
||||
servicepoint::Cp437GridCommand {
|
||||
origin: servicepoint::Origin::new(x, y),
|
||||
grid: grid.0,
|
||||
grid,
|
||||
}
|
||||
.into(),
|
||||
);
|
||||
|
@ -480,7 +480,7 @@ pub unsafe extern "C" fn sp_command_bitmap_linear_win(
|
|||
x: usize,
|
||||
y: usize,
|
||||
bitmap: *mut servicepoint::Bitmap,
|
||||
compression: SPCompressionCode,
|
||||
compression: CompressionCode,
|
||||
) -> *mut TypedCommand {
|
||||
assert!(!bitmap.is_null());
|
||||
let bitmap = unsafe { *Box::from_raw(bitmap) };
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
//! re-exported constants for use in C
|
||||
|
||||
use servicepoint::CompressionCode;
|
||||
use std::time::Duration;
|
||||
|
||||
/// size of a single tile in one dimension
|
||||
pub const SP_TILE_SIZE: usize = 8;
|
||||
|
||||
/// Display tile count in the x-direction
|
||||
pub const SP_TILE_WIDTH: usize = 56;
|
||||
|
||||
/// Display tile count in the y-direction
|
||||
pub const SP_TILE_HEIGHT: usize = 20;
|
||||
|
||||
/// Display width in pixels
|
||||
pub const SP_PIXEL_WIDTH: usize = SP_TILE_WIDTH * SP_TILE_SIZE;
|
||||
|
||||
/// Display height in pixels
|
||||
pub const SP_PIXEL_HEIGHT: usize = SP_TILE_HEIGHT * SP_TILE_SIZE;
|
||||
|
||||
/// pixel count on whole screen
|
||||
pub const SP_PIXEL_COUNT: usize = SP_PIXEL_WIDTH * SP_PIXEL_HEIGHT;
|
||||
|
||||
/// Actual hardware limit is around 28-29ms/frame. Rounded up for less dropped packets.
|
||||
pub const SP_FRAME_PACING_MS: u128 = Duration::from_millis(30).as_millis();
|
||||
|
||||
/// Specifies the kind of compression to use.
|
||||
#[repr(u16)]
|
||||
pub enum SPCompressionCode {
|
||||
/// no compression
|
||||
Uncompressed = 0x0,
|
||||
/// compress using flate2 with zlib header
|
||||
Zlib = 0x677a,
|
||||
/// compress using bzip2
|
||||
Bzip2 = 0x627a,
|
||||
/// compress using lzma
|
||||
Lzma = 0x6c7a,
|
||||
/// compress using Zstandard
|
||||
Zstd = 0x7a73,
|
||||
}
|
||||
|
||||
impl TryFrom<SPCompressionCode> for CompressionCode {
|
||||
type Error = ();
|
||||
|
||||
fn try_from(value: SPCompressionCode) -> Result<Self, Self::Error> {
|
||||
CompressionCode::try_from(value as u16).map_err(|_| ())
|
||||
}
|
||||
}
|
|
@ -1,32 +1,25 @@
|
|||
//! C functions for interacting with [SPCp437Grid]s
|
||||
//!
|
||||
//! prefix `sp_cp437_grid_`
|
||||
//!
|
||||
//!
|
||||
//! A C-wrapper for grid containing codepage 437 characters.
|
||||
//!
|
||||
//! The encoding is currently not enforced.
|
||||
//!
|
||||
//! # Examples
|
||||
//!
|
||||
//! ```C
|
||||
//! Cp437Grid grid = sp_cp437_grid_new(4, 3);
|
||||
//! sp_cp437_grid_fill(grid, '?');
|
||||
//! sp_cp437_grid_set(grid, 0, 0, '!');
|
||||
//! sp_cp437_grid_free(grid);
|
||||
//! ```
|
||||
|
||||
use crate::SPByteSlice;
|
||||
use servicepoint::{DataRef, Grid};
|
||||
use servicepoint::{Cp437Grid, DataRef, Grid};
|
||||
use std::ptr::NonNull;
|
||||
|
||||
/// A C-wrapper for grid containing codepage 437 characters.
|
||||
///
|
||||
/// The encoding is currently not enforced.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```C
|
||||
/// Cp437Grid grid = sp_cp437_grid_new(4, 3);
|
||||
/// sp_cp437_grid_fill(grid, '?');
|
||||
/// sp_cp437_grid_set(grid, 0, 0, '!');
|
||||
/// sp_cp437_grid_free(grid);
|
||||
/// ```
|
||||
#[repr(transparent)]
|
||||
pub struct SPCp437Grid(pub(crate) servicepoint::Cp437Grid);
|
||||
|
||||
impl Clone for SPCp437Grid {
|
||||
fn clone(&self) -> Self {
|
||||
SPCp437Grid(self.0.clone())
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a new [SPCp437Grid] with the specified dimensions.
|
||||
///
|
||||
/// returns: [SPCp437Grid] initialized to 0. Will never return NULL.
|
||||
|
@ -41,9 +34,8 @@ impl Clone for SPCp437Grid {
|
|||
pub unsafe extern "C" fn sp_cp437_grid_new(
|
||||
width: usize,
|
||||
height: usize,
|
||||
) -> NonNull<SPCp437Grid> {
|
||||
let result =
|
||||
Box::new(SPCp437Grid(servicepoint::Cp437Grid::new(width, height)));
|
||||
) -> NonNull<Cp437Grid> {
|
||||
let result = Box::new(Cp437Grid::new(width, height));
|
||||
NonNull::from(Box::leak(result))
|
||||
}
|
||||
|
||||
|
@ -70,12 +62,12 @@ pub unsafe extern "C" fn sp_cp437_grid_load(
|
|||
height: usize,
|
||||
data: *const u8,
|
||||
data_length: usize,
|
||||
) -> *mut SPCp437Grid {
|
||||
) -> *mut Cp437Grid {
|
||||
assert!(data.is_null());
|
||||
let data = unsafe { std::slice::from_raw_parts(data, data_length) };
|
||||
let grid = servicepoint::Cp437Grid::load(width, height, data);
|
||||
let grid = Cp437Grid::load(width, height, data);
|
||||
if let Some(grid) = grid {
|
||||
Box::leak(Box::new(SPCp437Grid(grid)))
|
||||
Box::leak(Box::new(grid))
|
||||
} else {
|
||||
std::ptr::null_mut()
|
||||
}
|
||||
|
@ -99,8 +91,8 @@ pub unsafe extern "C" fn sp_cp437_grid_load(
|
|||
/// by explicitly calling `sp_cp437_grid_free`.
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn sp_cp437_grid_clone(
|
||||
cp437_grid: *const SPCp437Grid,
|
||||
) -> NonNull<SPCp437Grid> {
|
||||
cp437_grid: *const Cp437Grid,
|
||||
) -> NonNull<Cp437Grid> {
|
||||
assert!(!cp437_grid.is_null());
|
||||
let result = Box::new(unsafe { (*cp437_grid).clone() });
|
||||
NonNull::from(Box::leak(result))
|
||||
|
@ -122,7 +114,7 @@ pub unsafe extern "C" fn sp_cp437_grid_clone(
|
|||
///
|
||||
/// [SPCommand]: [crate::SPCommand]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn sp_cp437_grid_free(cp437_grid: *mut SPCp437Grid) {
|
||||
pub unsafe extern "C" fn sp_cp437_grid_free(cp437_grid: *mut Cp437Grid) {
|
||||
assert!(!cp437_grid.is_null());
|
||||
_ = unsafe { Box::from_raw(cp437_grid) };
|
||||
}
|
||||
|
@ -147,12 +139,12 @@ pub unsafe extern "C" fn sp_cp437_grid_free(cp437_grid: *mut SPCp437Grid) {
|
|||
/// - `cp437_grid` is not written to concurrently
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn sp_cp437_grid_get(
|
||||
cp437_grid: *const SPCp437Grid,
|
||||
cp437_grid: *const Cp437Grid,
|
||||
x: usize,
|
||||
y: usize,
|
||||
) -> u8 {
|
||||
assert!(!cp437_grid.is_null());
|
||||
unsafe { (*cp437_grid).0.get(x, y) }
|
||||
unsafe { (*cp437_grid).get(x, y) }
|
||||
}
|
||||
|
||||
/// Sets the value of the specified position in the [SPCp437Grid].
|
||||
|
@ -180,13 +172,13 @@ pub unsafe extern "C" fn sp_cp437_grid_get(
|
|||
/// [SPBitVec]: [crate::SPBitVec]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn sp_cp437_grid_set(
|
||||
cp437_grid: *mut SPCp437Grid,
|
||||
cp437_grid: *mut Cp437Grid,
|
||||
x: usize,
|
||||
y: usize,
|
||||
value: u8,
|
||||
) {
|
||||
assert!(!cp437_grid.is_null());
|
||||
unsafe { (*cp437_grid).0.set(x, y, value) };
|
||||
unsafe { (*cp437_grid).set(x, y, value) };
|
||||
}
|
||||
|
||||
/// Sets the value of all cells in the [SPCp437Grid].
|
||||
|
@ -208,11 +200,11 @@ pub unsafe extern "C" fn sp_cp437_grid_set(
|
|||
/// - `cp437_grid` is not written to or read from concurrently
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn sp_cp437_grid_fill(
|
||||
cp437_grid: *mut SPCp437Grid,
|
||||
cp437_grid: *mut Cp437Grid,
|
||||
value: u8,
|
||||
) {
|
||||
assert!(!cp437_grid.is_null());
|
||||
unsafe { (*cp437_grid).0.fill(value) };
|
||||
unsafe { (*cp437_grid).fill(value) };
|
||||
}
|
||||
|
||||
/// Gets the width of the [SPCp437Grid] instance.
|
||||
|
@ -232,10 +224,10 @@ pub unsafe extern "C" fn sp_cp437_grid_fill(
|
|||
/// - `cp437_grid` points to a valid [SPCp437Grid]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn sp_cp437_grid_width(
|
||||
cp437_grid: *const SPCp437Grid,
|
||||
cp437_grid: *const Cp437Grid,
|
||||
) -> usize {
|
||||
assert!(!cp437_grid.is_null());
|
||||
unsafe { (*cp437_grid).0.width() }
|
||||
unsafe { (*cp437_grid).width() }
|
||||
}
|
||||
|
||||
/// Gets the height of the [SPCp437Grid] instance.
|
||||
|
@ -255,10 +247,10 @@ pub unsafe extern "C" fn sp_cp437_grid_width(
|
|||
/// - `cp437_grid` points to a valid [SPCp437Grid]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn sp_cp437_grid_height(
|
||||
cp437_grid: *const SPCp437Grid,
|
||||
cp437_grid: *const Cp437Grid,
|
||||
) -> usize {
|
||||
assert!(!cp437_grid.is_null());
|
||||
unsafe { (*cp437_grid).0.height() }
|
||||
unsafe { (*cp437_grid).height() }
|
||||
}
|
||||
|
||||
/// Gets an unsafe reference to the data of the [SPCp437Grid] instance.
|
||||
|
@ -278,7 +270,7 @@ pub unsafe extern "C" fn sp_cp437_grid_height(
|
|||
/// - the returned memory range is never accessed concurrently, either via the [SPCp437Grid] or directly
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn sp_cp437_grid_unsafe_data_ref(
|
||||
cp437_grid: *mut SPCp437Grid,
|
||||
cp437_grid: *mut Cp437Grid,
|
||||
) -> SPByteSlice {
|
||||
unsafe {SPByteSlice::from_slice((*cp437_grid).0.data_ref_mut()) }
|
||||
unsafe {SPByteSlice::from_slice((*cp437_grid).data_ref_mut()) }
|
||||
}
|
||||
|
|
|
@ -32,7 +32,6 @@ pub use crate::byte_slice::*;
|
|||
pub use crate::char_grid::*;
|
||||
pub use crate::command::*;
|
||||
pub use crate::connection::*;
|
||||
pub use crate::constants::*;
|
||||
pub use crate::cp437_grid::*;
|
||||
pub use crate::packet::*;
|
||||
|
||||
|
@ -43,6 +42,11 @@ mod byte_slice;
|
|||
mod char_grid;
|
||||
mod command;
|
||||
mod connection;
|
||||
mod constants;
|
||||
mod cp437_grid;
|
||||
mod packet;
|
||||
|
||||
|
||||
use std::time::Duration;
|
||||
|
||||
/// Actual hardware limit is around 28-29ms/frame. Rounded up for less dropped packets.
|
||||
pub const SP_FRAME_PACING_MS: u128 = Duration::from_millis(30).as_millis();
|
||||
|
|
Loading…
Reference in a new issue