r10463: update cameras
[cl-photo.git] / cameras.lisp
1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10; Package: photo -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
4 ;;;;
5 ;;;; Name:          cameras.lisp
6 ;;;; Purpose:       Camera-specific data for cl-photo
7 ;;;; Programmer:    Kevin M. Rosenberg
8 ;;;; Date Started:  April 2005
9 ;;;;
10 ;;;; $Id: dof.lisp 10421 2005-04-19 21:57:00Z kevin $
11 ;;;;
12 ;;;; This file, part of cl-photo, is Copyright (c) 2005 by Kevin M. Rosenberg
13 ;;;;
14 ;;;; cl-photo users are granted the rights to distribute and use this software
15 ;;;; as governed by the terms of the GNU General Public License v2
16 ;;;; (http://www.gnu.org/licenses/gpl.html)
17 ;;;;
18 ;;;; *************************************************************************
19
20 (in-package #:photo)
21
22 (defun sensor-dimensions-megapixels (format megapixels)
23   (let* ((dim (imager-dimensions format))
24          (aspect-ratio (/ (car dim) (cdr dim)))
25          (width (round (sqrt (* aspect-ratio 1000000 megapixels)))))
26     (cons width (round (/ width aspect-ratio)))))
27
28 (eval-when (:compile-toplevel :load-toplevel :execute)
29   (defun make-output-format (w h &key (units :inches))
30     (let ((name (format nil "~Dx~Din" w h)))
31       (list :format (kmrcl:ensure-keyword name)
32             :output (cons (inches->mm w) (inches->mm h))
33             :name name
34             :nicks (list (kmrcl:ensure-keyword (format nil "~Dx~D" w h)))))))
35
36 (defparameter +format-db+
37   '(
38     (:format :dcs3 :make "Canon" :pixels (1268 . 1012) :imager (20.5 . 16.4) :name "EOS DCS1")
39     (:format :dcs1 :make "Canon" :pixels (3060 . 2036) :imager (27.6 . 18.4) :name "EOS DCS3")
40     (:format :d2000 :make "Canon" :pixels (1728 . 1152) :imager (22.8 . 15.5) :name "EOS D2000")
41     (:format :d6000 :make "Canon" :pixels (3040 . 2008) :imager (27.6 . 18.4) :name "EOS D6000")
42     (:format :d30 :make "Canon" :pixels (2160 . 1440) :imager (22 . 14.9) :name "D30")
43     (:format :d60 :make "Canon" :pixels (3072 . 2048) :imager (22.7 . 15.1) :name "D60")
44     (:format :10d :make "Canon" :pixels (3072 . 2048) :imager (22.7 . 15.1) :name "10D")
45     (:format :20d :make "Canon" :pixels (3456 . 2304) :imager (22.5 . 15) :name "20D")
46     (:format :300d :make "Canon" :pixels (3072 . 2048) :imager (22.7 . 15.1) :name "300D")
47     (:format :350d :make "Canon" :pixels (3456 . 2304) :imager (22.2 . 14.8) :name "350D")
48     (:format :1d :make "Canon" :pixels (2464 . 1648) :imager (27 . 17.8) :name "1D")
49     (:format :1dmkii :make "Canon" :pixels (3504 . 2336) :imager (28.7 . 19.1)
50      :name "1D Mark II" :nicks (:1d2 :1dii :1dmkii))
51     (:format :1ds :make "Canon" :pixels (4064 . 3328) :imager (36 . 24) :name "1Ds")
52     (:format :1dsmkii :make "Canon" :pixels (4992 . 3328) :imager (36 . 24)
53     :name "1Ds Mark II" :nicks (:1ds2 :1dsii))
54     
55     (:format :ndigital :make "Contax" :pixels (3040 . 2008) :imager (36 . 24)
56      :name "N Digital")
57
58     (:format :s1pro :make "FujiFilm" :pixels (3040 . 2016) :imager (23 . 15.5)
59      :name "FinePix S1 Pro") 
60     (:format :s2pro :make "FujiFilm" :pixels (4256 . 2848) :imager (23 . 15.5)
61      :name "FinePix S2 Pro")
62     (:format :s3pro :make "FujiFilm" :pixels (4256 . 2848) :imager (23 . 15.5)
63      :name "FinePix S2 Pro")
64
65     (:format :dcs100 :make "Kodak" :pixels (1280 . 1024) :imager (20.5 . 16.4) :name "DCS 100")
66     (:format :dcs200 :make "Kodak" :pixels (1524 . 1008) :imager (14 . 9.3) :name "DCS 200")
67     (:format :dcs315 :make "Kodak" :pixels (1520 . 1008) :imager nil :name "DCS 315")
68     (:format :dcs330 :make "Kodak" :pixels (2008 . 1504) :imager nil :name "DCS 330")
69     (:format :dcs420 :make "Kodak" :pixels (1524 . 1012) :imager (14 . 9.3) :name "DCS 420")
70     (:format :dcs460 :make "Kodak" :pixels (3060 . 2036) :imager (27.6 . 18.4) :name "DCS 460")
71     (:format :dcs520 :make "Kodak" :pixels (1728 . 1152) :imager (22.8 . 15.5) :name "DCS 520")
72     (:format :dcs560 :make "Kodak" :pixels (3040 . 2008) :imager (27.6 . 18.4) :name "DCS 560")
73     (:format :dcs620 :make "Kodak" :pixels (1728 . 1152) :imager (22.8 . 15.5) :name "DCS 620")
74     (:format :dcs660 :make "Kodak" :pixels (3040 . 2008) :imager (27.6 . 18.4) :name "DCS 660")
75     (:format :dcs720x :make "Kodak" :pixels (1728 . 1152) :imager (22.8 . 15.5) :name "DCS 720x")
76     (:format :dcs760 :make "Kodak" :pixels (3040 . 2008) :imager (27.6 . 18.4) :name "DCS 760")
77     (:format :dcsslr/n :make "Kodak" :pixels (4500 . 3000) :imager (36 . 24) :name "DCS SLR/n")
78     (:format :dcsslr/c :make "Kodak" :pixels (4500 . 3000) :imager (36 . 24) :name "DCS SLR/n")
79     (:format :dcs14n :make "Kodak" :pixels (4536 . 3024) :imager (36 . 24) :name "DCS 14n")
80
81     (:format :maxxum7d :make "Konica Minolta" :pixels (3008 . 2000) :imager (23.5 . 15.5)
82      :name "Maxxum 7D")
83
84     (:format :d1 :make "Nikon" :pixels (2000 . 1312) :imager (23.7 . 15.6) :name "D1")
85     (:format :d1x :make "Nikon" :pixels (4028 . 1324) :imager (23.7 . 15.6) :name "D1X")
86     (:format :d100 :make "Nikon" :pixels (3037 . 2024) :imager (23.7 . 15.6) :name "D100")
87     (:format :d50 :make "Nikon" :pixels (3008 . 2000) :imager (23.7 . 15.6) :name "D50")
88     (:format :d70 :make "Nikon" :pixels (3008 . 2000) :imager (23.7 . 15.6) :name "D70")
89     (:format :d70s :make "Nikon" :pixels (3008 . 2000) :imager (23.7 . 15.6) :name "D70s")
90     (:format :d2h :make "Nikon" :pixels (2464 . 1632) :imager (23.3 . 15.5) :name "D2H")
91     (:format :d2hs :make "Nikon" :pixels (2464 . 1632) :imager (23.3 . 15.5) :name "D2Hs")
92     (:format :d2x :make "Nikon" :pixels (4288 . 2848) :imager (23.7 . 15.6) :name "D2X")
93
94     (:format :*ist-d :make "Pentax" :pixels (3008 . 2008) :imager (36 . 24)
95      :name "*ist D")
96     (:format :*ist-ds :make "Pentax" :pixels (3008 . 2008) :imager (36 . 24)
97      :name "*ist DS")
98
99     (:format :sd9 :make "Sigma" :pixels (2268 . 1512) :imager (20.7 . 13.8)
100      :name "SD9")
101     (:format :sd10 :make "Sigma" :pixels (2268 . 1512) :imager (20.7 . 13.8)
102      :name "SD10")
103
104     (:format :35mm :imager (36 . 24) :name "35mm")
105     
106     (:format :6x4.5cm :imager (60 . 45) :name "6x4.5cm" :nicks (:\645))
107     (:format :6x6cm :imager (60 . 60) :name "6x6cm" :nicks (:6x6))
108     (:format :6x7cm :imager (60 . 70) :name "6x7cm" :nicks (:6x7))
109     (:format :6x9cm :imager (60 . 90) :name "6x9cm" :nicks (:6x9))
110     (:format :6x12cm :imager (60 . 120) :name "6x12cm" :nicks (:6x12))
111     
112     #.(make-output-format 4 5)
113     #.(make-output-format 5 7)
114     #.(make-output-format 8 10)
115     #.(make-output-format 11 13.75)
116     #.(make-output-format 11 16.5)
117     #.(make-output-format 13 16.25)
118     #.(make-output-format 13 19)
119     #.(make-output-format 16 20)
120     #.(make-output-format 16 24)
121     #.(make-output-format 18 22.5)
122     #.(make-output-format 18 24)
123     #.(make-output-format 24 30)
124     #.(make-output-format 24 36)
125     ))
126
127 (defun sort-formats (formats)
128   (sort formats 
129         (lambda (a b)
130           (block nil
131             (cond
132               ((and (null (getf a :make)) (getf b :make))
133                (return nil))
134               ((and (getf a :make) (null (getf b :make)))
135                (return t))
136               ((string-lessp (getf a :make) (getf b :make))
137                (return t))
138               ((string-greaterp (getf a :make) (getf b :make))
139                (return nil)))
140             (when (and (getf a :name) (getf b :name))
141               (cond
142                 ((string-lessp (getf a :name) (getf b :name))
143                  (return t))
144                 ((string-greaterp (getf a :name) (getf b :name))
145                  (return nil))))))))
146
147 (defvar *digital-cameras*
148   (sort-formats (loop for format in +format-db+
149                       when (getf format :pixels)
150                       collect format)))
151
152 (defvar *cameras*
153   (sort-formats (loop for format in +format-db+
154                       when (getf format :imager)
155                       collect format)))
156   
157
158 (defun format-match-p (format-spec format)
159   (let ((key (ensure-keyword format-spec)))
160     (when (or (eql key (getf format :format))
161               (member key (getf format :nicks)))
162       t)))
163
164 (defun find-format (format-spec)
165   (find format-spec +format-db+ :test 'format-match-p))
166
167 (defun pixel-dimensions (sensor-spec &key (format :35mm))
168   "Returns the number of pixels for a format. 
169 CAMERA-SPEC is either a keyword designating the camera or
170 the number of megapixels of the sensor.
171 FORMAT should be defined if the CAMERA-SPEC is the number of megapixels
172 so the proper aspect ratio is used."
173   (etypecase sensor-spec
174     ((or string keyword)
175      (getf (find-format sensor-spec) :pixels))
176     (number
177      (sensor-dimensions-megapixels format sensor-spec))))
178
179 (defun imager-dimensions (format-spec)
180   "Returns the imager dimensions in mm of a FORMAT."
181   (getf (find-format format-spec) :imager))
182
183 (defun pixel-size (format-spec) 
184   "Return pixel size in micrometers."
185   (let ((pixel-dim (pixel-dimensions format-spec))
186         (imager-dim (imager-dimensions format-spec)))
187     (when (and pixel-dim imager-dim)
188       (values (* 1000 (/ (car imager-dim) (car pixel-dim)))
189               (* 1000 (/ (cdr imager-dim) (cdr pixel-dim)))))))
190
191 (defun output-dimensions (format-spec)
192   "Returns the output dimensions in mm of a FORMAT."
193   (getf (find-format format-spec) :output))