Skip to content

Commit 1ecc5c4

Browse files
authored
dmi: Add QR code generation (#226)
1 parent ca4586e commit 1ecc5c4

File tree

4 files changed

+38
-1
lines changed

4 files changed

+38
-1
lines changed

Cargo.lock

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ indexmap = { version = "2.10.0", optional = true, features = [
7878
"rayon",
7979
] }
8080
ordered-float = { version = "5.0.0", optional = true, features = ["serde"] }
81+
qrcode = { version = "0.14.1", optional = true, features = ["image", "svg"]}
8182

8283
[features]
8384
default = [
@@ -137,7 +138,7 @@ all = [
137138
acreplace = ["aho-corasick"]
138139
batchnoise = ["dbpnoise"]
139140
cellularnoise = ["rand", "rayon"]
140-
dmi = ["png", "image", "serde_repr"]
141+
dmi = ["png", "image", "qrcode", "serde_repr"]
141142
file = []
142143
git = ["gix", "chrono"]
143144
hash = [

dmsrc/dmi.dm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,6 @@
3737
* `metadata` must be a json_encode'd list in the metadata format listed above.
3838
*/
3939
#define rustg_dmi_inject_metadata(path, metadata) RUSTG_CALL(RUST_G, "dmi_inject_metadata")(path, metadata)
40+
41+
#define rustg_create_qr_code_png(path, data) RUSTG_CALL(RUST_G, "create_qr_code_png")(path, data)
42+
#define rustg_create_qr_code_svg(data) RUSTG_CALL(RUST_G, "create_qr_code_svg")(data)

src/dmi.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ use dmi::{
33
error::DmiError,
44
icon::{Icon, Looping},
55
};
6+
use image::Rgba;
67
use png::{text_metadata::ZTXtChunk, Decoder, Encoder, OutputInfo, Reader};
8+
use qrcode::{render::svg, QrCode};
79
use serde::{Deserialize, Serialize};
810
use serde_repr::{Deserialize_repr, Serialize_repr};
911
use std::{
@@ -302,3 +304,24 @@ fn inject_metadata(path: &str, metadata: &str) -> Result<()> {
302304
encoder.write_header()?.write_image_data(&raw_image_data)?;
303305
Ok(())
304306
}
307+
308+
byond_fn!(fn create_qr_code_png(path, data) {
309+
let code = match QrCode::new(data.as_bytes()) {
310+
Ok(code) => code,
311+
Err(err) => return Some(format!("Error: Could not read data into QR code: {err}"))
312+
};
313+
let image = code.render::<Rgba<u8>>().build();
314+
match image.save(path) {
315+
Ok(_) => Some(String::from(path)),
316+
Err(err) => Some(format!("Error: Could not write QR code image to path: {err}"))
317+
}
318+
});
319+
320+
byond_fn!(fn create_qr_code_svg(data) {
321+
let code = match QrCode::new(data.as_bytes()) {
322+
Ok(code) => code,
323+
Err(err) => return Some(format!("Error: Could not read data into QR code: {err}"))
324+
};
325+
let svg_xml = code.render::<svg::Color>().build();
326+
Some(svg_xml)
327+
});

0 commit comments

Comments
 (0)