tAdd reciprocity failure program - filmtools - various tools for photographic film development and darkroom printing
(HTM) git clone git://src.adamsgaard.dk/filmtools
(DIR) Log
(DIR) Files
(DIR) Refs
---
(DIR) commit 3546ae81af5a877bae48e2e2592c504cebc0dc1a
(DIR) parent 3e5d5e3b1968d4e4fabc24578adfa551d4331766
(HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
Date: Thu, 16 Jul 2020 22:09:51 +0200
Add reciprocity failure program
Diffstat:
A reciprocity.1 | 50 +++++++++++++++++++++++++++++++
A reciprocity.c | 85 +++++++++++++++++++++++++++++++
2 files changed, 135 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/reciprocity.1 b/reciprocity.1
t@@ -0,0 +1,50 @@
+.Dd JULY 16, 2020
+.Dt RECIPROCITY 1
+.Os
+.Sh NAME
+.Nm reciprocity
+.Nd calculates compensated exposure time for film reciprocity failure
+.Sh SYNOPSIS
+.Nm
+.Ar film
+.Ar time
+.Sh DESCRIPTION
+Photographic films suffer from low-intensity reciprocity failure
+during long exposures (usually >1 s). This program returns the
+compensated exposure time.
+.Bl -tag -width Ds
+.It Ar film
+specifies the film type and can be one of the following:
+.Bl -bullet -compact
+.It
+panf
+.It
+fp4
+.It
+hp5
+.It
+delta100
+.It
+delta400
+.It
+delta3200
+.It
+sfx
+.It
+xp2
+.It
+acros100
+.It
+tmx
+.It
+tmy
+.It
+tmz
+.It
+trix
+.El
+.It Ar time
+is metered exposure time in format MM:SS
+.El
+.Sh AUTHORS
+.An Anders Damsgaard Aq Mt anders@adamsgaard.dk
(DIR) diff --git a/reciprocity.c b/reciprocity.c
t@@ -0,0 +1,85 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <err.h>
+#include <math.h>
+#include <string.h>
+
+#define LENGTH(X) (sizeof X / sizeof X[0])
+
+typedef struct {
+ const char *manufacturer;
+ const char *name;
+ double factor;
+ double exponent;
+} Film;
+
+static const Film films[] = {
+ { "ilford", "panf", 1.00, 1.33 },
+ { "ilford", "fp4", 1.00, 1.26 },
+ { "ilford", "hp5", 1.00, 1.31 },
+ { "ilford", "delta100", 1.00, 1.26 },
+ { "ilford", "delta400", 1.00, 1.41 },
+ { "ilford", "delta3200", 1.00, 1.33 },
+ { "ilford", "sfx", 1.00, 1.43 },
+ { "ilford", "xp2", 1.00, 1.31 },
+ { "fujifilm", "acros100", 0.96, 1.02 },
+ { "kodak", "tmx", 1.18, 1.13 },
+ { "kodak", "tmy", 1.05, 1.22 },
+ { "kodak", "tmz", 1.34, 1.20 },
+ { "kodak", "trix", 2.41, 1.29 },
+};
+
+char *argv0;
+
+static void
+usage()
+{
+ int i;
+
+ printf("usage: %s film time\n", argv0);
+ puts("where time is metered exposure time in format MM:SS,");
+ puts("and film is one of the following:");
+ for (i = 0; i < LENGTH(films); i++)
+ printf(" %-12s (%s)\n", films[i].name, films[i].manufacturer);
+}
+
+int
+main(int argc, char **argv)
+{
+ double exponent;
+ int i, min, sec, sec_equiv;
+
+ argv0 = *argv;
+
+#ifdef __OpenBSD__
+ if (pledge("stdio", NULL) == -1)
+ errx(1, "pledge");
+#endif
+
+ if (argc != 3) {
+ usage();
+ errx(1, "incorrect arguments");
+ }
+
+ for (i = 0;; i++) {
+ if (i == LENGTH(films))
+ errx(3, "unknown film type");
+ if (strncasecmp(argv[1], films[i].name, 10) == 0) {
+ exponent = films[i].exponent;
+ break;
+ }
+ }
+
+ printf("exponent: %g\n", exponent);
+
+ if (sscanf(argv[2], "%d:%d", &min, &sec) != 2)
+ errx(2, "could not parse time in MM:SS format");
+
+ sec_equiv = pow(min*60 + sec, exponent);
+
+ printf("%d:%02d\n",
+ (int)(sec_equiv/60.0),
+ (int)(sec_equiv)%60);
+
+ return 0;
+}