diff --git a/deno_wasm_qr/decodeqr/src/lib.rs b/deno_wasm_qr/decodeqr/src/lib.rs index c4073e7..23677e9 100644 --- a/deno_wasm_qr/decodeqr/src/lib.rs +++ b/deno_wasm_qr/decodeqr/src/lib.rs @@ -1,25 +1,34 @@ use std::ffi::CString; use std::os::raw::c_char; -pub const SAMPLE_QR_BYTES: &[u8] = std::include_bytes!("sample_qr.png"); +pub const SAMPLE_QR_BYTES: &[u8] = std::include_bytes!("sample_qr.png"); +pub const SAMPLE_QR_BYTES_2: &[u8] = std::include_bytes!("sample_qr_2.png"); #[no_mangle] pub extern "C" fn parse_default_qr() -> *mut c_char { - let s = CString::new(parse_qr()).unwrap(); + let s = CString::new(parse_qr(SAMPLE_QR_BYTES)).unwrap(); s.into_raw() } -pub fn parse_qr() -> String { - let img = image::load_from_memory(SAMPLE_QR_BYTES).unwrap(); +#[no_mangle] +pub extern "C" fn parse_default_qr_2() -> *mut c_char { + let s = CString::new(parse_qr(SAMPLE_QR_BYTES_2)).unwrap(); + s.into_raw() +} + +pub fn parse_qr(bs: &[u8]) -> String { + let img = match image::load_from_memory(bs) { + Ok(i) => i, Err(e) => return format!("Load image error: {}", e), + }; let decoder = bardecoder::default_decoder(); let mut ret = vec![]; let results = decoder.decode(&img); for result in results { - let qr = result.unwrap(); + let qr = result.unwrap_or_else(|e| format!("Decode QR error: {}", e)); println!("{}", qr); ret.push(qr); } - ret.join(",") + ret.join("||") } diff --git a/deno_wasm_qr/decodeqr/src/sample_qr_2.png b/deno_wasm_qr/decodeqr/src/sample_qr_2.png new file mode 100644 index 0000000..0d87e8f Binary files /dev/null and b/deno_wasm_qr/decodeqr/src/sample_qr_2.png differ diff --git a/deno_wasm_qr/parse_qr.ts b/deno_wasm_qr/parse_qr.ts index cee1a5b..674fc4b 100644 --- a/deno_wasm_qr/parse_qr.ts +++ b/deno_wasm_qr/parse_qr.ts @@ -4,6 +4,7 @@ const wasmInstance = new WebAssembly.Instance(wasmModule); const linearMemory = wasmInstance.exports.memory; +// from https://tilman.xyz/blog/2019/12/building-webassembly-for-deno/ function readString(memory, ptr) { const mem = new Uint8Array(memory.buffer, ptr); let length; @@ -11,4 +12,5 @@ function readString(memory, ptr) { return new TextDecoder("utf-8").decode(new Uint8Array(mem.buffer, ptr, length)); } -console.log(readString(linearMemory, wasmInstance.exports.parse_default_qr())); \ No newline at end of file +console.log("DECODED:\n" + readString(linearMemory, wasmInstance.exports.parse_default_qr())); +console.log("DECODED:\n" + readString(linearMemory, wasmInstance.exports.parse_default_qr_2()));