mirror of
https://github.com/cccb/servicepoint.git
synced 2025-01-18 10:00:14 +01:00
cargo fmt
This commit is contained in:
parent
972d713cf1
commit
8307354a58
|
@ -23,7 +23,14 @@ fn main() {
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
connection
|
connection
|
||||||
.send(Command::BitmapLinearWin(Origin::top_left(), field.clone(), CompressionCode::Bzip2).into())
|
.send(
|
||||||
|
Command::BitmapLinearWin(
|
||||||
|
Origin::top_left(),
|
||||||
|
field.clone(),
|
||||||
|
CompressionCode::Bzip2,
|
||||||
|
)
|
||||||
|
.into(),
|
||||||
|
)
|
||||||
.expect("could not send");
|
.expect("could not send");
|
||||||
thread::sleep(Duration::from_millis(30));
|
thread::sleep(Duration::from_millis(30));
|
||||||
field = iteration(field);
|
field = iteration(field);
|
||||||
|
@ -37,7 +44,10 @@ fn iteration(field: PixelGrid) -> PixelGrid {
|
||||||
let old_state = field.get(x, y);
|
let old_state = field.get(x, y);
|
||||||
let neighbors = count_neighbors(&field, x as i32, y as i32);
|
let neighbors = count_neighbors(&field, x as i32, y as i32);
|
||||||
|
|
||||||
let new_state = matches!((old_state, neighbors), (true, 2) | (true, 3) | (false, 3));
|
let new_state = matches!(
|
||||||
|
(old_state, neighbors),
|
||||||
|
(true, 2) | (true, 3) | (false, 3)
|
||||||
|
);
|
||||||
next.set(x, y, new_state);
|
next.set(x, y, new_state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,10 @@ use std::time::Duration;
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
|
|
||||||
use servicepoint2::{Command, CompressionCode, Connection, Origin, PIXEL_HEIGHT, PIXEL_WIDTH, PixelGrid};
|
use servicepoint2::{
|
||||||
|
Command, CompressionCode, Connection, Origin, PixelGrid, PIXEL_HEIGHT,
|
||||||
|
PIXEL_WIDTH,
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
struct Cli {
|
struct Cli {
|
||||||
|
@ -24,7 +27,14 @@ fn main() {
|
||||||
pixels.set((y + x_offset) % PIXEL_WIDTH as usize, y, true);
|
pixels.set((y + x_offset) % PIXEL_WIDTH as usize, y, true);
|
||||||
}
|
}
|
||||||
connection
|
connection
|
||||||
.send(Command::BitmapLinearWin(Origin::top_left(), pixels.clone(), CompressionCode::Lzma).into())
|
.send(
|
||||||
|
Command::BitmapLinearWin(
|
||||||
|
Origin::top_left(),
|
||||||
|
pixels.clone(),
|
||||||
|
CompressionCode::Lzma,
|
||||||
|
)
|
||||||
|
.into(),
|
||||||
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
thread::sleep(Duration::from_millis(14));
|
thread::sleep(Duration::from_millis(14));
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,11 @@ use std::time::Duration;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
|
||||||
|
use servicepoint2::{
|
||||||
|
ByteGrid, CompressionCode, Connection, Origin, PixelGrid, TILE_HEIGHT,
|
||||||
|
TILE_WIDTH,
|
||||||
|
};
|
||||||
use servicepoint2::Command::{BitmapLinearWin, Brightness, CharBrightness};
|
use servicepoint2::Command::{BitmapLinearWin, Brightness, CharBrightness};
|
||||||
use servicepoint2::{ByteGrid, CompressionCode, Connection, Origin, PixelGrid, TILE_HEIGHT, TILE_WIDTH};
|
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
struct Cli {
|
struct Cli {
|
||||||
|
@ -27,9 +30,13 @@ fn main() {
|
||||||
if cli.enable_all {
|
if cli.enable_all {
|
||||||
let mut filled_grid = PixelGrid::max_sized();
|
let mut filled_grid = PixelGrid::max_sized();
|
||||||
filled_grid.fill(true);
|
filled_grid.fill(true);
|
||||||
connection
|
|
||||||
.send(BitmapLinearWin(Origin::top_left(), filled_grid, CompressionCode::Lzma).into())
|
let command = BitmapLinearWin(
|
||||||
.unwrap();
|
Origin::top_left(),
|
||||||
|
filled_grid,
|
||||||
|
CompressionCode::Lzma,
|
||||||
|
);
|
||||||
|
connection.send(command.into()).expect("send failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
// set all pixels to the same random brightness
|
// set all pixels to the same random brightness
|
||||||
|
@ -54,7 +61,9 @@ fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
connection.send(CharBrightness(origin, luma).into()).unwrap();
|
connection
|
||||||
|
.send(CharBrightness(origin, luma).into())
|
||||||
|
.unwrap();
|
||||||
std::thread::sleep(wait_duration);
|
std::thread::sleep(wait_duration);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,10 @@ use std::time::Duration;
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
|
|
||||||
use servicepoint2::{BitVec, Command, CompressionCode, Connection, PIXEL_HEIGHT, PIXEL_WIDTH, PixelGrid};
|
use servicepoint2::{
|
||||||
|
BitVec, Command, CompressionCode, Connection, PixelGrid, PIXEL_HEIGHT,
|
||||||
|
PIXEL_WIDTH,
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
struct Cli {
|
struct Cli {
|
||||||
|
@ -34,7 +37,10 @@ fn main() {
|
||||||
let bit_vec = BitVec::from(&*pixel_data);
|
let bit_vec = BitVec::from(&*pixel_data);
|
||||||
|
|
||||||
connection
|
connection
|
||||||
.send(Command::BitmapLinearAnd(0, bit_vec, CompressionCode::Lzma).into())
|
.send(
|
||||||
|
Command::BitmapLinearAnd(0, bit_vec, CompressionCode::Lzma)
|
||||||
|
.into(),
|
||||||
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
thread::sleep(sleep_duration);
|
thread::sleep(sleep_duration);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
|
|
@ -135,7 +135,10 @@ pub mod c_api {
|
||||||
/// Loads a `BitVec` from the provided data.
|
/// Loads a `BitVec` from the provided data.
|
||||||
/// The returned instance has to be freed with `bit_vec_dealloc`.
|
/// The returned instance has to be freed with `bit_vec_dealloc`.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_bit_vec_load(data: *const u8, data_length: usize) -> *mut BitVec {
|
pub unsafe extern "C" fn sp2_bit_vec_load(
|
||||||
|
data: *const u8,
|
||||||
|
data_length: usize,
|
||||||
|
) -> *mut BitVec {
|
||||||
let data = std::slice::from_raw_parts(data, data_length);
|
let data = std::slice::from_raw_parts(data, data_length);
|
||||||
Box::into_raw(Box::new(BitVec::from(data)))
|
Box::into_raw(Box::new(BitVec::from(data)))
|
||||||
}
|
}
|
||||||
|
@ -143,7 +146,9 @@ pub mod c_api {
|
||||||
/// Clones a `BitVec`.
|
/// Clones a `BitVec`.
|
||||||
/// The returned instance has to be freed with `bit_vec_dealloc`.
|
/// The returned instance has to be freed with `bit_vec_dealloc`.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_bit_vec_clone(this: *const BitVec) -> *mut BitVec {
|
pub unsafe extern "C" fn sp2_bit_vec_clone(
|
||||||
|
this: *const BitVec,
|
||||||
|
) -> *mut BitVec {
|
||||||
Box::into_raw(Box::new((*this).clone()))
|
Box::into_raw(Box::new((*this).clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,13 +162,20 @@ pub mod c_api {
|
||||||
|
|
||||||
/// Gets the value of a bit from the `BitVec`.
|
/// Gets the value of a bit from the `BitVec`.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_bit_vec_get(this: *const BitVec, index: usize) -> bool {
|
pub unsafe extern "C" fn sp2_bit_vec_get(
|
||||||
|
this: *const BitVec,
|
||||||
|
index: usize,
|
||||||
|
) -> bool {
|
||||||
(*this).get(index)
|
(*this).get(index)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the value of a bit in the `BitVec`.
|
/// Sets the value of a bit in the `BitVec`.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_bit_vec_set(this: *mut BitVec, index: usize, value: bool) -> bool {
|
pub unsafe extern "C" fn sp2_bit_vec_set(
|
||||||
|
this: *mut BitVec,
|
||||||
|
index: usize,
|
||||||
|
value: bool,
|
||||||
|
) -> bool {
|
||||||
(*this).set(index, value)
|
(*this).set(index, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,7 +207,9 @@ pub mod c_api {
|
||||||
/// Reading and writing concurrently to either the original instance or the returned data will
|
/// Reading and writing concurrently to either the original instance or the returned data will
|
||||||
/// result in undefined behavior.
|
/// result in undefined behavior.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_bit_vec_unsafe_data_ref(this: *mut BitVec) -> CByteSlice {
|
pub unsafe extern "C" fn sp2_bit_vec_unsafe_data_ref(
|
||||||
|
this: *mut BitVec,
|
||||||
|
) -> CByteSlice {
|
||||||
let data = (*this).mut_data_ref();
|
let data = (*this).mut_data_ref();
|
||||||
CByteSlice {
|
CByteSlice {
|
||||||
start: data.as_mut_ptr_range().start,
|
start: data.as_mut_ptr_range().start,
|
||||||
|
|
|
@ -67,21 +67,28 @@ impl From<ByteGrid> for Vec<u8> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "c_api")]
|
#[cfg(feature = "c_api")]
|
||||||
pub mod c_api
|
pub mod c_api {
|
||||||
{
|
|
||||||
use crate::{ByteGrid, CByteSlice};
|
use crate::{ByteGrid, CByteSlice};
|
||||||
|
|
||||||
/// Creates a new `ByteGrid` instance.
|
/// Creates a new `ByteGrid` instance.
|
||||||
/// The returned instance has to be freed with `byte_grid_dealloc`.
|
/// The returned instance has to be freed with `byte_grid_dealloc`.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_byte_grid_new(width: usize, height: usize) -> *mut ByteGrid {
|
pub unsafe extern "C" fn sp2_byte_grid_new(
|
||||||
|
width: usize,
|
||||||
|
height: usize,
|
||||||
|
) -> *mut ByteGrid {
|
||||||
Box::into_raw(Box::new(ByteGrid::new(width, height)))
|
Box::into_raw(Box::new(ByteGrid::new(width, height)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Loads a `ByteGrid` with the specified dimensions from the provided data.
|
/// Loads a `ByteGrid` with the specified dimensions from the provided data.
|
||||||
/// The returned instance has to be freed with `byte_grid_dealloc`.
|
/// The returned instance has to be freed with `byte_grid_dealloc`.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_byte_grid_load(width: usize, height: usize, data: *const u8, data_length: usize) -> *mut ByteGrid {
|
pub unsafe extern "C" fn sp2_byte_grid_load(
|
||||||
|
width: usize,
|
||||||
|
height: usize,
|
||||||
|
data: *const u8,
|
||||||
|
data_length: usize,
|
||||||
|
) -> *mut ByteGrid {
|
||||||
let data = std::slice::from_raw_parts(data, data_length);
|
let data = std::slice::from_raw_parts(data, data_length);
|
||||||
Box::into_raw(Box::new(ByteGrid::load(width, height, data)))
|
Box::into_raw(Box::new(ByteGrid::load(width, height, data)))
|
||||||
}
|
}
|
||||||
|
@ -89,7 +96,9 @@ pub mod c_api
|
||||||
/// Clones a `ByteGrid`.
|
/// Clones a `ByteGrid`.
|
||||||
/// The returned instance has to be freed with `byte_grid_dealloc`.
|
/// The returned instance has to be freed with `byte_grid_dealloc`.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_byte_grid_clone(this: *const ByteGrid) -> *mut ByteGrid {
|
pub unsafe extern "C" fn sp2_byte_grid_clone(
|
||||||
|
this: *const ByteGrid,
|
||||||
|
) -> *mut ByteGrid {
|
||||||
Box::into_raw(Box::new((*this).clone()))
|
Box::into_raw(Box::new((*this).clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,31 +112,47 @@ pub mod c_api
|
||||||
|
|
||||||
/// Get the current value at the specified position
|
/// Get the current value at the specified position
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_byte_grid_get(this: *const ByteGrid, x: usize, y: usize) -> u8 {
|
pub unsafe extern "C" fn sp2_byte_grid_get(
|
||||||
|
this: *const ByteGrid,
|
||||||
|
x: usize,
|
||||||
|
y: usize,
|
||||||
|
) -> u8 {
|
||||||
(*this).get(x, y)
|
(*this).get(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the current value at the specified position
|
/// Sets the current value at the specified position
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_byte_grid_set(this: *mut ByteGrid, x: usize, y: usize, value: u8) {
|
pub unsafe extern "C" fn sp2_byte_grid_set(
|
||||||
|
this: *mut ByteGrid,
|
||||||
|
x: usize,
|
||||||
|
y: usize,
|
||||||
|
value: u8,
|
||||||
|
) {
|
||||||
(*this).set(x, y, value);
|
(*this).set(x, y, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Fills the whole `ByteGrid` with the specified value
|
/// Fills the whole `ByteGrid` with the specified value
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_byte_grid_fill(this: *mut ByteGrid, value: u8) {
|
pub unsafe extern "C" fn sp2_byte_grid_fill(
|
||||||
|
this: *mut ByteGrid,
|
||||||
|
value: u8,
|
||||||
|
) {
|
||||||
(*this).fill(value);
|
(*this).fill(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the width in pixels of the `ByteGrid` instance.
|
/// Gets the width in pixels of the `ByteGrid` instance.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_byte_grid_width(this: *const ByteGrid) -> usize {
|
pub unsafe extern "C" fn sp2_byte_grid_width(
|
||||||
|
this: *const ByteGrid,
|
||||||
|
) -> usize {
|
||||||
(*this).width
|
(*this).width
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the height in pixels of the `ByteGrid` instance.
|
/// Gets the height in pixels of the `ByteGrid` instance.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_byte_grid_height(this: *const ByteGrid) -> usize {
|
pub unsafe extern "C" fn sp2_byte_grid_height(
|
||||||
|
this: *const ByteGrid,
|
||||||
|
) -> usize {
|
||||||
(*this).height
|
(*this).height
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,11 +166,13 @@ pub mod c_api
|
||||||
/// Reading and writing concurrently to either the original instance or the returned data will
|
/// Reading and writing concurrently to either the original instance or the returned data will
|
||||||
/// result in undefined behavior.
|
/// result in undefined behavior.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_byte_grid_unsafe_data_ref(this: *mut ByteGrid) -> CByteSlice {
|
pub unsafe extern "C" fn sp2_byte_grid_unsafe_data_ref(
|
||||||
|
this: *mut ByteGrid,
|
||||||
|
) -> CByteSlice {
|
||||||
let data = (*this).mut_data_ref();
|
let data = (*this).mut_data_ref();
|
||||||
CByteSlice {
|
CByteSlice {
|
||||||
start: data.as_mut_ptr_range().start,
|
start: data.as_mut_ptr_range().start,
|
||||||
length: data.len(),
|
length: data.len(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
use crate::{BitVec, ByteGrid, CompressionCode, Header, Packet, PixelGrid, TILE_SIZE};
|
|
||||||
use crate::command_code::CommandCode;
|
use crate::command_code::CommandCode;
|
||||||
use crate::compression::{into_compressed, into_decompressed};
|
use crate::compression::{into_compressed, into_decompressed};
|
||||||
|
use crate::{
|
||||||
|
BitVec, ByteGrid, CompressionCode, Header, Packet, PixelGrid, TILE_SIZE,
|
||||||
|
};
|
||||||
|
|
||||||
/// An origin marks the top left position of a window sent to the display.
|
/// An origin marks the top left position of a window sent to the display.
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
@ -68,8 +70,13 @@ impl From<Command> for Packet {
|
||||||
command_code_only(CommandCode::BitmapLegacy)
|
command_code_only(CommandCode::BitmapLegacy)
|
||||||
}
|
}
|
||||||
Command::CharBrightness(Origin(x, y), grid) => Packet(
|
Command::CharBrightness(Origin(x, y), grid) => Packet(
|
||||||
Header(CommandCode::CharBrightness.into(),
|
Header(
|
||||||
x, y, grid.width as u16, grid.height as u16),
|
CommandCode::CharBrightness.into(),
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
grid.width as u16,
|
||||||
|
grid.height as u16,
|
||||||
|
),
|
||||||
grid.into(),
|
grid.into(),
|
||||||
),
|
),
|
||||||
Command::Brightness(brightness) => Packet(
|
Command::Brightness(brightness) => Packet(
|
||||||
|
@ -82,7 +89,11 @@ impl From<Command> for Packet {
|
||||||
),
|
),
|
||||||
vec![brightness],
|
vec![brightness],
|
||||||
),
|
),
|
||||||
Command::BitmapLinearWin(Origin(pixel_x, pixel_y), pixels, compression) => {
|
Command::BitmapLinearWin(
|
||||||
|
Origin(pixel_x, pixel_y),
|
||||||
|
pixels,
|
||||||
|
compression,
|
||||||
|
) => {
|
||||||
debug_assert_eq!(pixel_x % 8, 0);
|
debug_assert_eq!(pixel_x % 8, 0);
|
||||||
debug_assert_eq!(pixels.width % 8, 0);
|
debug_assert_eq!(pixels.width % 8, 0);
|
||||||
|
|
||||||
|
@ -91,7 +102,9 @@ impl From<Command> for Packet {
|
||||||
let pixel_h = pixels.height as u16;
|
let pixel_h = pixels.height as u16;
|
||||||
let payload = into_compressed(compression, pixels.into());
|
let payload = into_compressed(compression, pixels.into());
|
||||||
let command = match compression {
|
let command = match compression {
|
||||||
CompressionCode::Uncompressed => CommandCode::BitmapLinearWinUncompressed,
|
CompressionCode::Uncompressed => {
|
||||||
|
CommandCode::BitmapLinearWinUncompressed
|
||||||
|
}
|
||||||
CompressionCode::Zlib => CommandCode::BitmapLinearWinZlib,
|
CompressionCode::Zlib => CommandCode::BitmapLinearWinZlib,
|
||||||
CompressionCode::Bzip2 => CommandCode::BitmapLinearWinBzip2,
|
CompressionCode::Bzip2 => CommandCode::BitmapLinearWinBzip2,
|
||||||
CompressionCode::Lzma => CommandCode::BitmapLinearWinLzma,
|
CompressionCode::Lzma => CommandCode::BitmapLinearWinLzma,
|
||||||
|
@ -136,7 +149,13 @@ impl From<Command> for Packet {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Command::Cp437Data(Origin(x, y), grid) => Packet(
|
Command::Cp437Data(Origin(x, y), grid) => Packet(
|
||||||
Header(CommandCode::Cp437Data.into(), x, y, grid.width as u16, grid.height as u16),
|
Header(
|
||||||
|
CommandCode::Cp437Data.into(),
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
grid.width as u16,
|
||||||
|
grid.height as u16,
|
||||||
|
),
|
||||||
grid.into(),
|
grid.into(),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
@ -253,7 +272,10 @@ impl TryFrom<Packet> for Command {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn packet_into_bitmap_win(packet: Packet, compression: CompressionCode) -> Result<Command, TryFromPacketError> {
|
fn packet_into_bitmap_win(
|
||||||
|
packet: Packet,
|
||||||
|
compression: CompressionCode,
|
||||||
|
) -> Result<Command, TryFromPacketError> {
|
||||||
let Packet(Header(_, tiles_x, pixels_y, tile_w, pixel_h), payload) = packet;
|
let Packet(Header(_, tiles_x, pixels_y, tile_w, pixel_h), payload) = packet;
|
||||||
|
|
||||||
let payload = match into_decompressed(compression, payload) {
|
let payload = match into_decompressed(compression, payload) {
|
||||||
|
@ -282,13 +304,7 @@ fn bitmap_linear_into_packet(
|
||||||
let length = payload.len() as u16;
|
let length = payload.len() as u16;
|
||||||
let payload = into_compressed(compression, payload);
|
let payload = into_compressed(compression, payload);
|
||||||
Packet(
|
Packet(
|
||||||
Header(
|
Header(command.into(), offset, length, compression.into(), 0),
|
||||||
command.into(),
|
|
||||||
offset,
|
|
||||||
length,
|
|
||||||
compression.into(),
|
|
||||||
0,
|
|
||||||
),
|
|
||||||
payload,
|
payload,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -336,17 +352,21 @@ fn packet_into_linear_bitmap(
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "c_api")]
|
#[cfg(feature = "c_api")]
|
||||||
pub mod c_api
|
pub mod c_api {
|
||||||
{
|
|
||||||
use std::ptr::null_mut;
|
use std::ptr::null_mut;
|
||||||
|
|
||||||
use crate::{BitVec, Brightness, ByteGrid, Command, CompressionCode, Offset, Origin, Packet, PixelGrid};
|
use crate::{
|
||||||
|
BitVec, Brightness, ByteGrid, Command, CompressionCode, Offset, Origin,
|
||||||
|
Packet, PixelGrid,
|
||||||
|
};
|
||||||
|
|
||||||
/// Tries to turn a `Packet` into a `Command`. The packet is gets deallocated in the process.
|
/// Tries to turn a `Packet` into a `Command`. The packet is gets deallocated in the process.
|
||||||
///
|
///
|
||||||
/// Returns: pointer to command or NULL
|
/// Returns: pointer to command or NULL
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_command_try_from_packet(packet: *mut Packet) -> *mut Command {
|
pub unsafe extern "C" fn sp2_command_try_from_packet(
|
||||||
|
packet: *mut Packet,
|
||||||
|
) -> *mut Command {
|
||||||
let packet = *Box::from_raw(packet);
|
let packet = *Box::from_raw(packet);
|
||||||
match Command::try_from(packet) {
|
match Command::try_from(packet) {
|
||||||
Err(_) => null_mut(),
|
Err(_) => null_mut(),
|
||||||
|
@ -356,7 +376,9 @@ pub mod c_api
|
||||||
|
|
||||||
/// Clones a `Command` instance
|
/// Clones a `Command` instance
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_command_clone(original: *const Command) -> *mut Command {
|
pub unsafe extern "C" fn sp2_command_clone(
|
||||||
|
original: *const Command,
|
||||||
|
) -> *mut Command {
|
||||||
Box::into_raw(Box::new((*original).clone()))
|
Box::into_raw(Box::new((*original).clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,54 +402,99 @@ pub mod c_api
|
||||||
|
|
||||||
/// Allocates a new `Command::Brightness` instance
|
/// Allocates a new `Command::Brightness` instance
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_command_brightness(brightness: Brightness) -> *mut Command {
|
pub unsafe extern "C" fn sp2_command_brightness(
|
||||||
|
brightness: Brightness,
|
||||||
|
) -> *mut Command {
|
||||||
Box::into_raw(Box::new(Command::Brightness(brightness)))
|
Box::into_raw(Box::new(Command::Brightness(brightness)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allocates a new `Command::CharBrightness` instance.
|
/// Allocates a new `Command::CharBrightness` instance.
|
||||||
/// The passed `ByteGrid` gets deallocated in the process.
|
/// The passed `ByteGrid` gets deallocated in the process.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_command_char_brightness(x: u16, y: u16, byte_grid: *mut ByteGrid) -> *mut Command {
|
pub unsafe extern "C" fn sp2_command_char_brightness(
|
||||||
|
x: u16,
|
||||||
|
y: u16,
|
||||||
|
byte_grid: *mut ByteGrid,
|
||||||
|
) -> *mut Command {
|
||||||
let byte_grid = *Box::from_raw(byte_grid);
|
let byte_grid = *Box::from_raw(byte_grid);
|
||||||
Box::into_raw(Box::new(Command::CharBrightness(Origin(x, y), byte_grid)))
|
Box::into_raw(Box::new(Command::CharBrightness(
|
||||||
|
Origin(x, y),
|
||||||
|
byte_grid,
|
||||||
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allocates a new `Command::BitmapLinear` instance.
|
/// Allocates a new `Command::BitmapLinear` instance.
|
||||||
/// The passed `BitVec` gets deallocated in the process.
|
/// The passed `BitVec` gets deallocated in the process.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_command_bitmap_linear(offset: Offset, bit_vec: *mut BitVec, compression: CompressionCode) -> *mut Command {
|
pub unsafe extern "C" fn sp2_command_bitmap_linear(
|
||||||
|
offset: Offset,
|
||||||
|
bit_vec: *mut BitVec,
|
||||||
|
compression: CompressionCode,
|
||||||
|
) -> *mut Command {
|
||||||
let bit_vec = *Box::from_raw(bit_vec);
|
let bit_vec = *Box::from_raw(bit_vec);
|
||||||
Box::into_raw(Box::new(Command::BitmapLinear(offset, bit_vec, compression)))
|
Box::into_raw(Box::new(Command::BitmapLinear(
|
||||||
|
offset,
|
||||||
|
bit_vec,
|
||||||
|
compression,
|
||||||
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allocates a new `Command::BitmapLinearAnd` instance.
|
/// Allocates a new `Command::BitmapLinearAnd` instance.
|
||||||
/// The passed `BitVec` gets deallocated in the process.
|
/// The passed `BitVec` gets deallocated in the process.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_command_bitmap_linear_and(offset: Offset, bit_vec: *mut BitVec, compression: CompressionCode) -> *mut Command {
|
pub unsafe extern "C" fn sp2_command_bitmap_linear_and(
|
||||||
|
offset: Offset,
|
||||||
|
bit_vec: *mut BitVec,
|
||||||
|
compression: CompressionCode,
|
||||||
|
) -> *mut Command {
|
||||||
let bit_vec = *Box::from_raw(bit_vec);
|
let bit_vec = *Box::from_raw(bit_vec);
|
||||||
Box::into_raw(Box::new(Command::BitmapLinearAnd(offset, bit_vec, compression)))
|
Box::into_raw(Box::new(Command::BitmapLinearAnd(
|
||||||
|
offset,
|
||||||
|
bit_vec,
|
||||||
|
compression,
|
||||||
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allocates a new `Command::BitmapLinearOr` instance.
|
/// Allocates a new `Command::BitmapLinearOr` instance.
|
||||||
/// The passed `BitVec` gets deallocated in the process.
|
/// The passed `BitVec` gets deallocated in the process.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_command_bitmap_linear_or(offset: Offset, bit_vec: *mut BitVec, compression: CompressionCode) -> *mut Command {
|
pub unsafe extern "C" fn sp2_command_bitmap_linear_or(
|
||||||
|
offset: Offset,
|
||||||
|
bit_vec: *mut BitVec,
|
||||||
|
compression: CompressionCode,
|
||||||
|
) -> *mut Command {
|
||||||
let bit_vec = *Box::from_raw(bit_vec);
|
let bit_vec = *Box::from_raw(bit_vec);
|
||||||
Box::into_raw(Box::new(Command::BitmapLinearOr(offset, bit_vec, compression)))
|
Box::into_raw(Box::new(Command::BitmapLinearOr(
|
||||||
|
offset,
|
||||||
|
bit_vec,
|
||||||
|
compression,
|
||||||
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allocates a new `Command::BitmapLinearXor` instance.
|
/// Allocates a new `Command::BitmapLinearXor` instance.
|
||||||
/// The passed `BitVec` gets deallocated in the process.
|
/// The passed `BitVec` gets deallocated in the process.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_command_bitmap_linear_xor(offset: Offset, bit_vec: *mut BitVec, compression: CompressionCode) -> *mut Command {
|
pub unsafe extern "C" fn sp2_command_bitmap_linear_xor(
|
||||||
|
offset: Offset,
|
||||||
|
bit_vec: *mut BitVec,
|
||||||
|
compression: CompressionCode,
|
||||||
|
) -> *mut Command {
|
||||||
let bit_vec = *Box::from_raw(bit_vec);
|
let bit_vec = *Box::from_raw(bit_vec);
|
||||||
Box::into_raw(Box::new(Command::BitmapLinearXor(offset, bit_vec, compression)))
|
Box::into_raw(Box::new(Command::BitmapLinearXor(
|
||||||
|
offset,
|
||||||
|
bit_vec,
|
||||||
|
compression,
|
||||||
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allocates a new `Command::Cp437Data` instance.
|
/// Allocates a new `Command::Cp437Data` instance.
|
||||||
/// The passed `ByteGrid` gets deallocated in the process.
|
/// The passed `ByteGrid` gets deallocated in the process.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_command_cp437_data(x: u16, y: u16, byte_grid: *mut ByteGrid) -> *mut Command {
|
pub unsafe extern "C" fn sp2_command_cp437_data(
|
||||||
|
x: u16,
|
||||||
|
y: u16,
|
||||||
|
byte_grid: *mut ByteGrid,
|
||||||
|
) -> *mut Command {
|
||||||
let byte_grid = *Box::from_raw(byte_grid);
|
let byte_grid = *Box::from_raw(byte_grid);
|
||||||
Box::into_raw(Box::new(Command::Cp437Data(Origin(x, y), byte_grid)))
|
Box::into_raw(Box::new(Command::Cp437Data(Origin(x, y), byte_grid)))
|
||||||
}
|
}
|
||||||
|
@ -435,9 +502,18 @@ pub mod c_api
|
||||||
/// Allocates a new `Command::BitmapLinearWin` instance.
|
/// Allocates a new `Command::BitmapLinearWin` instance.
|
||||||
/// The passed `PixelGrid` gets deallocated in the process.
|
/// The passed `PixelGrid` gets deallocated in the process.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_command_bitmap_linear_win(x: u16, y: u16, byte_grid: *mut PixelGrid, compression_code: CompressionCode) -> *mut Command {
|
pub unsafe extern "C" fn sp2_command_bitmap_linear_win(
|
||||||
|
x: u16,
|
||||||
|
y: u16,
|
||||||
|
byte_grid: *mut PixelGrid,
|
||||||
|
compression_code: CompressionCode,
|
||||||
|
) -> *mut Command {
|
||||||
let byte_grid = *Box::from_raw(byte_grid);
|
let byte_grid = *Box::from_raw(byte_grid);
|
||||||
Box::into_raw(Box::new(Command::BitmapLinearWin(Origin(x, y), byte_grid, compression_code)))
|
Box::into_raw(Box::new(Command::BitmapLinearWin(
|
||||||
|
Origin(x, y),
|
||||||
|
byte_grid,
|
||||||
|
compression_code,
|
||||||
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Deallocates a `Command`. Note that connection_send does this implicitly, so you only need
|
/// Deallocates a `Command`. Note that connection_send does this implicitly, so you only need
|
||||||
|
@ -446,4 +522,4 @@ pub mod c_api
|
||||||
pub unsafe extern "C" fn sp2_command_dealloc(ptr: *mut Command) {
|
pub unsafe extern "C" fn sp2_command_dealloc(ptr: *mut Command) {
|
||||||
_ = Box::from_raw(ptr);
|
_ = Box::from_raw(ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,9 @@ impl TryFrom<u16> for CommandCode {
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
value if value == BitmapLegacy as u16 => Ok(BitmapLegacy),
|
value if value == BitmapLegacy as u16 => Ok(BitmapLegacy),
|
||||||
value if value == BitmapLinear as u16 => Ok(BitmapLinear),
|
value if value == BitmapLinear as u16 => Ok(BitmapLinear),
|
||||||
value if value == BitmapLinearWinUncompressed as u16 => Ok(BitmapLinearWinUncompressed),
|
value if value == BitmapLinearWinUncompressed as u16 => {
|
||||||
|
Ok(BitmapLinearWinUncompressed)
|
||||||
|
}
|
||||||
value if value == BitmapLinearAnd as u16 => Ok(BitmapLinearAnd),
|
value if value == BitmapLinearAnd as u16 => Ok(BitmapLinearAnd),
|
||||||
value if value == BitmapLinearOr as u16 => Ok(BitmapLinearOr),
|
value if value == BitmapLinearOr as u16 => Ok(BitmapLinearOr),
|
||||||
value if value == BitmapLinearXor as u16 => Ok(BitmapLinearXor),
|
value if value == BitmapLinearXor as u16 => Ok(BitmapLinearXor),
|
||||||
|
|
|
@ -21,7 +21,11 @@ pub(crate) fn into_decompressed(
|
||||||
let mut decompress = flate2::Decompress::new(true);
|
let mut decompress = flate2::Decompress::new(true);
|
||||||
let mut buffer = [0u8; 10000];
|
let mut buffer = [0u8; 10000];
|
||||||
|
|
||||||
let status = match decompress.decompress(&payload, &mut buffer, FlushDecompress::Finish) {
|
let status = match decompress.decompress(
|
||||||
|
&payload,
|
||||||
|
&mut buffer,
|
||||||
|
FlushDecompress::Finish,
|
||||||
|
) {
|
||||||
Err(_) => return None,
|
Err(_) => return None,
|
||||||
Ok(status) => status,
|
Ok(status) => status,
|
||||||
};
|
};
|
||||||
|
@ -29,7 +33,9 @@ pub(crate) fn into_decompressed(
|
||||||
match status {
|
match status {
|
||||||
Status::Ok => None,
|
Status::Ok => None,
|
||||||
Status::BufError => None,
|
Status::BufError => None,
|
||||||
Status::StreamEnd => Some(buffer[0..(decompress.total_out() as usize)].to_owned()),
|
Status::StreamEnd => Some(
|
||||||
|
buffer[0..(decompress.total_out() as usize)].to_owned(),
|
||||||
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[cfg(feature = "compression_bzip2")]
|
#[cfg(feature = "compression_bzip2")]
|
||||||
|
@ -42,9 +48,7 @@ pub(crate) fn into_decompressed(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[cfg(feature = "compression_lzma")]
|
#[cfg(feature = "compression_lzma")]
|
||||||
CompressionCode::Lzma => {
|
CompressionCode::Lzma => Some(lzma::decompress(&payload).unwrap()),
|
||||||
Some(lzma::decompress(&payload).unwrap())
|
|
||||||
}
|
|
||||||
#[cfg(feature = "compression_zstd")]
|
#[cfg(feature = "compression_zstd")]
|
||||||
CompressionCode::Zstd => {
|
CompressionCode::Zstd => {
|
||||||
let mut decoder = match ZstdDecoder::new(&*payload) {
|
let mut decoder = match ZstdDecoder::new(&*payload) {
|
||||||
|
@ -68,10 +72,14 @@ pub(crate) fn into_compressed(
|
||||||
CompressionCode::Uncompressed => payload,
|
CompressionCode::Uncompressed => payload,
|
||||||
#[cfg(feature = "compression_zlib")]
|
#[cfg(feature = "compression_zlib")]
|
||||||
CompressionCode::Zlib => {
|
CompressionCode::Zlib => {
|
||||||
let mut compress = flate2::Compress::new(flate2::Compression::fast(), true);
|
let mut compress =
|
||||||
|
flate2::Compress::new(flate2::Compression::fast(), true);
|
||||||
let mut buffer = [0u8; 10000];
|
let mut buffer = [0u8; 10000];
|
||||||
|
|
||||||
match compress.compress(&payload, &mut buffer, FlushCompress::Finish).expect("compress failed") {
|
match compress
|
||||||
|
.compress(&payload, &mut buffer, FlushCompress::Finish)
|
||||||
|
.expect("compress failed")
|
||||||
|
{
|
||||||
Status::Ok => panic!("buffer should be big enough"),
|
Status::Ok => panic!("buffer should be big enough"),
|
||||||
Status::BufError => panic!("BufError"),
|
Status::BufError => panic!("BufError"),
|
||||||
Status::StreamEnd => {}
|
Status::StreamEnd => {}
|
||||||
|
@ -89,9 +97,7 @@ pub(crate) fn into_compressed(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[cfg(feature = "compression_lzma")]
|
#[cfg(feature = "compression_lzma")]
|
||||||
CompressionCode::Lzma => {
|
CompressionCode::Lzma => lzma::compress(&payload, 6).unwrap(),
|
||||||
lzma::compress(&payload, 6).unwrap()
|
|
||||||
}
|
|
||||||
#[cfg(feature = "compression_zstd")]
|
#[cfg(feature = "compression_zstd")]
|
||||||
CompressionCode::Zstd => {
|
CompressionCode::Zstd => {
|
||||||
let mut encoder =
|
let mut encoder =
|
||||||
|
|
|
@ -54,10 +54,7 @@ impl Connection {
|
||||||
/// connection.send(servicepoint2::Command::BitmapLinearWin(servicepoint2::Origin::top_left(), pixels, CompressionCode::Lzma).into())
|
/// connection.send(servicepoint2::Command::BitmapLinearWin(servicepoint2::Origin::top_left(), pixels, CompressionCode::Lzma).into())
|
||||||
/// .expect("send failed");
|
/// .expect("send failed");
|
||||||
/// ```
|
/// ```
|
||||||
pub fn send(
|
pub fn send(&self, packet: Packet) -> Result<(), std::io::Error> {
|
||||||
&self,
|
|
||||||
packet: Packet,
|
|
||||||
) -> Result<(), std::io::Error> {
|
|
||||||
debug!("sending {packet:?}");
|
debug!("sending {packet:?}");
|
||||||
let data: Vec<u8> = packet.into();
|
let data: Vec<u8> = packet.into();
|
||||||
self.socket.send(&data)?;
|
self.socket.send(&data)?;
|
||||||
|
@ -66,8 +63,7 @@ impl Connection {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "c_api")]
|
#[cfg(feature = "c_api")]
|
||||||
pub mod c_api
|
pub mod c_api {
|
||||||
{
|
|
||||||
use std::ffi::{c_char, CStr};
|
use std::ffi::{c_char, CStr};
|
||||||
use std::ptr::null_mut;
|
use std::ptr::null_mut;
|
||||||
|
|
||||||
|
@ -80,11 +76,13 @@ pub mod c_api
|
||||||
///
|
///
|
||||||
/// Panics: bad string encoding
|
/// Panics: bad string encoding
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_connection_open(host: *const c_char) -> *mut Connection {
|
pub unsafe extern "C" fn sp2_connection_open(
|
||||||
|
host: *const c_char,
|
||||||
|
) -> *mut Connection {
|
||||||
let host = CStr::from_ptr(host).to_str().expect("Bad encoding");
|
let host = CStr::from_ptr(host).to_str().expect("Bad encoding");
|
||||||
let connection = match Connection::open(host) {
|
let connection = match Connection::open(host) {
|
||||||
Err(_) => return null_mut(),
|
Err(_) => return null_mut(),
|
||||||
Ok(value) => value
|
Ok(value) => value,
|
||||||
};
|
};
|
||||||
|
|
||||||
Box::into_raw(Box::new(connection))
|
Box::into_raw(Box::new(connection))
|
||||||
|
@ -92,7 +90,10 @@ pub mod c_api
|
||||||
|
|
||||||
/// Sends the command instance. The instance is consumed / destroyed and cannot be used after this call.
|
/// Sends the command instance. The instance is consumed / destroyed and cannot be used after this call.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_connection_send(connection: *const Connection, command_ptr: *mut Packet) -> bool{
|
pub unsafe extern "C" fn sp2_connection_send(
|
||||||
|
connection: *const Connection,
|
||||||
|
command_ptr: *mut Packet,
|
||||||
|
) -> bool {
|
||||||
let packet = Box::from_raw(command_ptr);
|
let packet = Box::from_raw(command_ptr);
|
||||||
(*connection).send(*packet).is_ok()
|
(*connection).send(*packet).is_ok()
|
||||||
}
|
}
|
||||||
|
@ -102,4 +103,4 @@ pub mod c_api
|
||||||
pub unsafe extern "C" fn sp2_connection_dealloc(ptr: *mut Connection) {
|
pub unsafe extern "C" fn sp2_connection_dealloc(ptr: *mut Connection) {
|
||||||
_ = Box::from_raw(ptr);
|
_ = Box::from_raw(ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ pub use crate::c_slice::CByteSlice;
|
||||||
|
|
||||||
mod bit_vec;
|
mod bit_vec;
|
||||||
mod byte_grid;
|
mod byte_grid;
|
||||||
|
mod c_slice;
|
||||||
mod command;
|
mod command;
|
||||||
mod command_code;
|
mod command_code;
|
||||||
mod compression;
|
mod compression;
|
||||||
|
@ -18,7 +19,6 @@ mod compression_code;
|
||||||
mod connection;
|
mod connection;
|
||||||
mod packet;
|
mod packet;
|
||||||
mod pixel_grid;
|
mod pixel_grid;
|
||||||
mod c_slice;
|
|
||||||
|
|
||||||
/// size of a single tile in one dimension
|
/// size of a single tile in one dimension
|
||||||
pub const TILE_SIZE: u16 = 8;
|
pub const TILE_SIZE: u16 = 8;
|
||||||
|
|
|
@ -66,22 +66,26 @@ mod c_api {
|
||||||
|
|
||||||
/// Turns a `Command` into a `Packet`. The command gets deallocated in the process.
|
/// Turns a `Command` into a `Packet`. The command gets deallocated in the process.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_packet_from_command(command: *mut Command) -> *mut Packet {
|
pub unsafe extern "C" fn sp2_packet_from_command(
|
||||||
|
command: *mut Command,
|
||||||
|
) -> *mut Packet {
|
||||||
let command = *Box::from_raw(command);
|
let command = *Box::from_raw(command);
|
||||||
let packet = command.into();
|
let packet = command.into();
|
||||||
Box::into_raw(Box::new(packet))
|
Box::into_raw(Box::new(packet))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Tries to load a `Packet` from the passed array with the specified length.
|
/// Tries to load a `Packet` from the passed array with the specified length.
|
||||||
///
|
///
|
||||||
/// returns: NULL in case of an error, pointer to the allocated packet otherwise
|
/// returns: NULL in case of an error, pointer to the allocated packet otherwise
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_packet_try_load(data: *const u8, length: usize) -> *mut Packet {
|
pub unsafe extern "C" fn sp2_packet_try_load(
|
||||||
|
data: *const u8,
|
||||||
|
length: usize,
|
||||||
|
) -> *mut Packet {
|
||||||
let data = std::slice::from_raw_parts(data, length);
|
let data = std::slice::from_raw_parts(data, length);
|
||||||
match Packet::try_from(data) {
|
match Packet::try_from(data) {
|
||||||
Err(_) => null_mut(),
|
Err(_) => null_mut(),
|
||||||
Ok(packet) => Box::into_raw(Box::new(packet))
|
Ok(packet) => Box::into_raw(Box::new(packet)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,4 +96,4 @@ mod c_api {
|
||||||
pub unsafe extern "C" fn sp2_packet_dealloc(this: *mut Packet) {
|
pub unsafe extern "C" fn sp2_packet_dealloc(this: *mut Packet) {
|
||||||
_ = Box::from_raw(this)
|
_ = Box::from_raw(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,22 +90,29 @@ impl From<PixelGrid> for Vec<u8> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "c_api")]
|
#[cfg(feature = "c_api")]
|
||||||
pub mod c_api
|
pub mod c_api {
|
||||||
{
|
|
||||||
use crate::c_slice::CByteSlice;
|
use crate::c_slice::CByteSlice;
|
||||||
use crate::PixelGrid;
|
use crate::PixelGrid;
|
||||||
|
|
||||||
/// Creates a new `PixelGrid` instance.
|
/// Creates a new `PixelGrid` instance.
|
||||||
/// The returned instance has to be freed with `pixel_grid_dealloc`.
|
/// The returned instance has to be freed with `pixel_grid_dealloc`.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_pixel_grid_new(width: usize, height: usize) -> *mut PixelGrid {
|
pub unsafe extern "C" fn sp2_pixel_grid_new(
|
||||||
|
width: usize,
|
||||||
|
height: usize,
|
||||||
|
) -> *mut PixelGrid {
|
||||||
Box::into_raw(Box::new(PixelGrid::new(width, height)))
|
Box::into_raw(Box::new(PixelGrid::new(width, height)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Loads a `PixelGrid` with the specified dimensions from the provided data.
|
/// Loads a `PixelGrid` with the specified dimensions from the provided data.
|
||||||
/// The returned instance has to be freed with `pixel_grid_dealloc`.
|
/// The returned instance has to be freed with `pixel_grid_dealloc`.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_pixel_grid_load(width: usize, height: usize, data: *const u8, data_length: usize) -> *mut PixelGrid {
|
pub unsafe extern "C" fn sp2_pixel_grid_load(
|
||||||
|
width: usize,
|
||||||
|
height: usize,
|
||||||
|
data: *const u8,
|
||||||
|
data_length: usize,
|
||||||
|
) -> *mut PixelGrid {
|
||||||
let data = std::slice::from_raw_parts(data, data_length);
|
let data = std::slice::from_raw_parts(data, data_length);
|
||||||
Box::into_raw(Box::new(PixelGrid::load(width, height, data)))
|
Box::into_raw(Box::new(PixelGrid::load(width, height, data)))
|
||||||
}
|
}
|
||||||
|
@ -113,7 +120,9 @@ pub mod c_api
|
||||||
/// Clones a `PixelGrid`.
|
/// Clones a `PixelGrid`.
|
||||||
/// The returned instance has to be freed with `pixel_grid_dealloc`.
|
/// The returned instance has to be freed with `pixel_grid_dealloc`.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_pixel_grid_clone(this: *const PixelGrid) -> *mut PixelGrid {
|
pub unsafe extern "C" fn sp2_pixel_grid_clone(
|
||||||
|
this: *const PixelGrid,
|
||||||
|
) -> *mut PixelGrid {
|
||||||
Box::into_raw(Box::new((*this).clone()))
|
Box::into_raw(Box::new((*this).clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,31 +136,47 @@ pub mod c_api
|
||||||
|
|
||||||
/// Get the current value at the specified position
|
/// Get the current value at the specified position
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_pixel_grid_get(this: *const PixelGrid, x: usize, y: usize) -> bool {
|
pub unsafe extern "C" fn sp2_pixel_grid_get(
|
||||||
|
this: *const PixelGrid,
|
||||||
|
x: usize,
|
||||||
|
y: usize,
|
||||||
|
) -> bool {
|
||||||
(*this).get(x, y)
|
(*this).get(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the current value at the specified position
|
/// Sets the current value at the specified position
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_pixel_grid_set(this: *mut PixelGrid, x: usize, y: usize, value: bool) {
|
pub unsafe extern "C" fn sp2_pixel_grid_set(
|
||||||
|
this: *mut PixelGrid,
|
||||||
|
x: usize,
|
||||||
|
y: usize,
|
||||||
|
value: bool,
|
||||||
|
) {
|
||||||
(*this).set(x, y, value);
|
(*this).set(x, y, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Fills the whole `PixelGrid` with the specified value
|
/// Fills the whole `PixelGrid` with the specified value
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_pixel_grid_fill(this: *mut PixelGrid, value: bool) {
|
pub unsafe extern "C" fn sp2_pixel_grid_fill(
|
||||||
|
this: *mut PixelGrid,
|
||||||
|
value: bool,
|
||||||
|
) {
|
||||||
(*this).fill(value);
|
(*this).fill(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the width in pixels of the `PixelGrid` instance.
|
/// Gets the width in pixels of the `PixelGrid` instance.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_pixel_grid_width(this: *const PixelGrid) -> usize {
|
pub unsafe extern "C" fn sp2_pixel_grid_width(
|
||||||
|
this: *const PixelGrid,
|
||||||
|
) -> usize {
|
||||||
(*this).width
|
(*this).width
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the height in pixels of the `PixelGrid` instance.
|
/// Gets the height in pixels of the `PixelGrid` instance.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_pixel_grid_height(this: *const PixelGrid) -> usize {
|
pub unsafe extern "C" fn sp2_pixel_grid_height(
|
||||||
|
this: *const PixelGrid,
|
||||||
|
) -> usize {
|
||||||
(*this).height
|
(*this).height
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +190,9 @@ pub mod c_api
|
||||||
/// Reading and writing concurrently to either the original instance or the returned data will
|
/// Reading and writing concurrently to either the original instance or the returned data will
|
||||||
/// result in undefined behavior.
|
/// result in undefined behavior.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sp2_pixel_grid_unsafe_data_ref(this: *mut PixelGrid) -> CByteSlice {
|
pub unsafe extern "C" fn sp2_pixel_grid_unsafe_data_ref(
|
||||||
|
this: *mut PixelGrid,
|
||||||
|
) -> CByteSlice {
|
||||||
let data = (*this).mut_data_ref();
|
let data = (*this).mut_data_ref();
|
||||||
CByteSlice {
|
CByteSlice {
|
||||||
start: data.as_mut_ptr_range().start,
|
start: data.as_mut_ptr_range().start,
|
||||||
|
|
Loading…
Reference in a new issue