Skip to content

Commit 901a75c

Browse files
authored
Merge pull request #2574 from image-rs/png-0.18
Png 0.18
2 parents 7208377 + d9a09b8 commit 901a75c

3 files changed

Lines changed: 23 additions & 19 deletions

File tree

.github/workflows/rust.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ jobs:
5050
run: |
5151
cargo -Zminimal-versions generate-lockfile
5252
cargo update --offline num-bigint --precise 0.4.2
53-
cargo update --offline bitflags:1.0.0 --precise 1.3.2
5453
5554
- uses: dtolnay/rust-toolchain@v1
5655
with:

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ exr = { version = "1.5.0", optional = true }
4747
gif = { version = "0.13.1", optional = true }
4848
image-webp = { version = "0.2.0", optional = true }
4949
mp4parse = { version = "0.17.0", optional = true }
50-
png = { version = "0.17.16", optional = true }
50+
png = { version = "0.18.0", optional = true }
5151
qoi = { version = "0.4", optional = true }
5252
ravif = { version = "0.11.12", default-features = false, optional = true }
5353
rayon = { version = "1.7.0", optional = true }

src/codecs/png.rs

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ impl<R: BufRead + Seek> PngDecoder<R> {
4545

4646
let max_bytes = usize::try_from(limits.max_alloc.unwrap_or(u64::MAX)).unwrap_or(usize::MAX);
4747
let mut decoder = png::Decoder::new_with_limits(r, png::Limits { bytes: max_bytes });
48-
decoder.set_ignore_text_chunk(true);
4948

5049
let info = decoder.read_header_info().map_err(ImageError::from_png)?;
5150
limits.check_dimensions(info.width, info.height)?;
@@ -306,8 +305,13 @@ impl<R: BufRead + Seek> ApngDecoder<R> {
306305
if self.has_thumbnail {
307306
// Clone the limits so that our one-off allocation that's destroyed after this scope doesn't persist
308307
let mut limits = self.inner.limits.clone();
309-
limits.reserve_usize(self.inner.reader.output_buffer_size())?;
310-
let mut buffer = vec![0; self.inner.reader.output_buffer_size()];
308+
309+
let buffer_size = self.inner.reader.output_buffer_size().ok_or_else(|| {
310+
ImageError::Limits(LimitError::from_kind(LimitErrorKind::InsufficientMemory))
311+
})?;
312+
313+
limits.reserve_usize(buffer_size)?;
314+
let mut buffer = vec![0; buffer_size];
311315
// TODO: add `png::Reader::change_limits()` and call it here
312316
// to also constrain the internal buffer allocations in the PNG crate
313317
self.inner
@@ -364,7 +368,10 @@ impl<R: BufRead + Seek> ApngDecoder<R> {
364368
let mut limits = self.inner.limits.clone();
365369

366370
// Read next frame data.
367-
let raw_frame_size = self.inner.reader.output_buffer_size();
371+
let raw_frame_size = self.inner.reader.output_buffer_size().ok_or_else(|| {
372+
ImageError::Limits(LimitError::from_kind(LimitErrorKind::InsufficientMemory))
373+
})?;
374+
368375
limits.reserve_usize(raw_frame_size)?;
369376
let mut buffer = vec![0; raw_frame_size];
370377
// TODO: add `png::Reader::change_limits()` and call it here
@@ -597,21 +604,20 @@ impl<W: Write> PngEncoder<W> {
597604
))
598605
}
599606
};
607+
600608
let comp = match self.compression {
601-
CompressionType::Default => png::Compression::Default,
602-
CompressionType::Best => png::Compression::Best,
609+
CompressionType::Default => png::Compression::Balanced,
610+
CompressionType::Best => png::Compression::High,
603611
_ => png::Compression::Fast,
604612
};
605-
let (filter, adaptive_filter) = match self.filter {
606-
FilterType::NoFilter => (
607-
png::FilterType::NoFilter,
608-
png::AdaptiveFilterType::NonAdaptive,
609-
),
610-
FilterType::Sub => (png::FilterType::Sub, png::AdaptiveFilterType::NonAdaptive),
611-
FilterType::Up => (png::FilterType::Up, png::AdaptiveFilterType::NonAdaptive),
612-
FilterType::Avg => (png::FilterType::Avg, png::AdaptiveFilterType::NonAdaptive),
613-
FilterType::Paeth => (png::FilterType::Paeth, png::AdaptiveFilterType::NonAdaptive),
614-
FilterType::Adaptive => (png::FilterType::Sub, png::AdaptiveFilterType::Adaptive),
613+
614+
let filter = match self.filter {
615+
FilterType::NoFilter => png::Filter::NoFilter,
616+
FilterType::Sub => png::Filter::Sub,
617+
FilterType::Up => png::Filter::Up,
618+
FilterType::Avg => png::Filter::Avg,
619+
FilterType::Paeth => png::Filter::Paeth,
620+
FilterType::Adaptive => png::Filter::Adaptive,
615621
};
616622

617623
let mut info = png::Info::with_size(width, height);
@@ -630,7 +636,6 @@ impl<W: Write> PngEncoder<W> {
630636
encoder.set_depth(bits);
631637
encoder.set_compression(comp);
632638
encoder.set_filter(filter);
633-
encoder.set_adaptive_filter(adaptive_filter);
634639
let mut writer = encoder
635640
.write_header()
636641
.map_err(|e| ImageError::IoError(e.into()))?;

0 commit comments

Comments
 (0)