Fix line endings (CRLF -> LF)
[openjpeg.git] / wrapping / java / openjp2 / java-sources / org / openJpeg / OpenJPEGJavaEncoder.java
index 931105c1fc744dbeda37a97a1c4dbb6346763a9b..8df669aaef998ef0d769cc6a44a854fef38aac03 100644 (file)
-/*\r
- * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\r
- * Copyright (c) 2002-2014, Professor Benoit Macq\r
- * Copyright (c) 2002-2007, Patrick Piscaglia, Telemis s.a.\r
- * All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms, with or without\r
- * modification, are permitted provided that the following conditions\r
- * are met:\r
- * 1. Redistributions of source code must retain the above copyright\r
- *    notice, this list of conditions and the following disclaimer.\r
- * 2. Redistributions in binary form must reproduce the above copyright\r
- *    notice, this list of conditions and the following disclaimer in the\r
- *    documentation and/or other materials provided with the distribution.\r
- *\r
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
- * POSSIBILITY OF SUCH DAMAGE.\r
- */  \r
-package org.openJpeg;\r
-\r
-import java.io.File;\r
-import java.util.Vector;\r
-\r
-/** This class encodes one image into the J2K format, \r
- * using the OpenJPEG.org library.\r
- * To be able to log messages, the called must register a IJavaJ2KEncoderLogger object.\r
- */\r
-public class OpenJPEGJavaEncoder {\r
-\r
-       public interface IJavaJ2KEncoderLogger {\r
-               public void logEncoderMessage(String message);\r
-               public void logEncoderError(String message);\r
-       }\r
-       \r
-    private static boolean isInitialized = false;\r
-    \r
-       // ===== Compression parameters =============>\r
-       // These value may be changed for each image\r
-    private String[] encoder_arguments = null;\r
-       /** number of resolutions decompositions */\r
-       private int nbResolutions = -1;\r
-       /** the quality layers, expressed as compression rate */\r
-       private float[] ratioLayers = null;\r
-       /** the quality layers, expressed as PSNR values. This variable, if defined, has priority over the ratioLayers variable */\r
-       private float[] psnrLayers = null;\r
-       \r
-       /** Contains the 8 bpp version of the image. May NOT be filled together with image16 or image24.<P>\r
-        * We store the 8 or 16 bpp version of the original image while the encoder uses a 32 bpp version, because <UL>\r
-        * <LI> the storage capacity required is smaller\r
-        * <LI> the transfer Java --> C will be faster\r
-        * <LI> the conversion byte/short ==> int will be done faster by the C\r
-        * </UL>*/\r
-       private byte[] image8 = null;\r
-       /** Contains the 16 bpp version of the image. May NOT be filled together with image8 or image24*/\r
-       private short[] image16 = null;\r
-       /** Contains the 24 bpp version of the image. May NOT be filled together with image8 or image16 */\r
-       private int[] image24 = null;\r
-       /** Holds the result of the compression, i.e. the J2K compressed bytecode */\r
-    private byte compressedStream[] = null;\r
-    /** Holds the compressed stream length, which may be smaller than compressedStream.length if this byte[] is pre-allocated */\r
-    private long compressedStreamLength = -1;\r
-    /** Holds the compressed version of the index file, returned by the encoder */\r
-    private byte compressedIndex[] = null;\r
-    /** Width and Height of the image */\r
-    private int width = -1;\r
-    private int height = -1;\r
-    private int depth = -1;\r
-    /** Tile size. We suppose the same size for the horizontal and vertical tiles.\r
-     * If size == -1 ==> no tiling */\r
-    private int tileSize = -1;\r
-    // <===== Compression parameters =============\r
-    \r
-    private Vector<IJavaJ2KEncoderLogger> loggers = new Vector();\r
-\r
-    public OpenJPEGJavaEncoder(String openJPEGlibraryFullPathAndName, IJavaJ2KEncoderLogger messagesAndErrorsLogger) throws ExceptionInInitializerError\r
-    {\r
-       this(openJPEGlibraryFullPathAndName);\r
-       loggers.addElement(messagesAndErrorsLogger);\r
-    }\r
-\r
-    public OpenJPEGJavaEncoder(String openJPEGlibraryFullPathAndName) throws ExceptionInInitializerError\r
-    {\r
-       if (!isInitialized) {\r
-               try {\r
-                       String absolutePath = (new File(openJPEGlibraryFullPathAndName)).getCanonicalPath();\r
-                       System.load(absolutePath);\r
-                       isInitialized = true;\r
-               } catch (Throwable t) {\r
-                       t.printStackTrace();\r
-                       throw new ExceptionInInitializerError("OpenJPEG Java Encoder: probably impossible to find the C library");\r
-               }\r
-       }\r
-    }\r
-    \r
-    public void addLogger(IJavaJ2KEncoderLogger messagesAndErrorsLogger) {\r
-       loggers.addElement(messagesAndErrorsLogger);\r
-    }\r
-    \r
-    public void removeLogger(IJavaJ2KEncoderLogger messagesAndErrorsLogger) {\r
-       loggers.removeElement(messagesAndErrorsLogger);\r
-    }\r
-    \r
-    /** This method compresses the given image.<P>\r
-     * It returns the compressed J2K codestream into the compressedStream byte[].<P>\r
-     * It also returns the compression index as a compressed form, into the compressedIndex byte[].<P>\r
-     * One of the image8, image16 or image24 arrays must be correctly initialized and filled.<P>\r
-     * The width, height and depth variables must be correctly filled.<P>\r
-     * The nbResolutions, nbLayers and if needed the float[] psnrLayers or ratioLayers must also be filled before calling this method.\r
-     */\r
-    public void encodeImageToJ2K() {\r
-               // Need to allocate / reallocate the compressed stream buffer ? (size = max possible size = original image size)\r
-               if (compressedStream== null || (compressedStream.length != width*height*depth/8)) {\r
-                       logMessage("OpenJPEGJavaEncoder.encodeImageToJ2K: (re-)allocating " + (width*height*depth/8) + " bytes for the compressedStream");\r
-                       compressedStream = new byte[width*height*depth/8];\r
-               }\r
-               // Arguments = \r
-               // - number of resolutions "-n 5" : 2\r
-               // - size of tile "-t 512,512" : 2\r
-               // \r
-               // Image width, height, depth and pixels are directly fetched by C from the Java class\r
-               int nbArgs = 2 + (tileSize == -1 ? 0 : 2) + (encoder_arguments != null ? encoder_arguments.length : 0);\r
-               if (psnrLayers != null && psnrLayers.length>0 && psnrLayers[0] != 0)\r
-                       // If psnrLayers is defined and doesn't just express "lossless"\r
-                       nbArgs += 2;\r
-               else if (ratioLayers != null && ratioLayers.length>0 && ratioLayers[0]!=0.0)\r
-                       nbArgs += 2;\r
-               String[] arguments = new String[nbArgs];\r
-               int offset = 0;\r
-               arguments[offset] = "-n"; arguments[offset+1] = "" + nbResolutions; offset += 2;\r
-               if (tileSize!= -1) {\r
-                       arguments[offset++] = "-t"; \r
-                       arguments[offset++] = "" + tileSize + "," + tileSize;\r
-               }\r
-               // If PSNR layers are defined, use them to encode the images\r
-               if (psnrLayers != null && psnrLayers.length>0 && psnrLayers[0]!=-1) {\r
-                       arguments[offset++] = "-q";\r
-                       String s = "";\r
-                       for (int i=0; i<psnrLayers.length; i++)\r
-                               s += psnrLayers[i] + ",";\r
-                       arguments[offset++] = s.substring(0, s.length()-1);\r
-               } else if (ratioLayers != null && ratioLayers.length>0 && ratioLayers[0]!=0.0) {\r
-                       // Specify quality ratioLayers, as compression ratios\r
-                       arguments[offset++] = "-r";\r
-                       String s = "";\r
-                       for (int i=0; i<ratioLayers.length; i++)\r
-                               s += ratioLayers[i] + ",";\r
-                       arguments[offset++] = s.substring(0, s.length()-1);\r
-               }\r
-               if (encoder_arguments != null) {\r
-                       for (int i=0; i<encoder_arguments.length; i++) {\r
-                               arguments[i+offset] = encoder_arguments[i];\r
-                       }\r
-               }\r
-               logMessage("Encoder additional arguments = " + arrayToString(arguments));\r
-               long startTime = (new java.util.Date()).getTime();\r
-               compressedStreamLength = internalEncodeImageToJ2K(arguments);\r
-               logMessage("compression time = " + ((new java.util.Date()).getTime() - startTime) + " msec");\r
-    }\r
-    \r
-    /** \r
-     * Fills the compressedStream byte[] and the compressedIndex byte[]\r
-     * @return the codestream length.\r
-     */\r
-    private native long internalEncodeImageToJ2K(String[] parameters);\r
-\r
-    /** Image depth in bpp */\r
-       public int getDepth() {\r
-               return depth;\r
-       }\r
-\r
-    /** Image depth in bpp */\r
-       public void setDepth(int depth) {\r
-               this.depth = depth;\r
-       }\r
-\r
-       /** Image height in pixels  */\r
-       public int getHeight() {\r
-               return height;\r
-       }\r
-\r
-       /** Image height in pixels  */\r
-       public void setHeight(int height) {\r
-               this.height = height;\r
-       }\r
-\r
-       /** This method must be called in depth in [9,16].\r
-        * @param an array of shorts, containing width*height values\r
-        */\r
-       public void setImage16(short[] image16) {\r
-               this.image16 = image16;\r
-       }\r
-\r
-       /** This method must be called in depth in [17,24] for RGB images.\r
-        * @param an array of int, containing width*height values\r
-        */\r
-       public void setImage24(int[] image24) {\r
-               this.image24 = image24;\r
-       }\r
-\r
-       /** This method must be called in depth in [1,8].\r
-        * @param an array of bytes, containing width*height values\r
-        */\r
-       public void setImage8(byte[] image8) {\r
-               this.image8 = image8;\r
-       }\r
-\r
-       /** Return the ratioLayers, i.e. the compression ratio for each quality layer.\r
-        * If the last value is 0.0, last layer is lossless compressed.\r
-        */\r
-       public float[] getRatioLayers() {\r
-               return ratioLayers;\r
-       }\r
-\r
-       /**\r
-        * sets the quality layers.\r
-        * At least one level.\r
-        * Each level is expressed as a compression ratio (float).\r
-        * If the last value is 0.0, the last layer will be losslessly compressed\r
-        */\r
-       public void setRatioLayers(float[] layers) {\r
-               this.ratioLayers = layers;\r
-       }\r
-\r
-       /** Return the PSNR Layers, i.e. the target PSNR for each quality layer.\r
-        * If the last value is -1, last layer is lossless compressed.\r
-        */\r
-       public float[] getPsnrLayers() {\r
-               return psnrLayers;\r
-       }\r
-\r
-       /**\r
-        * sets the quality layers.\r
-        * At least one level.\r
-        * Each level is expressed as a target PSNR (float).\r
-        * If the last value is -1, the last layer will be losslessly compressed\r
-        */\r
-       public void setPsnrLayers(float[] layers) {\r
-               this.psnrLayers = layers;\r
-       }\r
-\r
-       /** Set the number of resolutions that must be created */\r
-       public void setNbResolutions(int nbResolutions) {\r
-               this.nbResolutions = nbResolutions;\r
-       }\r
-\r
-       public int getWidth() {\r
-               return width;\r
-       }\r
-\r
-       /** Width of the image, in pixels */\r
-       public void setWidth(int width) {\r
-               this.width = width;\r
-       }\r
-\r
-       /** Return the compressed index file.\r
-        * Syntax: TODO PP:\r
-        */\r
-       public byte[] getCompressedIndex() {\r
-               return compressedIndex;\r
-       }\r
-       \r
-       public void setCompressedIndex(byte[] index) {\r
-               compressedIndex = index;\r
-       }\r
-\r
-       public byte[] getCompressedStream() {\r
-               return compressedStream;\r
-       }\r
-\r
-       public void reset() {\r
-               nbResolutions = -1;\r
-               ratioLayers = null;\r
-               psnrLayers = null;\r
-               image8 = null;\r
-               image16 = null;\r
-               image24 = null;\r
-               compressedStream = null;\r
-           compressedIndex = null;\r
-           width = -1;\r
-           height = -1;\r
-           depth = -1;\r
-       }\r
-\r
-       public short[] getImage16() {\r
-               return image16;\r
-       }\r
-\r
-       public int[] getImage24() {\r
-               return image24;\r
-       }\r
-\r
-       public byte[] getImage8() {\r
-               return image8;\r
-       }\r
-       \r
-       /** Sets the size of the tiles. We assume square tiles */\r
-       public void setTileSize(int tileSize) {\r
-               this.tileSize = tileSize;\r
-       }\r
-       \r
-       /** Contains all the encoding arguments other than the input/output file, compression ratio, tile size */\r
-       public void setEncoderArguments(String[] argumentsForTheEncoder) {\r
-               encoder_arguments = argumentsForTheEncoder;\r
-       }\r
-\r
-       public void logMessage(String message) {\r
-               for (IJavaJ2KEncoderLogger logger:loggers)\r
-                       logger.logEncoderMessage(message);\r
-       }\r
-       \r
-       public void logError(String error) {\r
-               for (IJavaJ2KEncoderLogger logger:loggers)\r
-                       logger.logEncoderError(error);\r
-       }\r
-\r
-       public long getCompressedStreamLength() {\r
-               return compressedStreamLength;\r
-       }\r
-       \r
-       private String arrayToString(String[] array) {\r
-               if (array == null)\r
-                       return "NULL";\r
-               StringBuffer sb = new StringBuffer();\r
-               for (int i=0; i<array.length; i++)\r
-                       sb.append(array[i]).append(" ");\r
-               sb.delete(sb.length()-1, sb.length());\r
-               return sb.toString();\r
-       }\r
-}\r
+/*
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2002-2007, Patrick Piscaglia, Telemis s.a.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */  
+package org.openJpeg;
+
+import java.io.File;
+import java.util.Vector;
+
+/** This class encodes one image into the J2K format, 
+ * using the OpenJPEG.org library.
+ * To be able to log messages, the called must register a IJavaJ2KEncoderLogger object.
+ */
+public class OpenJPEGJavaEncoder {
+
+       public interface IJavaJ2KEncoderLogger {
+               public void logEncoderMessage(String message);
+               public void logEncoderError(String message);
+       }
+       
+    private static boolean isInitialized = false;
+    
+       // ===== Compression parameters =============>
+       // These value may be changed for each image
+    private String[] encoder_arguments = null;
+       /** number of resolutions decompositions */
+       private int nbResolutions = -1;
+       /** the quality layers, expressed as compression rate */
+       private float[] ratioLayers = null;
+       /** the quality layers, expressed as PSNR values. This variable, if defined, has priority over the ratioLayers variable */
+       private float[] psnrLayers = null;
+       
+       /** Contains the 8 bpp version of the image. May NOT be filled together with image16 or image24.<P>
+        * We store the 8 or 16 bpp version of the original image while the encoder uses a 32 bpp version, because <UL>
+        * <LI> the storage capacity required is smaller
+        * <LI> the transfer Java --> C will be faster
+        * <LI> the conversion byte/short ==> int will be done faster by the C
+        * </UL>*/
+       private byte[] image8 = null;
+       /** Contains the 16 bpp version of the image. May NOT be filled together with image8 or image24*/
+       private short[] image16 = null;
+       /** Contains the 24 bpp version of the image. May NOT be filled together with image8 or image16 */
+       private int[] image24 = null;
+       /** Holds the result of the compression, i.e. the J2K compressed bytecode */
+    private byte compressedStream[] = null;
+    /** Holds the compressed stream length, which may be smaller than compressedStream.length if this byte[] is pre-allocated */
+    private long compressedStreamLength = -1;
+    /** Holds the compressed version of the index file, returned by the encoder */
+    private byte compressedIndex[] = null;
+    /** Width and Height of the image */
+    private int width = -1;
+    private int height = -1;
+    private int depth = -1;
+    /** Tile size. We suppose the same size for the horizontal and vertical tiles.
+     * If size == -1 ==> no tiling */
+    private int tileSize = -1;
+    // <===== Compression parameters =============
+    
+    private Vector<IJavaJ2KEncoderLogger> loggers = new Vector();
+
+    public OpenJPEGJavaEncoder(String openJPEGlibraryFullPathAndName, IJavaJ2KEncoderLogger messagesAndErrorsLogger) throws ExceptionInInitializerError
+    {
+       this(openJPEGlibraryFullPathAndName);
+       loggers.addElement(messagesAndErrorsLogger);
+    }
+
+    public OpenJPEGJavaEncoder(String openJPEGlibraryFullPathAndName) throws ExceptionInInitializerError
+    {
+       if (!isInitialized) {
+               try {
+                       String absolutePath = (new File(openJPEGlibraryFullPathAndName)).getCanonicalPath();
+                       System.load(absolutePath);
+                       isInitialized = true;
+               } catch (Throwable t) {
+                       t.printStackTrace();
+                       throw new ExceptionInInitializerError("OpenJPEG Java Encoder: probably impossible to find the C library");
+               }
+       }
+    }
+    
+    public void addLogger(IJavaJ2KEncoderLogger messagesAndErrorsLogger) {
+       loggers.addElement(messagesAndErrorsLogger);
+    }
+    
+    public void removeLogger(IJavaJ2KEncoderLogger messagesAndErrorsLogger) {
+       loggers.removeElement(messagesAndErrorsLogger);
+    }
+    
+    /** This method compresses the given image.<P>
+     * It returns the compressed J2K codestream into the compressedStream byte[].<P>
+     * It also returns the compression index as a compressed form, into the compressedIndex byte[].<P>
+     * One of the image8, image16 or image24 arrays must be correctly initialized and filled.<P>
+     * The width, height and depth variables must be correctly filled.<P>
+     * The nbResolutions, nbLayers and if needed the float[] psnrLayers or ratioLayers must also be filled before calling this method.
+     */
+    public void encodeImageToJ2K() {
+               // Need to allocate / reallocate the compressed stream buffer ? (size = max possible size = original image size)
+               if (compressedStream== null || (compressedStream.length != width*height*depth/8)) {
+                       logMessage("OpenJPEGJavaEncoder.encodeImageToJ2K: (re-)allocating " + (width*height*depth/8) + " bytes for the compressedStream");
+                       compressedStream = new byte[width*height*depth/8];
+               }
+               // Arguments = 
+               // - number of resolutions "-n 5" : 2
+               // - size of tile "-t 512,512" : 2
+               // 
+               // Image width, height, depth and pixels are directly fetched by C from the Java class
+               int nbArgs = 2 + (tileSize == -1 ? 0 : 2) + (encoder_arguments != null ? encoder_arguments.length : 0);
+               if (psnrLayers != null && psnrLayers.length>0 && psnrLayers[0] != 0)
+                       // If psnrLayers is defined and doesn't just express "lossless"
+                       nbArgs += 2;
+               else if (ratioLayers != null && ratioLayers.length>0 && ratioLayers[0]!=0.0)
+                       nbArgs += 2;
+               String[] arguments = new String[nbArgs];
+               int offset = 0;
+               arguments[offset] = "-n"; arguments[offset+1] = "" + nbResolutions; offset += 2;
+               if (tileSize!= -1) {
+                       arguments[offset++] = "-t"; 
+                       arguments[offset++] = "" + tileSize + "," + tileSize;
+               }
+               // If PSNR layers are defined, use them to encode the images
+               if (psnrLayers != null && psnrLayers.length>0 && psnrLayers[0]!=-1) {
+                       arguments[offset++] = "-q";
+                       String s = "";
+                       for (int i=0; i<psnrLayers.length; i++)
+                               s += psnrLayers[i] + ",";
+                       arguments[offset++] = s.substring(0, s.length()-1);
+               } else if (ratioLayers != null && ratioLayers.length>0 && ratioLayers[0]!=0.0) {
+                       // Specify quality ratioLayers, as compression ratios
+                       arguments[offset++] = "-r";
+                       String s = "";
+                       for (int i=0; i<ratioLayers.length; i++)
+                               s += ratioLayers[i] + ",";
+                       arguments[offset++] = s.substring(0, s.length()-1);
+               }
+               if (encoder_arguments != null) {
+                       for (int i=0; i<encoder_arguments.length; i++) {
+                               arguments[i+offset] = encoder_arguments[i];
+                       }
+               }
+               logMessage("Encoder additional arguments = " + arrayToString(arguments));
+               long startTime = (new java.util.Date()).getTime();
+               compressedStreamLength = internalEncodeImageToJ2K(arguments);
+               logMessage("compression time = " + ((new java.util.Date()).getTime() - startTime) + " msec");
+    }
+    
+    /** 
+     * Fills the compressedStream byte[] and the compressedIndex byte[]
+     * @return the codestream length.
+     */
+    private native long internalEncodeImageToJ2K(String[] parameters);
+
+    /** Image depth in bpp */
+       public int getDepth() {
+               return depth;
+       }
+
+    /** Image depth in bpp */
+       public void setDepth(int depth) {
+               this.depth = depth;
+       }
+
+       /** Image height in pixels  */
+       public int getHeight() {
+               return height;
+       }
+
+       /** Image height in pixels  */
+       public void setHeight(int height) {
+               this.height = height;
+       }
+
+       /** This method must be called in depth in [9,16].
+        * @param an array of shorts, containing width*height values
+        */
+       public void setImage16(short[] image16) {
+               this.image16 = image16;
+       }
+
+       /** This method must be called in depth in [17,24] for RGB images.
+        * @param an array of int, containing width*height values
+        */
+       public void setImage24(int[] image24) {
+               this.image24 = image24;
+       }
+
+       /** This method must be called in depth in [1,8].
+        * @param an array of bytes, containing width*height values
+        */
+       public void setImage8(byte[] image8) {
+               this.image8 = image8;
+       }
+
+       /** Return the ratioLayers, i.e. the compression ratio for each quality layer.
+        * If the last value is 0.0, last layer is lossless compressed.
+        */
+       public float[] getRatioLayers() {
+               return ratioLayers;
+       }
+
+       /**
+        * sets the quality layers.
+        * At least one level.
+        * Each level is expressed as a compression ratio (float).
+        * If the last value is 0.0, the last layer will be losslessly compressed
+        */
+       public void setRatioLayers(float[] layers) {
+               this.ratioLayers = layers;
+       }
+
+       /** Return the PSNR Layers, i.e. the target PSNR for each quality layer.
+        * If the last value is -1, last layer is lossless compressed.
+        */
+       public float[] getPsnrLayers() {
+               return psnrLayers;
+       }
+
+       /**
+        * sets the quality layers.
+        * At least one level.
+        * Each level is expressed as a target PSNR (float).
+        * If the last value is -1, the last layer will be losslessly compressed
+        */
+       public void setPsnrLayers(float[] layers) {
+               this.psnrLayers = layers;
+       }
+
+       /** Set the number of resolutions that must be created */
+       public void setNbResolutions(int nbResolutions) {
+               this.nbResolutions = nbResolutions;
+       }
+
+       public int getWidth() {
+               return width;
+       }
+
+       /** Width of the image, in pixels */
+       public void setWidth(int width) {
+               this.width = width;
+       }
+
+       /** Return the compressed index file.
+        * Syntax: TODO PP:
+        */
+       public byte[] getCompressedIndex() {
+               return compressedIndex;
+       }
+       
+       public void setCompressedIndex(byte[] index) {
+               compressedIndex = index;
+       }
+
+       public byte[] getCompressedStream() {
+               return compressedStream;
+       }
+
+       public void reset() {
+               nbResolutions = -1;
+               ratioLayers = null;
+               psnrLayers = null;
+               image8 = null;
+               image16 = null;
+               image24 = null;
+               compressedStream = null;
+           compressedIndex = null;
+           width = -1;
+           height = -1;
+           depth = -1;
+       }
+
+       public short[] getImage16() {
+               return image16;
+       }
+
+       public int[] getImage24() {
+               return image24;
+       }
+
+       public byte[] getImage8() {
+               return image8;
+       }
+       
+       /** Sets the size of the tiles. We assume square tiles */
+       public void setTileSize(int tileSize) {
+               this.tileSize = tileSize;
+       }
+       
+       /** Contains all the encoding arguments other than the input/output file, compression ratio, tile size */
+       public void setEncoderArguments(String[] argumentsForTheEncoder) {
+               encoder_arguments = argumentsForTheEncoder;
+       }
+
+       public void logMessage(String message) {
+               for (IJavaJ2KEncoderLogger logger:loggers)
+                       logger.logEncoderMessage(message);
+       }
+       
+       public void logError(String error) {
+               for (IJavaJ2KEncoderLogger logger:loggers)
+                       logger.logEncoderError(error);
+       }
+
+       public long getCompressedStreamLength() {
+               return compressedStreamLength;
+       }
+       
+       private String arrayToString(String[] array) {
+               if (array == null)
+                       return "NULL";
+               StringBuffer sb = new StringBuffer();
+               for (int i=0; i<array.length; i++)
+                       sb.append(array[i]).append(" ");
+               sb.delete(sb.length()-1, sb.length());
+               return sb.toString();
+       }
+}