From b853d841f390b1f7cd39170402b1e9d4e96d99b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= Date: Fri, 14 Aug 2020 16:52:51 +0200 Subject: [PATCH] Drop byteorder dependency Ref: https://github.com/image-rs/image/issues/1000 --- Cargo.toml | 1 - src/decoder/stream.rs | 118 +++++++++++++++++++++++++----------------- src/encoder/mod.rs | 5 +- src/encoder/writer.rs | 44 ++++++---------- src/lib.rs | 1 - 5 files changed, 88 insertions(+), 81 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e97306b..05d5a96 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,5 @@ repository = "https://github.com/image-rs/image-tiff" exclude = ["tests/images/*", "tests/fuzz_images/*"] [dependencies] -byteorder = "1.2" lzw = "0.10" miniz_oxide = "0.3" diff --git a/src/decoder/stream.rs b/src/decoder/stream.rs index caf4e3c..53595f1 100644 --- a/src/decoder/stream.rs +++ b/src/decoder/stream.rs @@ -1,10 +1,10 @@ //! All IO functionality needed for TIFF decoding use crate::error::{TiffError, TiffResult}; -use byteorder::{BigEndian, LittleEndian, ReadBytesExt}; use lzw; use miniz_oxide::inflate; use std::io::{self, Read, Seek}; +use std::slice; /// Byte order of the TIFF file. #[derive(Clone, Copy, Debug)] @@ -23,82 +23,104 @@ pub trait EndianReader: Read { /// Reads an u16 #[inline(always)] fn read_u16(&mut self) -> Result { - match self.byte_order() { - ByteOrder::LittleEndian => ::read_u16::(self), - ByteOrder::BigEndian => ::read_u16::(self), - } + let mut n = [0u8; 2]; + self.read_exact(&mut n)?; + Ok(match self.byte_order() { + ByteOrder::LittleEndian => u16::from_le_bytes(n), + ByteOrder::BigEndian => u16::from_be_bytes(n), + }) } #[inline(always)] 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() { - ByteOrder::LittleEndian => { - ::read_u16_into::(self, buffer) - } - ByteOrder::BigEndian => { - ::read_u16_into::(self, buffer) - } + ByteOrder::LittleEndian => + for n in buffer { + *n = u16::from_le(*n); + }, + ByteOrder::BigEndian => + for n in buffer { + *n = u16::from_be(*n); + }, } + Ok(()) } /// Reads an i16 #[inline(always)] fn read_i16(&mut self) -> Result { - match self.byte_order() { - ByteOrder::LittleEndian => ::read_i16::(self), - ByteOrder::BigEndian => ::read_i16::(self), - } + let mut n = [0u8; 2]; + self.read_exact(&mut n)?; + Ok(match self.byte_order() { + ByteOrder::LittleEndian => i16::from_le_bytes(n), + ByteOrder::BigEndian => i16::from_be_bytes(n), + }) } /// Reads an u32 #[inline(always)] fn read_u32(&mut self) -> Result { - match self.byte_order() { - ByteOrder::LittleEndian => ::read_u32::(self), - ByteOrder::BigEndian => ::read_u32::(self), - } + let mut n = [0u8; 4]; + self.read_exact(&mut n)?; + Ok(match self.byte_order() { + ByteOrder::LittleEndian => u32::from_le_bytes(n), + ByteOrder::BigEndian => u32::from_be_bytes(n), + }) } #[inline(always)] 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() { - ByteOrder::LittleEndian => { - ::read_u32_into::(self, buffer) - } - ByteOrder::BigEndian => { - ::read_u32_into::(self, buffer) - } - } - } - - /// Reads an u64 - #[inline(always)] - fn read_u64(&mut self) -> Result { - match self.byte_order() { - ByteOrder::LittleEndian => ::read_u64::(self), - ByteOrder::BigEndian => ::read_u64::(self), - } - } - - #[inline(always)] - fn read_u64_into(&mut self, buffer: &mut [u64]) -> Result<(), io::Error> { - match self.byte_order() { - ByteOrder::LittleEndian => { - ::read_u64_into::(self, buffer) - } - ByteOrder::BigEndian => { - ::read_u64_into::(self, buffer) - } + ByteOrder::LittleEndian => + for n in buffer { + *n = u32::from_le(*n); + }, + ByteOrder::BigEndian => + for n in buffer { + *n = u32::from_be(*n); + }, } + Ok(()) } /// Reads an i32 #[inline(always)] fn read_i32(&mut self) -> Result { + 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 { + 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 => ::read_i32::(self), - ByteOrder::BigEndian => ::read_i32::(self), + ByteOrder::LittleEndian => + for n in buffer { + *n = u64::from_le(*n); + }, + ByteOrder::BigEndian => + for n in buffer { + *n = u64::from_be(*n); + }, } + Ok(()) } } diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs index df9a2a5..35cb4b8 100644 --- a/src/encoder/mod.rs +++ b/src/encoder/mod.rs @@ -1,4 +1,3 @@ -use byteorder::NativeEndian; use std::collections::BTreeMap; use std::convert::TryFrom; use std::io::{Seek, Write}; @@ -375,7 +374,7 @@ impl TiffEncoder { writer: TiffWriter::new(writer), }; - NativeEndian::write_header(&mut encoder.writer)?; + write_tiff_header(&mut encoder.writer)?; // blank the IFD offset location encoder.writer.write_u32(0)?; @@ -536,7 +535,7 @@ impl<'a, W: Write + Seek> Drop for DirectoryEncoder<'a, W> { /// let mut tiff = TiffEncoder::new(&mut file).unwrap(); /// let mut image = tiff.new_image::(100, 100).unwrap(); /// -/// // You can encode tags here +/// // You can encode tags here /// image.encoder().write_tag(Tag::Artist, "Image-tiff").unwrap(); /// /// let mut idx = 0; diff --git a/src/encoder/writer.rs b/src/encoder/writer.rs index ba4c4c5..bc1679d 100644 --- a/src/encoder/writer.rs +++ b/src/encoder/writer.rs @@ -1,29 +1,17 @@ use error::TiffResult; -use byteorder::{BigEndian, ByteOrder, LittleEndian, NativeEndian, WriteBytesExt}; use std::io::{self, Seek, SeekFrom, Write}; -pub trait TiffByteOrder: ByteOrder { - fn write_header(writer: &mut TiffWriter) -> TiffResult<()>; -} +pub fn write_tiff_header(writer: &mut TiffWriter) -> TiffResult<()> { + #[cfg(target_endian = "little")] + let boi: u8 = 0x49; + #[cfg(not(target_endian = "little"))] + let boi: u8 = 0x4d; -impl TiffByteOrder for LittleEndian { - fn write_header(writer: &mut TiffWriter) -> TiffResult<()> { - writer.writer.write_u16::(0x4949)?; - writer.writer.write_u16::(42)?; - writer.offset += 4; + writer.writer.write_all(&[boi, boi])?; + writer.writer.write_all(&42u16.to_ne_bytes())?; + writer.offset += 4; - Ok(()) - } -} - -impl TiffByteOrder for BigEndian { - fn write_header(writer: &mut TiffWriter) -> TiffResult<()> { - writer.writer.write_u16::(0x4d4d)?; - writer.writer.write_u16::(42)?; - writer.offset += 4; - - Ok(()) - } + Ok(()) } pub struct TiffWriter { @@ -47,47 +35,47 @@ impl TiffWriter { } 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; Ok(()) } 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; Ok(()) } pub fn write_u16(&mut self, n: u16) -> Result<(), io::Error> { - self.writer.write_u16::(n)?; + self.writer.write_all(&n.to_ne_bytes())?; self.offset += 2; Ok(()) } pub fn write_i16(&mut self, n: i16) -> Result<(), io::Error> { - self.writer.write_i16::(n)?; + self.writer.write_all(&n.to_ne_bytes())?; self.offset += 2; Ok(()) } pub fn write_u32(&mut self, n: u32) -> Result<(), io::Error> { - self.writer.write_u32::(n)?; + self.writer.write_all(&n.to_ne_bytes())?; self.offset += 4; Ok(()) } pub fn write_i32(&mut self, n: i32) -> Result<(), io::Error> { - self.writer.write_i32::(n)?; + self.writer.write_all(&n.to_ne_bytes())?; self.offset += 4; Ok(()) } pub fn write_u64(&mut self, n: u64) -> Result<(), io::Error> { - self.writer.write_u64::(n)?; + self.writer.write_all(&n.to_ne_bytes())?; self.offset += 8; Ok(()) diff --git a/src/lib.rs b/src/lib.rs index 9906732..9f0f1a2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,7 +6,6 @@ //! # Related Links //! * - The TIFF specification -extern crate byteorder; extern crate lzw; extern crate miniz_oxide;