in src/main/java/org/apache/pdfbox/jbig2/image/Scanline.java [531:575]
protected void filter(final int[] preShift, final int[] postShift, final Weighttab[] tabs,
final Scanline dst)
{
final ByteBiLevelPackedScanline bblps = (ByteBiLevelPackedScanline) dst;
final int nx = dst.length;
// start sum at 1<<shift-1 for rounding
final int start = 1 << postShift[0] - 1;
final int abuf[] = data;
final int bbuf[] = bblps.data;
// the next two blocks are duplicated except for the missing shift
// operation if preShift==0.
final int preShift0 = preShift[0];
final int postShift0 = postShift[0];
if (preShift0 != 0)
for (int bp = 0, b = 0; b < nx; b++)
{
final Weighttab wtab = tabs[b];
final int an = wtab.weights.length;
int sum = start;
for (int wp = 0, ap = wtab.i0; wp < an && ap < abuf.length; wp++)
{
sum += wtab.weights[wp] * (abuf[ap++] >> preShift0);
}
final int t = sum >> postShift0;
bbuf[bp++] = t < 0 ? 0 : t > 255 ? 255 : t;
}
else
for (int bp = 0, b = 0; b < nx; b++)
{
final Weighttab wtab = tabs[b];
final int an = wtab.weights.length;
int sum = start;
for (int wp = 0, ap = wtab.i0; wp < an && ap < abuf.length; wp++)
{
sum += wtab.weights[wp] * abuf[ap++];
}
bbuf[bp++] = sum >> postShift0;
}
}