public static void convolveHV ( Kernel kernel , int [ ] inPixels , int [ ] outPixels , int width , int height , boolean alpha , int edgeAction ) { int index = 0 ; float [ ] matrix = kernel . getKernelData ( null ) ; int rows = kernel . getHeight ( ) ; int cols = kernel . getWidth ( ) ; int rows2 = rows / 2 ; int cols2 = cols / 2 ; for ( int y = 0 ; y < height ; y ++ ) { for ( int x = 0 ; x < width ; x ++ ) { float r = 0 , g = 0 , b = 0 , a = 0 ; for ( int row = - rows2 ; row <= rows2 ; row ++ ) { int iy = y + row ; int ioffset ; if ( 0 <= iy && iy < height ) ioffset = iy * width ; else if ( edgeAction == CLAMP_EDGES ) ioffset = y * width ; else if ( edgeAction == WRAP_EDGES ) ioffset = ( ( iy + height ) % height ) * width ; else continue ; int moffset = cols * ( row + rows2 ) + cols2 ; for ( int col = - cols2 ; col <= cols2 ; col ++ ) { float f = matrix [ moffset + col ] ; if ( f != 0 ) { int ix = x + col ; if ( ! ( 0 <= ix && ix < width ) ) { if ( edgeAction == CLAMP_EDGES ) ix = x ; else if ( edgeAction == WRAP_EDGES ) ix = ( x + width ) % width ; else continue ; } int rgb = inPixels [ ioffset + ix ] ; a += f * ( ( rgb >> 24 ) & 0xff ) ; r += f * ( ( rgb >> 16 ) & 0xff ) ; g += f * ( ( rgb >> 8 ) & 0xff ) ; b += f * ( rgb & 0xff ) ; } } } int ia = alpha ? PixelUtils . clamp ( ( int ) ( a + 0.5 ) ) : 0xff ; int ir = PixelUtils . clamp ( ( int ) ( r + 0.5 ) ) ; int ig = PixelUtils . clamp ( ( int ) ( g + 0.5 ) ) ; int ib = PixelUtils . clamp ( ( int ) ( b + 0.5 ) ) ; outPixels [ index ++ ] = ( ia << 24 ) | ( ir << 16 ) | ( ig << 8 ) | ib ; } } }
Convolve with a 2D kernel .