1typedef unsigned long sample; 2struct pam 3{ 4 sample maxval; 5}; 6typedef sample *tuple; 7enum 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 }; 12struct cmdlineInfo 13{ 14 enum function function; 15 union 16 { 17 float divisor; 18 unsigned int shiftCount; 19 } 20 u; 21}; 22applyFunction (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