Distinguish unknown values from reserved ones.

This commit is contained in:
KAMADA Ken'ichi 2020-02-15 19:10:54 +09:00
parent 663a24de79
commit 4517a1a771
1 changed files with 48 additions and 38 deletions

View File

@ -26,6 +26,7 @@
use std::fmt; use std::fmt;
use crate::error::Error;
use crate::value; use crate::value;
use crate::value::Value; use crate::value::Value;
use crate::util::atou16; use crate::util::atou16;
@ -721,7 +722,7 @@ fn d_compression(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(2) => "Modified Huffman", Some(2) => "Modified Huffman",
Some(6) => "JPEG", Some(6) => "JPEG",
Some(32773) => "PackBits", Some(32773) => "PackBits",
_ => return d_unknown(w, value, "unknown compression "), _ => return d_reserved(w, value, "compression"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -735,7 +736,7 @@ fn d_photointp(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(3) => "palette color", Some(3) => "palette color",
Some(4) => "transparency mask", Some(4) => "transparency mask",
Some(6) => "YCbCr", Some(6) => "YCbCr",
_ => return d_unknown(w, value, "unknown photometric interpretation "), _ => return d_reserved(w, value, "photometric interpretation"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -751,7 +752,7 @@ fn d_orientation(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(6) => "row 0 at right and column 0 at top", Some(6) => "row 0 at right and column 0 at top",
Some(7) => "row 0 at right and column 0 at bottom", Some(7) => "row 0 at right and column 0 at bottom",
Some(8) => "row 0 at left and column 0 at bottom", Some(8) => "row 0 at left and column 0 at bottom",
_ => return d_unknown(w, value, "unknown orientation "), _ => return d_reserved(w, value, "orientation"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -761,7 +762,7 @@ fn d_planarcfg(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(1) => "chunky", Some(1) => "chunky",
Some(2) => "planar", Some(2) => "planar",
_ => return d_unknown(w, value, "unknown planar configuration "), _ => return d_reserved(w, value, "planar configuration"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -772,7 +773,7 @@ fn d_resunit(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(1) => "no absolute unit", Some(1) => "no absolute unit",
Some(2) => "inch", Some(2) => "inch",
Some(3) => "cm", Some(3) => "cm",
_ => return d_unknown(w, value, "unknown unit "), _ => return d_reserved(w, value, "resolution unit"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -781,8 +782,10 @@ fn d_resunit(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
// DateTimeDigitized (Exif 0x9004) // DateTimeDigitized (Exif 0x9004)
fn d_datetime(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { fn d_datetime(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
if let Some(dt) = value.ascii().and_then(|x| x.first()) { if let Some(dt) = value.ascii().and_then(|x| x.first()) {
if let Ok(dt) = crate::tiff::DateTime::from_ascii(dt) { match crate::tiff::DateTime::from_ascii(dt) {
return write!(w, "{}", dt) Ok(dt) => return write!(w, "{}", dt),
Err(Error::BlankValue(_)) => return w.write_str("unknown"),
_ => {},
} }
} }
d_default(w, value) d_default(w, value)
@ -812,7 +815,7 @@ fn d_ycbcrpos(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(1) => "centered", Some(1) => "centered",
Some(2) => "co-sited", Some(2) => "co-sited",
_ => return d_unknown(w, value, "unknown YCbCr positioning "), _ => return d_reserved(w, value, "YCbCr positioning"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -832,6 +835,7 @@ fn d_exptime(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
// ExposureProgram (Exif 0x8822) // ExposureProgram (Exif 0x8822)
fn d_expprog(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { fn d_expprog(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(0) => "not defined",
Some(1) => "manual", Some(1) => "manual",
Some(2) => "normal program", Some(2) => "normal program",
Some(3) => "aperture priority", Some(3) => "aperture priority",
@ -840,7 +844,7 @@ fn d_expprog(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(6) => "action program", Some(6) => "action program",
Some(7) => "portrait mode", Some(7) => "portrait mode",
Some(8) => "landscape mode", Some(8) => "landscape mode",
_ => return d_unknown(w, value, "unknown exposure program "), _ => return d_reserved(w, value, "exposure program"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -848,6 +852,7 @@ fn d_expprog(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
// SensitivityType (Exif 0x8830) // SensitivityType (Exif 0x8830)
fn d_sensitivitytype(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { fn d_sensitivitytype(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(0) => "unknown",
Some(1) => "SOS", Some(1) => "SOS",
Some(2) => "REI", Some(2) => "REI",
Some(3) => "ISO speed", Some(3) => "ISO speed",
@ -855,7 +860,7 @@ fn d_sensitivitytype(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(5) => "SOS/ISO speed", Some(5) => "SOS/ISO speed",
Some(6) => "REI/ISO speed", Some(6) => "REI/ISO speed",
Some(7) => "SOS/REI/ISO speed", Some(7) => "SOS/REI/ISO speed",
_ => return d_unknown(w, value, "unknown sensitivity type "), _ => return d_reserved(w, value, "sensitivity type"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -908,6 +913,7 @@ fn d_subjdist(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
// MeteringMode (Exif 0x9207) // MeteringMode (Exif 0x9207)
fn d_metering(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { fn d_metering(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(0) => "unknown",
Some(1) => "average", Some(1) => "average",
Some(2) => "center-weighted average", Some(2) => "center-weighted average",
Some(3) => "spot", Some(3) => "spot",
@ -915,7 +921,7 @@ fn d_metering(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(5) => "pattern", Some(5) => "pattern",
Some(6) => "partial", Some(6) => "partial",
Some(255) => "other", Some(255) => "other",
_ => return d_unknown(w, value, "unknown metering mode "), _ => return d_reserved(w, value, "metering mode"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -923,6 +929,7 @@ fn d_metering(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
// LightSource (Exif 0x9208) // LightSource (Exif 0x9208)
fn d_lightsrc(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { fn d_lightsrc(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(0) => "unknown",
Some(1) => "daylight", Some(1) => "daylight",
Some(2) => "fluorescent", Some(2) => "fluorescent",
Some(3) => "tungsten", Some(3) => "tungsten",
@ -944,7 +951,7 @@ fn d_lightsrc(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(23) => "D50", Some(23) => "D50",
Some(24) => "ISO studio tungsten", Some(24) => "ISO studio tungsten",
Some(255) => "other", Some(255) => "other",
_ => return d_unknown(w, value, "unknown light source "), _ => return d_reserved(w, value, "light source"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1022,7 +1029,7 @@ fn d_cspace(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(1) => "sRGB", Some(1) => "sRGB",
Some(0xffff) => "uncalibrated", Some(0xffff) => "uncalibrated",
_ => return d_unknown(w, value, "unknown color space "), _ => return d_reserved(w, value, "color space"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1037,7 +1044,7 @@ fn d_sensingmethod(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(5) => "color sequential area sensor", Some(5) => "color sequential area sensor",
Some(7) => "trilinear sensor", Some(7) => "trilinear sensor",
Some(8) => "color sequential linear sensor", Some(8) => "color sequential linear sensor",
_ => return d_unknown(w, value, "unknown sensing method "), _ => return d_reserved(w, value, "sensing method"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1049,7 +1056,7 @@ fn d_filesrc(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(1) => "transparency scanner", Some(1) => "transparency scanner",
Some(2) => "reflective scanner", Some(2) => "reflective scanner",
Some(3) => "DSC", Some(3) => "DSC",
_ => return d_unknown(w, value, "unknown file source "), _ => return d_reserved(w, value, "file source"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1058,7 +1065,7 @@ fn d_filesrc(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
fn d_scenetype(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { fn d_scenetype(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.undefined().and_then(|x| x.first().copied()) { let s = match value.undefined().and_then(|x| x.first().copied()) {
Some(1) => "directly photographed image", Some(1) => "directly photographed image",
_ => return d_unknown(w, value, "unknown scene type "), _ => return d_reserved(w, value, "scene type"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1068,7 +1075,7 @@ fn d_customrendered(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(0) => "normal process", Some(0) => "normal process",
Some(1) => "custom process", Some(1) => "custom process",
_ => return d_unknown(w, value, "unknown custom rendered "), _ => return d_reserved(w, value, "custom rendered"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1079,7 +1086,7 @@ fn d_expmode(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(0) => "auto exposure", Some(0) => "auto exposure",
Some(1) => "manual exposure", Some(1) => "manual exposure",
Some(2) => "auto bracket", Some(2) => "auto bracket",
_ => return d_unknown(w, value, "unknown exposure mode "), _ => return d_reserved(w, value, "exposure mode"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1089,7 +1096,7 @@ fn d_whitebalance(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(0) => "auto white balance", Some(0) => "auto white balance",
Some(1) => "manual white balance", Some(1) => "manual white balance",
_ => return d_unknown(w, value, "unknown white balance mode "), _ => return d_reserved(w, value, "white balance mode"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1117,7 +1124,7 @@ fn d_scenecaptype(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(1) => "landscape", Some(1) => "landscape",
Some(2) => "portrait", Some(2) => "portrait",
Some(3) => "night scene", Some(3) => "night scene",
_ => return d_unknown(w, value, "unknown scene capture type "), _ => return d_reserved(w, value, "scene capture type"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1130,7 +1137,7 @@ fn d_gainctrl(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(2) => "high gain up", Some(2) => "high gain up",
Some(3) => "low gain down", Some(3) => "low gain down",
Some(4) => "high gain down", Some(4) => "high gain down",
_ => return d_unknown(w, value, "unknown gain control "), _ => return d_reserved(w, value, "gain control"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1141,7 +1148,7 @@ fn d_contrast(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(0) => "normal", Some(0) => "normal",
Some(1) => "soft", Some(1) => "soft",
Some(2) => "hard", Some(2) => "hard",
_ => return d_unknown(w, value, "unknown contrast processing "), _ => return d_reserved(w, value, "contrast processing"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1152,7 +1159,7 @@ fn d_saturation(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(0) => "normal", Some(0) => "normal",
Some(1) => "low saturation", Some(1) => "low saturation",
Some(2) => "high saturation", Some(2) => "high saturation",
_ => return d_unknown(w, value, "unknown saturation processing "), _ => return d_reserved(w, value, "saturation processing"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1163,7 +1170,7 @@ fn d_sharpness(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(0) => "normal", Some(0) => "normal",
Some(1) => "soft", Some(1) => "soft",
Some(2) => "hard", Some(2) => "hard",
_ => return d_unknown(w, value, "unknown sharpness processing "), _ => return d_reserved(w, value, "sharpness processing"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1171,10 +1178,11 @@ fn d_sharpness(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
// SubjectDistanceRange (Exif 0xa40c) // SubjectDistanceRange (Exif 0xa40c)
fn d_subjdistrange(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { fn d_subjdistrange(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(0) => "unknown",
Some(1) => "macro", Some(1) => "macro",
Some(2) => "close view", Some(2) => "close view",
Some(3) => "distant view", Some(3) => "distant view",
_ => return d_unknown(w, value, "unknown subject distance range "), _ => return d_reserved(w, value, "subject distance range"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1194,10 +1202,11 @@ fn d_lensspec(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
// CompositeImage (Exif 0xa460) // CompositeImage (Exif 0xa460)
fn d_cpstimg(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { fn d_cpstimg(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(0) => "unknown",
Some(1) => "non-composite", Some(1) => "non-composite",
Some(2) => "composite (general)", Some(2) => "composite (general)",
Some(3) => "composite (at the moment of shooting)", Some(3) => "composite (at the moment of shooting)",
_ => return d_unknown(w, value, "unknown composite image "), _ => return d_reserved(w, value, "composite image"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1206,7 +1215,7 @@ fn d_cpstimg(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
fn d_numcpstimg(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { fn d_numcpstimg(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
match (value.get_uint(0), value.get_uint(1)) { match (value.get_uint(0), value.get_uint(1)) {
(Some(t), Some(u)) => write!(w, "total {}, used {}", t, u), (Some(t), Some(u)) => write!(w, "total {}, used {}", t, u),
_ => d_unknown(w, value, "unknown image number of composite imsage "), _ => d_default(w, value),
} }
} }
@ -1242,7 +1251,7 @@ fn d_gpsaltref(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(0) => "above sea level", Some(0) => "above sea level",
Some(1) => "below sea level", Some(1) => "below sea level",
_ => return d_unknown(w, value, "unknown GPS altitude ref "), _ => return d_reserved(w, value, "GPS altitude ref"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1266,7 +1275,7 @@ fn d_gpsstatus(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.ascii().and_then(|x| x.first()) { let s = match value.ascii().and_then(|x| x.first()) {
Some(b"A") => "measurement in progress", Some(b"A") => "measurement in progress",
Some(b"V") => "measurement interrupted", Some(b"V") => "measurement interrupted",
_ => return d_unknown(w, value, "unknown GPS status "), _ => return d_reserved(w, value, "GPS status"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1276,7 +1285,7 @@ fn d_gpsmeasuremode(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.ascii().and_then(|x| x.first()) { let s = match value.ascii().and_then(|x| x.first()) {
Some(b"2") => "2-dimensional measurement", Some(b"2") => "2-dimensional measurement",
Some(b"3") => "3-dimensional measurement", Some(b"3") => "3-dimensional measurement",
_ => return d_unknown(w, value, "unknown GPS measurement mode "), _ => return d_reserved(w, value, "GPS measurement mode"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1287,7 +1296,7 @@ fn d_gpsspeedref(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(b"K") => "km/h", Some(b"K") => "km/h",
Some(b"M") => "mph", Some(b"M") => "mph",
Some(b"N") => "knots", Some(b"N") => "knots",
_ => return d_unknown(w, value, "unknown GPS speed ref "), _ => return d_reserved(w, value, "GPS speed ref"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1298,7 +1307,7 @@ fn d_gpsdirref(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.ascii().and_then(|x| x.first()) { let s = match value.ascii().and_then(|x| x.first()) {
Some(b"T") => "true direction", Some(b"T") => "true direction",
Some(b"M") => "magnetic direction", Some(b"M") => "magnetic direction",
_ => return d_unknown(w, value, "unknown GPS direction ref "), _ => return d_reserved(w, value, "GPS direction ref"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1309,7 +1318,7 @@ fn d_gpsdistref(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
Some(b"K") => "km", Some(b"K") => "km",
Some(b"M") => "miles", Some(b"M") => "miles",
Some(b"N") => "nautical miles", Some(b"N") => "nautical miles",
_ => return d_unknown(w, value, "unknown GPS distance ref "), _ => return d_reserved(w, value, "GPS distance ref"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1336,7 +1345,7 @@ fn d_gpsdifferential(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
let s = match value.get_uint(0) { let s = match value.get_uint(0) {
Some(0) => "no differential correction", Some(0) => "no differential correction",
Some(1) => "differential correction applied", Some(1) => "differential correction applied",
_ => return d_unknown(w, value, "unknown GPS differential correction "), _ => return d_reserved(w, value, "GPS differential correction"),
}; };
w.write_str(s) w.write_str(s)
} }
@ -1357,10 +1366,11 @@ fn d_decimal(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
} }
#[inline(never)] #[inline(never)]
fn d_unknown(w: &mut dyn fmt::Write, value: &Value, prefix: &str) fn d_reserved(w: &mut dyn fmt::Write, value: &Value, name: &str)
-> fmt::Result { -> fmt::Result {
w.write_str(prefix)?; write!(w, "[reserved {} ", name)?;
d_default(w, value) d_default(w, value)?;
w.write_char(']')
} }
fn d_default(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { fn d_default(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {