r10440: add tables
[cl-photo.git] / cameras.lisp
1 ;;;; -*-a 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 :d2x :make :nikon :pixels (4288 . 2848) :imager (23.7 . 15.6) :name "D2X")
39    (:format :d100 :make :nikon :pixels (3037 . 2024) :imager (23.7 . 15.6) :name "D100")
40    (:format :d70 :make :nikon :pixels (3008 . 2000) :imager (23.7 . 15.6) :name "D70")
41    (:format :d70s :make :nikon :pixels (3008 . 2000) :imager (23.7 . 15.6) :name "D70s")
42    (:format :d50 :make :nikon :pixels (3008 . 2000) :imager (23.7 . 15.6) :name "D70")
43    (:format :d1x :make :nikon :pixels (4028 . 1324) :imager (23.7 . 15.6) :name "D1X")
44    (:format :d2h :make :nikon :pixels (2464 . 1632) :imager (23.3 . 15.5) :name "D2H")
45    (:format :d2hs :make :nikon :pixels (2464 . 1632) :imager (23.3 . 15.5) :name "D2Hs")
46    
47    (:format :300d :make :canon :pixels (3072 . 2048) :imager (22.7 . 15.1) :name "300D")
48    (:format :10d :make :canon :pixels (3072 . 2048) :imager (22.7 . 15.1) :name "10D")
49    (:format :d30 :make :canon :pixels (0 . 0) :imager (22.7 . 15.1) :name "D30")
50    (:format :d60 :make :canon :pixels (0 . 0) :imager (22.7 . 15.1) :name "D60")
51    (:format :350d :make :canon :pixels (3456 . 2304) :imager (22.2 . 14.8) :name "350D")
52    (:format :1d :make :canon :pixels (2464 . 1648) :imager (27 . 17.8) :name "1D")
53    (:format :20d :make :canon :pixels (3456 . 2304) :imager (22.5 . 15) :name "20D")
54    (:format :1dmkii :make :canon :pixels (3504 . 2336) :imager (28.7 . 19.1)
55     :name "1D Mark II" :nicks (:1d2 :1dii :1dmkii))
56    (:format :1ds :make :canon :pixels (4064 . 3328) :imager (36 . 24) :name "1Ds")
57    (:format :1dsmkii :make :canon :pixels (4992 . 3328) :imager (36 . 24)
58     :name "1Ds Mark II" :nicks (:1ds2 :1dsii))
59
60    (:format :35mm :imager (36 . 24) :name "35mm")
61
62    (:format :6x4.5cm :imager (60 . 45) :name "6x4.5cm" :nicks (:\645))
63    (:format :6x6cm :imager (60 . 60) :name "6x6cm" :nicks (:6x6))
64    (:format :6x7cm :imager (60 . 70) :name "6x7cm" :nicks (:6x7))
65    (:format :6x9cm :imager (60 . 90) :name "6x9cm" :nicks (:6x9))
66    (:format :6x12cm :imager (60 . 120) :name "6x12cm" :nicks (:6x12))
67
68    #.(make-output-format 4 5)
69    #.(make-output-format 5 7)
70    #.(make-output-format 8 10)
71    #.(make-output-format 11 13.75)
72    #.(make-output-format 11 16.5)
73    #.(make-output-format 13 16.25)
74    #.(make-output-format 13 19)
75    #.(make-output-format 16 20)
76    #.(make-output-format 16 24)
77    #.(make-output-format 18 22.5)
78    #.(make-output-format 18 24)
79    #.(make-output-format 24 30)
80    #.(make-output-format 24 36)
81   ))
82
83 (defun format-match-p (format-spec format)
84   (when (or (eql format-spec (getf format :format))
85             (member format-spec (getf format :nicks)))
86     t))
87
88 (defun find-format (format-spec)
89   (find format-spec +format-db+ :test 'format-match-p))
90
91 (defun pixel-dimensions (sensor-spec &key (format :35mm))
92   "Returns the number of pixels for a format. 
93 CAMERA-SPEC is either a keyword designating the camera or
94 the number of megapixels of the sensor.
95 FORMAT should be defined if the CAMERA-SPEC is the number of megapixels
96 so the proper aspect ratio is used."
97   (etypecase sensor-spec
98     (keyword
99      (getf (find-format sensor-spec) :pixels))
100     (number
101      (sensor-dimensions-megapixels format sensor-spec))))
102
103 (defun imager-dimensions (format-spec)
104   "Returns the imager dimensions in mm of a FORMAT."
105   (getf (find-format format-spec) :imager))
106
107 (defun output-dimensions (format-spec)
108   "Returns the output dimensions in mm of a FORMAT."
109   (getf (find-format format-spec) :output))