Drop byteorder dependency
Ref: https://github.com/image-rs/image/issues/1000
This commit is contained in:
5 files changed
+87
-80
No files matched your search
@@ -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"
|
||||||
+70
-48
@@ -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> {
|
||||||
|
let mut n = [0u8; 4];
|
||||||
|
self.read_exact(&mut n)?;
|
||||||
|
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() {
|
match self.byte_order() {
|
||||||
ByteOrder::LittleEndian => <Self as ReadBytesExt>::read_i32::<LittleEndian>(self),
|
ByteOrder::LittleEndian =>
|
||||||
ByteOrder::BigEndian => <Self as ReadBytesExt>::read_i32::<BigEndian>(self),
|
for n in buffer {
|
||||||
|
*n = u64::from_le(*n);
|
||||||
|
},
|
||||||
|
ByteOrder::BigEndian =>
|
||||||
|
for n in buffer {
|
||||||
|
*n = u64::from_be(*n);
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -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)?;
|
||||||
|
|
||||||
|
|||||||
+16
-28
@@ -1,29 +1,17 @@
|
|||||||
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.offset += 4;
|
||||||
writer.writer.write_u16::<LittleEndian>(42)?;
|
|
||||||
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> {
|
||||||
@@ -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(())
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user