Converter class implements the conversion of
- * an MPEG audio file to a .WAV file. To convert an MPEG audio stream,
- * just create an instance of this class and call the convert()
- * method, passing in the names of the input and output files. You can
- * pass in optional ProgressListener and
- * Decoder.Params objects also to customize the conversion.
- *
- * @author MDM 12/12/99
- * @since 0.0.7
- */
-public class Converter
-{
- /**
- * Creates a new converter instance.
- */
- public Converter()
- {
- }
-
- public synchronized void convert(String sourceName, String destName)
- throws JavaLayerException
- {
- convert(sourceName, destName, null, null);
- }
-
- public synchronized void convert(String sourceName, String destName,
- ProgressListener progressListener)
- throws JavaLayerException
- {
- convert(sourceName, destName, progressListener, null);
- }
-
-
- public void convert(String sourceName, String destName,
- ProgressListener progressListener, Decoder.Params decoderParams)
- throws JavaLayerException
- {
- if (destName.length()==0)
- destName = null;
- try {
- InputStream in = openInput(sourceName);
- convert(in, destName, progressListener, decoderParams);
- in.close();
- } catch(IOException ioe) {
- throw new JavaLayerException(ioe.getLocalizedMessage(), ioe);
- }
- }
-
- public synchronized void convert(InputStream sourceStream, String destName,
- ProgressListener progressListener, Decoder.Params decoderParams)
- throws JavaLayerException
- {
- if (progressListener==null)
- progressListener = PrintWriterProgressListener.newStdOut(
- PrintWriterProgressListener.NO_DETAIL);
- try {
- if (!(sourceStream instanceof BufferedInputStream))
- sourceStream = new BufferedInputStream(sourceStream);
- int frameCount = -1;
- if (sourceStream.markSupported()) {
- sourceStream.mark(-1);
- frameCount = countFrames(sourceStream);
- sourceStream.reset();
- }
- progressListener.converterUpdate(ProgressListener.UPDATE_FRAME_COUNT, frameCount, 0);
-
-
- Obuffer output = null;
- Decoder decoder = new Decoder(decoderParams);
- Bitstream stream = new Bitstream(sourceStream);
-
- if (frameCount==-1)
- frameCount = Integer.MAX_VALUE;
-
- int frame = 0;
- long startTime = System.currentTimeMillis();
-
- try
- {
- for (; frameThrowable instance that
- * was thrown.
- *
- * @return true to continue processing, or false
- * to abort conversion.
- *
- * If this method returns false, the exception
- * is propagated to the caller of the convert() method. If
- * true is returned, the exception is silently
- * ignored and the converter moves onto the next frame.
- */
- public boolean converterException(Throwable t);
-
- }
-
-
- /**
- * Implementation of ProgressListener that writes
- * notification text to a PrintWriter.
- */
- // REVIEW: i18n of text and order required.
- static public class PrintWriterProgressListener implements ProgressListener
- {
- static public final int NO_DETAIL = 0;
-
- /**
- * Level of detail typically expected of expert
- * users.
- */
- static public final int EXPERT_DETAIL = 1;
-
- /**
- * Verbose detail.
- */
- static public final int VERBOSE_DETAIL = 2;
-
- /**
- * Debug detail. All frame read notifications are shown.
- */
- static public final int DEBUG_DETAIL = 7;
-
- static public final int MAX_DETAIL = 10;
-
- private PrintWriter pw;
-
- private int detailLevel;
-
- static public PrintWriterProgressListener newStdOut(int detail)
- {
- return new PrintWriterProgressListener(
- new PrintWriter(System.out, true), detail);
- }
-
- public PrintWriterProgressListener(PrintWriter writer, int detailLevel)
- {
- this.pw = writer;
- this.detailLevel = detailLevel;
- }
-
-
- public boolean isDetail(int detail)
- {
- return (this.detailLevel >= detail);
- }
-
- public void converterUpdate(int updateID, int param1, int param2)
- {
- if (isDetail(VERBOSE_DETAIL))
- {
- switch (updateID)
- {
- case UPDATE_CONVERT_COMPLETE:
- // catch divide by zero errors.
- if (param2==0)
- param2 = 1;
-
- pw.println();
- pw.println("Converted "+param2+" frames in "+param1+" ms ("+
- (param1/param2)+" ms per frame.)");
- }
- }
- }
-
- public void parsedFrame(int frameNo, Header header)
- {
- if ((frameNo==0) && isDetail(VERBOSE_DETAIL))
- {
- String headerString = header.toString();
- pw.println("File is a "+headerString);
- }
- else if (isDetail(MAX_DETAIL))
- {
- String headerString = header.toString();
- pw.println("Prased frame "+frameNo+": "+headerString);
- }
- }
-
- public void readFrame(int frameNo, Header header)
- {
- if ((frameNo==0) && isDetail(VERBOSE_DETAIL))
- {
- String headerString = header.toString();
- pw.println("File is a "+headerString);
- }
- else if (isDetail(MAX_DETAIL))
- {
- String headerString = header.toString();
- pw.println("Read frame "+frameNo+": "+headerString);
- }
- }
-
- public void decodedFrame(int frameNo, Header header, Obuffer o)
- {
- if (isDetail(MAX_DETAIL))
- {
- String headerString = header.toString();
- pw.println("Decoded frame "+frameNo+": "+headerString);
- pw.println("Output: "+o);
- }
- else if (isDetail(VERBOSE_DETAIL))
- {
- if (frameNo==0)
- {
- pw.print("Converting.");
- pw.flush();
- }
-
- if ((frameNo % 10)==0)
- {
- pw.print('.');
- pw.flush();
- }
- }
- }
-
- public boolean converterException(Throwable t)
- {
- if (this.detailLevel>NO_DETAIL)
- {
- t.printStackTrace(pw);
- pw.flush();
- }
- return false;
- }
-
- }
-
-
-}
\ No newline at end of file
diff --git a/src/javazoom/jl/converter/RiffFile.java b/src/javazoom/jl/converter/RiffFile.java
deleted file mode 100644
index 9e6341972a0..00000000000
--- a/src/javazoom/jl/converter/RiffFile.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 02/23/99 JavaConversion by E.B
- * Don Cross, April 1993.
- * RIFF file format classes.
- * See Chapter 8 of "Multimedia Programmer's Reference" in
- * the Microsoft Windows SDK.
- *
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.converter;
-
-import java.io.IOException;
-import java.io.RandomAccessFile;
-
-
-/**
- * Class to manage RIFF files
- */
-public class RiffFile
-{
- static class RiffChunkHeader
- {
- public int ckID = 0; // Four-character chunk ID
- public int ckSize = 0; // Length of data in chunk
- public RiffChunkHeader()
- {}
- }
-
-
- // DDCRET
- public static final int DDC_SUCCESS = 0; // The operation succeded
- public static final int DDC_FAILURE = 1; // The operation failed for unspecified reasons
- public static final int DDC_OUT_OF_MEMORY = 2; // Operation failed due to running out of memory
- public static final int DDC_FILE_ERROR = 3; // Operation encountered file I/O error
- public static final int DDC_INVALID_CALL = 4; // Operation was called with invalid parameters
- public static final int DDC_USER_ABORT = 5; // Operation was aborted by the user
- public static final int DDC_INVALID_FILE = 6; // File format does not match
-
- // RiffFileMode
- public static final int RFM_UNKNOWN = 0; // undefined type (can use to mean "N/A" or "not open")
- public static final int RFM_WRITE = 1; // open for write
- public static final int RFM_READ = 2; // open for read
-
- private RiffChunkHeader riff_header; // header for whole file
- protected int fmode; // current file I/O mode
- protected RandomAccessFile file; // I/O stream to use
-
- /**
- * Dummy Constructor
- */
- public RiffFile()
- {
- file = null;
- fmode = RFM_UNKNOWN;
- riff_header = new RiffChunkHeader();
-
- riff_header.ckID = FourCC("RIFF");
- riff_header.ckSize = 0;
- }
-
- /**
- * Return File Mode.
- */
- public int CurrentFileMode()
- {return fmode;}
-
- /**
- * Open a RIFF file.
- */
- public int Open(String Filename, int NewMode)
- {
- int retcode = DDC_SUCCESS;
-
- if ( fmode != RFM_UNKNOWN )
- {
- retcode = Close();
- }
-
- if ( retcode == DDC_SUCCESS )
- {
- switch ( NewMode )
- {
- case RFM_WRITE:
- try
- {
- file = new RandomAccessFile(Filename,"rw");
-
- try
- {
- // Write the RIFF header...
- // We will have to come back later and patch it!
- byte[] br = new byte[8];
- br[0] = (byte) ((riff_header.ckID >>> 24) & 0x000000FF);
- br[1] = (byte) ((riff_header.ckID >>> 16) & 0x000000FF);
- br[2] = (byte) ((riff_header.ckID >>> 8) & 0x000000FF);
- br[3] = (byte) (riff_header.ckID & 0x000000FF);
-
- byte br4 = (byte) ((riff_header.ckSize >>> 24)& 0x000000FF);
- byte br5 = (byte) ((riff_header.ckSize >>> 16)& 0x000000FF);
- byte br6 = (byte) ((riff_header.ckSize >>> 8)& 0x000000FF);
- byte br7 = (byte) (riff_header.ckSize & 0x000000FF);
-
- br[4] = br7;
- br[5] = br6;
- br[6] = br5;
- br[7] = br4;
-
- file.write(br,0,8);
- fmode = RFM_WRITE;
- } catch (IOException ioe)
- {
- file.close();
- fmode = RFM_UNKNOWN;
- }
- } catch (IOException ioe)
- {
- fmode = RFM_UNKNOWN;
- retcode = DDC_FILE_ERROR;
- }
- break;
-
- case RFM_READ:
- try
- {
- file = new RandomAccessFile(Filename,"r");
- try
- {
- // Try to read the RIFF header...
- byte[] br = new byte[8];
- file.read(br,0,8);
- fmode = RFM_READ;
- riff_header.ckID = ((br[0]<<24)& 0xFF000000) | ((br[1]<<16)&0x00FF0000) | ((br[2]<<8)&0x0000FF00) | (br[3]&0x000000FF);
- riff_header.ckSize = ((br[4]<<24)& 0xFF000000) | ((br[5]<<16)&0x00FF0000) | ((br[6]<<8)&0x0000FF00) | (br[7]&0x000000FF);
- } catch (IOException ioe)
- {
- file.close();
- fmode = RFM_UNKNOWN;
- }
- } catch (IOException ioe)
- {
- fmode = RFM_UNKNOWN;
- retcode = DDC_FILE_ERROR;
- }
- break;
- default:
- retcode = DDC_INVALID_CALL;
- }
- }
- return retcode;
- }
-
- /**
- * Write NumBytes data.
- */
- public int Write(byte[] Data, int NumBytes )
- {
- if ( fmode != RFM_WRITE )
- {
- return DDC_INVALID_CALL;
- }
- try
- {
- file.write(Data,0,NumBytes);
- fmode = RFM_WRITE;
- }
- catch (IOException ioe)
- {
- return DDC_FILE_ERROR;
- }
- riff_header.ckSize += NumBytes;
- return DDC_SUCCESS;
- }
-
-
-
- /**
- * Write NumBytes data.
- */
- public int Write(short[] Data, int NumBytes )
- {
- byte[] theData = new byte[NumBytes];
- int yc = 0;
- for (int y = 0;yjlc class presents the JavaLayer
- * Conversion functionality as a command-line program.
- *
- * @since 0.0.7
- */
-public class jlc
-{
-
- static public void main(String args[])
- {
- String[] argv;
- @SuppressWarnings("unused")
- long start = System.currentTimeMillis();
- int argc = args.length + 1;
- argv = new String[argc];
- argv[0] = "jlc";
- for(int i=0;i- * The implementation stores single bits as a word in the buffer. If - * a bit is set, the corresponding word in the buffer will be non-zero. - * If a bit is clear, the corresponding word is zero. Although this - * may seem waseful, this can be a factor of two quicker than - * packing 8 bits to a byte and extracting. - *
- */
-
-// REVIEW: there is no range checking, so buffer underflow or overflow
-// can silently occur.
-final class BitReserve
-{
- /**
- * Size of the internal buffer to store the reserved bits.
- * Must be a power of 2. And x8, as each bit is stored as a single
- * entry.
- */
- private static final int BUFSIZE = 4096*8;
-
- /**
- * Mask that can be used to quickly implement the
- * modulus operation on BUFSIZE.
- */
- private static final int BUFSIZE_MASK = BUFSIZE-1;
-
- private int offset, totbit, buf_byte_idx;
- private final int[] buf = new int[BUFSIZE];
-
- //private int buf_bit_idx;
-
- BitReserve()
- {
-
- offset = 0;
- totbit = 0;
- buf_byte_idx = 0;
- }
-
-
- /**
- * Return totbit Field.
- */
- public int hsstell()
- {
- return(totbit);
- }
-
- /**
- * Read a number bits from the bit stream.
- * @param N the number of
- */
- public int hgetbits(int N)
- {
- totbit += N;
-
- int val = 0;
-
- int pos = buf_byte_idx;
- if (pos+N < BUFSIZE)
- {
- while (N-- > 0)
- {
- val <<= 1;
- val |= ((buf[pos++]!=0) ? 1 : 0);
- }
- }
- else
- {
- while (N-- > 0)
- {
- val <<= 1;
- val |= ((buf[pos]!=0) ? 1 : 0);
- pos = (pos+1) & BUFSIZE_MASK;
- }
- }
- buf_byte_idx = pos;
- return val;
- }
-
-
-
- /**
- * Read 1 bit from the bit stream.
- */
-/*
- public int hget1bit_old()
- {
- int val;
- totbit++;
- if (buf_bit_idx == 0)
- {
- buf_bit_idx = 8;
- buf_byte_idx++;
- }
- // BUFSIZE = 4096 = 2^12, so
- // buf_byte_idx%BUFSIZE == buf_byte_idx & 0xfff
- val = buf[buf_byte_idx & BUFSIZE_MASK] & putmask[buf_bit_idx];
- buf_bit_idx--;
- val = val >>> buf_bit_idx;
- return val;
- }
- */
- /**
- * Returns next bit from reserve.
- * @returns 0 if next bit is reset, or 1 if next bit is set.
- */
- public int hget1bit()
- {
- totbit++;
- int val = buf[buf_byte_idx];
- buf_byte_idx = (buf_byte_idx+1) & BUFSIZE_MASK;
- return val;
- }
-
- /**
- * Retrieves bits from the reserve.
- */
-/*
- public int readBits(int[] out, int len)
- {
- if (buf_bit_idx == 0)
- {
- buf_bit_idx = 8;
- buf_byte_idx++;
- current = buf[buf_byte_idx & BUFSIZE_MASK];
- }
-
-
-
- // save total number of bits returned
- len = buf_bit_idx;
- buf_bit_idx = 0;
-
- int b = current;
- int count = len-1;
-
- while (count >= 0)
- {
- out[count--] = (b & 0x1);
- b >>>= 1;
- }
-
- totbit += len;
- return len;
- }
- */
-
- /**
- * Write 8 bits into the bit stream.
- */
- public void hputbuf(int val)
- {
- int ofs = offset;
- buf[ofs++] = val & 0x80;
- buf[ofs++] = val & 0x40;
- buf[ofs++] = val & 0x20;
- buf[ofs++] = val & 0x10;
- buf[ofs++] = val & 0x08;
- buf[ofs++] = val & 0x04;
- buf[ofs++] = val & 0x02;
- buf[ofs++] = val & 0x01;
-
- if (ofs==BUFSIZE)
- offset = 0;
- else
- offset = ofs;
-
- }
-
- /**
- * Rewind N bits in Stream.
- */
- public void rewindNbits(int N)
- {
- totbit -= N;
- buf_byte_idx -= N;
- if (buf_byte_idx<0)
- buf_byte_idx += BUFSIZE;
- }
-
- /**
- * Rewind N bytes in Stream.
- */
- public void rewindNbytes(int N)
- {
- int bits = (N << 3);
- totbit -= bits;
- buf_byte_idx -= bits;
- if (buf_byte_idx<0)
- buf_byte_idx += BUFSIZE;
- }
-}
diff --git a/src/javazoom/jl/decoder/Bitstream.java b/src/javazoom/jl/decoder/Bitstream.java
deleted file mode 100644
index 50828d3eb56..00000000000
--- a/src/javazoom/jl/decoder/Bitstream.java
+++ /dev/null
@@ -1,658 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- *
- * 11/17/04 Uncomplete frames discarded. E.B, javalayer@javazoom.net
- *
- * 12/05/03 ID3v2 tag returned. E.B, javalayer@javazoom.net
- *
- * 12/12/99 Based on Ibitstream. Exceptions thrown on errors,
- * Temporary removed seek functionality. mdm@techie.com
- *
- * 02/12/99 : Java Conversion by E.B , javalayer@javazoom.net
- *
- * 04/14/97 : Added function prototypes for new syncing and seeking
- * mechanisms. Also made this file portable. Changes made by Jeff Tsay
- *
- * @(#) ibitstream.h 1.5, last edit: 6/15/94 16:55:34
- * @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
- * @(#) Berlin University of Technology
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PushbackInputStream;
-
-
-/**
- * The
- * The exception provides details of the exception condition
- * in two ways:
- * Bistream class is responsible for parsing
- * an MPEG audio bitstream.
- *
- * REVIEW: much of the parsing currently occurs in the
- * various decoders. This should be moved into this class and associated
- * inner classes.
- */
-public final class Bitstream implements BitstreamErrors
-{
- /**
- * Synchronization control constant for the initial
- * synchronization to the start of a frame.
- */
- static byte INITIAL_SYNC = 0;
-
- /**
- * Synchronization control constant for non-initial frame
- * synchronizations.
- */
- static byte STRICT_SYNC = 1;
-
- // max. 1730 bytes per frame: 144 * 384kbit/s / 32000 Hz + 2 Bytes CRC
- /**
- * Maximum size of the frame buffer.
- */
- private static final int BUFFER_INT_SIZE = 433;
-
- /**
- * The frame buffer that holds the data for the current frame.
- */
- private final int[] framebuffer = new int[BUFFER_INT_SIZE];
-
- /**
- * Number of valid bytes in the frame buffer.
- */
- private int framesize;
-
- /**
- * The bytes read from the stream.
- */
- private byte[] frame_bytes = new byte[BUFFER_INT_SIZE*4];
-
- /**
- * Index into framebuffer where the next bits are
- * retrieved.
- */
- private int wordpointer;
-
- /**
- * Number (0-31, from MSB to LSB) of next bit for get_bits()
- */
- private int bitindex;
-
- /**
- * The current specified syncword
- */
- private int syncword;
-
- /**
- * Audio header position in stream.
- */
- private int header_pos = 0;
-
- /**
- *
- */
- private boolean single_ch_mode;
- //private int current_frame_number;
- //private int last_frame_number;
-
- private final int bitmask[] = {0, // dummy
- 0x00000001, 0x00000003, 0x00000007, 0x0000000F,
- 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
- 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
- 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF,
- 0x0001FFFF };
-
- private final PushbackInputStream source;
-
- private final Header header = new Header();
-
- private final byte syncbuf[] = new byte[4];
-
- private Crc16[] crc = new Crc16[1];
-
- private byte[] rawid3v2 = null;
-
- private boolean firstframe = true;
-
-
- /**
- * Construct a IBitstream that reads data from a
- * given InputStream.
- *
- * @param in The InputStream to read from.
- */
- public Bitstream(InputStream in)
- {
- if (in==null) throw new NullPointerException("in");
- in = new BufferedInputStream(in);
- loadID3v2(in);
- firstframe = true;
- //source = new PushbackInputStream(in, 1024);
- source = new PushbackInputStream(in, BUFFER_INT_SIZE*4);
-
- closeFrame();
- //current_frame_number = -1;
- //last_frame_number = -1;
- }
-
- /**
- * Return position of the first audio header.
- * @return size of ID3v2 tag frames.
- */
- public int header_pos()
- {
- return header_pos;
- }
-
- /**
- * Load ID3v2 frames.
- * @param in MP3 InputStream.
- * @author JavaZOOM
- */
- private void loadID3v2(InputStream in)
- {
- int size = -1;
- try
- {
- // Read ID3v2 header (10 bytes).
- in.mark(10);
- size = readID3v2Header(in);
- header_pos = size;
- }
- catch (IOException e)
- {}
- finally
- {
- try
- {
- // Unread ID3v2 header (10 bytes).
- in.reset();
- }
- catch (IOException e)
- {}
- }
- // Load ID3v2 tags.
- try
- {
- if (size > 0)
- {
- rawid3v2 = new byte[size];
- in.read(rawid3v2,0,rawid3v2.length);
- }
- }
- catch (IOException e)
- {}
- }
-
- /**
- * Parse ID3v2 tag header to find out size of ID3v2 frames.
- * @param in MP3 InputStream
- * @return size of ID3v2 frames + header
- * @throws IOException
- * @author JavaZOOM
- */
- private int readID3v2Header(InputStream in) throws IOException
- {
- byte[] id3header = new byte[4];
- int size = -10;
- in.read(id3header,0,3);
- // Look for ID3v2
- if ( (id3header[0]=='I') && (id3header[1]=='D') && (id3header[2]=='3'))
- {
- in.read(id3header,0,3);
- @SuppressWarnings("unused")
- int majorVersion = id3header[0];
- @SuppressWarnings("unused")
- int revision = id3header[1];
- in.read(id3header,0,4);
- size = (int) (id3header[0] << 21) + (id3header[1] << 14) + (id3header[2] << 7) + (id3header[3]);
- }
- return (size+10);
- }
-
- /**
- * Return raw ID3v2 frames + header.
- * @return ID3v2 InputStream or null if ID3v2 frames are not available.
- */
- public InputStream getRawID3v2()
- {
- if (rawid3v2 == null) return null;
- else
- {
- ByteArrayInputStream bain = new ByteArrayInputStream(rawid3v2);
- return bain;
- }
- }
-
- /**
- * Close the Bitstream.
- * @throws BitstreamException
- */
- public void close() throws BitstreamException
- {
- try
- {
- source.close();
- }
- catch (IOException ex)
- {
- throw newBitstreamException(STREAM_ERROR, ex);
- }
- }
-
- /**
- * Reads and parses the next frame from the input source.
- * @return the Header describing details of the frame read,
- * or null if the end of the stream has been reached.
- */
- public Header readFrame() throws BitstreamException
- {
- Header result = null;
- try
- {
- result = readNextFrame();
- // E.B, Parse VBR (if any) first frame.
- if (firstframe == true)
- {
- result.parseVBR(frame_bytes);
- firstframe = false;
- }
- }
- catch (BitstreamException ex)
- {
- if ((ex.getErrorCode()==INVALIDFRAME))
- {
- // Try to skip this frame.
- //System.out.println("INVALIDFRAME");
- try
- {
- closeFrame();
- result = readNextFrame();
- }
- catch (BitstreamException e)
- {
- if ((e.getErrorCode()!=STREAM_EOF))
- {
- // wrap original exception so stack trace is maintained.
- throw newBitstreamException(e.getErrorCode(), e);
- }
- }
- }
- else if ((ex.getErrorCode()!=STREAM_EOF))
- {
- // wrap original exception so stack trace is maintained.
- throw newBitstreamException(ex.getErrorCode(), ex);
- }
- }
- return result;
- }
-
- /**
- * Read next MP3 frame.
- * @return MP3 frame header.
- * @throws BitstreamException
- */
- private Header readNextFrame() throws BitstreamException
- {
- if (framesize == -1)
- {
- nextFrame();
- }
- return header;
- }
-
-
- /**
- * Read next MP3 frame.
- * @throws BitstreamException
- */
- private void nextFrame() throws BitstreamException
- {
- // entire frame is read by the header class.
- header.read_header(this, crc);
- }
-
- /**
- * Unreads the bytes read from the frame.
- * @throws BitstreamException
- */
- // REVIEW: add new error codes for this.
- public void unreadFrame() throws BitstreamException
- {
- if (wordpointer==-1 && bitindex==-1 && (framesize>0))
- {
- try
- {
- source.unread(frame_bytes, 0, framesize);
- }
- catch (IOException ex)
- {
- throw newBitstreamException(STREAM_ERROR);
- }
- }
- }
-
- /**
- * Close MP3 frame.
- */
- public void closeFrame()
- {
- framesize = -1;
- wordpointer = -1;
- bitindex = -1;
- }
-
- /**
- * Determines if the next 4 bytes of the stream represent a
- * frame header.
- */
- public boolean isSyncCurrentPosition(int syncmode) throws BitstreamException
- {
- int read = readBytes(syncbuf, 0, 4);
- int headerstring = ((syncbuf[0] << 24) & 0xFF000000) | ((syncbuf[1] << 16) & 0x00FF0000) | ((syncbuf[2] << 8) & 0x0000FF00) | ((syncbuf[3] << 0) & 0x000000FF);
-
- try
- {
- source.unread(syncbuf, 0, read);
- }
- catch (IOException ex)
- {
- }
-
- boolean sync = false;
- switch (read)
- {
- case 0:
- sync = true;
- break;
- case 4:
- sync = isSyncMark(headerstring, syncmode, syncword);
- break;
- }
-
- return sync;
- }
-
-
- // REVIEW: this class should provide inner classes to
- // parse the frame contents. Eventually, readBits will
- // be removed.
- public int readBits(int n)
- {
- return get_bits(n);
- }
-
- public int readCheckedBits(int n)
- {
- // REVIEW: implement CRC check.
- return get_bits(n);
- }
-
- protected BitstreamException newBitstreamException(int errorcode)
- {
- return new BitstreamException(errorcode, null);
- }
- protected BitstreamException newBitstreamException(int errorcode, Throwable throwable)
- {
- return new BitstreamException(errorcode, throwable);
- }
-
- /**
- * Get next 32 bits from bitstream.
- * They are stored in the headerstring.
- * syncmod allows Synchro flag ID
- * The returned value is False at the end of stream.
- */
-
- int syncHeader(byte syncmode) throws BitstreamException
- {
- boolean sync;
- int headerstring;
- // read additional 2 bytes
- int bytesRead = readBytes(syncbuf, 0, 3);
-
- if (bytesRead!=3) throw newBitstreamException(STREAM_EOF, null);
-
- headerstring = ((syncbuf[0] << 16) & 0x00FF0000) | ((syncbuf[1] << 8) & 0x0000FF00) | ((syncbuf[2] << 0) & 0x000000FF);
-
- do
- {
- headerstring <<= 8;
-
- if (readBytes(syncbuf, 3, 1)!=1)
- throw newBitstreamException(STREAM_EOF, null);
-
- headerstring |= (syncbuf[3] & 0x000000FF);
-
- sync = isSyncMark(headerstring, syncmode, syncword);
- }
- while (!sync);
-
- //current_frame_number++;
- //if (last_frame_number < current_frame_number) last_frame_number = current_frame_number;
-
- return headerstring;
- }
-
- public boolean isSyncMark(int headerstring, int syncmode, int word)
- {
- boolean sync = false;
-
- if (syncmode == INITIAL_SYNC)
- {
- //sync = ((headerstring & 0xFFF00000) == 0xFFF00000);
- sync = ((headerstring & 0xFFE00000) == 0xFFE00000); // SZD: MPEG 2.5
- }
- else
- {
- sync = ((headerstring & 0xFFF80C00) == word) &&
- (((headerstring & 0x000000C0) == 0x000000C0) == single_ch_mode);
- }
-
- // filter out invalid sample rate
- if (sync)
- sync = (((headerstring >>> 10) & 3)!=3);
- // filter out invalid layer
- if (sync)
- sync = (((headerstring >>> 17) & 3)!=0);
- // filter out invalid version
- if (sync)
- sync = (((headerstring >>> 19) & 3)!=1);
-
- return sync;
- }
-
- /**
- * Reads the data for the next frame. The frame is not parsed
- * until parse frame is called.
- */
- int read_frame_data(int bytesize) throws BitstreamException
- {
- int numread = 0;
- numread = readFully(frame_bytes, 0, bytesize);
- framesize = bytesize;
- wordpointer = -1;
- bitindex = -1;
- return numread;
- }
-
- /**
- * Parses the data previously read with read_frame_data().
- */
- void parse_frame() throws BitstreamException
- {
- // Convert Bytes read to int
- int b=0;
- byte[] byteread = frame_bytes;
- int bytesize = framesize;
-
- // Check ID3v1 TAG (True only if last frame).
- //for (int t=0;t<(byteread.length)-2;t++)
- //{
- // if ((byteread[t]=='T') && (byteread[t+1]=='A') && (byteread[t+2]=='G'))
- // {
- // System.out.println("ID3v1 detected at offset "+t);
- // throw newBitstreamException(INVALIDFRAME, null);
- // }
- //}
-
- for (int k=0;kBistreamExceptions.
- *
- * @see BitstreamException
- *
- * @author MDM 12/12/99
- * @since 0.0.6
- */
-
-public interface BitstreamErrors extends JavaLayerErrors
-{
-
- /**
- * An undeterminable error occurred.
- */
- static public final int UNKNOWN_ERROR = BITSTREAM_ERROR + 0;
-
- /**
- * The header describes an unknown sample rate.
- */
- static public final int UNKNOWN_SAMPLE_RATE = BITSTREAM_ERROR + 1;
-
- /**
- * A problem occurred reading from the stream.
- */
- static public final int STREAM_ERROR = BITSTREAM_ERROR + 2;
-
- /**
- * The end of the stream was reached prematurely.
- */
- static public final int UNEXPECTED_EOF = BITSTREAM_ERROR + 3;
-
- /**
- * The end of the stream was reached.
- */
- static public final int STREAM_EOF = BITSTREAM_ERROR + 4;
-
- /**
- * Frame data are missing.
- */
- static public final int INVALIDFRAME = BITSTREAM_ERROR + 5;
-
- /**
- *
- */
- static public final int BITSTREAM_LAST = 0x1ff;
-
-}
diff --git a/src/javazoom/jl/decoder/BitstreamException.java b/src/javazoom/jl/decoder/BitstreamException.java
deleted file mode 100644
index dc24f7fb596..00000000000
--- a/src/javazoom/jl/decoder/BitstreamException.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 12/12/99 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-/**
- * Instances of BitstreamException are thrown
- * when operations on a Bitstream fail.
- * Throwable instance, if any, that was thrown
- * indicating that an exceptional condition has occurred.
- *
Decoder class encapsulates the details of
- * decoding an MPEG audio frame.
- *
- * @author MDM
- * @version 0.0.7 12/12/99
- * @since 0.0.5
- */
-public class Decoder implements DecoderErrors
-{
- static private final Params DEFAULT_PARAMS = new Params();
-
- /**
- * The Bistream from which the MPEG audio frames are read.
- */
- //private Bitstream stream;
-
- /**
- * The Obuffer instance that will receive the decoded
- * PCM samples.
- */
- private Obuffer output;
-
- /**
- * Synthesis filter for the left channel.
- */
- private SynthesisFilter filter1;
-
- /**
- * Sythesis filter for the right channel.
- */
- private SynthesisFilter filter2;
-
- /**
- * The decoder used to decode layer III frames.
- */
- private LayerIIIDecoder l3decoder;
- private LayerIIDecoder l2decoder;
- private LayerIDecoder l1decoder;
-
- private int outputFrequency;
- private int outputChannels;
-
- private Equalizer equalizer = new Equalizer();
-
- private Params params;
-
- private boolean initialized;
-
-
- /**
- * Creates a new Decoder instance with default
- * parameters.
- */
-
- public Decoder()
- {
- this(null);
- }
-
- /**
- * Creates a new Decoder instance with default
- * parameters.
- *
- * @param params The Params instance that describes
- * the customizable aspects of the decoder.
- */
- public Decoder(Params params0)
- {
- if (params0==null)
- params0 = DEFAULT_PARAMS;
-
- params = params0;
-
- Equalizer eq = params.getInitialEqualizerSettings();
- if (eq!=null)
- {
- equalizer.setFrom(eq);
- }
- }
-
- static public Params getDefaultParams()
- {
- return (Params)DEFAULT_PARAMS.clone();
- }
-
- public void setEqualizer(Equalizer eq)
- {
- if (eq==null)
- eq = Equalizer.PASS_THRU_EQ;
-
- equalizer.setFrom(eq);
-
- float[] factors = equalizer.getBandFactors();
-
- if (filter1!=null)
- filter1.setEQ(factors);
-
- if (filter2!=null)
- filter2.setEQ(factors);
- }
-
- /**
- * Decodes one frame from an MPEG audio bitstream.
- *
- * @param header The header describing the frame to decode.
- * @param bitstream The bistream that provides the bits for te body of the frame.
- *
- * @return A SampleBuffer containing the decoded samples.
- */
- public Obuffer decodeFrame(Header header, Bitstream stream)
- throws DecoderException
- {
- if (!initialized)
- {
- initialize(header);
- }
-
- int layer = header.layer();
-
- output.clear_buffer();
-
- FrameDecoder decoder = retrieveDecoder(header, stream, layer);
-
- decoder.decodeFrame();
-
- output.write_buffer(1);
-
- return output;
- }
-
- /**
- * Changes the output buffer. This will take effect the next time
- * decodeFrame() is called.
- */
- public void setOutputBuffer(Obuffer out)
- {
- output = out;
- }
-
- /**
- * Retrieves the sample frequency of the PCM samples output
- * by this decoder. This typically corresponds to the sample
- * rate encoded in the MPEG audio stream.
- *
- * @param the sample rate (in Hz) of the samples written to the
- * output buffer when decoding.
- */
- public int getOutputFrequency()
- {
- return outputFrequency;
- }
-
- /**
- * Retrieves the number of channels of PCM samples output by
- * this decoder. This usually corresponds to the number of
- * channels in the MPEG audio stream, although it may differ.
- *
- * @return The number of output channels in the decoded samples: 1
- * for mono, or 2 for stereo.
- *
- */
- public int getOutputChannels()
- {
- return outputChannels;
- }
-
- /**
- * Retrieves the maximum number of samples that will be written to
- * the output buffer when one frame is decoded. This can be used to
- * help calculate the size of other buffers whose size is based upon
- * the number of samples written to the output buffer. NB: this is
- * an upper bound and fewer samples may actually be written, depending
- * upon the sample rate and number of channels.
- *
- * @return The maximum number of samples that are written to the
- * output buffer when decoding a single frame of MPEG audio.
- */
- public int getOutputBlockSize()
- {
- return Obuffer.OBUFFERSIZE;
- }
-
-
- protected DecoderException newDecoderException(int errorcode)
- {
- return new DecoderException(errorcode, null);
- }
-
- protected DecoderException newDecoderException(int errorcode, Throwable throwable)
- {
- return new DecoderException(errorcode, throwable);
- }
-
- protected FrameDecoder retrieveDecoder(Header header, Bitstream stream, int layer)
- throws DecoderException
- {
- FrameDecoder decoder = null;
-
- // REVIEW: allow channel output selection type
- // (LEFT, RIGHT, BOTH, DOWNMIX)
- switch (layer)
- {
- case 3:
- if (l3decoder==null)
- {
- l3decoder = new LayerIIIDecoder(stream,
- header, filter1, filter2,
- output, OutputChannels.BOTH_CHANNELS);
- }
-
- decoder = l3decoder;
- break;
- case 2:
- if (l2decoder==null)
- {
- l2decoder = new LayerIIDecoder();
- l2decoder.create(stream,
- header, filter1, filter2,
- output, OutputChannels.BOTH_CHANNELS);
- }
- decoder = l2decoder;
- break;
- case 1:
- if (l1decoder==null)
- {
- l1decoder = new LayerIDecoder();
- l1decoder.create(stream,
- header, filter1, filter2,
- output, OutputChannels.BOTH_CHANNELS);
- }
- decoder = l1decoder;
- break;
- }
-
- if (decoder==null)
- {
- throw newDecoderException(UNSUPPORTED_LAYER, null);
- }
-
- return decoder;
- }
-
- private void initialize(Header header)
- throws DecoderException
- {
-
- // REVIEW: allow customizable scale factor
- float scalefactor = 32700.0f;
-
- int mode = header.mode();
- @SuppressWarnings("unused")
- int layer = header.layer();
- int channels = mode==Header.SINGLE_CHANNEL ? 1 : 2;
-
-
- // set up output buffer if not set up by client.
- if (output==null)
- output = new SampleBuffer(header.frequency(), channels);
-
- float[] factors = equalizer.getBandFactors();
- filter1 = new SynthesisFilter(0, scalefactor, factors);
-
- // REVIEW: allow mono output for stereo
- if (channels==2)
- filter2 = new SynthesisFilter(1, scalefactor, factors);
-
- outputChannels = channels;
- outputFrequency = header.frequency();
-
- initialized = true;
- }
-
- /**
- * The Params class presents the customizable
- * aspects of the decoder.
- * - * Instances of this class are not thread safe. - */ - public static class Params implements Cloneable - { - private OutputChannels outputChannels = OutputChannels.BOTH; - - private Equalizer equalizer = new Equalizer(); - - public Params() - { - } - - public Object clone() - { - try - { - return super.clone(); - } - catch (CloneNotSupportedException ex) - { - throw new InternalError(this+": "+ex); - } - } - - public void setOutputChannels(OutputChannels out) - { - if (out==null) - throw new NullPointerException("out"); - - outputChannels = out; - } - - public OutputChannels getOutputChannels() - { - return outputChannels; - } - - /** - * Retrieves the equalizer settings that the decoder's equalizer - * will be initialized from. - *
- * The Equalizer instance returned
- * cannot be changed in real time to affect the
- * decoder output as it is used only to initialize the decoders
- * EQ settings. To affect the decoder's output in realtime,
- * use the Equalizer returned from the getEqualizer() method on
- * the decoder.
- *
- * @return The Equalizer used to initialize the
- * EQ settings of the decoder.
- */
- public Equalizer getInitialEqualizerSettings()
- {
- return equalizer;
- }
-
- };
-}
-
diff --git a/src/javazoom/jl/decoder/DecoderErrors.java b/src/javazoom/jl/decoder/DecoderErrors.java
deleted file mode 100644
index 686f2602213..00000000000
--- a/src/javazoom/jl/decoder/DecoderErrors.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 09/26/08 throw exception on subbband alloc error: Christopher G. Jennings (cjennings@acm.org)
- * 11/19/04 1.0 moved to LGPL.
- * 01/12/99 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-/**
- * This interface provides constants describing the error
- * codes used by the Decoder to indicate errors.
- *
- * @author MDM
- */
-public interface DecoderErrors extends JavaLayerErrors
-{
-
- static public final int UNKNOWN_ERROR = DECODER_ERROR + 0;
-
- /**
- * Layer not supported by the decoder.
- */
- static public final int UNSUPPORTED_LAYER = DECODER_ERROR + 1;
-
- /**
- * Illegal allocation in subband layer. Indicates a corrupt stream.
- */
- static public final int ILLEGAL_SUBBAND_ALLOCATION = DECODER_ERROR + 2;
-
-}
diff --git a/src/javazoom/jl/decoder/DecoderException.java b/src/javazoom/jl/decoder/DecoderException.java
deleted file mode 100644
index c63bca89627..00000000000
--- a/src/javazoom/jl/decoder/DecoderException.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 01/12/99 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-/**
- * The DecoderException represents the class of
- * errors that can occur when decoding MPEG audio.
- *
- * @author MDM
- */
-public class DecoderException extends JavaLayerException
- implements DecoderErrors
-{
- private static final long serialVersionUID = 739129173366217466L;
- private int errorcode = UNKNOWN_ERROR;
-
- public DecoderException(String msg, Throwable t)
- {
- super(msg, t);
- }
-
- public DecoderException(int errorcode, Throwable t)
- {
- this(getErrorString(errorcode), t);
- this.errorcode = errorcode;
- }
-
- public int getErrorCode()
- {
- return errorcode;
- }
-
-
- static public String getErrorString(int errorcode)
- {
- // REVIEW: use resource file to map error codes
- // to locale-sensitive strings.
-
- return "Decoder errorcode "+Integer.toHexString(errorcode);
- }
-
-
-}
-
diff --git a/src/javazoom/jl/decoder/Equalizer.java b/src/javazoom/jl/decoder/Equalizer.java
deleted file mode 100644
index 439279e6100..00000000000
--- a/src/javazoom/jl/decoder/Equalizer.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 12/12/99 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-
-package javazoom.jl.decoder;
-
-/**
- * The Equalizer class can be used to specify
- * equalization settings for the MPEG audio decoder.
- *
- * The equalizer consists of 32 band-pass filters.
- * Each band of the equalizer can take on a fractional value between
- * -1.0 and +1.0.
- * At -1.0, the input signal is attenuated by 6dB, at +1.0 the signal is
- * amplified by 6dB.
- *
- * @see Decoder
- *
- * @author MDM
- */
-public final class Equalizer
-{
- /**
- * Equalizer setting to denote that a given band will not be
- * present in the output signal.
- */
- static public final float BAND_NOT_PRESENT = Float.NEGATIVE_INFINITY;
-
- static public final Equalizer PASS_THRU_EQ = new Equalizer();
-
- private static final int BANDS = 32;
-
- private final float[] settings = new float[BANDS];
-
- /**
- * Creates a new
- *
- * @author MDM
- */
-public class JavaLayerException extends Exception
-{
- private static final long serialVersionUID = 7212135786131434159L;
- private Throwable exception;
-
-
- public JavaLayerException()
- {
- }
-
- public JavaLayerException(String msg)
- {
- super(msg);
- }
-
- public JavaLayerException(String msg, Throwable t)
- {
- super(msg);
- exception = t;
- }
-
- public Throwable getException()
- {
- return exception;
- }
-
-
- public void printStackTrace()
- {
- printStackTrace(System.err);
- }
-
- public void printStackTrace(PrintStream ps)
- {
- if (this.exception==null)
- {
- super.printStackTrace(ps);
- }
- else
- {
- exception.printStackTrace();
- }
- }
-
-
-}
diff --git a/src/javazoom/jl/decoder/JavaLayerHook.java b/src/javazoom/jl/decoder/JavaLayerHook.java
deleted file mode 100644
index edd890dd693..00000000000
--- a/src/javazoom/jl/decoder/JavaLayerHook.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-import java.io.InputStream;
-
-/**
- * The
- * When implementing a factory that provides an AudioDevice that uses
- * class that may not be present, the factory should dynamically link to any
- * specific implementation classes required to instantiate or test the audio
- * implementation. This is so that the application as a whole
- * can run without these classes being present. The audio
- * device implementation, however, will usually statically link to the classes
- * required. (See the JavaSound deivce and factory for an example
- * of this.)
- *
- * @see FactoryRegistry
- *
- * @since 0.0.8
- * @author Mat McGowan
- */
-public abstract class AudioDeviceFactory
-{
- /**
- * Creates a new
- * Instances of this class are thread-safe.
- *
- * @since 0.0.8
- * @author Mat McGowan
- */
-
-public class FactoryRegistry extends AudioDeviceFactory
-{
- static private FactoryRegistry instance = null;
-
- static synchronized public FactoryRegistry systemRegistry()
- {
- if (instance==null)
- {
- instance = new FactoryRegistry();
- instance.registerDefaultFactories();
- }
- return instance;
- }
-
-
- @SuppressWarnings("unchecked")
- protected Hashtable
+ * A convenience class from which to extend all non-visual AbstractBeans. It
+ * manages the PropertyChange notification system, making it relatively trivial
+ * to add support for property change events in getters/setters.
+ *
+ * A non-visual java bean is a Java class that conforms to the AbstractBean
+ * patterns to allow visual manipulation of the bean's properties and event
+ * handlers at design-time.
+ *
+ * Here is a simple example bean that contains one property, foo, and the proper
+ * pattern for implementing property change notification:
+ *
+ *
+ * You will notice that "getFoo()" is used in the setFoo method rather than
+ * accessing "foo" directly for the gets. This is done intentionally so that if
+ * a subclass overrides getFoo() to return, for instance, a constant value the
+ * property change notification system will continue to work properly.
+ *
+ * The firePropertyChange method takes into account the old value and the new
+ * value. Only if the two differ will it fire a property change event. So you
+ * can be assured from the above code fragment that a property change event will
+ * only occur if old is indeed different from getFoo()
+ *
+ *
+ * {@code AbstractBean} is not {@link java.io.Serializable}. Special care must
+ * be taken when creating {@code Serializable} subclasses, as the
+ * {@code Serializable} listeners will not be saved. Subclasses will need to
+ * manually save the serializable listeners. The {@link AbstractSerializableBean}
+ * is {@code Serializable} and already handles the listeners correctly. If
+ * possible, it is recommended that {@code Serializable} beans should extend
+ * {@code AbstractSerializableBean}. If it is not possible, the
+ * {@code AbstractSerializableBean} bean implementation provides details on
+ * how to correctly serialize an {@code AbstractBean} subclass.
+ *
+ * If some listeners have been added with a named property, then
+ * the returned array will be a mixture of PropertyChangeListeners
+ * and
+ * This is merely a convenience wrapper around the more general
+ * firePropertyChange method that takes {@code
+ * PropertyChangeEvent} value.
+ *
+ * @param propertyName The programmatic name of the property
+ * that was changed.
+ * @param oldValue The old value of the property.
+ * @param newValue The new value of the property.
+ */
+ protected final void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
+ pcs.firePropertyChange(propertyName, oldValue, newValue);
+ }
+
+ /**
+ * Fire an existing PropertyChangeEvent to any registered listeners.
+ * No event is fired if the given event's old and new values are
+ * equal and non-null.
+ * @param evt The PropertyChangeEvent object.
+ */
+ protected final void firePropertyChange(PropertyChangeEvent evt) {
+ pcs.firePropertyChange(evt);
+ }
+
+
+ /**
+ * Report a bound indexed property update to any registered
+ * listeners.
+ *
+ * No event is fired if old and new values are equal
+ * and non-null.
+ *
+ *
+ * This is merely a convenience wrapper around the more general
+ * firePropertyChange method that takes {@code PropertyChangeEvent} value.
+ *
+ * @param propertyName The programmatic name of the property that
+ * was changed.
+ * @param index index of the property element that was changed.
+ * @param oldValue The old value of the property.
+ * @param newValue The new value of the property.
+ */
+ protected final void fireIndexedPropertyChange(String propertyName, int index,
+ Object oldValue, Object newValue) {
+ pcs.fireIndexedPropertyChange(propertyName, index, oldValue, newValue);
+ }
+
+ /**
+ * Check if there are any listeners for a specific property, including
+ * those registered on all properties. If
+ * @return List of VetoableChangeListeners and VetoableChangeListenerProxys
+ * if named property change listeners were added.
+ */
+ public final VetoableChangeListener[] getVetoableChangeListeners(){
+ return vcs.getVetoableChangeListeners();
+ }
+
+ /**
+ * Add a VetoableChangeListener for a specific property. The listener
+ * will be invoked only when a call on fireVetoableChange names that
+ * specific property.
+ * The same listener object may be added more than once. For each
+ * property, the listener will be invoked the number of times it was added
+ * for that property.
+ * If
+ * No event is fired if old and new are equal and non-null.
+ *
+ * @param propertyName The programmatic name of the property
+ * that is about to change..
+ * @param oldValue The old value of the property.
+ * @param newValue The new value of the property.
+ * @exception PropertyVetoException if the recipient wishes the property
+ * change to be rolled back.
+ */
+ protected final void fireVetoableChange(String propertyName,
+ Object oldValue, Object newValue)
+ throws PropertyVetoException {
+ vcs.fireVetoableChange(propertyName, oldValue, newValue);
+ }
+
+ /**
+ * Fire a vetoable property update to any registered listeners. If
+ * anyone vetos the change, then fire a new event reverting everyone to
+ * the old value and then rethrow the PropertyVetoException.
+ *
+ * No event is fired if old and new are equal and non-null.
+ *
+ * @param evt The PropertyChangeEvent to be fired.
+ * @exception PropertyVetoException if the recipient wishes the property
+ * change to be rolled back.
+ */
+ protected final void fireVetoableChange(PropertyChangeEvent evt)
+ throws PropertyVetoException {
+ vcs.fireVetoableChange(evt);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Object clone() throws CloneNotSupportedException {
+ AbstractBean result = (AbstractBean) super.clone();
+ result.pcs = new PropertyChangeSupport(result);
+ result.vcs = new VetoableChangeSupport(result);
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/src/org/jdesktop/swingx/JXMultiSplitPane.java b/src/org/jdesktop/swingx/JXMultiSplitPane.java
new file mode 100644
index 00000000000..3e70372390d
--- /dev/null
+++ b/src/org/jdesktop/swingx/JXMultiSplitPane.java
@@ -0,0 +1,566 @@
+/*
+ * $Id: JXMultiSplitPane.java 3475 2009-08-28 08:30:47Z kleopatra $
+ *
+ * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
+ * Santa Clara, California 95054, U.S.A. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.jdesktop.swingx;
+
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+import java.awt.Rectangle;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+
+import javax.accessibility.AccessibleContext;
+import javax.accessibility.AccessibleRole;
+import javax.swing.JPanel;
+import javax.swing.event.MouseInputAdapter;
+
+import org.jdesktop.swingx.MultiSplitLayout.Divider;
+import org.jdesktop.swingx.MultiSplitLayout.Node;
+import org.jdesktop.swingx.painter.AbstractPainter;
+import org.jdesktop.swingx.painter.Painter;
+
+/**
+ *
+ *
+ * All properties in this class are bound: when a properties value
+ * is changed, all PropertyChangeListeners are fired.
+ *
+ * @author Hans Muller
+ * @author Luan O'Carroll
+ */
+public class JXMultiSplitPane extends JPanel {
+ private AccessibleContext accessibleContext = null;
+ private boolean continuousLayout = true;
+ private DividerPainter dividerPainter = new DefaultDividerPainter();
+ private Painter backgroundPainter;
+
+ /**
+ * Creates a MultiSplitPane with it's LayoutManager set to
+ * to an empty MultiSplitLayout.
+ */
+ public JXMultiSplitPane() {
+ this(new MultiSplitLayout());
+ }
+
+ /**
+ * Creates a MultiSplitPane.
+ * @param layout the new split pane's layout
+ */
+ public JXMultiSplitPane( MultiSplitLayout layout ) {
+ super(layout);
+ InputHandler inputHandler = new InputHandler();
+ addMouseListener(inputHandler);
+ addMouseMotionListener(inputHandler);
+ addKeyListener(inputHandler);
+ setFocusable(true);
+ }
+
+ /**
+ * A convenience method that returns the layout manager cast
+ * to MutliSplitLayout.
+ *
+ * @return this MultiSplitPane's layout manager
+ * @see java.awt.Container#getLayout
+ * @see #setModel
+ */
+ public final MultiSplitLayout getMultiSplitLayout() {
+ return (MultiSplitLayout)getLayout();
+ }
+
+ /**
+ * A convenience method that sets the MultiSplitLayout model.
+ * Equivalent to
+ * If you override this in a subclass you should not make permanent
+ * changes to the passed in
+ * The passed in
+ * {@inheritDoc}
+ */
+ @Override
+ protected void paintChildren(Graphics g) {
+ super.paintChildren(g);
+ DividerPainter dp = getDividerPainter();
+ Rectangle clipR = g.getClipBounds();
+ if ((dp != null) && (clipR != null)) {
+ MultiSplitLayout msl = getMultiSplitLayout();
+ if ( msl.hasModel()) {
+ for(Divider divider : msl.dividersThatOverlap(clipR)) {
+ Rectangle bounds = divider.getBounds();
+ Graphics cg = g.create( bounds.x, bounds.y, bounds.width, bounds.height );
+ try {
+ dp.paint((Graphics2D)cg, divider, bounds.width, bounds.height );
+ } finally {
+ cg.dispose();
+ }
+ }
+ }
+ }
+ }
+
+ private boolean dragUnderway = false;
+ private MultiSplitLayout.Divider dragDivider = null;
+ private Rectangle initialDividerBounds = null;
+ private boolean oldFloatingDividers = true;
+ private int dragOffsetX = 0;
+ private int dragOffsetY = 0;
+ private int dragMin = -1;
+ private int dragMax = -1;
+
+ private void startDrag(int mx, int my) {
+ requestFocusInWindow();
+ MultiSplitLayout msl = getMultiSplitLayout();
+ MultiSplitLayout.Divider divider = msl.dividerAt(mx, my);
+ if (divider != null) {
+ MultiSplitLayout.Node prevNode = divider.previousSibling();
+ MultiSplitLayout.Node nextNode = divider.nextSibling();
+ if ((prevNode == null) || (nextNode == null)) {
+ dragUnderway = false;
+ }
+ else {
+ initialDividerBounds = divider.getBounds();
+ dragOffsetX = mx - initialDividerBounds.x;
+ dragOffsetY = my - initialDividerBounds.y;
+ dragDivider = divider;
+
+ Rectangle prevNodeBounds = prevNode.getBounds();
+ Rectangle nextNodeBounds = nextNode.getBounds();
+ if (dragDivider.isVertical()) {
+ dragMin = prevNodeBounds.x;
+ dragMax = nextNodeBounds.x + nextNodeBounds.width;
+ dragMax -= dragDivider.getBounds().width;
+ if ( msl.getLayoutMode() == MultiSplitLayout.USER_MIN_SIZE_LAYOUT )
+ dragMax -= msl.getUserMinSize();
+ }
+ else {
+ dragMin = prevNodeBounds.y;
+ dragMax = nextNodeBounds.y + nextNodeBounds.height;
+ dragMax -= dragDivider.getBounds().height;
+ if ( msl.getLayoutMode() == MultiSplitLayout.USER_MIN_SIZE_LAYOUT )
+ dragMax -= msl.getUserMinSize();
+ }
+
+ if ( msl.getLayoutMode() == MultiSplitLayout.USER_MIN_SIZE_LAYOUT ) {
+ dragMin = dragMin + msl.getUserMinSize();
+ }
+ else {
+ if (dragDivider.isVertical()) {
+ dragMin = Math.max( dragMin, dragMin + getMinNodeSize(msl,prevNode).width );
+ dragMax = Math.min( dragMax, dragMax - getMinNodeSize(msl,nextNode).width );
+
+ Dimension maxDim = getMaxNodeSize(msl,prevNode);
+ if ( maxDim != null )
+ dragMax = Math.min( dragMax, prevNodeBounds.x + maxDim.width );
+ }
+ else {
+ dragMin = Math.max( dragMin, dragMin + getMinNodeSize(msl,prevNode).height );
+ dragMax = Math.min( dragMax, dragMax - getMinNodeSize(msl,nextNode).height );
+
+ Dimension maxDim = getMaxNodeSize(msl,prevNode);
+ if ( maxDim != null )
+ dragMax = Math.min( dragMax, prevNodeBounds.y + maxDim.height );
+ }
+ }
+
+ oldFloatingDividers = getMultiSplitLayout().getFloatingDividers();
+ getMultiSplitLayout().setFloatingDividers(false);
+ dragUnderway = true;
+ }
+ }
+ else {
+ dragUnderway = false;
+ }
+ }
+
+ /**
+ * Set the maximum node size. This method can be overridden to limit the
+ * size of a node during a drag operation on a divider. When implementing
+ * this method in a subclass the node instance should be checked, for
+ * example:
+ *
* Although MultiSplitLayout can be used with any Container, it's
* the default layout manager for MultiSplitPane. MultiSplitPane
- * supports interactively dragging the Dividers, accessibility,
+ * supports interactively dragging the Dividers, accessibility,
* and other features associated with split panes.
- *
+ *
*
* All properties in this class are bound: when a properties value
* is changed, all PropertyChangeListeners are fired.
+ *
*
- * @author Hans Muller
- * @see MultiSplitPane
+ * @author Hans Muller
+ * @author Luan O'Carroll
+ * @see JXMultiSplitPane
*/
-public class MultiSplitLayout implements LayoutManager {
- private final Map For example, the following expression generates
- * a horizontal Split node with three children:
- * the Leafs named left and right, and a Divider in
- * between:
- * Dividers should not be included in the string,
- * they're added automatcially as needed. Because
- * Leaf nodes often only need to specify a name, one
- * can specify a Leaf by just providing the name.
- * The previous example can be written like this:
- * Here's a more complex example. One row with
- * three elements, the first and last of which are columns
- * with two leaves each:
- * This syntax is not intended for archiving or
- * configuration files . It's just a convenience for
- * examples and tests.
- *
- * @return the Node root of a tree based on s.
+ * Set the rowLayout property. If true, all of this Split's
+ * children are to be laid out in a row: all the same height,
+ * each node's left edge equal to the previous Node's right
+ * edge. If false, children are laid on in a column. Default
+ * value is true.
+ *
+ * @param rowLayout true for horizontal row layout, false for column
+ * @see #isRowLayout
*/
- public static Node parseModel(String s) {
- return parseModel(new StringReader(s));
+ public void setRowLayout(boolean rowLayout) {
+ this.rowLayout = rowLayout;
}
-
-
- private static void printModel(String indent, Node root) {
- if (root instanceof Split) {
- Split split = (Split)root;
- System.out.println(indent + split);
- for(Node child : split.getChildren()) {
- printModel(indent + " ", child);
- }
- }
- else {
- System.out.println(indent + root);
- }
- }
-
- /**
- * Print the tree with enough detail for simple debugging.
+
+ /**
+ * Returns this Split node's children. The returned value
+ * is not a reference to the Split's internal list of children
+ *
+ * @return the value of the children property.
+ * @see #setChildren
*/
- public static void printModel(Node root) {
- printModel("", root);
+ public List For example, the following expression generates
+ * a horizontal Split node with three children:
+ * the Leafs named left and right, and a Divider in
+ * between:
+ * Dividers should not be included in the string,
+ * they're added automatcially as needed. Because
+ * Leaf nodes often only need to specify a name, one
+ * can specify a Leaf by just providing the name.
+ * The previous example can be written like this:
+ * Here's a more complex example. One row with
+ * three elements, the first and last of which are columns
+ * with two leaves each:
+ * This syntax is not intended for archiving or
+ * configuration files . It's just a convenience for
+ * examples and tests.
+ *
+ * @return the Node root of a tree based on s.
+ */
+ public static Node parseModel(String s) {
+ return parseModel(new StringReader(s));
+ }
+
+
+ private static void printModel(String indent, Node root) {
+ if (root instanceof Split) {
+ Split split = (Split)root;
+ System.out.println(indent + split);
+ for(Node child : split.getChildren()) {
+ printModel(indent + " ", child);
+ }
+ }
+ else {
+ System.out.println(indent + root);
+ }
+ }
+
+ /**
+ * Print the tree with enough detail for simple debugging.
+ */
+ public static void printModel(Node root) {
+ printModel("", root);
+ }
+}
\ No newline at end of file
diff --git a/src/org/jdesktop/swingx/MultiSplitPane.java b/src/org/jdesktop/swingx/MultiSplitPane.java
deleted file mode 100644
index 5f462f4178f..00000000000
--- a/src/org/jdesktop/swingx/MultiSplitPane.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- * $Id: MultiSplitPane.java,v 1.15 2005/10/26 14:29:54 hansmuller Exp $
- *
- * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
- * Santa Clara, California 95054, U.S.A. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-package org.jdesktop.swingx;
-
-import java.awt.Color;
-import java.awt.Cursor;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseEvent;
-import javax.accessibility.AccessibleContext;
-import javax.accessibility.AccessibleRole;
-import javax.swing.JPanel;
-import javax.swing.event.MouseInputAdapter;
-import org.jdesktop.swingx.MultiSplitLayout.Divider;
-import org.jdesktop.swingx.MultiSplitLayout.Node;
-
-/**
- *
- *
- * All properties in this class are bound: when a properties value
- * is changed, all PropertyChangeListeners are fired.
- *
- * @author Hans Muller
- */
-
-public class MultiSplitPane extends JPanel {
-
- private static final long serialVersionUID = 3379001167792141242L;
-
- private AccessibleContext accessibleContext = null;
- private boolean continuousLayout = true;
- private DividerPainter dividerPainter = new DefaultDividerPainter();
-
- /**
- * Creates a MultiSplitPane with it's LayoutManager set to
- * to an empty MultiSplitLayout.
- */
- public MultiSplitPane() {
- super(new MultiSplitLayout());
- InputHandler inputHandler = new InputHandler();
- addMouseListener(inputHandler);
- addMouseMotionListener(inputHandler);
- addKeyListener(inputHandler);
- setFocusable(true);
- }
-
- /**
- * A convenience method that returns the layout manager cast
- * to MutliSplitLayout.
- *
- * @return this MultiSplitPane's layout manager
- * @see java.awt.Container#getLayout
- * @see #setModel
- */
- public final MultiSplitLayout getMultiSplitLayout() {
- return (MultiSplitLayout)getLayout();
- }
-
- /**
- * A convenience method that sets the MultiSplitLayout model.
- * Equivalent to
- * {@inheritDoc}
- */
- protected void paintChildren(Graphics g) {
- super.paintChildren(g);
- DividerPainter dp = getDividerPainter();
- Rectangle clipR = g.getClipBounds();
- if ((dp != null) && (clipR != null)) {
- Graphics dpg = g.create();
- try {
- MultiSplitLayout msl = getMultiSplitLayout();
- for(Divider divider : msl.dividersThatOverlap(clipR)) {
- dp.paint(dpg, divider);
- }
- }
- finally {
- dpg.dispose();
- }
- }
- }
-
- private boolean dragUnderway = false;
- private MultiSplitLayout.Divider dragDivider = null;
- private Rectangle initialDividerBounds = null;
- private boolean oldFloatingDividers = true;
- private int dragOffsetX = 0;
- private int dragOffsetY = 0;
- private int dragMin = -1;
- private int dragMax = -1;
-
- private void startDrag(int mx, int my) {
- requestFocusInWindow();
- MultiSplitLayout msl = getMultiSplitLayout();
- MultiSplitLayout.Divider divider = msl.dividerAt(mx, my);
- if (divider != null) {
- MultiSplitLayout.Node prevNode = divider.previousSibling();
- MultiSplitLayout.Node nextNode = divider.nextSibling();
- if ((prevNode == null) || (nextNode == null)) {
- dragUnderway = false;
- }
- else {
- initialDividerBounds = divider.getBounds();
- dragOffsetX = mx - initialDividerBounds.x;
- dragOffsetY = my - initialDividerBounds.y;
- dragDivider = divider;
- Rectangle prevNodeBounds = prevNode.getBounds();
- Rectangle nextNodeBounds = nextNode.getBounds();
- if (dragDivider.isVertical()) {
- dragMin = prevNodeBounds.x;
- dragMax = nextNodeBounds.x + nextNodeBounds.width;
- dragMax -= dragDivider.getBounds().width;
- }
- else {
- dragMin = prevNodeBounds.y;
- dragMax = nextNodeBounds.y + nextNodeBounds.height;
- dragMax -= dragDivider.getBounds().height;
- }
- oldFloatingDividers = getMultiSplitLayout().getFloatingDividers();
- getMultiSplitLayout().setFloatingDividers(false);
- dragUnderway = true;
- }
- }
- else {
- dragUnderway = false;
- }
- }
-
- private void repaintDragLimits() {
- Rectangle damageR = dragDivider.getBounds();
- if (dragDivider.isVertical()) {
- damageR.x = dragMin;
- damageR.width = dragMax - dragMin;
- }
- else {
- damageR.y = dragMin;
- damageR.height = dragMax - dragMin;
- }
- repaint(damageR);
- }
-
- private void updateDrag(int mx, int my) {
- if (!dragUnderway) {
- return;
- }
- Rectangle oldBounds = dragDivider.getBounds();
- Rectangle bounds = new Rectangle(oldBounds);
- if (dragDivider.isVertical()) {
- bounds.x = mx - dragOffsetX;
- bounds.x = Math.max(bounds.x, dragMin);
- bounds.x = Math.min(bounds.x, dragMax);
- }
- else {
- bounds.y = my - dragOffsetY;
- bounds.y = Math.max(bounds.y, dragMin);
- bounds.y = Math.min(bounds.y, dragMax);
- }
- dragDivider.setBounds(bounds);
- if (isContinuousLayout()) {
- revalidate();
- repaintDragLimits();
- }
- else {
- repaint(oldBounds.union(bounds));
- }
- }
-
- private void clearDragState() {
- dragDivider = null;
- initialDividerBounds = null;
- oldFloatingDividers = true;
- dragOffsetX = dragOffsetY = 0;
- dragMin = dragMax = -1;
- dragUnderway = false;
- }
-
- private void finishDrag(int x, int y) {
- if (dragUnderway) {
- clearDragState();
- if (!isContinuousLayout()) {
- revalidate();
- repaint();
- }
- }
- }
-
- private void cancelDrag() {
- if (dragUnderway) {
- dragDivider.setBounds(initialDividerBounds);
- getMultiSplitLayout().setFloatingDividers(oldFloatingDividers);
- setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
- repaint();
- revalidate();
- clearDragState();
- }
- }
-
- private void updateCursor(int x, int y, boolean show) {
- if (dragUnderway) {
- return;
- }
- int cursorID = Cursor.DEFAULT_CURSOR;
- if (show) {
- MultiSplitLayout.Divider divider = getMultiSplitLayout().dividerAt(x, y);
- if (divider != null) {
- cursorID = (divider.isVertical()) ?
- Cursor.E_RESIZE_CURSOR :
- Cursor.N_RESIZE_CURSOR;
- }
- }
- setCursor(Cursor.getPredefinedCursor(cursorID));
- }
-
-
- private class InputHandler extends MouseInputAdapter implements KeyListener {
-
- public void mouseEntered(MouseEvent e) {
- updateCursor(e.getX(), e.getY(), true);
- }
-
- public void mouseMoved(MouseEvent e) {
- updateCursor(e.getX(), e.getY(), true);
- }
-
- public void mouseExited(MouseEvent e) {
- updateCursor(e.getX(), e.getY(), false);
- }
-
- public void mousePressed(MouseEvent e) {
- startDrag(e.getX(), e.getY());
- }
- public void mouseReleased(MouseEvent e) {
- finishDrag(e.getX(), e.getY());
- }
- public void mouseDragged(MouseEvent e) {
- updateDrag(e.getX(), e.getY());
- }
- public void keyPressed(KeyEvent e) {
- if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
- cancelDrag();
- }
- }
- public void keyReleased(KeyEvent e) { }
- public void keyTyped(KeyEvent e) { }
- }
-
- public AccessibleContext getAccessibleContext() {
- if( accessibleContext == null ) {
- accessibleContext = new AccessibleMultiSplitPane();
- }
- return accessibleContext;
- }
-
- protected class AccessibleMultiSplitPane extends AccessibleJPanel {
-
- private static final long serialVersionUID = 4177114112369591280L;
-
- public AccessibleRole getAccessibleRole() {
- return AccessibleRole.SPLIT_PANE;
- }
- }
-}
diff --git a/src/org/jdesktop/swingx/graphics/GraphicsUtilities.java b/src/org/jdesktop/swingx/graphics/GraphicsUtilities.java
new file mode 100644
index 00000000000..4c1980eb1ff
--- /dev/null
+++ b/src/org/jdesktop/swingx/graphics/GraphicsUtilities.java
@@ -0,0 +1,765 @@
+/*
+ * $Id$
+ *
+ * Dual-licensed under LGPL (Sun and Romain Guy) and BSD (Romain Guy).
+ *
+ * Copyright 2005 Sun Microsystems, Inc., 4150 Network Circle,
+ * Santa Clara, California 95054, U.S.A. All rights reserved.
+ *
+ * Copyright (c) 2006 Romain Guy Compatible images can, and should, be used to increase drawing
+ * performance. This class provides a number of methods to load compatible
+ * images directly from files or to convert existing images to compatibles
+ * images. This class provides a number of methods to easily scale down images.
+ * Some of these methods offer a trade-off between speed and result quality and
+ * shouuld be used all the time. They also offer the advantage of producing
+ * compatible images, thus automatically resulting into better runtime
+ * performance. All these methodes are both faster than
+ * {@link java.awt.Image#getScaledInstance(int, int, int)} and produce
+ * better-looking results than the various This class provides two methods to get and set pixels in a buffered image.
+ * These methods try to avoid unmanaging the image in order to keep good
+ * performance. Returns a new Returns a new compatible image with the same width, height and
+ * transparency as the image specified as a parameter. That is, the
+ * returned BufferedImage will be compatible with the graphics hardware.
+ * If this method is called in a headless environment, then
+ * the returned BufferedImage will be compatible with the source
+ * image. Returns a new compatible image of the specified width and height, and
+ * the same transparency setting as the image specified as a parameter.
+ * That is, the returned Returns a new opaque compatible image of the specified width and
+ * height. That is, the returned Returns a new translucent compatible image of the specified width and
+ * height. That is, the returned
+ * Returns a new compatible image from a stream. The image is loaded from
+ * the specified stream and then turned, if necessary into a compatible
+ * image.
+ * Returns a new compatible image from a URL. The image is loaded from the
+ * specified location and then turned, if necessary into a compatible
+ * image. Return a new compatible image that contains a copy of the specified
+ * image. This method ensures an image is compatible with the hardware,
+ * and therefore optimized for fast blitting operations. If the method is called in a headless environment, then the returned
+ * Returns a thumbnail of a source image. This method favors speed over quality. When the new size is less than
+ * half the longest dimension of the source image,
+ * {@link #createThumbnail(BufferedImage, int)} or
+ * {@link #createThumbnail(BufferedImage, int, int)} should be used instead
+ * to ensure the quality of the result without sacrificing too much
+ * performance. Returns a thumbnail of a source image. This method favors speed over quality. When the new size is less than
+ * half the longest dimension of the source image,
+ * {@link #createThumbnail(BufferedImage, int)} or
+ * {@link #createThumbnail(BufferedImage, int, int)} should be used instead
+ * to ensure the quality of the result without sacrificing too much
+ * performance. Returns a thumbnail of a source image. This method offers a good trade-off between speed and quality.
+ * The result looks better than
+ * {@link #createThumbnailFast(java.awt.image.BufferedImage, int)} when
+ * the new size is less than half the longest dimension of the source
+ * image, yet the rendering speed is almost similar. Returns a thumbnail of a source image. This method offers a good trade-off between speed and quality.
+ * The result looks better than
+ * {@link #createThumbnailFast(java.awt.image.BufferedImage, int)} when
+ * the new size is less than half the longest dimension of the source
+ * image, yet the rendering speed is almost similar. Returns an array of pixels, stored as integers, from a
+ * Writes a rectangular area of pixels in the destination
+ * A convenient base class from which concrete {@link Painter} implementations may
+ * extend. It extends {@link org.jdesktop.beans.AbstractBean} as a convenience for
+ * adding property change notification support. In addition, Subclasses of For example, here is the doPaint method of a simple A convenience method for specifying the filters to use based on
+ * BufferedImageOps. These will each be individually wrapped by an ImageFilter
+ * and then setFilters(Effect... filters) will be called with the resulting
+ * array Sets the visible property. This controls if the painter should
+ * paint itself. It is true by default. Setting visible to false
+ * is good when you want to temporarily turn off a painter. An example
+ * of this is a painter that you only use when a button is highlighted. Gets whether this Sets whether this If set to false, then #clearCache is called to free system resources. Call this method to clear the cacheable. This may be called whether there is
+ * a cacheable being used or not. If cleared, on the next call to SubclassesIf overridden in subclasses, you
+ * must call super.clearCache, or physical
+ * resources (such as an Image) may leak. Called to allow Returns true if the painter should use caching. This method allows subclasses to
+ * specify the heuristics regarding whether to cache or not. If a This method is called by the This method can be overridden by subclasses to modify the drawing
+ * surface before any painting happens. A painting delegate. The Painter interface defines exactly one method,
+ * A This class is not threadsafe. Renders to the given {@link java.awt.Graphics2D} object. Implementations
+ * of this method may modify state on the State on the graphics object may be honored by the The supplied object parameter acts as an optional configuration argument.
+ * For example, it could be of type Generally, to enhance reusability, most standard Finally, the For example, suppose I have a Equalizer instance.
- */
- public Equalizer()
- {
- }
-
-// private Equalizer(float b1, float b2, float b3, float b4, float b5,
-// float b6, float b7, float b8, float b9, float b10, float b11,
-// float b12, float b13, float b14, float b15, float b16,
-// float b17, float b18, float b19, float b20);
-
- public Equalizer(float[] settings)
- {
- setFrom(settings);
- }
-
- public Equalizer(EQFunction eq)
- {
- setFrom(eq);
- }
-
- public void setFrom(float[] eq)
- {
- reset();
- int max = (eq.length > BANDS) ? BANDS : eq.length;
-
- for (int i=0; iInputStreamSource implements a
- * Source that provides data from an InputStream
- * . Seeking functionality is not supported.
- *
- * @author MDM
- */
-public class InputStreamSource implements Source
-{
- private final InputStream in;
-
- public InputStreamSource(InputStream in)
- {
- if (in==null)
- throw new NullPointerException("in");
-
- this.in = in;
- }
-
- public int read(byte[] b, int offs, int len)
- throws IOException
- {
- int read = in.read(b, offs, len);
- return read;
- }
-
- public boolean willReadBlock()
- {
- return true;
- //boolean block = (in.available()==0);
- //return block;
- }
-
- public boolean isSeekable()
- {
- return false;
- }
-
- public long tell()
- {
- return -1;
- }
-
- public long seek(long to)
- {
- return -1;
- }
-
- public long length()
- {
- return -1;
- }
-}
diff --git a/src/javazoom/jl/decoder/JavaLayerError.java b/src/javazoom/jl/decoder/JavaLayerError.java
deleted file mode 100644
index 656e2843796..00000000000
--- a/src/javazoom/jl/decoder/JavaLayerError.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 12/12/99 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-/**
- * Work in progress.
- *
- * API usage errors may be handled by throwing an instance of this
- * class, as per JMF 2.0.
- */
-public class JavaLayerError extends Error
-{
- private static final long serialVersionUID = -8924506540200863304L;
-}
diff --git a/src/javazoom/jl/decoder/JavaLayerErrors.java b/src/javazoom/jl/decoder/JavaLayerErrors.java
deleted file mode 100644
index b141ce843d8..00000000000
--- a/src/javazoom/jl/decoder/JavaLayerErrors.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 12/12/99 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-/**
- * Exception erorr codes for components of the JavaLayer API.
- */
-public interface JavaLayerErrors
-{
- /**
- * The first bitstream error code. See the {@link DecoderErrors DecoderErrors}
- * interface for other bitstream error codes.
- */
- static public final int BITSTREAM_ERROR = 0x100;
-
- /**
- * The first decoder error code. See the {@link DecoderErrors DecoderErrors}
- * interface for other decoder error codes.
- */
- static public final int DECODER_ERROR = 0x200;
-
-}
diff --git a/src/javazoom/jl/decoder/JavaLayerException.java b/src/javazoom/jl/decoder/JavaLayerException.java
deleted file mode 100644
index 902790cf449..00000000000
--- a/src/javazoom/jl/decoder/JavaLayerException.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 12/12/99 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-import java.io.PrintStream;
-
-
-/**
- * The JavaLayerException is the base class for all API-level
- * exceptions thrown by JavaLayer. To facilitate conversion and
- * common handling of exceptions from other domains, the class
- * can delegate some functionality to a contained Throwable instance.
- * JavaLayerHooks class allows developers to change
- * the way the JavaLayer library uses Resources.
- */
-
-public interface JavaLayerHook
-{
- /**
- * Retrieves the named resource. This allows resources to be
- * obtained without specifying how they are retrieved.
- */
- public InputStream getResourceAsStream(String name);
-}
diff --git a/src/javazoom/jl/decoder/JavaLayerUtils.java b/src/javazoom/jl/decoder/JavaLayerUtils.java
deleted file mode 100644
index fc893dd0e16..00000000000
--- a/src/javazoom/jl/decoder/JavaLayerUtils.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 12/12/99 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InvalidClassException;
-import java.io.InvalidObjectException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.OutputStream;
-import java.lang.reflect.Array;
-
-/**
- * The JavaLayerUtils class is not strictly part of the JavaLayer API.
- * It serves to provide useful methods and system-wide hooks.
- *
- * @author MDM
- */
-public class JavaLayerUtils
-{
- static private JavaLayerHook hook = null;
-
- /**
- * Deserializes the object contained in the given input stream.
- * @param in The input stream to deserialize an object from.
- * @param cls The expected class of the deserialized object.
- */
- @SuppressWarnings("unchecked")
- static public Object deserialize(InputStream in, Class cls)
- throws IOException
- {
- if (cls==null)
- throw new NullPointerException("cls");
-
- Object obj = deserialize(in, cls);
- if (!cls.isInstance(obj))
- {
- throw new InvalidObjectException("type of deserialized instance not of required class.");
- }
-
- return obj;
- }
-
- /**
- * Deserializes an object from the given InputStream.
- * The deserialization is delegated to an
- * ObjectInputStream instance.
- *
- * @param in The InputStream to deserialize an object
- * from.
- *
- * @return The object deserialized from the stream.
- * @exception IOException is thrown if there was a problem reading
- * the underlying stream, or an object could not be deserialized
- * from the stream.
- *
- * @see java.io.ObjectInputStream
- */
- static public Object deserialize(InputStream in)
- throws IOException
- {
- if (in==null)
- throw new NullPointerException("in");
-
- ObjectInputStream objIn = new ObjectInputStream(in);
-
- Object obj;
-
- try
- {
- obj = objIn.readObject();
- }
- catch (ClassNotFoundException ex)
- {
- throw new InvalidClassException(ex.toString());
- }
-
- return obj;
- }
-
- /**
- * Deserializes an array from a given InputStream.
- *
- * @param in The InputStream to
- * deserialize an object from.
- *
- * @param elemType The class denoting the type of the array
- * elements.
- * @param length The expected length of the array, or -1 if
- * any length is expected.
- */
- @SuppressWarnings("unchecked")
- static public Object deserializeArray(InputStream in, Class elemType, int length)
- throws IOException
- {
- if (elemType==null)
- throw new NullPointerException("elemType");
-
- if (length<-1)
- throw new IllegalArgumentException("length");
-
- Object obj = deserialize(in);
-
- Class cls = obj.getClass();
-
-
- if (!cls.isArray())
- throw new InvalidObjectException("object is not an array");
-
- Class arrayElemType = cls.getComponentType();
- if (arrayElemType!=elemType)
- throw new InvalidObjectException("unexpected array component type");
-
- if (length != -1)
- {
- int arrayLength = Array.getLength(obj);
- if (arrayLength!=length)
- throw new InvalidObjectException("array length mismatch");
- }
-
- return obj;
- }
-
- @SuppressWarnings("unchecked")
- static public Object deserializeArrayResource(String name, Class elemType, int length)
- throws IOException
- {
- InputStream str = getResourceAsStream(name);
- if (str==null)
- throw new IOException("unable to load resource '"+name+"'");
-
- Object obj = deserializeArray(str, elemType, length);
-
- return obj;
- }
-
- static public void serialize(OutputStream out, Object obj)
- throws IOException
- {
- if (out==null)
- throw new NullPointerException("out");
-
- if (obj==null)
- throw new NullPointerException("obj");
-
- ObjectOutputStream objOut = new ObjectOutputStream(out);
- objOut.writeObject(obj);
-
- }
-
- /**
- * Sets the system-wide JavaLayer hook.
- */
- static synchronized public void setHook(JavaLayerHook hook0)
- {
- hook = hook0;
- }
-
- static synchronized public JavaLayerHook getHook()
- {
- return hook;
- }
-
- /**
- * Retrieves an InputStream for a named resource.
- *
- * @param name The name of the resource. This must be a simple
- * name, and not a qualified package name.
- *
- * @return The InputStream for the named resource, or null if
- * the resource has not been found. If a hook has been
- * provided, its getResourceAsStream() method is called
- * to retrieve the resource.
- */
- @SuppressWarnings("unchecked")
- static synchronized public InputStream getResourceAsStream(String name)
- {
- InputStream is = null;
-
- if (hook!=null)
- {
- is = hook.getResourceAsStream(name);
- }
- else
- {
- Class cls = JavaLayerUtils.class;
- is = cls.getResourceAsStream(name);
- }
-
- return is;
- }
-}
diff --git a/src/javazoom/jl/decoder/LayerIDecoder.java b/src/javazoom/jl/decoder/LayerIDecoder.java
deleted file mode 100644
index fb936d2b913..00000000000
--- a/src/javazoom/jl/decoder/LayerIDecoder.java
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- * 09/26/08 throw exception on subbband alloc error: Christopher G. Jennings (cjennings@acm.org)
- *
- * 11/19/04 1.0 moved to LGPL.
- *
- * 12/12/99 Initial version. Adapted from javalayer.java
- * and Subband*.java. mdm@techie.com
- *
- * 02/28/99 Initial version : javalayer.java by E.B
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-/**
- * Implements decoding of MPEG Audio Layer I frames.
- */
-class LayerIDecoder implements FrameDecoder
-{
- protected Bitstream stream;
- protected Header header;
- protected SynthesisFilter filter1, filter2;
- protected Obuffer buffer;
- protected int which_channels;
- protected int mode;
-
- protected int num_subbands;
- protected Subband[] subbands;
- protected Crc16 crc = null; // new Crc16[1] to enable CRC checking.
-
- public LayerIDecoder()
- {
- crc = new Crc16();
- }
-
- public void create(Bitstream stream0, Header header0,
- SynthesisFilter filtera, SynthesisFilter filterb,
- Obuffer buffer0, int which_ch0)
- {
- stream = stream0;
- header = header0;
- filter1 = filtera;
- filter2 = filterb;
- buffer = buffer0;
- which_channels = which_ch0;
-
- }
-
- public void decodeFrame() throws DecoderException
- {
-
- num_subbands = header.number_of_subbands();
- subbands = new Subband[32];
- mode = header.mode();
-
- createSubbands();
-
- readAllocation();
- readScaleFactorSelection();
-
- if ((crc != null) || header.checksum_ok())
- {
- readScaleFactors();
-
- readSampleData();
- }
-
- }
-
- protected void createSubbands()
- {
- int i;
- if (mode == Header.SINGLE_CHANNEL)
- for (i = 0; i < num_subbands; ++i)
- subbands[i] = new SubbandLayer1(i);
- else if (mode == Header.JOINT_STEREO)
- {
- for (i = 0; i < header.intensity_stereo_bound(); ++i)
- subbands[i] = new SubbandLayer1Stereo(i);
- for (; i < num_subbands; ++i)
- subbands[i] = new SubbandLayer1IntensityStereo(i);
- }
- else
- {
- for (i = 0; i < num_subbands; ++i)
- subbands[i] = new SubbandLayer1Stereo(i);
- }
- }
-
- protected void readAllocation() throws DecoderException
- {
- // start to read audio data:
- for (int i = 0; i < num_subbands; ++i)
- subbands[i].read_allocation(stream, header, crc);
-
- }
-
- protected void readScaleFactorSelection()
- {
- // scale factor selection not present for layer I.
- }
-
- protected void readScaleFactors()
- {
- for (int i = 0; i < num_subbands; ++i)
- subbands[i].read_scalefactor(stream, header);
- }
-
- protected void readSampleData()
- {
- boolean read_ready = false;
- boolean write_ready = false;
- int mode = header.mode();
- int i;
- do
- {
- for (i = 0; i < num_subbands; ++i)
- read_ready = subbands[i].read_sampledata(stream);
- do
- {
- for (i = 0; i < num_subbands; ++i)
- write_ready = subbands[i].put_next_sample(which_channels,filter1, filter2);
-
- filter1.calculate_pcm_samples(buffer);
- if ((which_channels == OutputChannels.BOTH_CHANNELS) && (mode != Header.SINGLE_CHANNEL))
- filter2.calculate_pcm_samples(buffer);
- } while (!write_ready);
- } while (!read_ready);
-
- }
-
- /**
- * Abstract base class for subband classes of layer I and II
- */
- static abstract class Subband
- {
- /*
- * Changes from version 1.1 to 1.2:
- * - array size increased by one, although a scalefactor with index 63
- * is illegal (to prevent segmentation faults)
- */
- // Scalefactors for layer I and II, Annex 3-B.1 in ISO/IEC DIS 11172:
- public static final float scalefactors[] =
- {
- 2.00000000000000f, 1.58740105196820f, 1.25992104989487f, 1.00000000000000f,
- 0.79370052598410f, 0.62996052494744f, 0.50000000000000f, 0.39685026299205f,
- 0.31498026247372f, 0.25000000000000f, 0.19842513149602f, 0.15749013123686f,
- 0.12500000000000f, 0.09921256574801f, 0.07874506561843f, 0.06250000000000f,
- 0.04960628287401f, 0.03937253280921f, 0.03125000000000f, 0.02480314143700f,
- 0.01968626640461f, 0.01562500000000f, 0.01240157071850f, 0.00984313320230f,
- 0.00781250000000f, 0.00620078535925f, 0.00492156660115f, 0.00390625000000f,
- 0.00310039267963f, 0.00246078330058f, 0.00195312500000f, 0.00155019633981f,
- 0.00123039165029f, 0.00097656250000f, 0.00077509816991f, 0.00061519582514f,
- 0.00048828125000f, 0.00038754908495f, 0.00030759791257f, 0.00024414062500f,
- 0.00019377454248f, 0.00015379895629f, 0.00012207031250f, 0.00009688727124f,
- 0.00007689947814f, 0.00006103515625f, 0.00004844363562f, 0.00003844973907f,
- 0.00003051757813f, 0.00002422181781f, 0.00001922486954f, 0.00001525878906f,
- 0.00001211090890f, 0.00000961243477f, 0.00000762939453f, 0.00000605545445f,
- 0.00000480621738f, 0.00000381469727f, 0.00000302772723f, 0.00000240310869f,
- 0.00000190734863f, 0.00000151386361f, 0.00000120155435f, 0.00000000000000f /* illegal scalefactor */
- };
-
- public abstract void read_allocation (Bitstream stream, Header header, Crc16 crc) throws DecoderException;
- public abstract void read_scalefactor (Bitstream stream, Header header);
- public abstract boolean read_sampledata (Bitstream stream);
- public abstract boolean put_next_sample (int channels, SynthesisFilter filter1, SynthesisFilter filter2);
- };
-
- /**
- * Class for layer I subbands in single channel mode.
- * Used for single channel mode
- * and in derived class for intensity stereo mode
- */
- static class SubbandLayer1 extends Subband
- {
-
- // Factors and offsets for sample requantization
- public static final float table_factor[] = {
- 0.0f, (1.0f/2.0f) * (4.0f/3.0f), (1.0f/4.0f) * (8.0f/7.0f), (1.0f/8.0f) * (16.0f/15.0f),
- (1.0f/16.0f) * (32.0f/31.0f), (1.0f/32.0f) * (64.0f/63.0f), (1.0f/64.0f) * (128.0f/127.0f),
- (1.0f/128.0f) * (256.0f/255.0f), (1.0f/256.0f) * (512.0f/511.0f),
- (1.0f/512.0f) * (1024.0f/1023.0f), (1.0f/1024.0f) * (2048.0f/2047.0f),
- (1.0f/2048.0f) * (4096.0f/4095.0f), (1.0f/4096.0f) * (8192.0f/8191.0f),
- (1.0f/8192.0f) * (16384.0f/16383.0f), (1.0f/16384.0f) * (32768.0f/32767.0f)
- };
-
- public static final float table_offset[] = {
- 0.0f, ((1.0f/2.0f)-1.0f) * (4.0f/3.0f), ((1.0f/4.0f)-1.0f) * (8.0f/7.0f), ((1.0f/8.0f)-1.0f) * (16.0f/15.0f),
- ((1.0f/16.0f)-1.0f) * (32.0f/31.0f), ((1.0f/32.0f)-1.0f) * (64.0f/63.0f), ((1.0f/64.0f)-1.0f) * (128.0f/127.0f),
- ((1.0f/128.0f)-1.0f) * (256.0f/255.0f), ((1.0f/256.0f)-1.0f) * (512.0f/511.0f),
- ((1.0f/512.0f)-1.0f) * (1024.0f/1023.0f), ((1.0f/1024.0f)-1.0f) * (2048.0f/2047.0f),
- ((1.0f/2048.0f)-1.0f) * (4096.0f/4095.0f), ((1.0f/4096.0f)-1.0f) * (8192.0f/8191.0f),
- ((1.0f/8192.0f)-1.0f) * (16384.0f/16383.0f), ((1.0f/16384.0f)-1.0f) * (32768.0f/32767.0f)
- };
-
- protected int subbandnumber;
- protected int samplenumber;
- protected int allocation;
- protected float scalefactor;
- protected int samplelength;
- protected float sample;
- protected float factor, offset;
-
- /**
- * Construtor.
- */
- public SubbandLayer1(int subbandnumber)
- {
- this.subbandnumber = subbandnumber;
- samplenumber = 0;
- }
-
- /**
- *
- */
- public void read_allocation(Bitstream stream, Header header, Crc16 crc) throws DecoderException
- {
- if ((allocation = stream.get_bits (4)) == 15)
- {
- // CGJ: catch this condition and throw appropriate exception
- throw new DecoderException(DecoderErrors.ILLEGAL_SUBBAND_ALLOCATION, null);
- // cerr << "WARNING: stream contains an illegal allocation!\n";
- // MPEG-stream is corrupted!
- }
-
- if (crc != null) crc.add_bits (allocation, 4);
- if (allocation != 0)
- {
- samplelength = allocation + 1;
- factor = table_factor[allocation];
- offset = table_offset[allocation];
- }
- }
-
- /**
- *
- */
- public void read_scalefactor(Bitstream stream, Header header)
- {
- if (allocation != 0) scalefactor = scalefactors[stream.get_bits(6)];
- }
-
- /**
- *
- */
- public boolean read_sampledata(Bitstream stream)
- {
- if (allocation != 0)
- {
- sample = (float) (stream.get_bits(samplelength));
- }
- if (++samplenumber == 12)
- {
- samplenumber = 0;
- return true;
- }
- return false;
- }
-
- /**
- *
- */
- public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2)
- {
- if ((allocation !=0) && (channels != OutputChannels.RIGHT_CHANNEL))
- {
- float scaled_sample = (sample * factor + offset) * scalefactor;
- filter1.input_sample (scaled_sample, subbandnumber);
- }
- return true;
- }
- };
-
- /**
- * Class for layer I subbands in joint stereo mode.
- */
- static class SubbandLayer1IntensityStereo extends SubbandLayer1
- {
- protected float channel2_scalefactor;
-
- /**
- * Constructor
- */
- public SubbandLayer1IntensityStereo(int subbandnumber)
- {
- super(subbandnumber);
- }
-
- /**
- *
- */
- public void read_allocation(Bitstream stream, Header header, Crc16 crc) throws DecoderException
- {
- super.read_allocation (stream, header, crc);
- }
-
- /**
- *
- */
- public void read_scalefactor (Bitstream stream, Header header)
- {
- if (allocation != 0)
- {
- scalefactor = scalefactors[stream.get_bits(6)];
- channel2_scalefactor = scalefactors[stream.get_bits(6)];
- }
- }
-
- /**
- *
- */
- public boolean read_sampledata(Bitstream stream)
- {
- return super.read_sampledata (stream);
- }
-
- /**
- *
- */
- public boolean put_next_sample (int channels, SynthesisFilter filter1, SynthesisFilter filter2)
- {
- if (allocation !=0 )
- {
- sample = sample * factor + offset; // requantization
- if (channels == OutputChannels.BOTH_CHANNELS)
- {
- float sample1 = sample * scalefactor,
- sample2 = sample * channel2_scalefactor;
- filter1.input_sample(sample1, subbandnumber);
- filter2.input_sample(sample2, subbandnumber);
- }
- else if (channels == OutputChannels.LEFT_CHANNEL)
- {
- float sample1 = sample * scalefactor;
- filter1.input_sample(sample1, subbandnumber);
- }
- else
- {
- float sample2 = sample * channel2_scalefactor;
- filter1.input_sample(sample2, subbandnumber);
- }
- }
- return true;
- }
- };
-
- /**
- * Class for layer I subbands in stereo mode.
- */
- static class SubbandLayer1Stereo extends SubbandLayer1
- {
- protected int channel2_allocation;
- protected float channel2_scalefactor;
- protected int channel2_samplelength;
- protected float channel2_sample;
- protected float channel2_factor, channel2_offset;
-
-
- /**
- * Constructor
- */
- public SubbandLayer1Stereo(int subbandnumber)
- {
- super(subbandnumber);
- }
-
- /**
- *
- */
- public void read_allocation (Bitstream stream, Header header, Crc16 crc) throws DecoderException
- {
- allocation = stream.get_bits(4);
- channel2_allocation = stream.get_bits(4);
- if (crc != null)
- {
- crc.add_bits (allocation, 4);
- crc.add_bits (channel2_allocation, 4);
- }
- if (allocation != 0)
- {
- samplelength = allocation + 1;
- factor = table_factor[allocation];
- offset = table_offset[allocation];
- }
- if (channel2_allocation != 0)
- {
- channel2_samplelength = channel2_allocation + 1;
- channel2_factor = table_factor[channel2_allocation];
- channel2_offset = table_offset[channel2_allocation];
- }
- }
-
- /**
- *
- */
- public void read_scalefactor(Bitstream stream, Header header)
- {
- if (allocation != 0) scalefactor = scalefactors[stream.get_bits(6)];
- if (channel2_allocation != 0) channel2_scalefactor = scalefactors[stream.get_bits(6)];
- }
-
- /**
- *
- */
- public boolean read_sampledata (Bitstream stream)
- {
- boolean returnvalue = super.read_sampledata(stream);
- if (channel2_allocation != 0)
- {
- channel2_sample = (float) (stream.get_bits(channel2_samplelength));
- }
- return(returnvalue);
- }
-
- /**
- *
- */
- public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2)
- {
- super.put_next_sample (channels, filter1, filter2);
- if ((channel2_allocation != 0) && (channels != OutputChannels.LEFT_CHANNEL))
- {
- float sample2 = (channel2_sample * channel2_factor + channel2_offset) *
- channel2_scalefactor;
- if (channels == OutputChannels.BOTH_CHANNELS)
- filter2.input_sample (sample2, subbandnumber);
- else
- filter1.input_sample (sample2, subbandnumber);
- }
- return true;
- }
- };
-
-}
diff --git a/src/javazoom/jl/decoder/LayerIIDecoder.java b/src/javazoom/jl/decoder/LayerIIDecoder.java
deleted file mode 100644
index 7265b1f8faf..00000000000
--- a/src/javazoom/jl/decoder/LayerIIDecoder.java
+++ /dev/null
@@ -1,1064 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- *
- * 29/05/01 Michael Scheerer, Fixed some C++ to Java porting bugs.
- *
- * 16/07/01 Michael Scheerer, Catched a bug in method
- * read_sampledata, which causes an outOfIndexException.
- *
- * 12/12/99 Initial version. Adapted from javalayer.java
- * and Subband*.java. mdm@techie.com
- *
- * 02/28/99 Initial version : javalayer.java by E.B
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-/**
- * Implements decoding of MPEG Audio Layer II frames.
- */
-class LayerIIDecoder extends LayerIDecoder implements FrameDecoder
-{
-
- public LayerIIDecoder()
- {
- }
-
-
- protected void createSubbands()
- {
- int i;
- if (mode == Header.SINGLE_CHANNEL)
- for (i = 0; i < num_subbands; ++i)
- subbands[i] = new SubbandLayer2(i);
- else if (mode == Header.JOINT_STEREO)
- {
- for (i = 0; i < header.intensity_stereo_bound(); ++i)
- subbands[i] = new SubbandLayer2Stereo(i);
- for (; i < num_subbands; ++i)
- subbands[i] = new SubbandLayer2IntensityStereo(i);
- }
- else
- {
- for (i = 0; i < num_subbands; ++i)
- subbands[i] = new SubbandLayer2Stereo(i);
- }
-
- }
-
- protected void readScaleFactorSelection()
- {
- for (int i = 0; i < num_subbands; ++i)
- ((SubbandLayer2)subbands[i]).read_scalefactor_selection(stream, crc);
- }
-
-
-
- /**
- * Class for layer II subbands in single channel mode.
- */
- static class SubbandLayer2 extends Subband
- {
- // this table contains 3 requantized samples for each legal codeword
- // when grouped in 5 bits, i.e. 3 quantizationsteps per sample
- public static final float grouping_5bits[] = new float[]
- {
- -2.0f/3.0f, -2.0f/3.0f, -2.0f/3.0f,
- 0.0f, -2.0f/3.0f, -2.0f/3.0f,
- 2.0f/3.0f, -2.0f/3.0f, -2.0f/3.0f,
- -2.0f/3.0f, 0.0f, -2.0f/3.0f,
- 0.0f, 0.0f, -2.0f/3.0f,
- 2.0f/3.0f, 0.0f, -2.0f/3.0f,
- -2.0f/3.0f, 2.0f/3.0f, -2.0f/3.0f,
- 0.0f, 2.0f/3.0f, -2.0f/3.0f,
- 2.0f/3.0f, 2.0f/3.0f, -2.0f/3.0f,
- -2.0f/3.0f, -2.0f/3.0f, 0.0f,
- 0.0f, -2.0f/3.0f, 0.0f,
- 2.0f/3.0f, -2.0f/3.0f, 0.0f,
- -2.0f/3.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f,
- 2.0f/3.0f, 0.0f, 0.0f,
- -2.0f/3.0f, 2.0f/3.0f, 0.0f,
- 0.0f, 2.0f/3.0f, 0.0f,
- 2.0f/3.0f, 2.0f/3.0f, 0.0f,
- -2.0f/3.0f, -2.0f/3.0f, 2.0f/3.0f,
- 0.0f, -2.0f/3.0f, 2.0f/3.0f,
- 2.0f/3.0f, -2.0f/3.0f, 2.0f/3.0f,
- -2.0f/3.0f, 0.0f, 2.0f/3.0f,
- 0.0f, 0.0f, 2.0f/3.0f,
- 2.0f/3.0f, 0.0f, 2.0f/3.0f,
- -2.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f,
- 0.0f, 2.0f/3.0f, 2.0f/3.0f,
- 2.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f
- };
-
- // this table contains 3 requantized samples for each legal codeword
- // when grouped in 7 bits, i.e. 5 quantizationsteps per sample
- public static final float grouping_7bits[] = new float[]
- {
- -0.8f, -0.8f, -0.8f, -0.4f, -0.8f, -0.8f, 0.0f, -0.8f, -0.8f, 0.4f, -0.8f, -0.8f, 0.8f, -0.8f, -0.8f,
- -0.8f, -0.4f, -0.8f, -0.4f, -0.4f, -0.8f, 0.0f, -0.4f, -0.8f, 0.4f, -0.4f, -0.8f, 0.8f, -0.4f, -0.8f,
- -0.8f, 0.0f, -0.8f, -0.4f, 0.0f, -0.8f, 0.0f, 0.0f, -0.8f, 0.4f, 0.0f, -0.8f, 0.8f, 0.0f, -0.8f,
- -0.8f, 0.4f, -0.8f, -0.4f, 0.4f, -0.8f, 0.0f, 0.4f, -0.8f, 0.4f, 0.4f, -0.8f, 0.8f, 0.4f, -0.8f,
- -0.8f, 0.8f, -0.8f, -0.4f, 0.8f, -0.8f, 0.0f, 0.8f, -0.8f, 0.4f, 0.8f, -0.8f, 0.8f, 0.8f, -0.8f,
- -0.8f, -0.8f, -0.4f, -0.4f, -0.8f, -0.4f, 0.0f, -0.8f, -0.4f, 0.4f, -0.8f, -0.4f, 0.8f, -0.8f, -0.4f,
- -0.8f, -0.4f, -0.4f, -0.4f, -0.4f, -0.4f, 0.0f, -0.4f, -0.4f, 0.4f, -0.4f, -0.4f, 0.8f, -0.4f, -0.4f,
- -0.8f, 0.0f, -0.4f, -0.4f, 0.0f, -0.4f, 0.0f, 0.0f, -0.4f, 0.4f, 0.0f, -0.4f, 0.8f, 0.0f, -0.4f,
- -0.8f, 0.4f, -0.4f, -0.4f, 0.4f, -0.4f, 0.0f, 0.4f, -0.4f, 0.4f, 0.4f, -0.4f, 0.8f, 0.4f, -0.4f,
- -0.8f, 0.8f, -0.4f, -0.4f, 0.8f, -0.4f, 0.0f, 0.8f, -0.4f, 0.4f, 0.8f, -0.4f, 0.8f, 0.8f, -0.4f,
- -0.8f, -0.8f, 0.0f, -0.4f, -0.8f, 0.0f, 0.0f, -0.8f, 0.0f, 0.4f, -0.8f, 0.0f, 0.8f, -0.8f, 0.0f,
- -0.8f, -0.4f, 0.0f, -0.4f, -0.4f, 0.0f, 0.0f, -0.4f, 0.0f, 0.4f, -0.4f, 0.0f, 0.8f, -0.4f, 0.0f,
- -0.8f, 0.0f, 0.0f, -0.4f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.4f, 0.0f, 0.0f, 0.8f, 0.0f, 0.0f,
- -0.8f, 0.4f, 0.0f, -0.4f, 0.4f, 0.0f, 0.0f, 0.4f, 0.0f, 0.4f, 0.4f, 0.0f, 0.8f, 0.4f, 0.0f,
- -0.8f, 0.8f, 0.0f, -0.4f, 0.8f, 0.0f, 0.0f, 0.8f, 0.0f, 0.4f, 0.8f, 0.0f, 0.8f, 0.8f, 0.0f,
- -0.8f, -0.8f, 0.4f, -0.4f, -0.8f, 0.4f, 0.0f, -0.8f, 0.4f, 0.4f, -0.8f, 0.4f, 0.8f, -0.8f, 0.4f,
- -0.8f, -0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.0f, -0.4f, 0.4f, 0.4f, -0.4f, 0.4f, 0.8f, -0.4f, 0.4f,
- -0.8f, 0.0f, 0.4f, -0.4f, 0.0f, 0.4f, 0.0f, 0.0f, 0.4f, 0.4f, 0.0f, 0.4f, 0.8f, 0.0f, 0.4f,
- -0.8f, 0.4f, 0.4f, -0.4f, 0.4f, 0.4f, 0.0f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.8f, 0.4f, 0.4f,
- -0.8f, 0.8f, 0.4f, -0.4f, 0.8f, 0.4f, 0.0f, 0.8f, 0.4f, 0.4f, 0.8f, 0.4f, 0.8f, 0.8f, 0.4f,
- -0.8f, -0.8f, 0.8f, -0.4f, -0.8f, 0.8f, 0.0f, -0.8f, 0.8f, 0.4f, -0.8f, 0.8f, 0.8f, -0.8f, 0.8f,
- -0.8f, -0.4f, 0.8f, -0.4f, -0.4f, 0.8f, 0.0f, -0.4f, 0.8f, 0.4f, -0.4f, 0.8f, 0.8f, -0.4f, 0.8f,
- -0.8f, 0.0f, 0.8f, -0.4f, 0.0f, 0.8f, 0.0f, 0.0f, 0.8f, 0.4f, 0.0f, 0.8f, 0.8f, 0.0f, 0.8f,
- -0.8f, 0.4f, 0.8f, -0.4f, 0.4f, 0.8f, 0.0f, 0.4f, 0.8f, 0.4f, 0.4f, 0.8f, 0.8f, 0.4f, 0.8f,
- -0.8f, 0.8f, 0.8f, -0.4f, 0.8f, 0.8f, 0.0f, 0.8f, 0.8f, 0.4f, 0.8f, 0.8f, 0.8f, 0.8f, 0.8f
- };
-
- // this table contains 3 requantized samples for each legal codeword
- // when grouped in 10 bits, i.e. 9 quantizationsteps per sample
- public static final float grouping_10bits[] =
- {
- -8.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f,
- -2.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 0.0f, -8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f,
- 4.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f,
- -8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f,
- -2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 0.0f, -6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f,
- 4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f,
- -8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f,
- -2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 0.0f, -4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f,
- 4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f,
- -8.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f,
- -2.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 0.0f, -2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f,
- 4.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f,
- -8.0f/9.0f, 0.0f, -8.0f/9.0f, -6.0f/9.0f, 0.0f, -8.0f/9.0f, -4.0f/9.0f, 0.0f, -8.0f/9.0f,
- -2.0f/9.0f, 0.0f, -8.0f/9.0f, 0.0f, 0.0f, -8.0f/9.0f, 2.0f/9.0f, 0.0f, -8.0f/9.0f,
- 4.0f/9.0f, 0.0f, -8.0f/9.0f, 6.0f/9.0f, 0.0f, -8.0f/9.0f, 8.0f/9.0f, 0.0f, -8.0f/9.0f,
- -8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f,
- -2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 0.0f, 2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f,
- 4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f,
- -8.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f,
- -2.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 0.0f, 4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f,
- 4.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f,
- -8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f,
- -2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 0.0f, 6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f,
- 4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f,
- -8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f,
- -2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 0.0f, 8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f,
- 4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f,
- -8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f,
- -2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 0.0f, -8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f,
- 4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f,
- -8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f,
- -2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 0.0f, -6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f,
- 4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f,
- -8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f,
- -2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 0.0f, -4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f,
- 4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f,
- -8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f,
- -2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 0.0f, -2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f,
- 4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f,
- -8.0f/9.0f, 0.0f, -6.0f/9.0f, -6.0f/9.0f, 0.0f, -6.0f/9.0f, -4.0f/9.0f, 0.0f, -6.0f/9.0f,
- -2.0f/9.0f, 0.0f, -6.0f/9.0f, 0.0f, 0.0f, -6.0f/9.0f, 2.0f/9.0f, 0.0f, -6.0f/9.0f,
- 4.0f/9.0f, 0.0f, -6.0f/9.0f, 6.0f/9.0f, 0.0f, -6.0f/9.0f, 8.0f/9.0f, 0.0f, -6.0f/9.0f,
- -8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f,
- -2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 0.0f, 2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f,
- 4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f,
- -8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f,
- -2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 0.0f, 4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f,
- 4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f,
- -8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f,
- -2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 0.0f, 6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f,
- 4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f,
- -8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f,
- -2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 0.0f, 8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f,
- 4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f,
- -8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f,
- -2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 0.0f, -8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f,
- 4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f,
- -8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f,
- -2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 0.0f, -6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f,
- 4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f,
- -8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f,
- -2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 0.0f, -4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f,
- 4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f,
- -8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f,
- -2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 0.0f, -2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f,
- 4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f,
- -8.0f/9.0f, 0.0f, -4.0f/9.0f, -6.0f/9.0f, 0.0f, -4.0f/9.0f, -4.0f/9.0f, 0.0f, -4.0f/9.0f,
- -2.0f/9.0f, 0.0f, -4.0f/9.0f, 0.0f, 0.0f, -4.0f/9.0f, 2.0f/9.0f, 0.0f, -4.0f/9.0f,
- 4.0f/9.0f, 0.0f, -4.0f/9.0f, 6.0f/9.0f, 0.0f, -4.0f/9.0f, 8.0f/9.0f, 0.0f, -4.0f/9.0f,
- -8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f,
- -2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 0.0f, 2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f,
- 4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f,
- -8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f,
- -2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 0.0f, 4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f,
- 4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f,
- -8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f,
- -2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 0.0f, 6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f,
- 4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f,
- -8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f,
- -2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 0.0f, 8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f,
- 4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f,
- -8.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f,
- -2.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 0.0f, -8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f,
- 4.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f,
- -8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f,
- -2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 0.0f, -6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f,
- 4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f,
- -8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f,
- -2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 0.0f, -4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f,
- 4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f,
- -8.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f,
- -2.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 0.0f, -2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f,
- 4.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f,
- -8.0f/9.0f, 0.0f, -2.0f/9.0f, -6.0f/9.0f, 0.0f, -2.0f/9.0f, -4.0f/9.0f, 0.0f, -2.0f/9.0f,
- -2.0f/9.0f, 0.0f, -2.0f/9.0f, 0.0f, 0.0f, -2.0f/9.0f, 2.0f/9.0f, 0.0f, -2.0f/9.0f,
- 4.0f/9.0f, 0.0f, -2.0f/9.0f, 6.0f/9.0f, 0.0f, -2.0f/9.0f, 8.0f/9.0f, 0.0f, -2.0f/9.0f,
- -8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f,
- -2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 0.0f, 2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f,
- 4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f,
- -8.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f,
- -2.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 0.0f, 4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f,
- 4.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f,
- -8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f,
- -2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 0.0f, 6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f,
- 4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f,
- -8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f,
- -2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 0.0f, 8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f,
- 4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f,
- -8.0f/9.0f, -8.0f/9.0f, 0.0f, -6.0f/9.0f, -8.0f/9.0f, 0.0f, -4.0f/9.0f, -8.0f/9.0f, 0.0f,
- -2.0f/9.0f, -8.0f/9.0f, 0.0f, 0.0f, -8.0f/9.0f, 0.0f, 2.0f/9.0f, -8.0f/9.0f, 0.0f,
- 4.0f/9.0f, -8.0f/9.0f, 0.0f, 6.0f/9.0f, -8.0f/9.0f, 0.0f, 8.0f/9.0f, -8.0f/9.0f, 0.0f,
- -8.0f/9.0f, -6.0f/9.0f, 0.0f, -6.0f/9.0f, -6.0f/9.0f, 0.0f, -4.0f/9.0f, -6.0f/9.0f, 0.0f,
- -2.0f/9.0f, -6.0f/9.0f, 0.0f, 0.0f, -6.0f/9.0f, 0.0f, 2.0f/9.0f, -6.0f/9.0f, 0.0f,
- 4.0f/9.0f, -6.0f/9.0f, 0.0f, 6.0f/9.0f, -6.0f/9.0f, 0.0f, 8.0f/9.0f, -6.0f/9.0f, 0.0f,
- -8.0f/9.0f, -4.0f/9.0f, 0.0f, -6.0f/9.0f, -4.0f/9.0f, 0.0f, -4.0f/9.0f, -4.0f/9.0f, 0.0f,
- -2.0f/9.0f, -4.0f/9.0f, 0.0f, 0.0f, -4.0f/9.0f, 0.0f, 2.0f/9.0f, -4.0f/9.0f, 0.0f,
- 4.0f/9.0f, -4.0f/9.0f, 0.0f, 6.0f/9.0f, -4.0f/9.0f, 0.0f, 8.0f/9.0f, -4.0f/9.0f, 0.0f,
- -8.0f/9.0f, -2.0f/9.0f, 0.0f, -6.0f/9.0f, -2.0f/9.0f, 0.0f, -4.0f/9.0f, -2.0f/9.0f, 0.0f,
- -2.0f/9.0f, -2.0f/9.0f, 0.0f, 0.0f, -2.0f/9.0f, 0.0f, 2.0f/9.0f, -2.0f/9.0f, 0.0f,
- 4.0f/9.0f, -2.0f/9.0f, 0.0f, 6.0f/9.0f, -2.0f/9.0f, 0.0f, 8.0f/9.0f, -2.0f/9.0f, 0.0f,
- -8.0f/9.0f, 0.0f, 0.0f, -6.0f/9.0f, 0.0f, 0.0f, -4.0f/9.0f, 0.0f, 0.0f,
- -2.0f/9.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f/9.0f, 0.0f, 0.0f,
- 4.0f/9.0f, 0.0f, 0.0f, 6.0f/9.0f, 0.0f, 0.0f, 8.0f/9.0f, 0.0f, 0.0f,
- -8.0f/9.0f, 2.0f/9.0f, 0.0f, -6.0f/9.0f, 2.0f/9.0f, 0.0f, -4.0f/9.0f, 2.0f/9.0f, 0.0f,
- -2.0f/9.0f, 2.0f/9.0f, 0.0f, 0.0f, 2.0f/9.0f, 0.0f, 2.0f/9.0f, 2.0f/9.0f, 0.0f,
- 4.0f/9.0f, 2.0f/9.0f, 0.0f, 6.0f/9.0f, 2.0f/9.0f, 0.0f, 8.0f/9.0f, 2.0f/9.0f, 0.0f,
- -8.0f/9.0f, 4.0f/9.0f, 0.0f, -6.0f/9.0f, 4.0f/9.0f, 0.0f, -4.0f/9.0f, 4.0f/9.0f, 0.0f,
- -2.0f/9.0f, 4.0f/9.0f, 0.0f, 0.0f, 4.0f/9.0f, 0.0f, 2.0f/9.0f, 4.0f/9.0f, 0.0f,
- 4.0f/9.0f, 4.0f/9.0f, 0.0f, 6.0f/9.0f, 4.0f/9.0f, 0.0f, 8.0f/9.0f, 4.0f/9.0f, 0.0f,
- -8.0f/9.0f, 6.0f/9.0f, 0.0f, -6.0f/9.0f, 6.0f/9.0f, 0.0f, -4.0f/9.0f, 6.0f/9.0f, 0.0f,
- -2.0f/9.0f, 6.0f/9.0f, 0.0f, 0.0f, 6.0f/9.0f, 0.0f, 2.0f/9.0f, 6.0f/9.0f, 0.0f,
- 4.0f/9.0f, 6.0f/9.0f, 0.0f, 6.0f/9.0f, 6.0f/9.0f, 0.0f, 8.0f/9.0f, 6.0f/9.0f, 0.0f,
- -8.0f/9.0f, 8.0f/9.0f, 0.0f, -6.0f/9.0f, 8.0f/9.0f, 0.0f, -4.0f/9.0f, 8.0f/9.0f, 0.0f,
- -2.0f/9.0f, 8.0f/9.0f, 0.0f, 0.0f, 8.0f/9.0f, 0.0f, 2.0f/9.0f, 8.0f/9.0f, 0.0f,
- 4.0f/9.0f, 8.0f/9.0f, 0.0f, 6.0f/9.0f, 8.0f/9.0f, 0.0f, 8.0f/9.0f, 8.0f/9.0f, 0.0f,
- -8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f,
- -2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 0.0f, -8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f,
- 4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f,
- -8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f,
- -2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 0.0f, -6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f,
- 4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f,
- -8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f,
- -2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 0.0f, -4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f,
- 4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f,
- -8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f,
- -2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 0.0f, -2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f,
- 4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f,
- -8.0f/9.0f, 0.0f, 2.0f/9.0f, -6.0f/9.0f, 0.0f, 2.0f/9.0f, -4.0f/9.0f, 0.0f, 2.0f/9.0f,
- -2.0f/9.0f, 0.0f, 2.0f/9.0f, 0.0f, 0.0f, 2.0f/9.0f, 2.0f/9.0f, 0.0f, 2.0f/9.0f,
- 4.0f/9.0f, 0.0f, 2.0f/9.0f, 6.0f/9.0f, 0.0f, 2.0f/9.0f, 8.0f/9.0f, 0.0f, 2.0f/9.0f,
- -8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f,
- -2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 0.0f, 2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f,
- 4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f,
- -8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f,
- -2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 0.0f, 4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f,
- 4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f,
- -8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f,
- -2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 0.0f, 6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f,
- 4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f,
- -8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f,
- -2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 0.0f, 8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f,
- 4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f,
- -8.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f,
- -2.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 0.0f, -8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f,
- 4.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f,
- -8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f,
- -2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 0.0f, -6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f,
- 4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f,
- -8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f,
- -2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 0.0f, -4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f,
- 4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f,
- -8.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f,
- -2.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 0.0f, -2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f,
- 4.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f,
- -8.0f/9.0f, 0.0f, 4.0f/9.0f, -6.0f/9.0f, 0.0f, 4.0f/9.0f, -4.0f/9.0f, 0.0f, 4.0f/9.0f,
- -2.0f/9.0f, 0.0f, 4.0f/9.0f, 0.0f, 0.0f, 4.0f/9.0f, 2.0f/9.0f, 0.0f, 4.0f/9.0f,
- 4.0f/9.0f, 0.0f, 4.0f/9.0f, 6.0f/9.0f, 0.0f, 4.0f/9.0f, 8.0f/9.0f, 0.0f, 4.0f/9.0f,
- -8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f,
- -2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 0.0f, 2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f,
- 4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f,
- -8.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f,
- -2.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 0.0f, 4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f,
- 4.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f,
- -8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f,
- -2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 0.0f, 6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f,
- 4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f,
- -8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f,
- -2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 0.0f, 8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f,
- 4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f,
- -8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f,
- -2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 0.0f, -8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f,
- 4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f,
- -8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f,
- -2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 0.0f, -6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f,
- 4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f,
- -8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f,
- -2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 0.0f, -4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f,
- 4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f,
- -8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f,
- -2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 0.0f, -2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f,
- 4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f,
- -8.0f/9.0f, 0.0f, 6.0f/9.0f, -6.0f/9.0f, 0.0f, 6.0f/9.0f, -4.0f/9.0f, 0.0f, 6.0f/9.0f,
- -2.0f/9.0f, 0.0f, 6.0f/9.0f, 0.0f, 0.0f, 6.0f/9.0f, 2.0f/9.0f, 0.0f, 6.0f/9.0f,
- 4.0f/9.0f, 0.0f, 6.0f/9.0f, 6.0f/9.0f, 0.0f, 6.0f/9.0f, 8.0f/9.0f, 0.0f, 6.0f/9.0f,
- -8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f,
- -2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 0.0f, 2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f,
- 4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f,
- -8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f,
- -2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 0.0f, 4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f,
- 4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f,
- -8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f,
- -2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 0.0f, 6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f,
- 4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f,
- -8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f,
- -2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 0.0f, 8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f,
- 4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f,
- -8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f,
- -2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 0.0f, -8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f,
- 4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f,
- -8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f,
- -2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 0.0f, -6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f,
- 4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f,
- -8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f,
- -2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 0.0f, -4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f,
- 4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f,
- -8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f,
- -2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 0.0f, -2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f,
- 4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f,
- -8.0f/9.0f, 0.0f, 8.0f/9.0f, -6.0f/9.0f, 0.0f, 8.0f/9.0f, -4.0f/9.0f, 0.0f, 8.0f/9.0f,
- -2.0f/9.0f, 0.0f, 8.0f/9.0f, 0.0f, 0.0f, 8.0f/9.0f, 2.0f/9.0f, 0.0f, 8.0f/9.0f,
- 4.0f/9.0f, 0.0f, 8.0f/9.0f, 6.0f/9.0f, 0.0f, 8.0f/9.0f, 8.0f/9.0f, 0.0f, 8.0f/9.0f,
- -8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f,
- -2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 0.0f, 2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f,
- 4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f,
- -8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f,
- -2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 0.0f, 4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f,
- 4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f,
- -8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f,
- -2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 0.0f, 6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f,
- 4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f,
- -8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f,
- -2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 0.0f, 8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f,
- 4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f
- };
-
- // data taken from ISO/IEC DIS 11172, Annexes 3-B.2[abcd] and 3-B.4:
-
- // subbands 0-2 in tables 3-B.2a and 2b: (index is allocation)
- public static final int table_ab1_codelength[] =
- // bits per codeword
- { 0, 5, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
-
- public static final float table_ab1_groupingtables[][] =
- // pointer to sample grouping table, or NULL-pointer if ungrouped
- { null, grouping_5bits, null, null, null, null, null, null, null, null, null, null, null, null, null, null };
-
- public static final float table_ab1_factor[] =
- // factor for requantization: (real)sample * factor - 1.0 gives requantized sample
- { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/8.0f, 1.0f/16.0f, 1.0f/32.0f, 1.0f/64.0f,
- 1.0f/128.0f, 1.0f/256.0f, 1.0f/512.0f, 1.0f/1024.0f, 1.0f/2048.0f,
- 1.0f/4096.0f, 1.0f/8192.0f, 1.0f/16384.0f, 1.0f/32768.0f };
-
- public static final float table_ab1_c[] =
- // factor c for requantization from table 3-B.4
- { 0.0f, 1.33333333333f, 1.14285714286f, 1.06666666666f, 1.03225806452f,
- 1.01587301587f, 1.00787401575f, 1.00392156863f, 1.00195694716f, 1.00097751711f,
- 1.00048851979f, 1.00024420024f, 1.00012208522f, 1.00006103888f, 1.00003051851f,
- 1.00001525902f };
-
- public static final float table_ab1_d[] =
- // addend d for requantization from table 3-B.4
- { 0.0f, 0.50000000000f, 0.25000000000f, 0.12500000000f, 0.06250000000f,
- 0.03125000000f, 0.01562500000f, 0.00781250000f, 0.00390625000f, 0.00195312500f,
- 0.00097656250f, 0.00048828125f, 0.00024414063f, 0.00012207031f, 0.00006103516f,
- 0.00003051758f };
-
- // subbands 3-... tables 3-B.2a and 2b:
- public static final float[] table_ab234_groupingtables[] =
- { null, grouping_5bits, grouping_7bits, null, grouping_10bits, null, null, null, null, null, null, null, null, null, null, null };
-
- // subbands 3-10 in tables 3-B.2a and 2b:
- public static final int table_ab2_codelength[] =
- { 0, 5, 7, 3, 10, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16 };
- public static final float table_ab2_factor[] =
- { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/4.0f, 1.0f/8.0f, 1.0f/8.0f, 1.0f/16.0f,
- 1.0f/32.0f, 1.0f/64.0f, 1.0f/128.0f, 1.0f/256.0f, 1.0f/512.0f,
- 1.0f/1024.0f, 1.0f/2048.0f, 1.0f/4096.0f, 1.0f/32768.0f };
- public static final float table_ab2_c[] =
- { 0.0f, 1.33333333333f, 1.60000000000f, 1.14285714286f, 1.77777777777f,
- 1.06666666666f, 1.03225806452f, 1.01587301587f, 1.00787401575f, 1.00392156863f,
- 1.00195694716f, 1.00097751711f, 1.00048851979f, 1.00024420024f, 1.00012208522f,
- 1.00001525902f };
- public static final float table_ab2_d[] =
- { 0.0f, 0.50000000000f, 0.50000000000f, 0.25000000000f, 0.50000000000f,
- 0.12500000000f, 0.06250000000f, 0.03125000000f, 0.01562500000f, 0.00781250000f,
- 0.00390625000f, 0.00195312500f, 0.00097656250f, 0.00048828125f, 0.00024414063f,
- 0.00003051758f };
-
- // subbands 11-22 in tables 3-B.2a and 2b:
- public static final int table_ab3_codelength[] = { 0, 5, 7, 3, 10, 4, 5, 16 };
- public static final float table_ab3_factor[] =
- { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/4.0f, 1.0f/8.0f, 1.0f/8.0f, 1.0f/16.0f, 1.0f/32768.0f };
- public static final float table_ab3_c[] =
- { 0.0f, 1.33333333333f, 1.60000000000f, 1.14285714286f, 1.77777777777f,
- 1.06666666666f, 1.03225806452f, 1.00001525902f };
- public static final float table_ab3_d[] =
- { 0.0f, 0.50000000000f, 0.50000000000f, 0.25000000000f, 0.50000000000f,
- 0.12500000000f, 0.06250000000f, 0.00003051758f };
-
- // subbands 23-... in tables 3-B.2a and 2b:
- public static final int table_ab4_codelength[] = { 0, 5, 7, 16 };
- public static final float table_ab4_factor[] = { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/32768.0f };
- public static final float table_ab4_c[] = { 0.0f, 1.33333333333f, 1.60000000000f, 1.00001525902f };
- public static final float table_ab4_d[] = { 0.0f, 0.50000000000f, 0.50000000000f, 0.00003051758f };
-
- // subbands in tables 3-B.2c and 2d:
- public static final int table_cd_codelength[] =
- { 0, 5, 7, 10, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
- public static final float table_cd_groupingtables[][] =
- { null, grouping_5bits, grouping_7bits, grouping_10bits, null, null, null, null, null, null, null, null, null, null, null, null };
- public static final float table_cd_factor[] =
- { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/8.0f, 1.0f/8.0f, 1.0f/16.0f, 1.0f/32.0f, 1.0f/64.0f,
- 1.0f/128.0f, 1.0f/256.0f, 1.0f/512.0f, 1.0f/1024.0f, 1.0f/2048.0f, 1.0f/4096.0f,
- 1.0f/8192.0f, 1.0f/16384.0f };
- public static final float table_cd_c[] =
- { 0.0f, 1.33333333333f, 1.60000000000f, 1.77777777777f, 1.06666666666f,
- 1.03225806452f, 1.01587301587f, 1.00787401575f, 1.00392156863f, 1.00195694716f,
- 1.00097751711f, 1.00048851979f, 1.00024420024f, 1.00012208522f, 1.00006103888f,
- 1.00003051851f };
- public static final float table_cd_d[] =
- { 0.0f, 0.50000000000f, 0.50000000000f, 0.50000000000f, 0.12500000000f,
- 0.06250000000f, 0.03125000000f, 0.01562500000f, 0.00781250000f, 0.00390625000f,
- 0.00195312500f, 0.00097656250f, 0.00048828125f, 0.00024414063f, 0.00012207031f,
- 0.00006103516f };
-
-
-
- protected int subbandnumber;
- protected int allocation;
- protected int scfsi;
- protected float scalefactor1, scalefactor2, scalefactor3;
- protected int[] codelength = {0};
- protected float groupingtable[][] = new float[2][];
- //protected float[][] groupingtable = {{0},{0}} ;
- protected float[] factor = {0.0f};
- protected int groupnumber;
- protected int samplenumber;
- protected float[] samples = new float[3];
- protected float[] c = {0};
- protected float[] d = {0};
- /**
- * Constructor
- */
- public SubbandLayer2(int subbandnumber)
- {
- this.subbandnumber = subbandnumber;
- groupnumber = samplenumber = 0;
- }
-
-
- /**
- *
- */
- protected int get_allocationlength (Header header)
- {
- if (header.version() == Header.MPEG1)
- {
- int channel_bitrate = header.bitrate_index();
-
- // calculate bitrate per channel:
- if (header.mode() != Header.SINGLE_CHANNEL)
- if (channel_bitrate == 4)
- channel_bitrate = 1;
- else
- channel_bitrate -= 4;
-
- if (channel_bitrate == 1 || channel_bitrate == 2)
- // table 3-B.2c or 3-B.2d
- if (subbandnumber <= 1)
- return 4;
- else
- return 3;
- else
- // tables 3-B.2a or 3-B.2b
- if (subbandnumber <= 10)
- return 4;
- else if (subbandnumber <= 22)
- return 3;
- else
- return 2;
- }
- else
- { // MPEG-2 LSF -- Jeff
-
- // table B.1 of ISO/IEC 13818-3
- if (subbandnumber <= 3)
- return 4;
- else if (subbandnumber <= 10)
- return 3;
- else
- return 2;
- }
- }
-
- /**
- *
- */
- protected void prepare_sample_reading(Header header, int allocation,
- //float[][] groupingtable,
- int channel,
- float[] factor, int[] codelength,
- float[] c, float[] d)
- {
- int channel_bitrate = header.bitrate_index();
- // calculate bitrate per channel:
- if (header.mode() != Header.SINGLE_CHANNEL)
- if (channel_bitrate == 4)
- channel_bitrate = 1;
- else
- channel_bitrate -= 4;
-
- if (channel_bitrate == 1 || channel_bitrate == 2)
- {
- // table 3-B.2c or 3-B.2d
- groupingtable[channel] = table_cd_groupingtables[allocation];
- factor[0] = table_cd_factor[allocation];
- codelength[0] = table_cd_codelength[allocation];
- c[0] = table_cd_c[allocation];
- d[0] = table_cd_d[allocation];
- }
- else
- {
- // tables 3-B.2a or 3-B.2b
- if (subbandnumber <= 2)
- {
- groupingtable[channel] = table_ab1_groupingtables[allocation];
- factor[0] = table_ab1_factor[allocation];
- codelength[0] = table_ab1_codelength[allocation];
- c[0] = table_ab1_c[allocation];
- d[0] = table_ab1_d[allocation];
- }
- else
- {
- groupingtable[channel] = table_ab234_groupingtables[allocation];
- if (subbandnumber <= 10)
- {
- factor[0] = table_ab2_factor[allocation];
- codelength[0] = table_ab2_codelength[allocation];
- c[0] = table_ab2_c[allocation];
- d[0] = table_ab2_d[allocation];
- }
- else if (subbandnumber <= 22)
- {
- factor[0] = table_ab3_factor[allocation];
- codelength[0] = table_ab3_codelength[allocation];
- c[0] = table_ab3_c[allocation];
- d[0] = table_ab3_d[allocation];
- }
- else
- {
- factor[0] = table_ab4_factor[allocation];
- codelength[0] = table_ab4_codelength[allocation];
- c[0] = table_ab4_c[allocation];
- d[0] = table_ab4_d[allocation];
- }
- }
- }
- }
-
-
- /**
- *
- */
- public void read_allocation(Bitstream stream, Header header, Crc16 crc)
- {
- int length = get_allocationlength(header);
- allocation = stream.get_bits(length);
- if (crc != null)
- crc.add_bits(allocation, length);
- }
-
- /**
- *
- */
- public void read_scalefactor_selection (Bitstream stream, Crc16 crc)
- {
- if (allocation != 0)
- {
- scfsi = stream.get_bits(2);
- if (crc != null) crc.add_bits(scfsi, 2);
- }
- }
-
- /**
- *
- */
- public void read_scalefactor (Bitstream stream, Header header)
- {
- if (allocation != 0)
- {
- switch (scfsi)
- {
- case 0:
- scalefactor1 = scalefactors[stream.get_bits(6)];
- scalefactor2 = scalefactors[stream.get_bits(6)];
- scalefactor3 = scalefactors[stream.get_bits(6)];
- break;
- case 1:
- scalefactor1 = scalefactor2 = scalefactors[stream.get_bits(6)];
- scalefactor3 = scalefactors[stream.get_bits(6)];
- break;
- case 2:
- scalefactor1 = scalefactor2 = scalefactor3 = scalefactors[stream.get_bits(6)];
- break;
- case 3:
- scalefactor1 = scalefactors[stream.get_bits(6)];
- scalefactor2 = scalefactor3 = scalefactors[stream.get_bits(6)];
- break;
- }
- prepare_sample_reading(header, allocation, 0,
- factor, codelength, c, d);
- }
- }
-
- /**
- *
- */
- public boolean read_sampledata (Bitstream stream)
- {
- if (allocation != 0)
- if (groupingtable[0] != null)
- {
- int samplecode = stream.get_bits(codelength[0]);
- // create requantized samples:
- samplecode += samplecode << 1;
- float[] target = samples;
- float[] source = groupingtable[0];
- /*
- int tmp = 0;
- int temp = 0;
- target[tmp++] = source[samplecode + temp];
- temp++;
- target[tmp++] = source[samplecode + temp];
- temp++;
- target[tmp] = source[samplecode + temp];
- */
- //Bugfix:
- int tmp = 0;
- int temp = samplecode;
-
- if(temp > source.length - 3) temp = source.length - 3;
-
- target[tmp] = source[temp];
- temp++;tmp++;
- target[tmp] = source[temp];
- temp++;tmp++;
- target[tmp] = source[temp];
-
- // memcpy (samples, groupingtable + samplecode, 3 * sizeof (real));
- }
- else
- {
- samples[0] = (float) ((stream.get_bits(codelength[0])) * factor[0] - 1.0);
- samples[1] = (float) ((stream.get_bits(codelength[0])) * factor[0] - 1.0);
- samples[2] = (float) ((stream.get_bits(codelength[0])) * factor[0] - 1.0);
- }
-
- samplenumber = 0;
- if (++groupnumber == 12)
- return true;
- else
- return false;
- }
-
- /**
- *
- */
- public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2)
- {
- if ((allocation != 0) && (channels != OutputChannels.RIGHT_CHANNEL))
- {
- float sample = samples[samplenumber];
-
- if (groupingtable[0] == null)
- sample = (sample + d[0]) * c[0];
- if (groupnumber <= 4)
- sample *= scalefactor1;
- else if (groupnumber <= 8)
- sample *= scalefactor2;
- else
- sample *= scalefactor3;
- filter1.input_sample(sample, subbandnumber);
- }
-
- if (++samplenumber == 3)
- return true;
- else
- return false;
- }
- };
-
- /**
- * Class for layer II subbands in joint stereo mode.
- */
- static class SubbandLayer2IntensityStereo extends SubbandLayer2
- {
- protected int channel2_scfsi;
- protected float channel2_scalefactor1, channel2_scalefactor2, channel2_scalefactor3;
-
- /**
- * Constructor
- */
- public SubbandLayer2IntensityStereo (int subbandnumber)
- {
- super(subbandnumber);
- }
-
- /**
- *
- */
- public void read_allocation(Bitstream stream, Header header, Crc16 crc)
- {
- super.read_allocation (stream, header, crc);
- }
-
- /**
- *
- */
- public void read_scalefactor_selection(Bitstream stream, Crc16 crc)
- {
- if (allocation != 0)
- {
- scfsi = stream.get_bits(2);
- channel2_scfsi = stream.get_bits(2);
- if (crc != null)
- {
- crc.add_bits(scfsi, 2);
- crc.add_bits(channel2_scfsi, 2);
- }
- }
- }
-
- /**
- *
- */
- public void read_scalefactor(Bitstream stream, Header header)
- {
- if (allocation != 0)
- {
- super.read_scalefactor(stream, header);
- switch (channel2_scfsi)
- {
- case 0:
- channel2_scalefactor1 = scalefactors[stream.get_bits(6)];
- channel2_scalefactor2 = scalefactors[stream.get_bits(6)];
- channel2_scalefactor3 = scalefactors[stream.get_bits(6)];
- break;
-
- case 1:
- channel2_scalefactor1 = channel2_scalefactor2 = scalefactors[stream.get_bits (6)];
- channel2_scalefactor3 = scalefactors[stream.get_bits(6)];
- break;
-
- case 2:
- channel2_scalefactor1 = channel2_scalefactor2 =
- channel2_scalefactor3 = scalefactors[stream.get_bits(6)];
- break;
-
- case 3:
- channel2_scalefactor1 = scalefactors[stream.get_bits(6)];
- channel2_scalefactor2 = channel2_scalefactor3 = scalefactors[stream.get_bits (6)];
- break;
- }
- }
-
- }
-
- /**
- *
- */
- public boolean read_sampledata(Bitstream stream)
- {
- return super.read_sampledata (stream);
- }
-
- /**
- *
- */
- public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2)
- {
- if (allocation != 0)
- {
- float sample = samples[samplenumber];
-
- if (groupingtable[0] == null)
- sample = (sample + d[0]) * c[0];
- if (channels == OutputChannels.BOTH_CHANNELS)
- {
- float sample2 = sample;
- if (groupnumber <= 4)
- {
- sample *= scalefactor1;
- sample2 *= channel2_scalefactor1;
- }
- else if (groupnumber <= 8)
- {
- sample *= scalefactor2;
- sample2 *= channel2_scalefactor2;
- }
- else
- {
- sample *= scalefactor3;
- sample2 *= channel2_scalefactor3;
- }
- filter1.input_sample(sample, subbandnumber);
- filter2.input_sample(sample2, subbandnumber);
- }
- else if (channels == OutputChannels.LEFT_CHANNEL)
- {
- if (groupnumber <= 4)
- sample *= scalefactor1;
- else if (groupnumber <= 8)
- sample *= scalefactor2;
- else
- sample *= scalefactor3;
- filter1.input_sample(sample, subbandnumber);
- }
- else
- {
- if (groupnumber <= 4)
- sample *= channel2_scalefactor1;
- else if (groupnumber <= 8)
- sample *= channel2_scalefactor2;
- else
- sample *= channel2_scalefactor3;
- filter1.input_sample(sample, subbandnumber);
- }
- }
-
- if (++samplenumber == 3)
- return true;
- else
- return false;
- }
- };
-
- /**
- * Class for layer II subbands in stereo mode.
- */
- static class SubbandLayer2Stereo extends SubbandLayer2
- {
- protected int channel2_allocation;
- protected int channel2_scfsi;
- protected float channel2_scalefactor1, channel2_scalefactor2, channel2_scalefactor3;
- //protected boolean channel2_grouping; ???? Never used!
- protected int[] channel2_codelength = {0};
- //protected float[][] channel2_groupingtable = {{0},{0}};
- protected float[] channel2_factor = {0};
- protected float[] channel2_samples;
- protected float[] channel2_c = {0};
- protected float[] channel2_d = {0};
-
- /**
- * Constructor
- */
- public SubbandLayer2Stereo(int subbandnumber)
- {
- super(subbandnumber);
- channel2_samples = new float[3];
- }
-
- /**
- *
- */
- public void read_allocation (Bitstream stream, Header header, Crc16 crc)
- {
- int length = get_allocationlength(header);
- allocation = stream.get_bits(length);
- channel2_allocation = stream.get_bits(length);
- if (crc != null)
- {
- crc.add_bits(allocation, length);
- crc.add_bits(channel2_allocation, length);
- }
- }
-
- /**
- *
- */
- public void read_scalefactor_selection(Bitstream stream, Crc16 crc)
- {
- if (allocation != 0)
- {
- scfsi = stream.get_bits(2);
- if (crc != null)
- crc.add_bits(scfsi, 2);
- }
- if (channel2_allocation != 0)
- {
- channel2_scfsi = stream.get_bits(2);
- if (crc != null)
- crc.add_bits(channel2_scfsi, 2);
- }
- }
-
- /**
- *
- */
- public void read_scalefactor(Bitstream stream, Header header)
- {
- super.read_scalefactor(stream, header);
- if (channel2_allocation != 0)
- {
- switch (channel2_scfsi)
- {
- case 0:
- channel2_scalefactor1 = scalefactors[stream.get_bits(6)];
- channel2_scalefactor2 = scalefactors[stream.get_bits(6)];
- channel2_scalefactor3 = scalefactors[stream.get_bits(6)];
- break;
-
- case 1:
- channel2_scalefactor1 = channel2_scalefactor2 =
- scalefactors[stream.get_bits(6)];
- channel2_scalefactor3 = scalefactors[stream.get_bits(6)];
- break;
-
- case 2:
- channel2_scalefactor1 = channel2_scalefactor2 =
- channel2_scalefactor3 = scalefactors[stream.get_bits(6)];
- break;
-
- case 3:
- channel2_scalefactor1 = scalefactors[stream.get_bits(6)];
- channel2_scalefactor2 = channel2_scalefactor3 =
- scalefactors[stream.get_bits(6)];
- break;
- }
- prepare_sample_reading(header, channel2_allocation, 1,
- channel2_factor, channel2_codelength, channel2_c,
- channel2_d);
- }
- }
-
- /**
- *
- */
- public boolean read_sampledata (Bitstream stream)
- {
- boolean returnvalue = super.read_sampledata(stream);
-
- if (channel2_allocation != 0)
- if (groupingtable[1] != null)
- {
- int samplecode = stream.get_bits(channel2_codelength[0]);
- // create requantized samples:
- samplecode += samplecode << 1;
- /*
- float[] target = channel2_samples;
- float[] source = channel2_groupingtable[0];
- int tmp = 0;
- int temp = 0;
- target[tmp++] = source[samplecode + temp];
- temp++;
- target[tmp++] = source[samplecode + temp];
- temp++;
- target[tmp] = source[samplecode + temp];
- // memcpy (channel2_samples, channel2_groupingtable + samplecode, 3 * sizeof (real));
- */
- float[] target = channel2_samples;
- float[] source = groupingtable[1];
- int tmp = 0;
- int temp = samplecode;
- target[tmp] = source[temp];
- temp++;tmp++;
- target[tmp] = source[temp];
- temp++;tmp++;
- target[tmp] = source[temp];
-
- }
- else
- {
- channel2_samples[0] = (float) ((stream.get_bits(channel2_codelength[0])) *
- channel2_factor[0] - 1.0);
- channel2_samples[1] = (float) ((stream.get_bits(channel2_codelength[0])) *
- channel2_factor[0] - 1.0);
- channel2_samples[2] = (float) ((stream.get_bits(channel2_codelength[0])) *
- channel2_factor[0] - 1.0);
- }
- return returnvalue;
- }
-
- /**
- *
- */
- public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2)
- {
- boolean returnvalue = super.put_next_sample(channels, filter1, filter2);
- if ((channel2_allocation != 0) && (channels != OutputChannels.LEFT_CHANNEL))
- {
- float sample = channel2_samples[samplenumber - 1];
-
- if (groupingtable[1] == null)
- sample = (sample + channel2_d[0]) * channel2_c[0];
-
- if (groupnumber <= 4)
- sample *= channel2_scalefactor1;
- else if (groupnumber <= 8)
- sample *= channel2_scalefactor2;
- else
- sample *= channel2_scalefactor3;
- if (channels == OutputChannels.BOTH_CHANNELS)
- filter2.input_sample(sample, subbandnumber);
- else
- filter1.input_sample(sample, subbandnumber);
- }
- return returnvalue;
- }
- }
-}
diff --git a/src/javazoom/jl/decoder/LayerIIIDecoder.java b/src/javazoom/jl/decoder/LayerIIIDecoder.java
deleted file mode 100644
index 3a48071f17a..00000000000
--- a/src/javazoom/jl/decoder/LayerIIIDecoder.java
+++ /dev/null
@@ -1,2439 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- *
- * 18/06/01 Michael Scheerer, Fixed bugs which causes
- * negative indexes in method huffmann_decode and in method
- * dequanisize_sample.
- *
- * 16/07/01 Michael Scheerer, Catched a bug in method
- * huffmann_decode, which causes an outOfIndexException.
- * Cause : Indexnumber of 24 at SfBandIndex,
- * which has only a length of 22. I have simply and dirty
- * fixed the index to <= 22, because I'm not really be able
- * to fix the bug. The Indexnumber is taken from the MP3
- * file and the origin Ma-Player with the same code works
- * well.
- *
- * 02/19/99 Java Conversion by E.B, javalayer@javazoom.net
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-/**
- * Class Implementing Layer 3 Decoder.
- *
- * @since 0.0
- */
-final class LayerIIIDecoder implements FrameDecoder
-{
- final static double d43 = (4.0/3.0);
-
- public int[] scalefac_buffer;
-
- // MDM: removed, as this wasn't being used.
- //private float CheckSumOut1d = 0.0f;
- private int CheckSumHuff = 0;
- private int[] is_1d;
- private float[][][] ro;
- private float[][][] lr;
- private float[] out_1d;
- private float[][] prevblck;
- private float[][] k;
- private int[] nonzero;
- private Bitstream stream;
- private Header header;
- private SynthesisFilter filter1, filter2;
- private Obuffer buffer;
- private int which_channels;
- private BitReserve br;
- private III_side_info_t si;
-
- private temporaire2[] III_scalefac_t;
- private temporaire2[] scalefac;
- // private III_scalefac_t scalefac;
-
- private int max_gr;
- private int frame_start;
- private int part2_start;
- private int channels;
- private int first_channel;
- private int last_channel;
- private int sfreq;
-
-
- /**
- * Constructor.
- */
- // REVIEW: these constructor arguments should be moved to the
- // decodeFrame() method, where possible, so that one
- public LayerIIIDecoder(Bitstream stream0, Header header0,
- SynthesisFilter filtera, SynthesisFilter filterb,
- Obuffer buffer0, int which_ch0)
- {
- huffcodetab.inithuff();
- is_1d = new int[SBLIMIT*SSLIMIT+4];
- ro = new float[2][SBLIMIT][SSLIMIT];
- lr = new float[2][SBLIMIT][SSLIMIT];
- out_1d = new float[SBLIMIT*SSLIMIT];
- prevblck = new float[2][SBLIMIT*SSLIMIT];
- k = new float[2][SBLIMIT*SSLIMIT];
- nonzero = new int[2];
-
- //III_scalefact_t
- III_scalefac_t = new temporaire2[2];
- III_scalefac_t[0] = new temporaire2();
- III_scalefac_t[1] = new temporaire2();
- scalefac = III_scalefac_t;
- // L3TABLE INIT
-
- sfBandIndex = new SBI[9]; // SZD: MPEG2.5 +3 indices
- int[] l0 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576};
- int[] s0 = {0,4,8,12,18,24,32,42,56,74,100,132,174,192};
- int[] l1 = {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576};
- int[] s1 = {0,4,8,12,18,26,36,48,62,80,104,136,180,192};
- int[] l2 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576};
- int[] s2 = {0,4,8,12,18,26,36,48,62,80,104,134,174,192};
-
- int[] l3 = {0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576};
- int[] s3 = {0,4,8,12,16,22,30,40,52,66,84,106,136,192};
- int[] l4 = {0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576};
- int[] s4 = {0,4,8,12,16,22,28,38,50,64,80,100,126,192};
- int[] l5 = {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576};
- int[] s5 = {0,4,8,12,16,22,30,42,58,78,104,138,180,192};
- // SZD: MPEG2.5
- int[] l6 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576};
- int[] s6 = {0,4,8,12,18,26,36,48,62,80,104,134,174,192};
- int[] l7 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576};
- int[] s7 = {0,4,8,12,18,26,36,48,62,80,104,134,174,192};
- int[] l8 = {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576};
- int[] s8 = {0,8,16,24,36,52,72,96,124,160,162,164,166,192};
-
- sfBandIndex[0]= new SBI(l0,s0);
- sfBandIndex[1]= new SBI(l1,s1);
- sfBandIndex[2]= new SBI(l2,s2);
-
- sfBandIndex[3]= new SBI(l3,s3);
- sfBandIndex[4]= new SBI(l4,s4);
- sfBandIndex[5]= new SBI(l5,s5);
- //SZD: MPEG2.5
- sfBandIndex[6]= new SBI(l6,s6);
- sfBandIndex[7]= new SBI(l7,s7);
- sfBandIndex[8]= new SBI(l8,s8);
- // END OF L3TABLE INIT
-
- if(reorder_table == null) { // SZD: generate LUT
- reorder_table = new int[9][];
- for(int i = 0; i < 9; i++)
- reorder_table[i] = reorder(sfBandIndex[i].s);
- }
-
- // Sftable
- int[] ll0 = {0, 6, 11, 16, 21};
- int[] ss0 = {0, 6, 12};
- sftable = new Sftable(ll0,ss0);
- // END OF Sftable
-
- // scalefac_buffer
- scalefac_buffer = new int[54];
- // END OF scalefac_buffer
-
- stream = stream0;
- header = header0;
- filter1 = filtera;
- filter2 = filterb;
- buffer = buffer0;
- which_channels = which_ch0;
-
- frame_start = 0;
- channels = (header.mode() == Header.SINGLE_CHANNEL) ? 1 : 2;
- max_gr = (header.version() == Header.MPEG1) ? 2 : 1;
-
- sfreq = header.sample_frequency() +
- ((header.version() == Header.MPEG1) ? 3 :
- (header.version() == Header.MPEG25_LSF) ? 6 : 0); // SZD
-
- if (channels == 2)
- {
- switch (which_channels)
- {
- case OutputChannels.LEFT_CHANNEL:
- case OutputChannels.DOWNMIX_CHANNELS:
- first_channel = last_channel = 0;
- break;
-
- case OutputChannels.RIGHT_CHANNEL:
- first_channel = last_channel = 1;
- break;
-
- case OutputChannels.BOTH_CHANNELS:
- default:
- first_channel = 0;
- last_channel = 1;
- break;
- }
- }
- else
- {
- first_channel = last_channel = 0;
- }
-
- for(int ch=0;ch<2;ch++)
- for (int j=0; j<576; j++)
- prevblck[ch][j] = 0.0f;
-
- nonzero[0] = nonzero[1] = 576;
-
- br = new BitReserve();
- si = new III_side_info_t();
- }
-
- /**
- * Notify decoder that a seek is being made.
- */
- public void seek_notify()
- {
- frame_start = 0;
- for(int ch=0;ch<2;ch++)
- for (int j=0; j<576; j++)
- prevblck[ch][j] = 0.0f;
- br = new BitReserve();
- }
-
- public void decodeFrame()
- {
- decode();
- }
-
- /**
- * Decode one frame, filling the buffer with the output samples.
- */
-
- // subband samples are buffered and passed to the
- // SynthesisFilter in one go.
- private float[] samples1 = new float[32];
- private float[] samples2 = new float[32];
-
- public void decode()
- {
- int nSlots = header.slots();
- int flush_main;
- int gr, ch, ss, sb, sb18;
- int main_data_end;
- int bytes_to_discard;
- int i;
-
- get_side_info();
-
- for (i=0; iOutputChannels instance
- * corresponding to the given channel code.
- *
- * @param code one of the OutputChannels channel code constants.
- *
- * @throws IllegalArgumentException if code is not a valid
- * channel code.
- */
- static public OutputChannels fromInt(int code)
- {
- switch (code)
- {
- case LEFT_CHANNEL:
- return LEFT;
- case RIGHT_CHANNEL:
- return RIGHT;
- case BOTH_CHANNELS:
- return BOTH;
- case DOWNMIX_CHANNELS:
- return DOWNMIX;
- default:
- throw new IllegalArgumentException("Invalid channel code: "+code);
- }
- }
-
- private OutputChannels(int channels)
- {
- outputChannels = channels;
-
- if (channels<0 || channels>3)
- throw new IllegalArgumentException("channels");
- }
-
- /**
- * Retrieves the code representing the desired output channels.
- * Will be one of LEFT_CHANNEL, RIGHT_CHANNEL, BOTH_CHANNELS
- * or DOWNMIX_CHANNELS.
- *
- * @return the channel code represented by this instance.
- */
- public int getChannelsOutputCode()
- {
- return outputChannels;
- }
-
- /**
- * Retrieves the number of output channels represented
- * by this channel output type.
- *
- * @return The number of output channels for this channel output
- * type. This will be 2 for BOTH_CHANNELS only, and 1
- * for all other types.
- */
- public int getChannelCount()
- {
- int count = (outputChannels==BOTH_CHANNELS) ? 2 : 1;
- return count;
- }
-
-
- public boolean equals(Object o)
- {
- boolean equals = false;
-
- if (o instanceof OutputChannels)
- {
- OutputChannels oc = (OutputChannels)o;
- equals = (oc.outputChannels == outputChannels);
- }
-
- return equals;
- }
-
- public int hashCode()
- {
- return outputChannels;
- }
-
-}
diff --git a/src/javazoom/jl/decoder/SampleBuffer.java b/src/javazoom/jl/decoder/SampleBuffer.java
deleted file mode 100644
index 3bc0fe853ac..00000000000
--- a/src/javazoom/jl/decoder/SampleBuffer.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- *
- * 12/12/99 Initial Version based on FileObuffer. mdm@techie.com.
- *
- * FileObuffer:
- * 15/02/99 Java Conversion by E.B ,javalayer@javazoom.net
- *
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-/**
- * The SampleBuffer class implements an output buffer
- * that provides storage for a fixed size block of samples.
- */
-public class SampleBuffer extends Obuffer
-{
- private short[] buffer;
- private int[] bufferp;
- private int channels;
- private int frequency;
-
- /**
- * Constructor
- */
- public SampleBuffer(int sample_frequency, int number_of_channels)
- {
- buffer = new short[OBUFFERSIZE];
- bufferp = new int[MAXCHANNELS];
- channels = number_of_channels;
- frequency = sample_frequency;
-
- for (int i = 0; i < number_of_channels; ++i)
- bufferp[i] = (short)i;
-
- }
-
- public int getChannelCount()
- {
- return this.channels;
- }
-
- public int getSampleFrequency()
- {
- return this.frequency;
- }
-
- public short[] getBuffer()
- {
- return this.buffer;
- }
-
- public int getBufferLength()
- {
- return bufferp[0];
- }
-
- /**
- * Takes a 16 Bit PCM sample.
- */
- public void append(int channel, short value)
- {
- buffer[bufferp[channel]] = value;
- bufferp[channel] += channels;
- }
-
- public void appendSamples(int channel, float[] f)
- {
- int pos = bufferp[channel];
-
- short s;
- float fs;
- for (int i=0; i<32;)
- {
- fs = f[i++];
- fs = (fs>32767.0f ? 32767.0f
- : (fs < -32767.0f ? -32767.0f : fs));
-
- s = (short)fs;
- buffer[pos] = s;
- pos += channels;
- }
-
- bufferp[channel] = pos;
- }
-
-
- /**
- * Write the samples to the file (Random Acces).
- */
- public void write_buffer(int val)
- {
-
- //for (int i = 0; i < channels; ++i)
- // bufferp[i] = (short)i;
-
- }
-
- public void close()
- {}
-
- /**
- *
- */
- public void clear_buffer()
- {
- for (int i = 0; i < channels; ++i)
- bufferp[i] = (short)i;
- }
-
- /**
- *
- */
- public void set_stop_flag()
- {}
-}
diff --git a/src/javazoom/jl/decoder/Source.java b/src/javazoom/jl/decoder/Source.java
deleted file mode 100644
index f4d7316a2f5..00000000000
--- a/src/javazoom/jl/decoder/Source.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.decoder;
-
-import java.io.IOException;
-
-/**
- * Work in progress.
- *
- * Class to describe a seekable data source.
- *
- */
-public interface Source
-{
-
- public static final long LENGTH_UNKNOWN = -1;
-
- public int read(byte[] b, int offs, int len)
- throws IOException;
-
-
- public boolean willReadBlock();
-
- public boolean isSeekable();
-
- public long length();
-
- public long tell();
-
- public long seek(long pos);
-
-}
diff --git a/src/javazoom/jl/decoder/SynthesisFilter.java b/src/javazoom/jl/decoder/SynthesisFilter.java
deleted file mode 100644
index 0321253cbb6..00000000000
--- a/src/javazoom/jl/decoder/SynthesisFilter.java
+++ /dev/null
@@ -1,1820 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- *
- * 04/01/00 Fixes for running under build 23xx Microsoft JVM. mdm.
- *
- * 19/12/99 Performance improvements to compute_pcm_samples().
- * Mat McGowan. mdm@techie.com.
- *
- * 16/02/99 Java Conversion by E.B , javalayer@javazoom.net
- *
- * @(#) synthesis_filter.h 1.8, last edit: 6/15/94 16:52:00
- * @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
- * @(#) Berlin University of Technology
- *
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-package javazoom.jl.decoder;
-
-import java.io.IOException;
-
-/**
- * A class for the synthesis filter bank.
- * This class does a fast downsampling from 32, 44.1 or 48 kHz to 8 kHz, if ULAW is defined.
- * Frequencies above 4 kHz are removed by ignoring higher subbands.
- */
-final class SynthesisFilter
-{
- private float[] v1;
- private float[] v2;
- private float[] actual_v; // v1 or v2
- private int actual_write_pos; // 0-15
- private float[] samples; // 32 new subband samples
- private int channel;
- private float scalefactor;
- private float[] eq;
-
- /**
- * Quality value for controlling CPU usage/quality tradeoff.
- */
- /*
- private int quality;
-
- private int v_inc;
-
-
-
- public static final int HIGH_QUALITY = 1;
- public static final int MEDIUM_QUALITY = 2;
- public static final int LOW_QUALITY = 4;
- */
-
- /**
- * Contructor.
- * The scalefactor scales the calculated float pcm samples to short values
- * (raw pcm samples are in [-1.0, 1.0], if no violations occur).
- */
- public SynthesisFilter(int channelnumber, float factor, float[] eq0)
- {
- if (d==null)
- {
- d = load_d();
- d16 = splitArray(d, 16);
- }
-
- v1 = new float[512];
- v2 = new float[512];
- samples = new float[32];
- channel = channelnumber;
- scalefactor = factor;
- setEQ(eq0);
- //setQuality(HIGH_QUALITY);
-
- reset();
- }
-
- public void setEQ(float[] eq0)
- {
- this.eq = eq0;
- if (eq==null)
- {
- eq = new float[32];
- for (int i=0; i<32; i++)
- eq[i] = 1.0f;
- }
- if (eq.length<32)
- {
- throw new IllegalArgumentException("eq0");
- }
-
- }
-
- /*
- private void setQuality(int quality0)
- {
- switch (quality0)
- {
- case HIGH_QUALITY:
- case MEDIUM_QUALITY:
- case LOW_QUALITY:
- v_inc = 16 * quality0;
- quality = quality0;
- break;
- default :
- throw new IllegalArgumentException("Unknown quality value");
- }
- }
-
- public int getQuality()
- {
- return quality;
- }
- */
-
- /**
- * Reset the synthesis filter.
- */
- public void reset()
- {
- //float[] floatp;
- // float[] floatp2;
-
- // initialize v1[] and v2[]:
- //for (floatp = v1 + 512, floatp2 = v2 + 512; floatp > v1; )
- // *--floatp = *--floatp2 = 0.0;
- for (int p=0;p<512;p++)
- v1[p] = v2[p] = 0.0f;
-
- // initialize samples[]:
- //for (floatp = samples + 32; floatp > samples; )
- // *--floatp = 0.0;
- for (int p2=0;p2<32;p2++)
- samples[p2] = 0.0f;
-
- actual_v = v1;
- actual_write_pos = 15;
- }
-
-
- /**
- * Inject Sample.
- */
- public void input_sample(float sample, int subbandnumber)
- {
- samples[subbandnumber] = eq[subbandnumber]*sample;
- }
-
- public void input_samples(float[] s)
- {
- for (int i=31; i>=0; i--)
- {
- samples[i] = s[i]*eq[i];
- }
- }
-
- /**
- * Compute new values via a fast cosine transform.
- */
- private void compute_new_v()
- {
- // p is fully initialized from x1
- //float[] p = _p;
- // pp is fully initialized from p
- //float[] pp = _pp;
-
- //float[] new_v = _new_v;
-
- //float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3
- //float[] p = new float[16];
- //float[] pp = new float[16];
-
- /*
- for (int i=31; i>=0; i--)
- {
- new_v[i] = 0.0f;
- }
- */
-
- float new_v0, new_v1, new_v2, new_v3, new_v4, new_v5, new_v6, new_v7, new_v8, new_v9;
- float new_v10, new_v11, new_v12, new_v13, new_v14, new_v15, new_v16, new_v17, new_v18, new_v19;
- float new_v20, new_v21, new_v22, new_v23, new_v24, new_v25, new_v26, new_v27, new_v28, new_v29;
- float new_v30, new_v31;
-
- new_v0 = new_v1 = new_v2 = new_v3 = new_v4 = new_v5 = new_v6 = new_v7 = new_v8 = new_v9 =
- new_v10 = new_v11 = new_v12 = new_v13 = new_v14 = new_v15 = new_v16 = new_v17 = new_v18 = new_v19 =
- new_v20 = new_v21 = new_v22 = new_v23 = new_v24 = new_v25 = new_v26 = new_v27 = new_v28 = new_v29 =
- new_v30 = new_v31 = 0.0f;
-
-
-// float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3
-// float[] p = new float[16];
-// float[] pp = new float[16];
-
- float[] s = samples;
-
- float s0 = s[0];
- float s1 = s[1];
- float s2 = s[2];
- float s3 = s[3];
- float s4 = s[4];
- float s5 = s[5];
- float s6 = s[6];
- float s7 = s[7];
- float s8 = s[8];
- float s9 = s[9];
- float s10 = s[10];
- float s11 = s[11];
- float s12 = s[12];
- float s13 = s[13];
- float s14 = s[14];
- float s15 = s[15];
- float s16 = s[16];
- float s17 = s[17];
- float s18 = s[18];
- float s19 = s[19];
- float s20 = s[20];
- float s21 = s[21];
- float s22 = s[22];
- float s23 = s[23];
- float s24 = s[24];
- float s25 = s[25];
- float s26 = s[26];
- float s27 = s[27];
- float s28 = s[28];
- float s29 = s[29];
- float s30 = s[30];
- float s31 = s[31];
-
- float p0 = s0 + s31;
- float p1 = s1 + s30;
- float p2 = s2 + s29;
- float p3 = s3 + s28;
- float p4 = s4 + s27;
- float p5 = s5 + s26;
- float p6 = s6 + s25;
- float p7 = s7 + s24;
- float p8 = s8 + s23;
- float p9 = s9 + s22;
- float p10 = s10 + s21;
- float p11 = s11 + s20;
- float p12 = s12 + s19;
- float p13 = s13 + s18;
- float p14 = s14 + s17;
- float p15 = s15 + s16;
-
- float pp0 = p0 + p15;
- float pp1 = p1 + p14;
- float pp2 = p2 + p13;
- float pp3 = p3 + p12;
- float pp4 = p4 + p11;
- float pp5 = p5 + p10;
- float pp6 = p6 + p9;
- float pp7 = p7 + p8;
- float pp8 = (p0 - p15) * cos1_32;
- float pp9 = (p1 - p14) * cos3_32;
- float pp10 = (p2 - p13) * cos5_32;
- float pp11 = (p3 - p12) * cos7_32;
- float pp12 = (p4 - p11) * cos9_32;
- float pp13 = (p5 - p10) * cos11_32;
- float pp14 = (p6 - p9) * cos13_32;
- float pp15 = (p7 - p8) * cos15_32;
-
- p0 = pp0 + pp7;
- p1 = pp1 + pp6;
- p2 = pp2 + pp5;
- p3 = pp3 + pp4;
- p4 = (pp0 - pp7) * cos1_16;
- p5 = (pp1 - pp6) * cos3_16;
- p6 = (pp2 - pp5) * cos5_16;
- p7 = (pp3 - pp4) * cos7_16;
- p8 = pp8 + pp15;
- p9 = pp9 + pp14;
- p10 = pp10 + pp13;
- p11 = pp11 + pp12;
- p12 = (pp8 - pp15) * cos1_16;
- p13 = (pp9 - pp14) * cos3_16;
- p14 = (pp10 - pp13) * cos5_16;
- p15 = (pp11 - pp12) * cos7_16;
-
-
- pp0 = p0 + p3;
- pp1 = p1 + p2;
- pp2 = (p0 - p3) * cos1_8;
- pp3 = (p1 - p2) * cos3_8;
- pp4 = p4 + p7;
- pp5 = p5 + p6;
- pp6 = (p4 - p7) * cos1_8;
- pp7 = (p5 - p6) * cos3_8;
- pp8 = p8 + p11;
- pp9 = p9 + p10;
- pp10 = (p8 - p11) * cos1_8;
- pp11 = (p9 - p10) * cos3_8;
- pp12 = p12 + p15;
- pp13 = p13 + p14;
- pp14 = (p12 - p15) * cos1_8;
- pp15 = (p13 - p14) * cos3_8;
-
- p0 = pp0 + pp1;
- p1 = (pp0 - pp1) * cos1_4;
- p2 = pp2 + pp3;
- p3 = (pp2 - pp3) * cos1_4;
- p4 = pp4 + pp5;
- p5 = (pp4 - pp5) * cos1_4;
- p6 = pp6 + pp7;
- p7 = (pp6 - pp7) * cos1_4;
- p8 = pp8 + pp9;
- p9 = (pp8 - pp9) * cos1_4;
- p10 = pp10 + pp11;
- p11 = (pp10 - pp11) * cos1_4;
- p12 = pp12 + pp13;
- p13 = (pp12 - pp13) * cos1_4;
- p14 = pp14 + pp15;
- p15 = (pp14 - pp15) * cos1_4;
-
- // this is pretty insane coding
- float tmp1;
- new_v19/*36-17*/ = -(new_v4 = (new_v12 = p7) + p5) - p6;
- new_v27/*44-17*/ = -p6 - p7 - p4;
- new_v6 = (new_v10 = (new_v14 = p15) + p11) + p13;
- new_v17/*34-17*/ = -(new_v2 = p15 + p13 + p9) - p14;
- new_v21/*38-17*/ = (tmp1 = -p14 - p15 - p10 - p11) - p13;
- new_v29/*46-17*/ = -p14 - p15 - p12 - p8;
- new_v25/*42-17*/ = tmp1 - p12;
- new_v31/*48-17*/ = -p0;
- new_v0 = p1;
- new_v23/*40-17*/ = -(new_v8 = p3) - p2;
-
- p0 = (s0 - s31) * cos1_64;
- p1 = (s1 - s30) * cos3_64;
- p2 = (s2 - s29) * cos5_64;
- p3 = (s3 - s28) * cos7_64;
- p4 = (s4 - s27) * cos9_64;
- p5 = (s5 - s26) * cos11_64;
- p6 = (s6 - s25) * cos13_64;
- p7 = (s7 - s24) * cos15_64;
- p8 = (s8 - s23) * cos17_64;
- p9 = (s9 - s22) * cos19_64;
- p10 = (s10 - s21) * cos21_64;
- p11 = (s11 - s20) * cos23_64;
- p12 = (s12 - s19) * cos25_64;
- p13 = (s13 - s18) * cos27_64;
- p14 = (s14 - s17) * cos29_64;
- p15 = (s15 - s16) * cos31_64;
-
-
- pp0 = p0 + p15;
- pp1 = p1 + p14;
- pp2 = p2 + p13;
- pp3 = p3 + p12;
- pp4 = p4 + p11;
- pp5 = p5 + p10;
- pp6 = p6 + p9;
- pp7 = p7 + p8;
- pp8 = (p0 - p15) * cos1_32;
- pp9 = (p1 - p14) * cos3_32;
- pp10 = (p2 - p13) * cos5_32;
- pp11 = (p3 - p12) * cos7_32;
- pp12 = (p4 - p11) * cos9_32;
- pp13 = (p5 - p10) * cos11_32;
- pp14 = (p6 - p9) * cos13_32;
- pp15 = (p7 - p8) * cos15_32;
-
-
- p0 = pp0 + pp7;
- p1 = pp1 + pp6;
- p2 = pp2 + pp5;
- p3 = pp3 + pp4;
- p4 = (pp0 - pp7) * cos1_16;
- p5 = (pp1 - pp6) * cos3_16;
- p6 = (pp2 - pp5) * cos5_16;
- p7 = (pp3 - pp4) * cos7_16;
- p8 = pp8 + pp15;
- p9 = pp9 + pp14;
- p10 = pp10 + pp13;
- p11 = pp11 + pp12;
- p12 = (pp8 - pp15) * cos1_16;
- p13 = (pp9 - pp14) * cos3_16;
- p14 = (pp10 - pp13) * cos5_16;
- p15 = (pp11 - pp12) * cos7_16;
-
-
- pp0 = p0 + p3;
- pp1 = p1 + p2;
- pp2 = (p0 - p3) * cos1_8;
- pp3 = (p1 - p2) * cos3_8;
- pp4 = p4 + p7;
- pp5 = p5 + p6;
- pp6 = (p4 - p7) * cos1_8;
- pp7 = (p5 - p6) * cos3_8;
- pp8 = p8 + p11;
- pp9 = p9 + p10;
- pp10 = (p8 - p11) * cos1_8;
- pp11 = (p9 - p10) * cos3_8;
- pp12 = p12 + p15;
- pp13 = p13 + p14;
- pp14 = (p12 - p15) * cos1_8;
- pp15 = (p13 - p14) * cos3_8;
-
-
- p0 = pp0 + pp1;
- p1 = (pp0 - pp1) * cos1_4;
- p2 = pp2 + pp3;
- p3 = (pp2 - pp3) * cos1_4;
- p4 = pp4 + pp5;
- p5 = (pp4 - pp5) * cos1_4;
- p6 = pp6 + pp7;
- p7 = (pp6 - pp7) * cos1_4;
- p8 = pp8 + pp9;
- p9 = (pp8 - pp9) * cos1_4;
- p10 = pp10 + pp11;
- p11 = (pp10 - pp11) * cos1_4;
- p12 = pp12 + pp13;
- p13 = (pp12 - pp13) * cos1_4;
- p14 = pp14 + pp15;
- p15 = (pp14 - pp15) * cos1_4;
-
-
- // manually doing something that a compiler should handle sucks
- // coding like this is hard to read
- float tmp2;
- new_v5 = (new_v11 = (new_v13 = (new_v15 = p15) + p7) + p11)
- + p5 + p13;
- new_v7 = (new_v9 = p15 + p11 + p3) + p13;
- new_v16/*33-17*/ = -(new_v1 = (tmp1 = p13 + p15 + p9) + p1) - p14;
- new_v18/*35-17*/ = -(new_v3 = tmp1 + p5 + p7) - p6 - p14;
-
- new_v22/*39-17*/ = (tmp1 = -p10 - p11 - p14 - p15)
- - p13 - p2 - p3;
- new_v20/*37-17*/ = tmp1 - p13 - p5 - p6 - p7;
- new_v24/*41-17*/ = tmp1 - p12 - p2 - p3;
- new_v26/*43-17*/ = tmp1 - p12 - (tmp2 = p4 + p6 + p7);
- new_v30/*47-17*/ = (tmp1 = -p8 - p12 - p14 - p15) - p0;
- new_v28/*45-17*/ = tmp1 - tmp2;
-
- // insert V[0-15] (== new_v[0-15]) into actual v:
- // float[] x2 = actual_v + actual_write_pos;
- float dest[] = actual_v;
-
- int pos = actual_write_pos;
-
- dest[0 + pos] = new_v0;
- dest[16 + pos] = new_v1;
- dest[32 + pos] = new_v2;
- dest[48 + pos] = new_v3;
- dest[64 + pos] = new_v4;
- dest[80 + pos] = new_v5;
- dest[96 + pos] = new_v6;
- dest[112 + pos] = new_v7;
- dest[128 + pos] = new_v8;
- dest[144 + pos] = new_v9;
- dest[160 + pos] = new_v10;
- dest[176 + pos] = new_v11;
- dest[192 + pos] = new_v12;
- dest[208 + pos] = new_v13;
- dest[224 + pos] = new_v14;
- dest[240 + pos] = new_v15;
-
- // V[16] is always 0.0:
- dest[256 + pos] = 0.0f;
-
- // insert V[17-31] (== -new_v[15-1]) into actual v:
- dest[272 + pos] = -new_v15;
- dest[288 + pos] = -new_v14;
- dest[304 + pos] = -new_v13;
- dest[320 + pos] = -new_v12;
- dest[336 + pos] = -new_v11;
- dest[352 + pos] = -new_v10;
- dest[368 + pos] = -new_v9;
- dest[384 + pos] = -new_v8;
- dest[400 + pos] = -new_v7;
- dest[416 + pos] = -new_v6;
- dest[432 + pos] = -new_v5;
- dest[448 + pos] = -new_v4;
- dest[464 + pos] = -new_v3;
- dest[480 + pos] = -new_v2;
- dest[496 + pos] = -new_v1;
-
- // insert V[32] (== -new_v[0]) into other v:
- dest = (actual_v==v1) ? v2 : v1;
-
- dest[0 + pos] = -new_v0;
- // insert V[33-48] (== new_v[16-31]) into other v:
- dest[16 + pos] = new_v16;
- dest[32 + pos] = new_v17;
- dest[48 + pos] = new_v18;
- dest[64 + pos] = new_v19;
- dest[80 + pos] = new_v20;
- dest[96 + pos] = new_v21;
- dest[112 + pos] = new_v22;
- dest[128 + pos] = new_v23;
- dest[144 + pos] = new_v24;
- dest[160 + pos] = new_v25;
- dest[176 + pos] = new_v26;
- dest[192 + pos] = new_v27;
- dest[208 + pos] = new_v28;
- dest[224 + pos] = new_v29;
- dest[240 + pos] = new_v30;
- dest[256 + pos] = new_v31;
-
- // insert V[49-63] (== new_v[30-16]) into other v:
- dest[272 + pos] = new_v30;
- dest[288 + pos] = new_v29;
- dest[304 + pos] = new_v28;
- dest[320 + pos] = new_v27;
- dest[336 + pos] = new_v26;
- dest[352 + pos] = new_v25;
- dest[368 + pos] = new_v24;
- dest[384 + pos] = new_v23;
- dest[400 + pos] = new_v22;
- dest[416 + pos] = new_v21;
- dest[432 + pos] = new_v20;
- dest[448 + pos] = new_v19;
- dest[464 + pos] = new_v18;
- dest[480 + pos] = new_v17;
- dest[496 + pos] = new_v16;
-/*
- }
- else
- {
- v1[0 + actual_write_pos] = -new_v0;
- // insert V[33-48] (== new_v[16-31]) into other v:
- v1[16 + actual_write_pos] = new_v16;
- v1[32 + actual_write_pos] = new_v17;
- v1[48 + actual_write_pos] = new_v18;
- v1[64 + actual_write_pos] = new_v19;
- v1[80 + actual_write_pos] = new_v20;
- v1[96 + actual_write_pos] = new_v21;
- v1[112 + actual_write_pos] = new_v22;
- v1[128 + actual_write_pos] = new_v23;
- v1[144 + actual_write_pos] = new_v24;
- v1[160 + actual_write_pos] = new_v25;
- v1[176 + actual_write_pos] = new_v26;
- v1[192 + actual_write_pos] = new_v27;
- v1[208 + actual_write_pos] = new_v28;
- v1[224 + actual_write_pos] = new_v29;
- v1[240 + actual_write_pos] = new_v30;
- v1[256 + actual_write_pos] = new_v31;
-
- // insert V[49-63] (== new_v[30-16]) into other v:
- v1[272 + actual_write_pos] = new_v30;
- v1[288 + actual_write_pos] = new_v29;
- v1[304 + actual_write_pos] = new_v28;
- v1[320 + actual_write_pos] = new_v27;
- v1[336 + actual_write_pos] = new_v26;
- v1[352 + actual_write_pos] = new_v25;
- v1[368 + actual_write_pos] = new_v24;
- v1[384 + actual_write_pos] = new_v23;
- v1[400 + actual_write_pos] = new_v22;
- v1[416 + actual_write_pos] = new_v21;
- v1[432 + actual_write_pos] = new_v20;
- v1[448 + actual_write_pos] = new_v19;
- v1[464 + actual_write_pos] = new_v18;
- v1[480 + actual_write_pos] = new_v17;
- v1[496 + actual_write_pos] = new_v16;
- }
-*/
- }
-
- /**
- * Compute new values via a fast cosine transform.
- */
- @SuppressWarnings("unused")
- private void compute_new_v_old()
- {
- // p is fully initialized from x1
- //float[] p = _p;
- // pp is fully initialized from p
- //float[] pp = _pp;
-
- //float[] new_v = _new_v;
-
- float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3
- float[] p = new float[16];
- float[] pp = new float[16];
-
-
- for (int i=31; i>=0; i--)
- {
- new_v[i] = 0.0f;
- }
-
-// float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3
-// float[] p = new float[16];
-// float[] pp = new float[16];
-
- float[] x1 = samples;
-
- p[0] = x1[0] + x1[31];
- p[1] = x1[1] + x1[30];
- p[2] = x1[2] + x1[29];
- p[3] = x1[3] + x1[28];
- p[4] = x1[4] + x1[27];
- p[5] = x1[5] + x1[26];
- p[6] = x1[6] + x1[25];
- p[7] = x1[7] + x1[24];
- p[8] = x1[8] + x1[23];
- p[9] = x1[9] + x1[22];
- p[10] = x1[10] + x1[21];
- p[11] = x1[11] + x1[20];
- p[12] = x1[12] + x1[19];
- p[13] = x1[13] + x1[18];
- p[14] = x1[14] + x1[17];
- p[15] = x1[15] + x1[16];
-
- pp[0] = p[0] + p[15];
- pp[1] = p[1] + p[14];
- pp[2] = p[2] + p[13];
- pp[3] = p[3] + p[12];
- pp[4] = p[4] + p[11];
- pp[5] = p[5] + p[10];
- pp[6] = p[6] + p[9];
- pp[7] = p[7] + p[8];
- pp[8] = (p[0] - p[15]) * cos1_32;
- pp[9] = (p[1] - p[14]) * cos3_32;
- pp[10] = (p[2] - p[13]) * cos5_32;
- pp[11] = (p[3] - p[12]) * cos7_32;
- pp[12] = (p[4] - p[11]) * cos9_32;
- pp[13] = (p[5] - p[10]) * cos11_32;
- pp[14] = (p[6] - p[9]) * cos13_32;
- pp[15] = (p[7] - p[8]) * cos15_32;
-
- p[0] = pp[0] + pp[7];
- p[1] = pp[1] + pp[6];
- p[2] = pp[2] + pp[5];
- p[3] = pp[3] + pp[4];
- p[4] = (pp[0] - pp[7]) * cos1_16;
- p[5] = (pp[1] - pp[6]) * cos3_16;
- p[6] = (pp[2] - pp[5]) * cos5_16;
- p[7] = (pp[3] - pp[4]) * cos7_16;
- p[8] = pp[8] + pp[15];
- p[9] = pp[9] + pp[14];
- p[10] = pp[10] + pp[13];
- p[11] = pp[11] + pp[12];
- p[12] = (pp[8] - pp[15]) * cos1_16;
- p[13] = (pp[9] - pp[14]) * cos3_16;
- p[14] = (pp[10] - pp[13]) * cos5_16;
- p[15] = (pp[11] - pp[12]) * cos7_16;
-
-
- pp[0] = p[0] + p[3];
- pp[1] = p[1] + p[2];
- pp[2] = (p[0] - p[3]) * cos1_8;
- pp[3] = (p[1] - p[2]) * cos3_8;
- pp[4] = p[4] + p[7];
- pp[5] = p[5] + p[6];
- pp[6] = (p[4] - p[7]) * cos1_8;
- pp[7] = (p[5] - p[6]) * cos3_8;
- pp[8] = p[8] + p[11];
- pp[9] = p[9] + p[10];
- pp[10] = (p[8] - p[11]) * cos1_8;
- pp[11] = (p[9] - p[10]) * cos3_8;
- pp[12] = p[12] + p[15];
- pp[13] = p[13] + p[14];
- pp[14] = (p[12] - p[15]) * cos1_8;
- pp[15] = (p[13] - p[14]) * cos3_8;
-
- p[0] = pp[0] + pp[1];
- p[1] = (pp[0] - pp[1]) * cos1_4;
- p[2] = pp[2] + pp[3];
- p[3] = (pp[2] - pp[3]) * cos1_4;
- p[4] = pp[4] + pp[5];
- p[5] = (pp[4] - pp[5]) * cos1_4;
- p[6] = pp[6] + pp[7];
- p[7] = (pp[6] - pp[7]) * cos1_4;
- p[8] = pp[8] + pp[9];
- p[9] = (pp[8] - pp[9]) * cos1_4;
- p[10] = pp[10] + pp[11];
- p[11] = (pp[10] - pp[11]) * cos1_4;
- p[12] = pp[12] + pp[13];
- p[13] = (pp[12] - pp[13]) * cos1_4;
- p[14] = pp[14] + pp[15];
- p[15] = (pp[14] - pp[15]) * cos1_4;
-
- // this is pretty insane coding
- float tmp1;
- new_v[36-17] = -(new_v[4] = (new_v[12] = p[7]) + p[5]) - p[6];
- new_v[44-17] = -p[6] - p[7] - p[4];
- new_v[6] = (new_v[10] = (new_v[14] = p[15]) + p[11]) + p[13];
- new_v[34-17] = -(new_v[2] = p[15] + p[13] + p[9]) - p[14];
- new_v[38-17] = (tmp1 = -p[14] - p[15] - p[10] - p[11]) - p[13];
- new_v[46-17] = -p[14] - p[15] - p[12] - p[8];
- new_v[42-17] = tmp1 - p[12];
- new_v[48-17] = -p[0];
- new_v[0] = p[1];
- new_v[40-17] = -(new_v[8] = p[3]) - p[2];
-
- p[0] = (x1[0] - x1[31]) * cos1_64;
- p[1] = (x1[1] - x1[30]) * cos3_64;
- p[2] = (x1[2] - x1[29]) * cos5_64;
- p[3] = (x1[3] - x1[28]) * cos7_64;
- p[4] = (x1[4] - x1[27]) * cos9_64;
- p[5] = (x1[5] - x1[26]) * cos11_64;
- p[6] = (x1[6] - x1[25]) * cos13_64;
- p[7] = (x1[7] - x1[24]) * cos15_64;
- p[8] = (x1[8] - x1[23]) * cos17_64;
- p[9] = (x1[9] - x1[22]) * cos19_64;
- p[10] = (x1[10] - x1[21]) * cos21_64;
- p[11] = (x1[11] - x1[20]) * cos23_64;
- p[12] = (x1[12] - x1[19]) * cos25_64;
- p[13] = (x1[13] - x1[18]) * cos27_64;
- p[14] = (x1[14] - x1[17]) * cos29_64;
- p[15] = (x1[15] - x1[16]) * cos31_64;
-
-
- pp[0] = p[0] + p[15];
- pp[1] = p[1] + p[14];
- pp[2] = p[2] + p[13];
- pp[3] = p[3] + p[12];
- pp[4] = p[4] + p[11];
- pp[5] = p[5] + p[10];
- pp[6] = p[6] + p[9];
- pp[7] = p[7] + p[8];
- pp[8] = (p[0] - p[15]) * cos1_32;
- pp[9] = (p[1] - p[14]) * cos3_32;
- pp[10] = (p[2] - p[13]) * cos5_32;
- pp[11] = (p[3] - p[12]) * cos7_32;
- pp[12] = (p[4] - p[11]) * cos9_32;
- pp[13] = (p[5] - p[10]) * cos11_32;
- pp[14] = (p[6] - p[9]) * cos13_32;
- pp[15] = (p[7] - p[8]) * cos15_32;
-
-
- p[0] = pp[0] + pp[7];
- p[1] = pp[1] + pp[6];
- p[2] = pp[2] + pp[5];
- p[3] = pp[3] + pp[4];
- p[4] = (pp[0] - pp[7]) * cos1_16;
- p[5] = (pp[1] - pp[6]) * cos3_16;
- p[6] = (pp[2] - pp[5]) * cos5_16;
- p[7] = (pp[3] - pp[4]) * cos7_16;
- p[8] = pp[8] + pp[15];
- p[9] = pp[9] + pp[14];
- p[10] = pp[10] + pp[13];
- p[11] = pp[11] + pp[12];
- p[12] = (pp[8] - pp[15]) * cos1_16;
- p[13] = (pp[9] - pp[14]) * cos3_16;
- p[14] = (pp[10] - pp[13]) * cos5_16;
- p[15] = (pp[11] - pp[12]) * cos7_16;
-
-
- pp[0] = p[0] + p[3];
- pp[1] = p[1] + p[2];
- pp[2] = (p[0] - p[3]) * cos1_8;
- pp[3] = (p[1] - p[2]) * cos3_8;
- pp[4] = p[4] + p[7];
- pp[5] = p[5] + p[6];
- pp[6] = (p[4] - p[7]) * cos1_8;
- pp[7] = (p[5] - p[6]) * cos3_8;
- pp[8] = p[8] + p[11];
- pp[9] = p[9] + p[10];
- pp[10] = (p[8] - p[11]) * cos1_8;
- pp[11] = (p[9] - p[10]) * cos3_8;
- pp[12] = p[12] + p[15];
- pp[13] = p[13] + p[14];
- pp[14] = (p[12] - p[15]) * cos1_8;
- pp[15] = (p[13] - p[14]) * cos3_8;
-
-
- p[0] = pp[0] + pp[1];
- p[1] = (pp[0] - pp[1]) * cos1_4;
- p[2] = pp[2] + pp[3];
- p[3] = (pp[2] - pp[3]) * cos1_4;
- p[4] = pp[4] + pp[5];
- p[5] = (pp[4] - pp[5]) * cos1_4;
- p[6] = pp[6] + pp[7];
- p[7] = (pp[6] - pp[7]) * cos1_4;
- p[8] = pp[8] + pp[9];
- p[9] = (pp[8] - pp[9]) * cos1_4;
- p[10] = pp[10] + pp[11];
- p[11] = (pp[10] - pp[11]) * cos1_4;
- p[12] = pp[12] + pp[13];
- p[13] = (pp[12] - pp[13]) * cos1_4;
- p[14] = pp[14] + pp[15];
- p[15] = (pp[14] - pp[15]) * cos1_4;
-
-
- // manually doing something that a compiler should handle sucks
- // coding like this is hard to read
- float tmp2;
- new_v[5] = (new_v[11] = (new_v[13] = (new_v[15] = p[15]) + p[7]) + p[11])
- + p[5] + p[13];
- new_v[7] = (new_v[9] = p[15] + p[11] + p[3]) + p[13];
- new_v[33-17] = -(new_v[1] = (tmp1 = p[13] + p[15] + p[9]) + p[1]) - p[14];
- new_v[35-17] = -(new_v[3] = tmp1 + p[5] + p[7]) - p[6] - p[14];
-
- new_v[39-17] = (tmp1 = -p[10] - p[11] - p[14] - p[15])
- - p[13] - p[2] - p[3];
- new_v[37-17] = tmp1 - p[13] - p[5] - p[6] - p[7];
- new_v[41-17] = tmp1 - p[12] - p[2] - p[3];
- new_v[43-17] = tmp1 - p[12] - (tmp2 = p[4] + p[6] + p[7]);
- new_v[47-17] = (tmp1 = -p[8] - p[12] - p[14] - p[15]) - p[0];
- new_v[45-17] = tmp1 - tmp2;
-
- // insert V[0-15] (== new_v[0-15]) into actual v:
- x1 = new_v;
- // float[] x2 = actual_v + actual_write_pos;
- float[] dest = actual_v;
-
- dest[0 + actual_write_pos] = x1[0];
- dest[16 + actual_write_pos] = x1[1];
- dest[32 + actual_write_pos] = x1[2];
- dest[48 + actual_write_pos] = x1[3];
- dest[64 + actual_write_pos] = x1[4];
- dest[80 + actual_write_pos] = x1[5];
- dest[96 + actual_write_pos] = x1[6];
- dest[112 + actual_write_pos] = x1[7];
- dest[128 + actual_write_pos] = x1[8];
- dest[144 + actual_write_pos] = x1[9];
- dest[160 + actual_write_pos] = x1[10];
- dest[176 + actual_write_pos] = x1[11];
- dest[192 + actual_write_pos] = x1[12];
- dest[208 + actual_write_pos] = x1[13];
- dest[224 + actual_write_pos] = x1[14];
- dest[240 + actual_write_pos] = x1[15];
-
- // V[16] is always 0.0:
- dest[256 + actual_write_pos] = 0.0f;
-
- // insert V[17-31] (== -new_v[15-1]) into actual v:
- dest[272 + actual_write_pos] = -x1[15];
- dest[288 + actual_write_pos] = -x1[14];
- dest[304 + actual_write_pos] = -x1[13];
- dest[320 + actual_write_pos] = -x1[12];
- dest[336 + actual_write_pos] = -x1[11];
- dest[352 + actual_write_pos] = -x1[10];
- dest[368 + actual_write_pos] = -x1[9];
- dest[384 + actual_write_pos] = -x1[8];
- dest[400 + actual_write_pos] = -x1[7];
- dest[416 + actual_write_pos] = -x1[6];
- dest[432 + actual_write_pos] = -x1[5];
- dest[448 + actual_write_pos] = -x1[4];
- dest[464 + actual_write_pos] = -x1[3];
- dest[480 + actual_write_pos] = -x1[2];
- dest[496 + actual_write_pos] = -x1[1];
-
- // insert V[32] (== -new_v[0]) into other v:
-
- }
-
- /**
- * Compute PCM Samples.
- */
-
- private float[] _tmpOut = new float[32];
-
-
- private void compute_pcm_samples0(Obuffer buffer)
- {
- final float[] vp = actual_v;
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- float pcm_sample;
- final float[] dp = d16[i];
- pcm_sample = (float)(((vp[0 + dvp] * dp[0]) +
- (vp[15 + dvp] * dp[1]) +
- (vp[14 + dvp] * dp[2]) +
- (vp[13 + dvp] * dp[3]) +
- (vp[12 + dvp] * dp[4]) +
- (vp[11 + dvp] * dp[5]) +
- (vp[10 + dvp] * dp[6]) +
- (vp[9 + dvp] * dp[7]) +
- (vp[8 + dvp] * dp[8]) +
- (vp[7 + dvp] * dp[9]) +
- (vp[6 + dvp] * dp[10]) +
- (vp[5 + dvp] * dp[11]) +
- (vp[4 + dvp] * dp[12]) +
- (vp[3 + dvp] * dp[13]) +
- (vp[2 + dvp] * dp[14]) +
- (vp[1 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
-
- private void compute_pcm_samples1(Obuffer buffer)
- {
- final float[] vp = actual_v;
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[1 + dvp] * dp[0]) +
- (vp[0 + dvp] * dp[1]) +
- (vp[15 + dvp] * dp[2]) +
- (vp[14 + dvp] * dp[3]) +
- (vp[13 + dvp] * dp[4]) +
- (vp[12 + dvp] * dp[5]) +
- (vp[11 + dvp] * dp[6]) +
- (vp[10 + dvp] * dp[7]) +
- (vp[9 + dvp] * dp[8]) +
- (vp[8 + dvp] * dp[9]) +
- (vp[7 + dvp] * dp[10]) +
- (vp[6 + dvp] * dp[11]) +
- (vp[5 + dvp] * dp[12]) +
- (vp[4 + dvp] * dp[13]) +
- (vp[3 + dvp] * dp[14]) +
- (vp[2 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
- private void compute_pcm_samples2(Obuffer buffer)
- {
- final float[] vp = actual_v;
-
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[2 + dvp] * dp[0]) +
- (vp[1 + dvp] * dp[1]) +
- (vp[0 + dvp] * dp[2]) +
- (vp[15 + dvp] * dp[3]) +
- (vp[14 + dvp] * dp[4]) +
- (vp[13 + dvp] * dp[5]) +
- (vp[12 + dvp] * dp[6]) +
- (vp[11 + dvp] * dp[7]) +
- (vp[10 + dvp] * dp[8]) +
- (vp[9 + dvp] * dp[9]) +
- (vp[8 + dvp] * dp[10]) +
- (vp[7 + dvp] * dp[11]) +
- (vp[6 + dvp] * dp[12]) +
- (vp[5 + dvp] * dp[13]) +
- (vp[4 + dvp] * dp[14]) +
- (vp[3 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
-
- private void compute_pcm_samples3(Obuffer buffer)
- {
- final float[] vp = actual_v;
-
- @SuppressWarnings("unused")
- int idx = 0;
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[3 + dvp] * dp[0]) +
- (vp[2 + dvp] * dp[1]) +
- (vp[1 + dvp] * dp[2]) +
- (vp[0 + dvp] * dp[3]) +
- (vp[15 + dvp] * dp[4]) +
- (vp[14 + dvp] * dp[5]) +
- (vp[13 + dvp] * dp[6]) +
- (vp[12 + dvp] * dp[7]) +
- (vp[11 + dvp] * dp[8]) +
- (vp[10 + dvp] * dp[9]) +
- (vp[9 + dvp] * dp[10]) +
- (vp[8 + dvp] * dp[11]) +
- (vp[7 + dvp] * dp[12]) +
- (vp[6 + dvp] * dp[13]) +
- (vp[5 + dvp] * dp[14]) +
- (vp[4 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
-
- private void compute_pcm_samples4(Obuffer buffer)
- {
- final float[] vp = actual_v;
-
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[4 + dvp] * dp[0]) +
- (vp[3 + dvp] * dp[1]) +
- (vp[2 + dvp] * dp[2]) +
- (vp[1 + dvp] * dp[3]) +
- (vp[0 + dvp] * dp[4]) +
- (vp[15 + dvp] * dp[5]) +
- (vp[14 + dvp] * dp[6]) +
- (vp[13 + dvp] * dp[7]) +
- (vp[12 + dvp] * dp[8]) +
- (vp[11 + dvp] * dp[9]) +
- (vp[10 + dvp] * dp[10]) +
- (vp[9 + dvp] * dp[11]) +
- (vp[8 + dvp] * dp[12]) +
- (vp[7 + dvp] * dp[13]) +
- (vp[6 + dvp] * dp[14]) +
- (vp[5 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
-
- private void compute_pcm_samples5(Obuffer buffer)
- {
- final float[] vp = actual_v;
-
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[5 + dvp] * dp[0]) +
- (vp[4 + dvp] * dp[1]) +
- (vp[3 + dvp] * dp[2]) +
- (vp[2 + dvp] * dp[3]) +
- (vp[1 + dvp] * dp[4]) +
- (vp[0 + dvp] * dp[5]) +
- (vp[15 + dvp] * dp[6]) +
- (vp[14 + dvp] * dp[7]) +
- (vp[13 + dvp] * dp[8]) +
- (vp[12 + dvp] * dp[9]) +
- (vp[11 + dvp] * dp[10]) +
- (vp[10 + dvp] * dp[11]) +
- (vp[9 + dvp] * dp[12]) +
- (vp[8 + dvp] * dp[13]) +
- (vp[7 + dvp] * dp[14]) +
- (vp[6 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
-
- private void compute_pcm_samples6(Obuffer buffer)
- {
- final float[] vp = actual_v;
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[6 + dvp] * dp[0]) +
- (vp[5 + dvp] * dp[1]) +
- (vp[4 + dvp] * dp[2]) +
- (vp[3 + dvp] * dp[3]) +
- (vp[2 + dvp] * dp[4]) +
- (vp[1 + dvp] * dp[5]) +
- (vp[0 + dvp] * dp[6]) +
- (vp[15 + dvp] * dp[7]) +
- (vp[14 + dvp] * dp[8]) +
- (vp[13 + dvp] * dp[9]) +
- (vp[12 + dvp] * dp[10]) +
- (vp[11 + dvp] * dp[11]) +
- (vp[10 + dvp] * dp[12]) +
- (vp[9 + dvp] * dp[13]) +
- (vp[8 + dvp] * dp[14]) +
- (vp[7 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
-
- private void compute_pcm_samples7(Obuffer buffer)
- {
- final float[] vp = actual_v;
-
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[7 + dvp] * dp[0]) +
- (vp[6 + dvp] * dp[1]) +
- (vp[5 + dvp] * dp[2]) +
- (vp[4 + dvp] * dp[3]) +
- (vp[3 + dvp] * dp[4]) +
- (vp[2 + dvp] * dp[5]) +
- (vp[1 + dvp] * dp[6]) +
- (vp[0 + dvp] * dp[7]) +
- (vp[15 + dvp] * dp[8]) +
- (vp[14 + dvp] * dp[9]) +
- (vp[13 + dvp] * dp[10]) +
- (vp[12 + dvp] * dp[11]) +
- (vp[11 + dvp] * dp[12]) +
- (vp[10 + dvp] * dp[13]) +
- (vp[9 + dvp] * dp[14]) +
- (vp[8 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
- private void compute_pcm_samples8(Obuffer buffer)
- {
- final float[] vp = actual_v;
-
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[8 + dvp] * dp[0]) +
- (vp[7 + dvp] * dp[1]) +
- (vp[6 + dvp] * dp[2]) +
- (vp[5 + dvp] * dp[3]) +
- (vp[4 + dvp] * dp[4]) +
- (vp[3 + dvp] * dp[5]) +
- (vp[2 + dvp] * dp[6]) +
- (vp[1 + dvp] * dp[7]) +
- (vp[0 + dvp] * dp[8]) +
- (vp[15 + dvp] * dp[9]) +
- (vp[14 + dvp] * dp[10]) +
- (vp[13 + dvp] * dp[11]) +
- (vp[12 + dvp] * dp[12]) +
- (vp[11 + dvp] * dp[13]) +
- (vp[10 + dvp] * dp[14]) +
- (vp[9 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
-
- private void compute_pcm_samples9(Obuffer buffer)
- {
- final float[] vp = actual_v;
-
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[9 + dvp] * dp[0]) +
- (vp[8 + dvp] * dp[1]) +
- (vp[7 + dvp] * dp[2]) +
- (vp[6 + dvp] * dp[3]) +
- (vp[5 + dvp] * dp[4]) +
- (vp[4 + dvp] * dp[5]) +
- (vp[3 + dvp] * dp[6]) +
- (vp[2 + dvp] * dp[7]) +
- (vp[1 + dvp] * dp[8]) +
- (vp[0 + dvp] * dp[9]) +
- (vp[15 + dvp] * dp[10]) +
- (vp[14 + dvp] * dp[11]) +
- (vp[13 + dvp] * dp[12]) +
- (vp[12 + dvp] * dp[13]) +
- (vp[11 + dvp] * dp[14]) +
- (vp[10 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
-
- private void compute_pcm_samples10(Obuffer buffer)
- {
- final float[] vp = actual_v;
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[10 + dvp] * dp[0]) +
- (vp[9 + dvp] * dp[1]) +
- (vp[8 + dvp] * dp[2]) +
- (vp[7 + dvp] * dp[3]) +
- (vp[6 + dvp] * dp[4]) +
- (vp[5 + dvp] * dp[5]) +
- (vp[4 + dvp] * dp[6]) +
- (vp[3 + dvp] * dp[7]) +
- (vp[2 + dvp] * dp[8]) +
- (vp[1 + dvp] * dp[9]) +
- (vp[0 + dvp] * dp[10]) +
- (vp[15 + dvp] * dp[11]) +
- (vp[14 + dvp] * dp[12]) +
- (vp[13 + dvp] * dp[13]) +
- (vp[12 + dvp] * dp[14]) +
- (vp[11 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
- private void compute_pcm_samples11(Obuffer buffer)
- {
- final float[] vp = actual_v;
-
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[11 + dvp] * dp[0]) +
- (vp[10 + dvp] * dp[1]) +
- (vp[9 + dvp] * dp[2]) +
- (vp[8 + dvp] * dp[3]) +
- (vp[7 + dvp] * dp[4]) +
- (vp[6 + dvp] * dp[5]) +
- (vp[5 + dvp] * dp[6]) +
- (vp[4 + dvp] * dp[7]) +
- (vp[3 + dvp] * dp[8]) +
- (vp[2 + dvp] * dp[9]) +
- (vp[1 + dvp] * dp[10]) +
- (vp[0 + dvp] * dp[11]) +
- (vp[15 + dvp] * dp[12]) +
- (vp[14 + dvp] * dp[13]) +
- (vp[13 + dvp] * dp[14]) +
- (vp[12 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
- private void compute_pcm_samples12(Obuffer buffer)
- {
- final float[] vp = actual_v;
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[12 + dvp] * dp[0]) +
- (vp[11 + dvp] * dp[1]) +
- (vp[10 + dvp] * dp[2]) +
- (vp[9 + dvp] * dp[3]) +
- (vp[8 + dvp] * dp[4]) +
- (vp[7 + dvp] * dp[5]) +
- (vp[6 + dvp] * dp[6]) +
- (vp[5 + dvp] * dp[7]) +
- (vp[4 + dvp] * dp[8]) +
- (vp[3 + dvp] * dp[9]) +
- (vp[2 + dvp] * dp[10]) +
- (vp[1 + dvp] * dp[11]) +
- (vp[0 + dvp] * dp[12]) +
- (vp[15 + dvp] * dp[13]) +
- (vp[14 + dvp] * dp[14]) +
- (vp[13 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
- private void compute_pcm_samples13(Obuffer buffer)
- {
- final float[] vp = actual_v;
-
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[13 + dvp] * dp[0]) +
- (vp[12 + dvp] * dp[1]) +
- (vp[11 + dvp] * dp[2]) +
- (vp[10 + dvp] * dp[3]) +
- (vp[9 + dvp] * dp[4]) +
- (vp[8 + dvp] * dp[5]) +
- (vp[7 + dvp] * dp[6]) +
- (vp[6 + dvp] * dp[7]) +
- (vp[5 + dvp] * dp[8]) +
- (vp[4 + dvp] * dp[9]) +
- (vp[3 + dvp] * dp[10]) +
- (vp[2 + dvp] * dp[11]) +
- (vp[1 + dvp] * dp[12]) +
- (vp[0 + dvp] * dp[13]) +
- (vp[15 + dvp] * dp[14]) +
- (vp[14 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
- private void compute_pcm_samples14(Obuffer buffer)
- {
- final float[] vp = actual_v;
-
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- final float[] dp = d16[i];
- float pcm_sample;
-
- pcm_sample = (float)(((vp[14 + dvp] * dp[0]) +
- (vp[13 + dvp] * dp[1]) +
- (vp[12 + dvp] * dp[2]) +
- (vp[11 + dvp] * dp[3]) +
- (vp[10 + dvp] * dp[4]) +
- (vp[9 + dvp] * dp[5]) +
- (vp[8 + dvp] * dp[6]) +
- (vp[7 + dvp] * dp[7]) +
- (vp[6 + dvp] * dp[8]) +
- (vp[5 + dvp] * dp[9]) +
- (vp[4 + dvp] * dp[10]) +
- (vp[3 + dvp] * dp[11]) +
- (vp[2 + dvp] * dp[12]) +
- (vp[1 + dvp] * dp[13]) +
- (vp[0 + dvp] * dp[14]) +
- (vp[15 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
-
- dvp += 16;
- } // for
- }
- private void compute_pcm_samples15(Obuffer buffer)
- {
- final float[] vp = actual_v;
-
- //int inc = v_inc;
- final float[] tmpOut = _tmpOut;
- int dvp =0;
-
- // fat chance of having this loop unroll
- for( int i=0; i<32; i++)
- {
- float pcm_sample;
- final float dp[] = d16[i];
- pcm_sample = (float)(((vp[15 + dvp] * dp[0]) +
- (vp[14 + dvp] * dp[1]) +
- (vp[13 + dvp] * dp[2]) +
- (vp[12 + dvp] * dp[3]) +
- (vp[11 + dvp] * dp[4]) +
- (vp[10 + dvp] * dp[5]) +
- (vp[9 + dvp] * dp[6]) +
- (vp[8 + dvp] * dp[7]) +
- (vp[7 + dvp] * dp[8]) +
- (vp[6 + dvp] * dp[9]) +
- (vp[5 + dvp] * dp[10]) +
- (vp[4 + dvp] * dp[11]) +
- (vp[3 + dvp] * dp[12]) +
- (vp[2 + dvp] * dp[13]) +
- (vp[1 + dvp] * dp[14]) +
- (vp[0 + dvp] * dp[15])
- ) * scalefactor);
-
- tmpOut[i] = pcm_sample;
- dvp += 16;
- } // for
- }
-
-private void compute_pcm_samples(Obuffer buffer)
-{
-
- switch (actual_write_pos)
- {
- case 0:
- compute_pcm_samples0(buffer);
- break;
- case 1:
- compute_pcm_samples1(buffer);
- break;
- case 2:
- compute_pcm_samples2(buffer);
- break;
- case 3:
- compute_pcm_samples3(buffer);
- break;
- case 4:
- compute_pcm_samples4(buffer);
- break;
- case 5:
- compute_pcm_samples5(buffer);
- break;
- case 6:
- compute_pcm_samples6(buffer);
- break;
- case 7:
- compute_pcm_samples7(buffer);
- break;
- case 8:
- compute_pcm_samples8(buffer);
- break;
- case 9:
- compute_pcm_samples9(buffer);
- break;
- case 10:
- compute_pcm_samples10(buffer);
- break;
- case 11:
- compute_pcm_samples11(buffer);
- break;
- case 12:
- compute_pcm_samples12(buffer);
- break;
- case 13:
- compute_pcm_samples13(buffer);
- break;
- case 14:
- compute_pcm_samples14(buffer);
- break;
- case 15:
- compute_pcm_samples15(buffer);
- break;
- }
-
- if (buffer!=null)
- {
- buffer.appendSamples(channel, _tmpOut);
- }
-
-/*
- // MDM: I was considering putting in quality control for
- // low-spec CPUs, but the performance gain (about 10-15%)
- // did not justify the considerable drop in audio quality.
- switch (inc)
- {
- case 16:
- buffer.appendSamples(channel, tmpOut);
- break;
- case 32:
- for (int i=0; i<16; i++)
- {
- buffer.append(channel, (short)tmpOut[i]);
- buffer.append(channel, (short)tmpOut[i]);
- }
- break;
- case 64:
- for (int i=0; i<8; i++)
- {
- buffer.append(channel, (short)tmpOut[i]);
- buffer.append(channel, (short)tmpOut[i]);
- buffer.append(channel, (short)tmpOut[i]);
- buffer.append(channel, (short)tmpOut[i]);
- }
- break;
-
- }
-*/
- }
-
- /**
- * Calculate 32 PCM samples and put the into the Obuffer-object.
- */
-
- public void calculate_pcm_samples(Obuffer buffer)
- {
- compute_new_v();
- compute_pcm_samples(buffer);
-
- actual_write_pos = (actual_write_pos + 1) & 0xf;
- actual_v = (actual_v == v1) ? v2 : v1;
-
- // initialize samples[]:
- //for (register float *floatp = samples + 32; floatp > samples; )
- // *--floatp = 0.0f;
-
- // MDM: this may not be necessary. The Layer III decoder always
- // outputs 32 subband samples, but I haven't checked layer I & II.
- for (int p=0;p<32;p++)
- samples[p] = 0.0f;
- }
-
-
- private static final double MY_PI = 3.14159265358979323846;
- private static final float cos1_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 64.0)));
- private static final float cos3_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 3.0 / 64.0)));
- private static final float cos5_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 5.0 / 64.0)));
- private static final float cos7_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 7.0 / 64.0)));
- private static final float cos9_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 9.0 / 64.0)));
- private static final float cos11_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 11.0 / 64.0)));
- private static final float cos13_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 13.0 / 64.0)));
- private static final float cos15_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 15.0 / 64.0)));
- private static final float cos17_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 17.0 / 64.0)));
- private static final float cos19_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 19.0 / 64.0)));
- private static final float cos21_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 21.0 / 64.0)));
- private static final float cos23_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 23.0 / 64.0)));
- private static final float cos25_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 25.0 / 64.0)));
- private static final float cos27_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 27.0 / 64.0)));
- private static final float cos29_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 29.0 / 64.0)));
- private static final float cos31_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 31.0 / 64.0)));
- private static final float cos1_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 32.0)));
- private static final float cos3_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 3.0 / 32.0)));
- private static final float cos5_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 5.0 / 32.0)));
- private static final float cos7_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 7.0 / 32.0)));
- private static final float cos9_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 9.0 / 32.0)));
- private static final float cos11_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 11.0 / 32.0)));
- private static final float cos13_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 13.0 / 32.0)));
- private static final float cos15_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 15.0 / 32.0)));
- private static final float cos1_16 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 16.0)));
- private static final float cos3_16 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 3.0 / 16.0)));
- private static final float cos5_16 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 5.0 / 16.0)));
- private static final float cos7_16 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 7.0 / 16.0)));
- private static final float cos1_8 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 8.0)));
- private static final float cos3_8 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 3.0 / 8.0)));
- private static final float cos1_4 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 4.0)));
-
- // Note: These values are not in the same order
- // as in Annex 3-B.3 of the ISO/IEC DIS 11172-3
- // private float d[] = {0.000000000, -4.000442505};
-
- private static float d[] = null;
-
- /**
- * d[] split into subarrays of length 16. This provides for
- * more faster access by allowing a block of 16 to be addressed
- * with constant offset.
- **/
- private static float d16[][] = null;
-
- /**
- * Loads the data for the d[] from the resource SFd.ser.
- * @return the loaded values for d[].
- */
- @SuppressWarnings("unchecked")
- static private float[] load_d()
- {
- try
- {
- Class elemType = Float.TYPE;
- Object o = JavaLayerUtils.deserializeArrayResource("sfd.ser", elemType, 512);
- return (float[])o;
- }
- catch (IOException ex)
- {
- throw new ExceptionInInitializerError(ex);
- }
- }
-
- /**
- * Converts a 1D array into a number of smaller arrays. This is used
- * to achieve offset + constant indexing into an array. Each sub-array
- * represents a block of values of the original array.
- * @param array The array to split up into blocks.
- * @param blockSize The size of the blocks to split the array
- * into. This must be an exact divisor of
- * the length of the array, or some data
- * will be lost from the main array.
- *
- * @return An array of arrays in which each element in the returned
- * array will be of length blockSize.
- */
- static private float[][] splitArray(final float[] array, final int blockSize)
- {
- int size = array.length / blockSize;
- float[][] split = new float[size][];
- for (int i=0; iAudioDevice interface provides an abstraction for
- * a device capable of sounding audio samples. Samples are written to
- * the device wia the write() method. The device assumes
- * that these samples are signed 16-bit samples taken at the output frequency
- * of the decoder. If the decoder outputs more than one channel, the samples for
- * each channel are assumed to appear consecutively, with the lower numbered
- * channels preceeding higher-numbered channels. E.g. if there are two
- * channels, the samples will appear in this order:
- *
- *
- * @since 0.0.8
- * @author Mat McGowan
- */
-public interface AudioDevice
-{
- /**
- * Prepares the AudioDevice for playback of audio samples.
- * @param decoder The decoder that will be providing the audio
- * samples.
- *
- * If the audio device is already open, this method returns silently.
- *
- */
- public void open(Decoder decoder) throws JavaLayerException;
-
- /**
- * Retrieves the open state of this audio device.
- *
- * @return
- *
- * l0, r0, l1, r1, l2, r2...
- *
- * where
- * lx indicates the xth sample on channel 0
- * rx indicates the xth sample on channel 1
- * true if this audio device is open and playing
- * audio samples, or false otherwise.
- */
- public boolean isOpen();
-
- /**
- * Writes a number of samples to this AudioDevice.
- *
- * @param samples The array of signed 16-bit samples to write
- * to the audio device.
- * @param offs The offset of the first sample.
- * @param len The number of samples to write.
- *
- * This method may return prior to the samples actually being played
- * by the audio device.
- */
- public void write(short[] samples, int offs, int len) throws JavaLayerException;
-
-
- /**
- * Closes this audio device. Any currently playing audio is stopped
- * as soon as possible. Any previously written audio data that has not been heard
- * is discarded.
- *
- * The implementation should ensure that any threads currently blocking
- * on the device (e.g. during a write or flush
- * operation should be unblocked by this method.
- */
- public void close();
-
-
- /**
- * Blocks until all audio samples previously written to this audio device have
- * been heard.
- */
- public void flush();
-
- /**
- * Retrieves the current playback position in milliseconds.
- */
- public int getPosition();
-}
diff --git a/src/javazoom/jl/player/AudioDeviceBase.java b/src/javazoom/jl/player/AudioDeviceBase.java
deleted file mode 100644
index 37860f4a3c3..00000000000
--- a/src/javazoom/jl/player/AudioDeviceBase.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 29/01/00 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.player;
-
-import javazoom.jl.decoder.Decoder;
-import javazoom.jl.decoder.JavaLayerException;
-
-/**
- * The AudioDeviceBase class provides a simple thread-safe
- * implementation of the AudioDevice interface.
- * Template methods are provided for subclasses to override and
- * in doing so provide the implementation for the main operations
- * of the AudioDevice interface.
- *
- * @since 0.0.8
- * @author Mat McGowan
- */
-/*
- * REVIEW: It is desirable to be able to use the decoder whe
- * in the implementation of open(), but the decoder
- * has not yet read a frame, and so much of the
- * desired information (sample rate, channels etc.)
- * are not available.
- */
-public abstract class AudioDeviceBase implements AudioDevice
-{
- private boolean open = false;
-
- private Decoder decoder = null;
-
- /**
- * Opens this audio device.
- *
- * @param decoder The decoder that will provide audio data
- * to this audio device.
- */
- public synchronized void open(Decoder decoder) throws JavaLayerException
- {
- if (!isOpen())
- {
- this.decoder = decoder;
- openImpl();
- setOpen(true);
- }
- }
-
- /**
- * Template method to provide the
- * implementation for the opening of the audio device.
- */
- protected void openImpl() throws JavaLayerException
- {
- }
-
- /**
- * Sets the open state for this audio device.
- */
- protected void setOpen(boolean open)
- {
- this.open = open;
- }
-
- /**
- * Determines if this audio device is open or not.
- *
- * @return true if the audio device is open,
- * false if it is not.
- */
- public synchronized boolean isOpen()
- {
- return open;
- }
-
- /**
- * Closes this audio device. If the device is currently playing
- * audio, playback is stopped immediately without flushing
- * any buffered audio data.
- */
- public synchronized void close()
- {
- if (isOpen())
- {
- closeImpl();
- setOpen(false);
- decoder = null;
- }
- }
-
- /**
- * Template method to provide the implementation for
- * closing the audio device.
- */
- protected void closeImpl()
- {
- }
-
- /**
- * Writes audio data to this audio device. Audio data is
- * assumed to be in the output format of the decoder. This
- * method may return before the data has actually been sounded
- * by the device if the device buffers audio samples.
- *
- * @param samples The samples to write to the audio device.
- * @param offs The offset into the array of the first sample to write.
- * @param len The number of samples from the array to write.
- * @throws JavaLayerException if the audio data could not be
- * written to the audio device.
- * If the audio device is not open, this method does nthing.
- */
- public void write(short[] samples, int offs, int len)
- throws JavaLayerException
- {
- if (isOpen())
- {
- writeImpl(samples, offs, len);
- }
- }
-
- /**
- * Template method to provide the implementation for
- * writing audio samples to the audio device.
- */
- protected void writeImpl(short[] samples, int offs, int len)
- throws JavaLayerException
- {
- }
-
- /**
- * Waits for any buffered audio samples to be played by the
- * audio device. This method should only be called prior
- * to closing the device.
- */
- public void flush()
- {
- if (isOpen())
- {
- flushImpl();
- }
- }
-
- /**
- * Template method to provide the implementation for
- * flushing any buffered audio data.
- */
- protected void flushImpl()
- {
- }
-
- /**
- * Retrieves the decoder that provides audio data to this
- * audio device.
- *
- * @return The associated decoder.
- */
- protected Decoder getDecoder()
- {
- return decoder;
- }
-}
diff --git a/src/javazoom/jl/player/AudioDeviceFactory.java b/src/javazoom/jl/player/AudioDeviceFactory.java
deleted file mode 100644
index 0bff24ffcb6..00000000000
--- a/src/javazoom/jl/player/AudioDeviceFactory.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 29/01/00 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.player;
-
-import javazoom.jl.decoder.JavaLayerException;
-
-/**
- * An AudioDeviceFactory class is responsible for creating
- * a specific AudioDevice implementation. A factory implementation
- * can be as simple or complex as desired and may support just one implementation
- * or may return several implementations depending upon the execution
- * environment.
- * AudioDevice.
- *
- * @return a new instance of a specific class of AudioDevice.
- * @throws JavaLayerException if an instance of AudioDevice could not
- * be created.
- */
- public abstract AudioDevice createAudioDevice() throws JavaLayerException;
-
- /**
- * Creates an instance of an AudioDevice implementation.
- * @param loader The ClassLoader to use to
- * load the named class, or null to use the
- * system class loader.
- * @param name The name of the class to load.
- * @return A newly-created instance of the audio device class.
- */
- @SuppressWarnings("unchecked")
- protected AudioDevice instantiate(ClassLoader loader, String name)
- throws ClassNotFoundException,
- IllegalAccessException,
- InstantiationException
- {
- AudioDevice dev = null;
-
- Class cls = null;
- if (loader==null)
- {
- cls = Class.forName(name);
- }
- else
- {
- cls = loader.loadClass(name);
- }
-
- Object o = cls.newInstance();
- dev = (AudioDevice)o;
-
- return dev;
- }
-}
diff --git a/src/javazoom/jl/player/FactoryRegistry.java b/src/javazoom/jl/player/FactoryRegistry.java
deleted file mode 100644
index 8e401f1bab4..00000000000
--- a/src/javazoom/jl/player/FactoryRegistry.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 29/01/00 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.player;
-
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-import javazoom.jl.decoder.JavaLayerException;
-
-/**
- * The FactoryRegistry class stores the factories
- * for all the audio device implementations available in the system.
- * AudioDeviceFactory instance
- * with this registry.
- */
- public void addFactory(AudioDeviceFactory factory)
- {
- factories.put(factory.getClass(), factory);
- }
-
- public void removeFactoryType(Class> cls)
- {
- factories.remove(cls);
- }
-
- public void removeFactory(AudioDeviceFactory factory)
- {
- factories.remove(factory.getClass());
- }
-
- public AudioDevice createAudioDevice() throws JavaLayerException
- {
- AudioDevice device = null;
- AudioDeviceFactory[] factories = getFactoriesPriority();
-
- if (factories==null)
- throw new JavaLayerException(this+": no factories registered");
-
- JavaLayerException lastEx = null;
- for (int i=0; (device==null) && (iJavaSoundAudioDevice implements an audio
- * device by using the JavaSound API.
- *
- * @since 0.0.8
- * @author Mat McGowan
- */
-public class JavaSoundAudioDevice extends AudioDeviceBase
-{
- private SourceDataLine source = null;
-
- private AudioFormat fmt = null;
-
- private byte[] byteBuf = new byte[4096];
-
- protected void setAudioFormat(AudioFormat fmt0)
- {
- fmt = fmt0;
- }
-
- protected AudioFormat getAudioFormat()
- {
- if (fmt==null)
- {
- Decoder decoder = getDecoder();
- fmt = new AudioFormat(decoder.getOutputFrequency(),
- 16,
- decoder.getOutputChannels(),
- true,
- false);
- }
- return fmt;
- }
-
- protected DataLine.Info getSourceLineInfo()
- {
- AudioFormat fmt = getAudioFormat();
- //DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt, 4000);
- DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt);
- return info;
- }
-
- public void open(AudioFormat fmt) throws JavaLayerException
- {
- if (!isOpen())
- {
- setAudioFormat(fmt);
- openImpl();
- setOpen(true);
- }
- }
-
- protected void openImpl()
- throws JavaLayerException
- {
- }
-
-
- // createSource fix.
- protected void createSource() throws JavaLayerException
- {
- Throwable t = null;
- try
- {
- Line line = AudioSystem.getLine(getSourceLineInfo());
- if (line instanceof SourceDataLine)
- {
- source = (SourceDataLine)line;
- //source.open(fmt, millisecondsToBytes(fmt, 2000));
- source.open(fmt);
- /*
- if (source.isControlSupported(FloatControl.Type.MASTER_GAIN))
- {
- FloatControl c = (FloatControl)source.getControl(FloatControl.Type.MASTER_GAIN);
- c.setValue(c.getMaximum());
- }*/
- source.start();
-
- }
- } catch (RuntimeException ex)
- {
- t = ex;
- }
- catch (LinkageError ex)
- {
- t = ex;
- }
- catch (LineUnavailableException ex)
- {
- t = ex;
- }
- if (source==null) throw new JavaLayerException("cannot obtain source audio line", t);
- }
-
- public int millisecondsToBytes(AudioFormat fmt, int time)
- {
- return (int)(time*(fmt.getSampleRate()*fmt.getChannels()*fmt.getSampleSizeInBits())/8000.0);
- }
-
- protected void closeImpl()
- {
- if (source!=null)
- {
- source.close();
- }
- }
-
- protected void writeImpl(short[] samples, int offs, int len)
- throws JavaLayerException
- {
- if (source==null)
- createSource();
-
- byte[] b = toByteArray(samples, offs, len);
- source.write(b, 0, len*2);
- }
-
- protected byte[] getByteArray(int length)
- {
- if (byteBuf.length < length)
- {
- byteBuf = new byte[length+1024];
- }
- return byteBuf;
- }
-
- protected byte[] toByteArray(short[] samples, int offs, int len)
- {
- byte[] b = getByteArray(len*2);
- int idx = 0;
- short s;
- while (len-- > 0)
- {
- s = samples[offs++];
- b[idx++] = (byte)s;
- b[idx++] = (byte)(s>>>8);
- }
- return b;
- }
-
- protected void flushImpl()
- {
- if (source!=null)
- {
- source.drain();
- }
- }
-
- public int getPosition()
- {
- int pos = 0;
- if (source!=null)
- {
- pos = (int)(source.getMicrosecondPosition()/1000);
- }
- return pos;
- }
-
- /**
- * Runs a short test by playing a short silent sound.
- */
- public void test()
- throws JavaLayerException
- {
- try
- {
- open(new AudioFormat(22050, 16, 1, true, false));
- short[] data = new short[22050/10];
- write(data, 0, data.length);
- flush();
- close();
- }
- catch (RuntimeException ex)
- {
- throw new JavaLayerException("Device test failed: "+ex);
- }
-
- }
-}
diff --git a/src/javazoom/jl/player/JavaSoundAudioDeviceFactory.java b/src/javazoom/jl/player/JavaSoundAudioDeviceFactory.java
deleted file mode 100644
index 55856629f35..00000000000
--- a/src/javazoom/jl/player/JavaSoundAudioDeviceFactory.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 29/01/00 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.player;
-
-import javazoom.jl.decoder.JavaLayerException;
-
-/**
- * This class is responsible for creating instances of the
- * JavaSoundAudioDevice. The audio device implementation is loaded
- * and tested dynamically as not all systems will have support
- * for JavaSound, or they may have the incorrect version.
- */
-public class JavaSoundAudioDeviceFactory extends AudioDeviceFactory
-{
- private boolean tested = false;
-
- static private final String DEVICE_CLASS_NAME = "javazoom.jl.player.JavaSoundAudioDevice";
-
- public synchronized AudioDevice createAudioDevice()
- throws JavaLayerException
- {
- if (!tested)
- {
- testAudioDevice();
- tested = true;
- }
-
- try
- {
- return createAudioDeviceImpl();
- }
- catch (Exception ex)
- {
- throw new JavaLayerException("unable to create JavaSound device: "+ex);
- }
- catch (LinkageError ex)
- {
- throw new JavaLayerException("unable to create JavaSound device: "+ex);
- }
- }
-
- protected JavaSoundAudioDevice createAudioDeviceImpl()
- throws JavaLayerException
- {
- ClassLoader loader = getClass().getClassLoader();
- try
- {
- JavaSoundAudioDevice dev = (JavaSoundAudioDevice)instantiate(loader, DEVICE_CLASS_NAME);
- return dev;
- }
- catch (Exception ex)
- {
- throw new JavaLayerException("Cannot create JavaSound device", ex);
- }
- catch (LinkageError ex)
- {
- throw new JavaLayerException("Cannot create JavaSound device", ex);
- }
-
- }
-
- public void testAudioDevice() throws JavaLayerException
- {
- JavaSoundAudioDevice dev = createAudioDeviceImpl();
- dev.test();
- }
-}
diff --git a/src/javazoom/jl/player/NullAudioDevice.java b/src/javazoom/jl/player/NullAudioDevice.java
deleted file mode 100644
index 77fd87b3a37..00000000000
--- a/src/javazoom/jl/player/NullAudioDevice.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 11/19/04 1.0 moved o LGPL.
- * 29/01/00 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.player;
-
-/**
- * The NullAudioDevice implements a silent, no-op
- * audio device. This is useful for testing purposes.
- *
- * @since 0.0.8
- * @author Mat McGowan
- */
-public class NullAudioDevice extends AudioDeviceBase
-{
-
- public int getPosition()
- {
- return 0;
- }
-}
diff --git a/src/javazoom/jl/player/Player.java b/src/javazoom/jl/player/Player.java
deleted file mode 100644
index c46a4efe761..00000000000
--- a/src/javazoom/jl/player/Player.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 29/01/00 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.player;
-
-import java.io.InputStream;
-
-import javazoom.jl.decoder.Bitstream;
-import javazoom.jl.decoder.BitstreamException;
-import javazoom.jl.decoder.Decoder;
-import javazoom.jl.decoder.Header;
-import javazoom.jl.decoder.JavaLayerException;
-import javazoom.jl.decoder.SampleBuffer;
-
-/**
- * The Player class implements a simple player for playback
- * of an MPEG audio stream.
- *
- * @author Mat McGowan
- * @since 0.0.8
- */
-
-// REVIEW: the audio device should not be opened until the
-// first MPEG audio frame has been decoded.
-public class Player
-{
- /**
- * The current frame number.
- */
- //private int frame = 0;
-
- /**
- * The MPEG audio bitstream.
- */
- // javac blank final bug.
- /*final*/ private Bitstream bitstream;
-
- /**
- * The MPEG audio decoder.
- */
- /*final*/ private Decoder decoder;
-
- /**
- * The AudioDevice the audio samples are written to.
- */
- private AudioDevice audio;
-
- /**
- * Has the player been closed?
- */
- private boolean closed = false;
-
- /**
- * Has the player played back all frames from the stream?
- */
- private boolean complete = false;
-
- private int lastPosition = 0;
-
- /**
- * Creates a new Player instance.
- */
- public Player(InputStream stream) throws JavaLayerException
- {
- this(stream, null);
- }
-
- public Player(InputStream stream, AudioDevice device) throws JavaLayerException
- {
- bitstream = new Bitstream(stream);
- decoder = new Decoder();
-
- if (device!=null)
- {
- audio = device;
- }
- else
- {
- FactoryRegistry r = FactoryRegistry.systemRegistry();
- audio = r.createAudioDevice();
- }
- audio.open(decoder);
- }
-
- public void play() throws JavaLayerException
- {
- play(Integer.MAX_VALUE);
- }
-
- /**
- * Plays a number of MPEG audio frames.
- *
- * @param frames The number of frames to play.
- * @return true if the last frame was played, or false if there are
- * more frames.
- */
- public boolean play(int frames) throws JavaLayerException
- {
- boolean ret = true;
-
- while (frames-- > 0 && ret)
- {
- ret = decodeFrame();
- }
-
- if (!ret)
- {
- // last frame, ensure all data flushed to the audio device.
- AudioDevice out = audio;
- if (out!=null)
- {
- out.flush();
- synchronized (this)
- {
- complete = (!closed);
- close();
- }
- }
- }
- return ret;
- }
-
- /**
- * Cloases this player. Any audio currently playing is stopped
- * immediately.
- */
- public synchronized void close()
- {
- AudioDevice out = audio;
- if (out!=null)
- {
- closed = true;
- audio = null;
- // this may fail, so ensure object state is set up before
- // calling this method.
- out.close();
- lastPosition = out.getPosition();
- try
- {
- bitstream.close();
- }
- catch (BitstreamException ex)
- {
- }
- }
- }
-
- /**
- * Returns the completed status of this player.
- *
- * @return true if all available MPEG audio frames have been
- * decoded, or false otherwise.
- */
- public synchronized boolean isComplete()
- {
- return complete;
- }
-
- /**
- * Retrieves the position in milliseconds of the current audio
- * sample being played. This method delegates to the
- * AudioDevice that is used by this player to sound
- * the decoded audio samples.
- */
- public int getPosition()
- {
- int position = lastPosition;
-
- AudioDevice out = audio;
- if (out!=null)
- {
- position = out.getPosition();
- }
- return position;
- }
-
- /**
- * Decodes a single frame.
- *
- * @return true if there are no more frames to decode, false otherwise.
- */
- protected boolean decodeFrame() throws JavaLayerException
- {
- try
- {
- AudioDevice out = audio;
- if (out==null)
- return false;
-
- Header h = bitstream.readFrame();
-
- if (h==null)
- return false;
-
- // sample buffer set when decoder constructed
- SampleBuffer output = (SampleBuffer)decoder.decodeFrame(h, bitstream);
-
- synchronized (this)
- {
- out = audio;
- if (out!=null)
- {
- out.write(output.getBuffer(), 0, output.getBufferLength());
- }
- }
-
- bitstream.closeFrame();
- }
- catch (RuntimeException ex)
- {
- throw new JavaLayerException("Exception decoding audio frame", ex);
- }
-/*
- catch (IOException ex)
- {
- System.out.println("exception decoding audio frame: "+ex);
- return false;
- }
- catch (BitstreamException bitex)
- {
- System.out.println("exception decoding audio frame: "+bitex);
- return false;
- }
- catch (DecoderException decex)
- {
- System.out.println("exception decoding audio frame: "+decex);
- return false;
- }
-*/
- return true;
- }
-
-
-}
diff --git a/src/javazoom/jl/player/PlayerApplet.java b/src/javazoom/jl/player/PlayerApplet.java
deleted file mode 100644
index bc66d3b8df7..00000000000
--- a/src/javazoom/jl/player/PlayerApplet.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- * 29/01/00 Initial version. mdm@techie.com
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.player;
-
-import java.applet.Applet;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import javazoom.jl.decoder.JavaLayerException;
-
-/**
- * A simple applet that plays an MPEG audio file.
- * The URL (relative to the document base)
- * is passed as the "audioURL" parameter.
- *
- * @author Mat McGowan
- * @since 0.0.8
- */
-public class PlayerApplet extends Applet implements Runnable
-{
- private static final long serialVersionUID = 713230088845043034L;
-
- static public final String AUDIO_PARAMETER = "audioURL";
-
- /**
- * The Player used to play the MPEG audio file.
- */
- private Player player = null;
-
- /**
- * The thread that runs the player.
- */
- private Thread playerThread = null;
-
- private String fileName = null;
-
-
- /**
- * Retrieves the AudioDevice instance that will
- * be used to sound the audio data.
- *
- * @return an audio device instance that will be used to
- * sound the audio stream.
- */
- protected AudioDevice getAudioDevice() throws JavaLayerException
- {
- return FactoryRegistry.systemRegistry().createAudioDevice();
- }
-
- /**
- * Retrieves the InputStream that provides the MPEG audio
- * stream data.
- *
- * @return an InputStream from which the MPEG audio data
- * is read, or null if an error occurs.
- */
- protected InputStream getAudioStream()
- {
- InputStream in = null;
-
- try
- {
- URL url = getAudioURL();
- if (url!=null)
- in = url.openStream();
- }
- catch (IOException ex)
- {
- System.err.println(ex);
- }
- return in;
- }
-
- protected String getAudioFileName()
- {
- String urlString = fileName;
- if (urlString==null)
- {
- urlString = getParameter(AUDIO_PARAMETER);
- }
- return urlString;
- }
-
- protected URL getAudioURL()
- {
- String urlString = getAudioFileName();
- URL url = null;
- if (urlString!=null)
- {
- try
- {
- url = new URL(getDocumentBase(), urlString);
- }
- catch (Exception ex)
- {
- System.err.println(ex);
- }
- }
- return url;
- }
-
- /**
- * Sets the URL of the audio stream to play.
- */
- public void setFileName(String name)
- {
- fileName = name;
- }
-
- public String getFileName()
- {
- return fileName;
- }
-
- /**
- * Stops the audio player. If the player is already stopped
- * this method is a no-op.
- */
- protected void stopPlayer() throws JavaLayerException
- {
- if (player!=null)
- {
- player.close();
- player = null;
- playerThread = null;
- }
- }
-
- /**
- * Decompresses audio data from an InputStream and plays it
- * back through an AudioDevice. The playback is run on a newly
- * created thread.
- *
- * @param in The InputStream that provides the MPEG audio data.
- * @param dev The AudioDevice to use to sound the decompressed data.
- *
- * @throws JavaLayerException if there was a problem decoding
- * or playing the audio data.
- */
- protected void play(InputStream in, AudioDevice dev) throws JavaLayerException
- {
- stopPlayer();
-
- if (in!=null && dev!=null)
- {
- player = new Player(in, dev);
- playerThread = createPlayerThread();
- playerThread.start();
- }
- }
-
- /**
- * Creates a new thread used to run the audio player.
- * @return A new Thread that, once started, runs the audio player.
- */
- protected Thread createPlayerThread()
- {
- return new Thread(this, "Audio player thread");
- }
-
- /**
- * Initializes this applet.
- */
- public void init()
- {
- }
-
- /**
- * Starts this applet. An input stream and audio device
- * are created and passed to the play() method.
- */
- public void start()
- {
- String name = getAudioFileName();
- try
- {
- InputStream in = getAudioStream();
- AudioDevice dev = getAudioDevice();
- play(in, dev);
- }
- catch (JavaLayerException ex)
- {
- synchronized (System.err)
- {
- System.err.println("Unable to play "+name);
- ex.printStackTrace(System.err);
- }
- }
- }
-
- /**
- * Stops this applet. If audio is currently playing, it is
- * stopped.
- */
- public void stop()
- {
- try
- {
- stopPlayer();
- }
- catch (JavaLayerException ex)
- {
- System.err.println(ex);
- }
- }
-
- public void destroy()
- {
- }
-
- /**
- * The run method for the audio player thread. Simply calls
- * play() on the player to play the entire stream.
- */
- public void run()
- {
- if (player!=null)
- {
- try
- {
- player.play();
- }
- catch (JavaLayerException ex)
- {
- System.err.println("Problem playing audio: "+ex);
- }
- }
- }
-}
diff --git a/src/javazoom/jl/player/advanced/AdvancedPlayer.java b/src/javazoom/jl/player/advanced/AdvancedPlayer.java
deleted file mode 100644
index a2725e3a3c5..00000000000
--- a/src/javazoom/jl/player/advanced/AdvancedPlayer.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.player.advanced;
-
-import java.io.InputStream;
-
-import javazoom.jl.decoder.Bitstream;
-import javazoom.jl.decoder.BitstreamException;
-import javazoom.jl.decoder.Decoder;
-import javazoom.jl.decoder.Header;
-import javazoom.jl.decoder.JavaLayerException;
-import javazoom.jl.decoder.SampleBuffer;
-import javazoom.jl.player.AudioDevice;
-import javazoom.jl.player.FactoryRegistry;
-
-/**
- * a hybrid of javazoom.jl.player.Player tweeked to include play(startFrame, endFrame)
- * hopefully this will be included in the api
- */
-public class AdvancedPlayer
-{
- /** The MPEG audio bitstream.*/
- private Bitstream bitstream;
- /** The MPEG audio decoder. */
- private Decoder decoder;
- /** The AudioDevice the audio samples are written to. */
- private AudioDevice audio;
- /** Has the player been closed? */
- //private boolean closed = false;
- /** Has the player played back all frames from the stream? */
-
- //private boolean complete = false;
-
- //private int lastPosition = 0;
- /** Listener for the playback process */
- private PlaybackListener listener;
-
- /**
- * Creates a new Player instance.
- */
- public AdvancedPlayer(InputStream stream) throws JavaLayerException
- {
- this(stream, null);
- }
-
- public AdvancedPlayer(InputStream stream, AudioDevice device) throws JavaLayerException
- {
- bitstream = new Bitstream(stream);
-
- if (device!=null) audio = device;
- else audio = FactoryRegistry.systemRegistry().createAudioDevice();
- audio.open(decoder = new Decoder());
- }
-
- public void play() throws JavaLayerException
- {
- play(Integer.MAX_VALUE);
- }
-
- /**
- * Plays a number of MPEG audio frames.
- *
- * @param frames The number of frames to play.
- * @return true if the last frame was played, or false if there are
- * more frames.
- */
- public boolean play(int frames) throws JavaLayerException
- {
- boolean ret = true;
-
- // report to listener
- if(listener != null) listener.playbackStarted(createEvent(PlaybackEvent.STARTED));
-
- while (frames-- > 0 && ret)
- {
- ret = decodeFrame();
- }
-
-// if (!ret)
- {
- // last frame, ensure all data flushed to the audio device.
- AudioDevice out = audio;
- if (out != null)
- {
-// System.out.println(audio.getPosition());
- out.flush();
-// System.out.println(audio.getPosition());
- synchronized (this)
- {
- //complete = (!closed);
- close();
- }
-
- // report to listener
- if(listener != null) listener.playbackFinished(createEvent(out, PlaybackEvent.STOPPED));
- }
- }
- return ret;
- }
-
- /**
- * Cloases this player. Any audio currently playing is stopped
- * immediately.
- */
- public synchronized void close()
- {
- AudioDevice out = audio;
- if (out != null)
- {
- //closed = true;
- audio = null;
- // this may fail, so ensure object state is set up before
- // calling this method.
- out.close();
- //lastPosition = out.getPosition();
- try
- {
- bitstream.close();
- }
- catch (BitstreamException ex)
- {}
- }
- }
-
- /**
- * Decodes a single frame.
- *
- * @return true if there are no more frames to decode, false otherwise.
- */
- protected boolean decodeFrame() throws JavaLayerException
- {
- try
- {
- AudioDevice out = audio;
- if (out == null) return false;
-
- Header h = bitstream.readFrame();
- if (h == null) return false;
-
- // sample buffer set when decoder constructed
- SampleBuffer output = (SampleBuffer) decoder.decodeFrame(h, bitstream);
-
- synchronized (this)
- {
- out = audio;
- if(out != null)
- {
- out.write(output.getBuffer(), 0, output.getBufferLength());
- }
- }
-
- bitstream.closeFrame();
- }
- catch (RuntimeException ex)
- {
- throw new JavaLayerException("Exception decoding audio frame", ex);
- }
- return true;
- }
-
- /**
- * skips over a single frame
- * @return false if there are no more frames to decode, true otherwise.
- */
- protected boolean skipFrame() throws JavaLayerException
- {
- Header h = bitstream.readFrame();
- if (h == null) return false;
- bitstream.closeFrame();
- return true;
- }
-
- /**
- * Plays a range of MPEG audio frames
- * @param start The first frame to play
- * @param end The last frame to play
- * @return true if the last frame was played, or false if there are more frames.
- */
- public boolean play(final int start, final int end) throws JavaLayerException
- {
- boolean ret = true;
- int offset = start;
- while (offset-- > 0 && ret) ret = skipFrame();
- return play(end - start);
- }
-
- /**
- * Constructs a PlaybackEvent
- */
- private PlaybackEvent createEvent(int id)
- {
- return createEvent(audio, id);
- }
-
- /**
- * Constructs a PlaybackEvent
- */
- private PlaybackEvent createEvent(AudioDevice dev, int id)
- {
- return new PlaybackEvent(this, id, dev.getPosition());
- }
-
- /**
- * sets the PlaybackListener
- */
- public void setPlayBackListener(PlaybackListener listener)
- {
- this.listener = listener;
- }
-
- /**
- * gets the PlaybackListener
- */
- public PlaybackListener getPlayBackListener()
- {
- return listener;
- }
-
- /**
- * closes the player and notifies PlaybackListener
- */
- public void stop()
- {
- listener.playbackFinished(createEvent(PlaybackEvent.STOPPED));
- close();
- }
-}
\ No newline at end of file
diff --git a/src/javazoom/jl/player/advanced/PlaybackEvent.java b/src/javazoom/jl/player/advanced/PlaybackEvent.java
deleted file mode 100644
index d46edcc3c40..00000000000
--- a/src/javazoom/jl/player/advanced/PlaybackEvent.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.player.advanced;
-
-/**
- * An event which indicates a Player has performed an 'playback action'
- * @author Paul Stanton (http://wanto.f2o.org/)
- */
-public class PlaybackEvent
-{
- public static int STOPPED = 1;
- public static int STARTED = 2;
-
- private AdvancedPlayer source;
- private int frame;
- private int id;
-
- public PlaybackEvent(AdvancedPlayer source, int id, int frame)
- {
- this.id = id;
- this.source = source;
- this.frame = frame;
- }
-
- public int getId(){return id;}
- public void setId(int id){this.id = id;}
-
- public int getFrame(){return frame;}
- public void setFrame(int frame){this.frame = frame;}
-
- public AdvancedPlayer getSource(){return source;}
- public void setSource(AdvancedPlayer source){this.source = source;}
-
-}
diff --git a/src/javazoom/jl/player/advanced/PlaybackListener.java b/src/javazoom/jl/player/advanced/PlaybackListener.java
deleted file mode 100644
index a0149bfd279..00000000000
--- a/src/javazoom/jl/player/advanced/PlaybackListener.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.player.advanced;
-
-/**
- * Listener for javalayer Player playback
- * @author Paul Stanton (http://wanto.f2o.org/)
- */
-public abstract class PlaybackListener
-{
- public void playbackStarted(PlaybackEvent evt){}
- public void playbackFinished(PlaybackEvent evt){}
-}
diff --git a/src/javazoom/jl/player/advanced/jlap.java b/src/javazoom/jl/player/advanced/jlap.java
deleted file mode 100644
index 1ec8db3b7ae..00000000000
--- a/src/javazoom/jl/player/advanced/jlap.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * 11/19/04 1.0 moved to LGPL.
- *-----------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Library General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *----------------------------------------------------------------------
- */
-
-package javazoom.jl.player.advanced;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import javazoom.jl.decoder.JavaLayerException;
-
-/**
- * This class implements a sample player using Playback listener.
- */
-public class jlap
-{
-
- public static void main(String[] args)
- {
- jlap test = new jlap();
- if (args.length != 1)
- {
- test.showUsage();
- System.exit(0);
- }
- else
- {
- try
- {
- test.play(args[0]);
- }
- catch (Exception ex)
- {
- System.err.println(ex.getMessage());
- System.exit(0);
- }
- }
- }
-
- public void play(String filename) throws JavaLayerException, IOException
- {
- InfoListener lst = new InfoListener();
- playMp3(new File(filename), lst);
- }
-
- public void showUsage()
- {
- System.out.println("Usage: jla jlp class implements a simple command-line
- * player for MPEG audio files.
- *
- * @author Mat McGowan (mdm@techie.com)
- */
-public class jlp
-{
- private String fFilename = null;
- private boolean remote = false;
-
- public static void main(String[] args)
- {
- int retval = 0;
- try
- {
- jlp player = createInstance(args);
- if (player!=null)
- player.play();
- }
- catch (Exception ex)
- {
- System.err.println(ex);
- ex.printStackTrace(System.err);
- retval = 1;
- }
- System.exit(retval);
- }
-
- static public jlp createInstance(String[] args)
- {
- jlp player = new jlp();
- if (!player.parseArgs(args))
- player = null;
- return player;
- }
-
- private jlp()
- {
- }
-
- public jlp(String filename)
- {
- init(filename);
- }
-
- protected void init(String filename)
- {
- fFilename = filename;
- }
-
- protected boolean parseArgs(String[] args)
- {
- boolean parsed = false;
- if (args.length == 1)
- {
- init(args[0]);
- parsed = true;
- remote = false;
- }
- else if (args.length == 2)
- {
- if (!(args[0].equals("-url")))
- {
- showUsage();
- }
- else
- {
- init(args[1]);
- parsed = true;
- remote = true;
- }
- }
- else
- {
- showUsage();
- }
- return parsed;
- }
-
- public void showUsage()
- {
- System.out.println("Usage: jlp [-url]
+ *
+ *
+ * public class ABean extends AbstractBean {
+ * private String foo;
+ *
+ * public void setFoo(String newFoo) {
+ * String old = getFoo();
+ * this.foo = newFoo;
+ * firePropertyChange("foo", old, getFoo());
+ * }
+ *
+ * public String getFoo() {
+ * return foo;
+ * }
+ * }
+ * AbstractBean also supports vetoable
+ * {@link PropertyChangeEvent} events. These events are similar to
+ * PropertyChange events, except a special exception can be used
+ * to veto changing the property. For example, perhaps the property is changing
+ * from "fred" to "red", but a listener deems that "red" is unexceptable. In
+ * this case, the listener can fire a veto exception and the property must
+ * remain "fred". For example:
+ *
+ *
+ *
+ *
+ * public class ABean extends AbstractBean {
+ * private String foo;
+ *
+ * public void setFoo(String newFoo) throws PropertyVetoException {
+ * String old = getFoo();
+ * this.foo = newFoo;
+ * fireVetoableChange("foo", old, getFoo());
+ * }
+ * public String getFoo() {
+ * return foo;
+ * }
+ * }
+ *
+ * public class Tester {
+ * public static void main(String... args) {
+ * try {
+ * ABean a = new ABean();
+ * a.setFoo("fred");
+ * a.addVetoableChangeListener(new VetoableChangeListener() {
+ * public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
+ * if ("red".equals(evt.getNewValue()) {
+ * throw new PropertyVetoException("Cannot be red!", evt);
+ * }
+ * }
+ * }
+ * a.setFoo("red");
+ * } catch (Exception e) {
+ * e.printStackTrace(); // this will be executed
+ * }
+ * }
+ * }
+ * listener is null, no exception is thrown and no action
+ * is taken.
+ *
+ * @param listener The PropertyChangeListener to be added
+ */
+ public final void addPropertyChangeListener(PropertyChangeListener listener) {
+ pcs.addPropertyChangeListener(listener);
+ }
+
+ /**
+ * Remove a PropertyChangeListener from the listener list.
+ * This removes a PropertyChangeListener that was registered
+ * for all properties.
+ * If listener was added more than once to the same event
+ * source, it will be notified one less time after being removed.
+ * If listener is null, or was never added, no exception is
+ * thrown and no action is taken.
+ *
+ * @param listener The PropertyChangeListener to be removed
+ */
+ public final void removePropertyChangeListener(PropertyChangeListener listener) {
+ pcs.removePropertyChangeListener(listener);
+ }
+
+ /**
+ * Returns an array of all the listeners that were added to the
+ * PropertyChangeSupport object with addPropertyChangeListener().
+ * PropertyChangeListenerProxys. If the calling
+ * method is interested in distinguishing the listeners then it must
+ * test each element to see if it's a
+ * PropertyChangeListenerProxy, perform the cast, and examine
+ * the parameter.
+ *
+ *
+ * PropertyChangeListener[] listeners = bean.getPropertyChangeListeners();
+ * for (int i = 0; i < listeners.length; i++) {
+ * if (listeners[i] instanceof PropertyChangeListenerProxy) {
+ * PropertyChangeListenerProxy proxy =
+ * (PropertyChangeListenerProxy)listeners[i];
+ * if (proxy.getPropertyName().equals("foo")) {
+ * // proxy is a PropertyChangeListener which was associated
+ * // with the property named "foo"
+ * }
+ * }
+ * }
+ *
+ *
+ * @see java.beans.PropertyChangeListenerProxy
+ * @return all of the PropertyChangeListeners added or an
+ * empty array if no listeners have been added
+ */
+ public final PropertyChangeListener[] getPropertyChangeListeners() {
+ return pcs.getPropertyChangeListeners();
+ }
+
+ /**
+ * Add a PropertyChangeListener for a specific property. The listener
+ * will be invoked only when a call on firePropertyChange names that
+ * specific property.
+ * The same listener object may be added more than once. For each
+ * property, the listener will be invoked the number of times it was added
+ * for that property.
+ * If propertyName or listener is null, no
+ * exception is thrown and no action is taken.
+ *
+ * @param propertyName The name of the property to listen on.
+ * @param listener The PropertyChangeListener to be added
+ */
+ public final void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
+ pcs.addPropertyChangeListener(propertyName, listener);
+ }
+
+ /**
+ * Remove a PropertyChangeListener for a specific property.
+ * If listener was added more than once to the same event
+ * source for the specified property, it will be notified one less time
+ * after being removed.
+ * If propertyName is null, no exception is thrown and no
+ * action is taken.
+ * If listener is null, or was never added for the specified
+ * property, no exception is thrown and no action is taken.
+ *
+ * @param propertyName The name of the property that was listened on.
+ * @param listener The PropertyChangeListener to be removed
+ */
+ public final void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
+ pcs.removePropertyChangeListener(propertyName, listener);
+ }
+
+ /**
+ * Returns an array of all the listeners which have been associated
+ * with the named property.
+ *
+ * @param propertyName The name of the property being listened to
+ * @return all of the PropertyChangeListeners associated with
+ * the named property. If no such listeners have been added,
+ * or if propertyName is null, an empty array is
+ * returned.
+ */
+ public final PropertyChangeListener[] getPropertyChangeListeners(String propertyName) {
+ return pcs.getPropertyChangeListeners(propertyName);
+ }
+
+ /**
+ * Report a bound property update to any registered listeners.
+ * No event is fired if old and new are equal and non-null.
+ *
+ * propertyName
+ * is null, only check for listeners registered on all properties.
+ *
+ * @param propertyName the property name.
+ * @return true if there are one or more listeners for the given property
+ */
+ protected final boolean hasPropertyChangeListeners(String propertyName) {
+ return pcs.hasListeners(propertyName);
+ }
+
+ /**
+ * Check if there are any listeners for a specific property, including
+ * those registered on all properties. If propertyName
+ * is null, only check for listeners registered on all properties.
+ *
+ * @param propertyName the property name.
+ * @return true if there are one or more listeners for the given property
+ */
+ protected final boolean hasVetoableChangeListeners(String propertyName) {
+ return vcs.hasListeners(propertyName);
+ }
+
+ /**
+ * Add a VetoableListener to the listener list.
+ * The listener is registered for all properties.
+ * The same listener object may be added more than once, and will be called
+ * as many times as it is added.
+ * If listener is null, no exception is thrown and no action
+ * is taken.
+ *
+ * @param listener The VetoableChangeListener to be added
+ */
+
+ public final void addVetoableChangeListener(VetoableChangeListener listener) {
+ vcs.addVetoableChangeListener(listener);
+ }
+
+ /**
+ * Remove a VetoableChangeListener from the listener list.
+ * This removes a VetoableChangeListener that was registered
+ * for all properties.
+ * If listener was added more than once to the same event
+ * source, it will be notified one less time after being removed.
+ * If listener is null, or was never added, no exception is
+ * thrown and no action is taken.
+ *
+ * @param listener The VetoableChangeListener to be removed
+ */
+ public final void removeVetoableChangeListener(VetoableChangeListener listener) {
+ vcs.removeVetoableChangeListener(listener);
+ }
+
+ /**
+ * Returns the list of VetoableChangeListeners. If named vetoable change listeners
+ * were added, then VetoableChangeListenerProxy wrappers will returned
+ * propertyName or listener is null, no
+ * exception is thrown and no action is taken.
+ *
+ * @param propertyName The name of the property to listen on.
+ * @param listener The VetoableChangeListener to be added
+ */
+
+ public final void addVetoableChangeListener(String propertyName,
+ VetoableChangeListener listener) {
+ vcs.addVetoableChangeListener(propertyName, listener);
+ }
+
+ /**
+ * Remove a VetoableChangeListener for a specific property.
+ * If listener was added more than once to the same event
+ * source for the specified property, it will be notified one less time
+ * after being removed.
+ * If propertyName is null, no exception is thrown and no
+ * action is taken.
+ * If listener is null, or was never added for the specified
+ * property, no exception is thrown and no action is taken.
+ *
+ * @param propertyName The name of the property that was listened on.
+ * @param listener The VetoableChangeListener to be removed
+ */
+
+ public final void removeVetoableChangeListener(String propertyName,
+ VetoableChangeListener listener) {
+ vcs.removeVetoableChangeListener(propertyName, listener);
+ }
+
+ /**
+ * Returns an array of all the listeners which have been associated
+ * with the named property.
+ *
+ * @param propertyName The name of the property being listened to
+ * @return all the VetoableChangeListeners associated with
+ * the named property. If no such listeners have been added,
+ * or if propertyName is null, an empty array is
+ * returned.
+ */
+ public final VetoableChangeListener[] getVetoableChangeListeners(String propertyName) {
+ return vcs.getVetoableChangeListeners(propertyName);
+ }
+
+ /**
+ * Report a vetoable property update to any registered listeners. If
+ * anyone vetos the change, then fire a new event reverting everyone to
+ * the old value and then rethrow the PropertyVetoException.
+ * getMultiSplitLayout.setModel(model)
+ *
+ * @param model the root of the MultiSplitLayout model
+ * @see #getMultiSplitLayout
+ * @see MultiSplitLayout#setModel
+ */
+ public final void setModel(Node model) {
+ getMultiSplitLayout().setModel(model);
+ }
+
+ /**
+ * A convenience method that sets the MultiSplitLayout dividerSize
+ * property. Equivalent to
+ * getMultiSplitLayout().setDividerSize(newDividerSize).
+ *
+ * @param dividerSize the value of the dividerSize property
+ * @see #getMultiSplitLayout
+ * @see MultiSplitLayout#setDividerSize
+ */
+ public final void setDividerSize(int dividerSize) {
+ getMultiSplitLayout().setDividerSize(dividerSize);
+ }
+
+ /**
+ * A convenience method that returns the MultiSplitLayout dividerSize
+ * property. Equivalent to
+ * getMultiSplitLayout().getDividerSize().
+ *
+ * @see #getMultiSplitLayout
+ * @see MultiSplitLayout#getDividerSize
+ */
+ public final int getDividerSize() {
+ return getMultiSplitLayout().getDividerSize();
+ }
+
+ /**
+ * Sets the value of the continuousLayout property.
+ * If true, then the layout is revalidated continuously while
+ * a divider is being moved. The default value of this property
+ * is true.
+ *
+ * @param continuousLayout value of the continuousLayout property
+ * @see #isContinuousLayout
+ */
+ public void setContinuousLayout(boolean continuousLayout) {
+ boolean oldContinuousLayout = isContinuousLayout();
+ this.continuousLayout = continuousLayout;
+ firePropertyChange("continuousLayout", oldContinuousLayout, isContinuousLayout());
+ }
+
+ /**
+ * Returns true if dragging a divider only updates
+ * the layout when the drag gesture ends (typically, when the
+ * mouse button is released).
+ *
+ * @return the value of the continuousLayout property
+ * @see #setContinuousLayout
+ */
+ public boolean isContinuousLayout() {
+ return continuousLayout;
+ }
+
+ /**
+ * Returns the Divider that's currently being moved, typically
+ * because the user is dragging it, or null.
+ *
+ * @return the Divider that's being moved or null.
+ */
+ public Divider activeDivider() {
+ return dragDivider;
+ }
+
+ /**
+ * Draws a single Divider. Typically used to specialize the
+ * way the active Divider is painted.
+ *
+ * @see #getDividerPainter
+ * @see #setDividerPainter
+ */
+ public static abstract class DividerPainter extends AbstractPainternull. We pass the delegate a copy of the
+ * Graphics object to protect the rest of the
+ * paint code from irrevocable changes
+ * (for example, Graphics.translate).
+ * Graphics. For example, you
+ * should not alter the clip Rectangle or modify the
+ * transform. If you need to do these operations you may find it
+ * easier to create a new Graphics from the passed in
+ * Graphics and manipulate it. Further, if you do not
+ * invoker super's implementation you must honor the opaque property,
+ * that is
+ * if this component is opaque, you must completely fill in the background
+ * in a non-opaque color. If you do not honor the opaque property you
+ * will likely see visual artifacts.
+ * Graphics object might
+ * have a transform other than the identify transform
+ * installed on it. In this case, you might get
+ * unexpected results if you cumulatively apply
+ * another transform.
+ *
+ * @param g the Graphics object to protect
+ * @see #paint(Graphics)
+ * @see javax.swing.plaf.ComponentUI
+ */
+ @Override
+ protected void paintComponent(Graphics g)
+ {
+ if (backgroundPainter != null) {
+ Graphics2D g2 = (Graphics2D)g.create();
+
+ try {
+ Insets ins = this.getInsets();
+ g2.translate(ins.left, ins.top);
+ backgroundPainter.paint(g2, this, this.getWidth() - ins.left
+ - ins.right, this.getHeight() - ins.top - ins.bottom);
+ } finally {
+ g2.dispose();
+ }
+ } else {
+ super.paintComponent(g);
+ }
+ }
+
+ /**
+ * Specifies a Painter to use to paint the background of this JXPanel.
+ * If p is not null, then setOpaque(false) will be called
+ * as a side effect. A component should not be opaque if painters are
+ * being used, because Painters may paint transparent pixels or not
+ * paint certain pixels, such as around the border insets.
+ */
+ public void setBackgroundPainter(Painter p)
+ {
+ Painter old = getBackgroundPainter();
+ this.backgroundPainter = p;
+
+ if (p != null) {
+ setOpaque(false);
+ }
+
+ firePropertyChange("backgroundPainter", old, getBackgroundPainter());
+ repaint();
+ }
+
+ public Painter getBackgroundPainter() {
+ return backgroundPainter;
+ }
+ /**
+ * Uses the DividerPainter (if any) to paint each Divider that
+ * overlaps the clip Rectangle. This is done after the call to
+ * super.paintChildren() so that Dividers can be
+ * rendered "on top of" the children.
+ *
+ * class MyMultiSplitPane extends JXMultiSplitPane
+ * {
+ * protected Dimension getMaxNodeSize( MultiSplitLayout msl, Node n )
+ * {
+ * if (( n instanceof Leaf ) && ((Leaf)n).getName().equals( "top" ))
+ * return msl.maximumNodeSize( n );
+ * return null;
+ * }
+ * }
+ *
+ * @param msl the MultiSplitLayout used by this pane
+ * @param n the node being resized
+ * @return the maximum size or null (by default) to ignore the maximum size.
+ */
+ protected Dimension getMaxNodeSize( MultiSplitLayout msl, Node n ) {
+ return null;
+ }
+
+ /**
+ * Set the minimum node size. This method can be overridden to limit the
+ * size of a node during a drag operation on a divider.
+ * @param msl the MultiSplitLayout used by this pane
+ * @param n the node being resized
+ * @return the maximum size or null (by default) to ignore the maximum size.
+ */
+ protected Dimension getMinNodeSize( MultiSplitLayout msl, Node n ) {
+ return msl.minimumNodeSize(n);
+ }
+
+ private void repaintDragLimits() {
+ Rectangle damageR = dragDivider.getBounds();
+ if (dragDivider.isVertical()) {
+ damageR.x = dragMin;
+ damageR.width = dragMax - dragMin;
+ }
+ else {
+ damageR.y = dragMin;
+ damageR.height = dragMax - dragMin;
+ }
+ repaint(damageR);
+ }
+
+ private void updateDrag(int mx, int my) {
+ if (!dragUnderway) {
+ return;
+ }
+ Rectangle oldBounds = dragDivider.getBounds();
+ Rectangle bounds = new Rectangle(oldBounds);
+ if (dragDivider.isVertical()) {
+ bounds.x = mx - dragOffsetX;
+ bounds.x = Math.max(bounds.x, dragMin );
+ bounds.x = Math.min(bounds.x, dragMax);
+ }
+ else {
+ bounds.y = my - dragOffsetY;
+ bounds.y = Math.max(bounds.y, dragMin );
+ bounds.y = Math.min(bounds.y, dragMax);
+ }
+ dragDivider.setBounds(bounds);
+ if (isContinuousLayout()) {
+ revalidate();
+ repaintDragLimits();
+ }
+ else {
+ repaint(oldBounds.union(bounds));
+ }
+ }
+
+ private void clearDragState() {
+ dragDivider = null;
+ initialDividerBounds = null;
+ oldFloatingDividers = true;
+ dragOffsetX = dragOffsetY = 0;
+ dragMin = dragMax = -1;
+ dragUnderway = false;
+ }
+
+ private void finishDrag(int x, int y) {
+ if (dragUnderway) {
+ clearDragState();
+ if (!isContinuousLayout()) {
+ revalidate();
+ repaint();
+ }
+ }
+ setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+ }
+
+ private void cancelDrag() {
+ if (dragUnderway) {
+ dragDivider.setBounds(initialDividerBounds);
+ getMultiSplitLayout().setFloatingDividers(oldFloatingDividers);
+ setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+ repaint();
+ revalidate();
+ clearDragState();
+ }
+ }
+
+ private void updateCursor(int x, int y, boolean show) {
+ if (dragUnderway) {
+ return;
+ }
+ int cursorID = Cursor.DEFAULT_CURSOR;
+ if (show) {
+ MultiSplitLayout.Divider divider = getMultiSplitLayout().dividerAt(x, y);
+ if (divider != null) {
+ cursorID = (divider.isVertical()) ?
+ Cursor.E_RESIZE_CURSOR :
+ Cursor.N_RESIZE_CURSOR;
+ }
+ }
+ setCursor(Cursor.getPredefinedCursor(cursorID));
+ }
+
+
+ private class InputHandler extends MouseInputAdapter implements KeyListener {
+
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ updateCursor(e.getX(), e.getY(), true);
+ }
+
+ @Override
+ public void mouseMoved(MouseEvent e) {
+ updateCursor(e.getX(), e.getY(), true);
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ updateCursor(e.getX(), e.getY(), false);
+ }
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ startDrag(e.getX(), e.getY());
+ }
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ finishDrag(e.getX(), e.getY());
+ }
+ @Override
+ public void mouseDragged(MouseEvent e) {
+ updateDrag(e.getX(), e.getY());
+ }
+ public void keyPressed(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
+ cancelDrag();
+ }
+ }
+ public void keyReleased(KeyEvent e) { }
+
+ public void keyTyped(KeyEvent e) { }
+ }
+
+ @Override
+ public AccessibleContext getAccessibleContext() {
+ if( accessibleContext == null ) {
+ accessibleContext = new AccessibleMultiSplitPane();
+ }
+ return accessibleContext;
+ }
+
+ protected class AccessibleMultiSplitPane extends AccessibleJPanel {
+ @Override
+ public AccessibleRole getAccessibleRole() {
+ return AccessibleRole.SPLIT_PANE;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/org/jdesktop/swingx/MultiSplitLayout.java b/src/org/jdesktop/swingx/MultiSplitLayout.java
index cf078ab6a1c..fba82d3b55e 100644
--- a/src/org/jdesktop/swingx/MultiSplitLayout.java
+++ b/src/org/jdesktop/swingx/MultiSplitLayout.java
@@ -1,5 +1,5 @@
/*
- * $Id: MultiSplitLayout.java,v 1.15 2005/10/26 14:29:54 hansmuller Exp $
+ * $Id: MultiSplitLayout.java 3471 2009-08-27 13:10:39Z kleopatra $
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
@@ -34,12 +34,14 @@ import java.io.Reader;
import java.io.StreamTokenizer;
import java.io.StringReader;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
+
import javax.swing.UIManager;
@@ -47,1312 +49,2167 @@ import javax.swing.UIManager;
* The MultiSplitLayout layout manager recursively arranges its
* components in row and column groups called "Splits". Elements of
* the layout are separated by gaps called "Dividers". The overall
- * layout is defined with a simple tree model whose nodes are
- * instances of MultiSplitLayout.Split, MultiSplitLayout.Divider,
- * and MultiSplitLayout.Leaf. Named Leaf nodes represent the space
+ * layout is defined with a simple tree model whose nodes are
+ * instances of MultiSplitLayout.Split, MultiSplitLayout.Divider,
+ * and MultiSplitLayout.Leaf. Named Leaf nodes represent the space
* allocated to a component that was added with a constraint that
* matches the Leaf's name. Extra space is distributed
* among row/column siblings according to their 0.0 to 1.0 weight.
* If no weights are specified then the last sibling always gets
* all of the extra space, or space reduction.
- *
+ *
* name should match the name property of the Leaf
+ * node that represents the bounds of child. After
+ * layoutContainer() recomputes the bounds of all of the nodes in
+ * the model, it will set this child's bounds to the bounds of the
+ * Leaf node with name. Note: if a component was already
+ * added with the same name, this method does not remove it from
+ * its parent.
+ *
+ * @param name identifies the Leaf node that defines the child's bounds
+ * @param child the component to be added
+ * @see #removeLayoutComponent
+ */
+ public void addLayoutComponent(String name, Component child) {
+ if (name == null) {
+ throw new IllegalArgumentException("name not specified");
+ }
+ childMap.put(name, child);
+ }
+
+ /**
+ * Removes the specified component from the layout.
+ *
+ * @param child the component to be removed
+ * @see #addLayoutComponent
+ */
+ public void removeLayoutComponent(Component child) {
+ String name = getNameForComponent( child );
+
+ if ( name != null ) {
+ childMap.remove( name );
+ }
+ }
+
+ /**
+ * Removes the specified node from the layout.
+ *
+ * @param name the name of the component to be removed
+ * @see #addLayoutComponent
+ */
+ public void removeLayoutNode(String name) {
+
+ if ( name != null ) {
+ Node n;
+ if ( !( model instanceof Split ))
+ n = model;
+ else
+ n = getNodeForName( name );
+
+ childMap.remove(name);
+
+ if ( n != null ) {
+ Split s = n.getParent();
+ s.remove( n );
+ if (removeDividers) {
+ while ( s.getChildren().size() < 2 ) {
+ Split p = s.getParent();
+ if ( p == null ) {
+ if ( s.getChildren().size() > 0 )
+ model = (Node)s.getChildren().get( 0 );
+ else
+ model = null;
+ return;
+ }
+ if ( s.getChildren().size() == 1 ) {
+ Node next = s.getChildren().get( 0 );
+ p.replace( s, next );
+ next.setParent( p );
+ }
+ else
+ p.remove( s );
+ s = p;
+ }
}
+ }
+ else {
+ childMap.remove( name );
+ }
}
- public PropertyChangeListener[] getPropertyChangeListeners() {
- return pcs.getPropertyChangeListeners();
- }
+ }
+
+ /**
+ * Show/Hide nodes. Any dividers that are no longer required due to one of the
+ * nodes being made visible/invisible are also shown/hidder. The visibility of
+ * the component managed by the node is also changed by this method
+ * @param name the node name
+ * @param visible the new node visible state
+ */
+ public void displayNode( String name, boolean visible )
+ {
+ Node node = getNodeForName( name );
+ if ( node != null ) {
+ Component comp = getComponentForNode( node );
+ comp.setVisible( visible );
+ node.setVisible( visible );
+
+ MultiSplitLayout.Split p = node.getParent();
+ if ( !visible ) {
+ p.hide( node );
+ if ( !p.isVisible())
+ p.getParent().hide( p );
- private void firePCS(String propertyName, Object oldValue, Object newValue) {
- if (!(oldValue != null && newValue != null && oldValue.equals(newValue))) {
- pcs.firePropertyChange(propertyName, oldValue, newValue);
+ p.checkDividers( p );
+ // If the split has become invisible then the parent may also have a
+ // divider that needs to be hidden.
+ while ( !p.isVisible()) {
+ p = p.getParent();
+ if ( p != null )
+ p.checkDividers( p );
+ else
+ break;
}
+ }
+ else
+ p.restoreDividers( p );
}
-
- /**
- * Return the root of the tree of Split, Leaf, and Divider nodes
- * that define this layout.
- *
- * @return the value of the model property
- * @see #setModel
- */
- public Node getModel() { return model; }
-
- /**
- * Set the root of the tree of Split, Leaf, and Divider nodes
- * that define this layout. The model can be a Split node
- * (the typical case) or a Leaf. The default value of this
- * property is a Leaf named "default".
- *
- * @param model the root of the tree of Split, Leaf, and Divider node
- * @throws IllegalArgumentException if model is a Divider or null
- * @see #getModel
- */
- public void setModel(Node model) {
- if ((model == null) || (model instanceof Divider)) {
- throw new IllegalArgumentException("invalid model");
- }
- Node oldModel = model;
- this.model = model;
- firePCS("model", oldModel, model);
+ setFloatingDividers( false );
+ }
+
+ private Component childForNode(Node node) {
+ if (node instanceof Leaf) {
+ Leaf leaf = (Leaf)node;
+ String name = leaf.getName();
+ return (name != null) ? childMap.get(name) : null;
}
+ return null;
+ }
+
+
+ private Dimension preferredComponentSize(Node node) {
+ if ( layoutMode == NO_MIN_SIZE_LAYOUT )
+ return new Dimension(0, 0);
- /**
- * Returns the width of Dividers in Split rows, and the height of
- * Dividers in Split columns.
- *
- * @return the value of the dividerSize property
- * @see #setDividerSize
- */
- public int getDividerSize() { return dividerSize; }
+ Component child = childForNode(node);
+ return ((child != null) && child.isVisible() ) ? child.getPreferredSize() : new Dimension(0, 0);
+ }
+
+ private Dimension minimumComponentSize(Node node) {
+ if ( layoutMode == NO_MIN_SIZE_LAYOUT )
+ return new Dimension(0, 0);
- /**
- * Sets the width of Dividers in Split rows, and the height of
- * Dividers in Split columns. The default value of this property
- * is the same as for JSplitPane Dividers.
- *
- * @param dividerSize the size of dividers (pixels)
- * @throws IllegalArgumentException if dividerSize < 0
- * @see #getDividerSize
- */
- public void setDividerSize(int dividerSize) {
- if (dividerSize < 0) {
- throw new IllegalArgumentException("invalid dividerSize");
- }
- int oldDividerSize = this.dividerSize;
- this.dividerSize = dividerSize;
- firePCS("dividerSize", oldDividerSize, dividerSize);
+ Component child = childForNode(node);
+ return ((child != null) && child.isVisible() ) ? child.getMinimumSize() : new Dimension(0, 0);
+ }
+
+ private Dimension preferredNodeSize(Node root) {
+ if (root instanceof Leaf) {
+ return preferredComponentSize(root);
}
-
- /**
- * @return the value of the floatingDividers property
- * @see #setFloatingDividers
- */
- public boolean getFloatingDividers() { return floatingDividers; }
-
-
- /**
- * If true, Leaf node bounds match the corresponding component's
- * preferred size and Splits/Dividers are resized accordingly.
- * If false then the Dividers define the bounds of the adjacent
- * Split and Leaf nodes. Typically this property is set to false
- * after the (MultiSplitPane) user has dragged a Divider.
- *
- * @see #getFloatingDividers
- */
- public void setFloatingDividers(boolean floatingDividers) {
- boolean oldFloatingDividers = this.floatingDividers;
- this.floatingDividers = floatingDividers;
- firePCS("floatingDividers", oldFloatingDividers, floatingDividers);
+ else if (root instanceof Divider) {
+ if ( !((Divider)root).isVisible())
+ return new Dimension(0,0);
+ int divSize = getDividerSize();
+ return new Dimension(divSize, divSize);
}
-
-
- /**
- * Add a component to this MultiSplitLayout. The
- * name should match the name property of the Leaf
- * node that represents the bounds of child. After
- * layoutContainer() recomputes the bounds of all of the nodes in
- * the model, it will set this child's bounds to the bounds of the
- * Leaf node with name. Note: if a component was already
- * added with the same name, this method does not remove it from
- * its parent.
- *
- * @param name identifies the Leaf node that defines the child's bounds
- * @param child the component to be added
- * @see #removeLayoutComponent
- */
- public void addLayoutComponent(String name, Component child) {
- if (name == null) {
- throw new IllegalArgumentException("name not specified");
- }
- childMap.put(name, child);
+ else {
+ Split split = (Split)root;
+ List
+ *
true if the node is visible,
+ * false otherwise
*/
- public void layoutContainer(Container parent) {
- checkLayout(getModel());
- Insets insets = parent.getInsets();
- Dimension size = parent.getSize();
- int width = size.width - (insets.left + insets.right);
- int height = size.height - (insets.top + insets.bottom);
- Rectangle bounds = new Rectangle(insets.left, insets.top, width, height);
- layout1(getModel(), bounds);
- layout2(getModel(), bounds);
+ public boolean isVisible() {
+ return isVisible;
+ }
+
+ /**
+ * Returns the Split parent of this Node, or null.
+ *
+ * @return the value of the parent property.
+ * @see #setParent
+ */
+ public Split getParent() { return parent; }
+
+ /**
+ * Set the value of this Node's parent property. The default
+ * value of this property is null.
+ *
+ * @param parent a Split or null
+ * @see #getParent
+ */
+ public void setParent(Split parent) {
+ this.parent = parent;
+ }
+
+ /**
+ * Returns the bounding Rectangle for this Node.
+ *
+ * @return the value of the bounds property.
+ * @see #setBounds
+ */
+ public Rectangle getBounds() {
+ return new Rectangle(this.bounds);
+ }
+
+ /**
+ * Set the bounding Rectangle for this node. The value of
+ * bounds may not be null. The default value of bounds
+ * is equal to new Rectangle(0,0,0,0).
+ *
+ * @param bounds the new value of the bounds property
+ * @throws IllegalArgumentException if bounds is null
+ * @see #getBounds
+ */
+ public void setBounds(Rectangle bounds) {
+ if (bounds == null) {
+ throw new IllegalArgumentException("null bounds");
+ }
+ this.bounds = new Rectangle(bounds);
+ }
+
+ /**
+ * Value between 0.0 and 1.0 used to compute how much space
+ * to add to this sibling when the layout grows or how
+ * much to reduce when the layout shrinks.
+ *
+ * @return the value of the weight property
+ * @see #setWeight
+ */
+ public double getWeight() { return weight; }
+
+ /**
+ * The weight property is a between 0.0 and 1.0 used to
+ * compute how much space to add to this sibling when the
+ * layout grows or how much to reduce when the layout shrinks.
+ * If rowLayout is true then this node's width grows
+ * or shrinks by (extraSpace * weight). If rowLayout is false,
+ * then the node's height is changed. The default value
+ * of weight is 0.0.
+ *
+ * @param weight a double between 0.0 and 1.0
+ * @see #getWeight
+ * @see MultiSplitLayout#layoutContainer
+ * @throws IllegalArgumentException if weight is not between 0.0 and 1.0
+ */
+ public void setWeight(double weight) {
+ if ((weight < 0.0)|| (weight > 1.0)) {
+ throw new IllegalArgumentException("invalid weight");
+ }
+ this.weight = weight;
+ }
+
+ private Node siblingAtOffset(int offset) {
+ Split p = getParent();
+ if (p == null) { return null; }
+ Listtrue if the node is visible,
+ * false otherwise
*/
- public Listnew Rectangle(0,0,0,0).
- *
- * @param bounds the new value of the bounds property
- * @throws IllegalArgumentException if bounds is null
- * @see #getBounds
- */
- public void setBounds(Rectangle bounds) {
- if (bounds == null) {
- throw new IllegalArgumentException("null bounds");
- }
- this.bounds = new Rectangle(bounds);
- }
-
- /**
- * Value between 0.0 and 1.0 used to compute how much space
- * to add to this sibling when the layout grows or how
- * much to reduce when the layout shrinks.
- *
- * @return the value of the weight property
- * @see #setWeight
- */
- public double getWeight() { return weight; }
-
- /**
- * The weight property is a between 0.0 and 1.0 used to
- * compute how much space to add to this sibling when the
- * layout grows or how much to reduce when the layout shrinks.
- * If rowLayout is true then this node's width grows
- * or shrinks by (extraSpace * weight). If rowLayout is false,
- * then the node's height is changed. The default value
- * of weight is 0.0.
- *
- * @param weight a double between 0.0 and 1.0
- * @see #getWeight
- * @see MultiSplitLayout#layoutContainer
- * @throws IllegalArgumentException if weight is not between 0.0 and 1.0
- */
- public void setWeight(double weight) {
- if ((weight < 0.0)|| (weight > 1.0)) {
- throw new IllegalArgumentException("invalid weight");
- }
- this.weight = weight;
- }
-
- private Node siblingAtOffset(int offset) {
- Split parent = getParent();
- if (parent == null) { return null; }
- List
- * (ROW (LEAF name=left) (LEAF name=right weight=1.0))
- *
- *
- *
- * (ROW left (LEAF name=right weight=1.0))
- *
- *
- *
- * (ROW (COLUMN weight=0.5 left.top left.bottom)
- * (LEAF name=middle)
- * (COLUMN weight=0.5 right.top right.bottom))
- *
- *
- *
- *
+ * (ROW (LEAF name=left) (LEAF name=right weight=1.0))
+ *
+ *
+ *
+ * (ROW left (LEAF name=right weight=1.0))
+ *
+ *
+ *
+ * (ROW (COLUMN weight=0.5 left.top left.bottom)
+ * (LEAF name=middle)
+ * (COLUMN weight=0.5 right.top right.bottom))
+ *
+ *
+ *
+ * getMultiSplitLayout.setModel(model)
- *
- * @param model the root of the MultiSplitLayout model
- * @see #getMultiSplitLayout
- * @see MultiSplitLayout#setModel
- */
- public final void setModel(Node model) {
- getMultiSplitLayout().setModel(model);
- }
-
- /**
- * A convenience method that sets the MultiSplitLayout dividerSize
- * property. Equivalent to
- * getMultiSplitLayout().setDividerSize(newDividerSize).
- *
- * @param dividerSize the value of the dividerSize property
- * @see #getMultiSplitLayout
- * @see MultiSplitLayout#setDividerSize
- */
- public final void setDividerSize(int dividerSize) {
- getMultiSplitLayout().setDividerSize(dividerSize);
- }
-
- /**
- * Sets the value of the continuousLayout property.
- * If true, then the layout is revalidated continuously while
- * a divider is being moved. The default value of this property
- * is true.
- *
- * @param continuousLayout value of the continuousLayout property
- * @see #isContinuousLayout
- */
- public void setContinuousLayout(boolean continuousLayout) {
- boolean oldContinuousLayout = continuousLayout;
- this.continuousLayout = continuousLayout;
- firePropertyChange("continuousLayout", oldContinuousLayout, continuousLayout);
- }
-
- /**
- * Returns true if dragging a divider only updates
- * the layout when the drag gesture ends (typically, when the
- * mouse button is released).
- *
- * @return the value of the continuousLayout property
- * @see #setContinuousLayout
- */
- public boolean isContinuousLayout() {
- return continuousLayout;
- }
-
- /**
- * Returns the Divider that's currently being moved, typically
- * because the user is dragging it, or null.
- *
- * @return the Divider that's being moved or null.
- */
- public Divider activeDivider() {
- return dragDivider;
- }
-
- /**
- * Draws a single Divider. Typically used to specialize the
- * way the active Divider is painted.
- *
- * @see #getDividerPainter
- * @see #setDividerPainter
- */
- public static abstract class DividerPainter {
- /**
- * Paint a single Divider.
- *
- * @param g the Graphics object to paint with
- * @param divider the Divider to paint
- */
- public abstract void paint(Graphics g, Divider divider);
- }
-
- private class DefaultDividerPainter extends DividerPainter {
- public void paint(Graphics g, Divider divider) {
- if ((divider == activeDivider()) && !isContinuousLayout()) {
- Graphics2D g2d = (Graphics2D)g;
- g2d.setColor(Color.black);
- g2d.fill(divider.getBounds());
- }
- }
- }
-
- /**
- * The DividerPainter that's used to paint Dividers on this MultiSplitPane.
- * This property may be null.
- *
- * @return the value of the dividerPainter Property
- * @see #setDividerPainter
- */
- public DividerPainter getDividerPainter() {
- return dividerPainter;
- }
-
- /**
- * Sets the DividerPainter that's used to paint Dividers on this
- * MultiSplitPane. The default DividerPainter only draws
- * the activeDivider (if there is one) and then, only if
- * continuousLayout is false. The value of this property is
- * used by the paintChildren method: Dividers are painted after
- * the MultiSplitPane's children have been rendered so that
- * the activeDivider can appear "on top of" the children.
- *
- * @param dividerPainter the value of the dividerPainter property, can be null
- * @see #paintChildren
- * @see #activeDivider
- */
- public void setDividerPainter(DividerPainter dividerPainter) {
- this.dividerPainter = dividerPainter;
- }
-
- /**
- * Uses the DividerPainter (if any) to paint each Divider that
- * overlaps the clip Rectangle. This is done after the call to
- * super.paintChildren() so that Dividers can be
- * rendered "on top of" the children.
- * GraphicsUtilities contains a set of tools to perform
+ * common graphics operations easily. These operations are divided into
+ * several themes, listed below.Compatible Images
+ *
+ * Creating Thumbnails
+ *
+ * drawImage() methods
+ * in {@link java.awt.Graphics}, which can be used for image scaling.Image Manipulation
+ *
+ * BufferedImage using the same color model
+ * as the image passed as a parameter. The returned image is only compatible
+ * with the image passed as a parameter. This does not mean the returned
+ * image is compatible with the hardware.BufferedImage, compatible with the color model
+ * of image
+ */
+ public static BufferedImage createColorModelCompatibleImage(BufferedImage image) {
+ ColorModel cm = image.getColorModel();
+ return new BufferedImage(cm,
+ cm.createCompatibleWritableRaster(image.getWidth(),
+ image.getHeight()),
+ cm.isAlphaPremultiplied(), null);
+ }
+
+ /**
+ * BufferedImage with the same
+ * dimension and transparency as image
+ */
+ public static BufferedImage createCompatibleImage(BufferedImage image) {
+ return createCompatibleImage(image, image.getWidth(), image.getHeight());
+ }
+
+ /**
+ * BufferedImage is compatible with
+ * the graphics hardware. If the method is called in a headless
+ * environment, then the returned BufferedImage will be compatible with
+ * the source image.BufferedImage with the same
+ * transparency as image and the specified dimension
+ */
+ public static BufferedImage createCompatibleImage(BufferedImage image,
+ int width, int height) {
+ return isHeadless() ?
+ new BufferedImage(width, height, image.getType()) :
+ getGraphicsConfiguration().createCompatibleImage(width, height,
+ image.getTransparency());
+ }
+
+ /**
+ * BufferedImage is compatible with
+ * the graphics hardware. If the method is called in a headless
+ * environment, then the returned BufferedImage will be compatible with
+ * the source image.BufferedImage of the
+ * specified width and height
+ */
+ public static BufferedImage createCompatibleImage(int width, int height) {
+ return isHeadless() ?
+ new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB) :
+ getGraphicsConfiguration().createCompatibleImage(width, height);
+ }
+
+ /**
+ * BufferedImage is compatible with
+ * the graphics hardware. If the method is called in a headless
+ * environment, then the returned BufferedImage will be compatible with
+ * the source image.BufferedImage of the
+ * specified width and height
+ */
+ public static BufferedImage createCompatibleTranslucentImage(int width,
+ int height) {
+ return isHeadless() ?
+ new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) :
+ getGraphicsConfiguration().createCompatibleImage(width, height,
+ Transparency.TRANSLUCENT);
+ }
+
+ /**
+ * BufferedImage of the
+ * specified width and height
+ * @throws java.io.IOException
+ * if the image cannot be read or loaded
+ */
+ public static BufferedImage loadCompatibleImage(InputStream in) throws IOException {
+ BufferedImage image = ImageIO.read(in);
+ if(image == null) return null;
+ return toCompatibleImage(image);
+ }
+
+ /**
+ * BufferedImage of the
+ * specified width and height
+ * @throws java.io.IOException if the image cannot be read or loaded
+ */
+ public static BufferedImage loadCompatibleImage(URL resource)
+ throws IOException {
+ BufferedImage image = ImageIO.read(resource);
+ return toCompatibleImage(image);
+ }
+
+ /**
+ * BufferedImage will be the source image.image
+ */
+ public static BufferedImage toCompatibleImage(BufferedImage image) {
+ if (isHeadless()) {
+ return image;
+ }
+
+ if (image.getColorModel().equals(
+ getGraphicsConfiguration().getColorModel())) {
+ return image;
+ }
+
+ BufferedImage compatibleImage =
+ getGraphicsConfiguration().createCompatibleImage(
+ image.getWidth(), image.getHeight(),
+ image.getTransparency());
+ Graphics g = compatibleImage.getGraphics();
+
+ try {
+ g.drawImage(image, 0, 0, null);
+ } finally {
+ g.dispose();
+ }
+
+ return compatibleImage;
+ }
+
+ /**
+ * newSize defines
+ * the length of the longest dimension of the thumbnail. The other
+ * dimension is then computed according to the dimensions ratio of the
+ * original picture.BufferedImage containing a
+ * thumbnail of image
+ * @throws IllegalArgumentException if newSize is larger than
+ * the largest dimension of image or <= 0
+ */
+ public static BufferedImage createThumbnailFast(BufferedImage image,
+ int newSize) {
+ float ratio;
+ int width = image.getWidth();
+ int height = image.getHeight();
+
+ if (width > height) {
+ if (newSize >= width) {
+ throw new IllegalArgumentException("newSize must be lower than" +
+ " the image width");
+ } else if (newSize <= 0) {
+ throw new IllegalArgumentException("newSize must" +
+ " be greater than 0");
+ }
+
+ ratio = (float) width / (float) height;
+ width = newSize;
+ height = (int) (newSize / ratio);
+ } else {
+ if (newSize >= height) {
+ throw new IllegalArgumentException("newSize must be lower than" +
+ " the image height");
+ } else if (newSize <= 0) {
+ throw new IllegalArgumentException("newSize must" +
+ " be greater than 0");
+ }
+
+ ratio = (float) height / (float) width;
+ height = newSize;
+ width = (int) (newSize / ratio);
+ }
+
+ BufferedImage temp = createCompatibleImage(image, width, height);
+ Graphics2D g2 = temp.createGraphics();
+
+ try {
+ g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ g2.drawImage(image, 0, 0, temp.getWidth(), temp.getHeight(), null);
+ } finally {
+ g2.dispose();
+ }
+
+ return temp;
+ }
+
+ /**
+ * BufferedImage containing a
+ * thumbnail of image
+ * @throws IllegalArgumentException if newWidth is larger than
+ * the width of image or if code>newHeight is larger
+ * than the height of image or if one of the dimensions
+ * is <= 0
+ */
+ public static BufferedImage createThumbnailFast(BufferedImage image,
+ int newWidth, int newHeight) {
+ if (newWidth >= image.getWidth() ||
+ newHeight >= image.getHeight()) {
+ throw new IllegalArgumentException("newWidth and newHeight cannot" +
+ " be greater than the image" +
+ " dimensions");
+ } else if (newWidth <= 0 || newHeight <= 0) {
+ throw new IllegalArgumentException("newWidth and newHeight must" +
+ " be greater than 0");
+ }
+
+ BufferedImage temp = createCompatibleImage(image, newWidth, newHeight);
+ Graphics2D g2 = temp.createGraphics();
+
+ try {
+ g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ g2.drawImage(image, 0, 0, temp.getWidth(), temp.getHeight(), null);
+ } finally {
+ g2.dispose();
+ }
+
+ return temp;
+ }
+
+ /**
+ * newSize defines
+ * the length of the longest dimension of the thumbnail. The other
+ * dimension is then computed according to the dimensions ratio of the
+ * original picture.BufferedImage containing a
+ * thumbnail of image
+ * @throws IllegalArgumentException if newSize is larger than
+ * the largest dimension of image or <= 0
+ */
+ public static BufferedImage createThumbnail(BufferedImage image,
+ int newSize) {
+ int width = image.getWidth();
+ int height = image.getHeight();
+
+ boolean isTranslucent = image.getTransparency() != Transparency.OPAQUE;
+ boolean isWidthGreater = width > height;
+
+ if (isWidthGreater) {
+ if (newSize >= width) {
+ throw new IllegalArgumentException("newSize must be lower than" +
+ " the image width");
+ }
+ } else if (newSize >= height) {
+ throw new IllegalArgumentException("newSize must be lower than" +
+ " the image height");
+ }
+
+ if (newSize <= 0) {
+ throw new IllegalArgumentException("newSize must" +
+ " be greater than 0");
+ }
+
+ float ratioWH = (float) width / (float) height;
+ float ratioHW = (float) height / (float) width;
+
+ BufferedImage thumb = image;
+ BufferedImage temp = null;
+
+ Graphics2D g2 = null;
+
+ try {
+ int previousWidth = width;
+ int previousHeight = height;
+
+ do {
+ if (isWidthGreater) {
+ width /= 2;
+ if (width < newSize) {
+ width = newSize;
+ }
+ height = (int) (width / ratioWH);
+ } else {
+ height /= 2;
+ if (height < newSize) {
+ height = newSize;
+ }
+ width = (int) (height / ratioHW);
+ }
+
+ if (temp == null || isTranslucent) {
+ if (g2 != null) {
+ //do not need to wrap with finally
+ //outer finally block will ensure
+ //that resources are properly reclaimed
+ g2.dispose();
+ }
+ temp = createCompatibleImage(image, width, height);
+ g2 = temp.createGraphics();
+ g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ }
+ g2.drawImage(thumb, 0, 0, width, height,
+ 0, 0, previousWidth, previousHeight, null);
+
+ previousWidth = width;
+ previousHeight = height;
+
+ thumb = temp;
+ } while (newSize != (isWidthGreater ? width : height));
+ } finally {
+ g2.dispose();
+ }
+
+ if (width != thumb.getWidth() || height != thumb.getHeight()) {
+ temp = createCompatibleImage(image, width, height);
+ g2 = temp.createGraphics();
+
+ try {
+ g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ g2.drawImage(thumb, 0, 0, width, height, 0, 0, width, height, null);
+ } finally {
+ g2.dispose();
+ }
+
+ thumb = temp;
+ }
+
+ return thumb;
+ }
+
+ /**
+ * BufferedImage containing a
+ * thumbnail of image
+ * @throws IllegalArgumentException if newWidth is larger than
+ * the width of image or if code>newHeight is larger
+ * than the height of image or if one the dimensions is not > 0
+ */
+ public static BufferedImage createThumbnail(BufferedImage image,
+ int newWidth, int newHeight) {
+ int width = image.getWidth();
+ int height = image.getHeight();
+
+ boolean isTranslucent = image.getTransparency() != Transparency.OPAQUE;
+
+ if (newWidth >= width || newHeight >= height) {
+ throw new IllegalArgumentException("newWidth and newHeight cannot" +
+ " be greater than the image" +
+ " dimensions");
+ } else if (newWidth <= 0 || newHeight <= 0) {
+ throw new IllegalArgumentException("newWidth and newHeight must" +
+ " be greater than 0");
+ }
+
+ BufferedImage thumb = image;
+ BufferedImage temp = null;
+
+ Graphics2D g2 = null;
+
+ try {
+ int previousWidth = width;
+ int previousHeight = height;
+
+ do {
+ if (width > newWidth) {
+ width /= 2;
+ if (width < newWidth) {
+ width = newWidth;
+ }
+ }
+
+ if (height > newHeight) {
+ height /= 2;
+ if (height < newHeight) {
+ height = newHeight;
+ }
+ }
+
+ if (temp == null || isTranslucent) {
+ if (g2 != null) {
+ //do not need to wrap with finally
+ //outer finally block will ensure
+ //that resources are properly reclaimed
+ g2.dispose();
+ }
+ temp = createCompatibleImage(image, width, height);
+ g2 = temp.createGraphics();
+ g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ }
+ g2.drawImage(thumb, 0, 0, width, height,
+ 0, 0, previousWidth, previousHeight, null);
+
+ previousWidth = width;
+ previousHeight = height;
+
+ thumb = temp;
+ } while (width != newWidth || height != newHeight);
+ } finally {
+ g2.dispose();
+ }
+
+ if (width != thumb.getWidth() || height != thumb.getHeight()) {
+ temp = createCompatibleImage(image, width, height);
+ g2 = temp.createGraphics();
+
+ try {
+ g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ g2.drawImage(thumb, 0, 0, width, height, 0, 0, width, height, null);
+ } finally {
+ g2.dispose();
+ }
+
+ thumb = temp;
+ }
+
+ return thumb;
+ }
+
+ /**
+ * BufferedImage. The pixels are grabbed from a rectangular
+ * area defined by a location and two dimensions. Calling this method on
+ * an image of type different from BufferedImage.TYPE_INT_ARGB
+ * and BufferedImage.TYPE_INT_RGB will unmanage the image.pixels if non-null, a new array of integers
+ * otherwise
+ * @throws IllegalArgumentException is pixels is non-null and
+ * of length < w*h
+ */
+ public static int[] getPixels(BufferedImage img,
+ int x, int y, int w, int h, int[] pixels) {
+ if (w == 0 || h == 0) {
+ return new int[0];
+ }
+
+ if (pixels == null) {
+ pixels = new int[w * h];
+ } else if (pixels.length < w * h) {
+ throw new IllegalArgumentException("pixels array must have a length" +
+ " >= w*h");
+ }
+
+ int imageType = img.getType();
+ if (imageType == BufferedImage.TYPE_INT_ARGB ||
+ imageType == BufferedImage.TYPE_INT_RGB) {
+ Raster raster = img.getRaster();
+ return (int[]) raster.getDataElements(x, y, w, h, pixels);
+ }
+
+ // Unmanages the image
+ return img.getRGB(x, y, w, h, pixels, 0, w);
+ }
+
+ /**
+ * BufferedImage. Calling this method on
+ * an image of type different from BufferedImage.TYPE_INT_ARGB
+ * and BufferedImage.TYPE_INT_RGB will unmanage the image.pixels is non-null and
+ * of length < w*h
+ */
+ public static void setPixels(BufferedImage img,
+ int x, int y, int w, int h, int[] pixels) {
+ if (pixels == null || w == 0 || h == 0) {
+ return;
+ } else if (pixels.length < w * h) {
+ throw new IllegalArgumentException("pixels array must have a length" +
+ " >= w*h");
+ }
+
+ int imageType = img.getType();
+ if (imageType == BufferedImage.TYPE_INT_ARGB ||
+ imageType == BufferedImage.TYPE_INT_RGB) {
+ WritableRaster raster = img.getRaster();
+ raster.setDataElements(x, y, w, h, pixels);
+ } else {
+ // Unmanages the image
+ img.setRGB(x, y, w, h, pixels, 0, w);
+ }
+ }
+
+ /**
+ * Sets the clip on a graphics object by merging a supplied clip with the
+ * existing one. The new clip will be an intersection of the old clip and
+ * the supplied clip. The old clip shape will be returned. This is useful
+ * for resetting the old clip after an operation is performed.
+ *
+ * @param g
+ * the graphics object to update
+ * @param clip
+ * a new clipping region to add to the graphics clip. This may
+ * return {@code null} if the current clip is {@code null}.
+ * @return the current clipping region of the supplied graphics object
+ * @throws NullPointerException
+ * if any parameter is {@code null}
+ */
+ public static Shape mergeClip(Graphics g, Shape clip) {
+ Shape oldClip = g.getClip();
+ if(oldClip == null) {
+ g.setClip(clip);
+ return null;
+ }
+ Area area = new Area(oldClip);
+ area.intersect(new Area(clip));//new Rectangle(0,0,width,height)));
+ g.setClip(area);
+ return oldClip;
+ }
+}
\ No newline at end of file
diff --git a/src/org/jdesktop/swingx/painter/AbstractPainter.java b/src/org/jdesktop/swingx/painter/AbstractPainter.java
new file mode 100644
index 00000000000..00552c42f95
--- /dev/null
+++ b/src/org/jdesktop/swingx/painter/AbstractPainter.java
@@ -0,0 +1,427 @@
+/*
+ * $Id$
+ *
+ * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
+ * Santa Clara, California 95054, U.S.A. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.jdesktop.swingx.painter;
+
+import java.awt.AlphaComposite;
+import java.awt.Composite;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.image.BufferedImage;
+import java.awt.image.BufferedImageOp;
+import java.lang.ref.SoftReference;
+
+import org.jdesktop.beans.AbstractBean;
+import org.jdesktop.swingx.graphics.GraphicsUtilities;
+
+/**
+ * AbstractPainter
+ * provides subclasses with the ability to cacheable painting operations, configure the
+ * drawing surface with common settings (such as antialiasing and interpolation), and
+ * toggle whether a subclass paints or not via the visibility property.AbstractPainter generally need only override the
+ * {@link #doPaint(Graphics2D, Object, int, int)} method. If a subclass requires more control
+ * over whether cacheing is enabled, or for configuring the graphics state, then it
+ * may override the appropriate protected methods to interpose its own behavior.Painter that
+ * paints an opaque rectangle:
+ *
+ * public void doPaint(Graphics2D g, T obj, int width, int height) {
+ * g.setPaint(Color.BLUE);
+ * g.fillRect(0, 0, width, height);
+ * }
+ * AbstractPainter can be cached as an image.
+ * If cacheing is enabled, then it is the responsibility of the developer to
+ * invalidate the painter (via {@link #clearCache}) if external state has
+ * changed in such a way that the painter is invalidated and needs to be
+ * repainted.AbstractPainter can be cached as an image.
+ * If true, this is treated as a hint. That is, a cacheable may or may not be used.
+ * The {@link #shouldUseCache} method actually determines whether the cacheable is used.
+ * However, if false, then this is treated as an absolute value. That is, no
+ * cacheable will be used.paint,
+ * the painting routines will be called.Painter subclasses a chance to see if any state
+ * in the given object has changed from the last paint operation. If it has, then
+ * the Painter has a chance to mark itself as dirty, thus causing a
+ * repaint, even if cached.Painter is dirty.
+ */
+ protected void setDirty(boolean d) {
+ boolean old = isDirty();
+ this.dirty = d;
+ firePropertyChange("dirty", old, isDirty());
+ if (isDirty()) {
+ clearCache();
+ }
+ }
+
+ /**
+ * Painter
+ * has intelligent rules regarding painting times, and can more accurately indicate
+ * whether it should be cached, it could implement that logic in this method.paint method prior to
+ * any drawing operations to configure the drawing surface. The default
+ * implementation sets the rendering hints that have been specified for
+ * this AbstractPainter.paint. It is used in situations where the developer can change
+ * the painting routine of a component without having to resort to subclassing
+ * the component.Painters are simply encapsulations of Java2D code and make
+ * it fairly trivial to reuse existing Painters or to combine
+ * them together. Implementations of this interface are also trivial to write,
+ * such that if you can't find a Painter that does what you need,
+ * you can write one with minimal effort. Writing a Painter requires
+ * knowledge of Java2D.Painter may be created with a type parameter. This type will be
+ * expected in the paint method. For example, you may wish to write a
+ * Painter that only works with subclasses of {@link java.awt.Component}.
+ * In that case, when the Painter is declared, you may declare that
+ * it requires a Component, allowing the paint method to be type safe. Ex:
+ *
+ * Painter<Component> p = new Painter<Component>() {
+ * public void paint(Graphics2D g, Component c, int width, int height) {
+ * g.setColor(c.getBackground());
+ * //and so forth
+ * }
+ * }
+ * Graphics2D, and are not
+ * required to restore that state upon completion. In most cases, it is recommended
+ * that the caller pass in a scratch graphics object. The Graphics2D
+ * must never be null.paint method,
+ * but may not be. For instance, setting the antialiasing rendering hint on the
+ * graphics may or may not be respected by the Painter implementation.Component. A Painter
+ * that expected it could then read state from that Component and
+ * use the state for painting. For example, an implementation may read the
+ * backgroundColor and use that.Painters ignore
+ * this parameter. They can thus be reused in any context. The object
+ * may be null. Implementations must not throw a NullPointerException if the object
+ * parameter is null.width and height arguments specify the
+ * width and height that the Painter should paint into. More
+ * specifically, the specified width and height instruct the painter that it should
+ * paint fully within this width and height. Any specified clip on the
+ * g param will further constrain the region.Painter implementation that draws
+ * a gradient. The gradient goes from white to black. It "stretches" to fill the
+ * painted region. Thus, if I use this Painter to paint a 500 x 500
+ * region, the far left would be black, the far right would be white, and a smooth
+ * gradient would be painted between. I could then, without modification, reuse the
+ * Painter to paint a region that is 20x20 in size. This region would
+ * also be black on the left, white on the right, and a smooth gradient painted
+ * between.