private static QImage warpImage(QImage src, int warp, int sign) { int w = src.width(); int ppl = src.bytesPerLine() / 4; int srch = src.height(); int desth = srch + warp; QImage dest = new QImage(w, desth, QImage.Format.Format_ARGB32_Premultiplied); dest.fill(0); QNativePointer sbits = src.bits(); QNativePointer dbits = dest.bits(); sbits.setVerificationEnabled(false); dbits.setVerificationEnabled(false); double r = w / 2.0; int extra_offset = sign >= 0 ? 0 : warp; for (int x = 0; x < w; ++x) { int oset = (int) (((Math.sqrt(Math.abs(r * r - (x - r) * (x - r)))) * sign / r) * warp); for (int y = 0; y < srch; ++y) { int p = sbits.intAt(y * ppl + x); dbits.setIntAt(((y + oset + extra_offset) * ppl) + x, p); } } return dest; }