Distinguish unknown values from reserved ones.
This commit is contained in:
parent
663a24de79
commit
4517a1a771
86
src/tag.rs
86
src/tag.rs
|
@ -26,6 +26,7 @@
|
|||
|
||||
use std::fmt;
|
||||
|
||||
use crate::error::Error;
|
||||
use crate::value;
|
||||
use crate::value::Value;
|
||||
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(6) => "JPEG",
|
||||
Some(32773) => "PackBits",
|
||||
_ => return d_unknown(w, value, "unknown compression "),
|
||||
_ => return d_reserved(w, value, "compression"),
|
||||
};
|
||||
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(4) => "transparency mask",
|
||||
Some(6) => "YCbCr",
|
||||
_ => return d_unknown(w, value, "unknown photometric interpretation "),
|
||||
_ => return d_reserved(w, value, "photometric interpretation"),
|
||||
};
|
||||
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(7) => "row 0 at right 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)
|
||||
}
|
||||
|
@ -761,7 +762,7 @@ fn d_planarcfg(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
let s = match value.get_uint(0) {
|
||||
Some(1) => "chunky",
|
||||
Some(2) => "planar",
|
||||
_ => return d_unknown(w, value, "unknown planar configuration "),
|
||||
_ => return d_reserved(w, value, "planar configuration"),
|
||||
};
|
||||
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(2) => "inch",
|
||||
Some(3) => "cm",
|
||||
_ => return d_unknown(w, value, "unknown unit "),
|
||||
_ => return d_reserved(w, value, "resolution unit"),
|
||||
};
|
||||
w.write_str(s)
|
||||
}
|
||||
|
@ -781,8 +782,10 @@ fn d_resunit(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
// DateTimeDigitized (Exif 0x9004)
|
||||
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 Ok(dt) = crate::tiff::DateTime::from_ascii(dt) {
|
||||
return write!(w, "{}", dt)
|
||||
match crate::tiff::DateTime::from_ascii(dt) {
|
||||
Ok(dt) => return write!(w, "{}", dt),
|
||||
Err(Error::BlankValue(_)) => return w.write_str("unknown"),
|
||||
_ => {},
|
||||
}
|
||||
}
|
||||
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) {
|
||||
Some(1) => "centered",
|
||||
Some(2) => "co-sited",
|
||||
_ => return d_unknown(w, value, "unknown YCbCr positioning "),
|
||||
_ => return d_reserved(w, value, "YCbCr positioning"),
|
||||
};
|
||||
w.write_str(s)
|
||||
}
|
||||
|
@ -832,6 +835,7 @@ fn d_exptime(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
// ExposureProgram (Exif 0x8822)
|
||||
fn d_expprog(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
||||
let s = match value.get_uint(0) {
|
||||
Some(0) => "not defined",
|
||||
Some(1) => "manual",
|
||||
Some(2) => "normal program",
|
||||
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(7) => "portrait mode",
|
||||
Some(8) => "landscape mode",
|
||||
_ => return d_unknown(w, value, "unknown exposure program "),
|
||||
_ => return d_reserved(w, value, "exposure program"),
|
||||
};
|
||||
w.write_str(s)
|
||||
}
|
||||
|
@ -848,6 +852,7 @@ fn d_expprog(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
// SensitivityType (Exif 0x8830)
|
||||
fn d_sensitivitytype(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
||||
let s = match value.get_uint(0) {
|
||||
Some(0) => "unknown",
|
||||
Some(1) => "SOS",
|
||||
Some(2) => "REI",
|
||||
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(6) => "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)
|
||||
}
|
||||
|
@ -908,6 +913,7 @@ fn d_subjdist(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
// MeteringMode (Exif 0x9207)
|
||||
fn d_metering(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
||||
let s = match value.get_uint(0) {
|
||||
Some(0) => "unknown",
|
||||
Some(1) => "average",
|
||||
Some(2) => "center-weighted average",
|
||||
Some(3) => "spot",
|
||||
|
@ -915,7 +921,7 @@ fn d_metering(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
Some(5) => "pattern",
|
||||
Some(6) => "partial",
|
||||
Some(255) => "other",
|
||||
_ => return d_unknown(w, value, "unknown metering mode "),
|
||||
_ => return d_reserved(w, value, "metering mode"),
|
||||
};
|
||||
w.write_str(s)
|
||||
}
|
||||
|
@ -923,6 +929,7 @@ fn d_metering(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
// LightSource (Exif 0x9208)
|
||||
fn d_lightsrc(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
||||
let s = match value.get_uint(0) {
|
||||
Some(0) => "unknown",
|
||||
Some(1) => "daylight",
|
||||
Some(2) => "fluorescent",
|
||||
Some(3) => "tungsten",
|
||||
|
@ -944,7 +951,7 @@ fn d_lightsrc(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
Some(23) => "D50",
|
||||
Some(24) => "ISO studio tungsten",
|
||||
Some(255) => "other",
|
||||
_ => return d_unknown(w, value, "unknown light source "),
|
||||
_ => return d_reserved(w, value, "light source"),
|
||||
};
|
||||
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) {
|
||||
Some(1) => "sRGB",
|
||||
Some(0xffff) => "uncalibrated",
|
||||
_ => return d_unknown(w, value, "unknown color space "),
|
||||
_ => return d_reserved(w, value, "color space"),
|
||||
};
|
||||
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(7) => "trilinear 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)
|
||||
}
|
||||
|
@ -1049,7 +1056,7 @@ fn d_filesrc(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
Some(1) => "transparency scanner",
|
||||
Some(2) => "reflective scanner",
|
||||
Some(3) => "DSC",
|
||||
_ => return d_unknown(w, value, "unknown file source "),
|
||||
_ => return d_reserved(w, value, "file source"),
|
||||
};
|
||||
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 {
|
||||
let s = match value.undefined().and_then(|x| x.first().copied()) {
|
||||
Some(1) => "directly photographed image",
|
||||
_ => return d_unknown(w, value, "unknown scene type "),
|
||||
_ => return d_reserved(w, value, "scene type"),
|
||||
};
|
||||
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) {
|
||||
Some(0) => "normal process",
|
||||
Some(1) => "custom process",
|
||||
_ => return d_unknown(w, value, "unknown custom rendered "),
|
||||
_ => return d_reserved(w, value, "custom rendered"),
|
||||
};
|
||||
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(1) => "manual exposure",
|
||||
Some(2) => "auto bracket",
|
||||
_ => return d_unknown(w, value, "unknown exposure mode "),
|
||||
_ => return d_reserved(w, value, "exposure mode"),
|
||||
};
|
||||
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) {
|
||||
Some(0) => "auto 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)
|
||||
}
|
||||
|
@ -1117,7 +1124,7 @@ fn d_scenecaptype(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
Some(1) => "landscape",
|
||||
Some(2) => "portrait",
|
||||
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)
|
||||
}
|
||||
|
@ -1130,7 +1137,7 @@ fn d_gainctrl(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
Some(2) => "high gain up",
|
||||
Some(3) => "low 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)
|
||||
}
|
||||
|
@ -1141,7 +1148,7 @@ fn d_contrast(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
Some(0) => "normal",
|
||||
Some(1) => "soft",
|
||||
Some(2) => "hard",
|
||||
_ => return d_unknown(w, value, "unknown contrast processing "),
|
||||
_ => return d_reserved(w, value, "contrast processing"),
|
||||
};
|
||||
w.write_str(s)
|
||||
}
|
||||
|
@ -1152,7 +1159,7 @@ fn d_saturation(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
Some(0) => "normal",
|
||||
Some(1) => "low saturation",
|
||||
Some(2) => "high saturation",
|
||||
_ => return d_unknown(w, value, "unknown saturation processing "),
|
||||
_ => return d_reserved(w, value, "saturation processing"),
|
||||
};
|
||||
w.write_str(s)
|
||||
}
|
||||
|
@ -1163,7 +1170,7 @@ fn d_sharpness(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
Some(0) => "normal",
|
||||
Some(1) => "soft",
|
||||
Some(2) => "hard",
|
||||
_ => return d_unknown(w, value, "unknown sharpness processing "),
|
||||
_ => return d_reserved(w, value, "sharpness processing"),
|
||||
};
|
||||
w.write_str(s)
|
||||
}
|
||||
|
@ -1171,10 +1178,11 @@ fn d_sharpness(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
// SubjectDistanceRange (Exif 0xa40c)
|
||||
fn d_subjdistrange(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
||||
let s = match value.get_uint(0) {
|
||||
Some(0) => "unknown",
|
||||
Some(1) => "macro",
|
||||
Some(2) => "close 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)
|
||||
}
|
||||
|
@ -1194,10 +1202,11 @@ fn d_lensspec(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
// CompositeImage (Exif 0xa460)
|
||||
fn d_cpstimg(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
||||
let s = match value.get_uint(0) {
|
||||
Some(0) => "unknown",
|
||||
Some(1) => "non-composite",
|
||||
Some(2) => "composite (general)",
|
||||
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)
|
||||
}
|
||||
|
@ -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 {
|
||||
match (value.get_uint(0), value.get_uint(1)) {
|
||||
(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) {
|
||||
Some(0) => "above 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)
|
||||
}
|
||||
|
@ -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()) {
|
||||
Some(b"A") => "measurement in progress",
|
||||
Some(b"V") => "measurement interrupted",
|
||||
_ => return d_unknown(w, value, "unknown GPS status "),
|
||||
_ => return d_reserved(w, value, "GPS status"),
|
||||
};
|
||||
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()) {
|
||||
Some(b"2") => "2-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)
|
||||
}
|
||||
|
@ -1287,7 +1296,7 @@ fn d_gpsspeedref(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
Some(b"K") => "km/h",
|
||||
Some(b"M") => "mph",
|
||||
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)
|
||||
}
|
||||
|
@ -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()) {
|
||||
Some(b"T") => "true 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)
|
||||
}
|
||||
|
@ -1309,7 +1318,7 @@ fn d_gpsdistref(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
Some(b"K") => "km",
|
||||
Some(b"M") => "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)
|
||||
}
|
||||
|
@ -1336,7 +1345,7 @@ fn d_gpsdifferential(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
let s = match value.get_uint(0) {
|
||||
Some(0) => "no differential correction",
|
||||
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)
|
||||
}
|
||||
|
@ -1357,10 +1366,11 @@ fn d_decimal(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
|||
}
|
||||
|
||||
#[inline(never)]
|
||||
fn d_unknown(w: &mut dyn fmt::Write, value: &Value, prefix: &str)
|
||||
-> fmt::Result {
|
||||
w.write_str(prefix)?;
|
||||
d_default(w, value)
|
||||
fn d_reserved(w: &mut dyn fmt::Write, value: &Value, name: &str)
|
||||
-> fmt::Result {
|
||||
write!(w, "[reserved {} ", name)?;
|
||||
d_default(w, value)?;
|
||||
w.write_char(']')
|
||||
}
|
||||
|
||||
fn d_default(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result {
|
||||
|
|
Loading…
Reference in New Issue