Skip to content

Commit e382be1

Browse files
committed
Merge remote-tracking branch 'origin/master' into version-0.13
2 parents acf2f6f + a057c4e commit e382be1

File tree

23 files changed

+796
-323
lines changed

23 files changed

+796
-323
lines changed

.github/workflows/rust.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,14 @@ jobs:
1717
with:
1818
toolchain: ${{ matrix.rust }}
1919
override: true
20+
components: clippy
2021
- name: build
2122
run: >
2223
cargo build --verbose --no-default-features --features "$FEATURES"
24+
- name: clippy
25+
run: >
26+
cargo clippy --verbose --all-targets --no-default-features --features "$FEATURES"
27+
if: ${{ matrix.rust == 'stable' }}
2328
- name: test
2429
run: >
2530
cargo test --tests --benches --no-default-features --features "$FEATURES"
@@ -29,7 +34,6 @@ jobs:
2934
rustfmt:
3035
runs-on: ubuntu-latest
3136
continue-on-error: false
32-
if: false
3337
steps:
3438
- uses: actions/checkout@v2
3539
- uses: actions-rs/toolchain@v1

Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,15 @@ required-features = ["std"]
4343
name = "rgb_frame"
4444
harness = false
4545
required-features = ["std", "color_quant"]
46+
47+
[[example]]
48+
name = "check"
49+
required-features = ["std"]
50+
51+
[[example]]
52+
name = "explode"
53+
required-features = ["std"]
54+
55+
[[example]]
56+
name = "parallel"
57+
required-features = ["std"]

benches/decode.rs

Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
1-
use criterion::{black_box, BenchmarkId, BenchmarkGroup, Criterion, Throughput, measurement::Measurement};
1+
use criterion::{
2+
black_box, measurement::Measurement, BenchmarkGroup, BenchmarkId, Criterion, Throughput,
3+
};
24
use gif::Decoder;
35

46
fn read_image(image: &[u8]) -> Option<Vec<u8>> {
57
let decoder = Decoder::new(black_box(image));
68
//decoder.set_param(gif::ColorOutput::RGBA);
79
let mut reader = decoder.unwrap();
810

9-
while reader.next_frame_info().unwrap().is_some() {
11+
if reader.next_frame_info().unwrap().is_some() {
1012
let mut v = vec![0; reader.buffer_size()];
1113
reader.fill_buffer(&mut v).unwrap();
12-
return Some(v);
14+
Some(v)
15+
} else {
16+
None
1317
}
14-
None
1518
}
1619

1720
fn read_metadata(image: &[u8]) {
@@ -42,38 +45,49 @@ fn main() {
4245
let mut c = Criterion::default().configure_from_args();
4346
let mut group = c.benchmark_group("gif");
4447

45-
run_bench_def(&mut group, BenchDef {
46-
data: include_bytes!("note.gif"),
47-
id: "note.gif",
48-
sample_size: 100,
49-
});
48+
run_bench_def(
49+
&mut group,
50+
BenchDef {
51+
data: include_bytes!("note.gif"),
52+
id: "note.gif",
53+
sample_size: 100,
54+
},
55+
);
5056

51-
run_bench_def(&mut group, BenchDef {
52-
data: include_bytes!("photo.gif"),
53-
id: "photo.gif",
54-
sample_size: 20,
55-
});
57+
run_bench_def(
58+
&mut group,
59+
BenchDef {
60+
data: include_bytes!("photo.gif"),
61+
id: "photo.gif",
62+
sample_size: 20,
63+
},
64+
);
5665

57-
run_bench_def(&mut group, BenchDef {
58-
data: include_bytes!("../tests/samples/sample_1.gif"),
59-
id: "sample_1.gif",
60-
sample_size: 100,
61-
});
66+
run_bench_def(
67+
&mut group,
68+
BenchDef {
69+
data: include_bytes!("../tests/samples/sample_1.gif"),
70+
id: "sample_1.gif",
71+
sample_size: 100,
72+
},
73+
);
6274

63-
run_bench_def(&mut group, BenchDef {
64-
data: include_bytes!("../tests/samples/sample_big.gif"),
65-
id: "sample_big.gif",
66-
sample_size: 20,
67-
});
75+
run_bench_def(
76+
&mut group,
77+
BenchDef {
78+
data: include_bytes!("../tests/samples/sample_big.gif"),
79+
id: "sample_big.gif",
80+
sample_size: 20,
81+
},
82+
);
6883

69-
group
70-
.bench_with_input(
71-
"extract-metadata-note",
72-
include_bytes!("note.gif"),
73-
|b, input| {
74-
b.iter(|| read_metadata(input));
75-
}
76-
);
84+
group.bench_with_input(
85+
"extract-metadata-note",
86+
include_bytes!("note.gif"),
87+
|b, input| {
88+
b.iter(|| read_metadata(input));
89+
},
90+
);
7791

7892
group.finish();
7993

benches/rgb_frame.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,18 @@ fn main() {
3535
group
3636
.sample_size(50)
3737
.throughput(Throughput::Bytes(size as u64))
38-
.bench_function(path.file_name().unwrap().to_str().unwrap(),
39-
|b| {
40-
match info.color_type {
41-
png::ColorType::Rgb => b.iter(|| {
42-
Frame::from_rgb_speed(w, h, &mut buf[..size], 30)
43-
}),
44-
png::ColorType::Rgba => b.iter(|| {
45-
Frame::from_rgba_speed(w, h, &mut buf[..size], 30)
46-
}),
38+
.bench_function(
39+
path.file_name().unwrap().to_str().unwrap(),
40+
|b| match info.color_type {
41+
png::ColorType::Rgb => b.iter(|| Frame::from_rgb_speed(w, h, &buf[..size], 30)),
42+
png::ColorType::Rgba => {
43+
b.iter(|| Frame::from_rgba_speed(w, h, &mut buf[..size], 30))
44+
}
4745
c => {
4846
println!("Image has wrong color type: {c:?}");
4947
}
50-
}
51-
});
48+
},
49+
);
5250

5351
// actually write the image as a singe frame gif... while MSE can be used
5452
// for quality check, it might not be as good as visual inspection
@@ -60,7 +58,7 @@ fn main() {
6058

6159
let frame = match info.color_type {
6260
png::ColorType::Rgb => Frame::from_rgb(w, h, &buf[..size]),
63-
png::ColorType::Rgba => Frame::from_rgba(w, h, &buf[..size]),
61+
png::ColorType::Rgba => Frame::from_rgba(w, h, &mut buf[..size]),
6462
_ => continue,
6563
};
6664

clippy.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Note: Ensure this matches the value in Cargo.toml and in CI
2+
msrv = "1.62.0"

examples/check.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
use std::{env, fs, process};
22

33
fn main() {
4-
let file = env::args().nth(1)
5-
.unwrap_or_else(|| explain_usage());
6-
let file = fs::File::open(file)
7-
.expect("failed to open input file");
4+
let file = env::args().nth(1).unwrap_or_else(|| explain_usage());
5+
let file = fs::File::open(file).expect("failed to open input file");
86
let mut reader = {
97
let mut options = gif::DecodeOptions::new();
108
options.allow_unknown_blocks(true);
@@ -28,7 +26,10 @@ fn main() {
2826
dispose: {:?}\n \
2927
needs_input: {:?}",
3028
frame.delay,
31-
frame.width, frame.height, frame.left, frame.top,
29+
frame.width,
30+
frame.height,
31+
frame.left,
32+
frame.top,
3233
frame.dispose,
3334
frame.needs_user_input
3435
);

examples/parallel.rs

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,21 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
4040

4141
let (send, recv) = std::sync::mpsc::channel();
4242

43-
decoder.into_iter().enumerate().par_bridge().try_for_each(move |(frame_number, frame)| {
44-
let mut frame = frame?;
45-
FrameDecoder::new(DecodeOptions::new())
46-
.decode_lzw_encoded_frame(&mut frame)
47-
.unwrap();
48-
// frame is now pixels
49-
frame.make_lzw_pre_encoded();
50-
// frame is now LZW again, re-encoded
51-
send.send((frame_number, frame)).unwrap();
52-
Ok::<_, gif::DecodingError>(())
53-
})?;
43+
decoder
44+
.into_iter()
45+
.enumerate()
46+
.par_bridge()
47+
.try_for_each(move |(frame_number, frame)| {
48+
let mut frame = frame?;
49+
FrameDecoder::new(DecodeOptions::new())
50+
.decode_lzw_encoded_frame(&mut frame)
51+
.unwrap();
52+
// frame is now pixels
53+
frame.make_lzw_pre_encoded();
54+
// frame is now LZW again, re-encoded
55+
send.send((frame_number, frame)).unwrap();
56+
Ok::<_, gif::DecodingError>(())
57+
})?;
5458

5559
// Decoding and encoding can happen in parallel, but writing to the GIF file is sequential
5660
let mut next_frame_number = 0;
@@ -59,7 +63,10 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
5963
// frames can arrive in any order, since they're processed in parallel,
6064
// so they have to be stored in a queue
6165
frames_to_process.push((frame_number, frame));
62-
while let Some(index) = frames_to_process.iter().position(|&(num, _)| num == next_frame_number) {
66+
while let Some(index) = frames_to_process
67+
.iter()
68+
.position(|&(num, _)| num == next_frame_number)
69+
{
6370
let frame = frames_to_process.remove(index).1;
6471
encoder.write_lzw_pre_encoded_frame(&frame)?;
6572
next_frame_number += 1;
@@ -70,6 +77,13 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
7077
let seconds = start.elapsed().as_millis() as f64 / 1000.;
7178
let rate = (input_size / 1024 / 1024) as f64 / seconds;
7279

73-
eprintln!("Finished in {seconds:0.2}s, {rate:0.0}MiB/s {}", if cfg!(debug_assertions) { ". Run with --release for more speed." } else { "" });
80+
eprintln!(
81+
"Finished in {seconds:0.2}s, {rate:0.0}MiB/s {}",
82+
if cfg!(debug_assertions) {
83+
". Run with --release for more speed."
84+
} else {
85+
""
86+
}
87+
);
7488
Ok(())
7589
}

0 commit comments

Comments
 (0)