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;
       +}