(eval-when (:compile-toplevel :load-toplevel :execute)
(defun make-output-format (w h &key (units :inches))
(let ((name (format nil "~Dx~D~A" w h
- (ecase units
- (:inches "in")
- (:mm "mm")
- (:cm "cm")
- (:m "m")
- (:feet "ft")))))
+ (ecase units
+ (:inches "in")
+ (:mm "mm")
+ (:cm "cm")
+ (:m "m")
+ (:feet "ft")))))
(list :format (kmrcl:ensure-keyword name)
:output (cons (length->mm w units) (length->mm h units))
:name name
:name "N Digital")
(:format :s1pro :make "FujiFilm" :pixels (3040 . 2016) :imager (23 . 15.5)
- :name "FinePix S1 Pro")
+ :name "FinePix S1 Pro")
(:format :s2pro :make "FujiFilm" :pixels (4256 . 2848) :imager (23 . 15.5)
:name "FinePix S2 Pro")
(:format :s3pro :make "FujiFilm" :pixels (4256 . 2848) :imager (23 . 15.5)
(:format :1/1.8in :imager (7.18 . 5.32) :name "1/1.8\"")
(:format :dx :imager (24 . 16) :name "DX")
(:format :35mm :imager (36 . 24) :name "35mm")
-
+
(:format :6x4.5cm :imager (60 . 45) :name "6x4.5cm" :nicks (:\645))
(:format :6x6cm :imager (60 . 60) :name "6x6cm" :nicks (:6x6))
(:format :6x7cm :imager (60 . 70) :name "6x7cm" :nicks (:6x7))
(:format :6x9cm :imager (60 . 90) :name "6x9cm" :nicks (:6x9))
(:format :6x12cm :imager (60 . 120) :name "6x12cm" :nicks (:6x12))
-
+
#.(make-output-format 4 5)
#.(make-output-format 5 7)
#.(make-output-format 8 10)
))
(defun sort-formats (formats)
- (sort formats
- (lambda (a b)
- (block nil
- (cond
- ((and (null (getf a :make)) (getf b :make))
- (return nil))
- ((and (getf a :make) (null (getf b :make)))
- (return t))
- ((string-lessp (getf a :make) (getf b :make))
- (return t))
- ((string-greaterp (getf a :make) (getf b :make))
- (return nil)))
- (when (and (getf a :name) (getf b :name))
- (cond
- ((string-lessp (getf a :name) (getf b :name))
- (return t))
- ((string-greaterp (getf a :name) (getf b :name))
- (return nil))))))))
+ (sort formats
+ (lambda (a b)
+ (block nil
+ (cond
+ ((and (null (getf a :make)) (getf b :make))
+ (return nil))
+ ((and (getf a :make) (null (getf b :make)))
+ (return t))
+ ((string-lessp (getf a :make) (getf b :make))
+ (return t))
+ ((string-greaterp (getf a :make) (getf b :make))
+ (return nil)))
+ (when (and (getf a :name) (getf b :name))
+ (cond
+ ((string-lessp (getf a :name) (getf b :name))
+ (return t))
+ ((string-greaterp (getf a :name) (getf b :name))
+ (return nil))))))))
(defvar *digital-cameras*
(sort-formats (loop for format in +format-db+
- when (getf format :pixels)
- collect format)))
+ when (getf format :pixels)
+ collect format)))
(defvar *cameras*
(sort-formats (loop for format in +format-db+
- when (getf format :imager)
- collect format)))
-
+ when (getf format :imager)
+ collect format)))
+
(defun format-match-p (format-spec format)
(let ((key (ensure-keyword format-spec)))
(when (or (eql key (getf format :format))
- (member key (getf format :nicks)))
+ (member key (getf format :nicks)))
t)))
(defun find-format (format-spec)
(find format-spec +format-db+ :test 'format-match-p))
(defun pixel-dimensions (sensor-spec &key (format :35mm))
- "Returns the number of pixels for a format.
+ "Returns the number of pixels for a format.
CAMERA-SPEC is either a keyword designating the camera or
the number of megapixels of the sensor.
FORMAT should be defined if the CAMERA-SPEC is the number of megapixels
"Returns the imager dimensions in mm of a FORMAT."
(getf (find-format format-spec) :imager))
-(defun pixel-size (format-spec)
+(defun pixel-size (format-spec)
"Return pixel size in micrometers."
(let ((pixel-dim (pixel-dimensions format-spec))
- (imager-dim (imager-dimensions format-spec)))
+ (imager-dim (imager-dimensions format-spec)))
(when (and pixel-dim imager-dim)
(values (* 1000 (/ (car imager-dim) (car pixel-dim)))
- (* 1000 (/ (cdr imager-dim) (cdr pixel-dim)))))))
+ (* 1000 (/ (cdr imager-dim) (cdr pixel-dim)))))))
(defun output-dimensions (format-spec)
"Returns the output dimensions in mm of a FORMAT."