Skip to content

Commit c9f1a8b

Browse files
committed
Update base64 create
Signed-off-by: Cléo Rebert <cleo.rebert@gmail.com>
1 parent 57cbb00 commit c9f1a8b

File tree

4 files changed

+29
-15
lines changed

4 files changed

+29
-15
lines changed

qrcodegen-image/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## [1.4.0](https://github.com/constantoine/totp-rs/releases/tag/qrcodegen-image%2Fv1.4.0) (08/03/2024)
4+
5+
### What's new
6+
7+
- `draw_canvas` is now 15%(!) faster on my machine after optimizing the "drawing_square" loop.
8+
- Updated `base64` crate to `0.22`.
9+
310
## [1.3.0](https://github.com/constantoine/totp-rs/releases/tag/qrcodegen-image%2Fv1.3.0) (19/01/2024)
411

512
### What's new

qrcodegen-image/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "qrcodegen-image"
3-
version = "1.3.0"
3+
version = "1.4.0"
44
edition = "2021"
55
authors = ["Cleo Rebert <cleo.rebert@gmail.com>"]
66
rust-version = "1.61"
@@ -19,7 +19,7 @@ base64 = ["dep:base64"]
1919
[dependencies]
2020
qrcodegen = "1.8"
2121
image = { version = "0.24", features = ["png"], default-features = false}
22-
base64 = { version = "0.21", optional = true }
22+
base64 = { version = "0.22", optional = true }
2323

2424
[dev-dependencies]
2525
criterion = { version = "0.5", features = ["html_reports"] }

qrcodegen-image/benches/benches.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
22

3-
fn criterion_benchmark(c: &mut Criterion) {
3+
fn canvas_benchmark(c: &mut Criterion) {
44
let input = qrcodegen::QrCode::encode_text("otpauth://totp/GitHub:test?issuer=GitHub&secret=KRSXG5CTMVRXEZLUKN2XAZLSKNSWG4TFOQ&digits=8&period=60&algorithm=SHA256", qrcodegen::QrCodeEcc::Medium).unwrap();
55
c.bench_with_input(
66
BenchmarkId::new("qrcodegen-image", "draw_canvas"),
@@ -13,5 +13,18 @@ fn criterion_benchmark(c: &mut Criterion) {
1313
);
1414
}
1515

16-
criterion_group!(benches, criterion_benchmark);
16+
fn png_benchmark(c: &mut Criterion) {
17+
let input = "otpauth://totp/GitHub:test?issuer=GitHub&secret=KRSXG5CTMVRXEZLUKN2XAZLSKNSWG4TFOQ&digits=8&period=60&algorithm=SHA256";
18+
c.bench_with_input(
19+
BenchmarkId::new("qrcodegen-image", "draw_png"),
20+
black_box(&input),
21+
|b, i| {
22+
b.iter(|| {
23+
let _img = qrcodegen_image::draw_png(i);
24+
})
25+
},
26+
);
27+
}
28+
29+
criterion_group!(benches, canvas_benchmark, png_benchmark);
1730
criterion_main!(benches);

qrcodegen-image/src/lib.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,16 @@ pub fn draw_canvas(qr: qrcodegen::QrCode) -> image::ImageBuffer<Luma<u8>, Vec<u8
1111
// "+ 8 * 8" is here to add padding (the white border around the QRCode)
1212
// As some QRCode readers don't work without padding
1313
let image_size = size * 8 + 8 * 8;
14-
let mut canvas = image::GrayImage::new(image_size, image_size);
15-
16-
// Draw the border
17-
for pixel in canvas.pixels_mut() {
18-
*pixel = Luma([255]);
19-
}
14+
let mut canvas = image::GrayImage::from_pixel(image_size, image_size, Luma([255]));
2015

2116
let raw = canvas.as_mut();
2217

2318
// The QR inside the white border
2419
for x_qr in 0..size {
2520
for y_qr in 0..size {
26-
// The canvas is a grayscale image without alpha. Hence it's only one 8-bits byte longs
27-
// This clever trick to one-line the value was achieved with advanced mathematics
28-
// And deep understanding of Boolean algebra.
29-
let val = !qr.get_module(x_qr as i32, y_qr as i32) as u8 * 255;
21+
if !qr.get_module(x_qr as i32, y_qr as i32) {
22+
continue
23+
}
3024

3125
// Multiply coordinates by width of pixels
3226
// And take into account the 8*4 padding on top and left side
@@ -36,7 +30,7 @@ pub fn draw_canvas(qr: qrcodegen::QrCode) -> image::ImageBuffer<Luma<u8>, Vec<u8
3630
// Draw a 8-pixels-wide square
3731
for y_img in y_start..y_start + 8 {
3832
let start = (x_start + y_img * image_size) as usize;
39-
raw[start..start + 8].copy_from_slice(&[val; 8]);
33+
raw[start..start + 8].copy_from_slice(&[0; 8]);
4034
}
4135
}
4236
}

0 commit comments

Comments
 (0)