1 typedef unsigned long sample;
2 struct pam
3 {
4   sample maxval;
5 };
6 typedef sample *tuple;
7 enum function
8   {
9     FN_MULTIPLY, FN_DIVIDE, FN_ADD, FN_SUBTRACT, FN_MIN, FN_MAX, FN_AND, FN_OR,
10     FN_XOR, FN_NOT, FN_SHIFTLEFT, FN_SHIFTRIGHT
11   };
12 struct cmdlineInfo
13 {
14   enum function function;
15   union
16   {
17     float divisor;
18     unsigned int shiftCount;
19   }
20     u;
21 };
applyFunction(struct cmdlineInfo const cmdline,struct pam const inpam,struct pam const outpam,tuple * const inputRow,tuple * const outputRow)22 applyFunction (struct cmdlineInfo const cmdline, struct pam const inpam,
23                struct pam const outpam, tuple * const inputRow,
24                tuple * const outputRow)
25 {
26   float const oneOverDivisor = 1 / cmdline.u.divisor;
27   int col;
28   {
29     int plane;
30     {
31       sample const inSample = inputRow[col][plane];
32       sample outSample;
33       switch (cmdline.function)
34         {
35         case FN_DIVIDE:
36           outSample = ((unsigned int) ((inSample * oneOverDivisor) + 0.5));
37           break;
38         case FN_SHIFTLEFT:
39           outSample = (inSample << cmdline.u.shiftCount) & outpam.maxval;
40         }
41       outputRow[col][plane] =
42         ((outpam.maxval) < (outSample) ? (outpam.maxval) : (outSample));
43     }
44   }
45 }
46