blob: 92f900fd36b2a0ce4bc969c6e742985dba1a88c9 [file] [log] [blame]
/*
* 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;
}
}