rust-webwasm/checkerboard/src/lib.rs

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)
}
}
}
}