/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @author Igor V. Stolyarov * @version $Revision$ */ package java.awt.image; import org.apache.harmony.awt.gl.image.DataBufferListener; import org.apache.harmony.awt.internal.nls.Messages; /** * The Class DataBuffer is a wrapper class for a data array to be used for the * situation where a suite of functionality acts on a set of data in a * consistent way even though the primitive type of the data may vary from one * use to the next. * * @since Android 1.0 */ public abstract class DataBuffer { /** * The Constant TYPE_BYTE. */ public static final int TYPE_BYTE = 0; /** * The Constant TYPE_USHORT. */ public static final int TYPE_USHORT = 1; /** * The Constant TYPE_SHORT. */ public static final int TYPE_SHORT = 2; /** * The Constant TYPE_INT. */ public static final int TYPE_INT = 3; /** * The Constant TYPE_FLOAT. */ public static final int TYPE_FLOAT = 4; /** * The Constant TYPE_DOUBLE. */ public static final int TYPE_DOUBLE = 5; /** * The Constant TYPE_UNDEFINED. */ public static final int TYPE_UNDEFINED = 32; /** * The data type indicates the primitive type of the data in this * DataBuffer. */ protected int dataType; /** * The number of data arrays in this DataBuffer. */ protected int banks; /** * The starting index for reading the data from the first (or only) internal * data array. */ protected int offset; /** * The length (number of elements) of the data arrays. */ protected int size; /** * The starting indices for reading the data from the internal data arrays. */ protected int offsets[]; /** * The data changed. */ boolean dataChanged = true; /** * The data taken. */ boolean dataTaken = false; /** * The listener. */ DataBufferListener listener; static { AwtImageBackdoorAccessorImpl.init(); } /** * Instantiates a new data buffer. * * @param dataType * the data type. * @param size * the length (number of elements) of the data arrays. * @param numBanks * the number of data arrays to create. * @param offsets * the starting indices for reading the data from the internal * data arrays. */ protected DataBuffer(int dataType, int size, int numBanks, int[] offsets) { this.dataType = dataType; this.size = size; this.banks = numBanks; this.offsets = offsets.clone(); this.offset = offsets[0]; } /** * Instantiates a new data buffer with all of the data arrays starting at * the same index. * * @param dataType * the data type. * @param size * the length (number of elements) of the data arrays. * @param numBanks * the number of data arrays to create. * @param offset * the offset to use for all of the data arrays. */ protected DataBuffer(int dataType, int size, int numBanks, int offset) { this.dataType = dataType; this.size = size; this.banks = numBanks; this.offset = offset; this.offsets = new int[numBanks]; int i = 0; while (i < numBanks) { offsets[i++] = offset; } } /** * Instantiates a new data buffer with all of the data arrays read from the * beginning (at offset zero). * * @param dataType * the data type. * @param size * the length (number of elements) of the data arrays. * @param numBanks * the number of data arrays to create. */ protected DataBuffer(int dataType, int size, int numBanks) { this.dataType = dataType; this.size = size; this.banks = numBanks; this.offset = 0; this.offsets = new int[numBanks]; } /** * Instantiates a new data buffer with one internal data array read from the * beginning (at offset zero). * * @param dataType * the data type. * @param size * the length (number of elements) of the data arrays. */ protected DataBuffer(int dataType, int size) { this.dataType = dataType; this.size = size; this.banks = 1; this.offset = 0; this.offsets = new int[1]; } /** * Sets the data value in the specified array at the specified index. * * @param bank * the internal array to the data to. * @param i * the index within the array where the data should be written. * @param val * the value to write into the array. */ public abstract void setElem(int bank, int i, int val); /** * Sets the float data value in the specified array at the specified index. * * @param bank * the internal array to the data to. * @param i * the index within the array where the data should be written. * @param val * the value to write into the array. */ public void setElemFloat(int bank, int i, float val) { setElem(bank, i, (int)val); } /** * Sets the double data value in the specified array at the specified index. * * @param bank * the internal array to the data to. * @param i * the index within the array where the data should be written. * @param val * the value to write into the array. */ public void setElemDouble(int bank, int i, double val) { setElem(bank, i, (int)val); } /** * Sets the data value in the first array at the specified index. * * @param i * the index within the array where the data should be written. * @param val * the value to write into the array. */ public void setElem(int i, int val) { setElem(0, i, val); } /** * Gets the data value from the specified data array at the specified index. * * @param bank * the data array to read from. * @param i * the index within the array where the data should be read. * @return the data element. */ public abstract int getElem(int bank, int i); /** * Gets the float-type data value from the specified data array at the * specified index. * * @param bank * the data array to read from. * @param i * the index within the array where the data should be read. * @return the data element. */ public float getElemFloat(int bank, int i) { return getElem(bank, i); } /** * Gets the double-type data value from the specified data array at the * specified index. * * @param bank * the data array to read from. * @param i * the index within the array where the data should be read. * @return the data element. */ public double getElemDouble(int bank, int i) { return getElem(bank, i); } /** * Sets the float data value in the first array at the specified index. * * @param i * the index within the array where the data should be written. * @param val * the value to write into the array. */ public void setElemFloat(int i, float val) { setElemFloat(0, i, val); } /** * Sets the double data value in the first array at the specified index. * * @param i * the index within the array where the data should be written. * @param val * the value to write into the array. */ public void setElemDouble(int i, double val) { setElemDouble(0, i, val); } /** * Gets the data value from the first data array at the specified index and * returns it as an integer. * * @param i * the index within the array where the data should be read. * @return the data element. */ public int getElem(int i) { return getElem(0, i); } /** * Gets the data value from the first data array at the specified index and * returns it as a float. * * @param i * the index within the array where the data should be read. * @return the data element. */ public float getElemFloat(int i) { return getElem(0, i); } /** * Gets the data value from the first data array at the specified index and * returns it as a double. * * @param i * the index within the array where the data should be read. * @return the data element. */ public double getElemDouble(int i) { return getElem(i); } /** * Gets the array giving the offsets corresponding to the internal data * arrays. * * @return the array of offsets. */ public int[] getOffsets() { return offsets; } /** * Gets the size in bits of the primitive data type. * * @return the size in bits of the primitive data type. */ public int getSize() { return size; } /** * Gets the offset corresponding to the first internal data array. * * @return the offset. */ public int getOffset() { return offset; } /** * Gets the number of data arrays in this DataBuffer. * * @return the number of data arrays. */ public int getNumBanks() { return banks; } /** * Gets the primitive type of this buffer's data. * * @return the data type. */ public int getDataType() { return this.dataType; } /** * Gets the size in bits of the primitive data type. * * @param type * the primitive type. * @return the size in bits of the primitive data type. */ public static int getDataTypeSize(int type) { switch (type) { case TYPE_BYTE: return 8; case TYPE_USHORT: case TYPE_SHORT: return 16; case TYPE_INT: case TYPE_FLOAT: return 32; case TYPE_DOUBLE: return 64; default: // awt.22C=Unknown data type {0} throw new IllegalArgumentException(Messages.getString("awt.22C", type)); //$NON-NLS-1$ } } /** * Notifies the listener that the data has changed. */ void notifyChanged() { if (listener != null && !dataChanged) { dataChanged = true; listener.dataChanged(); } } /** * Notifies the listener that the data has been released. */ void notifyTaken() { if (listener != null && !dataTaken) { dataTaken = true; listener.dataTaken(); } } /** * Release the data. */ void releaseData() { if (listener != null && dataTaken) { dataTaken = false; listener.dataReleased(); } } /** * Adds the data buffer listener. * * @param listener * the listener. */ void addDataBufferListener(DataBufferListener listener) { this.listener = listener; } /** * Removes the data buffer listener. */ void removeDataBufferListener() { listener = null; } /** * Validate. */ void validate() { dataChanged = false; } }