diff --git a/docs/wasm-shaper.md b/docs/wasm-shaper.md index 07705a454..ad72a1f90 100644 --- a/docs/wasm-shaper.md +++ b/docs/wasm-shaper.md @@ -35,12 +35,12 @@ harfbuzz-wasm = { path = "your-harfbuzz-source/src/wasm/rust/harfbuzz-wasm"} use wasm_bindgen::prelude::*; #[wasm_bindgen] -pub fn shape(_font_ref: u32, _buf_ref: u32, _features: u32, _num_features: u32) -> i32 { +pub fn shape(_shape_plan: u32, _font_ref: u32, _buf_ref: u32, _features: u32) -> i32 { 1 // success! } ``` -This exports a shaping function which takes two arguments, tokens representing the font and the buffer, and returns a status value. We can pass these tokens back to Harfbuzz in order to use its native functions on the font and buffer objects. More on native functions later - let's get this shaper compiled and added into a font: +This exports a shaping function which takes four arguments, tokens representing the shaping plan, the font and the buffer, and returns a status value. We can pass these tokens back to Harfbuzz in order to use its native functions on the font and buffer objects. More on native functions later - let's get this shaper compiled and added into a font: * To compile the shaper, run `wasm-pack build --target nodejs`: @@ -85,7 +85,7 @@ In debugging builds of Harfbuzz, we can print some output from the web assembly use harfbuzz_wasm::debug; #[wasm_bindgen] -pub fn shape(_font_ref: u32, _buf_ref: u32, _features: u32, _num_features: u32) -> i32 { +pub fn shape(shape_plan, font_ref: u32, buf_ref: u32, _features: u32) -> i32 { debug("Hello from Rust!\n"); 1 } @@ -106,7 +106,7 @@ use wasm_bindgen::prelude::*; use harfbuzz_wasm::{Font, GlyphBuffer}; #[wasm_bindgen] -pub fn shape(_font_ref: u32, _buf_ref: u32, _features: u32, _num_features: u32) -> i32 { +pub fn shape(_shape_plan:u32, font_ref: u32, buf_ref: u32, _features: u32) -> i32 { let font = Font::from_ref(font_ref); let mut buffer = GlyphBuffer::from_ref(buf_ref); for mut item in buffer.glyphs.iter_mut() { diff --git a/src/wasm/rust/harfbuzz-wasm/src/lib.rs b/src/wasm/rust/harfbuzz-wasm/src/lib.rs index 4b34e1d2d..3fe1fa545 100644 --- a/src/wasm/rust/harfbuzz-wasm/src/lib.rs +++ b/src/wasm/rust/harfbuzz-wasm/src/lib.rs @@ -42,7 +42,7 @@ extern "C" { fn font_get_glyph_h_advance(font: u32, glyph: u32) -> i32; fn font_get_glyph_v_advance(font: u32, glyph: u32) -> i32; fn face_copy_table(font: u32, tag: u32) -> Blob; - fn buffer_copy_contents(buffer: u32) -> CBufferContents; + fn buffer_copy_contents(buffer: u32, cbuffer: *mut CBufferContents) -> bool; fn buffer_set_contents(buffer: u32, cbuffer: &CBufferContents) -> bool; fn debugprint(s: *const u8); fn shape_with( @@ -203,7 +203,15 @@ impl Buffer { /// The `Buffer` struct implements Drop, meaning that when the shaping /// function is finished, the buffer contents are sent back to Harfbuzz. pub fn from_ref(ptr: u32) -> Self { - let c_contents: CBufferContents = unsafe { buffer_copy_contents(ptr) }; + let mut c_contents = CBufferContents { + info: std::ptr::null_mut(), + position: std::ptr::null_mut(), + length: 0, + }; + + unsafe { + buffer_copy_contents(ptr, &mut c_contents) || panic!("Couldn't copy buffer contents") + }; let positions: Vec = unsafe { std::slice::from_raw_parts(c_contents.position, c_contents.length as usize).to_vec() };