Skip to content

Commit cc8ed65

Browse files
authored
Update gif.ski to 1.7.1 (#281)
1 parent 93f70c3 commit cc8ed65

File tree

8 files changed

+304
-253
lines changed

8 files changed

+304
-253
lines changed

gifski-api/Cargo.lock

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

gifski-api/Cargo.toml

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ documentation = "https://docs.rs/gifski"
66
homepage = "https://gif.ski"
77
include = ["/README.md", "/Cargo.toml", "/src/**/*.rs", "/src/bin/*.rs"]
88
keywords = ["gif", "encoder", "converter", "maker", "gifquant"]
9-
license = "AGPL-3.0+"
9+
license = "AGPL-3.0-or-later"
1010
name = "gifski"
1111
readme = "README.md"
1212
repository = "https://github.com/ImageOptim/gifski"
13-
version = "1.7.0"
13+
version = "1.7.1"
1414
autobins = false
1515
edition = "2021"
16+
rust-version = "1.57"
1617

1718
[[bin]]
1819
doctest = false
@@ -25,12 +26,12 @@ required-features = ["png"]
2526

2627
[dependencies]
2728
gifsicle = { version = "1.92.5", optional = true }
28-
clap = { version = "3.0.14", features = ["cargo"], optional = true }
29+
clap = { version = "3.1.18", features = ["cargo"], optional = true }
2930
gif = "0.11.3"
3031
gif-dispose = "3.1.1"
31-
imagequant = "4.0.0"
32-
imgref = "1.9.1"
33-
lodepng = { version = "3.6.1", optional = true }
32+
imagequant = "4.0.1"
33+
imgref = "1.9.2"
34+
lodepng = { version = "3.7.0", optional = true }
3435
pbr = { version = "1.0.4", optional = true }
3536
resize = "0.7.2"
3637
rgb = "0.8.31"
@@ -40,10 +41,12 @@ quick-error = "2.0.1"
4041
dunce = { version = "1.0.2", optional = true }
4142
crossbeam-channel = "0.5.2"
4243
loop9 = "0.1.3"
44+
# noisy-float 0.2 bug
45+
num-traits = { version = "0.2.14", features = ["i128", "std"] }
4346

4447
[dependencies.ffmpeg]
4548
package = "ffmpeg-next"
46-
version = ">= 4.4.0, <6"
49+
version = "4.4.0"
4750
optional = true
4851
default-features = false
4952
features = ["codec", "format", "filter", "software-resampling", "software-scaling"]
@@ -57,6 +60,7 @@ openmp = [] # deprecated, obsolete
5760
openmp-static = [] # deprecated, obsolete
5861
video = ["ffmpeg"]
5962
video-static = ["video", "ffmpeg/build"]
63+
video-prebuilt-static = ["video", "ffmpeg/static"]
6064

6165
[lib]
6266
path = "src/lib.rs"

gifski-api/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ See [releases](https://github.com/ImageOptim/gifski/releases) page for executabl
1414

1515
If you have [Homebrew](https://brew.sh/), you can also get it with `brew install gifski`.
1616

17-
If you have [Rust](https://www.rust-lang.org/install.html) 1.49+, you can also build it from source with [`cargo install gifski`](https://lib.rs/crates/gifski).
17+
If you have [Rust](https://www.rust-lang.org/install.html) 1.57+, you can also build it from source with [`cargo install gifski`](https://lib.rs/crates/gifski).
1818

1919
## Usage
2020

gifski-api/src/bin/gifski.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#[macro_use] extern crate clap;
2-
31
use std::ffi::OsStr;
42
use std::io::Read;
53
use gifski::{Settings, Repeat};
@@ -14,7 +12,7 @@ use gifski::progress::{NoProgress, ProgressBar, ProgressReporter};
1412

1513
pub type BinResult<T, E = Box<dyn std::error::Error + Send + Sync>> = Result<T, E>;
1614

17-
use clap::{App, AppSettings, Arg};
15+
use clap::{Command, AppSettings, Arg};
1816

1917
use std::env;
2018
use std::fmt;
@@ -41,19 +39,20 @@ fn main() {
4139

4240
#[allow(clippy::float_cmp)]
4341
fn bin_main() -> BinResult<()> {
44-
let matches = App::new(crate_name!())
45-
.version(crate_version!())
42+
let matches = Command::new(clap::crate_name!())
43+
.version(clap::crate_version!())
4644
.about("https://gif.ski by Kornel Lesiński")
4745
.setting(AppSettings::DeriveDisplayOrder)
48-
.setting(AppSettings::ArgRequiredElseHelp)
49-
.setting(AppSettings::AllowNegativeNumbers)
46+
.arg_required_else_help(true)
47+
.allow_negative_numbers(true)
5048
.arg(Arg::new("output")
5149
.long("output")
5250
.short('o')
5351
.help("Destination file to write to; \"-\" means stdout")
5452
.forbid_empty_values(true)
5553
.takes_value(true)
5654
.value_name("a.gif")
55+
.allow_invalid_utf8(true)
5756
.required(true))
5857
.arg(Arg::new("fps")
5958
.long("fps")
@@ -110,7 +109,7 @@ fn bin_main() -> BinResult<()> {
110109
.help(VIDEO_FRAMES_ARG_HELP)
111110
.min_values(1)
112111
.forbid_empty_values(true)
113-
.use_delimiter(false)
112+
.use_value_delimiter(false)
114113
.required(true))
115114
.arg(Arg::new("repeat")
116115
.long("repeat")

gifski-api/src/c_api.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ fn progress_abort() {
515515
assert_eq!(GifskiError::OK, gifski_set_write_callback(g, Some(cb), ptr::null_mut()));
516516
assert_eq!(GifskiError::OK, gifski_add_frame_rgb(g, 0, 1, 3, 1, &RGB::new(0,0,0), 3.));
517517
assert_eq!(GifskiError::OK, gifski_add_frame_rgb(g, 0, 1, 3, 1, &RGB::new(0,0,0), 10.));
518-
assert_eq!(GifskiError::OK, gifski_finish(g));
518+
assert_eq!(GifskiError::ABORTED, gifski_finish(g));
519519
}
520520
}
521521

@@ -533,7 +533,7 @@ fn cant_write_after_finish() {
533533
}
534534
unsafe {
535535
assert_eq!(GifskiError::OK, gifski_set_write_callback(g, Some(cb), 0 as _));
536-
assert_eq!(GifskiError::OTHER, gifski_finish(g));
536+
assert_eq!(GifskiError::INVALID_STATE, gifski_finish(g));
537537
}
538538
}
539539

gifski-api/src/denoise.rs

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ pub struct Denoiser<T> {
6767
metadatas: Vec<T>,
6868
}
6969

70+
#[derive(Debug)]
71+
pub struct WrongSizeError;
72+
7073
impl<T> Denoiser<T> {
7174
#[inline]
7275
pub fn new(width: usize, height: usize, quality: u8) -> Self {
@@ -118,17 +121,18 @@ impl<T> Denoiser<T> {
118121
}
119122
}
120123

121-
pub fn push_frame(&mut self, frame: ImgRef<RGBA8>, frame_metadata: T) {
122-
assert_eq!(frame.width(), self.splat.width());
123-
assert_eq!(frame.height(), self.splat.height());
124+
pub fn push_frame(&mut self, frame: ImgRef<RGBA8>, frame_metadata: T) -> Result<(), WrongSizeError> {
125+
if frame.width() != self.splat.width() || frame.height() != self.splat.height() {
126+
return Err(WrongSizeError);
127+
}
124128

125129
self.metadatas.insert(0, frame_metadata);
126130

127131
self.frames += 1;
128132
// Can't output anything yet
129133
if self.frames < LOOKAHEAD {
130134
self.quick_append(frame);
131-
return;
135+
return Ok(());
132136
}
133137

134138
let mut median = Vec::with_capacity(frame.width() * frame.height());
@@ -144,6 +148,7 @@ impl<T> Denoiser<T> {
144148
let median = ImgVec::new(median, frame.width(), frame.height());
145149
let imp_map = ImgVec::new(imp_map, frame.width(), frame.height());
146150
self.processed.insert(0, (median, imp_map));
151+
Ok(())
147152
}
148153

149154
pub fn pop(&mut self) -> Denoised<T> {
@@ -303,7 +308,7 @@ fn px<T>(f: Denoised<T>) -> (RGBA8, T) {
303308
fn one() {
304309
let mut d = Denoiser::new(1,1, 100);
305310
let w = RGBA8::new(255,255,255,255);
306-
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 0);
311+
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 0).unwrap();
307312
assert!(matches!(d.pop(), Denoised::NotYet));
308313
d.flush();
309314
assert_eq!(px(d.pop()), (w, 0));
@@ -315,8 +320,8 @@ fn two() {
315320
let mut d = Denoiser::new(1,1, 100);
316321
let w = RGBA8::new(254,253,252,255);
317322
let b = RGBA8::new(8,7,0,255);
318-
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 0);
319-
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 1);
323+
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 0).unwrap();
324+
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 1).unwrap();
320325
assert!(matches!(d.pop(), Denoised::NotYet));
321326
d.flush();
322327
assert_eq!(px(d.pop()), (w, 0));
@@ -329,9 +334,9 @@ fn three() {
329334
let mut d = Denoiser::new(1,1, 100);
330335
let w = RGBA8::new(254,253,252,255);
331336
let b = RGBA8::new(8,7,0,255);
332-
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 0);
333-
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 1);
334-
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 2);
337+
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 0).unwrap();
338+
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 1).unwrap();
339+
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 2).unwrap();
335340
assert!(matches!(d.pop(), Denoised::NotYet));
336341
d.flush();
337342
assert_eq!(px(d.pop()), (w, 0));
@@ -347,10 +352,10 @@ fn four() {
347352
let w = RGBA8::new(254,253,252,255);
348353
let b = RGBA8::new(8,7,0,255);
349354
let t = RGBA8::new(0,0,0,0);
350-
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 0);
351-
d.push_frame(ImgVec::new(vec![t], 1, 1).as_ref(), 1);
352-
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 2);
353-
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 3);
355+
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 0).unwrap();
356+
d.push_frame(ImgVec::new(vec![t], 1, 1).as_ref(), 1).unwrap();
357+
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 2).unwrap();
358+
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 3).unwrap();
354359
assert!(matches!(d.pop(), Denoised::NotYet));
355360
d.flush();
356361
assert_eq!(px(d.pop()), (w, 0));
@@ -366,12 +371,12 @@ fn five() {
366371
let w = RGBA8::new(254,253,252,255);
367372
let b = RGBA8::new(8,7,0,255);
368373
let t = RGBA8::new(0,0,0,0);
369-
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 0);
370-
d.push_frame(ImgVec::new(vec![t], 1, 1).as_ref(), 1);
371-
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 2);
372-
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 3);
374+
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 0).unwrap();
375+
d.push_frame(ImgVec::new(vec![t], 1, 1).as_ref(), 1).unwrap();
376+
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 2).unwrap();
377+
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 3).unwrap();
373378
assert!(matches!(d.pop(), Denoised::NotYet));
374-
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 4);
379+
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 4).unwrap();
375380
assert_eq!(px(d.pop()), (w, 0));
376381
d.flush();
377382
assert_eq!(px(d.pop()), (t, 1));
@@ -388,17 +393,17 @@ fn six() {
388393
let b = RGBA8::new(8,7,0,255);
389394
let t = RGBA8::new(0,0,0,0);
390395
let x = RGBA8::new(4,5,6,255);
391-
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 0);
396+
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 0).unwrap();
392397
assert!(matches!(d.pop(), Denoised::NotYet));
393-
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 1);
398+
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 1).unwrap();
394399
assert!(matches!(d.pop(), Denoised::NotYet));
395-
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 2);
400+
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), 2).unwrap();
396401
assert!(matches!(d.pop(), Denoised::NotYet));
397-
d.push_frame(ImgVec::new(vec![t], 1, 1).as_ref(), 3);
402+
d.push_frame(ImgVec::new(vec![t], 1, 1).as_ref(), 3).unwrap();
398403
assert!(matches!(d.pop(), Denoised::NotYet));
399-
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 4);
404+
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), 4).unwrap();
400405
assert_eq!(px(d.pop()), (w, 0));
401-
d.push_frame(ImgVec::new(vec![x], 1, 1).as_ref(), 5);
406+
d.push_frame(ImgVec::new(vec![x], 1, 1).as_ref(), 5).unwrap();
402407
d.flush();
403408
assert_eq!(px(d.pop()), (b, 1));
404409
assert_eq!(px(d.pop()), (b, 2));
@@ -415,19 +420,19 @@ fn many() {
415420
let w = RGBA8::new(255,254,253,255);
416421
let b = RGBA8::new(1,2,3,255);
417422
let t = RGBA8::new(0,0,0,0);
418-
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), "w0");
423+
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), "w0").unwrap();
419424
assert!(matches!(d.pop(), Denoised::NotYet));
420-
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), "w1");
425+
d.push_frame(ImgVec::new(vec![w], 1, 1).as_ref(), "w1").unwrap();
421426
assert!(matches!(d.pop(), Denoised::NotYet));
422-
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), "b2");
427+
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), "b2").unwrap();
423428
assert!(matches!(d.pop(), Denoised::NotYet));
424-
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), "b3");
429+
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), "b3").unwrap();
425430
assert!(matches!(d.pop(), Denoised::NotYet));
426-
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), "b4");
431+
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), "b4").unwrap();
427432
assert_eq!(px(d.pop()), (w, "w0"));
428-
d.push_frame(ImgVec::new(vec![t], 1, 1).as_ref(), "t5");
433+
d.push_frame(ImgVec::new(vec![t], 1, 1).as_ref(), "t5").unwrap();
429434
assert_eq!(px(d.pop()), (w, "w1"));
430-
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), "b6");
435+
d.push_frame(ImgVec::new(vec![b], 1, 1).as_ref(), "b6").unwrap();
431436
assert_eq!(px(d.pop()), (b, "b2"));
432437
d.flush();
433438
assert_eq!(px(d.pop()), (b, "b3"));

0 commit comments

Comments
 (0)