Modularize QrCode

Signed-off-by: Dude so hot <djohn@fbi.gov>
This commit is contained in:
Dude so hot authored and renovate[bot] committed 2024-09-14 20:08:51 +08:00
1 parent f0d3b0c8ae
commit 69370efcf5
5 files changed
+49 -42

No files matched your search

+4 -4
View File
@@ -33,9 +33,9 @@ dependencies = [
[[package]]
name = "anyhow"
version = "1.0.87"
version = "1.0.88"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10f00e1f6e58a40e807377c75c6a7f97bf9044fab57816f2414e6f5f4499d7b8"
checksum = "4e1496f8fb1fbf272686b8d37f523dab3e4a7443300055e74cdaa449f3114356"
[[package]]
name = "autocfg"
@@ -694,9 +694,9 @@ dependencies = [
[[package]]
name = "unicode-ident"
version = "1.0.12"
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
[[package]]
name = "walkdir"
+1 -1
View File
@@ -17,8 +17,8 @@ android_logger = { default-features = false, version = "0.14" }
serde_cbor = "0.11"
serde = { version = "1.0", features = ["derive"] }
anyhow = "1.0"
image = { default-features = false, version = "0.24" }
bardecoder = "0.5"
image = "0.24"
ndk = { version = "0.9", features = ["bitmap"] }
[profile.release]
+1
View File
@@ -0,0 +1 @@
mod qr_code;
+41
View File
@@ -0,0 +1,41 @@
use crate::{get_bitmap_handle, jni_throwing};
use anyhow::{anyhow, Result};
use bardecoder::decode::Decode;
use bardecoder::default_builder;
use bardecoder::extract::QRExtractor;
use bardecoder::util::qr::{QRData, QRError};
use image::ImageBuffer;
use jni::objects::JClass;
use jni::sys::{jboolean, jobject};
use jni::JNIEnv;
use jni_fn::jni_fn;
use std::ptr::slice_from_raw_parts;
#[allow(dead_code)]
struct Nothing {}
impl Decode<QRData, String, QRError> for Nothing {
fn decode(&self, result: Result<QRData, QRError>) -> Result<String, QRError> {
result.map(|_| String::new())
}
}
#[no_mangle]
#[allow(non_snake_case)]
#[jni_fn("com.hippo.ehviewer.image.ImageKt")]
pub fn hasQrCode(mut env: JNIEnv, _class: JClass, object: jobject) -> jboolean {
let handle = get_bitmap_handle(&mut env, object);
jni_throwing(&mut env, |_| {
let bitmap_info = handle.info()?;
let (width, height) = (bitmap_info.width(), bitmap_info.height());
let ptr = handle.lock_pixels()? as *const u8;
let buffer = unsafe { &*slice_from_raw_parts(ptr, (width * height * 4) as usize) };
let mut decoder = default_builder();
decoder.qr(Box::new(QRExtractor {}), Box::new(Nothing {}));
let image = ImageBuffer::from_raw(width, height, buffer);
let result = image.map(|img| decoder.build().decode(&img));
handle.unlock_pixels()?;
let vec = result.ok_or(anyhow!("Internal Error!"))?;
Ok(vec.iter().any(|i| i.is_ok()) as jboolean)
})
}
+2 -37
View File
@@ -1,22 +1,16 @@
mod image;
mod parser;
use android_logger::Config;
use anyhow::{anyhow, ensure, Result};
use bardecoder::decode::Decode;
use bardecoder::default_builder;
use bardecoder::extract::QRExtractor;
use bardecoder::util::qr::{QRData, QRError};
use image::ImageBuffer;
use jni::objects::{JByteBuffer, JClass};
use jni::objects::JByteBuffer;
use jni::sys::{jboolean, jint, jobject, JavaVM, JNI_VERSION_1_6};
use jni::JNIEnv;
use jni_fn::jni_fn;
use log::LevelFilter;
use ndk::bitmap::Bitmap;
use serde::Serialize;
use std::ffi::c_void;
use std::io::Cursor;
use std::ptr::slice_from_raw_parts;
use std::ptr::slice_from_raw_parts_mut;
use std::str::from_utf8_unchecked;
use tl::ParserOptions;
@@ -151,35 +145,6 @@ fn get_bitmap_handle(env: &mut JNIEnv, bitmap: jobject) -> Bitmap {
unsafe { Bitmap::from_jni(env.get_raw(), bitmap) }
}
#[allow(dead_code)]
struct Nothing {}
impl Decode<QRData, String, QRError> for Nothing {
fn decode(&self, result: Result<QRData, QRError>) -> Result<String, QRError> {
result.map(|_| String::new())
}
}
#[no_mangle]
#[allow(non_snake_case)]
#[jni_fn("com.hippo.ehviewer.image.ImageKt")]
pub fn hasQrCode(mut env: JNIEnv, _class: JClass, object: jobject) -> jboolean {
let handle = get_bitmap_handle(&mut env, object);
jni_throwing(&mut env, |_| {
let bitmap_info = handle.info()?;
let (width, height) = (bitmap_info.width(), bitmap_info.height());
let ptr = handle.lock_pixels()? as *const u8;
let buffer = unsafe { &*slice_from_raw_parts(ptr, (width * height * 4) as usize) };
let mut decoder = default_builder();
decoder.qr(Box::new(QRExtractor {}), Box::new(Nothing {}));
let image = ImageBuffer::from_raw(width, height, buffer);
let result = image.map(|img| decoder.build().decode(&img));
handle.unlock_pixels()?;
let vec = result.ok_or(anyhow!("Internal Error!"))?;
Ok(vec.iter().any(|i| i.is_ok()) as jboolean)
})
}
#[no_mangle]
pub extern "system" fn JNI_OnLoad(_: JavaVM, _: *mut c_void) -> jint {
android_logger::init_once(Config::default().with_max_level(LevelFilter::Debug));