From 97c888f16687f4d8b4790e364974764517bbd95a Mon Sep 17 00:00:00 2001 From: Andrew Champion Date: Thu, 6 Feb 2020 18:41:00 +0000 Subject: [PATCH] Add support for IEEEFP RGB/RGBA/CMYK(32) decoding --- Pipfile | 11 +++++++++++ README.md | 4 ++-- src/decoder/mod.rs | 6 ++++++ tests/decode_images.rs | 10 ++++++++++ tests/images/cmyk-3c-32b-float.tiff | Bin 0 -> 6754 bytes tests/images/gradient-3c-32b-float.tiff | Bin 0 -> 3477 bytes 6 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 Pipfile create mode 100644 tests/images/cmyk-3c-32b-float.tiff create mode 100644 tests/images/gradient-3c-32b-float.tiff diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..b723d01 --- /dev/null +++ b/Pipfile @@ -0,0 +1,11 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] + +[requires] +python_version = "3.7" diff --git a/README.md b/README.md index 557401c..d1b8453 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,10 @@ This table lists photometric interpretations and sample formats which are suppor |-|-|-| | `WhiteIsZero` | Gray(8\|16\|32\|64) | Gray(32) | | `BlackIsZero` | Gray(8\|16\|32\|64) | Gray(32) | -| `RGB` | RGB(8\|16\|32\|64), RGBA(8\|16\|32\|64) | | +| `RGB` | RGB(8\|16\|32\|64), RGBA(8\|16\|32\|64) | RGB(32), RGBA(32) | | `RGBPalette` | | | | `Mask` | | | -| `CMYK` | CMYK(8\|16\|32\|64) | | +| `CMYK` | CMYK(8\|16\|32\|64) | CMYK(32) | | `YCbCr` | | | | `CIELab` | | | diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index fd94253..00456bd 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -672,6 +672,12 @@ impl Decoder { reader.read_u32_into(&mut buffer[..bytes / 4])?; bytes / 4 } + (ColorType::RGBA(32), DecodingBuffer::F32(ref mut buffer)) + | (ColorType::RGB(32), DecodingBuffer::F32(ref mut buffer)) + | (ColorType::CMYK(32), DecodingBuffer::F32(ref mut buffer)) => { + reader.read_f32_into(&mut buffer[..bytes / 4])?; + bytes / 4 + } (ColorType::RGBA(64), DecodingBuffer::U64(ref mut buffer)) | (ColorType::RGB(64), DecodingBuffer::U64(ref mut buffer)) | (ColorType::CMYK(64), DecodingBuffer::U64(ref mut buffer)) => { diff --git a/tests/decode_images.rs b/tests/decode_images.rs index 93ea06f..5e05002 100644 --- a/tests/decode_images.rs +++ b/tests/decode_images.rs @@ -58,6 +58,11 @@ fn test_cmyk_u16() { test_image_sum_u16("cmyk-3c-16b.tiff", ColorType::CMYK(16), 2181426827); } +#[test] +fn test_cmyk_f32() { + test_image_sum_f32("cmyk-3c-32b-float.tiff", ColorType::CMYK(32), 496.0405); +} + #[test] fn test_gray_u8() { test_image_sum_u8("minisblack-1c-8b.tiff", ColorType::Gray(8), 2840893); @@ -113,6 +118,11 @@ fn test_rgb_u64() { test_image_sum_u64("gradient-3c-64b.tiff", ColorType::RGB(64), 2030834111716); } +#[test] +fn test_rgb_f32() { + test_image_sum_f32("gradient-3c-32b-float.tiff", ColorType::RGB(32), 472.8405); +} + #[test] fn test_string_tags() { // these files have null-terminated strings for their Software tag. One has extra bytes after diff --git a/tests/images/cmyk-3c-32b-float.tiff b/tests/images/cmyk-3c-32b-float.tiff new file mode 100644 index 0000000000000000000000000000000000000000..9ad77d8fa1100f25d80785e4f5a1e58f6f34e0a9 GIT binary patch literal 6754 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 literal 0 HcmV?d00001