98 lines
2.7 KiB
Rust
98 lines
2.7 KiB
Rust
use wasm_bindgen::prelude::*;
|
|
|
|
#[wasm_bindgen]
|
|
pub fn add(a: i32, b: i32) -> i32 {
|
|
a + b
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn de_iavascriptis(a: i32, b: i32) -> i32 {
|
|
add_integer_with_constant(a, b)
|
|
}
|
|
|
|
const CONSTANT: i32 = 94;
|
|
|
|
fn add_integer_with_constant(a: i32, b: i32) -> i32 {
|
|
a + b + CONSTANT
|
|
}
|
|
|
|
// Linear memory example - see
|
|
// https://wasmbyexample.dev/examples/webassembly-linear-memory/webassembly-linear-memory.rust.en-us.html
|
|
|
|
const WASM_MEMORY_BUF_SIZE: usize = 2;
|
|
static mut WASM_MEMORY_BUFFER: [u8; WASM_MEMORY_BUF_SIZE] = [0; WASM_MEMORY_BUF_SIZE];
|
|
|
|
#[wasm_bindgen]
|
|
pub fn store_value_in_wasm_mem_idx_0(value: u8) {
|
|
unsafe {
|
|
WASM_MEMORY_BUFFER[0] = value;
|
|
}
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn get_wasm_mem_buffer_pointer() -> *const u8 {
|
|
let ptr: * const u8 = unsafe {
|
|
WASM_MEMORY_BUFFER.as_ptr()
|
|
};
|
|
ptr
|
|
}
|
|
|
|
|
|
#[wasm_bindgen]
|
|
pub fn read_wasm_mem_buffer_idx_1() -> u8 {
|
|
let value = unsafe {
|
|
WASM_MEMORY_BUFFER[1]
|
|
};
|
|
value
|
|
}
|
|
|
|
// Checkerboard example
|
|
|
|
const CHECKERBOARD_SIZE: usize = 20;
|
|
|
|
// 20x20 grid, (r,g,b,a) per grid cell
|
|
const OUTPUT_BUF_SIZE: usize = CHECKERBOARD_SIZE * CHECKERBOARD_SIZE * 4;
|
|
static mut OUTPUT_BUF: [u8; OUTPUT_BUF_SIZE] = [0; OUTPUT_BUF_SIZE];
|
|
|
|
#[wasm_bindgen]
|
|
pub fn get_output_buf_ptr() -> *const u8 {
|
|
unsafe {
|
|
OUTPUT_BUF.as_ptr() as *const u8
|
|
}
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn generate_checkerboard(dark_red: u8, dark_green: u8, dark_blue: u8, light_red: u8, light_green: u8, light_blue: u8) {
|
|
for y in 0..CHECKERBOARD_SIZE {
|
|
for x in 0..CHECKERBOARD_SIZE {
|
|
|
|
let dark_square = {
|
|
let mut b = y % 2 == 0;
|
|
if x % 2 == 0 {
|
|
b = !b;
|
|
}
|
|
b
|
|
};
|
|
|
|
// Now that we determined if we are dark or light,
|
|
// Let's set our square value
|
|
let square_value_red = if dark_square { dark_red } else { light_red };
|
|
let square_value_green = if dark_square { dark_green } else { light_green };
|
|
let square_value_blue = if dark_square { dark_blue } else { light_blue };
|
|
|
|
// Let's calculate our index, using our 2d -> 1d mapping.
|
|
// And then multiple by 4, for each pixel property (r,g,b,a).
|
|
let square_number: usize = y * CHECKERBOARD_SIZE + x;
|
|
let rgba_index: usize = square_number * 4;
|
|
|
|
// Finally store the values.
|
|
unsafe {
|
|
OUTPUT_BUF[rgba_index + 0] = square_value_red;
|
|
OUTPUT_BUF[rgba_index + 1] = square_value_green;
|
|
OUTPUT_BUF[rgba_index + 2] = square_value_blue;
|
|
OUTPUT_BUF[rgba_index + 3] = 255; // Alpha (Always Opaque)
|
|
}
|
|
}
|
|
}
|
|
}
|