In my Rust lib I have the following:
#[wasm_bindgen]
pub struct Color {
red: u8,
green: u8,
blue: u8,
}
#[wasm_bindgen]
pub struct Image {
pixels: Vec<Color>,
}
#[wasm_bindgen]
impl Image {
pub fn new() -> Image {
let color1 = Color {
red: 255,
green: 0,
blue: 0,
};
let color2 = Color {
red: 60,
green: 70,
blue: 90,
};
let pixels = vec![color1, color2];
Image { pixels }
}
pub fn pixels_ptr(&self) -> *const Color {
self.pixels.as_ptr()
}
}
======================================================
All compiles well, but when I try to use the Image in the Javascript code and draw a canvas in the Javascript part, the pixels
array contains only 0's and not the Image colors:
import { Image } from '../pkg'
const memory = new WebAssembly.Memory({ initial: 256 })
const image = Image.new()
const pixelsPointer = image.pixels_ptr()
const pixels = new Uint8Array(memory.buffer, pixelsPointer, 6)
function numToHex(value) {
const hex = value.toString(16)
return hex.length === 1 ? `0${hex}` : hex
}
function drawPixel(x, y, color) {
const ctx = canvas.getContext('2d')
ctx.fillStyle = `#${numToHex(color[0])}${numToHex(color[1])}${numToHex(
color[2],
)}`
ctx.fillRect(x, y, 100, 100)
}
const canvas = document.createElement('canvas')
document.body.appendChild(canvas)
drawPixel(0, 0, pixels.slice(0, 3))
drawPixel(100, 0, pixels.slice(3, 6))
I need to find the way to consume the pointer values from Rust in the Javascript.
=====================================================
Also, the const pixelsPointer = image.pixels_ptr()
in Javascript is of type number
and not an array of numbers. And I don't understand this part: it's a vec![color1, color2];
on the Rust's side. Is it supposed to be an array on the Javascript side, so that an Uint8Array
could be constructed?