protected void filter()

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];
                }
        }