blob: 6856aee0e795004db24dc68f8fa93e94cbfdea5e [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.
*/
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 int.
*
* @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;
}
}