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