in src/main/java/org/apache/pdfbox/jbig2/image/Scanline.java [80:139]
protected void filter(final int[] preShift, final int[] postShift, final Weighttab[] tabs,
final Scanline dst)
{
final ByteBGRScanline bcs = (ByteBGRScanline) dst;
final int nx = dst.length;
// start sum at 1<<shift-1 for rounding
final int start[] = new int[] { 1 << postShift[0] - 1, 1 << postShift[1] - 1,
1 << postShift[2] - 1 };
final int abuf[] = data;
final int bbuf[] = bcs.data;
// the next two blocks are duplicated except for the missing shift
// operation if preShift==0.
if (preShift[0] != 0 || preShift[1] != 0 || preShift[2] != 0)
for (int bp = 0, b = 0; b < nx; b++)
{
final Weighttab wtab = tabs[b];
final int an = wtab.weights.length;
int sumr = start[0];
int sumg = start[1];
int sumb = start[2];
for (int wp = 0, ap = wtab.i0 * 3; wp < an && ap < abuf.length; wp++)
{
final int w = wtab.weights[wp];
sumr += w * (abuf[ap++] >> preShift[0]);
sumg += w * (abuf[ap++] >> preShift[1]);
sumb += w * (abuf[ap++] >> preShift[2]);
}
int t = sumr >> postShift[0];
bbuf[bp++] = t < 0 ? 0 : t > 255 ? 255 : t;
t = sumg >> postShift[1];
bbuf[bp++] = t < 0 ? 0 : t > 255 ? 255 : t;
t = sumb >> postShift[2];
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 sumr = start[0];
int sumg = start[1];
int sumb = start[2];
for (int wp = 0, ap = wtab.i0 * 3; wp < an && ap < abuf.length; wp++)
{
final int w = wtab.weights[wp];
sumr += w * abuf[ap++];
sumg += w * abuf[ap++];
sumb += w * abuf[ap++];
}
bbuf[bp++] = sumr >> postShift[0];
bbuf[bp++] = sumg >> postShift[1];
bbuf[bp++] = sumb >> postShift[2];
}
}