Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
082a35adb9 | ||
|
|
923df5f0bd | ||
|
|
c4328644b8 | ||
|
|
27bfcf5562 | ||
|
|
7d498a0284 |
No files matched your search
@@ -9,14 +9,14 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
rust: ["1.74.0", stable, beta, nightly]
|
||||
rust: ["1.85.0", stable, beta, nightly]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- uses: dtolnay/rust-toolchain@nightly
|
||||
if: ${{ matrix.rust == '1.74.0' }}
|
||||
if: ${{ matrix.rust == '1.85.0' }}
|
||||
- name: Generate Cargo.lock with minimal-version dependencies
|
||||
if: ${{ matrix.rust == '1.74.0' }}
|
||||
if: ${{ matrix.rust == '1.85.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.74.0' }}
|
||||
if: ${{ matrix.rust != '1.85.0' }}
|
||||
run: cargo test -v && cargo doc -v
|
||||
|
||||
features:
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ edition = "2021"
|
||||
resolver = "2"
|
||||
|
||||
# note: when changed, also update test runner in `.github/workflows/rust.yml`
|
||||
rust-version = "1.74.0"
|
||||
rust-version = "1.85.0"
|
||||
|
||||
license = "MIT"
|
||||
description = "TIFF decoding and encoding library in pure Rust"
|
||||
|
||||
+22
-8
@@ -10,8 +10,8 @@ use crate::tags::{IfdPointer, Tag, Type};
|
||||
use crate::{TiffError, TiffFormatError, TiffResult};
|
||||
|
||||
use self::Value::{
|
||||
Ascii, Byte, Double, Float, Ifd, IfdBig, List, Rational, RationalBig, SRational, SRationalBig,
|
||||
Short, Signed, SignedBig, SignedByte, SignedShort, Unsigned, UnsignedBig,
|
||||
Ascii, Byte, Double, Float, Ifd, IfdBig, List, Rational, SRational, Short, Signed, SignedBig,
|
||||
SignedByte, SignedShort, Unsigned, UnsignedBig,
|
||||
};
|
||||
|
||||
#[allow(unused_qualifications)]
|
||||
@@ -30,8 +30,16 @@ pub enum Value {
|
||||
Double(f64),
|
||||
List(Vec<Value>),
|
||||
Rational(u32, u32),
|
||||
#[deprecated(
|
||||
note = "Not implemented in BigTIFF with a standard tag value",
|
||||
since = "0.11.1"
|
||||
)]
|
||||
RationalBig(u64, u64),
|
||||
SRational(i32, i32),
|
||||
#[deprecated(
|
||||
note = "Not implemented in BigTIFF with a standard tag value",
|
||||
since = "0.11.1"
|
||||
)]
|
||||
SRationalBig(i64, i64),
|
||||
Ascii(String),
|
||||
Ifd(u32),
|
||||
@@ -170,7 +178,8 @@ impl Value {
|
||||
Unsigned(val) => Ok(vec![val]),
|
||||
UnsignedBig(val) => Ok(vec![u32::try_from(val)?]),
|
||||
Rational(numerator, denominator) => Ok(vec![numerator, denominator]),
|
||||
RationalBig(numerator, denominator) => {
|
||||
#[expect(deprecated)]
|
||||
Value::RationalBig(numerator, denominator) => {
|
||||
Ok(vec![u32::try_from(numerator)?, u32::try_from(denominator)?])
|
||||
}
|
||||
Ifd(val) => Ok(vec![val]),
|
||||
@@ -220,7 +229,8 @@ impl Value {
|
||||
new_vec.push(numerator);
|
||||
new_vec.push(denominator);
|
||||
}
|
||||
SRationalBig(numerator, denominator) => {
|
||||
#[expect(deprecated)]
|
||||
Value::SRationalBig(numerator, denominator) => {
|
||||
new_vec.push(i32::try_from(numerator)?);
|
||||
new_vec.push(i32::try_from(denominator)?);
|
||||
}
|
||||
@@ -234,7 +244,8 @@ impl Value {
|
||||
Signed(val) => Ok(vec![val]),
|
||||
SignedBig(val) => Ok(vec![i32::try_from(val)?]),
|
||||
SRational(numerator, denominator) => Ok(vec![numerator, denominator]),
|
||||
SRationalBig(numerator, denominator) => {
|
||||
#[expect(deprecated)]
|
||||
Value::SRationalBig(numerator, denominator) => {
|
||||
Ok(vec![i32::try_from(numerator)?, i32::try_from(denominator)?])
|
||||
}
|
||||
_ => Err(TiffError::FormatError(TiffFormatError::InvalidTypeForTag)),
|
||||
@@ -283,7 +294,8 @@ impl Value {
|
||||
Unsigned(val) => Ok(vec![val.into()]),
|
||||
UnsignedBig(val) => Ok(vec![val]),
|
||||
Rational(numerator, denominator) => Ok(vec![numerator.into(), denominator.into()]),
|
||||
RationalBig(numerator, denominator) => Ok(vec![numerator, denominator]),
|
||||
#[expect(deprecated)]
|
||||
Value::RationalBig(numerator, denominator) => Ok(vec![numerator, denominator]),
|
||||
Ifd(val) => Ok(vec![val.into()]),
|
||||
IfdBig(val) => Ok(vec![val]),
|
||||
Ascii(val) => Ok(val.chars().map(u32::from).map(u64::from).collect()),
|
||||
@@ -301,7 +313,8 @@ impl Value {
|
||||
new_vec.push(numerator.into());
|
||||
new_vec.push(denominator.into());
|
||||
}
|
||||
SRationalBig(numerator, denominator) => {
|
||||
#[expect(deprecated)]
|
||||
Value::SRationalBig(numerator, denominator) => {
|
||||
new_vec.push(numerator);
|
||||
new_vec.push(denominator);
|
||||
}
|
||||
@@ -315,7 +328,8 @@ impl Value {
|
||||
Signed(val) => Ok(vec![val.into()]),
|
||||
SignedBig(val) => Ok(vec![val]),
|
||||
SRational(numerator, denominator) => Ok(vec![numerator.into(), denominator.into()]),
|
||||
SRationalBig(numerator, denominator) => Ok(vec![numerator, denominator]),
|
||||
#[expect(deprecated)]
|
||||
Value::SRationalBig(numerator, denominator) => Ok(vec![numerator, denominator]),
|
||||
_ => Err(TiffError::FormatError(TiffFormatError::InvalidTypeForTag)),
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -766,7 +766,7 @@ impl<'a, W: 'a + Write + Seek, T: ColorType, K: TiffKind> ImageEncoder<'a, W, T,
|
||||
} else {
|
||||
let mut sample_format: Vec<_> = <T>::BITS_PER_SAMPLE.to_vec();
|
||||
let replicated =
|
||||
core::iter::repeat(<T>::BITS_PER_SAMPLE[0]).take(self.extra_samples.len());
|
||||
core::iter::repeat_n(<T>::BITS_PER_SAMPLE[0], self.extra_samples.len());
|
||||
sample_format.extend(replicated);
|
||||
|
||||
self.encoder
|
||||
@@ -788,7 +788,7 @@ impl<'a, W: 'a + Write + Seek, T: ColorType, K: TiffKind> ImageEncoder<'a, W, T,
|
||||
// extra samples and not provided via a slice used for samples themselves.
|
||||
.unwrap_or(SampleFormat::Void.to_u16());
|
||||
|
||||
sample_format.extend(core::iter::repeat(extra_format).take(self.extra_samples.len()));
|
||||
sample_format.extend(core::iter::repeat_n(extra_format, self.extra_samples.len()));
|
||||
|
||||
self.encoder
|
||||
.write_tag(Tag::SampleFormat, &sample_format[..])?;
|
||||
|
||||
@@ -5,6 +5,14 @@ use crate::{bytecast, tags::Type, TiffError, TiffFormatError, TiffResult};
|
||||
use super::writer::TiffWriter;
|
||||
|
||||
/// Trait for types that can be encoded in a tiff file
|
||||
#[diagnostic::on_unimplemented(
|
||||
message = "the type `{Self}` does not implement `TiffValue`",
|
||||
note = "the trait is implemented for primitive types (`u8`, `i16`, `f32`, etc.)",
|
||||
note = "the trait is implemented for shared references to values",
|
||||
note = "the trait is implemented for slices, pass them by reference (e.g. `&[u8]`)",
|
||||
note = "the trait is implemented for arrays if it is implemented for a slice",
|
||||
note = "values in a `Vec` or `Box` should be dereferenced, e.g. `&vec[..]`"
|
||||
)]
|
||||
pub trait TiffValue {
|
||||
const BYTE_LEN: u8;
|
||||
const FIELD_TYPE: Type;
|
||||
@@ -450,6 +458,14 @@ impl TiffValue for str {
|
||||
}
|
||||
}
|
||||
|
||||
// If you pass `&Vec<_>` then you'd get at first sight the complaint:
|
||||
//
|
||||
// `Vec<T>` does not implement `TiffValue`
|
||||
//
|
||||
// and a list of implementations of `TiffValue` that are quite unrelated. That is not very helpful.
|
||||
// We do not *want* `Vec` to implement the trait as an owning type, instead you should pass a
|
||||
// reference to a slice. The error message is further customized in the diagnostics of the trait.
|
||||
#[diagnostic::do_not_recommend]
|
||||
impl<T: TiffValue + ?Sized> TiffValue for &'_ T {
|
||||
const BYTE_LEN: u8 = T::BYTE_LEN;
|
||||
const FIELD_TYPE: Type = T::FIELD_TYPE;
|
||||
@@ -467,6 +483,27 @@ impl<T: TiffValue + ?Sized> TiffValue for &'_ T {
|
||||
}
|
||||
}
|
||||
|
||||
/// An array is treated like a slice of the same length.
|
||||
impl<T, const N: usize> TiffValue for [T; N]
|
||||
where
|
||||
[T]: TiffValue,
|
||||
{
|
||||
const BYTE_LEN: u8 = <[T]>::BYTE_LEN;
|
||||
const FIELD_TYPE: Type = <[T]>::FIELD_TYPE;
|
||||
|
||||
fn count(&self) -> usize {
|
||||
self.as_slice().count()
|
||||
}
|
||||
|
||||
fn write<W: Write>(&self, writer: &mut TiffWriter<W>) -> TiffResult<()> {
|
||||
self.as_slice().write(writer)
|
||||
}
|
||||
|
||||
fn data(&self) -> Cow<'_, [u8]> {
|
||||
self.as_slice().data()
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! impl_tiff_value_for_contiguous_sequence {
|
||||
($inner_type:ty; $bytes:expr; $field_type:expr) => {
|
||||
impl $crate::encoder::TiffValue for [$inner_type] {
|
||||
|
||||
Reference in new issue
Block a user