/* * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ 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 */ 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. */ public final int getXOrigin(){ return xOrigin; } /** * Returns the Y origin of this Kernel. * @return the Y origin. */ public final int getYOrigin() { return yOrigin; } /** * Returns the width of this Kernel. * @return the width of this Kernel. */ public final int getWidth() { return width; } /** * Returns the height of this Kernel. * @return the height of this Kernel. */ public final 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 */ public final 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(e); } } }