From c5fcba45a00b9401b0ca461c51130a66f8454344 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Wed, 11 Dec 2019 13:59:56 +0000 Subject: [PATCH 01/17] Fix typo in error display message --- src/error.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/error.rs b/src/error.rs index 34902fe..731466d 100644 --- a/src/error.rs +++ b/src/error.rs @@ -139,7 +139,7 @@ impl fmt::Display for TiffUnsupportedError { write!(fmt, "Compression method {:?} is unsupported", method) } UnsupportedSampleDepth(samples) => { - write!(fmt, "{} samples per pixel is supported.", samples) + write!(fmt, "{} samples per pixel is unsupported.", samples) } UnsupportedColorType(color_type) => { write!(fmt, "Color type {:?} is unsupported", color_type) From 29bb8c2dfec4884c80163089e8825711d53ee327 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Thu, 12 Dec 2019 12:24:37 +0000 Subject: [PATCH 02/17] Summarize supported features in README --- README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/README.md b/README.md index 977eb1f..61c5890 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,43 @@ [![Further crate info](https://img.shields.io/crates/v/tiff.svg)](https://crates.io/crates/tiff) TIFF decoding and encoding library in pure Rust + +## Supported + +### Features +- Baseline spec (other than formats and tags listed below as not supported) +- Multipage +- Incremental decoding + +### Formats +This table lists photometric interpretations and sample formats which are supported for encoding and decoding. The entries are `ColorType` variants for which sample bit depths are supported. Only samples where all bit depths are equal are currently supported. For example, `RGB(8)` means that the bit depth [8, 8, 8] is supported and will be interpreted as an 8 bit per channel RGB color type. + +| `PhotometricInterpretation` | UINT Format | IEEEFP Format | +|-|-|-| +| `WhiteIsZero` | Gray(8), Gray(16) | | +| `BlackIsZero` | Gray(8), Gray(16) | | +| `RGB` | RGB(8), RGB(16), RGBA(8), RGBA(16) | | +| `RGBPalette` | | | +| `Mask` | | | +| `CMYK` | CMYK(8) | | +| `YCbCr` | | | +| `CIELab` | | | + +### Compressions + +| | Decoding | Encoding | +|-|-|-| +| None | ✓ | ✓ | +| LZW | ✓ | | +| Deflate | ✓ | | +| PackBits | ✓ | | + + +## Not yet supported + +Formats and interpretations not listed above or with empty entries are unsupported. + +- Baseline tags + - `ExtraSamples` +- Extension tags +- BigTIFF From 27ae65160d76b2c09aade0627b1bfcc17b3ea5f6 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Thu, 12 Dec 2019 15:49:34 +0000 Subject: [PATCH 03/17] Deduplicate decoding buffer construction --- src/decoder/mod.rs | 45 ++++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index f879df6..8ebce2d 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -864,6 +864,22 @@ impl Decoder { Ok(()) } + fn result_buffer(&self, height: usize) -> TiffResult { + let buffer_size = self.width as usize * height * self.bits_per_sample.iter().count(); + + match self.bits_per_sample.iter().cloned().max().unwrap_or(8) { + n if n <= 8 => DecodingResult::new_u8(buffer_size, &self.limits), + n if n <= 16 => DecodingResult::new_u16(buffer_size, &self.limits), + n if n <= 32 => DecodingResult::new_u32(buffer_size, &self.limits), + n if n <= 64 => DecodingResult::new_u64(buffer_size, &self.limits), + n => { + Err(TiffError::UnsupportedError( + TiffUnsupportedError::UnsupportedBitsPerChannel(n), + )) + } + } + } + /// Read a single strip from the image and return it as a Vector pub fn read_strip(&mut self) -> TiffResult { self.initialize_strip_decoder()?; @@ -878,19 +894,7 @@ impl Decoder { self.height as usize - index * rows_per_strip, ); - let buffer_size = self.width as usize * strip_height * self.bits_per_sample.iter().count(); - - let mut result = match self.bits_per_sample.iter().cloned().max().unwrap_or(8) { - n if n <= 8 => DecodingResult::new_u8(buffer_size, &self.limits)?, - n if n <= 16 => DecodingResult::new_u16(buffer_size, &self.limits)?, - n if n <= 32 => DecodingResult::new_u32(buffer_size, &self.limits)?, - n if n <= 64 => DecodingResult::new_u64(buffer_size, &self.limits)?, - n => { - return Err(TiffError::UnsupportedError( - TiffUnsupportedError::UnsupportedBitsPerChannel(n), - )) - } - }; + let mut result = self.result_buffer(strip_height)?; self.read_strip_to_buffer(result.as_buffer(0))?; @@ -907,20 +911,7 @@ impl Decoder { let samples_per_strip = self.width as usize * rows_per_strip * self.bits_per_sample.iter().count(); - let buffer_size = - self.width as usize * self.height as usize * self.bits_per_sample.iter().count(); - - let mut result = match self.bits_per_sample.iter().cloned().max().unwrap_or(8) { - n if n <= 8 => DecodingResult::new_u8(buffer_size, &self.limits)?, - n if n <= 16 => DecodingResult::new_u16(buffer_size, &self.limits)?, - n if n <= 32 => DecodingResult::new_u32(buffer_size, &self.limits)?, - n if n <= 64 => DecodingResult::new_u64(buffer_size, &self.limits)?, - n => { - return Err(TiffError::UnsupportedError( - TiffUnsupportedError::UnsupportedBitsPerChannel(n), - )) - } - }; + let mut result = self.result_buffer(self.height as usize)?; for i in 0..self.strip_count()? as usize { self.read_strip_to_buffer(result.as_buffer(samples_per_strip * i))?; From 8b967936716782602a9082f3437c8bba2d4986de Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Thu, 12 Dec 2019 15:52:23 +0000 Subject: [PATCH 04/17] Simplify expression (minor) --- src/decoder/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index 8ebce2d..8ff00ff 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -865,7 +865,7 @@ impl Decoder { } fn result_buffer(&self, height: usize) -> TiffResult { - let buffer_size = self.width as usize * height * self.bits_per_sample.iter().count(); + let buffer_size = self.width as usize * height * self.bits_per_sample.len(); match self.bits_per_sample.iter().cloned().max().unwrap_or(8) { n if n <= 8 => DecodingResult::new_u8(buffer_size, &self.limits), @@ -909,7 +909,7 @@ impl Decoder { .unwrap_or(self.height) as usize; let samples_per_strip = - self.width as usize * rows_per_strip * self.bits_per_sample.iter().count(); + self.width as usize * rows_per_strip * self.bits_per_sample.len(); let mut result = self.result_buffer(self.height as usize)?; From 1fafcccb3655fbabba424d154e4ebaa6755734d3 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Thu, 12 Dec 2019 16:09:01 +0000 Subject: [PATCH 05/17] Remove needless cast (minor) --- src/decoder/ifd.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decoder/ifd.rs b/src/decoder/ifd.rs index 51553d2..ea363b1 100644 --- a/src/decoder/ifd.rs +++ b/src/decoder/ifd.rs @@ -181,7 +181,7 @@ impl Value { } Unsigned(val) => Ok(vec![val]), Rational(numerator, denominator) => Ok(vec![numerator, denominator]), - Ascii(val) => Ok(val.chars().map(|x| x as u32).collect()), + Ascii(val) => Ok(val.chars().map(u32::from).collect()), val => Err(TiffError::FormatError( TiffFormatError::UnsignedIntegerExpected(val), )), From d510a9f4ab49faa8d127f171385a1f984faecd88 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Thu, 12 Dec 2019 17:36:35 +0000 Subject: [PATCH 06/17] Strictly handle expected tag value types Resolve several TODOs where tag values were cast from u32 without checks by providing generic methods that error when the value fails casting to the desired type. In addition to being more correct, this simplifies and shortens decoding logic. Remove `find_tag_u32` and `find_tag_u32_vec` as they are now redundant and a GitHub code search found no usages outside copies of `image-tiff`. --- src/decoder/mod.rs | 94 ++++++++++++++++++++-------------------------- src/error.rs | 17 ++++++++- 2 files changed, 57 insertions(+), 54 deletions(-) diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index 8ff00ff..78862ee 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -1,3 +1,4 @@ +use std::convert::TryFrom; use std::collections::HashMap; use std::io::{self, Read, Seek}; use std::cmp; @@ -427,47 +428,24 @@ impl Decoder { self.width = self.get_tag_u32(ifd::Tag::ImageWidth)?; self.height = self.get_tag_u32(ifd::Tag::ImageLength)?; self.strip_decoder = None; - // TODO: error on non-SHORT value. - self.photometric_interpretation = match PhotometricInterpretation::from_u16( - self.get_tag_u32(ifd::Tag::PhotometricInterpretation)? as u16 - ) { - Some(val) => val, - None => { - return Err(TiffError::UnsupportedError( - TiffUnsupportedError::UnknownInterpretation, - )) - } - }; - // TODO: error on non-SHORT value. - if let Some(val) = self.find_tag_u32(ifd::Tag::Compression)? { - match CompressionMethod::from_u16(val as u16) { - Some(method) => self.compression_method = method, - None => { - return Err(TiffError::UnsupportedError( - TiffUnsupportedError::UnknownCompressionMethod, - )) - } - } + + self.photometric_interpretation = self + .find_tag_unsigned(ifd::Tag::PhotometricInterpretation)? + .and_then(PhotometricInterpretation::from_u16) + .ok_or(TiffUnsupportedError::UnknownInterpretation)?; + + if let Some(val) = self.find_tag_unsigned(ifd::Tag::Compression)? { + self.compression_method = CompressionMethod::from_u16(val) + .ok_or(TiffUnsupportedError::UnknownCompressionMethod)?; } - if let Some(val) = self.find_tag_u32(ifd::Tag::SamplesPerPixel)? { - self.samples = val as u8 + if let Some(val) = self.find_tag_unsigned(ifd::Tag::SamplesPerPixel)? { + self.samples = val; } match self.samples { - 1 => { - if let Some(val) = self.find_tag_u32(ifd::Tag::BitsPerSample)? { - self.bits_per_sample = vec![val as u8] - } - } - 3 | 4 => { - if let Some(val) = self.find_tag_u32_vec(ifd::Tag::BitsPerSample)? { - self.bits_per_sample = val.iter().map(|&v| v as u8).collect() - } - } - _ => { - return Err(TiffError::UnsupportedError( - TiffUnsupportedError::UnsupportedSampleDepth(self.samples), - )) - } + 1 | 3 | 4 => if let Some(val) = self.find_tag_unsigned_vec(ifd::Tag::BitsPerSample)? { + self.bits_per_sample = val; + }, + _ => return Err(TiffUnsupportedError::UnsupportedSampleDepth(self.samples).into()), } Ok(()) } @@ -606,20 +584,31 @@ impl Decoder { Ok(Some(entry.val(&limits, self)?)) } - /// Tries to retrieve a tag and convert it to the desired type. - pub fn find_tag_u32(&mut self, tag: ifd::Tag) -> TiffResult> { - match self.find_tag(tag)? { - Some(val) => val.into_u32().map(Some), - None => Ok(None), - } + /// Tries to retrieve a tag and convert it to the desired unsigned type. + pub fn find_tag_unsigned>(&mut self, tag: ifd::Tag) -> TiffResult> { + self.find_tag(tag)? + .map(|v| v.into_u32()).transpose()? + .map(|value| T::try_from(value) + .map_err(|_| TiffFormatError::InvalidTagValueType(tag).into())) + .transpose() } - /// Tries to retrieve a tag and convert it to the desired type. - pub fn find_tag_u32_vec(&mut self, tag: ifd::Tag) -> TiffResult>> { - match self.find_tag(tag)? { - Some(val) => val.into_u32_vec().map(Some), - None => Ok(None), - } + /// Tries to retrieve a vector of all a tag's values and convert them to + /// the desired unsigned type. + pub fn find_tag_unsigned_vec>(&mut self, tag: ifd::Tag) -> TiffResult>> { + self.find_tag(tag)? + .map(|v| v.into_u32_vec()).transpose()? + .map(|v| v.into_iter() + .map(|u| T::try_from(u).map_err(|_| TiffFormatError::InvalidTagValueType(tag).into())) + .collect()) + .transpose() + } + + /// Tries to retrieve a tag and convert it to the desired unsigned type. + /// Returns an error if the tag is not present. + pub fn get_tag_unsigned>(&mut self, tag: ifd::Tag) -> TiffResult { + self.find_tag_unsigned(tag)? + .ok_or_else(|| TiffFormatError::RequiredTagNotFound(tag).into()) } /// Tries to retrieve a tag. @@ -842,9 +831,8 @@ impl Decoder { TiffFormatError::InconsistentSizesEncountered, )); } - if let Ok(predictor) = self.get_tag_u32(ifd::Tag::Predictor) { - // TODO: error on non-SHORT value. - match Predictor::from_u16(predictor as u16) { + if let Ok(predictor) = self.get_tag_unsigned(ifd::Tag::Predictor) { + match Predictor::from_u16(predictor) { Some(Predictor::None) => (), Some(Predictor::Horizontal) => { rev_hpredict( diff --git a/src/error.rs b/src/error.rs index 731466d..dbdde69 100644 --- a/src/error.rs +++ b/src/error.rs @@ -38,8 +38,9 @@ pub enum TiffFormatError { ImageFileDirectoryNotFound, InconsistentSizesEncountered, InvalidTag, + InvalidTagValueType(Tag), RequiredTagNotFound(Tag), - UnknownPredictor(u32), + UnknownPredictor(u16), UnsignedIntegerExpected(Value), SignedIntegerExpected(Value), InflateError(InflateError), @@ -57,6 +58,8 @@ impl fmt::Display for TiffFormatError { ImageFileDirectoryNotFound => write!(fmt, "Image file directory not found."), InconsistentSizesEncountered => write!(fmt, "Inconsistent sizes encountered."), InvalidTag => write!(fmt, "Image contains invalid tag."), + InvalidTagValueType(ref tag) => + write!(fmt, "Tag `{:?}` did not have the expected value type.", tag), RequiredTagNotFound(ref tag) => write!(fmt, "Required tag `{:?}` not found.", tag), UnknownPredictor(ref predictor) => { write!(fmt, "Unknown predictor “{}” encountered", predictor) @@ -202,5 +205,17 @@ impl From for TiffError { } } +impl From for TiffError { + fn from(err: TiffFormatError) -> TiffError { + TiffError::FormatError(err) + } +} + +impl From for TiffError { + fn from(err: TiffUnsupportedError) -> TiffError { + TiffError::UnsupportedError(err) + } +} + /// Result of an image decoding/encoding process pub type TiffResult = Result; From f9cace84dacb6595a7267bfd4e0016d8d54c1a98 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Thu, 12 Dec 2019 20:22:37 +0000 Subject: [PATCH 07/17] Deduplicate primitive conversions for tag enum --- src/decoder/ifd.rs | 44 +++++++++++++++++++++++++++----------------- src/decoder/mod.rs | 44 ++------------------------------------------ src/encoder/mod.rs | 2 +- 3 files changed, 30 insertions(+), 60 deletions(-) diff --git a/src/decoder/ifd.rs b/src/decoder/ifd.rs index ea363b1..f6f0f0d 100644 --- a/src/decoder/ifd.rs +++ b/src/decoder/ifd.rs @@ -9,6 +9,30 @@ use {TiffError, TiffFormatError, TiffResult, TiffUnsupportedError}; use self::Value::{Ascii, List, Rational, Unsigned, Signed, SRational}; +pub(crate) mod seals { + pub trait TagConversion: Sized { + fn __from_inner_type(T) -> Result; + + fn __to_inner_type(&self) -> T; + } +} + +pub trait U16Tag: Sized { + fn from_u16(val: u16) -> Option; + + fn to_u16(&self) -> u16; +} + +impl> U16Tag for T { + fn from_u16(val: u16) -> Option { + Self::__from_inner_type(val).ok() + } + + fn to_u16(&self) -> u16 { + Self::__to_inner_type(self) + } +} + macro_rules! tags { { // Permit arbitrary meta items, which include documentation. @@ -31,7 +55,7 @@ macro_rules! tags { )* } - impl $name { + impl ::decoder::ifd::seals::TagConversion<$ty> for $name { #[inline(always)] fn __from_inner_type(n: $ty) -> Result { match n { @@ -101,12 +125,8 @@ pub enum Tag(u16) unknown("A private or extension tag") { } impl Tag { - pub fn from_u16(val: u16) -> Self { - Self::__from_inner_type(val).unwrap_or_else(Tag::Unknown) - } - - pub fn to_u16(&self) -> u16 { - Self::__to_inner_type(self) + pub fn from_u16_exhaustive(val: u16) -> Self { + Self::from_u16(val).unwrap_or_else(|| Tag::Unknown(val)) } } @@ -127,16 +147,6 @@ pub enum Type(u16) { } } -impl Type { - pub fn from_u16(val: u16) -> Option { - Self::__from_inner_type(val).ok() - } - - pub fn to_u16(&self) -> u16 { - Self::__to_inner_type(self) - } -} - #[allow(unused_qualifications)] #[derive(Debug, Clone, PartialEq, Eq, Hash)] diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index 78862ee..f4e757d 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -5,7 +5,7 @@ use std::cmp; use {ColorType, TiffError, TiffFormatError, TiffResult, TiffUnsupportedError}; -use self::ifd::Directory; +use self::ifd::{Directory, U16Tag}; use self::stream::{ByteOrder, EndianReader, LZWReader, DeflateReader, PackBitsReader, SmartReader}; @@ -154,46 +154,6 @@ enum Predictor(u16) { } } -impl PhotometricInterpretation { - pub fn from_u16(val: u16) -> Option { - Self::__from_inner_type(val).ok() - } - - pub fn to_u16(&self) -> u16 { - Self::__to_inner_type(self) - } -} - -impl CompressionMethod { - pub fn from_u16(val: u16) -> Option { - Self::__from_inner_type(val).ok() - } - - pub fn to_u16(&self) -> u16 { - Self::__to_inner_type(self) - } -} - -impl PlanarConfiguration { - pub fn from_u16(val: u16) -> Option { - Self::__from_inner_type(val).ok() - } - - pub fn to_u16(&self) -> u16 { - Self::__to_inner_type(self) - } -} - -impl Predictor { - pub fn from_u16(val: u16) -> Option { - Self::__from_inner_type(val).ok() - } - - pub fn to_u16(&self) -> u16 { - Self::__to_inner_type(self) - } -} - #[derive(Debug)] struct StripDecodeState { strip_index: usize, @@ -526,7 +486,7 @@ impl Decoder { // Count 4 bytes // Value 4 bytes either a pointer the value itself fn read_entry(&mut self) -> TiffResult> { - let tag = ifd::Tag::from_u16(self.read_short()?); + let tag = ifd::Tag::from_u16_exhaustive(self.read_short()?); let type_ = match ifd::Type::from_u16(self.read_short()?) { Some(t) => t, None => { diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs index 96e8bfb..3055c13 100644 --- a/src/encoder/mod.rs +++ b/src/encoder/mod.rs @@ -3,7 +3,7 @@ use std::collections::BTreeMap; use std::io::{Seek, Write}; use std::mem; -use decoder::ifd::{self, Tag}; +use decoder::ifd::{self, Tag, U16Tag}; use error::{TiffError, TiffFormatError, TiffResult}; pub mod colortype; From f92be13f6cd8554b97c6179fd555722dd9ed609d Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Fri, 13 Dec 2019 16:37:38 +0000 Subject: [PATCH 08/17] Factor tags into own module Tag representations are not decoder- or encoder-specific, so should live in their own module accessible to both for reuse. The decoder::ifd module remains since this module is mainly dedicated to decoding the IFD. --- src/decoder/ifd.rs | 139 +---------------------------- src/decoder/mod.rs | 91 ++++++------------- src/encoder/colortype.rs | 2 +- src/encoder/mod.rs | 51 +++++------ src/error.rs | 4 +- src/lib.rs | 1 + src/tags.rs | 188 +++++++++++++++++++++++++++++++++++++++ tests/decode_images.rs | 2 +- tests/encode_images.rs | 2 +- 9 files changed, 242 insertions(+), 238 deletions(-) create mode 100644 src/tags.rs diff --git a/src/decoder/ifd.rs b/src/decoder/ifd.rs index f6f0f0d..73b6e97 100644 --- a/src/decoder/ifd.rs +++ b/src/decoder/ifd.rs @@ -5,148 +5,11 @@ use std::io::{self, Read, Seek}; use std::mem; use super::stream::{ByteOrder, EndianReader, SmartReader}; +use tags::{Tag, Type}; use {TiffError, TiffFormatError, TiffResult, TiffUnsupportedError}; use self::Value::{Ascii, List, Rational, Unsigned, Signed, SRational}; -pub(crate) mod seals { - pub trait TagConversion: Sized { - fn __from_inner_type(T) -> Result; - - fn __to_inner_type(&self) -> T; - } -} - -pub trait U16Tag: Sized { - fn from_u16(val: u16) -> Option; - - fn to_u16(&self) -> u16; -} - -impl> U16Tag for T { - fn from_u16(val: u16) -> Option { - Self::__from_inner_type(val).ok() - } - - fn to_u16(&self) -> u16 { - Self::__to_inner_type(self) - } -} - -macro_rules! tags { - { - // Permit arbitrary meta items, which include documentation. - $( #[$enum_attr:meta] )* - $vis:vis enum $name:ident($ty:ty) $(unknown($unknown_doc:literal))* { - // Each of the `Name = Val,` permitting documentation. - $($(#[$ident_attr:meta])* $tag:ident = $val:expr,)* - } - } => { - $( #[$enum_attr] )* - #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] - pub enum $name { - $($(#[$ident_attr])* $tag,)* - // FIXME: switch to non_exhaustive once stabilized and compiler requirement new enough - #[doc(hidden)] - __NonExhaustive, - $( - #[doc = $unknown_doc] - Unknown($ty), - )* - } - - impl ::decoder::ifd::seals::TagConversion<$ty> for $name { - #[inline(always)] - fn __from_inner_type(n: $ty) -> Result { - match n { - $( $val => Ok($name::$tag), )* - n => Err(n), - } - } - - #[inline(always)] - fn __to_inner_type(&self) -> $ty { - match *self { - $( $name::$tag => $val, )* - $( $name::Unknown(n) => { $unknown_doc; n }, )* - $name::__NonExhaustive => unreachable!(), - } - } - } - } -} - -// Note: These tags appear in the order they are mentioned in the TIFF reference -tags! { -/// TIFF tags -pub enum Tag(u16) unknown("A private or extension tag") { - // Baseline tags: - Artist = 315, - // grayscale images PhotometricInterpretation 1 or 3 - BitsPerSample = 258, - CellLength = 265, // TODO add support - CellWidth = 264, // TODO add support - // palette-color images (PhotometricInterpretation 3) - ColorMap = 320, // TODO add support - Compression = 259, // TODO add support for 2 and 32773 - Copyright = 33_432, - DateTime = 306, - ExtraSamples = 338, // TODO add support - FillOrder = 266, // TODO add support - FreeByteCounts = 289, // TODO add support - FreeOffsets = 288, // TODO add support - GrayResponseCurve = 291, // TODO add support - GrayResponseUnit = 290, // TODO add support - HostComputer = 316, - ImageDescription = 270, - ImageLength = 257, - ImageWidth = 256, - Make = 271, - MaxSampleValue = 281, // TODO add support - MinSampleValue = 280, // TODO add support - Model = 272, - NewSubfileType = 254, // TODO add support - Orientation = 274, // TODO add support - PhotometricInterpretation = 262, - PlanarConfiguration = 284, - ResolutionUnit = 296, // TODO add support - RowsPerStrip = 278, - SamplesPerPixel = 277, - Software = 305, - StripByteCounts = 279, - StripOffsets = 273, - SubfileType = 255, // TODO add support - Threshholding = 263, // TODO add support - XResolution = 282, - YResolution = 283, - // Advanced tags - Predictor = 317, -} -} - -impl Tag { - pub fn from_u16_exhaustive(val: u16) -> Self { - Self::from_u16(val).unwrap_or_else(|| Tag::Unknown(val)) - } -} - -tags! { -/// The type of an IFD entry (a 2 byte field). -pub enum Type(u16) { - BYTE = 1, - ASCII = 2, - SHORT = 3, - LONG = 4, - RATIONAL = 5, - SBYTE = 6, - SSHORT = 8, - SLONG = 9, - SRATIONAL = 10, - /// BigTIFF 64-bit unsigned integer - LONG8 = 16, -} -} - #[allow(unused_qualifications)] #[derive(Debug, Clone, PartialEq, Eq, Hash)] diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index f4e757d..e7fdfb2 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -5,11 +5,11 @@ use std::cmp; use {ColorType, TiffError, TiffFormatError, TiffResult, TiffUnsupportedError}; -use self::ifd::{Directory, U16Tag}; +use self::ifd::Directory; +use tags::{CompressionMethod, PhotometricInterpretation, Predictor, Tag, Type, U16Tag}; use self::stream::{ByteOrder, EndianReader, LZWReader, DeflateReader, PackBitsReader, SmartReader}; -#[macro_use] pub mod ifd; mod stream; @@ -113,47 +113,6 @@ impl<'a> DecodingBuffer<'a> { } } -tags! { -pub enum PhotometricInterpretation(u16) { - WhiteIsZero = 0, - BlackIsZero = 1, - RGB = 2, - RGBPalette = 3, - TransparencyMask = 4, - CMYK = 5, - YCbCr = 6, - CIELab = 8, -} -} - -tags! { -pub enum CompressionMethod(u16) { - None = 1, - Huffman = 2, - Fax3 = 3, - Fax4 = 4, - LZW = 5, - JPEG = 6, - Deflate = 8, - OldDeflate = 0x80B2, - PackBits = 0x8005, -} -} - -tags! { -pub enum PlanarConfiguration(u16) { - Chunky = 1, - Planar = 2, -} -} - -tags! { -enum Predictor(u16) { - None = 1, - Horizontal = 2, -} -} - #[derive(Debug)] struct StripDecodeState { strip_index: usize, @@ -385,24 +344,24 @@ impl Decoder { /// To determine whether there are more images call `TIFFDecoder::more_images` instead. pub fn next_image(&mut self) -> TiffResult<()> { self.ifd = Some(self.read_ifd()?); - self.width = self.get_tag_u32(ifd::Tag::ImageWidth)?; - self.height = self.get_tag_u32(ifd::Tag::ImageLength)?; + self.width = self.get_tag_u32(Tag::ImageWidth)?; + self.height = self.get_tag_u32(Tag::ImageLength)?; self.strip_decoder = None; self.photometric_interpretation = self - .find_tag_unsigned(ifd::Tag::PhotometricInterpretation)? + .find_tag_unsigned(Tag::PhotometricInterpretation)? .and_then(PhotometricInterpretation::from_u16) .ok_or(TiffUnsupportedError::UnknownInterpretation)?; - if let Some(val) = self.find_tag_unsigned(ifd::Tag::Compression)? { + if let Some(val) = self.find_tag_unsigned(Tag::Compression)? { self.compression_method = CompressionMethod::from_u16(val) .ok_or(TiffUnsupportedError::UnknownCompressionMethod)?; } - if let Some(val) = self.find_tag_unsigned(ifd::Tag::SamplesPerPixel)? { + if let Some(val) = self.find_tag_unsigned(Tag::SamplesPerPixel)? { self.samples = val; } match self.samples { - 1 | 3 | 4 => if let Some(val) = self.find_tag_unsigned_vec(ifd::Tag::BitsPerSample)? { + 1 | 3 | 4 => if let Some(val) = self.find_tag_unsigned_vec(Tag::BitsPerSample)? { self.bits_per_sample = val; }, _ => return Err(TiffUnsupportedError::UnsupportedSampleDepth(self.samples).into()), @@ -485,9 +444,9 @@ impl Decoder { // Type 2 bytes // Count 4 bytes // Value 4 bytes either a pointer the value itself - fn read_entry(&mut self) -> TiffResult> { - let tag = ifd::Tag::from_u16_exhaustive(self.read_short()?); - let type_ = match ifd::Type::from_u16(self.read_short()?) { + fn read_entry(&mut self) -> TiffResult> { + let tag = Tag::from_u16_exhaustive(self.read_short()?); + let type_ = match Type::from_u16(self.read_short()?) { Some(t) => t, None => { // Unknown type. Skip this entry according to spec. @@ -533,7 +492,7 @@ impl Decoder { /// Tries to retrieve a tag. /// Return `Ok(None)` if the tag is not present. - pub fn find_tag(&mut self, tag: ifd::Tag) -> TiffResult> { + pub fn find_tag(&mut self, tag: Tag) -> TiffResult> { let entry = match self.ifd.as_ref().unwrap().get(&tag) { None => return Ok(None), Some(entry) => entry.clone(), @@ -545,7 +504,7 @@ impl Decoder { } /// Tries to retrieve a tag and convert it to the desired unsigned type. - pub fn find_tag_unsigned>(&mut self, tag: ifd::Tag) -> TiffResult> { + pub fn find_tag_unsigned>(&mut self, tag: Tag) -> TiffResult> { self.find_tag(tag)? .map(|v| v.into_u32()).transpose()? .map(|value| T::try_from(value) @@ -555,7 +514,7 @@ impl Decoder { /// Tries to retrieve a vector of all a tag's values and convert them to /// the desired unsigned type. - pub fn find_tag_unsigned_vec>(&mut self, tag: ifd::Tag) -> TiffResult>> { + pub fn find_tag_unsigned_vec>(&mut self, tag: Tag) -> TiffResult>> { self.find_tag(tag)? .map(|v| v.into_u32_vec()).transpose()? .map(|v| v.into_iter() @@ -566,14 +525,14 @@ impl Decoder { /// Tries to retrieve a tag and convert it to the desired unsigned type. /// Returns an error if the tag is not present. - pub fn get_tag_unsigned>(&mut self, tag: ifd::Tag) -> TiffResult { + pub fn get_tag_unsigned>(&mut self, tag: Tag) -> TiffResult { self.find_tag_unsigned(tag)? .ok_or_else(|| TiffFormatError::RequiredTagNotFound(tag).into()) } /// Tries to retrieve a tag. /// Returns an error if the tag is not present - pub fn get_tag(&mut self, tag: ifd::Tag) -> TiffResult { + pub fn get_tag(&mut self, tag: Tag) -> TiffResult { match self.find_tag(tag)? { Some(val) => Ok(val), None => Err(TiffError::FormatError( @@ -583,12 +542,12 @@ impl Decoder { } /// Tries to retrieve a tag and convert it to the desired type. - pub fn get_tag_u32(&mut self, tag: ifd::Tag) -> TiffResult { + pub fn get_tag_u32(&mut self, tag: Tag) -> TiffResult { self.get_tag(tag)?.into_u32() } /// Tries to retrieve a tag and convert it to the desired type. - pub fn get_tag_u32_vec(&mut self, tag: ifd::Tag) -> TiffResult> { + pub fn get_tag_u32_vec(&mut self, tag: Tag) -> TiffResult> { self.get_tag(tag)?.into_u32_vec() } @@ -714,7 +673,7 @@ impl Decoder { /// Number of strips in image pub fn strip_count(&mut self) -> TiffResult { let rows_per_strip = self - .get_tag_u32(ifd::Tag::RowsPerStrip) + .get_tag_u32(Tag::RowsPerStrip) .unwrap_or(self.height); if rows_per_strip == 0 { @@ -726,8 +685,8 @@ impl Decoder { fn initialize_strip_decoder(&mut self) -> TiffResult<()> { if self.strip_decoder.is_none() { - let strip_offsets = self.get_tag_u32_vec(ifd::Tag::StripOffsets)?; - let strip_bytes = self.get_tag_u32_vec(ifd::Tag::StripByteCounts)?; + let strip_offsets = self.get_tag_u32_vec(Tag::StripOffsets)?; + let strip_bytes = self.get_tag_u32_vec(Tag::StripByteCounts)?; self.strip_decoder = Some(StripDecodeState { strip_index: 0, @@ -762,7 +721,7 @@ impl Decoder { ))?; let rows_per_strip = self - .get_tag_u32(ifd::Tag::RowsPerStrip) + .get_tag_u32(Tag::RowsPerStrip) .unwrap_or(self.height) as usize; let strip_height = cmp::min( @@ -791,7 +750,7 @@ impl Decoder { TiffFormatError::InconsistentSizesEncountered, )); } - if let Ok(predictor) = self.get_tag_unsigned(ifd::Tag::Predictor) { + if let Ok(predictor) = self.get_tag_unsigned(Tag::Predictor) { match Predictor::from_u16(predictor) { Some(Predictor::None) => (), Some(Predictor::Horizontal) => { @@ -834,7 +793,7 @@ impl Decoder { let index = self.strip_decoder.as_ref().unwrap().strip_index; let rows_per_strip = self - .get_tag_u32(ifd::Tag::RowsPerStrip) + .get_tag_u32(Tag::RowsPerStrip) .unwrap_or(self.height) as usize; let strip_height = cmp::min( @@ -853,7 +812,7 @@ impl Decoder { pub fn read_image(&mut self) -> TiffResult { self.initialize_strip_decoder()?; let rows_per_strip = self - .get_tag_u32(ifd::Tag::RowsPerStrip) + .get_tag_u32(Tag::RowsPerStrip) .unwrap_or(self.height) as usize; let samples_per_strip = diff --git a/src/encoder/colortype.rs b/src/encoder/colortype.rs index 2f49fdb..4055fdf 100644 --- a/src/encoder/colortype.rs +++ b/src/encoder/colortype.rs @@ -1,4 +1,4 @@ -use decoder::PhotometricInterpretation; +use tags::PhotometricInterpretation; /// Trait for different colortypes that can be encoded. pub trait ColorType { diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs index 3055c13..6f3c63a 100644 --- a/src/encoder/mod.rs +++ b/src/encoder/mod.rs @@ -3,7 +3,7 @@ use std::collections::BTreeMap; use std::io::{Seek, Write}; use std::mem; -use decoder::ifd::{self, Tag, U16Tag}; +use tags::{self, ResolutionUnit, Tag, Type, U16Tag}; use error::{TiffError, TiffFormatError, TiffResult}; pub mod colortype; @@ -25,17 +25,10 @@ pub struct SRational { pub d: i32, } -/// Type to represent resolution units -pub enum ResolutionUnit { - None = 1, - Inch = 2, - Centimeter = 3, -} - /// Trait for types that can be encoded in a tiff file pub trait TiffValue { const BYTE_LEN: u32; - const FIELD_TYPE: ifd::Type; + const FIELD_TYPE: Type; fn count(&self) -> u32; fn bytes(&self) -> u32 { self.count() * Self::BYTE_LEN @@ -45,7 +38,7 @@ pub trait TiffValue { impl TiffValue for [u8] { const BYTE_LEN: u32 = 1; - const FIELD_TYPE: ifd::Type = ifd::Type::BYTE; + const FIELD_TYPE: Type = Type::BYTE; fn count(&self) -> u32 { self.len() as u32 @@ -59,7 +52,7 @@ impl TiffValue for [u8] { impl TiffValue for [i8] { const BYTE_LEN: u32 = 1; - const FIELD_TYPE: ifd::Type = ifd::Type::SBYTE; + const FIELD_TYPE: Type = Type::SBYTE; fn count(&self) -> u32 { self.len() as u32 @@ -76,7 +69,7 @@ impl TiffValue for [i8] { impl TiffValue for [u16] { const BYTE_LEN: u32 = 2; - const FIELD_TYPE: ifd::Type = ifd::Type::SHORT; + const FIELD_TYPE: Type = Type::SHORT; fn count(&self) -> u32 { self.len() as u32 @@ -93,7 +86,7 @@ impl TiffValue for [u16] { impl TiffValue for [i16] { const BYTE_LEN: u32 = 2; - const FIELD_TYPE: ifd::Type = ifd::Type::SSHORT; + const FIELD_TYPE: Type = Type::SSHORT; fn count(&self) -> u32 { self.len() as u32 @@ -110,7 +103,7 @@ impl TiffValue for [i16] { impl TiffValue for [u32] { const BYTE_LEN: u32 = 4; - const FIELD_TYPE: ifd::Type = ifd::Type::LONG; + const FIELD_TYPE: Type = Type::LONG; fn count(&self) -> u32 { self.len() as u32 @@ -127,7 +120,7 @@ impl TiffValue for [u32] { impl TiffValue for [i32] { const BYTE_LEN: u32 = 4; - const FIELD_TYPE: ifd::Type = ifd::Type::SLONG; + const FIELD_TYPE: Type = Type::SLONG; fn count(&self) -> u32 { self.len() as u32 @@ -144,7 +137,7 @@ impl TiffValue for [i32] { impl TiffValue for [u64] { const BYTE_LEN: u32 = 8; - const FIELD_TYPE: ifd::Type = ifd::Type::LONG8; + const FIELD_TYPE: Type = Type::LONG8; fn count(&self) -> u32 { self.len() as u32 @@ -161,7 +154,7 @@ impl TiffValue for [u64] { impl TiffValue for [Rational] { const BYTE_LEN: u32 = 8; - const FIELD_TYPE: ifd::Type = ifd::Type::RATIONAL; + const FIELD_TYPE: Type = Type::RATIONAL; fn count(&self) -> u32 { self.len() as u32 @@ -177,7 +170,7 @@ impl TiffValue for [Rational] { impl TiffValue for [SRational] { const BYTE_LEN: u32 = 8; - const FIELD_TYPE: ifd::Type = ifd::Type::SRATIONAL; + const FIELD_TYPE: Type = Type::SRATIONAL; fn count(&self) -> u32 { self.len() as u32 @@ -193,7 +186,7 @@ impl TiffValue for [SRational] { impl TiffValue for u8 { const BYTE_LEN: u32 = 1; - const FIELD_TYPE: ifd::Type = ifd::Type::BYTE; + const FIELD_TYPE: Type = Type::BYTE; fn count(&self) -> u32 { 1 @@ -207,7 +200,7 @@ impl TiffValue for u8 { impl TiffValue for i8 { const BYTE_LEN: u32 = 1; - const FIELD_TYPE: ifd::Type = ifd::Type::SBYTE; + const FIELD_TYPE: Type = Type::SBYTE; fn count(&self) -> u32 { 1 @@ -221,7 +214,7 @@ impl TiffValue for i8 { impl TiffValue for u16 { const BYTE_LEN: u32 = 2; - const FIELD_TYPE: ifd::Type = ifd::Type::SHORT; + const FIELD_TYPE: Type = Type::SHORT; fn count(&self) -> u32 { 1 @@ -235,7 +228,7 @@ impl TiffValue for u16 { impl TiffValue for i16 { const BYTE_LEN: u32 = 2; - const FIELD_TYPE: ifd::Type = ifd::Type::SSHORT; + const FIELD_TYPE: Type = Type::SSHORT; fn count(&self) -> u32 { 1 @@ -249,7 +242,7 @@ impl TiffValue for i16 { impl TiffValue for u32 { const BYTE_LEN: u32 = 4; - const FIELD_TYPE: ifd::Type = ifd::Type::LONG; + const FIELD_TYPE: Type = Type::LONG; fn count(&self) -> u32 { 1 @@ -263,7 +256,7 @@ impl TiffValue for u32 { impl TiffValue for i32 { const BYTE_LEN: u32 = 4; - const FIELD_TYPE: ifd::Type = ifd::Type::SLONG; + const FIELD_TYPE: Type = Type::SLONG; fn count(&self) -> u32 { 1 @@ -277,7 +270,7 @@ impl TiffValue for i32 { impl TiffValue for u64 { const BYTE_LEN: u32 = 8; - const FIELD_TYPE: ifd::Type = ifd::Type::LONG8; + const FIELD_TYPE: Type = Type::LONG8; fn count(&self) -> u32 { 1 @@ -291,7 +284,7 @@ impl TiffValue for u64 { impl TiffValue for Rational { const BYTE_LEN: u32 = 8; - const FIELD_TYPE: ifd::Type = ifd::Type::RATIONAL; + const FIELD_TYPE: Type = Type::RATIONAL; fn count(&self) -> u32 { 1 @@ -306,7 +299,7 @@ impl TiffValue for Rational { impl TiffValue for SRational { const BYTE_LEN: u32 = 8; - const FIELD_TYPE: ifd::Type = ifd::Type::SRATIONAL; + const FIELD_TYPE: Type = Type::SRATIONAL; fn count(&self) -> u32 { 1 @@ -321,7 +314,7 @@ impl TiffValue for SRational { impl TiffValue for str { const BYTE_LEN: u32 = 1; - const FIELD_TYPE: ifd::Type = ifd::Type::ASCII; + const FIELD_TYPE: Type = Type::ASCII; fn count(&self) -> u32 { self.len() as u32 + 1 @@ -340,7 +333,7 @@ impl TiffValue for str { impl<'a, T: TiffValue + ?Sized> TiffValue for &'a T { const BYTE_LEN: u32 = T::BYTE_LEN; - const FIELD_TYPE: ifd::Type = T::FIELD_TYPE; + const FIELD_TYPE: Type = T::FIELD_TYPE; fn count(&self) -> u32 { (*self).count() diff --git a/src/error.rs b/src/error.rs index dbdde69..27ef8c3 100644 --- a/src/error.rs +++ b/src/error.rs @@ -3,8 +3,8 @@ use std::fmt; use std::io; use std::string; -use decoder::ifd::{Tag, Value}; -use decoder::{CompressionMethod, PhotometricInterpretation, PlanarConfiguration}; +use decoder::ifd::{Value}; +use tags::{CompressionMethod, PhotometricInterpretation, PlanarConfiguration, Tag}; use miniz_oxide::inflate::TINFLStatus; use ColorType; diff --git a/src/lib.rs b/src/lib.rs index 03ab3e2..7dec5ba 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,6 +13,7 @@ extern crate miniz_oxide; pub mod decoder; pub mod encoder; mod error; +pub mod tags; pub use self::error::{InflateError, TiffError, TiffFormatError, TiffResult, TiffUnsupportedError}; diff --git a/src/tags.rs b/src/tags.rs new file mode 100644 index 0000000..3c074cd --- /dev/null +++ b/src/tags.rs @@ -0,0 +1,188 @@ +mod seals { + pub trait TagConversion: Sized { + fn __from_inner_type(T) -> Result; + + fn __to_inner_type(&self) -> T; + } +} + +pub trait U16Tag: Sized { + fn from_u16(val: u16) -> Option; + + fn to_u16(&self) -> u16; +} + +impl> U16Tag for T { + fn from_u16(val: u16) -> Option { + Self::__from_inner_type(val).ok() + } + + fn to_u16(&self) -> u16 { + Self::__to_inner_type(self) + } +} + +macro_rules! tags { + { + // Permit arbitrary meta items, which include documentation. + $( #[$enum_attr:meta] )* + $vis:vis enum $name:ident($ty:ty) $(unknown($unknown_doc:literal))* { + // Each of the `Name = Val,` permitting documentation. + $($(#[$ident_attr:meta])* $tag:ident = $val:expr,)* + } + } => { + $( #[$enum_attr] )* + #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] + pub enum $name { + $($(#[$ident_attr])* $tag,)* + // FIXME: switch to non_exhaustive once stabilized and compiler requirement new enough + #[doc(hidden)] + __NonExhaustive, + $( + #[doc = $unknown_doc] + Unknown($ty), + )* + } + + impl ::tags::seals::TagConversion<$ty> for $name { + #[inline(always)] + fn __from_inner_type(n: $ty) -> Result { + match n { + $( $val => Ok($name::$tag), )* + n => Err(n), + } + } + + #[inline(always)] + fn __to_inner_type(&self) -> $ty { + match *self { + $( $name::$tag => $val, )* + $( $name::Unknown(n) => { $unknown_doc; n }, )* + $name::__NonExhaustive => unreachable!(), + } + } + } + } +} + +// Note: These tags appear in the order they are mentioned in the TIFF reference +tags! { +/// TIFF tags +pub enum Tag(u16) unknown("A private or extension tag") { + // Baseline tags: + Artist = 315, + // grayscale images PhotometricInterpretation 1 or 3 + BitsPerSample = 258, + CellLength = 265, // TODO add support + CellWidth = 264, // TODO add support + // palette-color images (PhotometricInterpretation 3) + ColorMap = 320, // TODO add support + Compression = 259, // TODO add support for 2 and 32773 + Copyright = 33_432, + DateTime = 306, + ExtraSamples = 338, // TODO add support + FillOrder = 266, // TODO add support + FreeByteCounts = 289, // TODO add support + FreeOffsets = 288, // TODO add support + GrayResponseCurve = 291, // TODO add support + GrayResponseUnit = 290, // TODO add support + HostComputer = 316, + ImageDescription = 270, + ImageLength = 257, + ImageWidth = 256, + Make = 271, + MaxSampleValue = 281, // TODO add support + MinSampleValue = 280, // TODO add support + Model = 272, + NewSubfileType = 254, // TODO add support + Orientation = 274, // TODO add support + PhotometricInterpretation = 262, + PlanarConfiguration = 284, + ResolutionUnit = 296, // TODO add support + RowsPerStrip = 278, + SamplesPerPixel = 277, + Software = 305, + StripByteCounts = 279, + StripOffsets = 273, + SubfileType = 255, // TODO add support + Threshholding = 263, // TODO add support + XResolution = 282, + YResolution = 283, + // Advanced tags + Predictor = 317, +} +} + +impl Tag { + pub fn from_u16_exhaustive(val: u16) -> Self { + Self::from_u16(val).unwrap_or_else(|| Tag::Unknown(val)) + } +} + +tags! { +/// The type of an IFD entry (a 2 byte field). +pub enum Type(u16) { + BYTE = 1, + ASCII = 2, + SHORT = 3, + LONG = 4, + RATIONAL = 5, + SBYTE = 6, + SSHORT = 8, + SLONG = 9, + SRATIONAL = 10, + /// BigTIFF 64-bit unsigned integer + LONG8 = 16, +} +} + + +tags! { +pub enum CompressionMethod(u16) { + None = 1, + Huffman = 2, + Fax3 = 3, + Fax4 = 4, + LZW = 5, + JPEG = 6, + Deflate = 8, + OldDeflate = 0x80B2, + PackBits = 0x8005, +} +} + +tags! { +pub enum PhotometricInterpretation(u16) { + WhiteIsZero = 0, + BlackIsZero = 1, + RGB = 2, + RGBPalette = 3, + TransparencyMask = 4, + CMYK = 5, + YCbCr = 6, + CIELab = 8, +} +} + +tags! { +pub enum PlanarConfiguration(u16) { + Chunky = 1, + Planar = 2, +} +} + +tags! { +pub enum Predictor(u16) { + None = 1, + Horizontal = 2, +} +} + +tags!{ +/// Type to represent resolution units +pub enum ResolutionUnit(u16) { + None = 1, + Inch = 2, + Centimeter = 3, +} +} \ No newline at end of file diff --git a/tests/decode_images.rs b/tests/decode_images.rs index 7437cb1..7945d5b 100644 --- a/tests/decode_images.rs +++ b/tests/decode_images.rs @@ -106,7 +106,7 @@ fn test_string_tags() { let path = PathBuf::from(TEST_IMAGE_DIR).join(filename); let img_file = File::open(path).expect("Cannot find test image!"); let mut decoder = Decoder::new(img_file).expect("Cannot create decoder"); - let software = decoder.get_tag(ifd::Tag::Software).unwrap(); + let software = decoder.get_tag(tiff::tags::Tag::Software).unwrap(); match software { ifd::Value::Ascii(s) => assert_eq!( &s, diff --git a/tests/encode_images.rs b/tests/encode_images.rs index 988d386..32b1e88 100644 --- a/tests/encode_images.rs +++ b/tests/encode_images.rs @@ -1,9 +1,9 @@ extern crate tiff; use tiff::decoder::{Decoder, DecodingResult}; -use tiff::decoder::ifd::Tag; use tiff::encoder::{colortype, TiffEncoder, SRational}; use tiff::ColorType; +use tiff::tags::Tag; use std::fs::File; use std::io::{Cursor, Seek, SeekFrom}; From 298dc8841d8969b12fa938315faec9d71c4a41e6 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Fri, 13 Dec 2019 16:43:56 +0000 Subject: [PATCH 09/17] Remove unchecked casts and magic values for some tags --- src/encoder/mod.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs index 6f3c63a..27e3a37 100644 --- a/src/encoder/mod.rs +++ b/src/encoder/mod.rs @@ -587,7 +587,7 @@ impl<'a, W: 'a + Write + Seek, T: ColorType> ImageEncoder<'a, W, T> { encoder.write_tag(Tag::ImageWidth, width); encoder.write_tag(Tag::ImageLength, height); - encoder.write_tag(Tag::Compression, 1u16); + encoder.write_tag(Tag::Compression, tags::CompressionMethod::None.to_u16()); encoder.write_tag(Tag::BitsPerSample, ::BITS_PER_SAMPLE); encoder.write_tag(Tag::PhotometricInterpretation, ::TIFF_VALUE.to_u16()); @@ -597,7 +597,7 @@ impl<'a, W: 'a + Write + Seek, T: ColorType> ImageEncoder<'a, W, T> { encoder.write_tag(Tag::SamplesPerPixel, ::BITS_PER_SAMPLE.len() as u16); encoder.write_tag(Tag::XResolution, Rational { n: 1, d: 1 }); encoder.write_tag(Tag::YResolution, Rational { n: 1, d: 1 }); - encoder.write_tag(Tag::ResolutionUnit, 1u16); + encoder.write_tag(Tag::ResolutionUnit, ResolutionUnit::None.to_u16()); Ok(ImageEncoder { encoder, @@ -651,14 +651,14 @@ impl<'a, W: 'a + Write + Seek, T: ColorType> ImageEncoder<'a, W, T> { /// Set image resolution pub fn resolution(&mut self, unit: ResolutionUnit, value: Rational) { - self.encoder.write_tag(Tag::ResolutionUnit, unit as u16); + self.encoder.write_tag(Tag::ResolutionUnit, unit.to_u16()); self.encoder.write_tag(Tag::XResolution, value.clone()); self.encoder.write_tag(Tag::YResolution, value); } /// Set image resolution unit pub fn resolution_unit(&mut self, unit: ResolutionUnit) { - self.encoder.write_tag(Tag::ResolutionUnit, unit as u16); + self.encoder.write_tag(Tag::ResolutionUnit, unit.to_u16()); } /// Set image x-resolution From 8f61196d7064d7cf61a00680b156458f2e58a815 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Thu, 19 Dec 2019 17:02:52 +0000 Subject: [PATCH 10/17] Note 32 and 64 bit support in README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 61c5890..7a8ba53 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,9 @@ This table lists photometric interpretations and sample formats which are suppor | `PhotometricInterpretation` | UINT Format | IEEEFP Format | |-|-|-| -| `WhiteIsZero` | Gray(8), Gray(16) | | -| `BlackIsZero` | Gray(8), Gray(16) | | -| `RGB` | RGB(8), RGB(16), RGBA(8), RGBA(16) | | +| `WhiteIsZero` | Gray(8|16|32|64) | | +| `BlackIsZero` | Gray(8|16|32|64) | | +| `RGB` | RGB(8|16|32|64), RGBA(8|16|32|64) | | | `RGBPalette` | | | | `Mask` | | | | `CMYK` | CMYK(8) | | From c537f5cc64c79485db19efb2a030352d13cebdad Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Fri, 20 Dec 2019 15:05:25 +0000 Subject: [PATCH 11/17] Add decode test for CMYK(8) --- tests/decode_images.rs | 5 +++++ tests/images/cmyk-3c-8b.tiff | Bin 0 -> 95106 bytes 2 files changed, 5 insertions(+) create mode 100644 tests/images/cmyk-3c-8b.tiff diff --git a/tests/decode_images.rs b/tests/decode_images.rs index 7945d5b..bd09607 100644 --- a/tests/decode_images.rs +++ b/tests/decode_images.rs @@ -47,6 +47,11 @@ fn test_image_color_type_unsupported(file: &str, expected_type: ColorType) { }); } +#[test] +fn test_cmyk_u8() { + test_image_sum_u8("cmyk-3c-8b.tiff", ColorType::CMYK(8), 8522658); +} + #[test] fn test_gray_u8() { test_image_sum_u8("minisblack-1c-8b.tiff", ColorType::Gray(8), 2840893); diff --git a/tests/images/cmyk-3c-8b.tiff b/tests/images/cmyk-3c-8b.tiff new file mode 100644 index 0000000000000000000000000000000000000000..d906bbc99e821759cc7c97218915131a39cf5963 GIT binary patch literal 95106 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

6u#pn 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 NGtBY1zq{rB{|BVmOcDS9 literal 0 HcmV?d00001 From 462697e3739fda0eff3b632626e5fb3ffecfa739 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Fri, 20 Dec 2019 15:11:57 +0000 Subject: [PATCH 12/17] Add support for CMYK(16|32|64) decoding --- README.md | 2 +- src/decoder/mod.rs | 26 +++++++++++++++++++------- tests/decode_images.rs | 5 +++++ tests/images/cmyk-3c-16b.tiff | Bin 0 -> 189934 bytes 4 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 tests/images/cmyk-3c-16b.tiff diff --git a/README.md b/README.md index 7a8ba53..c674c2c 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ This table lists photometric interpretations and sample formats which are suppor | `RGB` | RGB(8|16|32|64), RGBA(8|16|32|64) | | | `RGBPalette` | | | | `Mask` | | | -| `CMYK` | CMYK(8) | | +| `CMYK` | CMYK(8|16|32|64) | | | `YCbCr` | | | | `CIELab` | | | diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index e7fdfb2..30ee3f1 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -216,7 +216,8 @@ fn rev_hpredict(image: DecodingBuffer, size: (u32, u32), color_type: ColorType) let samples = match color_type { ColorType::Gray(8) | ColorType::Gray(16) | ColorType::Gray(32) | ColorType::Gray(64) => 1, ColorType::RGB(8) | ColorType::RGB(16) | ColorType::RGB(32) | ColorType::RGB(64) => 3, - ColorType::RGBA(8) | ColorType::RGBA(16) | ColorType::RGBA(32) | ColorType::RGBA(64) | ColorType::CMYK(8) => 4, + ColorType::RGBA(8) | ColorType::RGBA(16) | ColorType::RGBA(32) | ColorType::RGBA(64) + | ColorType::CMYK(8) | ColorType::CMYK(16) | ColorType::CMYK(32) | ColorType::CMYK(64) => 4, _ => { return Err(TiffError::UnsupportedError( TiffUnsupportedError::HorizontalPredictor(color_type), @@ -283,9 +284,17 @@ impl Decoder { )), } }, - PhotometricInterpretation::CMYK if self.bits_per_sample == [8, 8, 8, 8] => { - Ok(ColorType::CMYK(8)) - } + PhotometricInterpretation::CMYK => { + match self.bits_per_sample[..] { + [c, m, y, k] if [c, c, c] == [m, y, k] => Ok(ColorType::CMYK(c)), + _ => Err(TiffError::UnsupportedError( + TiffUnsupportedError::InterpretationWithBits( + self.photometric_interpretation, + self.bits_per_sample.clone(), + ), + )), + } + }, PhotometricInterpretation::BlackIsZero | PhotometricInterpretation::WhiteIsZero if self.bits_per_sample.len() == 1 => { @@ -612,17 +621,20 @@ impl Decoder { bytes } (ColorType::RGBA(16), DecodingBuffer::U16(ref mut buffer)) - | (ColorType::RGB(16), DecodingBuffer::U16(ref mut buffer)) => { + | (ColorType::RGB(16), DecodingBuffer::U16(ref mut buffer)) + | (ColorType::CMYK(16), DecodingBuffer::U16(ref mut buffer)) => { reader.read_u16_into(&mut buffer[..bytes / 2])?; bytes / 2 } (ColorType::RGBA(32), DecodingBuffer::U32(ref mut buffer)) - | (ColorType::RGB(32), DecodingBuffer::U32(ref mut buffer)) => { + | (ColorType::RGB(32), DecodingBuffer::U32(ref mut buffer)) + | (ColorType::CMYK(32), DecodingBuffer::U32(ref mut buffer)) => { reader.read_u32_into(&mut buffer[..bytes / 4])?; bytes / 4 } (ColorType::RGBA(64), DecodingBuffer::U64(ref mut buffer)) - | (ColorType::RGB(64), DecodingBuffer::U64(ref mut buffer)) => { + | (ColorType::RGB(64), DecodingBuffer::U64(ref mut buffer)) + | (ColorType::CMYK(64), DecodingBuffer::U64(ref mut buffer)) => { reader.read_u64_into(&mut buffer[..bytes / 8])?; bytes / 8 } diff --git a/tests/decode_images.rs b/tests/decode_images.rs index bd09607..9fc8676 100644 --- a/tests/decode_images.rs +++ b/tests/decode_images.rs @@ -52,6 +52,11 @@ fn test_cmyk_u8() { test_image_sum_u8("cmyk-3c-8b.tiff", ColorType::CMYK(8), 8522658); } +#[test] +fn test_cmyk_u16() { + test_image_sum_u16("cmyk-3c-16b.tiff", ColorType::CMYK(16), 2181426827); +} + #[test] fn test_gray_u8() { test_image_sum_u8("minisblack-1c-8b.tiff", ColorType::Gray(8), 2840893); diff --git a/tests/images/cmyk-3c-16b.tiff b/tests/images/cmyk-3c-16b.tiff new file mode 100644 index 0000000000000000000000000000000000000000..3b79eae074a4e91cc31e544c30081ba9c67d13ab GIT binary patch literal 189934 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%0Dr@L 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

|01(Jf4HqEWBMchJ7zA z6wOj#$3qKAGsJgdW2X&gIY6B|k9`YF1MdAT86xsN_IZ(cIoS8ukHul)oKd&tMpriM z&7$~m>oXtZ>uKUu!*0lvGTq9fP*y4`tKmbtWixA+eH^@gszkF6*3S{?QW6&ke2#7` z(FM-A`t8Z`#d8Opg5ozhA)B$?8u<%2chy)jw#ypPfHiGOwK?XqFiO<2#5sx8?Zjdm z#2s-hIhJ^Ct!_iddEk-DkI2a*#mF9}tk?cFA(~h|LJez#w_d<6y`a2xykqeg%1(+A4X9{BjRH|h9H&>; z-T~hTd9C$94%Joj0ayozU{UTp@O$HfL)CZ6pj{uM#y>T~`?4~nkg{Q?8{^$KkP+ow zv`**$H+o7t9B0oR@xBo|pR!-}67)Fg$sG)c3+(mZlLl0FS=WJG5(Qh{a)Zy z;qKomF+A=m zE*9RFf%jnFmbvea@K%f*B7||@(ToS@Tmf!xdK2Sz-5$6>ANpQ&-)7*3-7rrQ`Z3sj zAgu${pa_suu-XVm*T zS1+iNk0Ix;P4J*TQ=D|b3v>TeZuSkp^^j_Af*+;<=eXaZoIx??RsqfNqv7EI6$?xt zokRaw|5VaCl+XLFa&HGs_PfEo3)GmB!A<1BK3?Z|)&pnulNY!cF;A0c4c8MqN8{PX z#gFncH(4&?J7*`{Y)BXJT)KxXj{>NTmksYh^!w)K!}AR^)~T5%2ei@gCT}>NBiXU? z=41V|j@x;;f$ImIt$2%3Pv?F|z!)^lB~u^){qMMb67t6Q*>=i;TIg?OJuauzGH4JM50Ir^(8HR1x+~l%?wb z(YIwd-^Bd8>eZ_By12kyaeRZV*xW8Dok_&_cPpN$0q5&M7?LqXc?XK*Otw9r({Y z;}Hc~a^!-$0%-Q$F8h8q#Me7>b$vjk_RAWmLT|tCTW@d*!41JB(*2OQn?mX8(l*XRY1U*S0;PtTa^7@sY}us{Yl_PH#g z(%~Xdvg}+{DfY!uLak0l|8K>wDqXOTq~cRm`K-vF(pd@)-h$r~IGX((RF0-I?58N= z3VQC;k{dv+?JB9Fl98~#1acprG1kT9;K{9s@-(@U6a^|1pi0_~b=~yX&+!KIhszW@ z-F9fY$IlBo=%3}4!5)nAV;@y^;&)F}$y+!SVCS`dyj-@}pH#p-&LrSLe#k>EPT*2N zKp_u7_k`;4Tn4^c1sn22q1@$9&vO&~E{1;Lss`l^pXTBLz2Xk0_aV+3m?zug4d)={weU*f+yF{Lq31F~zY`u5E=iQF?7wmifX_Pa z-P{-O9Jf~vcMPbVt2TEh`f<2*^R%Fy$GM+p6#au-K9Pbj?sFFx(hpEG2Yc@Kpn~=T z-2K=mt^G$55%-N+?cyfRBk3*o^VR_8TP;76q(Hxz*YLWc-(8a^UOtq|O+|QIKs!ur zc?vL;;6)AO-&ss*s$#qVo$6^Jud_fu;?e^5=9 z=}WQNaq6FSz{TkPmSHbE_wWyO@(=8dvRE^2gy;Ddk1QtQd83i>zk4u`Wo1oIQZn>2 zzMuvC2%cIuHDNHdiG1@TDDhn|;N@a`oK zngd21`n&(|%pzlyjiyQMT<9R91EwPHj9S!C^46^kShx6f4vT!%L<2r0jRgYZ*c zWvies(-MjUKudf=(!Sh8cH{LVsR8qTBeP_LV|;BZiRAkjk5=z|6cInkJUbtB4mfk^ zmY@ANaLVc0FH3%5tdD=4Q5p1Bl&eeK1~|+qkz*jsi}^H<`D6iCPgwIr690#x_bH>~ z9&qknRcX~>Jl|V&yShOHR$J{^%Ly7$VNr7oyw+~L4Co-hOM5Kz(3-=uNSbs;t+)Ah)xBGR}Hpr3Sf4wn?@&mdavB~W+Y zM$X2K(3}7#QVGT@@o6EMf_8iOanl&{)O zawGvyo;iNwQU_geW+4&x8?w%t+^p!=??K1ShO)7P7*93I!}k89F7&H*dBxoaI%>1P z{a`Eb&n%Dh9{b*J=E$`l<$0s4q^B7F@y8%89+WeUq)Bn0nmP>JKA_j$z2o*k|06n` zq#p3+zRo7@MbPyhm`G2+H=bA5xERo${pvl}35@gRg9dj4==^&%?sm-Et^0@f7O1!} zt3V<6U~bAGNSqgxn6&Z^V4XUq8@RMkb}{MXoIv{vvj*tPtM&C38t{KZ`=ji$CE=wm zGx>k4e`B2z1Lf{e_+wO!Ja1~(!ZfJOocK~qIo3JX zxg1rAcxRz&H3l?oR&(tz@XC19cRCZad1iS!8+hk3w{MN5op|3+iJFY^sTJGRDBu~_ z>Z2uI;Eg-AYjqpisZ{CJ+W*l3>ejE=A2pZy4mei{eti5+@MWI*tRMTE>7@pPwoj?9 z`GXoQ?_c2>{Kx0xfB(^(ae^vPeGA9p1fErXDsTF~rmh02s_c6!3I*>5>qIu@D16K(QDx=uk?L5CwHak?wfiL8_?O?O3B?fr|M5t}|=>f3jTP+b8$g z_w4WNd(M6L)$GOn^O}K8hwM!L^3?hApObz}#v$;UR1}_NM#)>K6jWCXuEC+tC z!F(x2 z%p6kDcp`2(MY#ezcFLGC6=+#}m+A%{@h^0s7b_uBK5NS`8;coOVniE(EHBNaYmPx& zRN}^nQ~~dvFQp~}xu;!d*6`Z!G70E^ zY(LEo`Darn(H=v;=8P(;2V|?1VM;UVFH9XnTZ(e*)aTT5kmC>^H2`(9Uejj-i;h(> z0%3>2ltuIaU_gQ+JsCLRP(OV-Fk$}-8XN6u@3E%^0WU>epl?O{is;$&B-mj}^i{eT z>AvAf#$~|s8%G;kBRzO?5dACAYh%#w{MCOvq#44FCj&Oo?x9>#a3bvj@YK3z)NbHE zn|o;OXjinYn(hsK=R^)06X(!EFACK7g+be(W9@k9~cjoWG1f@y}@jjP9rM&_wXu z{tt(q&1plld_VJ6Wi3wI@7(Usu7))QQbF}aXvJRNx~3G18$X(D1i4IMA!VZfOLs$L z!{zX!dn(=hO5AVXdD2;W34C{JxLflIcw>AE$eNVz5IDS zB=F1YhPaMG#5n?1dFMy?w=sWm7xAsx>ug1bGxEFm&txU8SmlH#We&hBUV?nH3&tb% zlIyx-w^_WWb05<41SOsNKu=MVJj5BZU-U@cg8D{$H3h=~@jKU3LhOeO2v$hFkS=NO z5GFw$-}Hpf1|Qb2A4~pO4*p>#a)@8CpfIQM)}mfq%Wi%a%D-bR=YK=`58fGm4bmUB z-(kB#kKnfD?0%rI?E&8({noP!ga?6nyvwXml$$Ogi=Ln#I*%#(8||xe-|))OUje6& zI~M#!;~I;qt?)ER!v={X>`;3tLd-Tnlo0)+q7%4k$Ngew#Cf-~duk_w-|jaX@SdQ& zLb8}M3cOp{EVzAi1J>1Mn?B-qR7)zD{fsnRPo>PNpDyd+SD#M$k%Hh44>A`~uLD0E zn?@P|IvlMvdIo>ANLDvmHx(;tT8uvNy{qmcmHOAfkK1A&>Tg8;K;jL3ca%>}C^Z-} zk>Ek0VcP^;p`2MH;y&zZK|Z-#8Ikg-R0?s7z|nfnOKS zr^-;zsK}R`hI)E=cPQP!puA%={&-mM#7^pG$7s|ONSCL5puPbrANHWS z0CV^KNt=TFLs_qBH0bj^okk_%u7Z^6-@KNP8ABt^Pux;vR3cttr5vKOfRv+yjLj&2 zIL?x`9d_}L$fOeI(g7jMs5y|g>^Mt}0M>1{r`eZa*umJ1az4Au>0!Wz z?FPmfu**$PZ+h?)#Ip_+lsMQ;$9g7(1spIoC&dDXjg?8ED0gOg3PlK1aida6s88~> zp%L-3u6GD+G};gIP^J^lV@`4NqKS~6;pa)qL3&6~9bFCS>T65s>rp?~cMfen(%S-q z8C4jsQ%IgkIb`oG?ItAThllht)S%D8?O|lXj+#5(k)gH9{Ad&0XRwz%JM?%pcx88N zsYVjm{cYmC{yMCJ?<(KBRG^oE-5=e{FscttZ|+{kD)y}8xpF1u+lTBo-rzCg53^p* zYCyDlt>OCmDnzH(hdPLT^P!&Ro=L^H59LdBsCx4<} z=3Y)7u(7SHdE!ChIgg(9*aP6R<}~)XePI8l#r&(=!RD>=1WPyKKDuTGPdy0hdb5>C z3fY2rNUpU5*5d8!EQQ>M^A&_2rNWgM_?f0G6L_u`WK%) zC-BR_(GJ9m4 zU8&Ak{W$sxGbivLU(pe_5?(4El&?g(jj%@=iE?4QF!@iUFPD%M9%yG@_tVZ>(W2;fnGsflQKu`#L_)Rh$bn~YX@sQwQ&8+>+~ zohy6`9y8_9nH#`k?*yL<_3g0^3Pw0e;O|CWiu{cY<^$haaMc>~fu+Q+0eNTF~LAH#m-V<30o=H1byqtKBT{+F8m z*sy0jPV`Rnk_bN1Jdr?-02bxdlO2H`g&!#`z$FFV)E@ZV)03m9(ZIVWFOzG4-nsD< z;`=GZd4JO$qFjE?H%ib%+?i$YC|<}HW=x@62U;b&Q~c2X%#e7J75a4u-byJ%dHHcS zdI`$!N)nTwqTHu=RVuOnsG0Z=^#b^FN3t_*A>@+%A858fnX-+MHf z2b5W#CKK=Xc6aL~&xU-_?gN>K({kNlm8webPN9r@Y*mW-9K$N8lS+CQ+sKLtqPA3jnmTq?wa*!B1?Fg#7)(aJ za?M)(fN5YNt+j^pfgL)fq%O2;rf+5R0+?(NXP5x@ILiMVjB?Ep zP5*$u9x)3pmHHyyXz}Flc0&|hJA*$0|B=;3@R!4%9$(QENgx|lyGz3yv2R}8Aejt* z(y4tbd5CrXSnV$9Y4}k^-ByVq;)TEJZb(hwcRw1dE2z`l83WIypIxry=Fw?}n_`r&-K&7f<&C#>IX+M9{?Pu(!eNx?f$~y%r;01? zx1|xXt*GDA5!h)7w37>Eo!;O(g-CJ<<1!UYml5$@g7};4HS*U!%DpYz37+eEB^_A} z?-5@TJ`6i`D6EnKZ}1f06ZqM7amxJxQ{np zFctlT@KuB>&~A=^FDOPodcq;0AI8xk_{Lp>>yjaMZ5hOMievvF`iAv%47*cx}a9?rGqIoOJ@6gN|BAofKYShU-5@VO(Jj9v#zadJpNN=e)Ea z-pfLvBt*?ZdWlX+WDlGfFf#>u~-U%aw<(+9gs z%zwus35D37`5a3pCAiHK8f9~ByI2ihjAHtd-UzKcDo zFM>QaEyExg$WESVGy&-@34?}2oLG`^nM9o9O0&O^=fjVr$BQZLz}Y8MY1Kg8f*+K- z$fsoLP>A>=>i9;I1LU>YZzzVye{rInstQ?>O{LT!|7Y3{N+smwX}hUn$my~Bsp;r% ztm`>a6?mt@Erh~AdSF61jo5$uoD@Q3qMfosQ|YI{Z)Xm1=sKwHf3TIB1AH2MghAYQ zFL!HaB%vJ>*SS=Jr{0*YGBi}jibXnT_ze8TvY1F&1N#jxY1Sv+YbRNB!ysZ7W{_T| zfgbSA!iFVg^RN=m9Hq;gk2`^BhqQ_{;E~hxHHi1a=+D}xF-sFOVP5WngoWTAjTDWO z3!u*;#lq#N_s_zOiyVPJ=ErLU1NY2PEEt#z9-Wn=F=GxQ^V#N$W<&ly-)!+5$jcTC zEV>JxBx&r|IW-&nJA0)z3;IscO4RQH?_JcR7{y>b!4{vXi=n@l`CG~p$gfFfsXCBt z>7mqklz*l>WMm8dLp7Ee>OjvodS2RyLzG%m7CJJ*cA`F-ny$p4SvaMP3zDCub$<+ z?!FA%$Gz9}4E`%-@;kr4fA6u*cHD%&X_xEB*BgOnQMB>4&*Wjb7R#ycfuVyAlra0rArhS4a3;m2~t>o1J z@jkfU=L=Wa#o|-Yf30Y*gzE{Ok$H>WVEntJCX%Ot*yT`kO9Vg{VY)a4cG@Oji6c>N zs=QDpM?Y*%C-*$;{86mh!~lQMdt+r|Vee9fpJ)=~S+aD=z-rtlN_Pl}@6S7l6GdXQ zzhAsv_#Sv$k|X{L?U`_W1^Z#=xx96PVdy)7GfB7%aouFmQ$Znk*<0c-O@>|5g^|)V z81EFmw)k(LQ|mUt5zMQK%87j9xs>vY34#g6IDg4o%O-xkxqF@9^gN`GP*(@$qufvJ zF+PSis7LLKiu67+A90h;5k2hl&D9Hdhx87;jMzl12am2K+RR|VfFEOMZi!S7F=ct%s2i1;Vt3FRmFL6Y{9q7J@L%{Cxi zMf%UQ3Zren*t86zqm!_skQimC0X&|eMk1bbR5|{R9Hj~iAKywohk8m`9i%yE*X)=! zH5~1oIUYi#f^Rem@@X5;uROnu_5t#fTx05c1j^Qy;ON;*I{_y8TUhG#TZMU5yr^zn{({qdH6lKa4Oac1^LFTiK(4Q2X?z@jAr z!<{n`k1ggbc?zBpFIc&F1iX+i=fwO-prb~?JmPnBytMT+3Et`@C+o(b9Cla91W#>q z%`sgJKAF2}iJjkcMD#(EmYSj;%MDZPv(WF3wRi3BL;mbvZpDW@&nM4p59GPdA5C6? zx2zlmj6%p)R@l;KLcX_b9F+>a`iw;ei@<-g^?DW)->Y%bHd!YiqW+~7|(@$$5 z`rTk~L)Qwj$0D{?6>!|bLz)KAbA#UFMZ|lpG)+wP)}VbS-$zvVyGmoUCHy)q3* z2w1iLZYA+Pi3IM22HpY8v%cBvTJT=!YX`aJX+-%yrrtYp8RvEns-FKmkKIx6uAWbc zn7_@D{NgBLKP8smxD!@tb>TeP4!&XiDeBmO+0|aa-w40+YEKam@x{V=k|+m!cD^n~ za0WcaX;l*taZgsuXyH}(S$>m}Aj}K1xHd`P55Fz0UL{-)Sza9^jP^hrQYVqA0h?=6 zM2Vij`s1QKKtZ#zDA5~y+XQ|<{-p+cX)$D*_OBi1A;+?BbcLb)y}VOhQ_x>Gr%aLT zhgF#y(LsVf4}}YRy3x*S!Nu-m@Ju1=&n{wrE32_aVF`b$INhgM0soATTqQJQAnw>c zo?B*&SsCEcv<0|y@upIe8SFIg%aH+~p1-u_7W_KsqP08-etMuM_F7{gc#1{odYPZNCv4st_9dtI^mva`=zc2Co5og$|8)|?LMI90%ZnG4;6llW^ z{h~hv)xh^$9$yXl3QiL*80}7GIr8tLy-m!GtT6Qd2G4;opx=z9yKGNq@GEl$R|Z*& z%@Gji3ul?Sd=tdk%b3N2K_IiKpPvH$n%_8Inr;F+q?$B20H?cZBvivr?=4RrF}4`D z2s@0^UV+uj#!KhYV6PU(9lJhnt44hAz$JP4lj*4GT4@?P1?#k19o8cygMzvlF}^zR zm%rv<{q!HT^+W^ahrvAVUtZuj`aI|6OdsOBF{-GH-U(irk#~mf1Rh{!*-;t5rerhf z5O7|80(lWob|Qpa1U{Q_{0C|BB+TTL5Thu_g~z^(d}tXwn6G);QiDZ zI`Mprb!Y%B54>m`c!92ia;H4os7|xsF$Q(I5#X=5`MY(rU^kJ)5Gi0P;x@;1WVt%N z5p7>%SO6YiPzrU&qx@6afKC9)lWY&^Z$`d{-yOy$wD%#j*zN`TYlu;IU5@@H#*Fo} zn+$%8eB`|edS+D?E2APR6was2KdX_?UKbK;PaIa z%ngAT9Il%;0?i%QTLb|YIu%$9pxtQCJSzd@u|5KGV!tnb)dBN!&_BUH)RNdwhzi(b zkqf26FzjlyC*6UB>nYmV z=MX&_e7sradQJ&?Z2E@zn?6=~odENEn%dZ4ZSa8U9Ex9d1XjnDwcFIQaFx%t6p5R_ z*3Zv$W?hEg^m|K)_mj+#7x3y2BD&`dvnqDsDzxn4-`E7KxyUhC1M5}3WDfaY{#QjZ zAHiQIT~TlCg)~i3y{s{oQ;Ysi*PmotLN=)N;Ew}VG}!SLqx_=kzqn7l5Z_cT z5H1J0*OUtmAYZ%5MqCRtslOvGhTcx?S7n~SJuM2kI?7#PId%R({(eq$r?xNFefGl6 z-Tv@0Ze@or`n$+&>e`BOBdjgm{TTl>=BV!L@T-J|fUcbuxQZ9o$p=l*{;`7+Wd^)3 zY`jW)q)n`>566A6BJ>8*eP zKI!Z|&|R_x(S%su`2ulqyWm5IBlw>uER-@=K@Xm$&>4DuX0-|ZQGOb~T5ucVzr^PY zn_RGK!5t&$cE)ZjOTvv<32$l5;{5PHJNbfhufT8oWeW~e=38sxISCQ#G`jJrh~tvlodqmgtee$41l6#M)42q}eAp=~BaDBR z2K!qW#;L*{9d;%=XIK+)m5TOMsvPrgALXn?`(&Ktn9j2g0*~Fawq3?RT(QS?s>xxD zV}M?+kJ)OFToaz)4*S-X?81C=!F$z=v3{nG^G`hjJK0ShsZm)OJ_dIPXVn-!;FF7a z=ElUn*Tl>y>OtV8Y#F6@Jp8YSOCjPl_Q_L}YT&k9e+nD^awIvz=sf)7bXo&xWE^%f zjt5XhsF$9mOHG8nt5W%tSoF_I8Du1*eVyF5j61-h6Eub~Fzcj%;eh<+LM4U(^|u!8 zr@a8u^B>aZ0{xG38GoYxzxQS^%F)lLuwRtXki)jmrKzExr(2jb1@xHeKAu9{r_Ef! zBh{c>+`3t`BhYi_-f;|qk56x%K(j=;;kqPxC$KxHlJ;yGo;&f$A#VjbE!8osMtzRg zPYS_PEm3#qbkx5cagNSHef6CVzn?pi@2^~j`KBR#|CQH#kxYinX-Se4Vcx4SU8KZwXlCuc zvK7D=Z65MGKd?W0iDI=6qHAWQOc}f~xhb);#ud+_RL|@%U5@*+vg2|M#BWXKgdLUe zS7F{aX)gTLY*(Bx1US6Rv!THpr*Cs6L=oR}JnWy9tLg}EG8_rJ7h8nua4+cIN?et> zWvL@B;B~`-vm@Zmp{;M5b;;Pp5x?o&5Qu#N1+7PY1H4T7usZ?rfHa|tc%I`6XSyU6 z`WlF|rNr+*>x)MuFQIpyIA5%SajHw5#EUWh!B!E6k8!>#=&y^(#8oqyv4>HBs9klm zV|g@jJqH4~Xh*)OyYN2786aLNRYv)btzVd`u#-_+Gxs3utI4^_Blh10nLd0r(knQ> z1Szo3^7cKv-Ozu13zy5ncvWe$Xt~8xx7UFv4H>+?6dquZQ-!RX;f5Xgvy#9L6G}>aqlxEp*=ZYK zf7!&%)jjs9kpDS<#JEibZz#>$WBeHWa_CqnV+ejsFY=)g=a_TOJ*E^R{lO_UI>BpJ zrxsI*{rAsDUKkxxgP$DwMK%I2+&Jz-6(K)1VFKkLu;`Eu^)>33Cxp^2p}u{33auab z_Gk~S133ApoTi6E$I&q$%bug8-9^()FV}MNDSMCpdM9e{;=a!@Wj*&=F51%8Nrv99-fJlyfyB&4Rc@*KS!%T@Y_B=CCfdy zPgLR)|kejyqjZyu@rd2A)YP-uQ}Q!(mR1lwhc5n(gl_qX_vuo z(I&;@tEiViyK2~o_BN4c8H~dEwt+0yj|Kl+Babt1!94DxSds3a|I5bn$%T+zEZ>uF zp&hzeD20mjER*dd88E^^-AD)dx6B_Jg#c~MmXJfxZlu*4(irsPZDC1Xk8)$pRcIy1 zpK7s)77jg>ZJVg|gx;37sBFk`tLfB8lrOT6H6ngb*L-P~_G8rByW+e~IP64mzh;W4 zSdYBX41Qvg9$Tb{MlII6R{4Hdqg~FLw-d9n#kgH*3%syKv-M{n?%%46Sr6f7F_(0B zL-3cb5-pA^FzC!-jsx(1*)!fA%;S)%IU-^o|LtX&aH=!>x>8GU9Q>qTVlqn+~87TZH z3b#Ujc7kA>1$Z?*SrP<4oxaOKw2cb3xBtK~g#2`pYpS*l2lKCN(I%wZ&8S$WYpaB~ zq{MB-`fvL1BhNfEA}M`z2<2wO0Ys;=Ok*PFrH!tgHQ zy+0|kRUJoQk3>PFoVptPC7?;x`eXJA{RI19&nQW{=mT(V`*_h3l+P~uT@7{h*P!IjjH9B%bfma*MSSc%! z-ZaFTg7GzlSkd%M7YvzeW?G3EY14m{BM^>J0vm{_k@> zJ}cq#SYX+6rBP%4ODD>y{P$TIpC|rL`n1twf44Ip>FWQJKJ&lNL|e1|`%JVy`@i!2 z&y+?j_@D9y_zY6TztN-YMl1jR`~W&E#b=PrsA_z6|DW Date: Fri, 20 Dec 2019 17:00:14 +0000 Subject: [PATCH 13/17] Remove most unchecked size/index casts Convert most unchecked size/index `as` casts to checked casts with `TryFrom`, included another top-level error variant. This has several motivations: - Making the library as robust as possible, including to platform differences. - Unchecked casts are susceptible to breakage during refactorings. - Preparing for BigTIFF support, which will require the introduction of generics and associated types for some parts of the de/encoders. Unchecked primitive casts cannot be bound, while TryFrom can, and overflowing conversions become more likely. - Remaining u16 casts may be prone in failure in existing practice and not just in theory during future changes. --- src/decoder/ifd.rs | 11 ++++--- src/decoder/mod.rs | 53 +++++++++++++++++----------------- src/encoder/mod.rs | 65 ++++++++++++++++++++++-------------------- src/error.rs | 12 ++++++++ tests/encode_images.rs | 40 +++++++++++++------------- 5 files changed, 100 insertions(+), 81 deletions(-) diff --git a/src/decoder/ifd.rs b/src/decoder/ifd.rs index 73b6e97..58965d1 100644 --- a/src/decoder/ifd.rs +++ b/src/decoder/ifd.rs @@ -1,6 +1,7 @@ //! Function for reading TIFF tags use std::collections::HashMap; +use std::convert::TryFrom; use std::io::{self, Read, Seek}; use std::mem; @@ -193,11 +194,12 @@ impl Entry { )) }), (Type::ASCII, n) => { - if n as usize > limits.decoding_buffer_size { + let n = usize::try_from(n)?; + if n > limits.decoding_buffer_size { return Err(TiffError::LimitsExceeded); } decoder.goto_offset(self.r(bo).read_u32()?)?; - let string = decoder.read_string(n as usize)?; + let string = decoder.read_string(n)?; Ok(Ascii(string)) } _ => Err(TiffError::UnsupportedError( @@ -212,11 +214,12 @@ impl Entry { R: Read + Seek, F: Fn(&mut super::Decoder) -> TiffResult, { - if value_count as usize > limits.decoding_buffer_size / mem::size_of::() { + let value_count = usize::try_from(value_count)?; + if value_count > limits.decoding_buffer_size / mem::size_of::() { return Err(TiffError::LimitsExceeded); } - let mut v = Vec::with_capacity(value_count as usize); + let mut v = Vec::with_capacity(value_count); decoder.goto_offset(self.r(bo).read_u32()?)?; for _ in 0..value_count { v.push(decode_fn(decoder)?) diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index 30ee3f1..9d06c31 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -197,12 +197,12 @@ impl Wrapping for u64 { } } -fn rev_hpredict_nsamp(image: &mut [T], size: (u32, u32), samples: usize) +fn rev_hpredict_nsamp(image: &mut [T], size: (u32, u32), samples: usize) -> TiffResult<()> where T: Copy + Wrapping, { - let width = size.0 as usize; - let height = size.1 as usize; + let width = usize::try_from(size.0)?; + let height = usize::try_from(size.1)?; for row in 0..height { for col in samples..width * samples { let prev_pixel = image[(row * width * samples + col - samples)]; @@ -210,6 +210,7 @@ where *pixel = pixel.wrapping_add(prev_pixel); } } + Ok(()) } fn rev_hpredict(image: DecodingBuffer, size: (u32, u32), color_type: ColorType) -> TiffResult<()> { @@ -226,16 +227,16 @@ fn rev_hpredict(image: DecodingBuffer, size: (u32, u32), color_type: ColorType) }; match image { DecodingBuffer::U8(buf) => { - rev_hpredict_nsamp(buf, size, samples); + rev_hpredict_nsamp(buf, size, samples)?; } DecodingBuffer::U16(buf) => { - rev_hpredict_nsamp(buf, size, samples); + rev_hpredict_nsamp(buf, size, samples)?; } DecodingBuffer::U32(buf) => { - rev_hpredict_nsamp(buf, size, samples); + rev_hpredict_nsamp(buf, size, samples)?; } DecodingBuffer::U64(buf) => { - rev_hpredict_nsamp(buf, size, samples); + rev_hpredict_nsamp(buf, size, samples)?; } } Ok(()) @@ -575,14 +576,14 @@ impl Decoder { CompressionMethod::None => { let order = self.reader.byte_order; ( - length as usize, + usize::try_from(length)?, Box::new(SmartReader::wrap(&mut self.reader, order)), ) } CompressionMethod::LZW => { let (bytes, reader) = LZWReader::new( &mut self.reader, - length as usize, + usize::try_from(length)?, max_uncompressed_length )?; (bytes, Box::new(reader)) @@ -592,7 +593,7 @@ impl Decoder { let (bytes, reader) = PackBitsReader::new( &mut self.reader, order, - length as usize + usize::try_from(length)?, )?; (bytes, Box::new(reader)) } @@ -732,18 +733,18 @@ impl Decoder { TiffFormatError::InconsistentSizesEncountered, ))?; - let rows_per_strip = self + let rows_per_strip = usize::try_from(self .get_tag_u32(Tag::RowsPerStrip) - .unwrap_or(self.height) as usize; + .unwrap_or(self.height))?; let strip_height = cmp::min( rows_per_strip, - self.height as usize - index * rows_per_strip, + usize::try_from(self.height)? - index * rows_per_strip, ); - let buffer_size = self.width as usize * strip_height * self.bits_per_sample.len(); + let buffer_size = usize::try_from(self.width)? * strip_height * self.bits_per_sample.len(); - if buffer.len() < buffer_size || byte_count as usize / buffer.byte_len() > buffer_size { + if buffer.len() < buffer_size || usize::try_from(byte_count)? / buffer.byte_len() > buffer_size { return Err(TiffError::FormatError( TiffFormatError::InconsistentSizesEncountered, )); @@ -753,7 +754,7 @@ impl Decoder { self.strip_decoder.as_mut().unwrap().strip_index += 1; - if index as u32 == self.strip_count()? { + if u32::try_from(index)? == self.strip_count()? { self.strip_decoder = None; } @@ -768,7 +769,7 @@ impl Decoder { Some(Predictor::Horizontal) => { rev_hpredict( buffer.copy(), - (self.width, strip_height as u32), + (self.width, u32::try_from(strip_height)?), self.colortype()?, )?; } @@ -784,7 +785,7 @@ impl Decoder { } fn result_buffer(&self, height: usize) -> TiffResult { - let buffer_size = self.width as usize * height * self.bits_per_sample.len(); + let buffer_size = usize::try_from(self.width)? * height * self.bits_per_sample.len(); match self.bits_per_sample.iter().cloned().max().unwrap_or(8) { n if n <= 8 => DecodingResult::new_u8(buffer_size, &self.limits), @@ -804,13 +805,13 @@ impl Decoder { self.initialize_strip_decoder()?; let index = self.strip_decoder.as_ref().unwrap().strip_index; - let rows_per_strip = self + let rows_per_strip = usize::try_from(self .get_tag_u32(Tag::RowsPerStrip) - .unwrap_or(self.height) as usize; + .unwrap_or(self.height))?; let strip_height = cmp::min( rows_per_strip, - self.height as usize - index * rows_per_strip, + usize::try_from(self.height)? - index * rows_per_strip, ); let mut result = self.result_buffer(strip_height)?; @@ -823,16 +824,16 @@ impl Decoder { /// Decodes the entire image and return it as a Vector pub fn read_image(&mut self) -> TiffResult { self.initialize_strip_decoder()?; - let rows_per_strip = self + let rows_per_strip = usize::try_from(self .get_tag_u32(Tag::RowsPerStrip) - .unwrap_or(self.height) as usize; + .unwrap_or(self.height))?; let samples_per_strip = - self.width as usize * rows_per_strip * self.bits_per_sample.len(); + usize::try_from(self.width)? * rows_per_strip * self.bits_per_sample.len(); - let mut result = self.result_buffer(self.height as usize)?; + let mut result = self.result_buffer(usize::try_from(self.height)?)?; - for i in 0..self.strip_count()? as usize { + for i in 0..usize::try_from(self.strip_count()?)? { self.read_strip_to_buffer(result.as_buffer(samples_per_strip * i))?; } diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs index 27e3a37..e3d7e0d 100644 --- a/src/encoder/mod.rs +++ b/src/encoder/mod.rs @@ -1,5 +1,6 @@ use byteorder::NativeEndian; use std::collections::BTreeMap; +use std::convert::TryFrom; use std::io::{Seek, Write}; use std::mem; @@ -406,7 +407,7 @@ impl TiffEncoder { where [C::Inner]: TiffValue, { - let num_pix = (width as usize).checked_mul(height as usize) + let num_pix = usize::try_from(width)?.checked_mul(usize::try_from(height)?) .ok_or_else(|| ::std::io::Error::new( ::std::io::ErrorKind::InvalidInput, "Image width * height exceeds usize"))?; @@ -421,7 +422,7 @@ impl TiffEncoder { let mut idx = 0; while image.next_strip_sample_count() > 0 { - let sample_count = image.next_strip_sample_count() as usize; + let sample_count = usize::try_from(image.next_strip_sample_count())?; image.write_strip(&data[idx..idx + sample_count])?; idx += sample_count; } @@ -444,7 +445,7 @@ pub struct DirectoryEncoder<'a, W: 'a + Write + Seek> { impl<'a, W: 'a + Write + Seek> DirectoryEncoder<'a, W> { fn new(writer: &'a mut TiffWriter) -> TiffResult> { // the previous word is the IFD offset position - let ifd_pointer_pos = writer.offset() - mem::size_of::() as u64; + let ifd_pointer_pos = writer.offset() - u64::try_from(mem::size_of::())?; writer.pad_word_boundary()?; Ok(DirectoryEncoder { writer, @@ -455,16 +456,18 @@ impl<'a, W: 'a + Write + Seek> DirectoryEncoder<'a, W> { } /// Write a single ifd tag. - pub fn write_tag(&mut self, tag: Tag, value: T) { + pub fn write_tag(&mut self, tag: Tag, value: T) -> TiffResult<()> { let len = ::BYTE_LEN * value.count(); - let mut bytes = Vec::with_capacity(len as usize); + let mut bytes = Vec::with_capacity(usize::try_from(len)?); { let mut writer = TiffWriter::new(&mut bytes); - value.write(&mut writer).unwrap(); + value.write(&mut writer)?; } self.ifd .insert(tag.to_u16(), (::FIELD_TYPE.to_u16(), value.count(), bytes)); + + Ok(()) } fn write_directory(&mut self) -> TiffResult { @@ -475,7 +478,7 @@ impl<'a, W: 'a + Write + Seek> DirectoryEncoder<'a, W> { self.writer.write_bytes(bytes)?; *bytes = vec![0, 0, 0, 0]; let mut writer = TiffWriter::new(bytes as &mut [u8]); - writer.write_u32(offset as u32)?; + writer.write_u32(u32::try_from(offset)?)?; } else { while bytes.len() < 4 { bytes.push(0); @@ -485,7 +488,7 @@ impl<'a, W: 'a + Write + Seek> DirectoryEncoder<'a, W> { let offset = self.writer.offset(); - self.writer.write_u16(self.ifd.len() as u16)?; + self.writer.write_u16(u16::try_from(self.ifd.len())?)?; for (tag, &(ref field_type, ref count, ref offset)) in self.ifd.iter() { self.writer.write_u16(*tag)?; self.writer.write_u16(*field_type)?; @@ -510,7 +513,7 @@ impl<'a, W: 'a + Write + Seek> DirectoryEncoder<'a, W> { let curr_pos = self.writer.offset(); self.writer.goto_offset(self.ifd_pointer_pos)?; - self.writer.write_u32(ifd_pointer as u32)?; + self.writer.write_u32(u32::try_from(ifd_pointer)?)?; self.writer.goto_offset(curr_pos)?; self.writer.write_u32(0)?; @@ -577,7 +580,7 @@ impl<'a, W: 'a + Write + Seek, T: ColorType> ImageEncoder<'a, W, T> { width: u32, height: u32, ) -> TiffResult> { - let row_samples = u64::from(width) * ::BITS_PER_SAMPLE.len() as u64; + let row_samples = u64::from(width) * u64::try_from(::BITS_PER_SAMPLE.len())?; let row_bytes = row_samples * u64::from(::BYTE_LEN); // As per tiff spec each strip should be about 8k long @@ -585,19 +588,19 @@ impl<'a, W: 'a + Write + Seek, T: ColorType> ImageEncoder<'a, W, T> { let strip_count = (u64::from(height) + rows_per_strip - 1) / rows_per_strip; - encoder.write_tag(Tag::ImageWidth, width); - encoder.write_tag(Tag::ImageLength, height); - encoder.write_tag(Tag::Compression, tags::CompressionMethod::None.to_u16()); + encoder.write_tag(Tag::ImageWidth, width)?; + encoder.write_tag(Tag::ImageLength, height)?; + encoder.write_tag(Tag::Compression, tags::CompressionMethod::None.to_u16())?; - encoder.write_tag(Tag::BitsPerSample, ::BITS_PER_SAMPLE); - encoder.write_tag(Tag::PhotometricInterpretation, ::TIFF_VALUE.to_u16()); + encoder.write_tag(Tag::BitsPerSample, ::BITS_PER_SAMPLE)?; + encoder.write_tag(Tag::PhotometricInterpretation, ::TIFF_VALUE.to_u16())?; - encoder.write_tag(Tag::RowsPerStrip, rows_per_strip as u32); + encoder.write_tag(Tag::RowsPerStrip, u32::try_from(rows_per_strip)?)?; - encoder.write_tag(Tag::SamplesPerPixel, ::BITS_PER_SAMPLE.len() as u16); - encoder.write_tag(Tag::XResolution, Rational { n: 1, d: 1 }); - encoder.write_tag(Tag::YResolution, Rational { n: 1, d: 1 }); - encoder.write_tag(Tag::ResolutionUnit, ResolutionUnit::None.to_u16()); + encoder.write_tag(Tag::SamplesPerPixel, u16::try_from(::BITS_PER_SAMPLE.len())?)?; + encoder.write_tag(Tag::XResolution, Rational { n: 1, d: 1 })?; + encoder.write_tag(Tag::YResolution, Rational { n: 1, d: 1 })?; + encoder.write_tag(Tag::ResolutionUnit, ResolutionUnit::None.to_u16())?; Ok(ImageEncoder { encoder, @@ -635,15 +638,15 @@ impl<'a, W: 'a + Write + Seek, T: ColorType> ImageEncoder<'a, W, T> { { // TODO: Compression let samples = self.next_strip_sample_count(); - if value.len() as u64 != samples { + if u64::try_from(value.len())? != samples { return Err(::std::io::Error::new( ::std::io::ErrorKind::InvalidData, "Slice is wrong size for strip").into()); } let offset = self.encoder.write_data(value)?; - self.strip_offsets.push(offset as u32); - self.strip_byte_count.push(value.bytes() as u32); + self.strip_offsets.push(u32::try_from(offset)?); + self.strip_byte_count.push(value.bytes()); self.strip_idx += 1; Ok(()) @@ -651,31 +654,31 @@ impl<'a, W: 'a + Write + Seek, T: ColorType> ImageEncoder<'a, W, T> { /// Set image resolution pub fn resolution(&mut self, unit: ResolutionUnit, value: Rational) { - self.encoder.write_tag(Tag::ResolutionUnit, unit.to_u16()); - self.encoder.write_tag(Tag::XResolution, value.clone()); - self.encoder.write_tag(Tag::YResolution, value); + self.encoder.write_tag(Tag::ResolutionUnit, unit.to_u16()).unwrap(); + self.encoder.write_tag(Tag::XResolution, value.clone()).unwrap(); + self.encoder.write_tag(Tag::YResolution, value).unwrap(); } /// Set image resolution unit pub fn resolution_unit(&mut self, unit: ResolutionUnit) { - self.encoder.write_tag(Tag::ResolutionUnit, unit.to_u16()); + self.encoder.write_tag(Tag::ResolutionUnit, unit.to_u16()).unwrap(); } /// Set image x-resolution pub fn x_resolution(&mut self, value: Rational) { - self.encoder.write_tag(Tag::XResolution, value); + self.encoder.write_tag(Tag::XResolution, value).unwrap(); } /// Set image y-resolution pub fn y_resolution(&mut self, value: Rational) { - self.encoder.write_tag(Tag::YResolution, value); + self.encoder.write_tag(Tag::YResolution, value).unwrap(); } fn finish_internal(&mut self) -> TiffResult<()> { self.encoder - .write_tag(Tag::StripOffsets, &*self.strip_offsets); + .write_tag(Tag::StripOffsets, &*self.strip_offsets)?; self.encoder - .write_tag(Tag::StripByteCounts, &*self.strip_byte_count); + .write_tag(Tag::StripByteCounts, &*self.strip_byte_count)?; self.dropped = true; self.encoder.finish_internal() diff --git a/src/error.rs b/src/error.rs index 27ef8c3..02acbe0 100644 --- a/src/error.rs +++ b/src/error.rs @@ -22,6 +22,10 @@ pub enum TiffError { /// The Limits of the Decoder is exceeded. LimitsExceeded, + + /// An integer conversion to or from a platform size failed, either due to + /// limits of the platform size or limits of the format. + IntSizeError, } /// The image is not formatted properly. @@ -171,6 +175,7 @@ impl fmt::Display for TiffError { ), TiffError::IoError(ref e) => e.fmt(fmt), TiffError::LimitsExceeded => write!(fmt, "The Decoder limits are exceeded"), + TiffError::IntSizeError => write!(fmt, "Platform or format size limits exceeded"), } } } @@ -182,6 +187,7 @@ impl Error for TiffError { TiffError::UnsupportedError(..) => "Unsupported error", TiffError::IoError(..) => "IO error", TiffError::LimitsExceeded => "Decoder limits exceeded", + TiffError::IntSizeError => "Platform or format size limits exceeded", } } @@ -217,5 +223,11 @@ impl From for TiffError { } } +impl From for TiffError { + fn from(_err: std::num::TryFromIntError) -> TiffError { + TiffError::IntSizeError + } +} + /// Result of an image decoding/encoding process pub type TiffResult = Result; diff --git a/tests/encode_images.rs b/tests/encode_images.rs index 32b1e88..c40fac3 100644 --- a/tests/encode_images.rs +++ b/tests/encode_images.rs @@ -144,11 +144,11 @@ fn test_multiple_byte() { let mut image_encoder = tiff.new_image::(1, 1).unwrap(); let encoder = image_encoder.encoder(); - encoder.write_tag(Tag::Unknown(65000), &[1_u8][..]); - encoder.write_tag(Tag::Unknown(65001), &[1_u8, 2][..]); - encoder.write_tag(Tag::Unknown(65002), &[1_u8, 2, 3][..]); - encoder.write_tag(Tag::Unknown(65003), &[1_u8, 2, 3, 4][..]); - encoder.write_tag(Tag::Unknown(65004), &[1_u8, 2, 3, 4, 5][..]); + encoder.write_tag(Tag::Unknown(65000), &[1_u8][..]).unwrap(); + encoder.write_tag(Tag::Unknown(65001), &[1_u8, 2][..]).unwrap(); + encoder.write_tag(Tag::Unknown(65002), &[1_u8, 2, 3][..]).unwrap(); + encoder.write_tag(Tag::Unknown(65003), &[1_u8, 2, 3, 4][..]).unwrap(); + encoder.write_tag(Tag::Unknown(65004), &[1_u8, 2, 3, 4, 5][..]).unwrap(); } data.set_position(0); @@ -174,24 +174,24 @@ fn test_signed() { let encoder = image_encoder.encoder(); //Use the "reusable" tags section as per the TIFF6 spec - encoder.write_tag(Tag::Unknown(65000), -1_i8); - encoder.write_tag(Tag::Unknown(65001), &[-1_i8][..]); - encoder.write_tag(Tag::Unknown(65002), &[-1_i8, 2][..]); - encoder.write_tag(Tag::Unknown(65003), &[-1_i8, 2, -3][..]); - encoder.write_tag(Tag::Unknown(65004), &[-1_i8, 2, -3, 4][..]); - encoder.write_tag(Tag::Unknown(65005), &[-1_i8, 2, -3, 4, -5][..]); + encoder.write_tag(Tag::Unknown(65000), -1_i8).unwrap(); + encoder.write_tag(Tag::Unknown(65001), &[-1_i8][..]).unwrap(); + encoder.write_tag(Tag::Unknown(65002), &[-1_i8, 2][..]).unwrap(); + encoder.write_tag(Tag::Unknown(65003), &[-1_i8, 2, -3][..]).unwrap(); + encoder.write_tag(Tag::Unknown(65004), &[-1_i8, 2, -3, 4][..]).unwrap(); + encoder.write_tag(Tag::Unknown(65005), &[-1_i8, 2, -3, 4, -5][..]).unwrap(); - encoder.write_tag(Tag::Unknown(65010), -1_i16); - encoder.write_tag(Tag::Unknown(65011), -1_i16); - encoder.write_tag(Tag::Unknown(65012), &[-1_i16, 2][..]); - encoder.write_tag(Tag::Unknown(65013), &[-1_i16, 2, -3][..]); + encoder.write_tag(Tag::Unknown(65010), -1_i16).unwrap(); + encoder.write_tag(Tag::Unknown(65011), -1_i16).unwrap(); + encoder.write_tag(Tag::Unknown(65012), &[-1_i16, 2][..]).unwrap(); + encoder.write_tag(Tag::Unknown(65013), &[-1_i16, 2, -3][..]).unwrap(); - encoder.write_tag(Tag::Unknown(65020), -1_i32); - encoder.write_tag(Tag::Unknown(65021), &[-1_i32][..]); - encoder.write_tag(Tag::Unknown(65022), &[-1_i32, 2][..]); + encoder.write_tag(Tag::Unknown(65020), -1_i32).unwrap(); + encoder.write_tag(Tag::Unknown(65021), &[-1_i32][..]).unwrap(); + encoder.write_tag(Tag::Unknown(65022), &[-1_i32, 2][..]).unwrap(); - encoder.write_tag(Tag::Unknown(65030), SRational { n: -1, d: 100 }); - encoder.write_tag(Tag::Unknown(65031), &[SRational { n: -1, d: 100 }, SRational { n: 2, d: 100 }][..]); + encoder.write_tag(Tag::Unknown(65030), SRational { n: -1, d: 100 }).unwrap(); + encoder.write_tag(Tag::Unknown(65031), &[SRational { n: -1, d: 100 }, SRational { n: 2, d: 100 }][..]).unwrap(); } //Rewind the cursor for reading From 42c94ac3d96aac3e9353a6d89f05c9060725b6ad Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Fri, 20 Dec 2019 17:52:20 +0000 Subject: [PATCH 14/17] Add support for CMYK(16|32|64) encoding --- src/encoder/colortype.rs | 21 +++++++++++++++++++++ tests/encode_images.rs | 10 ++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/encoder/colortype.rs b/src/encoder/colortype.rs index 4055fdf..2f97066 100644 --- a/src/encoder/colortype.rs +++ b/src/encoder/colortype.rs @@ -100,3 +100,24 @@ impl ColorType for CMYK8 { const TIFF_VALUE: PhotometricInterpretation = PhotometricInterpretation::CMYK; const BITS_PER_SAMPLE: &'static [u16] = &[8, 8, 8, 8]; } + +pub struct CMYK16; +impl ColorType for CMYK16 { + type Inner = u16; + const TIFF_VALUE: PhotometricInterpretation = PhotometricInterpretation::CMYK; + const BITS_PER_SAMPLE: &'static [u16] = &[16, 16, 16, 16]; +} + +pub struct CMYK32; +impl ColorType for CMYK32 { + type Inner = u32; + const TIFF_VALUE: PhotometricInterpretation = PhotometricInterpretation::CMYK; + const BITS_PER_SAMPLE: &'static [u16] = &[32, 32, 32, 32]; +} + +pub struct CMYK64; +impl ColorType for CMYK64 { + type Inner = u64; + const TIFF_VALUE: PhotometricInterpretation = PhotometricInterpretation::CMYK; + const BITS_PER_SAMPLE: &'static [u16] = &[64, 64, 64, 64]; +} diff --git a/tests/encode_images.rs b/tests/encode_images.rs index c40fac3..9d1ecfd 100644 --- a/tests/encode_images.rs +++ b/tests/encode_images.rs @@ -105,6 +105,11 @@ fn test_rgb_u8_roundtrip() { test_u8_roundtrip::("rgb-3c-8b.tiff", ColorType::RGB(8)); } +#[test] +fn test_cmyk_u8_roundtrip() { + test_u8_roundtrip::("cmyk-3c-8b.tiff", ColorType::CMYK(8)); +} + #[test] fn test_gray_u16_roundtrip() { test_u16_roundtrip::("minisblack-1c-16b.tiff", ColorType::Gray(16)); @@ -115,6 +120,11 @@ fn test_rgb_u16_roundtrip() { test_u16_roundtrip::("rgb-3c-16b.tiff", ColorType::RGB(16)); } +#[test] +fn test_cmyk_u16_roundtrip() { + test_u16_roundtrip::("cmyk-3c-16b.tiff", ColorType::CMYK(16)); +} + #[test] fn test_gray_u32_roundtrip() { test_u32_roundtrip::("gradient-1c-32b.tiff", ColorType::Gray(32)); From e6985063ac25d04a5c5c629727077b75639b205e Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Sat, 21 Dec 2019 14:10:32 +0000 Subject: [PATCH 15/17] Fix formatting in README table --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c674c2c..df41496 100644 --- a/README.md +++ b/README.md @@ -17,12 +17,12 @@ This table lists photometric interpretations and sample formats which are suppor | `PhotometricInterpretation` | UINT Format | IEEEFP Format | |-|-|-| -| `WhiteIsZero` | Gray(8|16|32|64) | | -| `BlackIsZero` | Gray(8|16|32|64) | | -| `RGB` | RGB(8|16|32|64), RGBA(8|16|32|64) | | +| `WhiteIsZero` | Gray(8\|16\|32\|64) | | +| `BlackIsZero` | Gray(8\|16\|32\|64) | | +| `RGB` | RGB(8\|16\|32\|64), RGBA(8\|16\|32\|64) | | | `RGBPalette` | | | | `Mask` | | | -| `CMYK` | CMYK(8|16|32|64) | | +| `CMYK` | CMYK(8\|16\|32\|64) | | | `YCbCr` | | | | `CIELab` | | | From 1c8e98bca5b5c80958bb9866ff6adf8e5766762f Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Thu, 2 Jan 2020 12:47:39 +0000 Subject: [PATCH 16/17] Squash to cast checking --- src/encoder/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs index e3d7e0d..794b298 100644 --- a/src/encoder/mod.rs +++ b/src/encoder/mod.rs @@ -445,7 +445,7 @@ pub struct DirectoryEncoder<'a, W: 'a + Write + Seek> { impl<'a, W: 'a + Write + Seek> DirectoryEncoder<'a, W> { fn new(writer: &'a mut TiffWriter) -> TiffResult> { // the previous word is the IFD offset position - let ifd_pointer_pos = writer.offset() - u64::try_from(mem::size_of::())?; + let ifd_pointer_pos = writer.offset() - mem::size_of::() as u64; writer.pad_word_boundary()?; Ok(DirectoryEncoder { writer, From ec0477125f4ff968e3c566db471ef58bc2be8f78 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Sat, 1 Feb 2020 18:25:05 +0000 Subject: [PATCH 17/17] Tags: restore primitive conversions as inherent methods --- src/decoder/mod.rs | 2 +- src/encoder/mod.rs | 2 +- src/tags.rs | 51 +++++++++++++++++++++------------------------- 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index 9d06c31..4836c32 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -6,7 +6,7 @@ use std::cmp; use {ColorType, TiffError, TiffFormatError, TiffResult, TiffUnsupportedError}; use self::ifd::Directory; -use tags::{CompressionMethod, PhotometricInterpretation, Predictor, Tag, Type, U16Tag}; +use tags::{CompressionMethod, PhotometricInterpretation, Predictor, Tag, Type}; use self::stream::{ByteOrder, EndianReader, LZWReader, DeflateReader, PackBitsReader, SmartReader}; diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs index 794b298..22e39d3 100644 --- a/src/encoder/mod.rs +++ b/src/encoder/mod.rs @@ -4,7 +4,7 @@ use std::convert::TryFrom; use std::io::{Seek, Write}; use std::mem; -use tags::{self, ResolutionUnit, Tag, Type, U16Tag}; +use tags::{self, ResolutionUnit, Tag, Type}; use error::{TiffError, TiffFormatError, TiffResult}; pub mod colortype; diff --git a/src/tags.rs b/src/tags.rs index 3c074cd..fabb74d 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -1,32 +1,8 @@ -mod seals { - pub trait TagConversion: Sized { - fn __from_inner_type(T) -> Result; - - fn __to_inner_type(&self) -> T; - } -} - -pub trait U16Tag: Sized { - fn from_u16(val: u16) -> Option; - - fn to_u16(&self) -> u16; -} - -impl> U16Tag for T { - fn from_u16(val: u16) -> Option { - Self::__from_inner_type(val).ok() - } - - fn to_u16(&self) -> u16 { - Self::__to_inner_type(self) - } -} - macro_rules! tags { { // Permit arbitrary meta items, which include documentation. $( #[$enum_attr:meta] )* - $vis:vis enum $name:ident($ty:ty) $(unknown($unknown_doc:literal))* { + $vis:vis enum $name:ident($ty:tt) $(unknown($unknown_doc:literal))* { // Each of the `Name = Val,` permitting documentation. $($(#[$ident_attr:meta])* $tag:ident = $val:expr,)* } @@ -38,13 +14,13 @@ macro_rules! tags { // FIXME: switch to non_exhaustive once stabilized and compiler requirement new enough #[doc(hidden)] __NonExhaustive, - $( + $( #[doc = $unknown_doc] Unknown($ty), )* } - impl ::tags::seals::TagConversion<$ty> for $name { + impl $name { #[inline(always)] fn __from_inner_type(n: $ty) -> Result { match n { @@ -62,7 +38,26 @@ macro_rules! tags { } } } - } + + tags!($name, $ty); + }; + // For u16 tags, provide direct inherent primitive conversion methods. + ($name:tt, u16) => { + impl $name { + #[inline(always)] + pub fn from_u16(val: u16) -> Option { + Self::__from_inner_type(val).ok() + } + + #[inline(always)] + pub fn to_u16(&self) -> u16 { + Self::__to_inner_type(self) + } + } + }; + // For other tag types, do nothing for now. With concat_idents one could + // provide inherent conversion methods for all types. + ($name:tt, $ty:tt) => {}; } // Note: These tags appear in the order they are mentioned in the TIFF reference