Skip to content

Commit

Permalink
Merge pull request #100 from ruffson/feature_geotiff
Browse files Browse the repository at this point in the history
Feature GeoTIFF
  • Loading branch information
HeroicKatora authored Nov 16, 2020
2 parents 83004c8 + e2caf86 commit c9703dc
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 2 deletions.
43 changes: 41 additions & 2 deletions src/decoder/ifd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,15 @@ use crate::tags::{Tag, Type};
use crate::{TiffError, TiffFormatError, TiffResult, TiffUnsupportedError};

use self::Value::{
Ascii, Byte, Double, Float, List, Rational, RationalBig, SRational, SRationalBig, Signed,
SignedBig, Unsigned, UnsignedBig,
Ascii, Byte, Double, Float, List, Rational, RationalBig, SRational, SRationalBig, Short,
Signed, SignedBig, Unsigned, UnsignedBig,
};

#[allow(unused_qualifications)]
#[derive(Debug, Clone, PartialEq)]
pub enum Value {
Byte(u8),
Short(u16),
Signed(i32),
SignedBig(i64),
Unsigned(u32),
Expand All @@ -42,8 +43,20 @@ impl Value {
}
}

pub fn into_u16(self) -> TiffResult<u16> {
match self {
Short(val) => Ok(val),
Unsigned(val) => Ok(u16::try_from(val)?),
UnsignedBig(val) => Ok(u16::try_from(val)?),
val => Err(TiffError::FormatError(
TiffFormatError::UnsignedIntegerExpected(val),
)),
}
}

pub fn into_u32(self) -> TiffResult<u32> {
match self {
Short(val) => Ok(val.into()),
Unsigned(val) => Ok(val),
UnsignedBig(val) => Ok(u32::try_from(val)?),
val => Err(TiffError::FormatError(
Expand All @@ -64,6 +77,7 @@ impl Value {

pub fn into_u64(self) -> TiffResult<u64> {
match self {
Short(val) => Ok(val.into()),
Unsigned(val) => Ok(val.into()),
UnsignedBig(val) => Ok(val),
val => Err(TiffError::FormatError(
Expand Down Expand Up @@ -100,6 +114,15 @@ impl Value {
}
}

pub fn into_string(self) -> TiffResult<String> {
match self {
Ascii(val) => Ok(val),
val => Err(TiffError::FormatError(
TiffFormatError::SignedIntegerExpected(val),
)),
}
}

pub fn into_u32_vec(self) -> TiffResult<Vec<u32>> {
match self {
List(vec) => {
Expand Down Expand Up @@ -139,6 +162,22 @@ impl Value {
}
}

pub fn into_u16_vec(self) -> TiffResult<Vec<u16>> {
match self {
List(vec) => {
let mut new_vec = Vec::with_capacity(vec.len());
for v in vec {
new_vec.push(v.into_u16()?)
}
Ok(new_vec)
}
Short(val) => Ok(vec![val]),
val => Err(TiffError::FormatError(
TiffFormatError::UnsignedIntegerExpected(val),
)),
}
}

pub fn into_i32_vec(self) -> TiffResult<Vec<i32>> {
match self {
List(vec) => {
Expand Down
10 changes: 10 additions & 0 deletions src/decoder/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,7 @@ impl<R: Read + Seek> Decoder<R> {
}
_ => return Err(TiffUnsupportedError::UnsupportedSampleDepth(self.samples).into()),
}

Ok(())
}

Expand Down Expand Up @@ -728,6 +729,10 @@ impl<R: Read + Seek> Decoder<R> {
pub fn get_tag_u32_vec(&mut self, tag: Tag) -> TiffResult<Vec<u32>> {
self.get_tag(tag)?.into_u32_vec()
}

pub fn get_tag_u16_vec(&mut self, tag: Tag) -> TiffResult<Vec<u16>> {
self.get_tag(tag)?.into_u16_vec()
}
pub fn get_tag_u64_vec(&mut self, tag: Tag) -> TiffResult<Vec<u64>> {
self.get_tag(tag)?.into_u64_vec()
}
Expand All @@ -747,6 +752,11 @@ impl<R: Read + Seek> Decoder<R> {
self.get_tag(tag)?.into_u8_vec()
}

/// Tries to retrieve a tag and convert it to a ascii vector.
pub fn get_tag_ascii_string(&mut self, tag: Tag) -> TiffResult<String> {
self.get_tag(tag)?.into_string()
}

/// Decompresses the strip into the supplied buffer.
/// Returns the number of bytes read.
fn expand_strip<'a>(
Expand Down
8 changes: 8 additions & 0 deletions src/tags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,14 @@ pub enum Tag(u16) unknown("A private or extension tag") {
TileOffsets = 324,
TileByteCounts = 325,
SampleFormat = 339,
// GeoTIFF
ModelPixelScaleTag = 33550, // (SoftDesk)
ModelTransformationTag = 34264, // (JPL Carto Group)
ModelTiepointTag = 33922, // (Intergraph)
GeoKeyDirectoryTag = 34735, // (SPOT)
GeoDoubleParamsTag = 34736, // (SPOT)
GeoAsciiParamsTag = 34737, // (SPOT)
GdalNodata = 42113, // Contains areas with missing data
}
}

Expand Down

0 comments on commit c9703dc

Please sign in to comment.