/* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ package gnu.gcj.awt; import java.awt.image.*; /** * Utility class for creating and accessing data buffers of arbitrary * data types. */ public final class Buffers { /** * Create a data buffer of a particular type. * * @param dataType the desired data type of the buffer. * @param data an array containing data, or null * @param size the size of the data buffer bank */ public static DataBuffer createBuffer(int dataType, Object data, int size) { if (data == null) return createBuffer(dataType, size, 1); return createBufferFromData(dataType, data, size); } /** * Create a data buffer of a particular type. * * @param dataType the desired data type of the buffer. * @param size the size of the data buffer bank */ public static DataBuffer createBuffer(int dataType, int size) { return createBuffer(dataType, size, 1); } /** * Create a data buffer of a particular type. * * @param dataType the desired data type of the buffer. * @param size the size of the data buffer bank * @param numBanks the number of banks the buffer should have */ public static DataBuffer createBuffer(int dataType, int size, int numBanks) { switch (dataType) { case DataBuffer.TYPE_BYTE: return new DataBufferByte(size, numBanks); case DataBuffer.TYPE_USHORT: return new DataBufferUShort(size, numBanks); case DataBuffer.TYPE_INT: return new DataBufferInt(size, numBanks); default: throw new UnsupportedOperationException(); } } /** * Create a data buffer of a particular type. * * @param dataType the desired data type of the buffer * @param data an array containing the data * @param size the size of the data buffer bank */ public static DataBuffer createBufferFromData(int dataType, Object data, int size) { switch (dataType) { case DataBuffer.TYPE_BYTE: return new DataBufferByte((byte[]) data, size); case DataBuffer.TYPE_USHORT: return new DataBufferUShort((short[]) data, size); case DataBuffer.TYPE_INT: return new DataBufferInt((int[]) data, size); default: throw new UnsupportedOperationException(); } } /** * Return the data array of a data buffer, regardless of the data * type. * * @return an array of primitive values. The actual array type * depends on the data type of the buffer. */ public static Object getData(DataBuffer buffer) { if (buffer instanceof DataBufferByte) return ((DataBufferByte) buffer).getData(); if (buffer instanceof DataBufferUShort) return ((DataBufferUShort) buffer).getData(); if (buffer instanceof DataBufferInt) return ((DataBufferInt) buffer).getData(); throw new ClassCastException("Unknown data buffer type"); } /** * Copy data from array contained in data buffer, much like * System.arraycopy. Create a suitable destination array if the * given destination array is null. */ public static Object getData(DataBuffer src, int srcOffset, Object dest, int destOffset, int length) { Object from; if (src instanceof DataBufferByte) { from = ((DataBufferByte) src).getData(); if (dest == null) dest = new byte[length+destOffset]; } else if (src instanceof DataBufferUShort) { from = ((DataBufferUShort) src).getData(); if (dest == null) dest = new short[length+destOffset]; } else if (src instanceof DataBufferInt) { from = ((DataBufferInt) src).getData(); if (dest == null) dest = new int[length+destOffset]; } else { throw new ClassCastException("Unknown data buffer type"); } System.arraycopy(from, srcOffset, dest, destOffset, length); return dest; } /** * @param bits the width of a data element measured in bits * * @return the smallest data type that can store data elements of * the given number of bits, without any truncation. */ public static int smallestAppropriateTransferType(int bits) { if (bits <= 8) { return DataBuffer.TYPE_BYTE; } else if (bits <= 16) { return DataBuffer.TYPE_USHORT; } else if (bits <= 32) { return DataBuffer.TYPE_INT; } else { return DataBuffer.TYPE_UNDEFINED; } } }