Verify WhiteIsZero invert, add Gray(1) color type

This was found through the fax4 decoding that is always bilevel.

No longer silently ignore an unknown color type when a photometric
interpretation requires an inversion. DICOM requires that WhiteIsZero
and BlackIsZero are only used for samples-per-pixel=1 but we do not
strictly enforce that early. Previously for the result Multiband color
we just ignored the tag which is also not right.
This commit is contained in:
Aurelia Molzer committed 2025-09-01 00:25:48 +02:00
1 parent 7c6c327817
commit bc71086a96
5 files changed
+33 -8

No files matched your search

+20 -4
View File
@@ -475,11 +475,21 @@ fn fix_endianness_and_predict(
}
}
fn invert_colors(buf: &mut [u8], color_type: ColorType, sample_format: SampleFormat) {
fn invert_colors(
buf: &mut [u8],
color_type: ColorType,
sample_format: SampleFormat,
) -> TiffResult<()> {
match (color_type, sample_format) {
(ColorType::Gray(8), SampleFormat::Uint) => {
(ColorType::Gray(n), SampleFormat::Uint) if 8 % n == 0 => {
for x in buf {
*x = 0xff - *x;
// Equivalent to both of the following:
//
// *x = 0xff - *x
// *x = !*x
//
// since -x = !x+1
*x = !*x;
}
}
(ColorType::Gray(16), SampleFormat::Uint) => {
@@ -512,8 +522,14 @@ fn invert_colors(buf: &mut [u8], color_type: ColorType, sample_format: SampleFor
x.copy_from_slice(&(1.0 - v).to_ne_bytes());
}
}
_ => {}
_ => {
return Err(TiffError::UnsupportedError(
TiffUnsupportedError::UnknownInterpretation,
))
}
}
Ok(())
}
/// Fix endianness. If `byte_order` matches the host, then conversion is a no-op.