diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 109e5fbf..d8b6af1b 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -9,14 +9,14 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - rust: ["1.70.0", stable, beta, nightly] + rust: ["1.74.0", stable, beta, nightly] steps: - uses: actions/checkout@v2 - uses: dtolnay/rust-toolchain@nightly - if: ${{ matrix.rust == '1.70.0' }} + if: ${{ matrix.rust == '1.74.0' }} - name: Generate Cargo.lock with minimal-version dependencies - if: ${{ matrix.rust == '1.70.0' }} + if: ${{ matrix.rust == '1.74.0' }} run: cargo -Zminimal-versions generate-lockfile - uses: dtolnay/rust-toolchain@v1 @@ -29,7 +29,7 @@ jobs: - name: build run: cargo build -v - name: test - if: ${{ matrix.rust != '1.70.0' }} + if: ${{ matrix.rust != '1.74.0' }} run: cargo test -v && cargo doc -v rustfmt: diff --git a/Cargo.toml b/Cargo.toml index b91879de..30677d57 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" resolver = "2" # note: when changed, also update test runner in `.github/workflows/rust.yml` -rust-version = "1.70.0" +rust-version = "1.74.0" license = "MIT" description = "TIFF decoding and encoding library in pure Rust" @@ -19,7 +19,7 @@ exclude = ["tests/images/*", "tests/fuzz_images/*"] [dependencies] half = { version = "2.4.1" } weezl = "0.1.0" -jpeg = { package = "jpeg-decoder", version = "0.3.0", default-features = false } +zune-jpeg = "0.4.17" flate2 = "1.0.20" zstd = { version = "0.13", optional = true } quick-error = "2.0.1" diff --git a/src/decoder/image.rs b/src/decoder/image.rs index a38333e5..b8d93dce 100644 --- a/src/decoder/image.rs +++ b/src/decoder/image.rs @@ -9,6 +9,7 @@ use crate::tags::{ use crate::{ColorType, TiffError, TiffFormatError, TiffResult, TiffUnsupportedError, UsageError}; use std::io::{self, Cursor, Read, Seek}; use std::sync::Arc; +use zune_jpeg::zune_core; #[derive(Debug)] pub(crate) struct StripDecodeState { @@ -402,7 +403,7 @@ impl Image { // bytes of the remaining JPEG data is removed because it follows `jpeg_tables`. // Similary, `jpeg_tables` ends with a `EOI` (HEX: `0xFFD9`) or __end of image__ marker, // this has to be removed as well (last two bytes of `jpeg_tables`). - let jpeg_reader = match jpeg_tables { + let mut jpeg_reader = match jpeg_tables { Some(jpeg_tables) => { let mut reader = reader.take(compressed_length); reader.read_exact(&mut [0; 2])?; @@ -415,28 +416,28 @@ impl Image { None => Box::new(reader.take(compressed_length)), }; - let mut decoder = jpeg::Decoder::new(jpeg_reader); + let mut jpeg_data = Vec::new(); + jpeg_reader.read_to_end(&mut jpeg_data)?; + let mut decoder = zune_jpeg::JpegDecoder::new(jpeg_data); + let mut options: zune_core::options::DecoderOptions = Default::default(); match photometric_interpretation { PhotometricInterpretation::RGB => { - decoder.set_color_transform(jpeg::ColorTransform::RGB) - } - PhotometricInterpretation::WhiteIsZero => { - decoder.set_color_transform(jpeg::ColorTransform::None) - } - PhotometricInterpretation::BlackIsZero => { - decoder.set_color_transform(jpeg::ColorTransform::None) - } - PhotometricInterpretation::TransparencyMask => { - decoder.set_color_transform(jpeg::ColorTransform::None) + options = + options.jpeg_set_out_colorspace(zune_core::colorspace::ColorSpace::RGB); } PhotometricInterpretation::CMYK => { - decoder.set_color_transform(jpeg::ColorTransform::CMYK) + options = options + .jpeg_set_out_colorspace(zune_core::colorspace::ColorSpace::CMYK); } PhotometricInterpretation::YCbCr => { - decoder.set_color_transform(jpeg::ColorTransform::YCbCr) + options = options + .jpeg_set_out_colorspace(zune_core::colorspace::ColorSpace::YCbCr); } - photometric_interpretation => { + PhotometricInterpretation::WhiteIsZero + | PhotometricInterpretation::BlackIsZero + | PhotometricInterpretation::TransparencyMask => {} + PhotometricInterpretation::RGBPalette | PhotometricInterpretation::CIELab => { return Err(TiffError::UnsupportedError( TiffUnsupportedError::UnsupportedInterpretation( photometric_interpretation, @@ -444,6 +445,7 @@ impl Image { )); } } + decoder.set_options(options); let data = decoder.decode()?; diff --git a/src/error.rs b/src/error.rs index 924471da..5a2bbf71 100644 --- a/src/error.rs +++ b/src/error.rs @@ -2,8 +2,8 @@ use std::io; use std::str; use std::string; -use jpeg::UnsupportedFeature; use quick_error::quick_error; +use weezl::LzwError; use crate::decoder::ChunkType; use crate::tags::{ @@ -11,8 +11,6 @@ use crate::tags::{ }; use crate::ColorType; -use crate::weezl::LzwError; - quick_error! { /// Tiff error kinds. #[derive(Debug)] @@ -159,9 +157,6 @@ quick_error! { UnsupportedInterpretation(interpretation: PhotometricInterpretation) { display("unsupported photometric interpretation \"{interpretation:?}\"") } - UnsupportedJpegFeature(feature: UnsupportedFeature) { - display("unsupported JPEG feature {feature:?}") - } MisalignedTileBoundaries { display("tile rows are not aligned to byte boundaries") } @@ -217,8 +212,8 @@ impl From for TiffError { } } -impl From for TiffError { - fn from(err: jpeg::Error) -> Self { +impl From for TiffError { + fn from(err: zune_jpeg::errors::DecodeErrors) -> Self { TiffError::FormatError(TiffFormatError::CompressedDataCorrupt(err.to_string())) } } diff --git a/src/lib.rs b/src/lib.rs index a4522ced..fb48a842 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,9 +6,6 @@ //! # Related Links //! * - The TIFF specification -extern crate jpeg; -extern crate weezl; - mod bytecast; pub mod decoder; pub mod encoder;