46 lines
1.1 KiB
C
46 lines
1.1 KiB
C
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));
|
|
}
|
|
}
|
|
}
|