diff --git a/README.md b/README.md index 36946a1..225c284 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ imagesize = "0.12" * QOI * TGA * TIFF +* VTF * WEBP If you have a format you think should be added, feel free to create an issue. diff --git a/src/formats/mod.rs b/src/formats/mod.rs index 81f30aa..24f3640 100644 --- a/src/formats/mod.rs +++ b/src/formats/mod.rs @@ -16,6 +16,7 @@ pub mod psd; pub mod qoi; pub mod tga; pub mod tiff; +pub mod vtf; pub mod webp; use crate::{ImageError, ImageResult, ImageType}; @@ -106,6 +107,10 @@ pub fn image_type(reader: &mut R) -> ImageResult { return Ok(ImageType::Farbfeld); } + if vtf::matches(&header) { + return Ok(ImageType::Vtf); + } + // Keep TGA last because it has the highest probability of false positives if tga::matches(&header, reader) { return Ok(ImageType::Tga); diff --git a/src/formats/vtf.rs b/src/formats/vtf.rs new file mode 100644 index 0000000..a9fc3ee --- /dev/null +++ b/src/formats/vtf.rs @@ -0,0 +1,17 @@ +use crate::util::*; +use crate::{ImageResult, ImageSize}; + +use std::io::{BufRead, Seek, SeekFrom}; + +pub fn size(reader: &mut R) -> ImageResult { + reader.seek(SeekFrom::Start(16))?; + + Ok(ImageSize { + width: read_u16(reader, &Endian::Little)? as usize, + height: read_u16(reader, &Endian::Little)? as usize, + }) +} + +pub fn matches(header: &[u8]) -> bool { + header.starts_with(b"VTF\0") +} diff --git a/src/lib.rs b/src/lib.rs index e5e8b94..d86b789 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -62,6 +62,7 @@ pub enum ImageType { Qoi, Tga, Tiff, + Vtf, Webp, } @@ -239,6 +240,7 @@ fn dispatch_header(reader: &mut R) -> ImageResult ImageType::Qoi => qoi::size(reader), ImageType::Tga => tga::size(reader), ImageType::Tiff => tiff::size(reader), + ImageType::Vtf => vtf::size(reader), ImageType::Webp => webp::size(reader), } } diff --git a/tests/images/vtf/test.vtf b/tests/images/vtf/test.vtf new file mode 100644 index 0000000..ee07218 Binary files /dev/null and b/tests/images/vtf/test.vtf differ diff --git a/tests/vtf.rs b/tests/vtf.rs new file mode 100644 index 0000000..a463f85 --- /dev/null +++ b/tests/vtf.rs @@ -0,0 +1,8 @@ +#[cfg(test)] +use imagesize::{size, ImageSize}; + +#[test] +fn vtf_test() { + let dim = size("tests/images/vtf/test.vtf").unwrap(); + assert_eq!(dim, ImageSize { width: 512, height: 256 }); +}