Drop byteorder dependency

Ref: https://github.com/image-rs/image/issues/1000
This commit is contained in:
наб committed 2020-08-14 16:52:51 +02:00
1 parent 418979f14b
commit b853d841f3
5 files changed
+86 -79

No files matched your search

-1
View File
@@ -17,6 +17,5 @@ repository = "https://github.com/image-rs/image-tiff"
exclude = ["tests/images/*", "tests/fuzz_images/*"] exclude = ["tests/images/*", "tests/fuzz_images/*"]
[dependencies] [dependencies]
byteorder = "1.2"
lzw = "0.10" lzw = "0.10"
miniz_oxide = "0.3" miniz_oxide = "0.3"
+71 -49
View File
@@ -1,10 +1,10 @@
//! All IO functionality needed for TIFF decoding //! All IO functionality needed for TIFF decoding
use crate::error::{TiffError, TiffResult}; use crate::error::{TiffError, TiffResult};
use byteorder::{BigEndian, LittleEndian, ReadBytesExt};
use lzw; use lzw;
use miniz_oxide::inflate; use miniz_oxide::inflate;
use std::io::{self, Read, Seek}; use std::io::{self, Read, Seek};
use std::slice;
/// Byte order of the TIFF file. /// Byte order of the TIFF file.
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]
@@ -23,82 +23,104 @@ pub trait EndianReader: Read {
/// Reads an u16 /// Reads an u16
#[inline(always)] #[inline(always)]
fn read_u16(&mut self) -> Result<u16, io::Error> { fn read_u16(&mut self) -> Result<u16, io::Error> {
match self.byte_order() { let mut n = [0u8; 2];
ByteOrder::LittleEndian => <Self as ReadBytesExt>::read_u16::<LittleEndian>(self), self.read_exact(&mut n)?;
ByteOrder::BigEndian => <Self as ReadBytesExt>::read_u16::<BigEndian>(self), Ok(match self.byte_order() {
} ByteOrder::LittleEndian => u16::from_le_bytes(n),
ByteOrder::BigEndian => u16::from_be_bytes(n),
})
} }
#[inline(always)] #[inline(always)]
fn read_u16_into(&mut self, buffer: &mut [u16]) -> Result<(), io::Error> { fn read_u16_into(&mut self, buffer: &mut [u16]) -> Result<(), io::Error> {
self.read_exact(unsafe { slice::from_raw_parts_mut(buffer.as_mut_ptr() as *mut u8, buffer.len() * 2) })?;
match self.byte_order() { match self.byte_order() {
ByteOrder::LittleEndian => { ByteOrder::LittleEndian =>
<Self as ReadBytesExt>::read_u16_into::<LittleEndian>(self, buffer) for n in buffer {
} *n = u16::from_le(*n);
ByteOrder::BigEndian => { },
<Self as ReadBytesExt>::read_u16_into::<BigEndian>(self, buffer) ByteOrder::BigEndian =>
} for n in buffer {
*n = u16::from_be(*n);
},
} }
Ok(())
} }
/// Reads an i16 /// Reads an i16
#[inline(always)] #[inline(always)]
fn read_i16(&mut self) -> Result<i16, io::Error> { fn read_i16(&mut self) -> Result<i16, io::Error> {
match self.byte_order() { let mut n = [0u8; 2];
ByteOrder::LittleEndian => <Self as ReadBytesExt>::read_i16::<LittleEndian>(self), self.read_exact(&mut n)?;
ByteOrder::BigEndian => <Self as ReadBytesExt>::read_i16::<BigEndian>(self), Ok(match self.byte_order() {
} ByteOrder::LittleEndian => i16::from_le_bytes(n),
ByteOrder::BigEndian => i16::from_be_bytes(n),
})
} }
/// Reads an u32 /// Reads an u32
#[inline(always)] #[inline(always)]
fn read_u32(&mut self) -> Result<u32, io::Error> { fn read_u32(&mut self) -> Result<u32, io::Error> {
match self.byte_order() { let mut n = [0u8; 4];
ByteOrder::LittleEndian => <Self as ReadBytesExt>::read_u32::<LittleEndian>(self), self.read_exact(&mut n)?;
ByteOrder::BigEndian => <Self as ReadBytesExt>::read_u32::<BigEndian>(self), Ok(match self.byte_order() {
} ByteOrder::LittleEndian => u32::from_le_bytes(n),
ByteOrder::BigEndian => u32::from_be_bytes(n),
})
} }
#[inline(always)] #[inline(always)]
fn read_u32_into(&mut self, buffer: &mut [u32]) -> Result<(), io::Error> { fn read_u32_into(&mut self, buffer: &mut [u32]) -> Result<(), io::Error> {
self.read_exact(unsafe { slice::from_raw_parts_mut(buffer.as_mut_ptr() as *mut u8, buffer.len() * 4) })?;
match self.byte_order() { match self.byte_order() {
ByteOrder::LittleEndian => { ByteOrder::LittleEndian =>
<Self as ReadBytesExt>::read_u32_into::<LittleEndian>(self, buffer) for n in buffer {
} *n = u32::from_le(*n);
ByteOrder::BigEndian => { },
<Self as ReadBytesExt>::read_u32_into::<BigEndian>(self, buffer) ByteOrder::BigEndian =>
} for n in buffer {
} *n = u32::from_be(*n);
} },
/// Reads an u64
#[inline(always)]
fn read_u64(&mut self) -> Result<u64, io::Error> {
match self.byte_order() {
ByteOrder::LittleEndian => <Self as ReadBytesExt>::read_u64::<LittleEndian>(self),
ByteOrder::BigEndian => <Self as ReadBytesExt>::read_u64::<BigEndian>(self),
}
}
#[inline(always)]
fn read_u64_into(&mut self, buffer: &mut [u64]) -> Result<(), io::Error> {
match self.byte_order() {
ByteOrder::LittleEndian => {
<Self as ReadBytesExt>::read_u64_into::<LittleEndian>(self, buffer)
}
ByteOrder::BigEndian => {
<Self as ReadBytesExt>::read_u64_into::<BigEndian>(self, buffer)
}
} }
Ok(())
} }
/// Reads an i32 /// Reads an i32
#[inline(always)] #[inline(always)]
fn read_i32(&mut self) -> Result<i32, io::Error> { fn read_i32(&mut self) -> Result<i32, io::Error> {
match self.byte_order() { let mut n = [0u8; 4];
ByteOrder::LittleEndian => <Self as ReadBytesExt>::read_i32::<LittleEndian>(self), self.read_exact(&mut n)?;
ByteOrder::BigEndian => <Self as ReadBytesExt>::read_i32::<BigEndian>(self), Ok(match self.byte_order() {
ByteOrder::LittleEndian => i32::from_le_bytes(n),
ByteOrder::BigEndian => i32::from_be_bytes(n),
})
} }
/// Reads an u64
#[inline(always)]
fn read_u64(&mut self) -> Result<u64, io::Error> {
let mut n = [0u8; 8];
self.read_exact(&mut n)?;
Ok(match self.byte_order() {
ByteOrder::LittleEndian => u64::from_le_bytes(n),
ByteOrder::BigEndian => u64::from_be_bytes(n),
})
}
#[inline(always)]
fn read_u64_into(&mut self, buffer: &mut [u64]) -> Result<(), io::Error> {
self.read_exact(unsafe { slice::from_raw_parts_mut(buffer.as_mut_ptr() as *mut u8, buffer.len() * 8) })?;
match self.byte_order() {
ByteOrder::LittleEndian =>
for n in buffer {
*n = u64::from_le(*n);
},
ByteOrder::BigEndian =>
for n in buffer {
*n = u64::from_be(*n);
},
}
Ok(())
} }
} }
+1 -2
View File
@@ -1,4 +1,3 @@
use byteorder::NativeEndian;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::convert::TryFrom; use std::convert::TryFrom;
use std::io::{Seek, Write}; use std::io::{Seek, Write};
@@ -375,7 +374,7 @@ impl<W: Write + Seek> TiffEncoder<W> {
writer: TiffWriter::new(writer), writer: TiffWriter::new(writer),
}; };
NativeEndian::write_header(&mut encoder.writer)?; write_tiff_header(&mut encoder.writer)?;
// blank the IFD offset location // blank the IFD offset location
encoder.writer.write_u32(0)?; encoder.writer.write_u32(0)?;
+14 -26
View File
@@ -1,30 +1,18 @@
use error::TiffResult; use error::TiffResult;
use byteorder::{BigEndian, ByteOrder, LittleEndian, NativeEndian, WriteBytesExt};
use std::io::{self, Seek, SeekFrom, Write}; use std::io::{self, Seek, SeekFrom, Write};
pub trait TiffByteOrder: ByteOrder { pub fn write_tiff_header<W: Write>(writer: &mut TiffWriter<W>) -> TiffResult<()> {
fn write_header<W: Write>(writer: &mut TiffWriter<W>) -> TiffResult<()>; #[cfg(target_endian = "little")]
} let boi: u8 = 0x49;
#[cfg(not(target_endian = "little"))]
let boi: u8 = 0x4d;
impl TiffByteOrder for LittleEndian { writer.writer.write_all(&[boi, boi])?;
fn write_header<W: Write>(writer: &mut TiffWriter<W>) -> TiffResult<()> { writer.writer.write_all(&42u16.to_ne_bytes())?;
writer.writer.write_u16::<LittleEndian>(0x4949)?;
writer.writer.write_u16::<LittleEndian>(42)?;
writer.offset += 4; writer.offset += 4;
Ok(()) Ok(())
} }
}
impl TiffByteOrder for BigEndian {
fn write_header<W: Write>(writer: &mut TiffWriter<W>) -> TiffResult<()> {
writer.writer.write_u16::<BigEndian>(0x4d4d)?;
writer.writer.write_u16::<BigEndian>(42)?;
writer.offset += 4;
Ok(())
}
}
pub struct TiffWriter<W> { pub struct TiffWriter<W> {
writer: W, writer: W,
@@ -47,47 +35,47 @@ impl<W: Write> TiffWriter<W> {
} }
pub fn write_u8(&mut self, n: u8) -> Result<(), io::Error> { pub fn write_u8(&mut self, n: u8) -> Result<(), io::Error> {
self.writer.write_u8(n)?; self.writer.write_all(&n.to_ne_bytes())?;
self.offset += 1; self.offset += 1;
Ok(()) Ok(())
} }
pub fn write_i8(&mut self, n: i8) -> Result<(), io::Error> { pub fn write_i8(&mut self, n: i8) -> Result<(), io::Error> {
self.writer.write_i8(n)?; self.writer.write_all(&n.to_ne_bytes())?;
self.offset += 1; self.offset += 1;
Ok(()) Ok(())
} }
pub fn write_u16(&mut self, n: u16) -> Result<(), io::Error> { pub fn write_u16(&mut self, n: u16) -> Result<(), io::Error> {
self.writer.write_u16::<NativeEndian>(n)?; self.writer.write_all(&n.to_ne_bytes())?;
self.offset += 2; self.offset += 2;
Ok(()) Ok(())
} }
pub fn write_i16(&mut self, n: i16) -> Result<(), io::Error> { pub fn write_i16(&mut self, n: i16) -> Result<(), io::Error> {
self.writer.write_i16::<NativeEndian>(n)?; self.writer.write_all(&n.to_ne_bytes())?;
self.offset += 2; self.offset += 2;
Ok(()) Ok(())
} }
pub fn write_u32(&mut self, n: u32) -> Result<(), io::Error> { pub fn write_u32(&mut self, n: u32) -> Result<(), io::Error> {
self.writer.write_u32::<NativeEndian>(n)?; self.writer.write_all(&n.to_ne_bytes())?;
self.offset += 4; self.offset += 4;
Ok(()) Ok(())
} }
pub fn write_i32(&mut self, n: i32) -> Result<(), io::Error> { pub fn write_i32(&mut self, n: i32) -> Result<(), io::Error> {
self.writer.write_i32::<NativeEndian>(n)?; self.writer.write_all(&n.to_ne_bytes())?;
self.offset += 4; self.offset += 4;
Ok(()) Ok(())
} }
pub fn write_u64(&mut self, n: u64) -> Result<(), io::Error> { pub fn write_u64(&mut self, n: u64) -> Result<(), io::Error> {
self.writer.write_u64::<NativeEndian>(n)?; self.writer.write_all(&n.to_ne_bytes())?;
self.offset += 8; self.offset += 8;
Ok(()) Ok(())
-1
View File
@@ -6,7 +6,6 @@
//! # Related Links //! # Related Links
//! * <https://www.adobe.io/open/standards/TIFF.html> - The TIFF specification //! * <https://www.adobe.io/open/standards/TIFF.html> - The TIFF specification
extern crate byteorder;
extern crate lzw; extern crate lzw;
extern crate miniz_oxide; extern crate miniz_oxide;