/* * @(#)Kernel.java 1.22 03/12/19 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.awt.image; /** * The Kernel class defines a matrix that describes how a * specified pixel and its surrounding pixels affect the value * computed for the pixel's position in the output image of a filtering * operation. The X origin and Y origin indicate the kernel matrix element * that corresponds to the pixel position for which an output value is * being computed. * * @see ConvolveOp * @version 10 Feb 1997 */ public class Kernel implements Cloneable { private int width; private int height; private int xOrigin; private int yOrigin; private float data[]; private static native void initIDs(); static { ColorModel.loadLibraries(); initIDs(); } /** * Constructs a Kernel object from an array of floats. * The first width*height elements of * the data array are copied. * If the length of the data array is less * than width*height, an IllegalArgumentException is thrown. * The X origin is (width-1)/2 and the Y origin is (height-1)/2. * @param width width of the kernel * @param height height of the kernel * @param data kernel data in row major order * @throws IllegalArgumentException if the length of data * is less than the product of width and * height */ public Kernel(int width, int height, float data[]) { this.width = width; this.height = height; this.xOrigin = (width-1)>>1; this.yOrigin = (height-1)>>1; int len = width*height; if (data.length < len) { throw new IllegalArgumentException("Data array too small "+ "(is "+data.length+ " and should be "+len); } this.data = new float[len]; System.arraycopy(data, 0, this.data, 0, len); } /** * Returns the X origin of this Kernel. * @return the X origin. */ final public int getXOrigin(){ return xOrigin; } /** * Returns the Y origin of this Kernel. * @return the Y origin. */ final public int getYOrigin() { return yOrigin; } /** * Returns the width of this Kernel. * @return the width of this Kernel. */ final public int getWidth() { return width; } /** * Returns the height of this Kernel. * @return the height of this Kernel. */ final public int getHeight() { return height; } /** * Returns the kernel data in row major order. * The data array is returned. If data * is null, a new array is allocated. * @param data if non-null, contains the returned kernel data * @return the data array containing the kernel data * in row major order or, if data is * null, a newly allocated array containing * the kernel data in row major order * @throws IllegalArgumentException if data is less * than the size of this Kernel */ final public float[] getKernelData(float[] data) { if (data == null) { data = new float[this.data.length]; } else if (data.length < this.data.length) { throw new IllegalArgumentException("Data array too small "+ "(should be "+this.data.length+ " but is "+ data.length+" )"); } System.arraycopy(this.data, 0, data, 0, this.data.length); return data; } /** * Clones this object. * @return a clone of this object. */ public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(); } } }