| typedef unsigned long sample; |
| struct pam |
| { |
| sample maxval; |
| }; |
| typedef sample *tuple; |
| enum function |
| { |
| FN_MULTIPLY, FN_DIVIDE, FN_ADD, FN_SUBTRACT, FN_MIN, FN_MAX, FN_AND, FN_OR, |
| FN_XOR, FN_NOT, FN_SHIFTLEFT, FN_SHIFTRIGHT |
| }; |
| struct cmdlineInfo |
| { |
| enum function function; |
| union |
| { |
| float divisor; |
| unsigned int shiftCount; |
| } |
| u; |
| }; |
| applyFunction (struct cmdlineInfo const cmdline, struct pam const inpam, |
| struct pam const outpam, tuple * const inputRow, |
| tuple * const outputRow) |
| { |
| float const oneOverDivisor = 1 / cmdline.u.divisor; |
| int col; |
| { |
| int plane; |
| { |
| sample const inSample = inputRow[col][plane]; |
| sample outSample; |
| switch (cmdline.function) |
| { |
| case FN_DIVIDE: |
| outSample = ((unsigned int) ((inSample * oneOverDivisor) + 0.5)); |
| break; |
| case FN_SHIFTLEFT: |
| outSample = (inSample << cmdline.u.shiftCount) & outpam.maxval; |
| } |
| outputRow[col][plane] = |
| ((outpam.maxval) < (outSample) ? (outpam.maxval) : (outSample)); |
| } |
| } |
| } |