File size: 1,073 Bytes
2409829
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use crate::tiff::file::TiffRead;
use crate::tiff::tags::{Make, Model, Tag};
use crate::tiff::{Ifd, TiffError};
use rawkit_proc_macros::Tag;
use std::io::{Read, Seek};

const COMPANY_NAMES: [&str; 22] = [
	"AgfaPhoto",
	"Canon",
	"Casio",
	"Epson",
	"Fujifilm",
	"Mamiya",
	"Minolta",
	"Motorola",
	"Kodak",
	"Konica",
	"Leica",
	"Nikon",
	"Nokia",
	"Olympus",
	"Ricoh",
	"Pentax",
	"Phase One",
	"Samsung",
	"Sigma",
	"Sinar",
	"Sony",
	"YI",
];

#[allow(dead_code)]
#[derive(Tag)]
struct CameraModelIfd {
	make: Make,
	model: Model,
}

pub struct CameraModel {
	pub make: String,
	pub model: String,
}

pub fn identify_camera_model<R: Read + Seek>(ifd: &Ifd, file: &mut TiffRead<R>) -> Option<CameraModel> {
	let mut ifd = ifd.get_value::<CameraModelIfd, _>(file).unwrap();

	ifd.make.make_ascii_lowercase();
	for company_name in COMPANY_NAMES {
		let lowercase_company_name = company_name.to_ascii_lowercase();
		if ifd.make.contains(&lowercase_company_name) {
			return Some(CameraModel {
				make: company_name.to_string(),
				model: ifd.model,
			});
		}
	}

	None
}