public capex.image.ImageResizer.IndexMovingBuffer move(int n)
            {
                var v = new capex.image.ImageResizer.IndexMovingBuffer();

                v.setBuf(buf);
                v.setIndex(v.getIndex() + n);
                return(v);
            }
        public static capex.image.BitmapBuffer resizeBicubic(capex.image.BitmapBuffer bb, int anw, int anh)
        {
            if (anw == 0 || anh == 0)
            {
                return(null);
            }
            if (anw < 0 && anh < 0)
            {
                return(bb);
            }
            var sb = bb.getBuffer();

            if (sb == null)
            {
                return(null);
            }
            var w      = bb.getWidth();
            var h      = bb.getHeight();
            var scaler = 1.00;
            var nw     = anw;
            var nh     = anh;

            if (nw < 0)
            {
                scaler = (double)nh / (double)h;
            }
            else if (nh < 0)
            {
                scaler = (double)nw / (double)w;
            }
            if (scaler != 1.00)
            {
                nw = (int)((double)w * scaler);
                nh = (int)((double)h * scaler);
            }
            var v = new byte[nw * nh * 4];

            capex.image.ImageResizer.IndexMovingBuffer destp = null;
            destp.setBuf(v);
            var y      = 0;
            var sx     = (double)nw / (double)w;
            var sy     = (double)nh / (double)h;
            var matrix = capex.util.Matrix33.forScale(sx, sy);

            matrix = capex.util.Matrix33.invertMatrix(matrix);
            var uinc   = matrix.v[0];
            var vinc   = matrix.v[1];
            var winc   = matrix.v[2];
            var pixels = capex.image.RGBAPixelIntegerBuffer.create(sb, w, h);
            var pixrgn = capex.image.PixelRegionBuffer.forRgbaPixels(pixels, 4, 4);
            var tu     = new double[5];
            var tv     = new double[5];
            var tw     = new double[5];
            var su     = new double[5];
            var sv     = new double[5];

            for (y = 0; y < nh; y++)
            {
                capex.image.ImageResizer.untransformCoords(matrix, 0, y, tu, tv, tw);
                var width = nw;
                while (width-- > 0)
                {
                    var i = 0;
                    capex.image.ImageResizer.normalizeCoords(5, tu, tv, tw, su, sv);
                    if (capex.image.ImageResizer.superSampleDtest(su[1], sv[1], su[2], sv[2], su[3], sv[3], su[4], sv[4]))
                    {
                        capex.image.ImageResizer.sampleAdapt(pixels, su[0], sv[0], su[1], sv[1], su[2], sv[2], su[3], sv[3], su[4], sv[4], destp);
                    }
                    else
                    {
                        capex.image.ImageResizer.sampleCubic(pixrgn, su[0], sv[0], destp);
                    }
                    destp = destp.move(4);
                    for (i = 0; i < 5; i++)
                    {
                        tu[i] = tu[i] + uinc;
                        tv[i] = tv[i] + vinc;
                        tw[i] = tw[i] + winc;
                    }
                }
            }
            return(capex.image.BitmapBuffer.create(v, nw, nh));
        }
        public static void sampleCubic(capex.image.PixelRegionBuffer src, double su, double sv, capex.image.ImageResizer.IndexMovingBuffer dest)
        {
            var aval   = 0.00;
            var arecip = 0.00;
            var i      = 0;
            var iu     = (int)cape.Math.floor(su);
            var iv     = (int)cape.Math.floor(sv);
            var stride = src.getStride();
            var du     = 0.00;
            var dv     = 0.00;
            var br     = src.getBufferRegion(iu - 1, iv - 1);

            if (br == null)
            {
                return;
            }
            dest.setBuf(br);
            du   = su - iu;
            dv   = sv - iv;
            aval = capex.image.ImageResizer.drawableTransformCubic(dv, capex.image.ImageResizer.cubicRow(du, dest.move(3 + stride * 0)), capex.image.ImageResizer.cubicRow(du, dest.move(3 + stride * 1)), capex.image.ImageResizer.cubicRow(du, dest.move(3 + stride * 2)), capex.image.ImageResizer.cubicRow(du, dest.move(3 + stride * 3)));
            if (aval <= 0)
            {
                arecip = 0.00;
                cape.Buffer.setByte(dest.getBuf(), (long)3, (byte)0);
            }
            else if (aval > 255.00)
            {
                arecip = 1.00 / aval;
                cape.Buffer.setByte(dest.getBuf(), (long)3, (byte)255);
            }
            else
            {
                arecip = 1.00 / aval;
                cape.Buffer.setByte(dest.getBuf(), (long)3, (byte)((int)cape.Math.rint(aval)));
            }
            for (i = 0; i < 3; i++)
            {
                var v = (int)cape.Math.rint(arecip * capex.image.ImageResizer.drawableTransformCubic(dv, capex.image.ImageResizer.cubicScaledRow(du, dest.move(i + stride * 0), dest.move(3 + stride * 0)), capex.image.ImageResizer.cubicScaledRow(du, dest.move(i + stride * 1), dest.move(3 + stride * 1)), capex.image.ImageResizer.cubicScaledRow(du, dest.move(i + stride * 2), dest.move(3 + stride * 2)), capex.image.ImageResizer.cubicScaledRow(du, dest.move(i + stride * 3), dest.move(3 + stride * 3))));
                cape.Buffer.setByte(dest.getBuf(), (long)i, (byte)capex.image.ImageFilterUtil.clamp((double)v));
            }
        }
 public static int cubicScaledRow(double dx, capex.image.ImageResizer.IndexMovingBuffer row, capex.image.ImageResizer.IndexMovingBuffer arow)
 {
     return((int)capex.image.ImageResizer.drawableTransformCubic(dx, (int)(cape.Buffer.getByte(row.getBuf(), (long)0) * cape.Buffer.getByte(arow.getBuf(), (long)0)), (int)(cape.Buffer.getByte(row.getBuf(), (long)4) * cape.Buffer.getByte(arow.getBuf(), (long)4)), (int)(cape.Buffer.getByte(row.getBuf(), (long)8) * cape.Buffer.getByte(arow.getBuf(), (long)8)), (int)(cape.Buffer.getByte(row.getBuf(), (long)12) * cape.Buffer.getByte(arow.getBuf(), (long)12))));
 }
        public static void sampleAdapt(capex.image.RGBAPixelIntegerBuffer src, double xc, double yc, double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3, capex.image.ImageResizer.IndexMovingBuffer dest)
        {
            var cc   = 0;
            var i    = 0;
            var c    = new int[4];
            var cciv = 0;

            capex.image.ImageResizer.getSample(src, capex.image.ImageResizer.double2Fixed(xc), capex.image.ImageResizer.double2Fixed(yc), capex.image.ImageResizer.double2Fixed(x0), capex.image.ImageResizer.double2Fixed(y0), capex.image.ImageResizer.double2Fixed(x1), capex.image.ImageResizer.double2Fixed(y1), capex.image.ImageResizer.double2Fixed(x2), capex.image.ImageResizer.double2Fixed(y2), capex.image.ImageResizer.double2Fixed(x3), capex.image.ImageResizer.double2Fixed(y3), cciv, 3, c);
            cc = cciv;
            if (cc == 0)
            {
                cc = 1;
            }
            var aa = c[3] / cc;

            cape.Buffer.setByte(dest.getBuf(), (long)3, (byte)aa);
            if (aa != 0)
            {
                for (i = 0; i < 3; i++)
                {
                    cape.Buffer.setByte(dest.getBuf(), (long)i, (byte)(c[i] / cc * 255 / aa));
                }
            }
            else
            {
                for (i = 0; i < 3; i++)
                {
                    cape.Buffer.setByte(dest.getBuf(), (long)i, (byte)0);
                }
            }
        }