From 67a327b3aa83be00580cd8a4e8d2538c730f6cb2 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Thu, 31 Oct 2019 11:56:29 +0000 Subject: [PATCH 01/13] Support 16 bit per channel image buffers Add 16 bit buffers for all 16 bit types in ColorType. Include these as supported types in DynamicImage. These 16 bit images are currently only supported with u16 representation; changing this would require specialization and macroing of color conversions. Load 16 bit PNGs at full bit depth rather than squashing to 8 bit. Note that tests will not pass until upgrading to a release of image-png including image-rs/image-png#174. Closes image-rs/image#560. Closes image-rs/image#665. Closes image-rs/image#940. --- Cargo.toml | 3 +- src/buffer.rs | 42 +- src/color.rs | 362 +++++++++++++++--- src/dynimage.rs | 194 +++++++++- src/flat.rs | 8 +- src/image.rs | 12 +- src/lib.rs | 8 +- src/png.rs | 16 +- tests/images/png/16bpc/basn6a16.png | Bin 0 -> 3435 bytes tests/images/tiff/testsuite/rgb-3c-16b.tiff | Bin 0 -> 142670 bytes .../png/16bpc/basn6a16.png.285be560.png | Bin 0 -> 1208 bytes .../testsuite/rgb-3c-16b.tiff.6456fd3a.png | Bin 0 -> 62643 bytes 12 files changed, 545 insertions(+), 100 deletions(-) create mode 100644 tests/images/png/16bpc/basn6a16.png create mode 100644 tests/images/tiff/testsuite/rgb-3c-16b.tiff create mode 100644 tests/reference/png/16bpc/basn6a16.png.285be560.png create mode 100644 tests/reference/tiff/testsuite/rgb-3c-16b.tiff.6456fd3a.png diff --git a/Cargo.toml b/Cargo.toml index 360ef137b4..89da99d805 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ name = "image" path = "./src/lib.rs" [dependencies] -byteorder = "1.2.1" +byteorder = "1.3.2" num-iter = "0.1.32" num-rational = { version = "0.2.1", default-features = false } num-traits = "0.2.0" @@ -29,6 +29,7 @@ jpeg = { package = "jpeg-decoder", version = "0.1", default-features = false, op png = { version = "0.15", optional = true } scoped_threadpool = { version = "0.1", optional = true } tiff = { version = "0.4.0", optional = true } +zerocopy = "0.2.8" [dev-dependencies] crc32fast = "1.2.0" diff --git a/src/buffer.rs b/src/buffer.rs index bad4fc93f7..9c1ea17626 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -4,12 +4,13 @@ use std::ops::{Deref, DerefMut, Index, IndexMut, Range}; use std::path::Path; use std::slice::{Chunks, ChunksMut}; -use color::{ColorType, FromColor, Luma, LumaA, Rgb, Rgba, Bgr, Bgra}; +use color::{ChannelsType, ColorType, FromColor, Luma, LumaA, Rgb, Rgba, Bgr, Bgra}; use flat::{FlatSamples, SampleLayout}; use dynimage::{save_buffer, save_buffer_with_format}; use image::{GenericImage, GenericImageView, ImageFormat, ImageResult}; use traits::Primitive; use utils::expand_packed; +use zerocopy::AsBytes; /// A generalized pixel. /// @@ -42,13 +43,10 @@ pub trait Pixel: Copy + Clone { Self::COLOR_MODEL } - /// ColorType for this pixel format - const COLOR_TYPE: ColorType; + /// Channels for this pixel format + const CHANNELS_TYPE: ChannelsType; /// Returns the ColorType for this pixel format - #[deprecated(note="please use COLOR_TYPE associated constant")] - fn color_type() -> ColorType { - Self::COLOR_TYPE - } + fn color_type() -> ColorType; /// Returns the channels of this pixel as a 4 tuple. If the pixel /// has less than 4 channels the remainder is filled with the maximum value @@ -655,7 +653,7 @@ where FlatSamples { samples: self.data, layout, - color_hint: Some(P::COLOR_TYPE), + color_hint: Some(P::color_type()), } } @@ -669,7 +667,7 @@ where FlatSamples { samples: self.data.as_ref(), layout, - color_hint: Some(P::COLOR_TYPE), + color_hint: Some(P::color_type()), } } } @@ -745,8 +743,9 @@ where impl ImageBuffer where - P: Pixel + 'static, - Container: Deref, + P: Pixel + 'static, + P::Subpixel: AsBytes, + Container: Deref, { /// Saves the buffer to a file at the path specified. /// @@ -759,18 +758,19 @@ where // This is valid as the subpixel is u8. save_buffer( path, - self, + self.as_bytes(), self.width(), self.height(), -

::COLOR_TYPE, +

::color_type(), ) } } impl ImageBuffer where - P: Pixel + 'static, - Container: Deref, + P: Pixel + 'static, + P::Subpixel: AsBytes, + Container: Deref, { /// Saves the buffer to a file at the specified path in /// the specified format. @@ -784,10 +784,10 @@ where // This is valid as the subpixel is u8. save_buffer_with_format( path, - self, + self.as_bytes(), self.width(), self.height(), -

::COLOR_TYPE, +

::color_type(), format, ) } @@ -1076,6 +1076,14 @@ pub type GrayAlphaImage = ImageBuffer, Vec>; pub(crate) type BgrImage = ImageBuffer, Vec>; /// Sendable Bgr + alpha channel image buffer pub(crate) type BgraImage = ImageBuffer, Vec>; +/// Sendable 16-bit Rgb image buffer +pub type Rgb16Image = ImageBuffer, Vec>; +/// Sendable 16-bit Rgb + alpha channel image buffer +pub type Rgba16Image = ImageBuffer, Vec>; +/// Sendable 16-bit grayscale image buffer +pub type Gray16Image = ImageBuffer, Vec>; +/// Sendable 16-bit grayscale + alpha channel image buffer +pub type GrayAlpha16Image = ImageBuffer, Vec>; #[cfg(test)] mod test { diff --git a/src/color.rs b/src/color.rs index b465c37e9a..668fa04100 100644 --- a/src/color.rs +++ b/src/color.rs @@ -1,9 +1,39 @@ -use num_traits::{NumCast, Zero}; +use num_traits::{NumCast, ToPrimitive, Zero}; use std::ops::{Index, IndexMut}; use buffer::Pixel; use traits::Primitive; +/// Supported ordered sets of channels +#[derive(Copy, PartialEq, Eq, Debug, Clone, Hash)] +pub enum ChannelsType { + /// Luminance + L, + /// Luminance and alpha + La, + /// Red, green and blue + Rgb, + /// Red, green, blue and alpha + Rgba, + /// Blue, green and red + Bgr, + /// Blue, green, red and alpha + Bgra, +} + +impl ChannelsType { + pub fn channel_count(self) -> u8 { + match self { + Self::L => 1, + Self::La => 2, + Self::Rgb => 3, + Self::Rgba => 4, + Self::Bgr => 3, + Self::Bgra => 4, + } + } +} + /// An enumeration over supported color types and bit depths #[derive(Copy, PartialEq, Eq, Debug, Clone, Hash)] pub enum ColorType { @@ -48,6 +78,11 @@ impl ColorType { } } + /// Returns the number of bytes contained in a channel per pixel of `ColorType` ```c``` + pub fn bytes_per_channel(self) -> u8 { + self.bytes_per_pixel() / self.channel_count() + } + /// Returns the number of bits contained in a pixel of `ColorType` ```c``` (which will always be /// a multiple of 8). pub fn bits_per_pixel(self) -> u16 { @@ -104,38 +139,46 @@ pub enum ExtendedColorType { } impl ExtendedColorType { - /// Get the number of channels for colors of this type. + /// Get the type of channels for colors of this type. /// - /// Note that the `Unknown` variant returns a value of `1` since pixels can only be treated as + /// Note that the `Unknown` variant returns a luminance channel since pixels can only be treated as /// an opaque datum by the library. - pub fn channel_count(self) -> u8 { + pub fn channels_type(self) -> ChannelsType { match self { ExtendedColorType::L1 | ExtendedColorType::L2 | ExtendedColorType::L4 | ExtendedColorType::L8 | ExtendedColorType::L16 | - ExtendedColorType::Unknown(_) => 1, + ExtendedColorType::Unknown(_) => ChannelsType::L, ExtendedColorType::La1 | ExtendedColorType::La2 | ExtendedColorType::La4 | ExtendedColorType::La8 | - ExtendedColorType::La16 => 2, + ExtendedColorType::La16 => ChannelsType::La, ExtendedColorType::Rgb1 | ExtendedColorType::Rgb2 | ExtendedColorType::Rgb4 | ExtendedColorType::Rgb8 | - ExtendedColorType::Rgb16 | - ExtendedColorType::Bgr8 => 3, + ExtendedColorType::Rgb16 => ChannelsType::Rgb, + ExtendedColorType::Bgr8 => ChannelsType::Bgr, ExtendedColorType::Rgba1 | ExtendedColorType::Rgba2 | ExtendedColorType::Rgba4 | ExtendedColorType::Rgba8 | - ExtendedColorType::Rgba16 | - ExtendedColorType::Bgra8 => 4, + ExtendedColorType::Rgba16 => ChannelsType::Rgba, + ExtendedColorType::Bgra8 => ChannelsType::Bgra, ExtendedColorType::__Nonexhaustive => unreachable!(), } } + + /// Get the number of channels for colors of this type. + /// + /// Note that the `Unknown` variant returns a value of `1` since pixels can only be treated as + /// an opaque datum by the library. + pub fn channel_count(self) -> u8 { + self.channels_type().channel_count() + } } impl From for ExtendedColorType { fn from(c: ColorType) -> Self { @@ -161,7 +204,7 @@ macro_rules! define_colors { $channels: expr, $alphas: expr, $interpretation: expr, - $color_type: expr, + $channels_type: expr, #[$doc:meta]; )*} => { @@ -180,7 +223,22 @@ impl Pixel for $ident { const COLOR_MODEL: &'static str = $interpretation; - const COLOR_TYPE: ColorType = $color_type; + const CHANNELS_TYPE: ChannelsType = $channels_type; + + fn color_type() -> ColorType { + match (Self::CHANNELS_TYPE, std::mem::size_of::()) { + (ChannelsType::L, 1) => ColorType::L8, + (ChannelsType::L, _) => ColorType::L16, + (ChannelsType::La, 1) => ColorType::La8, + (ChannelsType::La, _) => ColorType::La16, + (ChannelsType::Rgb, 1) => ColorType::Rgb8, + (ChannelsType::Rgb, _) => ColorType::Rgb16, + (ChannelsType::Rgba, 1) => ColorType::Rgba8, + (ChannelsType::Rgba, _) => ColorType::Rgba16, + (ChannelsType::Bgr, _) => ColorType::Bgr8, + (ChannelsType::Bgra, _) => ColorType::Bgra8, + } + } #[inline(always)] fn channels(&self) -> &[T] { @@ -314,18 +372,24 @@ impl IndexMut for $ident { } } +impl From<[T; $channels]> for $ident { + fn from(c: [T; $channels]) -> Self { + Self(c) + } +} + )* // END Structure definitions } } define_colors! { - Rgb, 3, 0, "RGB", ColorType::Rgb8, #[doc = "RGB colors"]; - Bgr, 3, 0, "BGR", ColorType::Bgr8, #[doc = "BGR colors"]; - Luma, 1, 0, "Y", ColorType::L8, #[doc = "Grayscale colors"]; - Rgba, 4, 1, "RGBA", ColorType::Rgba8, #[doc = "RGB colors + alpha channel"]; - Bgra, 4, 1, "BGRA", ColorType::Bgra8, #[doc = "BGR colors + alpha channel"]; - LumaA, 2, 1, "YA", ColorType::La8, #[doc = "Grayscale colors + alpha channel"]; + Rgb, 3, 0, "RGB", ChannelsType::Rgb, #[doc = "RGB colors"]; + Bgr, 3, 0, "BGR", ChannelsType::Bgr, #[doc = "BGR colors"]; + Luma, 1, 0, "Y", ChannelsType::L, #[doc = "Grayscale colors"]; + Rgba, 4, 1, "RGBA", ChannelsType::Rgba, #[doc = "RGB colors + alpha channel"]; + Bgra, 4, 1, "BGRA", ChannelsType::Bgra, #[doc = "BGR colors + alpha channel"]; + LumaA, 2, 1, "YA", ChannelsType::La, #[doc = "Grayscale colors + alpha channel"]; } /// Provides color conversions for the different pixel types. @@ -341,15 +405,61 @@ impl FromColor for A { } } -/// `FromColor` for Luma +/// Copy-based conversions to target pixel types using `FromColor`. +pub(crate) trait IntoColor { + /// Constructs a pixel of the target type and converts this pixel into it. + fn into_color(&self) -> Other; +} + +impl IntoColor for S +where + O: ::buffer::Pixel + FromColor { + fn into_color(&self) -> O { + // Note we cannot use Pixel::CHANNELS_COUNT here to directly construct + // the pixel due to a current bug/limitation of consts. + let mut pix = O::from_channels(Zero::zero(), Zero::zero(), Zero::zero(), Zero::zero()); + pix.from_color(self); + pix + } +} + +/// Coefficients to transform from sRGB to a CIE Y (luminance) value. +const SRGB_LUMA: [f32; 3] = [0.2126, 0.7152, 0.0722]; + +#[inline] +fn rgb_to_luma(rgb: &[T]) -> T { + let l = SRGB_LUMA[0] * rgb[0].to_f32().unwrap() + + SRGB_LUMA[1] * rgb[1].to_f32().unwrap() + + SRGB_LUMA[2] * rgb[2].to_f32().unwrap(); + NumCast::from(l).unwrap() +} + +#[inline] +fn bgr_to_luma(bgr: &[T]) -> T { + let l = SRGB_LUMA[0] * bgr[2].to_f32().unwrap() + + SRGB_LUMA[1] * bgr[1].to_f32().unwrap() + + SRGB_LUMA[2] * bgr[0].to_f32().unwrap(); + NumCast::from(l).unwrap() +} + +#[inline] +fn downcast_channel(c16: u16) -> u8 { + NumCast::from(c16.to_u64().unwrap() >> 8).unwrap() +} + +#[inline] +fn upcast_channel(c8: u8) -> u16 { + NumCast::from(c8.to_u64().unwrap() << 8).unwrap() +} + + +// `FromColor` for Luma impl FromColor> for Luma { fn from_color(&mut self, other: &Rgba) { let gray = self.channels_mut(); - let rgb = other.channels(); - let l = 0.2126f32 * rgb[0].to_f32().unwrap() + 0.7152f32 * rgb[1].to_f32().unwrap() - + 0.0722f32 * rgb[2].to_f32().unwrap(); - gray[0] = NumCast::from(l).unwrap() + let rgba = other.channels(); + gray[0] = rgb_to_luma(rgba); } } @@ -357,9 +467,7 @@ impl FromColor> for Luma { fn from_color(&mut self, other: &Bgra) { let gray = self.channels_mut(); let bgra = other.channels(); - let l = 0.2126f32 * bgra[2].to_f32().unwrap() + 0.7152f32 * bgra[1].to_f32().unwrap() - + 0.0722f32 * bgra[0].to_f32().unwrap(); - gray[0] = NumCast::from(l).unwrap() + gray[0] = bgr_to_luma(bgra); } } @@ -367,39 +475,72 @@ impl FromColor> for Luma { fn from_color(&mut self, other: &Rgb) { let gray = self.channels_mut(); let rgb = other.channels(); - let l = 0.2126f32 * rgb[0].to_f32().unwrap() + 0.7152f32 * rgb[1].to_f32().unwrap() - + 0.0722f32 * rgb[2].to_f32().unwrap(); - gray[0] = NumCast::from(l).unwrap() + gray[0] = rgb_to_luma(rgb); } } - impl FromColor> for Luma { fn from_color(&mut self, other: &Bgr) { let gray = self.channels_mut(); let bgr = other.channels(); - let l = 0.2126f32 * bgr[2].to_f32().unwrap() + 0.7152f32 * bgr[1].to_f32().unwrap() - + 0.0722f32 * bgr[0].to_f32().unwrap(); - gray[0] = NumCast::from(l).unwrap() + gray[0] = bgr_to_luma(bgr); } } - impl FromColor> for Luma { fn from_color(&mut self, other: &LumaA) { self.channels_mut()[0] = other.channels()[0] } } -/// `FromColor` for LumA + +impl FromColor> for Luma { + fn from_color(&mut self, other: &Rgba) { + let gray = self.channels_mut(); + let rgb = other.channels(); + let l = rgb_to_luma(rgb); + gray[0] = downcast_channel(l); + } +} + +impl FromColor> for Luma { + fn from_color(&mut self, other: &Rgb) { + let gray = self.channels_mut(); + let rgb = other.channels(); + let l = rgb_to_luma(rgb); + gray[0] = downcast_channel(l); + } +} + +impl FromColor> for Luma { + fn from_color(&mut self, other: &Luma) { + let l = other.channels()[0]; + self.channels_mut()[0] = downcast_channel(l); + } +} + +impl FromColor> for Luma { + fn from_color(&mut self, other: &Luma) { + let l = other.channels()[0]; + self.channels_mut()[0] = upcast_channel(l); + } +} + +impl FromColor> for Luma { + fn from_color(&mut self, other: &LumaA) { + let l = other.channels()[0]; + self.channels_mut()[0] = downcast_channel(l); + } +} + + +// `FromColor` for LumaA impl FromColor> for LumaA { fn from_color(&mut self, other: &Rgba) { let gray_a = self.channels_mut(); let rgba = other.channels(); - let l = 0.2126f32 * rgba[0].to_f32().unwrap() + 0.7152f32 * rgba[1].to_f32().unwrap() - + 0.0722f32 * rgba[2].to_f32().unwrap(); - gray_a[0] = NumCast::from(l).unwrap(); + gray_a[0] = rgb_to_luma(rgba); gray_a[1] = rgba[3]; } } @@ -408,9 +549,7 @@ impl FromColor> for LumaA { fn from_color(&mut self, other: &Bgra) { let gray_a = self.channels_mut(); let bgra = other.channels(); - let l = 0.2126f32 * bgra[2].to_f32().unwrap() + 0.7152f32 * bgra[1].to_f32().unwrap() - + 0.0722f32 * bgra[0].to_f32().unwrap(); - gray_a[0] = NumCast::from(l).unwrap(); + gray_a[0] = bgr_to_luma(bgra); gray_a[1] = bgra[3]; } } @@ -419,9 +558,7 @@ impl FromColor> for LumaA { fn from_color(&mut self, other: &Rgb) { let gray_a = self.channels_mut(); let rgb = other.channels(); - let l = 0.2126f32 * rgb[0].to_f32().unwrap() + 0.7152f32 * rgb[1].to_f32().unwrap() - + 0.0722f32 * rgb[2].to_f32().unwrap(); - gray_a[0] = NumCast::from(l).unwrap(); + gray_a[0] = rgb_to_luma(rgb); gray_a[1] = T::max_value(); } } @@ -430,9 +567,7 @@ impl FromColor> for LumaA { fn from_color(&mut self, other: &Bgr) { let gray_a = self.channels_mut(); let bgr = other.channels(); - let l = 0.2126f32 * bgr[2].to_f32().unwrap() + 0.7152f32 * bgr[1].to_f32().unwrap() - + 0.0722f32 * bgr[0].to_f32().unwrap(); - gray_a[0] = NumCast::from(l).unwrap(); + gray_a[0] = bgr_to_luma(bgr); gray_a[1] = T::max_value(); } } @@ -445,7 +580,28 @@ impl FromColor> for LumaA { } } -/// `FromColor` for RGBA +impl FromColor> for LumaA { + fn from_color(&mut self, other: &LumaA) { + let la8 = self.channels_mut(); + let gray = other.channels()[0]; + let alpha = other.channels()[1]; + la8[0] = downcast_channel(gray); + la8[1] = downcast_channel(alpha); + } +} + +impl FromColor> for LumaA { + fn from_color(&mut self, other: &LumaA) { + let la8 = self.channels_mut(); + let gray = other.channels()[0]; + let alpha = other.channels()[1]; + la8[0] = upcast_channel(gray); + la8[1] = upcast_channel(alpha); + } +} + + +// `FromColor` for RGBA impl FromColor> for Rgba { fn from_color(&mut self, other: &Rgb) { @@ -480,7 +636,6 @@ impl FromColor> for Rgba { } } - impl FromColor> for Rgba { fn from_color(&mut self, other: &LumaA) { let rgba = self.channels_mut(); @@ -492,8 +647,6 @@ impl FromColor> for Rgba { } } - - impl FromColor> for Rgba { fn from_color(&mut self, gray: &Luma) { let rgba = self.channels_mut(); @@ -505,8 +658,30 @@ impl FromColor> for Rgba { } } +impl FromColor> for Rgba { + fn from_color(&mut self, other: &Rgba) { + let rgba = self.channels_mut(); + let rgba16 = other.channels(); + rgba[0] = downcast_channel(rgba16[0]); + rgba[1] = downcast_channel(rgba16[1]); + rgba[2] = downcast_channel(rgba16[2]); + rgba[3] = downcast_channel(rgba16[3]); + } +} + +impl FromColor> for Rgba { + fn from_color(&mut self, other: &Rgba) { + let rgba = self.channels_mut(); + let rgba8 = other.channels(); + rgba[0] = upcast_channel(rgba8[0]); + rgba[1] = upcast_channel(rgba8[1]); + rgba[2] = upcast_channel(rgba8[2]); + rgba[3] = upcast_channel(rgba8[3]); + } +} -/// `FromColor` for BGRA + +// `FromColor` for BGRA impl FromColor> for Bgra { fn from_color(&mut self, other: &Rgb) { @@ -519,7 +694,6 @@ impl FromColor> for Bgra { } } - impl FromColor> for Bgra { fn from_color(&mut self, other: &Bgr) { let bgra = self.channels_mut(); @@ -531,7 +705,6 @@ impl FromColor> for Bgra { } } - impl FromColor> for Bgra { fn from_color(&mut self, other: &Rgba) { let bgra = self.channels_mut(); @@ -566,8 +739,7 @@ impl FromColor> for Bgra { } - -/// `FromColor` for RGB +// `FromColor` for RGB impl FromColor> for Rgb { fn from_color(&mut self, other: &Rgba) { @@ -579,7 +751,6 @@ impl FromColor> for Rgb { } } - impl FromColor> for Rgb { fn from_color(&mut self, other: &Bgra) { let rgb = self.channels_mut(); @@ -620,6 +791,23 @@ impl FromColor> for Rgb { } } +impl FromColor> for Rgb { + fn from_color(&mut self, other: &Rgb) { + for (c8, &c16) in self.channels_mut().iter_mut().zip(other.channels()) { + *c8 = downcast_channel(c16); + } + } +} + +impl FromColor> for Rgb { + fn from_color(&mut self, other: &Rgb) { + for (c8, &c16) in self.channels_mut().iter_mut().zip(other.channels()) { + *c8 = upcast_channel(c16); + } + } +} + + /// `FromColor` for BGR impl FromColor> for Bgr { @@ -673,6 +861,43 @@ impl FromColor> for Bgr { } } +macro_rules! downcast_bit_depth_early { + ($src:ident, $intermediate:ident, $dst:ident) => { + impl FromColor<$src> for $dst { + fn from_color(&mut self, other: &$src) { + let mut intermediate: $intermediate = $intermediate([Zero::zero(); <$intermediate as Pixel>::CHANNEL_COUNT as usize]); + intermediate.from_color(other); + self.from_color(&intermediate); + } + } + }; +} + + +// Downcasts +// LumaA +downcast_bit_depth_early!(Luma, Luma, LumaA); +downcast_bit_depth_early!(Rgb, Rgb, LumaA); +downcast_bit_depth_early!(Rgba, Rgba, LumaA); +// Rgb +downcast_bit_depth_early!(Luma, Luma, Rgb); +downcast_bit_depth_early!(LumaA, LumaA, Rgb); +downcast_bit_depth_early!(Rgba, Rgba, Rgb); +// Rgba +downcast_bit_depth_early!(Luma, Luma, Rgba); +downcast_bit_depth_early!(LumaA, LumaA, Rgba); +downcast_bit_depth_early!(Rgb, Rgb, Rgba); +// Bgr +downcast_bit_depth_early!(Luma, Luma, Bgr); +downcast_bit_depth_early!(LumaA, LumaA, Bgr); +downcast_bit_depth_early!(Rgb, Rgb, Bgr); +downcast_bit_depth_early!(Rgba, Rgba, Bgr); +// Bgra +downcast_bit_depth_early!(Luma, Luma, Bgra); +downcast_bit_depth_early!(LumaA, LumaA, Bgra); +downcast_bit_depth_early!(Rgb, Rgb, Bgra); +downcast_bit_depth_early!(Rgba, Rgba, Bgra); + /// Blends a color inter another one pub(crate) trait Blend { @@ -924,7 +1149,7 @@ impl Invert for Bgr { #[cfg(test)] mod tests { - use super::{LumaA, Pixel, Rgb, Rgba, Bgr, Bgra}; + use super::{Luma, LumaA, Pixel, Rgb, Rgba, Bgr, Bgra}; #[test] fn test_apply_with_alpha_rgba() { @@ -1081,4 +1306,25 @@ mod tests { let bgra = Bgra([0, 0, 0, 0]).map_without_alpha(|s| s + 1); assert_eq!(bgra, Bgra([1, 1, 1, 0])); } + + macro_rules! test_lossless_conversion { + ($a:ty, $b:ty, $c:ty) => { + let a: $a = [<$a as Pixel>::Subpixel::max_value() >> 2; <$a as Pixel>::CHANNEL_COUNT as usize].into(); + let b: $b = a.into_color(); + let c: $c = b.into_color(); + assert_eq!(a.channels(), c.channels()); + }; + } + + #[test] + fn test_lossless_conversions() { + use super::IntoColor; + + test_lossless_conversion!(Bgr, Rgba, Bgr); + test_lossless_conversion!(Bgra, Rgba, Bgra); + test_lossless_conversion!(Luma, Luma, Luma); + test_lossless_conversion!(LumaA, LumaA, LumaA); + test_lossless_conversion!(Rgb, Rgb, Rgb); + test_lossless_conversion!(Rgba, Rgba, Rgba); + } } diff --git a/src/dynimage.rs b/src/dynimage.rs index 80da673c16..f6222f4155 100644 --- a/src/dynimage.rs +++ b/src/dynimage.rs @@ -17,11 +17,11 @@ use png; use pnm; use buffer::{ - BgrImage, BgraImage, ConvertBuffer, GrayAlphaImage, GrayImage, ImageBuffer, Pixel, RgbImage, - RgbaImage, + BgrImage, BgraImage, ConvertBuffer, GrayAlphaImage, GrayAlpha16Image, + GrayImage, Gray16Image, ImageBuffer, Pixel, RgbImage, Rgb16Image, + RgbaImage, Rgba16Image, }; -use color; -use flat::FlatSamples; +use color::{self, IntoColor}; use image; use image::{ GenericImage, GenericImageView, ImageDecoder, ImageError, ImageFormat, ImageOutputFormat, ImageResult, @@ -49,6 +49,18 @@ pub enum DynamicImage { /// Each pixel in this image is 8-bit Bgr with alpha ImageBgra8(BgraImage), + + /// Each pixel in this image is 16-bit Luma + ImageLuma16(Gray16Image), + + /// Each pixel in this image is 16-bit Luma with alpha + ImageLumaA16(GrayAlpha16Image), + + /// Each pixel in this image is 16-bit Rgb + ImageRgb16(Rgb16Image), + + /// Each pixel in this image is 16-bit Rgb with alpha + ImageRgba16(Rgba16Image), } macro_rules! dynamic_map( @@ -60,6 +72,10 @@ macro_rules! dynamic_map( DynamicImage::ImageRgba8(ref $image) => DynamicImage::ImageRgba8($action), DynamicImage::ImageBgr8(ref $image) => DynamicImage::ImageBgr8($action), DynamicImage::ImageBgra8(ref $image) => DynamicImage::ImageBgra8($action), + DynamicImage::ImageLuma16(ref $image) => DynamicImage::ImageLuma16($action), + DynamicImage::ImageLumaA16(ref $image) => DynamicImage::ImageLumaA16($action), + DynamicImage::ImageRgb16(ref $image) => DynamicImage::ImageRgb16($action), + DynamicImage::ImageRgba16(ref $image) => DynamicImage::ImageRgba16($action), } ); @@ -71,6 +87,10 @@ macro_rules! dynamic_map( DynamicImage::ImageRgba8(ref mut $image) => DynamicImage::ImageRgba8($action), DynamicImage::ImageBgr8(ref mut $image) => DynamicImage::ImageBgr8($action), DynamicImage::ImageBgra8(ref mut $image) => DynamicImage::ImageBgra8($action), + DynamicImage::ImageLuma16(ref mut $image) => DynamicImage::ImageLuma16($action), + DynamicImage::ImageLumaA16(ref mut $image) => DynamicImage::ImageLumaA16($action), + DynamicImage::ImageRgb16(ref mut $image) => DynamicImage::ImageRgb16($action), + DynamicImage::ImageRgba16(ref mut $image) => DynamicImage::ImageRgba16($action), } ); @@ -82,6 +102,10 @@ macro_rules! dynamic_map( DynamicImage::ImageRgba8(ref $image) => $action, DynamicImage::ImageBgr8(ref $image) => $action, DynamicImage::ImageBgra8(ref $image) => $action, + DynamicImage::ImageLuma16(ref $image) => $action, + DynamicImage::ImageLumaA16(ref $image) => $action, + DynamicImage::ImageRgb16(ref $image) => $action, + DynamicImage::ImageRgba16(ref $image) => $action, } ); @@ -93,6 +117,10 @@ macro_rules! dynamic_map( DynamicImage::ImageRgba8(ref mut $image) => $action, DynamicImage::ImageBgr8(ref mut $image) => $action, DynamicImage::ImageBgra8(ref mut $image) => $action, + DynamicImage::ImageLuma16(ref mut $image) => $action, + DynamicImage::ImageLumaA16(ref mut $image) => $action, + DynamicImage::ImageRgb16(ref mut $image) => $action, + DynamicImage::ImageRgba16(ref mut $image) => $action, } ); ); @@ -129,6 +157,27 @@ impl DynamicImage { DynamicImage::ImageBgr8(ImageBuffer::new(w, h)) } + /// Creates a dynamic image backed by a buffer of grey pixels. + pub fn new_luma16(w: u32, h: u32) -> DynamicImage { + DynamicImage::ImageLuma16(ImageBuffer::new(w, h)) + } + + /// Creates a dynamic image backed by a buffer of grey + /// pixels with transparency. + pub fn new_luma_a16(w: u32, h: u32) -> DynamicImage { + DynamicImage::ImageLumaA16(ImageBuffer::new(w, h)) + } + + /// Creates a dynamic image backed by a buffer of RGB pixels. + pub fn new_rgb16(w: u32, h: u32) -> DynamicImage { + DynamicImage::ImageRgb16(ImageBuffer::new(w, h)) + } + + /// Creates a dynamic image backed by a buffer of RGBA pixels. + pub fn new_rgba16(w: u32, h: u32) -> DynamicImage { + DynamicImage::ImageRgba16(ImageBuffer::new(w, h)) + } + /// Decodes an encoded image into a dynamic image. pub fn from_decoder<'a>(decoder: impl ImageDecoder<'a>) -> ImageResult @@ -279,14 +328,73 @@ impl DynamicImage { } } - /// Return this image's pixels as a byte vector. - pub fn raw_pixels(&self) -> Vec { - image_to_bytes(self) + /// Return a reference to an 16bit RGB image + pub fn as_rgb16(&self) -> Option<&Rgb16Image> { + match *self { + DynamicImage::ImageRgb16(ref p) => Some(p), + _ => None, + } + } + + /// Return a mutable reference to an 16bit RGB image + pub fn as_mut_rgb16(&mut self) -> Option<&mut Rgb16Image> { + match *self { + DynamicImage::ImageRgb16(ref mut p) => Some(p), + _ => None, + } + } + + /// Return a reference to an 16bit RGBA image + pub fn as_rgba16(&self) -> Option<&Rgba16Image> { + match *self { + DynamicImage::ImageRgba16(ref p) => Some(p), + _ => None, + } + } + + /// Return a mutable reference to an 16bit RGBA image + pub fn as_mut_rgba16(&mut self) -> Option<&mut Rgba16Image> { + match *self { + DynamicImage::ImageRgba16(ref mut p) => Some(p), + _ => None, + } + } + + /// Return a reference to an 16bit Grayscale image + pub fn as_luma16(&self) -> Option<&Gray16Image> { + match *self { + DynamicImage::ImageLuma16(ref p) => Some(p), + _ => None, + } + } + + /// Return a mutable reference to an 16bit Grayscale image + pub fn as_mut_luma16(&mut self) -> Option<&mut Gray16Image> { + match *self { + DynamicImage::ImageLuma16(ref mut p) => Some(p), + _ => None, + } + } + + /// Return a reference to an 16bit Grayscale image with an alpha channel + pub fn as_luma_alpha16(&self) -> Option<&GrayAlpha16Image> { + match *self { + DynamicImage::ImageLumaA16(ref p) => Some(p), + _ => None, + } + } + + /// Return a mutable reference to an 16bit Grayscale image with an alpha channel + pub fn as_mut_luma_alpha16(&mut self) -> Option<&mut GrayAlpha16Image> { + match *self { + DynamicImage::ImageLumaA16(ref mut p) => Some(p), + _ => None, + } } - /// Return a view on the raw sample buffer. - pub fn as_flat_samples(&self) -> FlatSamples<&[u8]> { - dynamic_map!(*self, ref p -> p.as_flat_samples()) + /// Return this image's pixels as a byte vector. + pub fn to_bytes(&self) -> Vec { + image_to_bytes(self) } /// Return this image's color type. @@ -298,6 +406,10 @@ impl DynamicImage { DynamicImage::ImageRgba8(_) => color::ColorType::Rgba8, DynamicImage::ImageBgra8(_) => color::ColorType::Bgra8, DynamicImage::ImageBgr8(_) => color::ColorType::Bgr8, + DynamicImage::ImageLuma16(_) => color::ColorType::L16, + DynamicImage::ImageLumaA16(_) => color::ColorType::La16, + DynamicImage::ImageRgb16(_) => color::ColorType::Rgb16, + DynamicImage::ImageRgba16(_) => color::ColorType::Rgba16, } } @@ -310,6 +422,10 @@ impl DynamicImage { DynamicImage::ImageRgba8(ref p) => DynamicImage::ImageLuma8(imageops::grayscale(p)), DynamicImage::ImageBgr8(ref p) => DynamicImage::ImageLuma8(imageops::grayscale(p)), DynamicImage::ImageBgra8(ref p) => DynamicImage::ImageLuma8(imageops::grayscale(p)), + DynamicImage::ImageLuma16(ref p) => DynamicImage::ImageLuma16(p.clone()), + DynamicImage::ImageLumaA16(ref p) => DynamicImage::ImageLuma16(imageops::grayscale(p)), + DynamicImage::ImageRgb16(ref p) => DynamicImage::ImageLuma16(imageops::grayscale(p)), + DynamicImage::ImageRgba16(ref p) => DynamicImage::ImageLuma16(imageops::grayscale(p)), } } @@ -470,7 +586,7 @@ impl DynamicImage { w: &mut W, format: F, ) -> ImageResult<()> { - let mut bytes = self.raw_pixels(); + let mut bytes = self.to_bytes(); let (width, height) = self.dimensions(); let mut color = self.color(); let format = format.into(); @@ -593,7 +709,7 @@ impl GenericImageView for DynamicImage { } fn get_pixel(&self, x: u32, y: u32) -> color::Rgba { - dynamic_map!(*self, ref p -> p.get_pixel(x, y).to_rgba()) + dynamic_map!(*self, ref p -> p.get_pixel(x, y).to_rgba().into_color()) } fn inner(&self) -> &Self::InnerImageView { @@ -613,6 +729,10 @@ impl GenericImage for DynamicImage { DynamicImage::ImageRgba8(ref mut p) => p.put_pixel(x, y, pixel), DynamicImage::ImageBgr8(ref mut p) => p.put_pixel(x, y, pixel.to_bgr()), DynamicImage::ImageBgra8(ref mut p) => p.put_pixel(x, y, pixel.to_bgra()), + DynamicImage::ImageLuma16(ref mut p) => p.put_pixel(x, y, pixel.to_luma().into_color()), + DynamicImage::ImageLumaA16(ref mut p) => p.put_pixel(x, y, pixel.to_luma_alpha().into_color()), + DynamicImage::ImageRgb16(ref mut p) => p.put_pixel(x, y, pixel.to_rgb().into_color()), + DynamicImage::ImageRgba16(ref mut p) => p.put_pixel(x, y, pixel.into_color()), } } /// DEPRECATED: Use iterator `pixels_mut` to blend the pixels directly. @@ -622,9 +742,12 @@ impl GenericImage for DynamicImage { DynamicImage::ImageLumaA8(ref mut p) => p.blend_pixel(x, y, pixel.to_luma_alpha()), DynamicImage::ImageRgb8(ref mut p) => p.blend_pixel(x, y, pixel.to_rgb()), DynamicImage::ImageRgba8(ref mut p) => p.blend_pixel(x, y, pixel), - DynamicImage::ImageBgr8(ref mut p) => p.blend_pixel(x, y, pixel.to_bgr()), DynamicImage::ImageBgra8(ref mut p) => p.blend_pixel(x, y, pixel.to_bgra()), + DynamicImage::ImageLuma16(ref mut p) => p.blend_pixel(x, y, pixel.to_luma().into_color()), + DynamicImage::ImageLumaA16(ref mut p) => p.blend_pixel(x, y, pixel.to_luma_alpha().into_color()), + DynamicImage::ImageRgb16(ref mut p) => p.blend_pixel(x, y, pixel.to_rgb().into_color()), + DynamicImage::ImageRgba16(ref mut p) => p.blend_pixel(x, y, pixel.into_color()), } } @@ -642,32 +765,57 @@ impl GenericImage for DynamicImage { fn decoder_to_image<'a, I: ImageDecoder<'a>>(decoder: I) -> ImageResult { let (w, h) = decoder.dimensions(); let color_type = decoder.color_type(); - let buf = image::decoder_to_vec(decoder)?; let image = match color_type { color::ColorType::Rgb8 => { + let buf = image::decoder_to_vec(decoder)?; ImageBuffer::from_raw(w, h, buf).map(DynamicImage::ImageRgb8) } color::ColorType::Rgba8 => { + let buf = image::decoder_to_vec(decoder)?; ImageBuffer::from_raw(w, h, buf).map(DynamicImage::ImageRgba8) } color::ColorType::Bgr8 => { + let buf = image::decoder_to_vec(decoder)?; ImageBuffer::from_raw(w, h, buf).map(DynamicImage::ImageBgr8) } color::ColorType::Bgra8 => { + let buf = image::decoder_to_vec(decoder)?; ImageBuffer::from_raw(w, h, buf).map(DynamicImage::ImageBgra8) } color::ColorType::L8 => { + let buf = image::decoder_to_vec(decoder)?; ImageBuffer::from_raw(w, h, buf).map(DynamicImage::ImageLuma8) } color::ColorType::La8 => { + let buf = image::decoder_to_vec(decoder)?; ImageBuffer::from_raw(w, h, buf).map(DynamicImage::ImageLumaA8) } + + color::ColorType::Rgb16 => { + let buf = image::decoder_to_vec(decoder)?; + ImageBuffer::from_raw(w, h, buf).map(DynamicImage::ImageRgb16) + } + + color::ColorType::Rgba16 => { + let buf = image::decoder_to_vec(decoder)?; + ImageBuffer::from_raw(w, h, buf).map(DynamicImage::ImageRgba16) + } + + color::ColorType::L16 => { + let buf = image::decoder_to_vec(decoder)?; + ImageBuffer::from_raw(w, h, buf).map(DynamicImage::ImageLuma16) + } + + color::ColorType::La16 => { + let buf = image::decoder_to_vec(decoder)?; + ImageBuffer::from_raw(w, h, buf).map(DynamicImage::ImageLumaA16) + } _ => return Err(ImageError::UnsupportedColor(color_type.into())), }; match image { @@ -678,6 +826,8 @@ fn decoder_to_image<'a, I: ImageDecoder<'a>>(decoder: I) -> ImageResult Vec { + use zerocopy::AsBytes; + match *image { // TODO: consider transmuting DynamicImage::ImageLuma8(ref a) => a.iter().cloned().collect(), @@ -691,6 +841,14 @@ fn image_to_bytes(image: &DynamicImage) -> Vec { DynamicImage::ImageBgr8(ref a) => a.iter().cloned().collect(), DynamicImage::ImageBgra8(ref a) => a.iter().cloned().collect(), + + DynamicImage::ImageLuma16(ref a) => a.as_bytes().to_vec(), + + DynamicImage::ImageLumaA16(ref a) => a.as_bytes().to_vec(), + + DynamicImage::ImageRgb16(ref a) => a.as_bytes().to_vec(), + + DynamicImage::ImageRgba16(ref a) => a.as_bytes().to_vec(), } } @@ -902,4 +1060,12 @@ mod test { let dims = super::image_dimensions(im_path).unwrap(); assert_eq!(dims, (320, 240)); } + + #[cfg(feature = "png")] + #[test] + fn open_16bpc_png() { + let im_path = "./tests/images/png/16bpc/basn6a16.png"; + let image = super::open(im_path).unwrap(); + assert_eq!(image.color(), super::color::ColorType::Rgba16); + } } diff --git a/src/flat.rs b/src/flat.rs index 316c2564d8..994e5de0d3 100644 --- a/src/flat.rs +++ b/src/flat.rs @@ -560,7 +560,7 @@ impl FlatSamples { where P: Pixel, Buffer: AsRef<[P::Subpixel]>, { if self.layout.channels != P::CHANNEL_COUNT { - return Err(Error::WrongColor(P::COLOR_TYPE)) + return Err(Error::WrongColor(P::color_type())) } let as_ref = self.samples.as_ref(); @@ -597,7 +597,7 @@ impl FlatSamples { where P: Pixel, Buffer: AsMut<[P::Subpixel]>, { if self.layout.channels != P::CHANNEL_COUNT { - return Err(Error::WrongColor(P::COLOR_TYPE)) + return Err(Error::WrongColor(P::color_type())) } let as_mut = self.samples.as_mut(); @@ -634,7 +634,7 @@ impl FlatSamples { } if self.layout.channels != P::CHANNEL_COUNT { - return Err(Error::WrongColor(P::COLOR_TYPE)) + return Err(Error::WrongColor(P::color_type())) } let as_mut = self.samples.as_mut(); @@ -718,7 +718,7 @@ impl FlatSamples { } if self.layout.channels != P::CHANNEL_COUNT { - return Err((Error::WrongColor(P::COLOR_TYPE), self)) + return Err((Error::WrongColor(P::color_type()), self)) } if !self.fits(self.samples.deref().len()) { diff --git a/src/image.rs b/src/image.rs index f130c17440..1512064bef 100644 --- a/src/image.rs +++ b/src/image.rs @@ -10,6 +10,7 @@ use std::ops::{Deref, DerefMut}; use buffer::{ImageBuffer, Pixel}; use color::{ColorType, ExtendedColorType}; +use zerocopy::{AsBytes, FromBytes}; use animation::Frames; @@ -366,13 +367,16 @@ pub(crate) fn load_rect<'a, D, F, F1, F2, E>(x: u32, y: u32, width: u32, height: Ok(seek_scanline(decoder, 0)?) } -/// Reads all of the bytes of a decoder into a Vec. No particular alignment +/// Reads all of the bytes of a decoder into a Vec. No particular alignment /// of the output buffer is guaranteed. /// /// Panics if there isn't enough memory to decode the image. -pub(crate) fn decoder_to_vec<'a>(decoder: impl ImageDecoder<'a>) -> ImageResult> { - let mut buf = vec![0; usize::try_from(decoder.total_bytes()).unwrap()]; - decoder.read_image(&mut buf)?; +pub(crate) fn decoder_to_vec<'a, T>(decoder: impl ImageDecoder<'a>) -> ImageResult> +where + T: ::traits::Primitive + AsBytes + FromBytes, +{ + let mut buf = vec![num_traits::Zero::zero(); usize::try_from(decoder.total_bytes()).unwrap() / std::mem::size_of::()]; + decoder.read_image(buf.as_bytes_mut())?; Ok(buf) } diff --git a/src/lib.rs b/src/lib.rs index 8fa5f6d68d..14908d1211 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,6 +19,7 @@ extern crate num_traits; extern crate scoped_threadpool; #[cfg(all(test, feature = "benchmarks"))] extern crate test; +extern crate zerocopy; #[cfg(test)] #[macro_use] @@ -51,7 +52,12 @@ pub use buffer::{ConvertBuffer, ImageBuffer, Pixel, RgbImage, - RgbaImage}; + RgbaImage, + Rgb16Image, + Rgba16Image, + Gray16Image, + GrayAlpha16Image, + }; pub use flat::FlatSamples; diff --git a/src/png.rs b/src/png.rs index 38ab88c2dc..b9d48a588f 100644 --- a/src/png.rs +++ b/src/png.rs @@ -101,7 +101,11 @@ impl PngDecoder { let limits = png::Limits { bytes: usize::max_value(), }; - let decoder = png::Decoder::new_with_limits(r, limits); + let mut decoder = png::Decoder::new_with_limits(r, limits); + // By default the PNG decoder will scale 16 bpc to 8 bpc, so custom + // transformations must be set. EXPAND preserves the default behavior + // expanding bpc < 8 to 8 bpc. + decoder.set_transformations(png::Transformations::EXPAND); let (_, mut reader) = decoder.read_info().map_err(ImageError::from_png)?; let (color_type, bits) = reader.output_color_type(); let color_type = match (color_type, bits) { @@ -165,8 +169,18 @@ impl<'a, R: 'a + Read> ImageDecoder<'a> for PngDecoder { } fn read_image(mut self, buf: &mut [u8]) -> ImageResult<()> { + use byteorder::{BigEndian, ByteOrder, NativeEndian}; + assert_eq!(u64::try_from(buf.len()), Ok(self.total_bytes())); self.reader.next_frame(buf).map_err(ImageError::from_png)?; + // PNG images are big endian. For 16 bit per channel and larger types, + // the buffer may need to be reordered to native endianness per the + // contract of `read_image`. + match self.color_type().bytes_per_channel() { + 1 => (), // No reodering necessary for u8 + 2 => buf.chunks_mut(2).for_each(|c| NativeEndian::write_u16(c, BigEndian::read_u16(c))), + _ => unreachable!(), + } Ok(()) } diff --git a/tests/images/png/16bpc/basn6a16.png b/tests/images/png/16bpc/basn6a16.png new file mode 100644 index 0000000000000000000000000000000000000000..984a99525f5246cbc5d7083dd79006c7efa0ab0b GIT binary patch literal 3435 zcmZu!c{tPy7yiwHA^TDk8bxze5;JmTFJcJU8M34%B>R?S{F;j_VaO70WeZum*~v0U z*|P7(3}t6VvJ;#28T78k1v z&nS8Zj|V!+Cq~}>9rPQ;ykO8hV z2EKCW7Ddi#?XnvF3Yult6PMiPefz4+jy&;)2U&ZfrSX*a=6K)yD>qi0s>$H~iV=n} zmbEi-{m_7ald!QN#R$~+L9$zWq*+fDHpPsDjGb$c^vc8$=d|&{uCi(c*Lau4j4I*v zv)&ew29i^ye2PVU{l0ESsGRKT9>jP6b$EZcKFVNmqFh<-8#Q}JV}B=JsL{YfgVmtI z0bRJ0Z|Bg#?Uq=UUBQcye=r9SSwqfLKgttV$Tc=hXWjfd{nh?U$^cOUXI6y`9T%7LIF@9s4 zD&J~;LGi>8FXppsHqhPIC8)MmaAY#UsqMXrOTYUVHCT7e`!P7>S)1>7q>I9hMB4O4 z5_0&`4R0RQoxW$rk-3_DuV6LO=5tg$`B_r64NIZUPAzY2(j1ZI8NIVUTk;ggdfIpl zS|o%VrP(rDyjmC?#)JNE^fe7?##Zp%VFBC8bSaW_p6XCto==v*aU~k=HoXJBT770I zopJn)+20m^?Z8B|O3ejeazQ^iB#Kr$8~Lo$$N&duguqq35wAA+3$=&;5ylTS&HuvrEXrjT2CC_zn&%< z_T5xOtH<4cC)wlhM&$D5dLv?3Rlapu%j*-4HJL%*W6$7uC<5AbNCWWC2Q9!fo&iaK5t<;@GY~pk2j^m zKED-44p(XXScLI887(yv9j)wVqWj)@@glTnWmSozx9h=@{28S1k2XlN-juMK|JRAB zO4zwg$b}4{M%T%7g;{)Ay4Ck0$b>KqSHIP9~rQ@CMR)dPTZV_KN@G; zir$G4S#CQfLaEP-+wMtC;fV~(c76y^vysKlry?7MWLG+iO!Jb5Xc*L$0RQC4Q;KTt*fs|L@?DU6=H(1*_E#JYR!z=$r0GeNco3$I$%PET z8S|dvkQ_7OxHjYWCZh^Pu3pFcWdPam2+_23Q)C{J^^9T*XrxRALb8nMDq!{JU18+z z!+p1jAh0-Z)KUI_AtmMifn=x-h9K5wb47CsE~-?ScboEIY!3D;$(N*sX3S%^L#lAZ zFoS(MBwsZpkS9atg$Nu0rLrI{+3+BP$bq8BG(Q$#hRXKGch-F$a0k_VHTAvQ7-XL* z#!+s(TU(H?T~7^7pj69y{YM<~4Ih6zSdfy|*If=#&7Cu99-(u8^l##BtPc6sj$DlYdLbbl#2?gpxXmS|ce@T-=Q9XF+uwSv2tjdTgt=}?owG!~+0Q2+?en2Nn1A7X z>(dty?OQ7z;6~A=pjui7dw-NEoTez-;yra5u#1AK?G?xd=n5Ssx>fE1CKDCwXl1BW zg==}T^M6U)G;7HJw@M!kJ_x1Mef`Kv>e1yoQgb(A|Ly$mc{2}z6;C7Rdr{pUs711p zn}}WT6Hzdl0%75zF8HB3S>R&L*c z1HJ^-fY)73#TuHxJR~&}eU=LteSw8E5$+nfEI(`RB}hD}r2x1~GH($t;;VR#kH7Yvy$V;RMtZXLcjSggIw|W{g0fDdVku?(->(O zW*!X#g15g!)SQ~-7$di_gN#o0j}Ft@z{mNPQ@~_rA2Wc8qNH=sTw}~DS8>dMwUuD?ewH!t zHP@fBNhMy`rH6Tlr98?Ym)Svw=N9W!!kbjgr+gotV)GvIo|g05FoR5nr~-EllcQ@` zmv}4WccDmuAL#z!$&0~D!RuYkc}9EdU&%v$B@JZ+MKuha4j`yM8#o^&$a|GPfj2SY zg?xj`_XGe2pFJ&BQv%o)uwS^{x~hWQtITR=+F-A8zIve%EmU*5`TN6!+{sbM@pgPW zj@XFpeEOvx5o3E}OWh-W>ILaJsLbgrl#oy!R;pgf8S|%-aR?`oXYI4tX%;`0Nx>SK z5A?@i&PWMVBYwGAPscrOn;8s|SYTQ3w-xmNc5awbs;SE2ek8T$n-005TvzOw9bbtH zl9hXDCV2zxiM?HD`el1qCmNM8kGyP}smK*0^o3Jru|pMNC@`s%^N<{Ho3LosA>Lifn47S?7fNix$x`(x(%35p98Y6emi)Wf8&Wp zfF{BgSG5bS=|<&#b?%74`Jg|cjQ@x?YMnW^F=;3@v`p%3f4Z>5+e7M(irxs06nKqN zAMg<0vPwSaHyNL?*bB{6;)BcH$`+F}*LwE-b;%`c_2ZVA`RF&>8-Tb#9fA~ur*d#B z>a%m})i41^?(Xc!>vU1#L{7`JtAq<%SMJw>#nQel-jQW3G4rCNdUi~6d>UTM~d)wr)`X#0DdGI0}-A2tW8v5Yan7j?{7s!Zv@(HiY@%kHGP7nEWJd20wnm@QPnoS$AOl1cVuJk zM{h)`k{&jn%5XSoR`um2`CMpVQy?sBfJP7dj(*Pw_rBA**T2&5vV9WtZmMM`-5zfN z+Iv>CAPIU~!jrk8+>X|6!A89uwfrwrq;HO>6_Cl$ak}!Web`Ev%4EUyF0sE!T~HMnmVFEd|128zI!?sqI|)r;q4bxSQ2*OvWaet z5f3aqL23P^%IhdCyV{8~nc8z@e7M(U~>X2cs)3#S;}jkH04XtEsP1a>I`JFHHZ5 AY5)KL literal 0 HcmV?d00001 diff --git a/tests/images/tiff/testsuite/rgb-3c-16b.tiff b/tests/images/tiff/testsuite/rgb-3c-16b.tiff new file mode 100644 index 0000000000000000000000000000000000000000..f1a0279a194860390e0d372705d8a366cb06048d GIT binary patch literal 142670 zcmWh!Q*<0$7p;x2ZrTQ81rtr!*tTu7X>2sMZEIprFt%c=scrl3e;>}neLCx|v)A5d zpL30k_aXNkKw(=C%jnB~7|zu0Hr(y)S2?buJ3g7P2|&eMn=zug+>lK$VOs8u z?H7`n{6RY_Vx^qA&9iAKS-edEeoyv-jp6hQ39{|cnS)ZrwyD$2G9A_qGl!)ymONaE zc!)*$;89aYJ7}Lk-pR=HnXh#v`2~cr`qt{$Dd!m5BunfU=zSA@JO5mUHlZU#;FxYf zN9`4o?y>derMM-NU_XtsljYi!!sG*J6HcgsbQ+Fqtex|XtJ%yg$G~afRfoKA^-edSS zY_{go0_vmdLa0{tI;96GO4Vw)8l0-Xqi^kT zKqU#GLkr*v{GEcOv(2Mnxl5;;1%n4>(+cPO{%{|q>-m4-HfA33|2c~-_#UV<=UI%u zqcg8nE*pGgPP4rG_D{ZR>5o7wF23+XpcH2{TgS(RMM?4Z{=qm9R_fM9q5JGQ+fm?- zN)Fycka>iiK8~tAY&|&spTkMVE!=jxb%+#Rq6(h%Y`UoGZ{f`3l^Xx@tXgvYg{snu z+$PgHQmt3RU_(RoXyemHcr~~2a*KcMxu)Qb#JZo2xn0-(-PU$;nyxnGbjmlnH_P?x zZxm>GI}+P8+i{H$(>m5A!6@jY^bAn7L#Fh@Y-T;KU=-C{f`=nW&ad(u8WS@8OWf;& z3ZvS$y7rIUYY%BJ9SCXjFOMy@uXI;evd*iJLTQ?r)gP7>wA5|8g<+b9_b)2Mm|UE4 zl*gNcup81>OwJY3(DyYJn@@Qhcl3%_1 zy{2nVTYh~*phh>a$ue3$*QqfvDk96SQ8^lztJ`=tc0Bt+gHdFA*87s#(1ctIr&wo~ zyvK@?X3ZtG>Z7(Y6{-5p4sI1^4Er6HqY9PHtgXB#28V4Fyr=HCdcN`g8h7(nyT4UJ z>Yby0#AJhz+1raLM}wTB9n;-{U9;lz>0$30qszGw)!j8UBT=vV>+5F2p}j#h@Srcf z=c^n;^xH2~{O~7~YL?mi-|M}ky#|;i09{hV^QN<{q7b6EA^QgiPn@pxb6DtPxvekw z2=2JK74+=b8}n{t+t>xORLK6(TGJm;oAFh%OOWRiE#}%V<%v3rV+iv}N3%TS)k#0| zqlm{dP)nScGZA4Sh+3Y~w5$;$;CN_?*oZ8jcyE}37{|5g zh{LfX&sF&lTEC9oFGy-bLcvRg>UIa7f^#~KwY`&AJ#~Nca^9JKhqg!$ zE9~XnlVsA$W`*TiZ)ybC5c;E6|HDvsb&rva>Zi4njknPBrMi!uDJWA&nSY#SyXbfTD z%T1GEhbg)CO2|}dx0j-5Kdm4bE?&TpjR-;mX|F?{qVH0S!y2TmKGXyA3tkxZQNx}{?5~J-Bp96v*S3Hy$I;9hmdJPmsf+w4!% z+WX#VK&L&J9X`rrJia!QHhcJO@LWCZ!P?c%JqYX?ZL z8j#ry))*G1wz2g80!9kD6~Eu;DbOj<2)5bF z?E#EZsFye()*2mEs)EUh6CQY}ajJksUDd6risXTfbDLZju9~Iw-CaLx>pLjDx#CP3 zh~2bt24h9GqMQqQly-yEj!)v=S`ub72 zLn$Wm@&Aqbnsvrlj?EcJ#8GfFMltEhq;ivpoFq2S;zixuVwL?!>+`kuw#qG-b%KpX zQ{VCj>*;3KMS!hpe!-lcIkqcVNlHYI_|5i{IB-hAtW30Uf^3y2syunjb`>>*J7N9> z6*w_!!b0*Vs?Fw+VdFq!3zW#%TO%*gPq-*UCs7veo6#Gwrb(u0EP4jlZx$lai*q%y zlsY_JZDu9=W5(Y2qKpjgtEqv!)F-N@0wb4-I2 z$pO;_N7u`3VzoO5)Ilc0ODC<2^DrX?_K5cbQ zBEOz_eSW9}!>U@&Y<$GIwW>B;%{{l?H~pD2x&Cl!hfP>D9i1$xCWq6rCDJt!C-AeId+B8G}8z=TLqh%Sf< zSr=&lL6fBr8Iaq=TaXWsUg8AQ9U4jpqL{EX8VaS4uqA(lOTfVtWppz9DXB&IgeY_7 zKV>57)tINt9m$>P81hfMPsF3kxv?qJ(wrY@HPhSk$@!3($YpTD3sUI@WU88oU3-rE zjn`U!+TJ!3v3#!m8a{93V1F3_z7{jufzMcbF@YlS)&g*`WaRq8Q6r-5%DbLzLcpp| z4}-A1mO7|QkXfA{t!Djv{FjES0v44!-gbs)cw8emO391exSWJ2uTsB1{AK-DQN{4c zLRx)IZ35lh$G?(~U$mKx{9LzRZQ^dxxRI?&l_t^Cceli2G|5w`_)#y|O0G$=G12;2 z(^30J3j6DrvRS}C?e2;V;2T|+)hxiT+K95lB66K3H}#=@ZHsE&pwj9P*K>%8?8LNp za*GL(#h;b5Vxv0-wO!Nm$1M#pCFUf!F|kUV_QT>`y%by3%A|wKue7__LEzUrGgNk;mIS^>Pws`tO>!W{Km}%;k%xiObf5bt}w8drp%LE7uO!vdukVzuFYe zK4Q1hoXnE2TPzNt%UN~QuvN~2N~h1-+(rEu?J&9sD;rBQFM+y@Mwm)UogC^n;=r#B z7aF>PLq_O^dhmb|qP_wYH=1W$052NtRP#k7jo|g)z}qHInVX3z;sQ*RL_^074aX!5 zr^d`2q;KJNO?+kC#w%Y`He&i344lW+R^NtZkzQ?DUGXdG(n>P&n6nhpx~7mU9o52AB2aJf5G=iG2)&OJmn#p28A%lQXtqh)@3O{ zSR`Xdt_iZH5c556O2SPqV7!9FQKYOlckXA9jUwG|YpIlIez@;4aHX zBRZIGm4gvE^poKmH^*pAGuPcYRHZ$Y%qq%>?WF4Qepb`>0r`z@cpn19(!S!Vjo>NalLqFPIy-7! zU_m*qL|DJKOu~pS`moqXY(j9Rfh40NSli;IU?Ln}(xoaU(vq4LuP9}Z5?Yb1Vwo!5 z4b@T0V2_FG-YQg|@iL4qze!~q*VJS&yUn-i`D|0O{x&ZEnboxpe}0uU5c_c6(XO%Y z+roxDrk}a2;xszQT<-QfFz{x@E5K$*Z~bU++fdQkty?w2-D{8l&7o5(&Vk&H^9zAq zs5WK|*6`NEnB!O3kFD2CMA5}Tf2}Ty58hG_ACQ-e8BQNj8S#2ocuIB6&9CIW+C9JS znnbOT7*Q%6L*}{jPQ}_8Ta#4l5`m?&@V$>A8b^gfyoS;Yd(aRj{VSo zDfVi3)1*MQbF|l>PKt@sF$zSZrVLEw(f+txgG5P>$ywta@qWTS^IvE@!Ni1u{)^vd z9xu6ny3wRm;_qakiR3>NzcP$PS5EF}^TnX;_2z4$fz=PPW0h{UO%q?+mybSOe-@cB zy}qTA6*S|xDU~i>=P^0zo|twj|DYNu%dE8AAgm*P_>A2)p_g57Cy;(|?nSyhD`~+g z>mt{3YoaJ<&iJu>UBhhnqkHvfvr-RaJNIVqZc7gTna^2SA6Mr8-MoSQ!~Ol>{-_g^ zb?q!e)C!cnOJa^BPbdPMh#mARXthcNwZ0fK?A1H-D{(0_Rh=I+FSR1{qa=hjaC34bOCJVVag^-)J?r|ML^RXLkk)Wz4&&(R*2 zF<#2onwc9L=#ZK!puB&BMJCOU=W~|F)mSJa%U6{Y-Sk~P= zi?IkA9rB=p`|ba$B?(p>)HO&s=KoeM}FkzKzT+&pq+^;@v&h}}xU?Ulaq)hPe6 zx(k%+jzQS(A$rPs6%}e4;;-)<(19b5CB6<6m66Oe&pxRd7xbj?lIjzGpUTe~0g>a~ zod(HiX%ix*^?8XzA)BPKcl0*9!TP&Al;f|~8Qw$ZgY9pBNkp@VQG zo-%Byo;yN{F`vt?u)QsIVn!>kOpP>&%H~VSOgk3-5Q`%TRCS0okT2IdN$_cd?Pb#D zjP${IIZ0ObOuJ$XJA>Gw+{wN`Jf~{FM2!z>&XMWm?{D52du`J!db&qV$qQCH@J)Re zRW*Bpav}LYj{LT4 z0-kP6Q1acF(#!p1bZQ*#c}c+nr)2t65 zc&K@_>u_PUYFO3L$p@CFx{TILLVE@)w@yXqjm!+2IcoRr8Q{f!biNUw3VfMpMAm`i zDE1fuQ4(cP5(Pg%4HXxIU8QbHtU++J2U1{Y4gIR*OBkC`D*h1W&gzxk50_)rN!h}a zxqH$Jhzy>Fj2PlCR{>*;qVW!4;t<~4av5!88~Z0l1P)+-kXL}sadqSns7U5r={2M# zt4{6-(uOUiXpSP#8|6h&&E$TuMc`}VZ@n%!iGHem$X%ZM;KjAROpeiW8;&C*e$Scv zoiei-SiE_O4dQ=a8>iU9q6@Ma_cPK?~qLnN^BfDKD}jJ_OO=6QI#d)FEwrj$372ELEE zZv;0TVIF@RPmOO_!I%3!NbwxDvXCn-Ch@(`Hh$#N;+wHqb4F>MWw|7>S$}CBRoBU* zDV_rizFg1di{BDyHeS>B`xbdN!%oS`LRHmIASsnsw5E`suGgBcC!6ZjFKXtO`D#qu zfRkG^1=0&Hc|d6}ldrtbylLjyT+KUc`KTjj*5Bqvck!IRopN96Jm1B$J9XaJMXDod zw%ci;8@q7T`CuEYjPaJVge(VsS0F(aGj889m)T6;EnCn!blaycTn83%sNF?hHA!hC z%ji#5(sa6Icu^t6!>+yBn|~7hVN(^V={`?OhufNERU6mYmp9T`;Xs{eb4?q9V6Gp zdPs~=V6*DU1Z7wDIocmpN9HCiQk&1ZM9bDY&z5KV={hqMiOkj#b;ZNNi{>{ zum|N5;7|JnWrShhyT>pfXj@mYxt?aSV|92p$8(_lPf0- z+3MDi_kkvK`^f8q*Lt4I+CjFu`sI%ybg-(@_E3pIkaQqCcu-%;1@^b&my8tjOZ8oa z-_Y{pIyFbwczBi>32`*JH;65X$gWGKE6nxn41g^>N&9#?K0%Z*R=_QN3hWL_b$W~n zH54uyi@S76Ko;M9K2zWaQ|wx?U_Dnx@VsCU?}&(r;Ct?_$eeHik9R%%h7UVMp#SSZ@5P*C2?tBQ`Om(2H=0>pcYqSPM1j*=HFr+$DZym+7@aZdZgquGCzaX*+{ zNp;$~F};sGyCsA3z(=gB3^vYatbkhWr++Pp71Jjkao)u|9Q;Y__RwrgA3E%~7g*@3 zB9-EwWwi?>X1_@Ck;_cmN_>q`FRxNSXLZJTc$7x?Km7qId3Rt|36N%LaP3s}{8VXv!w zN{dr2DZR;ySl7eQ)A|MCQRP2N6?7iol6YSwnu(eez`SLb;N|5USXXC`Vq92r_$vxj_E}<%Jdq_$D7q=b zbf6qkhcf@t*qWD_GxQq0FU)Lui9rGj!uVhy$l-A64LMA&`fjynostTwV8@!vFc9c+ zT{-+3fZULavK4+%4M6XL>nlC<#>8Qb2(^o-;<_SHO%X^{3rtVQruHVH7vNsG274)- zTJar}FLa{P8Uz%gH!xw^fXucASf+?$s~xBYnAds}p$aVRG8aWd6?=!__aG&W$1pIs zRmxMXBk-m)ITa_cNA4rHMoB=sUgsfG#`ylB?=I@hPFt&+r^$i>&jb}o+kjjEpWzJ( z12k}&!CruIz5px-bc-_tw*XJ^(J&6^1Ah`h23K=?;B%k}ZZFIo^o9k3y#{;J!oV~@ z17YBLsIVAOKrm2fgSZME1>B-s_?M?OB@%gEWQF!ftO|62P8a_S{YeWIgTf?9yW$BD zf9e?85&DA(kcx&qVf;bIz~bolCC@>Z8Tx1mNHmi#35T|@o=Z!@Fhs>62vc#W1J7z==kis20z@Bc}U`DUC|@PGRA}$D~U`c;>UP!=Zn4 zG=yZMRs83X%LO&VLiXd?;MRBA$t8!!7WFq;YiK`wc(o+DutQdf4)L6OK;pyz$d2Cy zTnI})H2r+bdy3xjih0iOQbj-6#OqbP4{Ol<{&3m~HXc0SzBpI%yT5u7SCY~HVDUq` zN0-T*P~^i7-B}HnGvy;A{zk@;yH&j!qj!-#K%@3-f$@KKeDNqz#`s6sBTAFmxM#xm3ek!0c*#c*0{%}SoF3k@k;Hcx(DVP+=qH;3wT#t@5GXZYhQoK zlCH6>>nf-mcWAdWY( z%A4KaOWT!rH*cHkSIT7{H#nMq*IE$8Nw{WFfv~tc;VmigCacx;v-oZi*YuaDX!$)! z7R0$)@CyCLqe^7~uNw-rem7hMPuDt$I0>mVmw>i`4;l@DiopJMWrK2w?XpG3bJ9Io zlQMFEza>4M49W2J>9!*d*=&L%QU5r5`o^5_6DkLERpc^l5`wlHY5+bXVGyl=Zi>I?N8lamd-M^=`F}i{4UMBbla7E@QIno`F}+%E)9PRr%|3^Y92hP?n4O%ypDMh=Q=46{Zn+tOiAS+le@hEfC`3dt^puN`%M3wzG~xi|p+t{h2HD)_lTswZjAxUzMfq>1FPy)H>f#J*O)utP!3t`3$VVXZm?h)7YJ*J`eUR6BABX=$h8IF`M1s8bW zKCJ(nYqfn~5wlLV_;4=dzAi19!8+Y<>1E7?`%YSIC69MaXsv%BoEX_$CAT*Z2d(ty z-NnW)6oe0Uo6aUVn`UHVQ*?(T^jmh6J95m&r*tE8Z_LOU*A}=EAjZe?JMpdho<*FQ z7Y6%^X(SmFr?PrljHzA~osntbR)3IfVQtWg;H%kBb#%-(JALe~U7)+}^nG6r@%YpK zdl~Ja-7~t_DiJ2eGI|{e8_V<=n z3JUBanH`DShdXX*AN^n?#!BpVPupSR7eTSD=X42?!@ZA<#S^`UT1^e&HU@`H#^Q7b zH%))Vob1~$-HKi7cQ@fC*$y@ut0&s_-!yhgQ5={uLEp`pOfYMyH_rWza+=TOx~c~= zY4oS6w^)|!SzR6WXAal!3P+0bz<7{7&*3;<igDpc$q6bt2*w57fYUMc$ORc zSjfuOa^!NM~BsY3285&(N4oz6heevnez6u=WSKJeM}gXE*;Z2KPRz^vPnF(6?6 z=a`$i=ZRK#7}o9cXTgooJ@Ty3hR8?iZQ)p<4aN&lB%q1y26+Nf;=F}`fs(TyVPQb0 zITSb<(8$vT2Lj!B-S9D>C$ApS1&U$*g#Q4I(8eLRMOqjt&Vj_D4U3jWIEj)385m3z^GEWA=y)5HZM{`iJpawkqZna*~}Y6M^Vr z6J?y>JDgl8Z=^i$KTIStgiDk@kFey5%H|^$8TaKp5c}yx7&KynX)2eDXrg~rNJ7}q zAIUi(4seAOGLYdsK@~Y<1{<#=ihRis6W;?Jrq3DZK?UjBos*8qI0QQ=u%kzz|D=(8 zS7ymK6;R0ympPPfguBlx*}rk(8BO}iZ4&*8|wG`T14LJA!zKR4de|?&g)lHjz+ImHud5! z?-&t;$!S}S<8P{~CTl&l8#8FExQglOopaMRRLDKWB~_C8?)+>qE@VBnr*x3Mw3Zmz z1DQv9^E)G0JU3LrdV7tQcPeNgUGsTL`$(DosjT&p6$7nY0o;Zjqp%zQ&gfFfbMmYS zqSA?R()>&PO?J5LVmpDi>EPRblb_@;-ex(Q?V{B2XP)Hx4lA;-&-F+TXrAc-#R@O* zd>~D7JY~=5G6Yl1Q6eRKGR_9>$IAbvYpyH@U|oKXNWXCB$Wzzzg)3^^QMmEDR@#Ye z6L}Wl3E|^ptDbP*&V6Psw-9wtbqj-@H9yur9r>xt&*X5tZ0BubQruX_Tcg3~s_t;( zs|ilnuO=dQ|24=a*z|?b{pQQLn-k*}-;+;H4_c9V5u z;uZw<1s=^Ngne~Rzy-#+vxrNU<&JE&j0mw)*6SuNa+L1r(l)sTdv|y}oJ)(H<-MH0 z+zw}59*?1?Q!;ml@JUOI@Y)9=p;mKLu;s?3B0b^GYtzLknk~q~1zY)F%%js0O^KHE zaovq2TH3MAJv~~1N&ALx>j`9dkDu31&e@!lHMyE|U@FceHoJeaz*I3$cB<8cQAlc0 z(}Pvx?8~KWN}u1r3BrpIg5}q_IVM-f1)2-25zPY18Tw+wH}daZwDZLj_IRXNc|7Ia zmV73)#>f-iFCxM;0XP5|M8Z8v_0B%Kp zDCdhz;fyK_AUl~_a+`>o^djZ|kYL7&Trm6$H%TQG5<*jpf2%+#EO&b)j*iNcjuMay zdLh>1ZjVK;o=x2vkeu%b z6dBZCXmNj?j~QM!6^<5bZ&2?`IzFhSH=lzTduiBJ(1))wJX&f?$utS78l?-FyESKW zmaId&uFaitiN`k0i+ikeljqO7Z*&3|j6EH?_bt@9BNmUjAH*^jb-lLh z5bP^1U-B80#}3J{^+UcEPOd*gu?j|_^T%e6_#@U}fB&oZOXxUa@FwQY=(dG>eAL*i z`SZkElOL^~$G#r{S$zyX()!sr#lNveQhzOk-ty7JJlYEzXNHVnb+L@LqMvpf83iQ& z7;ZH6&J4hXS;!Y_6X4b_D*ljFYy`5csRfqLusS6TGHjmOf{?KuoyLhUEMwWs8CkBd zn&#wfGFSn#UmTCH*XEzP!&rN>qu%-qB)91{hMqoao}S0NG$&UU%lg1N8-!-}QfUJ|N6+X=XJc_#-OAk8la7W;#r=2>(=(-|1dKVLgpQ}0t(SZzEnD^FSCjeXutNU$ zqN#0iiMya|qfyfFh9g{g;(^@#O-O}(|Bn9E>l5et^UVv*U7UEc{s z9oQAhTQn8EM-D_Q!Vgf?#pa;3R424Nj^ned>@p2bYQ9OdI z0m6`%AQOV}o4q3ME~>}*j`@p}<%G*sqB__J%z04`^Ct#}pwa_mk)#0xNj8#VBu^ZrAh>nZFTb-inp4kc}-Mp=zzjONV2rk|6kShp=~}|tFdPK zX<|W2VZpq~i6ls_q^98A!Mn{$RWX7Nuf?1~TfAB&6!NZ3NSb)1Q99^4$b?(9-&Iaj z`Qx>0oGW*Ut_}|~s`}pO!!qZwSUus%`VB+u__)AoR3)P8F+VeI63dy-$(8F7pC^!kXG;EctbPUyBn13ssA>^+Wz7u*HklZkH{{KM0ED~ElhZ9H=SqP za@`dl|hWdj?c2`Q!3WX z$gk}V#y71yZJ&u#k@5!t2T5vSIzIrw(2Reol@qTyl5J`e?>RbX+7SP0oMxGrC^>3r zLW^}A+=}Q5dDDTY7!I;&8SwiQvD6u5^d#1`hi9A=AKgzfIiAWITQK{Rr#QW1i7R_d zX4+kTIHq~vDgDVFXJ4xCa>H?gk{JTF&<(y zv&Rg}Sz4TamoWMy_g=vpy7sJi>v6Ws+EaonZ(;4qlpNQWDSK;gR+5O)W^r@E-=mRX z7ylDDx#v|WG;vO%I5G6QTzNXZepw$9=hN~->t;Nn$5t~Wg)!=+@0#8}p=BVQ8#N_i zgf2dXe{I@Z+(8mG_b)9X_S=BU4w4{tipB1vN}IOA=am1fHH&j=o3cHs+PW zFD?|rp8vn1#GL;hef2Cj=yTW)MXr9MYx@m!jJ?_S0fHh4OmRSi@Dct#;1c*DUj zl4d^@IWH2&JtTY?Xu^|(Zh>xa)uCoUJUbt_0XoF40NMh+Fvr1JzR)k!Qpd_z{sMsu{u_ zL?k_dGl6f(&qcQ&qs$J8Iz%^X};F$8-=sg{61 z$BB=T5zr$fs^}4z5OqcJ68siLLE;eX3QJYG6zRk+lbJ@P@@!;}Bd_v|Wg-y_Ua@Q% zYKRjf8-zN{9>wsG((Gl~bD}B?C)ppUV9J#AYlI>7xLgi0ib0T@L>aL>6gyDII8T(h zqB5)vg%E@n{fWFGWSkkVcoR{w5U(CA=HLDSlO`ONFH&S?M$C)u`EYAA37cbTz)RIi z`ljCbB;oKZl#d1UR}%h$lY@qe>@bnPeBs&E;=2p4K>BB0O$oURPT{E^<+< z5g|#t11p=S*e*|d`uLX<#Ic=oPve$)GndqAHAes2Xe5r{xw`?gt)$XDrIl9v?5^YD zvB|j|RVrq)LGHI)Xbs};vjcRYXEmM2y1&emyoGuOmmGcdyRsMh{PjDB z7k7NdIvN*#duFvfo85C8XgJ1`cd@GoVB?%l7llyHIMgL(4Fp;s13u;aR`bz)gH92+ zg>gT8?vRo$Wj3%mE1-Z0DGhTvLx>ip?&SAOo$lp2g`V|@~ma@*su-Er;oChMz! z^A&%ZmGr$6AuYpt4YA|hSG0WZIu6lvHO|(I-B&&@1AR z)H8)5kd?HE1(RlNe2p!i9k6nA}@d^ zd9@%5&>-&|_y@3xrvo4(^%KGYcmh%)jPU;yD(~y2mu04Y(AHxEUhBo& zCfW(9VjPzsz}gsT=n+H^ zMJ++tGk&NEh(1mZ_8QtS`3Z@Io*`1v1o#8$LkUyFSJq>+7BY}|LD~^v!ts%*MSbIB z%5{jD&_tx05T9v|GFRclv<5kA_*-&_oF&4ZuqAT>c8pjg;{xeWC#64#U4N0+nx|w%BX3yRa5sm=YP9#S+kii~gFtYN;%Cx3jmCVwc)FxCqFun^H!tq!XQ9dFhDTGL5tH(RWAqgmM)H}N>;t^(Z)v)Q-5^aU)$ zqyT%}7ne$bL!UQV`{Sl^cbCbb&bSUq{&f$}p00Th{}=xzsw%!UeddeL{fm3Wm!$mNv1ZFa&p*u-bGB}dWd$^f zZD;-wVw9a!s@fFm56PaxL|%Dwr_02{BYdkQMk42zy5U3=1MH2YsYLh z^uLw_y^WZhuD{0RY41i8Ep+pQrwuKSmIM*=t$w!%GN0RgDF4a3WSd;$UbZV)x3azH zpsmjN$zrJ$@(~GzTdiBrU+2TVef!Cg+hQlKd*n)29yL`fU1+iKN~Nth zqf97kdgx7AOYUpH8_+3s5b!k6g~I}}zyb_{@V1B|{jZ1_;1Ru9ganM_Xb6u8YjXm@ z&q3eWa7Zc$&*p=JL5_@c2n=XPEC6N#M#&DK0ALht8v%h2ziXE_9FcLg6udelb8T1*yC`5O6{AGAT3Tv;wKR&GQlJ zWxiN&zeIn5P<57^~K~wlj-g68NbnVgZzB+;?xe zw#;Jq+4`$a>bUFHsh%e|=k1jKfC<5^Pdy$(t!oF$F7^Ld_DcHJZ@3&AJvqQz_Kbpz z%&mAwqQ;6=SRvmg1lDfFnh!cI?Z0)YSByVwUsv~wam(gJ<4IORwN#2k-7T2Atn#xKB#$KKR_Z173%k?Dc)Z3P&!R zo5mE5Vk}G}9}n4^1&5mr{59E&I67Qt_As^>ch1H$QEN=m>P(XSsJ0zAe6!oYyyf=C z7L4JsC{E99^MEwnv3pie@_Pv;Hn8%0w8M6;&6~^#o6qIu>^HV?HO4sD|pHzBuWI$~4!P6so{s0SLn?C9E;hNwprf6{%QLo}ELQ(EQHDPWPz? za)0D?$z+inG!_Bdm4z1wm(ojL-<%OlFH0}TlS@v4)X_B;q8>KaX*4CO^vmf0Qr}Hl zn{4KV;$N9ro=_(hi zH>uZ0PP?A$Pn+KzH|`taH&smcC&ixAOl9=KUWv5P9mJJk>(tMp`(OrS5CRGLNTear z5G#V69Z+iEj9`8!*>DA9loZ)qj8q(^lpZhPFX~Rt5En*_Q1Zox zks2gHQG2)p@uw&bK1H2ItH4)Sa*}e$2TTVkHDm%qU7`ySPWz13gwa_||1i72z99P& zRmdXBr=r-jFBlNAn>;0_3U4E_WqqK(h!IkEz!wN^(snTOnX^)Vp--nxB*&p&@m$$4 z#3;d2CLXp+Sd;k(ktLQ$9{`^qKa%k{F^>CM?RhRv(_JW@ zwW~RnG5gr7t9xMKtj{Ox$byNFdvEk&fVXD*B=a_jt^fEyhrjE_c~80K1nVpT_o z=87>%gHGo6W7Y>k&4Qy7de;qGldg@Gneh_!$4*~CvEj4+L(R8y$3MaT?NM@E~uAdEh zP@f|(dSN7|_WItxPtG4hEk!j`@YQ5xbS%2@lg4T^5PMh4Ai-{Qz(^o_AD(V5mGgaO z$}BD8>a?Hvk+hxhIP=v^_GCb$&ydUdA=cH|>KEeo3>K_kS+8+=!JL=^p@^#`ekut* z?;KW<{#qwaYaJmVj{jeWSgorW3C^VIwjS11&sOQ~H(P5_EqrXTIsZlN(anUp+pq+Q zSl(q|A)L$=5dlMjSRVlIAx{`q00H28#v(uiXh&-m=>%=jcR(Y+zbqsq8&pcGhY`V> zq!z#mFbZ!k>?RURUIhj~RydX@1X_!hC+;8~&VG!D5C^tC3XC%Rout^?WG7kMNEI%z zAA7yB(GTjmi^~i!qn=fELq4Y^LuWvlv>zyC*b9apat?~2tRp`|5M*0q73{>6Hta6= zF}_k%1b%?iCjCw3EniP&0n^WGL$6>YS>+OG5^!3ygdJj*mMO+Ve5EFcIsK2MtBh)^ zYr28DyHPCefrJP_ihF5scXxM(A}wAj6ezUC-Q7c62|?>_PhF|^OW*I$th>(1k9*IW z$(@|-A#nV=>(REiOLGv}*%D@MqAMcsjMWz>aD4u7u@r$_P(j793aA&yYx-h=_&- zirb7TkowHW2~+s220=%c4(y`#V7_Tj)%q0Bs^WlaK`CsoqhtXQ zfo*#so(nc;J0uD4Detgd5PJ@Gdo9`c2lQ#KYz>F>MXw%-TkrjEH7S1Y;KP-M#HhjX zmCdoOBfHnqV=s;(Zz`prhGkZsC#QFnFaGDgt-67I*>Sz9lg)D7-W)GRdx)A|ij+OO zoAZTp?rR-^3uuqRu6v8*Kwif;$#Q^e%drJL&-XRa0yFoq)Qep~mTe(hi~4lVdx!b@ ztCSe^fwTAYfahej0S^wZ0<-{!fnKt3!0)52|2$BWg_PaNdk^yGAVRR3V zr*|sYY{~mRqUq>bSTgb2ey(VGdYj#Ul}5C;4xuG0?00S>9yk4Mfi1op%JuOEffvt* zsR=^wSH7g&3I9;jp(#n0x%xwEYqfjF2fgUAJ0liVkS>qeR`NncGG=2cuUKA9 zmX|wpA%1$x=`BV@c(a{~4aNPH_L@K9Zdb4CoQhp(n%BRUvec_&{2+gI^tWYY;p53X z>)CU*qb{dj7R-)T+O1SpFbhi7yK`4i3=5w7`a znx-i-&9?9Qv859A?%yftwjF_On@N9HggbGywjozlpU`Y>p``MA5UBDQ4O&2|77=%d z>R~G?Ozsd6Ddp+ODd!?&cx>Pym@LNvv<|Wq1kMp7+5`h6SP_RH46y&gm}eqBv|4<@&iqt?yTROy?Z@cNgi0q{AJ1B1f*`cnCJYSP zO+#ZR;C8bCn0iF{>U4jtJy;ie>Y0id{p|B#F zI)#MTNhc67&{$Rzu>-EpvLT&=kF$T04#3{91BsE)Z!8h%AYwCXinxz(gq=z_2o2#q z$8A=&6%@OiM%0eVCGNL%hqewE6SGMhETAy^@bkdEM5_Q9-;e&dR0efuTrwy~$%44g0Ll^IODm03OSDck=sa!=TyOwkF^&Z%^1M~O2j+t>HEa>U-U6i9 z;30RwPJo6S4&VfUE0oIU1Hum<0muMkv2Dk>a`>8(Js|6ZNZ338 zwpvZR-7mI!6LYF_k7aI3Vt?zY_0)plr#2dyg7I(%gPfVMdv2ukg9BEsNoiMmU2H9K z`-X4Y>6gsU9Ja4JUq?IXu(P_GiFbHf`kqteY#fM+s0FV^d~Maz+MPVyzDv6#XLHk~PPR77+nPotJ%~XsH@66iRS1Vw4@{qYj z(OLTRrSQiiy$|f!eL|yGpKd*!ee?AB-1myM{*U3`1CddV7+WWM%ElwEI?J0+Z#aX_ z`WL5gjLb$r$eHtwr!}gkm0Sw6lV_pI`oNr_U;8#G9Adkm`U%d`zxgnNsxTUM6z9i3 z2BIQkxDS=v5u=<2;23;_69#0!z1Rx%N;hJ%ayjnsaX_aAj`hb2{vG&Co_o!@2%es9>bv*-AX4c!k=5iyi zxvurHqYJ%D%5Dm0RKPca4Ot(N$H7QeF}w!4g;%Dc2A|;ctBfLIISH8aP%NhsYmabX zgsL2auTTBPSi@u{o+7Wq@yu4-LsUQG2-+FBfA$Ur1K%*qz}$lzp{Zhb!I^Uv=+9C# z=LzN#teumJHPV~d&NR2=LljHO2ZlbSF z?;8~tFm{0rRbqy1SJMUYy2HJOAxWS6`L@F4tdO*>KT97YJi4h%Yk}YUPOWH%QHQ>- zz7O*rj$O5gxX=q)a`IVhc_;qjq}r%1pgTJ^JrhlPFgrRHf!=$%+a+sW>768rzo&Bh z9*K`PtcfFj=R>(sv2e^oE?;HX)au^p8#)okg7E>HHUel$jsN`Za10;@V0HM5v`RgG z?DW4Cxz~W(0CTzjWq0V>T|Kf)-wWsdXkLy@8Vt0_h(9-Y#pZ5Y&VaS;ulUgZZ8o6j zh7PjjdQ5TiMbrEQPWRzcu=J3Topy|D+0hl3nSAi*q&G3|L_gU+_w3k+zO7z`2W{Fh zvbu(aa`0&p3N|>ys$jw(r<|DaI58q8e7$R0M>f&A_mI9u#^FIxp$CFK!%63oGnK$Mw1?r>feB5P=WGl*Rox2eeMY7ehru$;u zu8eEO#pSmCF_g~;>ECN&m7g)6)_pDQoZg?WgM1!Par3 zfx?N+5 z_yNOVpIA|#XoM-}3g{tZ8@&&>1vEFOpxgwyPHzBqf%h;DDtUqZXJ3QDA+{V7lA{-X{=nFp|k?+K$*j) z7+}<0xYgtxR2xilIvx`SN6s!_(-45UAQTH0OE<-wL~LbJv2utZ=3|Tx0z9XSz6_6I znyBnX!k8WS08|)j7Vn1q&F)omMZDvGCM%-13Xf5t*c-wl)I%6UK8>;sGbk{kJVIyl z8Pq$NS?+J@F?2ESy=DN)jMqlJir74l)%=TMi`F%Y(RTbN>OW8$ncd_rSP=ahVG=50 z+mP-dW|^ay-a&`o*?`NX+^i2-gA zI-C$g*Xg*PXbVt{i1Wbu;pIjK#YXGu7rvcCe9d2BrSn8hk8skl;`+CRP{;9W-U~pd z^=nTTaE@0SaEnErgDnNih+tk@@8}--)nJoa%W6uC+z@B5`e{rg;B7L9A0IvX&0ZPhB z(z?|M3Xtsw0K9{fZB_5aLi%smdc@QF%dCZoK?Ap~Gh@elMfR<+gFQQKJ%b|}EKd4` z{I18FT}e(JFtahud@#D*;X(G1kra#GB_ZCQYF z+)}4A|K2$_?L^vbOiawkz`X9h)bIUlz1rN8u?HsKasr0O3>41#k3TjJD(#ZeW#H$> zr&wk;u2|1qwT!*&$s${s6uljGGwDmeY~2JZ%fv^!V|-#hU)3?l2>*HQy3VGg#vVH( zO18=HoY|eUsD4!oSiF1(&RjL&P0w+=f!wF#cOz=@ua7SKE+jeMc%#=9@*!_rZL5c= zWrCue*^`5ut#agafImPTb6rMP26eRb-&y4bs`X&b-otADRR25u^_cgu?E@d>;*UNZ z_BmdzT*-IPl+oKNdQU0S*(6RxB2;Jiy^wMonzsjZ0*z)1K(2^XR*AADJd1e@WC=$z z7Qv|yCmIUa2^pT21L}hhO&n7w2aZnPRk8y&PJCAO0*6lVln;PS81BkD;Y+=tfxj&> z;_A|Qxw&b7{3ddDrq|8t!!3xg4D%{7(zw68toHf$oE>hZL}R7!=Hd ztBigLHxhium!n)nYd9x#8J~k$LR{vLV85ekL=SN`m?EJQ5rjkW{P8_Vndw=~I&yM` zg)v5I(m$hjz@ZFB^f7pvlmV55+Q5LS_#*q5T$OqBMaD_&Pt+^g0}L8*Z7x8i5a~d7 zRjoz7p3_tDN8I745Nc3{{I?`!43zhadJ{9t=TWsVO8hBx4%$L6sZoe2<~3>zqUgeO zY8v7vFN3-TIVSAUJc{})P$B<9f`pqj&`2LHgd7NiGQW|B;0jzX5+8Abw})~Vmc*|n zE5K5DFNx`JQ*JfsFLaXcujUHfz}-s72aoaENwJU$K?ivpa-X+T^%BTMv|wZnflMR~ zuNZe#KI0`=ovq2^6x;gNR*LYBk=HB5=1xO5E-(1HQ0k`UeVl!2C&iTxF%4Zyrf#w= zuU4M=zi+#_91?W1rDV~~bx#+5`M1x}zNf3dLU?^~D``QieK{*<{2z25Um9{>Z=)@I zasAV9S)}fw-||9|xle( zsQjO&9h8x|Cqq(-1tb8la%}(@;Gj~NG&W`BV*yZrydn_r3y=hgl%19-hbziL0Kcu* z-G(4h!Ph$PpL!L2uIuG#VZ6=2upJ=5u4mSMJt?;Lmc4a!Qu_%@*>KHkn@niQMqMDQ zW0`+Pk2=U^j*K34BW7|37u|2>z8@a3ODp?IOSbo_*};78Xw;ECzu9TAesGcKR-N=N zD@nCG>C4zdgZMPZ!8+a4Gv*U6rhz&9k>5tng*6jjjn9^Q&fv|>F09iYpL|rQMc0r@ z6;SE>EE~>$qV=6l&4pG+Yw0IHJWC{AiJ7e1u5S=~pb4t;FnzEOWq2s*Q`bkMhM2C_ z7q-p?dShSnBQKS*va2hu^l}GFhw{hAH+dHXv=!VSZF1MrOI5Tnso7b(?YNp0mjM89 zsxsa(d*nj@U7s$MTaj~J)iyw!u%aD2`bd7`M6d!|DSv$Pv0$Z*>@8Rv@z1=mMWf}* z`A^#NhCtC7<`o|ol8hSS<#Q- zm(b0OI5i^bHM@kYgF47HR-ZwA;y$9dpwDob>S%PC@VmwodQl)EkD*Ki8tS=-R^F(F z82O1`r1=mP$gLy0BPrYnayEj(O;NuB-^$jdsKKV#%M=3qB8N%}g1U0miLc@N1tH`^ zh)m%_H3>u_oTOl&-GYszIH>--BiR)6O}s{V134~o)KY}Z&39vMl&cmFI4vUTdm4Cq zEOIYTaG%<}ymmtr=%je<&ip4=|N5Vj!*0`87sSd=*Xp#zGWH&g)WsLh%FPd!A#U^z z&E-;GRNLFd2X2|2K`Z87e*G_QdIxv)Rjt+s<@LQ?eHS9`tzJ#{3GW=Ns?Q>=N7=BFdi4%Kf!$+#T3 zv7uOoFLw=a8lVP(0%`#sa4O&?AP$-Vu#whc8~^zv=J!8~IRDQYW~tgAIu$HiyW40X zdVkwii-EX;UXnE=zN)X)`fO}?2ifLN^n91AE!LlQqsn-~4|r{x>9hE?o?e^c%v+=H z-2$^N3?Fjw%#j_@vXzvi(`xM(YFoJGuE6%YqD&{VT0O~W2T2Sjt6fDBzjeq)cSp*x z-Um9+%qOE4^}pxokGmOF<#Q+fjTQ^TrY;*Uo@dTATd*%S%-ufu_JZBqy5-OX7GsB% zX{Jm2AH!0g`#Bl}_rNbz^4jc}oK|`L@tEo6c*BQDl%4}&-)eLC5xt)oq8F;S-gO?9 zh?=Z2d)o@Ey`ucH{Yggl9YobbD8tMh*v&*$*uQ6oFUVY%*#`^-90NFM=I^8IVRB#C znVqzk+{0I@ZfEEK8)03uZxt_q3R%gJQ)n?iShH8Re;#>K#r%zkOOa?*^Hf3Bm@b|N z_&6qqvkqRx?PJ4~rqH8IuCfo}GJ~OnhiNiefd-I8+Ev9{kb5*=gT_O6t2H7E2O2--r*`{_I9Fj)wJ+X^w)0Z!gX^+ zwl@?D>7M%x-wUapvxaR4vFJ^RO3;4xPoz5ZGJ6mu1KZC3iPJ)g1YdB9$fp7*)(l}R zgsA{go&02iDe@0*I|d0G5gftYK{oM0s&z=SIZsR(Jder6bRj^TcHBM8IDH2$GNY553bGfAf-YFSgT}z_!50ujShLqG9vXMUb0_PE#RZP98x5NDcDc>02K?* zkPTo5#XBgY;3jc_dJA+-_?&bE8azKwW<$#7_o*s?=-eYYqr|~#^Mxwg%Ia2bm_uq^ zl<=<8&zcI+cl*~@D8dqlQ?(KEI9uior-f&(v?k$FsoUX})};Z@*>=qpn1@2g$V!Jt zY0s{;&%WRLa@Y8QPx?b|Z3~#_b6Oejz1$PGdfMkjYn9}t`_}rFRk)kuK-8m@fMflB zcgB5tJ0@;!@YB9gy{hHKKkGO6!pcqe=8@Q)U0`Wm3jlx}|5=ngU=jdDcm2D@{%=KF zUW)JUG$ikK*p_Vl0=?c{7=CwZ^@tc1G=J={dP0p{=vu zDlB%Tt<}0Fdb~r$&eiY1)xV}$?te>3`fnpQ+%Pm9$|@daI$ut&?8|eu&AL1I(Z;j1 zn3nC>SJ%Rib*b-+6IVOi)OATx9DG7xNxxwFG31{88ewrKx?q~iSvN;VPTb3O8n@SX z&z&B3)O%O_W2Vi3Q(;5LnW|hl$2w!Ce|a}!!qWacoZf%(Z^rWhgwe9QZ(a+2XW*Zj zeH!XfJxw^nzBAvYaKgo*kN27uLIq*3b#Ev3lNO&f7$tW|TOk53lut86=G1eb^R7s( zrcJFI;Fx28BLDy_9*_j^f;P&i$?S$q$m|6mn$Fq(H1E29*Y1OPjldCiOGTR#247ktE;}DoI!Q>FAxRw|JId7irx(2T{c7aBqVISS!|FP!;Ac zOBK9TIwST(`86z$#R6}E!{tp)D)od>aWdC8v6&$o;LnK*}%p@_25;Ejqo8jmSzJ9 zh6FMq;13~VOliD9mst=b5Z1-Nj^ZGbrFkz2NuOt_xFgoY_PCoUuvmzP`Qrv;~A>`#N~1K5pcL) z+@q?6D!=*OBsMOd<3#GheP_qw+tKNqe&QOM&XSeR$=WgdNSWvWb}12$&gO2REMT+QC9@x)F0>ofeob^ev!98;lt1K zmdStN(%~6(efSH0v|0`>i@#ZY9-hYQAislt;=2$9kbF@VSq`>ev`8jFJVnivVCaH~ zNt}hLEow_uK`a&xGy~v&mM-d@gfM9jdcNsqRRsx0t+!v^$mZFmRo&;M+U%`5A~3Tv zzw$|N#y0iprTH;?kA^Kv*3Qk1ge6&bhZd97BW`t_fotWiSGtef{LklV|BKttgKUN) z?rroR8lJrOE6Bg+$ITS4!RrXo3unz-M17OdzT}C51np5&Fuk%U-`W9s9kDU|c{PvprR+=n8?nfNV zT0IdP5?eE8+7LO|eaZGks7!yiomN42?b*z%iM*s?0 z2lxv(35Lp)1HK<^0_Xw&ws}YY?lZshG2X?;RFZC#p{FR?sp3gQa+?ufG1HtO@FeOB zHyKf<@*gh~{ZsW1Js)fiD`6PHc3`&AoguR53|0-~6>f}kUHK1&#@PcFpfkCSU%%0I1T{8+Lt?h`*mstu*fwI(&8OSz?#H&V_&R|AHBQ^xg;p&ZCR#K{eU5x5Op$6++>qisNk{^ZOYTDa<~F5we}TfZkcW3<(J&Iwx*R6 zLW1q3nx%zT4)iAc3fT2e^Y_&q9+6#&w+20v2NNHXeTlsr?uPm-*WX@v?My!Zi#B3= zIOBEim6IQWNLO7AW-Ki2oDq+Wm(2B`2OYxF;Tj?bRAH;muxsT-u_46Q^JE6eJd#<0gV5OevlCd8=^R?g2AwBoQ!0_pW^Ur4X*xaeLWLrC)?=BM!JKd-s zkN_PFgK_bp@RZO!ZKo)oqw_lVQC=ps3^r=;GaE)0wexa-qrdgw=iW|UHQ<)roJ}wa zxbSE$#$2U%efqC)NACLgtYLk|r(p~8wm`ir6V$NCk1f?F)XI@_dC}b++r+U~u9TV# z;({IqZ^_jovpg=D`pfH>bsQ?%nxe+}mtCOm$!rE-pgUxD19pQi%Gd++9ddnm(@OvW(C2f?7*0GDAhQ+Ndm z^u<($q7IlcZJ>|EiI%;Ag5u&4|-{2C(sz+0uFSNv$AY6G`~HIR8ck zQykQ6djx~|2d@uL*p)!8!*BA&6Ka0=iJv60tUrhkn$y(#MbH@RMO&6jU|kU#75f~ zyGi^-qY*_~_@L#6E}sw8GDo%uXEjZbN&;;%0I^wcMExD&w$MV|8o7<%K)wnG36GMi zpuNH$>Vc5|1V6}!Ag=@^q+IaI{Bd8 z-g-sT{bk45yFuQcIs@*_`lwZE@-{mDkoHLwPyLFry$&#J4lFAR(fsN4>#VniziV!) z6QSLvCPIV@aa@UCCl0ygXFgEB?h7t&($NahxV~yK6YA5NX4xEP(93m1#JTjPy6j1O zK4$1;o1M+M67G_@L?7_0k3QW(vb*oJy(Hft#RXBLXsqWS*n8dDCR~1;;W`vEJuUIx z9ces1=pl@Xnwax=n5a6F5x5xtXSzEeAoF^xX(C6)PYuvDGEz4W_i3(W_>6qj3p)p$Mw$}K0W`KrU-9CMmvL2o>iDG5 z%M8M>tr002S$To7+dVBXRvr;Ws{yL@Qx?VHR;*? zW=kREKY+TlA~*rK0XPG*0PF+Ef#zlJ00NFG$XEleL%TL4$lznKc6NvaKEw(}qKPkA z8XF%H=W0!A+~tO%a?oM)cF+a*HTtabVQ@V?MF|ha%<&Zcp;ff$<79~4>~6Ug&;-3l z@jYY@>$%cn#5nVg(r@HWRuwQAG0%|)KSF(B?*YZ39t@NHMhl4xPDf<{m_zK$;pn2{#mD2b71uX zY&vUD?F=E9)sBwEaT#XtV8k5rBNBk@XKzHVNOjUaA~hiQ=(8vn=mh5gZUgcRe;B)r zh!woSj=@8PZ?Oo3?)(##3&>DkNJ<2Nt{Q8@IH|~qum63YAOXX_2wUAfix;jva^l3ifJ#K{5HpR5zrf;5_v#+(y_)F^1m|Vo1uc ztVM8lX>IHC_WiOpo zxYv@esUzZ=C=#<97{~lvpsxDk!fEzKGeVKmZ1Sn5vL@C+tH?^Q$i|`LhRRJ<_qb{c zQM|*}c%L>4<2>Ih<)<}90*;rNXeWC1W$hu?cqFADNp7yhi zb+izusqg*pLX2Ttz{>Tr#+xHQ_HI7Ki834F*pEbipGR%1T>xLqen!S;q;6(0^FruSVmFNvs2o!>W9+vxNPB$F zdskpWFWzM$F~4KYF00sUEY2EMo<6(TKIigB`eWNK75n+&_UVb18J9^GajXGnsH5&2?S|{F0Ix-0Wtv> zVd8)NaBwgn50E5(T9yZBKc4+>H<}zqAr6lgTt8>w>1i$bG1U2?1 zkO^ut{T&bn-^|EUT7&GIJE%Af%BDdTaGyR#v3zMzzu%Hx+n_Za3%9f&-} ztnxIRNqeEB1v6ln0+Wyz<~9MZBBy6vfdWK^v|Hr^^_cyw=m^c8-f*BS5BXg>)4Bth26bbFqrXA}d4I7s&@=pAtUr8@!rSk|qsw2oGwi^Br zrif#yVv8E*A0oJ6PH?vn^KmWQR5dK_A~%VMR^jv5r0uFZdEZHs*h@Sf(EiX z;!!$iKJ|U{_3?uD{2yDt)V7`mW8dK5d;wvD*YBuu^t30z zvjPh8dg##sd*XwQx{eWt|1Or(@(g=%AyJ>|<5#p_Tf@t^P?1XYbS&{W(GnPPW7sr5 z(zR#1Ra3mdsEmVuY{3M?4HkcE+RLjqxp?NIr)@Huw%yMq;RXFkNJw@KYc0Aden#rCKhmd3w?mt{;l?FF!7bZJ&9Qd}^K}#xYlmX> zS*flgP5SPcuf`chT^V*GE2gvz#i5f1Ka!M(attUj0T*J(akkGDBs++xe<+oP>X&~J zr$O4VD)U;$aWg_@UG2@k74-N&3yTB<07#%FX|4;vBmsN@s*q9H9RMzb^lvxulZO)u z*x@N2ie-#GNS8Nj=X67NfM8s0wKI54E)#JP*T*aYCLk{|Y82C;Kk3^QZ$gLY!wL=H zKlEf}Ly!-B6zB<|)BTQ5f@kKg%l(4L%$-tvB2_xl2DZQ|85@-2q2HO86jx!Oxh17d zP_5bPpfIq*T$$nsq@I32$qO1hXR7c4WO4mL*1^-R@%w6_w&F}mcbgU95|8E|9#K!= z&SYF~mO_P5#UtMn2zp0pGU$`&Q05rrFYz8zooI-^O}~SRLz%Dw5V9x|>m$Mvafn-p zn1mr1I;gkMX;wLA1ZKo{#$Jb-2|94^5wap@)f7~Mq+e|_>hAIrVj(v9)NI~<~VC=o;U_KM@@n|!F{YYh$9O2QVywN1^SdpTodmyiGlgcxkDsN_14BorYI;k zPwfw~nOmj#8r{fWqh_KsrSC^AWPs?ph8L<{?5L@MtQ4zKR}jR7b6N`M#Caxl9o@-) zM7o2-376F6;n&4yDN*oU;&uuZ9xxw39s#$Bh2&i5Gf4_%17bk3m*NjUycj{DBDO8d zkY2znR{v0q;qJ?OHQyraR<-nQA>oop^|R1EUN+GVq%GA|J_`COd9Cpu$iC;mwKOT|T7w<-#2A5hjlmc(j;22QT_QNzBI8N6eKQ zYZ?cR7P8eF-MrFP2|rz;vMq^1pLZ7?=(I-dY0oi}ByAd2vVEI!c{IggCMkMK-kqEJ zA1%@MQF9M+M9dmc_6+B4 z;pH@M=J(Xksq)N$*jMRw?9K81@zJ#7VTy@kwEaQ16OK(-`+vYH&+Jy$W5V54$2 zcc#|rWvF-j4)insQyrB$UBN!>Y7~R$4SjN2F^M~dHtB9jdNgue-zj-@wA2_EU)kO?#X7kvn6k5kycwbd(%y7HoriQ)*-q5|m z$^+UddC@;2Uci;vZa^DkI?GyF4{gC9DAvIrvuqWA!XueR3b7C}T~*NwOrjwbqoD_B zoDWuCF+EYy5xg|luc!~%J1eh0oCQGN_9WVkB+fH=>5RuVvc z8D7VYft?dv{cFS*8HMNWS@^_%uPZo-FFHLo>X6)m6KyC`Y-tuN<@>cniS9-CO@4Lh zr|{@h!d?{(R;lJ~@|=|Kw?TE4DT{uKk!Q&v&Z3Rk!Khfob?!6tDJh4RBb`IP!3n}D z!CC~Nm?AhptgE(!f{8z?O`w+~1Gr^`*S1q-2<{yn3>nzT@jHUMK@=1 z=h7Ay4Go{4+&43YbOYjP3B>=9*O?Mu? z!4t#e9#wP0Z4+vcZemXePm-;%ulUzVP}F}sC1N0|i47vK5Z2r};xr;&@R>A*^b*>r zJwz1DAEDGDZ_US3HlaYGUm7Whw~`i36{PZVf#w73&ZTJW4cPAs#@e2kqK3FBZ-ecGjVil9Ln{}|E2K)%MP|;51^Qc$(>Je~ zn;(0>`HRKtgK69JoG+k54xjTW*F34{9N={7Fs$BZEJ&*Q7!(~CjKu_a2VOvacOzsf z5{%vD%NMk+`nc7R_2c|4+S1I;q#FDh*3(f*V!Ecl8 znBHN!spTBM2+iz#?w#n=Tp3PM?A6@=cyVzD^A2$XBNXz(*aaa@XEx5oduODbV9EyL za_@1?vu>47&I_8VYn4{y$L}@q)=0CUM!-tvwDY9`iD+QG=&5LHYj6HhF1*|$^A#g4 zMK^7p!AjKWJU&WqSG%n|L2gK%k4bb(OD~t$eyTtBqdbb zbyIh5{FTm9jU#andpA%;DHHuO#_ux8qgo!YWZi*O=P=4(YN!PD8>o>H< zl>}yQtv25wLzH=C43w<`^lK1g!T{SIhe27b*@SGW#! zV6YUj!Rd^>in8Dux{cBUsPZgIi3{zceN#k1e$2vvo5A%A(s66h;RcuFj?)Jt;>&F; zo8qmm`&oDt<%}P2v+e4TjMTPD6$W%msygSG)Y#MG1alv?NAx196X6{5lJ+jD1#_Bw z51+(=V+L`_>|Y28DxPx!O-71ER#;bDr$`xl52?-Tz;fa5g!i%UkhldWRawOJ;v;+s z^6b(&o`$Nq89-sF?z$~Gu}r>lyH;V-%hnS!w~k0ZJo9x;KADvKn)L)@fGM2C zVX`4|%nVFEvVr*#`vmR6yoC$EeC4F8{K2Jiz=S8*|5)CtTyzrC9iIl$j%dk(=bvcoWA%JgsXicDREdQoV%8TeROj+%CC; zq0X9rz;fYwraRy}B7VASVTXbd)@d+9|0%Zzh(=HM^Z^3Wcm3jCjg;=5t0vJe(}9*4LCmX|aPvQyzc31OAVpmYnSeS6$2ULI5++!7Ftj5h5G~);j0!hR zN2I6r$gHkRH>7Xtsj#kdxNnXBF=hPYG|icWOf1orUKbo zz^KtFz*j(yxdlKGu;;WuMo)Ii;Wi*oX5BeTCSTUY@skV=z;jO6w6sAsUz{7PiEj*L zo(zkt`7j0z%PBA#oONiumgT;pVlmSz=c0IFI!u8CYGG(7u0j)7sz5!&Z#GEz0McQu zS*Z-Z#yG0%Ddi&tE8T+0(OxMg!Cunt%CEw9%|;$S4k6Q06|$jtriuJCq)fCxJR7fg1Y&O~( zN9JrtwV?-u>Zk$SE^#^DP0IA!gZD=#b62sS;Xf91@te^*7FUQv7{XE_*$7jxs;gFl zbzWIjgX7!k;9%Q0?x zHYO{nzVlw;w~%`0$O|iF}<$W40Fbl~b=?gSia#qWQ9J#zf-57(C*pde!>htre zY_KnXquM6ugVjKa1U7xvN-k>uI`+;#uQOZSa&4n`fFbbOp{#gwY7^*dijSig9+m9x zwhPx0plx9Q5qbRy4#HG>nPxVrz4GFfjcd>YjyGx=t_1SB*Gd7MCEz$GD1$Dy~5Lr^DCSc_$IEEAm?q9 z_=PV;n7FBeM4o>X{hSr2J*u_XMp#z0Udk4gHBOiE=RjjcLez zG_x@rTjV^o%dI$cPf#xWXJp%rQmtRny4SB!x??DfX4*>~`pZ>=)CrZFDTCh<6|2`y z-1hvP@fB6!6X>}ga=^9)`+Ls?$8E>wcKmY9+F!G++oEej(uU)@*8fgYANs<((CG(mpF1gPIwu3R9ppmW`qX0?RtB+=l32nSv}~vutgJE07Gj zj(jnsnBJ$51ZB+amEQp|qIF7fnFt0`{wGv{UZ-pcZI~-i`UpKvQE(^CmLZ4E!AuyL_>PNCzq1kjHC9pe1^k=o?n9#G=2pYewxyA_ zXI<{M#)_T}j%GSo%FcMJx?(ReKAiYY&Sk}t58$_P{4i|XN!BBk?b2?~5V{wI5rm+* zh~fDO)z64gzL&}@qC$8~r5*WZK1+2L87o;)yNS8BY)BMi53Fn?)YYill&+#W3PI>ZeQl}#;WfAxAbz<@=okB`wDnLr)yL0IBP8VZ|QF;7a%P*(cVLzSP+T z`?kI^I>eFN+c1N)`q0Vi1D#xK3~peVm{tE*hS9*E&2@VS#|7;@xNp~I>nqaZq}fYz zV3~=)KeB(e()|1Z*EU-F0S~Qib1vB4Xmhf#?lo&YF}Koaq9h`z)Uy|8H<&Zse$xzF z@u9@eB5@K68dA2TKT&!JxyUR8@}=Efo>DmiNN-m>1N}q)rj!Glp{oF4&}rH}g=(<+ ztl{yW;0lI;ye@E_j#r!lzoGFJI=~fk_DU+yblSYaH?V+lRj~^q5vVAzKtbIP4Yw25 zGJC7yT?^B zTgN~+J5aue8Q})Zcf@b;VZ1CVdHyOP8M{>sSGkJ~U4|14ab`C!QeyDR=hbw{%zB8-yZbD`pjG!H}rPpn8~a z0vGdvn@JR5wsW5m_u$^}$|*LgYrII(BraAMOhKqfcwfk;Fa)jvnTyuor;vUjA97hl z8DxjF!rg%oO3cVbsGE`j^>)ma#YYr<#L!JGhvpLnlCB2ZvfIKBv|9sNLNxus*eUV3 z%GgV|g=c1qrVp2#ebXJB7mt)YD2Nn4zBF1mG9TZ+_lDYhb*Jm~4#~^9@w2aPe~W^8 z|GD*7^C(8VtgdDPk&~<%Y)1cCRH{tMyKp-@XejXd>H_r%es%t|>MvL`k1w6k^XA=G zqk|6I>CoE=^(+0Yy!${Q?$N(!wZv_xmI-xE*nelItM^Ax?4jp=tAr-`BcWlIW^k-$ ztcNvD%j0yGfE?(;Eq$Po=c!ibZD``3-^w$I2s_#Dda^hwd?dQtS6n|8v} zIBy5@Wx!&tJL6UO(3!og`uHQoT0--}4`mJ!?t%wJbqmQM9QnI%8Gw_?ou{J83_i}2f1%ZI%F{@Vtu(&9Q!Ye8+nb=uX4;Sw5c zTkxg!4b`m{CQQp)`~5%9{F>kIzI|q!h~av5e1-GJ!FDo(_sTJ3s!@>Z5jb(3NAmbJ zewBO4Gi@}QbI^TZlf|kUI>c3Vo6sCo~_B8g2z-{{4?I^`?09A^TNrJjH0GC1FIro z<0FTKkx~K+zBv2&n6g4V>m}FO-&a$n|t=qytoqDMkmly#; z5(w_@?(XjH?(Xhd+?|kMfp~(1ptaq0*L~Md-t*=80qc6kTGyO&%yBPg@?u16uupmZ z5l+UI@pK3^p!2v_1#e>S+!quOS#sy@5t2i1akC5DUcJP}6uGd@$wvhIJ3S1#2azj? zgVF?iBP0^MOk87cH(s;14NfcU)ir2?VAhOW^JrC8m_I)2D^>v>^QfN zEqvaOp39k5+z)9Hnr9$F0EETgV({q?9cmlL=^*V$H0$$?<8;g3Z$3vhX z{8~Na5Td`~FQzJ9x%pFc1sYG37bk(9lgcGiMT5zl@Oo$iSyVzDno9qLI3=dH7ml)# z+}Synwt&6f>P4tQcjz|AHc>QfLwp0|OuLL=0Oz+mv&mis`>hGZys5L zSwKXPes1Zl9Ffwf$*WlM+3uFcr?e|2@yRr@)&eWNg=k8!UK}Lu;TIN<$PWmYu!_|2 zR26la!BPy8li3g?-=^nYO(W9Mqc~zy2y&x0Fi!TkqBQnD%a*+VOLHe4e-BDfwn= zdcNdlUN$241KvJ)HsfUFj-O)1Cf+FHZ~xPM^aiT>Cpl=cAkAvUq68LuZT@@M@8F)P zWzY2h@9|I0d+~aU-{QKe+Q~l#Oc&2R=G+bS;DlX34^t@cIGCO6ZpS?Li(_cvT z>rzzpN+XRUEslED%w45;r@e1@-&VoE1xUcAWr|=w_`-@Z-w04)d4;D!L}B?2kBJ~1 zu z+ZobVeoOybOl5bK9b33lO}2$pf?;2T394cXE9O8ewZlGe$}4wT(se!8?@n{5WMIq> z@zZu=PnMs>nt$7|U0X3jGRvj3-JIgSkm>VP%kEx*?3^uHRuG^~KNa<)cz02nSHv z48)V&X9zUx&5i;x5Z1VzC*1&5qke>71=8v9UI*p{gbn+32MoGYq=(OaDOI8s{0ti` z&H%nyX@U&`e=qaH*gy$unNp(ATWj-DAE9*{snTI$F!EWHump}6A@fQ6B_1U6TQmS~ zEvF9wZsyB40G|_TWvW4T)Fsv&)|=6z@JwQTt4--H& z-N0~~`c(Kic${lz|Bxp?L zJMX;zrk@3r*OQ*ZE#>W~XYUG2Lx$M%?$1jijd9cEs^QD3C)kVgJKP8erYhEkf7n+r41mp!j$ zPmQzLa<{#%Yu2}3d%m~eBZBQDRkxIh=Lkx;Hr=E4ZpP8w6GYt42S`V6M@bTw;Knw%B!rNZg|pcD(P*xZ81WaY?Q z6wHeFcx{HOKiE&<>Ftu5;n}CIM-AcgQ$cg3)X5dwzQUz(UPJ$!s{TrCx73=p4VCUh zQ2&N5xrFjqfb>wIC22v?9)z3FcZ>rF5vK)g)XSc-<8k(4H};TT~TASBql7dl(*oC6Kaw5ugqj19@`z;5mQ=)uujg`!M4hPh>_>>9a4hzf_%Be} z3a5k(;KwpRQWdnnx+(desQKC;GEFpYQ(0OC$|Oz5>`Ua5GUfGP8YDB+C(-{1?@_wo zyQFQFFG7ge%wkQ3QhQ``AS!#Rs_HQPogZ@PVD{Yy78FHYDs)n(+JwBgi@_98Ku6AG z2w7#{ldwloWO8lxQ5dTq#(b&wNtdSDD31ge%;Bskiz$en`{=U5KSsAt+n363tgtCVO z2<}mIq`nD(_LnpefUd3<@Q*uG$#4HttNO{g1@=*E)r<6txBTk)2)Cs|Pf68sH%7HO zKLx)GY01w){0ts!^j4DbD`=HeZ}UIjr>e6VGBtMDcrZkI@~_E{NbkAtHjffHFs81* zk{L_Ko<7-LtB(?^%UI0cHvgXDUCxC^qpEw^IL4R*({tnCq14V7%tD1O(Y@hu?%0|~ z+>g9dYg{33s@*puW6JZw(cH0oxh6~R(rylD?AxLH!+wv+hs$_5^uM=(hu@gabNQOW z`g6kN%VP1K#ZP-Bm@K8BORrO&@LvNxj;s>HD9XUp8Iy*iI>ZP&w59YUQxz z%Vv6=vBA~#(7o`0hNT&jug3>$3JvL9v!p^Y~GDvmN<>3+S&${)P>4UDvV`n3y%V##bpcbY2$@W6SpM~1kwIs zS3loyh_wsdgjzM(tegq#tH_-(@xEUuH4ZlC$^iC{XSD3u*Afe^EJk7!{S2S7K`|g<7o723dXkGDX zM1Dtie2v$jzn}wH+Bj@K`L~W+v|+ZT{?ky=EOzzO(BJ}P{ac}~Wqk(e9^G}~T1rt~ zJ$aVXfms>Rda~XVmC{-tU5~SFt57`u)~#u1zeuYZR4A#^1}0v#+$<% z(*h^t?8%+R830*s;jhK7N?XkFrg5E}ghY(x~k^9$}I&T}-a93)k=@8|l% zScl0TY3kR@5HOox0QCp5Z9Hb4A9;i5Dg zjM6nIb|m;h7+q*Judjsm5Y1@ElG`Y(@M$V|cYbY*8nFXiPudb+GU%~8xEx?+w7qjz zP8N82kIVeLlsePWT3_zt0hi?`MUlNkQ$3lWeTZI+%*S14B@T&TIz}!LY)08dGzvzM zZDno?yr!orJrSx|MoX^pep5{4&}M(5%yCAEo!#Qb1)p<#{(^kEx6VdIpiFqq#yvI> z5xE_;pO_|58986yEzcYDZ`WH5e0b&H89kGbgOPSat`M7XHDl%IYjfuucj7x2gq)4j z7qDf1YFX3Ej`2YiJA`u`;{A%d&sX@T`j~G>@EOem6Vl40!ht8*wlDBG&b&gnEw_hV=x)#@=}z#)9X8 zUXOCra83R{)9scv+&*~UP3O_&H|($o6+1G?4Eig>?ig0|ON-s_-)<>m|AePA-nO2N z59-tmGI9UzXNA$w�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

D;8uFU*nIdY{joBcyqr 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

9XSwEmN> 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

^Ib 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 Date: Wed, 27 Nov 2019 18:18:09 +0000 Subject: [PATCH 02/13] Create common trait for all image format encoders This ImageEncoder trait is currently minimal, but establishes a uniform interface so that all formats have native endian encoding interfaces, which is necessary for 16 bit per channel encoding. Closes image-rs/image#1076. --- src/bmp/encoder.rs | 14 +++++++++++++- src/ico/encoder.rs | 14 +++++++++++++- src/image.rs | 21 +++++++++++++++++++++ src/io/free_functions.rs | 30 +++++++++++++++--------------- src/jpeg/encoder.rs | 13 +++++++++++++ src/lib.rs | 1 + src/png.rs | 32 +++++++++++++++++++++++++++++++- src/pnm/encoder.rs | 14 +++++++++++++- src/tiff.rs | 26 ++++++++++++++++++++++++-- 9 files changed, 144 insertions(+), 21 deletions(-) diff --git a/src/bmp/encoder.rs b/src/bmp/encoder.rs index 69d3483285..186a04c4e3 100644 --- a/src/bmp/encoder.rs +++ b/src/bmp/encoder.rs @@ -2,7 +2,7 @@ use byteorder::{LittleEndian, WriteBytesExt}; use std::io::{self, Write}; use color; -use image::{ImageError, ImageResult}; +use image::{ImageEncoder, ImageError, ImageResult}; const BITMAPFILEHEADER_SIZE: u32 = 14; const BITMAPINFOHEADER_SIZE: u32 = 40; @@ -213,6 +213,18 @@ impl<'a, W: Write + 'a> BMPEncoder<'a, W> { } } +impl<'a, W: Write> ImageEncoder for BMPEncoder<'a, W> { + fn write_image( + mut self, + buf: &[u8], + width: u32, + height: u32, + color_type: color::ColorType, + ) -> ImageResult<()> { + self.encode(buf, width, height, color_type) + } +} + fn get_unsupported_error_message(c: color::ColorType) -> String { format!( "Unsupported color type {:?}. Supported types: RGB(8), RGBA(8), Gray(8), GrayA(8).", diff --git a/src/ico/encoder.rs b/src/ico/encoder.rs index 76aa325adc..8b98b11ca7 100644 --- a/src/ico/encoder.rs +++ b/src/ico/encoder.rs @@ -2,7 +2,7 @@ use byteorder::{LittleEndian, WriteBytesExt}; use std::io::{self, Write}; use color::ColorType; -use image::ImageResult; +use image::{ImageEncoder, ImageResult}; use png::PNGEncoder; @@ -51,6 +51,18 @@ impl ICOEncoder { } } +impl ImageEncoder for ICOEncoder { + fn write_image( + self, + buf: &[u8], + width: u32, + height: u32, + color_type: ColorType, + ) -> ImageResult<()> { + self.encode(buf, width, height, color_type) + } +} + fn write_icondir(w: &mut W, num_images: u16) -> io::Result<()> { // Reserved field (must be zero): w.write_u16::(0)?; diff --git a/src/image.rs b/src/image.rs index 1512064bef..a1eedf6468 100644 --- a/src/image.rs +++ b/src/image.rs @@ -539,6 +539,27 @@ pub trait AnimationDecoder<'a> { fn into_frames(self) -> Frames<'a>; } +/// The trait all encoders implement +pub trait ImageEncoder { + /// Writes all the bytes in an image to the encoder. + /// + /// This function takes a slice of bytes of the pixel data of the image + /// and encodes them. Unlike particular format encoders inherent impl encode + /// methods where endianness is not specified, here image data bytes should + /// always be in native endian. The implementor will reorder the endianess + /// as necessary for the target encoding format. + /// + /// See also `ImageDecoder::read_image` which reads byte buffers into + /// native endian. + fn write_image( + self, + buf: &[u8], + width: u32, + height: u32, + color_type: ColorType, + ) -> ImageResult<()>; +} + /// Immutable pixel iterator pub struct Pixels<'a, I: ?Sized + 'a> { image: &'a I, diff --git a/src/io/free_functions.rs b/src/io/free_functions.rs index 03d3d3dea1..c566a1004f 100644 --- a/src/io/free_functions.rs +++ b/src/io/free_functions.rs @@ -28,7 +28,7 @@ use webp; use color; use image; use dynimage::DynamicImage; -use image::{ImageDecoder, ImageFormat, ImageResult, ImageError}; +use image::{ImageDecoder, ImageEncoder, ImageFormat, ImageResult, ImageError}; /// Internal error type for guessing format from path. pub(crate) enum PathError { @@ -142,30 +142,30 @@ pub(crate) fn save_buffer_impl( match &*ext { #[cfg(feature = "ico")] - "ico" => ico::ICOEncoder::new(fout).encode(buf, width, height, color), + "ico" => ico::ICOEncoder::new(fout).write_image(buf, width, height, color), #[cfg(feature = "jpeg")] - "jpg" | "jpeg" => jpeg::JPEGEncoder::new(fout).encode(buf, width, height, color), + "jpg" | "jpeg" => jpeg::JPEGEncoder::new(fout).write_image(buf, width, height, color), #[cfg(feature = "png")] - "png" => png::PNGEncoder::new(fout).encode(buf, width, height, color), + "png" => png::PNGEncoder::new(fout).write_image(buf, width, height, color), #[cfg(feature = "pnm")] "pbm" => pnm::PNMEncoder::new(fout) .with_subtype(pnm::PNMSubtype::Bitmap(pnm::SampleEncoding::Binary)) - .encode(buf, width, height, color), + .write_image(buf, width, height, color), #[cfg(feature = "pnm")] "pgm" => pnm::PNMEncoder::new(fout) .with_subtype(pnm::PNMSubtype::Graymap(pnm::SampleEncoding::Binary)) - .encode(buf, width, height, color), + .write_image(buf, width, height, color), #[cfg(feature = "pnm")] "ppm" => pnm::PNMEncoder::new(fout) .with_subtype(pnm::PNMSubtype::Pixmap(pnm::SampleEncoding::Binary)) - .encode(buf, width, height, color), + .write_image(buf, width, height, color), #[cfg(feature = "pnm")] - "pam" => pnm::PNMEncoder::new(fout).encode(buf, width, height, color), + "pam" => pnm::PNMEncoder::new(fout).write_image(buf, width, height, color), #[cfg(feature = "bmp")] - "bmp" => bmp::BMPEncoder::new(fout).encode(buf, width, height, color), + "bmp" => bmp::BMPEncoder::new(fout).write_image(buf, width, height, color), #[cfg(feature = "tiff")] "tif" | "tiff" => tiff::TiffEncoder::new(fout) - .encode(buf, width, height, color), + .write_image(buf, width, height, color), format => Err(ImageError::UnsupportedError(format!("Unsupported image format image/{:?}", format))), } } @@ -182,16 +182,16 @@ pub(crate) fn save_buffer_with_format_impl( match format { #[cfg(feature = "ico")] - image::ImageFormat::Ico => ico::ICOEncoder::new(fout).encode(buf, width, height, color), + image::ImageFormat::Ico => ico::ICOEncoder::new(fout).write_image(buf, width, height, color), #[cfg(feature = "jpeg")] - image::ImageFormat::Jpeg => jpeg::JPEGEncoder::new(fout).encode(buf, width, height, color), + image::ImageFormat::Jpeg => jpeg::JPEGEncoder::new(fout).write_image(buf, width, height, color), #[cfg(feature = "png")] - image::ImageFormat::Png => png::PNGEncoder::new(fout).encode(buf, width, height, color), + image::ImageFormat::Png => png::PNGEncoder::new(fout).write_image(buf, width, height, color), #[cfg(feature = "bmp")] - image::ImageFormat::Bmp => bmp::BMPEncoder::new(fout).encode(buf, width, height, color), + image::ImageFormat::Bmp => bmp::BMPEncoder::new(fout).write_image(buf, width, height, color), #[cfg(feature = "tiff")] image::ImageFormat::Tiff => tiff::TiffEncoder::new(fout) - .encode(buf, width, height, color), + .write_image(buf, width, height, color), _ => Err(ImageError::UnsupportedError(format!("Unsupported image format image/{:?}", format))), } } diff --git a/src/jpeg/encoder.rs b/src/jpeg/encoder.rs index 97ddfb4a34..7e281321aa 100644 --- a/src/jpeg/encoder.rs +++ b/src/jpeg/encoder.rs @@ -7,6 +7,7 @@ use num_iter::range_step; use std::io::{self, Write}; use color; +use image::ImageEncoder; use super::entropy::build_huff_lut; use super::transform; @@ -631,6 +632,18 @@ impl<'a, W: Write> JPEGEncoder<'a, W> { } } +impl<'a, W: Write> ImageEncoder for JPEGEncoder<'a, W> { + fn write_image( + mut self, + buf: &[u8], + width: u32, + height: u32, + color_type: color::ColorType, + ) -> ImageResult<()> { + self.encode(buf, width, height, color_type) + } +} + fn build_jfif_header(m: &mut Vec, density: PixelDensity) { m.clear(); diff --git a/src/lib.rs b/src/lib.rs index 14908d1211..b0703186db 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,6 +36,7 @@ pub use image::{AnimationDecoder, GenericImageView, ImageDecoder, ImageDecoderExt, + ImageEncoder, ImageError, ImageFormat, ImageOutputFormat, diff --git a/src/png.rs b/src/png.rs index b9d48a588f..1bbf1a0ddc 100644 --- a/src/png.rs +++ b/src/png.rs @@ -12,7 +12,7 @@ use std::convert::TryFrom; use std::io::{self, Read, Write}; use color::{ColorType, ExtendedColorType}; -use image::{ImageDecoder, ImageError, ImageResult}; +use image::{ImageDecoder, ImageEncoder, ImageError, ImageResult}; /// PNG Reader /// @@ -227,6 +227,36 @@ impl PNGEncoder { } } +impl ImageEncoder for PNGEncoder { + fn write_image( + self, + buf: &[u8], + width: u32, + height: u32, + color_type: ColorType, + ) -> ImageResult<()> { + use byteorder::{BigEndian, ByteOrder, NativeEndian}; + + // PNG images are big endian. For 16 bit per channel and larger types, + // the buffer may need to be reordered to big endian per the + // contract of `write_image`. + match color_type.bytes_per_channel() { + 1 => self.encode(buf, width, height, color_type), // No reodering necessary for u8 + 2 => { + // Because the buffer is immutable and the PNG encoder does not + // yet take Write/Read traits, create a temporary buffer for + // big endian reordering. + let mut reordered = vec![0; buf.len()]; + buf.chunks(2) + .zip(reordered.chunks_mut(2)) + .for_each(|(b, r)| BigEndian::write_u16(r, NativeEndian::read_u16(b))); + self.encode(&reordered, width, height, color_type) + }, + _ => unreachable!(), + } + } +} + impl ImageError { fn from_png(err: png::DecodingError) -> ImageError { use self::png::DecodingError::*; diff --git a/src/pnm/encoder.rs b/src/pnm/encoder.rs index 00fc5e8961..44a01dfb73 100644 --- a/src/pnm/encoder.rs +++ b/src/pnm/encoder.rs @@ -8,7 +8,7 @@ use super::AutoBreak; use super::{ArbitraryHeader, ArbitraryTuplType, BitmapHeader, GraymapHeader, PixmapHeader}; use super::{HeaderRecord, PNMHeader, PNMSubtype, SampleEncoding}; use color::{ColorType, ExtendedColorType}; -use image::{ImageError, ImageResult}; +use image::{ImageEncoder, ImageError, ImageResult}; use byteorder::{BigEndian, WriteBytesExt}; @@ -272,6 +272,18 @@ impl PNMEncoder { } } +impl ImageEncoder for PNMEncoder { + fn write_image( + mut self, + buf: &[u8], + width: u32, + height: u32, + color_type: ColorType, + ) -> ImageResult<()> { + self.encode(buf, width, height, color_type) + } +} + impl<'a> CheckedImageBuffer<'a> { fn check( image: FlatSamples<'a>, diff --git a/src/tiff.rs b/src/tiff.rs index e2a986fa13..2a9c895b0f 100644 --- a/src/tiff.rs +++ b/src/tiff.rs @@ -16,7 +16,7 @@ use std::mem; use byteorder::{NativeEndian, ByteOrder}; use color::{ColorType, ExtendedColorType}; -use image::{ImageDecoder, ImageResult, ImageError}; +use image::{ImageDecoder, ImageEncoder, ImageResult, ImageError}; use utils::vec_u16_into_u8; /// Decoder for TIFF images. @@ -129,6 +129,13 @@ pub struct TiffEncoder { w: W, } +// Utility to simplify and deduplicate error handling during 16-bit encoding. +fn u8_slice_as_u16(buf: &[u8]) -> ImageResult> { + zerocopy::LayoutVerified::new_slice(buf) + // If the buffer is not aligned or the correct length for a u16 slice, err. + .ok_or_else(|| ImageError::IoError(std::io::ErrorKind::InvalidData.into())) +} + impl TiffEncoder { /// Create a new encoder that writes its output to `w` pub fn new(w: W) -> TiffEncoder { @@ -137,16 +144,31 @@ impl TiffEncoder { /// Encodes the image `image` that has dimensions `width` and `height` and `ColorType` `c`. /// - /// 16-bit color types are not yet supported. + /// 16-bit types assume the buffer is native endian. pub fn encode(self, data: &[u8], width: u32, height: u32, color: ColorType) -> ImageResult<()> { let mut encoder = tiff::encoder::TiffEncoder::new(self.w).map_err(ImageError::from_tiff)?; match color { ColorType::L8 => encoder.write_image::(width, height, data), ColorType::Rgb8 => encoder.write_image::(width, height, data), ColorType::Rgba8 => encoder.write_image::(width, height, data), + ColorType::L16 => encoder.write_image::(width, height, &u8_slice_as_u16(data)?), + ColorType::Rgb16 => encoder.write_image::(width, height, &u8_slice_as_u16(data)?), + ColorType::Rgba16 => encoder.write_image::(width, height, &u8_slice_as_u16(data)?), _ => return Err(ImageError::UnsupportedColor(color.into())) }.map_err(ImageError::from_tiff)?; Ok(()) } } + +impl ImageEncoder for TiffEncoder { + fn write_image( + self, + buf: &[u8], + width: u32, + height: u32, + color_type: ColorType, + ) -> ImageResult<()> { + self.encode(buf, width, height, color_type) + } +} From a32fd74ac53e18eaa795912db523cd801eaf6edf Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Wed, 4 Dec 2019 16:46:35 +0000 Subject: [PATCH 03/13] Bump png version This fixes 16bpc tests. --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 89da99d805..6b697ae5dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,7 @@ num-rational = { version = "0.2.1", default-features = false } num-traits = "0.2.0" gif = { version = "0.10.0", optional = true } jpeg = { package = "jpeg-decoder", version = "0.1", default-features = false, optional = true } -png = { version = "0.15", optional = true } +png = { version = "0.15.2", optional = true } scoped_threadpool = { version = "0.1", optional = true } tiff = { version = "0.4.0", optional = true } zerocopy = "0.2.8" From fe06c0556a432ed9d1a4df2de0f7ee9088c622b0 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Wed, 4 Dec 2019 16:56:09 +0000 Subject: [PATCH 04/13] Make ChannelsType nonexhaustive --- src/color.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/color.rs b/src/color.rs index 668fa04100..5113a27b73 100644 --- a/src/color.rs +++ b/src/color.rs @@ -19,6 +19,9 @@ pub enum ChannelsType { Bgr, /// Blue, green, red and alpha Bgra, + + #[doc(hidden)] + __Nonexhaustive, } impl ChannelsType { @@ -30,6 +33,7 @@ impl ChannelsType { Self::Rgba => 4, Self::Bgr => 3, Self::Bgra => 4, + Self::__Nonexhaustive => unreachable!(), } } } @@ -237,6 +241,7 @@ impl Pixel for $ident { (ChannelsType::Rgba, _) => ColorType::Rgba16, (ChannelsType::Bgr, _) => ColorType::Bgr8, (ChannelsType::Bgra, _) => ColorType::Bgra8, + (ChannelsType::__Nonexhaustive, _) => unreachable!(), } } From 7b62a7b5b6b7654e93c0bac79e36f1be6d981b09 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Wed, 4 Dec 2019 17:02:27 +0000 Subject: [PATCH 05/13] Remove ColorType::bytes_per_channel Per review comments, this assumes equal channel bit depths, which will not be the case in the future. --- src/color.rs | 5 ----- src/png.rs | 8 ++++++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/color.rs b/src/color.rs index 5113a27b73..c9ab0ea262 100644 --- a/src/color.rs +++ b/src/color.rs @@ -82,11 +82,6 @@ impl ColorType { } } - /// Returns the number of bytes contained in a channel per pixel of `ColorType` ```c``` - pub fn bytes_per_channel(self) -> u8 { - self.bytes_per_pixel() / self.channel_count() - } - /// Returns the number of bits contained in a pixel of `ColorType` ```c``` (which will always be /// a multiple of 8). pub fn bits_per_pixel(self) -> u16 { diff --git a/src/png.rs b/src/png.rs index 1bbf1a0ddc..5b3cd328f2 100644 --- a/src/png.rs +++ b/src/png.rs @@ -176,7 +176,9 @@ impl<'a, R: 'a + Read> ImageDecoder<'a> for PngDecoder { // PNG images are big endian. For 16 bit per channel and larger types, // the buffer may need to be reordered to native endianness per the // contract of `read_image`. - match self.color_type().bytes_per_channel() { + // TODO: assumes equal channel bit depth. + let bpc = self.color_type().bytes_per_pixel() / self.color_type().channel_count(); + match bpc { 1 => (), // No reodering necessary for u8 2 => buf.chunks_mut(2).for_each(|c| NativeEndian::write_u16(c, BigEndian::read_u16(c))), _ => unreachable!(), @@ -240,7 +242,9 @@ impl ImageEncoder for PNGEncoder { // PNG images are big endian. For 16 bit per channel and larger types, // the buffer may need to be reordered to big endian per the // contract of `write_image`. - match color_type.bytes_per_channel() { + // TODO: assumes equal channel bit depth. + let bpc = color_type.bytes_per_pixel() / color_type.channel_count(); + match bpc { 1 => self.encode(buf, width, height, color_type), // No reodering necessary for u8 2 => { // Because the buffer is immutable and the PNG encoder does not From 9de3e61c3cd4d45b89be7daef981b9b96dc61114 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Wed, 4 Dec 2019 17:05:42 +0000 Subject: [PATCH 06/13] Note trait should be removed (minor) --- src/color.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/color.rs b/src/color.rs index c9ab0ea262..14d37661ec 100644 --- a/src/color.rs +++ b/src/color.rs @@ -406,6 +406,8 @@ impl FromColor for A { } /// Copy-based conversions to target pixel types using `FromColor`. +// FIXME: this trait should be removed and replaced with real color space models +// rather than assuming sRGB. pub(crate) trait IntoColor { /// Constructs a pixel of the target type and converts this pixel into it. fn into_color(&self) -> Other; From a502beec3082583d263880108c908b19ff557d63 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Wed, 4 Dec 2019 17:14:21 +0000 Subject: [PATCH 07/13] Restore as_flat_samples methods for DynamicImage Because the return type depends on the buffer's bits per channel, make the return optional and provide separate methods for 8 and 16 bit images. --- src/dynimage.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/dynimage.rs b/src/dynimage.rs index f6222f4155..24f45e4d02 100644 --- a/src/dynimage.rs +++ b/src/dynimage.rs @@ -22,6 +22,7 @@ use buffer::{ RgbaImage, Rgba16Image, }; use color::{self, IntoColor}; +use flat::FlatSamples; use image; use image::{ GenericImage, GenericImageView, ImageDecoder, ImageError, ImageFormat, ImageOutputFormat, ImageResult, @@ -392,6 +393,30 @@ impl DynamicImage { } } + /// Return a view on the raw sample buffer for 8 bit per channel images. + pub fn as_flat_samples_u8(&self) -> Option> { + match *self { + DynamicImage::ImageLuma8(ref p) => Some(p.as_flat_samples()), + DynamicImage::ImageLumaA8(ref p) => Some(p.as_flat_samples()), + DynamicImage::ImageRgb8(ref p) => Some(p.as_flat_samples()), + DynamicImage::ImageRgba8(ref p) => Some(p.as_flat_samples()), + DynamicImage::ImageBgr8(ref p) => Some(p.as_flat_samples()), + DynamicImage::ImageBgra8(ref p) => Some(p.as_flat_samples()), + _ => None, + } + } + + /// Return a view on the raw sample buffer for 16 bit per channel images. + pub fn as_flat_samples_u16(&self) -> Option> { + match *self { + DynamicImage::ImageLuma16(ref p) => Some(p.as_flat_samples()), + DynamicImage::ImageLumaA16(ref p) => Some(p.as_flat_samples()), + DynamicImage::ImageRgb16(ref p) => Some(p.as_flat_samples()), + DynamicImage::ImageRgba16(ref p) => Some(p.as_flat_samples()), + _ => None, + } + } + /// Return this image's pixels as a byte vector. pub fn to_bytes(&self) -> Vec { image_to_bytes(self) From ed47a763575e49a8b2e5c4a6050ee2bf41a5dbab Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Wed, 4 Dec 2019 18:09:33 +0000 Subject: [PATCH 08/13] Remove zerocopy from public interface Instead create a crate-local AsBytes wrapper trait. This trait is not sealed as Primitive was not sealed, so that users can delegate it for newtypes if needed. --- src/buffer.rs | 7 +++---- src/traits.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/buffer.rs b/src/buffer.rs index 9c1ea17626..2bf7cfc5aa 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -8,9 +8,8 @@ use color::{ChannelsType, ColorType, FromColor, Luma, LumaA, Rgb, Rgba, Bgr, Bgr use flat::{FlatSamples, SampleLayout}; use dynimage::{save_buffer, save_buffer_with_format}; use image::{GenericImage, GenericImageView, ImageFormat, ImageResult}; -use traits::Primitive; +use traits::{EncodableLayout, Primitive}; use utils::expand_packed; -use zerocopy::AsBytes; /// A generalized pixel. /// @@ -744,7 +743,7 @@ where impl ImageBuffer where P: Pixel + 'static, - P::Subpixel: AsBytes, + [P::Subpixel]: EncodableLayout, Container: Deref, { /// Saves the buffer to a file at the path specified. @@ -769,7 +768,7 @@ where impl ImageBuffer where P: Pixel + 'static, - P::Subpixel: AsBytes, + [P::Subpixel]: EncodableLayout, Container: Deref, { /// Saves the buffer to a file at the specified path in diff --git a/src/traits.rs b/src/traits.rs index 11d25ec46b..117e6c8d42 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -5,6 +5,25 @@ use num_traits::{Bounded, Num, NumCast}; use std::ops::AddAssign; +/// Types which are safe to treat as an immutable byte slice in a pixel layout +/// for image encoding. +pub trait EncodableLayout: seals::EncodableLayout { + /// Get the bytes of this value. + fn as_bytes(&self) -> &[u8]; +} + +impl EncodableLayout for [u8] { + fn as_bytes(&self) -> &[u8] { + zerocopy::AsBytes::as_bytes(self) + } +} + +impl EncodableLayout for [u16] { + fn as_bytes(&self) -> &[u8] { + zerocopy::AsBytes::as_bytes(self) + } +} + /// Primitive trait from old stdlib pub trait Primitive: Copy + NumCast + Num + PartialOrd + Clone + Bounded {} @@ -45,3 +64,12 @@ impl Enlargeable for u16 { impl Enlargeable for u32 { type Larger = u64; } + + +/// Private module for supertraits of sealed traits. +mod seals { + pub trait EncodableLayout {} + + impl EncodableLayout for [u8] {} + impl EncodableLayout for [u16] {} +} From c642686132287a0cb7c6682c09b28d18e2b610ed Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Wed, 4 Dec 2019 19:05:06 +0000 Subject: [PATCH 09/13] Fix compilation on 1.34.2 --- src/color.rs | 14 +++++++------- src/png.rs | 5 ++++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/color.rs b/src/color.rs index 14d37661ec..4ec1e34da7 100644 --- a/src/color.rs +++ b/src/color.rs @@ -27,13 +27,13 @@ pub enum ChannelsType { impl ChannelsType { pub fn channel_count(self) -> u8 { match self { - Self::L => 1, - Self::La => 2, - Self::Rgb => 3, - Self::Rgba => 4, - Self::Bgr => 3, - Self::Bgra => 4, - Self::__Nonexhaustive => unreachable!(), + ChannelsType::L => 1, + ChannelsType::La => 2, + ChannelsType::Rgb => 3, + ChannelsType::Rgba => 4, + ChannelsType::Bgr => 3, + ChannelsType::Bgra => 4, + ChannelsType::__Nonexhaustive => unreachable!(), } } } diff --git a/src/png.rs b/src/png.rs index 5b3cd328f2..30ea08bc3d 100644 --- a/src/png.rs +++ b/src/png.rs @@ -180,7 +180,10 @@ impl<'a, R: 'a + Read> ImageDecoder<'a> for PngDecoder { let bpc = self.color_type().bytes_per_pixel() / self.color_type().channel_count(); match bpc { 1 => (), // No reodering necessary for u8 - 2 => buf.chunks_mut(2).for_each(|c| NativeEndian::write_u16(c, BigEndian::read_u16(c))), + 2 => buf.chunks_mut(2).for_each(|c| { + let v = BigEndian::read_u16(c); + NativeEndian::write_u16(c, v) + }), _ => unreachable!(), } Ok(()) From e12da319fa424a2f207f9c10ddfdfc4476ccc7d8 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Sun, 8 Dec 2019 12:51:27 +0000 Subject: [PATCH 10/13] Hide 16bpc buffer aliases from public API --- src/buffer.rs | 8 ++++---- src/lib.rs | 4 ---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/buffer.rs b/src/buffer.rs index 2bf7cfc5aa..932eb7c28f 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -1076,13 +1076,13 @@ pub(crate) type BgrImage = ImageBuffer, Vec>; /// Sendable Bgr + alpha channel image buffer pub(crate) type BgraImage = ImageBuffer, Vec>; /// Sendable 16-bit Rgb image buffer -pub type Rgb16Image = ImageBuffer, Vec>; +pub(crate) type Rgb16Image = ImageBuffer, Vec>; /// Sendable 16-bit Rgb + alpha channel image buffer -pub type Rgba16Image = ImageBuffer, Vec>; +pub(crate) type Rgba16Image = ImageBuffer, Vec>; /// Sendable 16-bit grayscale image buffer -pub type Gray16Image = ImageBuffer, Vec>; +pub(crate) type Gray16Image = ImageBuffer, Vec>; /// Sendable 16-bit grayscale + alpha channel image buffer -pub type GrayAlpha16Image = ImageBuffer, Vec>; +pub(crate) type GrayAlpha16Image = ImageBuffer, Vec>; #[cfg(test)] mod test { diff --git a/src/lib.rs b/src/lib.rs index b0703186db..75da06ee71 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -54,10 +54,6 @@ pub use buffer::{ConvertBuffer, Pixel, RgbImage, RgbaImage, - Rgb16Image, - Rgba16Image, - Gray16Image, - GrayAlpha16Image, }; pub use flat::FlatSamples; From 35ebf636200f1343f7e2df600ee2a6e97c615782 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Tue, 10 Dec 2019 11:47:53 +0000 Subject: [PATCH 11/13] Remove ChannelsType --- src/buffer.rs | 4 +-- src/color.rs | 92 +++++++++++---------------------------------------- 2 files changed, 21 insertions(+), 75 deletions(-) diff --git a/src/buffer.rs b/src/buffer.rs index 932eb7c28f..98330a8e76 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -4,7 +4,7 @@ use std::ops::{Deref, DerefMut, Index, IndexMut, Range}; use std::path::Path; use std::slice::{Chunks, ChunksMut}; -use color::{ChannelsType, ColorType, FromColor, Luma, LumaA, Rgb, Rgba, Bgr, Bgra}; +use color::{ColorType, FromColor, Luma, LumaA, Rgb, Rgba, Bgr, Bgra}; use flat::{FlatSamples, SampleLayout}; use dynimage::{save_buffer, save_buffer_with_format}; use image::{GenericImage, GenericImageView, ImageFormat, ImageResult}; @@ -42,8 +42,6 @@ pub trait Pixel: Copy + Clone { Self::COLOR_MODEL } - /// Channels for this pixel format - const CHANNELS_TYPE: ChannelsType; /// Returns the ColorType for this pixel format fn color_type() -> ColorType; diff --git a/src/color.rs b/src/color.rs index 4ec1e34da7..dfe2030762 100644 --- a/src/color.rs +++ b/src/color.rs @@ -4,40 +4,6 @@ use std::ops::{Index, IndexMut}; use buffer::Pixel; use traits::Primitive; -/// Supported ordered sets of channels -#[derive(Copy, PartialEq, Eq, Debug, Clone, Hash)] -pub enum ChannelsType { - /// Luminance - L, - /// Luminance and alpha - La, - /// Red, green and blue - Rgb, - /// Red, green, blue and alpha - Rgba, - /// Blue, green and red - Bgr, - /// Blue, green, red and alpha - Bgra, - - #[doc(hidden)] - __Nonexhaustive, -} - -impl ChannelsType { - pub fn channel_count(self) -> u8 { - match self { - ChannelsType::L => 1, - ChannelsType::La => 2, - ChannelsType::Rgb => 3, - ChannelsType::Rgba => 4, - ChannelsType::Bgr => 3, - ChannelsType::Bgra => 4, - ChannelsType::__Nonexhaustive => unreachable!(), - } - } -} - /// An enumeration over supported color types and bit depths #[derive(Copy, PartialEq, Eq, Debug, Clone, Hash)] pub enum ColorType { @@ -138,46 +104,38 @@ pub enum ExtendedColorType { } impl ExtendedColorType { - /// Get the type of channels for colors of this type. + /// Get the number of channels for colors of this type. /// - /// Note that the `Unknown` variant returns a luminance channel since pixels can only be treated as + /// Note that the `Unknown` variant returns a value of `1` since pixels can only be treated as /// an opaque datum by the library. - pub fn channels_type(self) -> ChannelsType { + pub fn channel_count(self) -> u8 { match self { ExtendedColorType::L1 | ExtendedColorType::L2 | ExtendedColorType::L4 | ExtendedColorType::L8 | ExtendedColorType::L16 | - ExtendedColorType::Unknown(_) => ChannelsType::L, + ExtendedColorType::Unknown(_) => 1, ExtendedColorType::La1 | ExtendedColorType::La2 | ExtendedColorType::La4 | ExtendedColorType::La8 | - ExtendedColorType::La16 => ChannelsType::La, + ExtendedColorType::La16 => 2, ExtendedColorType::Rgb1 | ExtendedColorType::Rgb2 | ExtendedColorType::Rgb4 | ExtendedColorType::Rgb8 | - ExtendedColorType::Rgb16 => ChannelsType::Rgb, - ExtendedColorType::Bgr8 => ChannelsType::Bgr, + ExtendedColorType::Rgb16 | + ExtendedColorType::Bgr8 => 3, ExtendedColorType::Rgba1 | ExtendedColorType::Rgba2 | ExtendedColorType::Rgba4 | ExtendedColorType::Rgba8 | - ExtendedColorType::Rgba16 => ChannelsType::Rgba, - ExtendedColorType::Bgra8 => ChannelsType::Bgra, + ExtendedColorType::Rgba16 | + ExtendedColorType::Bgra8 => 4, ExtendedColorType::__Nonexhaustive => unreachable!(), } } - - /// Get the number of channels for colors of this type. - /// - /// Note that the `Unknown` variant returns a value of `1` since pixels can only be treated as - /// an opaque datum by the library. - pub fn channel_count(self) -> u8 { - self.channels_type().channel_count() - } } impl From for ExtendedColorType { fn from(c: ColorType) -> Self { @@ -203,7 +161,8 @@ macro_rules! define_colors { $channels: expr, $alphas: expr, $interpretation: expr, - $channels_type: expr, + $color_type_u8: expr, + $color_type_u16: expr, #[$doc:meta]; )*} => { @@ -222,21 +181,10 @@ impl Pixel for $ident { const COLOR_MODEL: &'static str = $interpretation; - const CHANNELS_TYPE: ChannelsType = $channels_type; - fn color_type() -> ColorType { - match (Self::CHANNELS_TYPE, std::mem::size_of::()) { - (ChannelsType::L, 1) => ColorType::L8, - (ChannelsType::L, _) => ColorType::L16, - (ChannelsType::La, 1) => ColorType::La8, - (ChannelsType::La, _) => ColorType::La16, - (ChannelsType::Rgb, 1) => ColorType::Rgb8, - (ChannelsType::Rgb, _) => ColorType::Rgb16, - (ChannelsType::Rgba, 1) => ColorType::Rgba8, - (ChannelsType::Rgba, _) => ColorType::Rgba16, - (ChannelsType::Bgr, _) => ColorType::Bgr8, - (ChannelsType::Bgra, _) => ColorType::Bgra8, - (ChannelsType::__Nonexhaustive, _) => unreachable!(), + match std::mem::size_of::() { + 1 => $color_type_u8, + _ => $color_type_u16, } } @@ -384,12 +332,12 @@ impl From<[T; $channels]> for $ident { } define_colors! { - Rgb, 3, 0, "RGB", ChannelsType::Rgb, #[doc = "RGB colors"]; - Bgr, 3, 0, "BGR", ChannelsType::Bgr, #[doc = "BGR colors"]; - Luma, 1, 0, "Y", ChannelsType::L, #[doc = "Grayscale colors"]; - Rgba, 4, 1, "RGBA", ChannelsType::Rgba, #[doc = "RGB colors + alpha channel"]; - Bgra, 4, 1, "BGRA", ChannelsType::Bgra, #[doc = "BGR colors + alpha channel"]; - LumaA, 2, 1, "YA", ChannelsType::La, #[doc = "Grayscale colors + alpha channel"]; + Rgb, 3, 0, "RGB", ColorType::Rgb8, ColorType::Rgb16, #[doc = "RGB colors"]; + Bgr, 3, 0, "BGR", ColorType::Bgr8, ColorType::Bgr8, #[doc = "BGR colors"]; + Luma, 1, 0, "Y", ColorType::L8, ColorType::L16, #[doc = "Grayscale colors"]; + Rgba, 4, 1, "RGBA", ColorType::Rgba8, ColorType::Rgba16, #[doc = "RGB colors + alpha channel"]; + Bgra, 4, 1, "BGRA", ColorType::Bgra8, ColorType::Bgra8, #[doc = "BGR colors + alpha channel"]; + LumaA, 2, 1, "YA", ColorType::La8, ColorType::La16, #[doc = "Grayscale colors + alpha channel"]; } /// Provides color conversions for the different pixel types. From 33cebef51f859f84d7722b2a9c388539af7f4789 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Tue, 10 Dec 2019 17:45:29 +0000 Subject: [PATCH 12/13] Restore Pixel::COLOR_TYPE associated type --- src/buffer.rs | 15 ++++++++++----- src/color.rs | 8 ++------ src/flat.rs | 8 ++++---- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/buffer.rs b/src/buffer.rs index 98330a8e76..b1a8d308e9 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -42,8 +42,13 @@ pub trait Pixel: Copy + Clone { Self::COLOR_MODEL } + /// ColorType for this pixel format + const COLOR_TYPE: ColorType; /// Returns the ColorType for this pixel format - fn color_type() -> ColorType; + #[deprecated(note="please use COLOR_TYPE associated constant")] + fn color_type() -> ColorType { + Self::COLOR_TYPE + } /// Returns the channels of this pixel as a 4 tuple. If the pixel /// has less than 4 channels the remainder is filled with the maximum value @@ -650,7 +655,7 @@ where FlatSamples { samples: self.data, layout, - color_hint: Some(P::color_type()), + color_hint: Some(P::COLOR_TYPE), } } @@ -664,7 +669,7 @@ where FlatSamples { samples: self.data.as_ref(), layout, - color_hint: Some(P::color_type()), + color_hint: Some(P::COLOR_TYPE), } } } @@ -758,7 +763,7 @@ where self.as_bytes(), self.width(), self.height(), -

::color_type(), +

::COLOR_TYPE, ) } } @@ -784,7 +789,7 @@ where self.as_bytes(), self.width(), self.height(), -

::color_type(), +

::COLOR_TYPE, format, ) } diff --git a/src/color.rs b/src/color.rs index dfe2030762..d1e678a6a1 100644 --- a/src/color.rs +++ b/src/color.rs @@ -181,12 +181,8 @@ impl Pixel for $ident { const COLOR_MODEL: &'static str = $interpretation; - fn color_type() -> ColorType { - match std::mem::size_of::() { - 1 => $color_type_u8, - _ => $color_type_u16, - } - } + const COLOR_TYPE: ColorType = + [$color_type_u8, $color_type_u16][(std::mem::size_of::() > 1) as usize]; #[inline(always)] fn channels(&self) -> &[T] { diff --git a/src/flat.rs b/src/flat.rs index 994e5de0d3..316c2564d8 100644 --- a/src/flat.rs +++ b/src/flat.rs @@ -560,7 +560,7 @@ impl FlatSamples { where P: Pixel, Buffer: AsRef<[P::Subpixel]>, { if self.layout.channels != P::CHANNEL_COUNT { - return Err(Error::WrongColor(P::color_type())) + return Err(Error::WrongColor(P::COLOR_TYPE)) } let as_ref = self.samples.as_ref(); @@ -597,7 +597,7 @@ impl FlatSamples { where P: Pixel, Buffer: AsMut<[P::Subpixel]>, { if self.layout.channels != P::CHANNEL_COUNT { - return Err(Error::WrongColor(P::color_type())) + return Err(Error::WrongColor(P::COLOR_TYPE)) } let as_mut = self.samples.as_mut(); @@ -634,7 +634,7 @@ impl FlatSamples { } if self.layout.channels != P::CHANNEL_COUNT { - return Err(Error::WrongColor(P::color_type())) + return Err(Error::WrongColor(P::COLOR_TYPE)) } let as_mut = self.samples.as_mut(); @@ -718,7 +718,7 @@ impl FlatSamples { } if self.layout.channels != P::CHANNEL_COUNT { - return Err((Error::WrongColor(P::color_type()), self)) + return Err((Error::WrongColor(P::COLOR_TYPE), self)) } if !self.fits(self.samples.deref().len()) { From 5dae1fd2132830f6cd32652c23863928fabdbf54 Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Thu, 12 Dec 2019 14:21:50 +0000 Subject: [PATCH 13/13] Switch from zerocopy to bytemuck Bytemuck is more feature constrained and builds on Rust 1.34.2. --- Cargo.toml | 2 +- src/dynimage.rs | 2 +- src/image.rs | 5 ++--- src/lib.rs | 2 +- src/tiff.rs | 6 +++--- src/traits.rs | 4 ++-- 6 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6b697ae5dc..7eabff3040 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ name = "image" path = "./src/lib.rs" [dependencies] +bytemuck = "1" byteorder = "1.3.2" num-iter = "0.1.32" num-rational = { version = "0.2.1", default-features = false } @@ -29,7 +30,6 @@ jpeg = { package = "jpeg-decoder", version = "0.1", default-features = false, op png = { version = "0.15.2", optional = true } scoped_threadpool = { version = "0.1", optional = true } tiff = { version = "0.4.0", optional = true } -zerocopy = "0.2.8" [dev-dependencies] crc32fast = "1.2.0" diff --git a/src/dynimage.rs b/src/dynimage.rs index 24f45e4d02..60badd5922 100644 --- a/src/dynimage.rs +++ b/src/dynimage.rs @@ -851,7 +851,7 @@ fn decoder_to_image<'a, I: ImageDecoder<'a>>(decoder: I) -> ImageResult Vec { - use zerocopy::AsBytes; + use traits::EncodableLayout; match *image { // TODO: consider transmuting diff --git a/src/image.rs b/src/image.rs index a1eedf6468..994efa62a4 100644 --- a/src/image.rs +++ b/src/image.rs @@ -10,7 +10,6 @@ use std::ops::{Deref, DerefMut}; use buffer::{ImageBuffer, Pixel}; use color::{ColorType, ExtendedColorType}; -use zerocopy::{AsBytes, FromBytes}; use animation::Frames; @@ -373,10 +372,10 @@ pub(crate) fn load_rect<'a, D, F, F1, F2, E>(x: u32, y: u32, width: u32, height: /// Panics if there isn't enough memory to decode the image. pub(crate) fn decoder_to_vec<'a, T>(decoder: impl ImageDecoder<'a>) -> ImageResult> where - T: ::traits::Primitive + AsBytes + FromBytes, + T: ::traits::Primitive + bytemuck::Pod, { let mut buf = vec![num_traits::Zero::zero(); usize::try_from(decoder.total_bytes()).unwrap() / std::mem::size_of::()]; - decoder.read_image(buf.as_bytes_mut())?; + decoder.read_image(bytemuck::cast_slice_mut(buf.as_mut_slice()))?; Ok(buf) } diff --git a/src/lib.rs b/src/lib.rs index 75da06ee71..d518a572f7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,6 +11,7 @@ // it's a bit of a pain otherwise #![allow(clippy::many_single_char_names)] +extern crate bytemuck; extern crate byteorder; extern crate num_iter; extern crate num_rational; @@ -19,7 +20,6 @@ extern crate num_traits; extern crate scoped_threadpool; #[cfg(all(test, feature = "benchmarks"))] extern crate test; -extern crate zerocopy; #[cfg(test)] #[macro_use] diff --git a/src/tiff.rs b/src/tiff.rs index 2a9c895b0f..30be7e2341 100644 --- a/src/tiff.rs +++ b/src/tiff.rs @@ -130,10 +130,10 @@ pub struct TiffEncoder { } // Utility to simplify and deduplicate error handling during 16-bit encoding. -fn u8_slice_as_u16(buf: &[u8]) -> ImageResult> { - zerocopy::LayoutVerified::new_slice(buf) +fn u8_slice_as_u16(buf: &[u8]) -> ImageResult<&[u16]> { + bytemuck::try_cast_slice(buf) // If the buffer is not aligned or the correct length for a u16 slice, err. - .ok_or_else(|| ImageError::IoError(std::io::ErrorKind::InvalidData.into())) + .map_err(|_| ImageError::IoError(std::io::ErrorKind::InvalidData.into())) } impl TiffEncoder { diff --git a/src/traits.rs b/src/traits.rs index 117e6c8d42..6e558d4a13 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -14,13 +14,13 @@ pub trait EncodableLayout: seals::EncodableLayout { impl EncodableLayout for [u8] { fn as_bytes(&self) -> &[u8] { - zerocopy::AsBytes::as_bytes(self) + bytemuck::cast_slice(self) } } impl EncodableLayout for [u16] { fn as_bytes(&self) -> &[u8] { - zerocopy::AsBytes::as_bytes(self) + bytemuck::cast_slice(self) } }