Java Code Examples for java.awt.image.Kernel#getHeight()

The following examples show how to use java.awt.image.Kernel#getHeight() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: BufferedBufImgOps.java    From dragonwell8_jdk with GNU General Public License v2.0 6 votes vote down vote up
private static void enableConvolveOp(RenderQueue rq,
                                     SurfaceData srcData,
                                     ConvolveOp cop)
{
    // assert rq.lock.isHeldByCurrentThread();
    boolean edgeZero =
        cop.getEdgeCondition() == ConvolveOp.EDGE_ZERO_FILL;
    Kernel kernel = cop.getKernel();
    int kernelWidth = kernel.getWidth();
    int kernelHeight = kernel.getHeight();
    int kernelSize = kernelWidth * kernelHeight;
    int sizeofFloat = 4;
    int totalBytesRequired = 4 + 8 + 12 + (kernelSize * sizeofFloat);

    RenderBuffer buf = rq.getBuffer();
    rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
    buf.putInt(ENABLE_CONVOLVE_OP);
    buf.putLong(srcData.getNativeOps());
    buf.putInt(edgeZero ? 1 : 0);
    buf.putInt(kernelWidth);
    buf.putInt(kernelHeight);
    buf.put(kernel.getKernelData(null));
}
 
Example 2
Source File: BufferedBufImgOps.java    From jdk8u-jdk with GNU General Public License v2.0 6 votes vote down vote up
private static void enableConvolveOp(RenderQueue rq,
                                     SurfaceData srcData,
                                     ConvolveOp cop)
{
    // assert rq.lock.isHeldByCurrentThread();
    boolean edgeZero =
        cop.getEdgeCondition() == ConvolveOp.EDGE_ZERO_FILL;
    Kernel kernel = cop.getKernel();
    int kernelWidth = kernel.getWidth();
    int kernelHeight = kernel.getHeight();
    int kernelSize = kernelWidth * kernelHeight;
    int sizeofFloat = 4;
    int totalBytesRequired = 4 + 8 + 12 + (kernelSize * sizeofFloat);

    RenderBuffer buf = rq.getBuffer();
    rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
    buf.putInt(ENABLE_CONVOLVE_OP);
    buf.putLong(srcData.getNativeOps());
    buf.putInt(edgeZero ? 1 : 0);
    buf.putInt(kernelWidth);
    buf.putInt(kernelHeight);
    buf.put(kernel.getKernelData(null));
}
 
Example 3
Source File: BufferedBufImgOps.java    From jdk8u_jdk with GNU General Public License v2.0 6 votes vote down vote up
private static void enableConvolveOp(RenderQueue rq,
                                     SurfaceData srcData,
                                     ConvolveOp cop)
{
    // assert rq.lock.isHeldByCurrentThread();
    boolean edgeZero =
        cop.getEdgeCondition() == ConvolveOp.EDGE_ZERO_FILL;
    Kernel kernel = cop.getKernel();
    int kernelWidth = kernel.getWidth();
    int kernelHeight = kernel.getHeight();
    int kernelSize = kernelWidth * kernelHeight;
    int sizeofFloat = 4;
    int totalBytesRequired = 4 + 8 + 12 + (kernelSize * sizeofFloat);

    RenderBuffer buf = rq.getBuffer();
    rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
    buf.putInt(ENABLE_CONVOLVE_OP);
    buf.putLong(srcData.getNativeOps());
    buf.putInt(edgeZero ? 1 : 0);
    buf.putInt(kernelWidth);
    buf.putInt(kernelHeight);
    buf.put(kernel.getKernelData(null));
}
 
Example 4
Source File: BufferedBufImgOps.java    From openjdk-8 with GNU General Public License v2.0 6 votes vote down vote up
private static void enableConvolveOp(RenderQueue rq,
                                     SurfaceData srcData,
                                     ConvolveOp cop)
{
    // assert rq.lock.isHeldByCurrentThread();
    boolean edgeZero =
        cop.getEdgeCondition() == ConvolveOp.EDGE_ZERO_FILL;
    Kernel kernel = cop.getKernel();
    int kernelWidth = kernel.getWidth();
    int kernelHeight = kernel.getHeight();
    int kernelSize = kernelWidth * kernelHeight;
    int sizeofFloat = 4;
    int totalBytesRequired = 4 + 8 + 12 + (kernelSize * sizeofFloat);

    RenderBuffer buf = rq.getBuffer();
    rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
    buf.putInt(ENABLE_CONVOLVE_OP);
    buf.putLong(srcData.getNativeOps());
    buf.putInt(edgeZero ? 1 : 0);
    buf.putInt(kernelWidth);
    buf.putInt(kernelHeight);
    buf.put(kernel.getKernelData(null));
}
 
Example 5
Source File: BufferedBufImgOps.java    From Bytecoder with Apache License 2.0 6 votes vote down vote up
private static void enableConvolveOp(RenderQueue rq,
                                     SurfaceData srcData,
                                     ConvolveOp cop)
{
    // assert rq.lock.isHeldByCurrentThread();
    boolean edgeZero =
        cop.getEdgeCondition() == ConvolveOp.EDGE_ZERO_FILL;
    Kernel kernel = cop.getKernel();
    int kernelWidth = kernel.getWidth();
    int kernelHeight = kernel.getHeight();
    int kernelSize = kernelWidth * kernelHeight;
    int sizeofFloat = 4;
    int totalBytesRequired = 4 + 8 + 12 + (kernelSize * sizeofFloat);

    RenderBuffer buf = rq.getBuffer();
    rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
    buf.putInt(ENABLE_CONVOLVE_OP);
    buf.putLong(srcData.getNativeOps());
    buf.putInt(edgeZero ? 1 : 0);
    buf.putInt(kernelWidth);
    buf.putInt(kernelHeight);
    buf.put(kernel.getKernelData(null));
}
 
Example 6
Source File: BufferedBufImgOps.java    From openjdk-jdk8u-backup with GNU General Public License v2.0 6 votes vote down vote up
private static void enableConvolveOp(RenderQueue rq,
                                     SurfaceData srcData,
                                     ConvolveOp cop)
{
    // assert rq.lock.isHeldByCurrentThread();
    boolean edgeZero =
        cop.getEdgeCondition() == ConvolveOp.EDGE_ZERO_FILL;
    Kernel kernel = cop.getKernel();
    int kernelWidth = kernel.getWidth();
    int kernelHeight = kernel.getHeight();
    int kernelSize = kernelWidth * kernelHeight;
    int sizeofFloat = 4;
    int totalBytesRequired = 4 + 8 + 12 + (kernelSize * sizeofFloat);

    RenderBuffer buf = rq.getBuffer();
    rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
    buf.putInt(ENABLE_CONVOLVE_OP);
    buf.putLong(srcData.getNativeOps());
    buf.putInt(edgeZero ? 1 : 0);
    buf.putInt(kernelWidth);
    buf.putInt(kernelHeight);
    buf.put(kernel.getKernelData(null));
}
 
Example 7
Source File: BufferedBufImgOps.java    From openjdk-jdk8u with GNU General Public License v2.0 6 votes vote down vote up
private static void enableConvolveOp(RenderQueue rq,
                                     SurfaceData srcData,
                                     ConvolveOp cop)
{
    // assert rq.lock.isHeldByCurrentThread();
    boolean edgeZero =
        cop.getEdgeCondition() == ConvolveOp.EDGE_ZERO_FILL;
    Kernel kernel = cop.getKernel();
    int kernelWidth = kernel.getWidth();
    int kernelHeight = kernel.getHeight();
    int kernelSize = kernelWidth * kernelHeight;
    int sizeofFloat = 4;
    int totalBytesRequired = 4 + 8 + 12 + (kernelSize * sizeofFloat);

    RenderBuffer buf = rq.getBuffer();
    rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
    buf.putInt(ENABLE_CONVOLVE_OP);
    buf.putLong(srcData.getNativeOps());
    buf.putInt(edgeZero ? 1 : 0);
    buf.putInt(kernelWidth);
    buf.putInt(kernelHeight);
    buf.put(kernel.getKernelData(null));
}
 
Example 8
Source File: BufferedBufImgOps.java    From jdk8u60 with GNU General Public License v2.0 6 votes vote down vote up
private static void enableConvolveOp(RenderQueue rq,
                                     SurfaceData srcData,
                                     ConvolveOp cop)
{
    // assert rq.lock.isHeldByCurrentThread();
    boolean edgeZero =
        cop.getEdgeCondition() == ConvolveOp.EDGE_ZERO_FILL;
    Kernel kernel = cop.getKernel();
    int kernelWidth = kernel.getWidth();
    int kernelHeight = kernel.getHeight();
    int kernelSize = kernelWidth * kernelHeight;
    int sizeofFloat = 4;
    int totalBytesRequired = 4 + 8 + 12 + (kernelSize * sizeofFloat);

    RenderBuffer buf = rq.getBuffer();
    rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
    buf.putInt(ENABLE_CONVOLVE_OP);
    buf.putLong(srcData.getNativeOps());
    buf.putInt(edgeZero ? 1 : 0);
    buf.putInt(kernelWidth);
    buf.putInt(kernelHeight);
    buf.put(kernel.getKernelData(null));
}
 
Example 9
Source File: ConvolveFilter.java    From weblaf with GNU General Public License v3.0 5 votes vote down vote up
public static void convolve ( final Kernel kernel, final int[] inPixels, final int[] outPixels, final int width, final int height, final boolean alpha, final int edgeAction )
{
    if ( kernel.getHeight () == 1 )
    {
        convolveH ( kernel, inPixels, outPixels, width, height, alpha, edgeAction );
    }
    else if ( kernel.getWidth () == 1 )
    {
        convolveV ( kernel, inPixels, outPixels, width, height, alpha, edgeAction );
    }
    else
    {
        convolveHV ( kernel, inPixels, outPixels, width, height, alpha, edgeAction );
    }
}
 
Example 10
Source File: BufferedBufImgOps.java    From openjdk-jdk9 with GNU General Public License v2.0 5 votes vote down vote up
/**************************** ConvolveOp support ****************************/

    public static boolean isConvolveOpValid(ConvolveOp cop) {
        Kernel kernel = cop.getKernel();
        int kw = kernel.getWidth();
        int kh = kernel.getHeight();
        // REMIND: we currently can only handle 3x3 and 5x5 kernels,
        //         but hopefully this is just a temporary restriction;
        //         see native shader comments for more details
        if (!(kw == 3 && kh == 3) && !(kw == 5 && kh == 5)) {
            return false;
        }
        return true;
    }
 
Example 11
Source File: BufferedBufImgOps.java    From jdk8u-dev-jdk with GNU General Public License v2.0 5 votes vote down vote up
/**************************** ConvolveOp support ****************************/

    public static boolean isConvolveOpValid(ConvolveOp cop) {
        Kernel kernel = cop.getKernel();
        int kw = kernel.getWidth();
        int kh = kernel.getHeight();
        // REMIND: we currently can only handle 3x3 and 5x5 kernels,
        //         but hopefully this is just a temporary restriction;
        //         see native shader comments for more details
        if (!(kw == 3 && kh == 3) && !(kw == 5 && kh == 5)) {
            return false;
        }
        return true;
    }
 
Example 12
Source File: BufferedBufImgOps.java    From hottub with GNU General Public License v2.0 5 votes vote down vote up
/**************************** ConvolveOp support ****************************/

    public static boolean isConvolveOpValid(ConvolveOp cop) {
        Kernel kernel = cop.getKernel();
        int kw = kernel.getWidth();
        int kh = kernel.getHeight();
        // REMIND: we currently can only handle 3x3 and 5x5 kernels,
        //         but hopefully this is just a temporary restriction;
        //         see native shader comments for more details
        if (!(kw == 3 && kh == 3) && !(kw == 5 && kh == 5)) {
            return false;
        }
        return true;
    }
 
Example 13
Source File: BufferedBufImgOps.java    From openjdk-8 with GNU General Public License v2.0 5 votes vote down vote up
/**************************** ConvolveOp support ****************************/

    public static boolean isConvolveOpValid(ConvolveOp cop) {
        Kernel kernel = cop.getKernel();
        int kw = kernel.getWidth();
        int kh = kernel.getHeight();
        // REMIND: we currently can only handle 3x3 and 5x5 kernels,
        //         but hopefully this is just a temporary restriction;
        //         see native shader comments for more details
        if (!(kw == 3 && kh == 3) && !(kw == 5 && kh == 5)) {
            return false;
        }
        return true;
    }
 
Example 14
Source File: BufferedBufImgOps.java    From dragonwell8_jdk with GNU General Public License v2.0 5 votes vote down vote up
/**************************** ConvolveOp support ****************************/

    public static boolean isConvolveOpValid(ConvolveOp cop) {
        Kernel kernel = cop.getKernel();
        int kw = kernel.getWidth();
        int kh = kernel.getHeight();
        // REMIND: we currently can only handle 3x3 and 5x5 kernels,
        //         but hopefully this is just a temporary restriction;
        //         see native shader comments for more details
        if (!(kw == 3 && kh == 3) && !(kw == 5 && kh == 5)) {
            return false;
        }
        return true;
    }
 
Example 15
Source File: ConvolveFilter.java    From weblaf with GNU General Public License v3.0 4 votes vote down vote up
/**
 * Convolve with a kernel consisting of one column
 */
public static void convolveV ( final Kernel kernel, final int[] inPixels, final int[] outPixels, final int width, final int height, final boolean alpha, final int edgeAction )
{
    int index = 0;
    final float[] matrix = kernel.getKernelData ( null );
    final int rows = kernel.getHeight ();
    final int rows2 = rows / 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++ )
            {
                final int iy = y + row;
                final int iOffset;
                if ( iy < 0 )
                {
                    if ( edgeAction == CLAMP_EDGES )
                    {
                        iOffset = 0;
                    }
                    else if ( edgeAction == WRAP_EDGES )
                    {
                        iOffset = ( ( y + height ) % height ) * width;
                    }
                    else
                    {
                        iOffset = iy * width;
                    }
                }
                else if ( iy >= height )
                {
                    if ( edgeAction == CLAMP_EDGES )
                    {
                        iOffset = ( height - 1 ) * width;
                    }
                    else if ( edgeAction == WRAP_EDGES )
                    {
                        iOffset = ( ( y + height ) % height ) * width;
                    }
                    else
                    {
                        iOffset = iy * width;
                    }
                }
                else
                {
                    iOffset = iy * width;
                }

                final float f = matrix[ row + rows2 ];

                if ( f != 0 )
                {
                    final int rgb = inPixels[ iOffset + x ];
                    a += f * ( ( rgb >> 24 ) & 0xff );
                    r += f * ( ( rgb >> 16 ) & 0xff );
                    g += f * ( ( rgb >> 8 ) & 0xff );
                    b += f * ( rgb & 0xff );
                }
            }
            final int ia = alpha ? PixelUtils.clamp ( ( int ) ( a + 0.5 ) ) : 0xff;
            final int ir = PixelUtils.clamp ( ( int ) ( r + 0.5 ) );
            final int ig = PixelUtils.clamp ( ( int ) ( g + 0.5 ) );
            final int ib = PixelUtils.clamp ( ( int ) ( b + 0.5 ) );
            outPixels[ index++ ] = ( ia << 24 ) | ( ir << 16 ) | ( ig << 8 ) | ib;
        }
    }
}
 
Example 16
Source File: ConvolveFilter.java    From weblaf with GNU General Public License v3.0 4 votes vote down vote up
/**
 * Convolve with a 2D kernel
 */
public static void convolveHV ( final Kernel kernel, final int[] inPixels, final int[] outPixels, final int width, final int height, final boolean alpha, final int edgeAction )
{
    int index = 0;
    final float[] matrix = kernel.getKernelData ( null );
    final int rows = kernel.getHeight ();
    final int cols = kernel.getWidth ();
    final int rows2 = rows / 2;
    final 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++ )
            {
                final int iy = y + row;
                final 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;
                }
                final int mOffset = cols * ( row + rows2 ) + cols2;
                for ( int col = -cols2; col <= cols2; col++ )
                {
                    final 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;
                            }
                        }
                        final int rgb = inPixels[ iOffset + ix ];
                        a += f * ( ( rgb >> 24 ) & 0xff );
                        r += f * ( ( rgb >> 16 ) & 0xff );
                        g += f * ( ( rgb >> 8 ) & 0xff );
                        b += f * ( rgb & 0xff );
                    }
                }
            }
            final int ia = alpha ? PixelUtils.clamp ( ( int ) ( a + 0.5 ) ) : 0xff;
            final int ir = PixelUtils.clamp ( ( int ) ( r + 0.5 ) );
            final int ig = PixelUtils.clamp ( ( int ) ( g + 0.5 ) );
            final int ib = PixelUtils.clamp ( ( int ) ( b + 0.5 ) );
            outPixels[ index++ ] = ( ia << 24 ) | ( ir << 16 ) | ( ig << 8 ) | ib;
        }
    }
}
 
Example 17
Source File: ConvolveFilter.java    From pumpernickel with MIT License 4 votes vote down vote up
/**
 * Convolve with a kernel consisting of one column
 * 
 * @param kernel
 *            the kernel to apply
 * @param inPixels
 *            the input pixels
 * @param outPixels
 *            the output pixels
 * @param width
 *            the width of the image
 * @param height
 *            the height of the image
 * @param alpha
 *            whether alpha is present
 * @param edgeAction
 *            one of the edge constants
 */
public static void convolveV(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 rows2 = rows / 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 (iy < 0) {
					if (edgeAction == CLAMP_EDGES)
						ioffset = 0;
					else if (edgeAction == WRAP_EDGES)
						ioffset = ((y + height) % height) * width;
					else
						ioffset = iy * width;
				} else if (iy >= height) {
					if (edgeAction == CLAMP_EDGES)
						ioffset = (height - 1) * width;
					else if (edgeAction == WRAP_EDGES)
						ioffset = ((y + height) % height) * width;
					else
						ioffset = iy * width;
				} else
					ioffset = iy * width;

				float f = matrix[row + rows2];

				if (f != 0) {
					int rgb = inPixels[ioffset + x];
					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;
		}
	}
}
 
Example 18
Source File: ConvolveFilter.java    From openbd-core with GNU General Public License v3.0 4 votes vote down vote up
/**
 * Convolve with a kernel consisting of one column.
    * @param kernel the kernel
    * @param inPixels the input pixels
    * @param outPixels the output pixels
    * @param width the width
    * @param height the height
    * @param alpha include alpha channel
    * @param edgeAction what to do at the edges
 */
public static void convolveV(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 rows2 = rows/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 ( iy < 0 ) {
					if ( edgeAction == CLAMP_EDGES )
						ioffset = 0;
					else if ( edgeAction == WRAP_EDGES )
						ioffset = ((y+height) % height)*width;
					else
						ioffset = iy*width;
				} else if ( iy >= height) {
					if ( edgeAction == CLAMP_EDGES )
						ioffset = (height-1)*width;
					else if ( edgeAction == WRAP_EDGES )
						ioffset = ((y+height) % height)*width;
					else
						ioffset = iy*width;
				} else
					ioffset = iy*width;

				float f = matrix[row+rows2];

				if (f != 0) {
					int rgb = inPixels[ioffset+x];
					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;
		}
	}
}
 
Example 19
Source File: ConvolveFilter.java    From Pixelitor with GNU General Public License v3.0 4 votes vote down vote up
/**
 * Convolve with a kernel consisting of one column.
 *
 * @param kernel     the kernel
 * @param inPixels   the input pixels
 * @param outPixels  the output pixels
 * @param width      the width
 * @param height     the height
 * @param alpha      include alpha channel
 * @param edgeAction what to do at the edges
 */
public static void convolveV(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 rows2 = rows / 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 (iy < 0) {
                    if (edgeAction == CLAMP_EDGES) {
                        ioffset = 0;
                    } else if (edgeAction == WRAP_EDGES) {
                        ioffset = ((y + height) % height) * width;
                    } else {
                        ioffset = iy * width;
                    }
                } else if (iy >= height) {
                    if (edgeAction == CLAMP_EDGES) {
                        ioffset = (height - 1) * width;
                    } else if (edgeAction == WRAP_EDGES) {
                        ioffset = ((y + height) % height) * width;
                    } else {
                        ioffset = iy * width;
                    }
                } else {
                    ioffset = iy * width;
                }

                float f = matrix[row + rows2];

                if (f != 0) {
                    int rgb = inPixels[ioffset + x];
                    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;
        }
    }
}
 
Example 20
Source File: ConvolveFilter.java    From Pixelitor with GNU General Public License v3.0 4 votes vote down vote up
/**
 * Convolve with a 2D kernel.
 *
 * @param kernel     the kernel
 * @param inPixels   the input pixels
 * @param outPixels  the output pixels
 * @param width      the width
 * @param height     the height
 * @param alpha      include alpha channel
 * @param edgeAction what to do at the edges
 */
public 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;

    pt = createProgressTracker(height);

    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;
        }
        pt.unitDone();
    }
    finishProgressTracker();
}