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