Fix line endings (CRLF -> LF)
[openjpeg.git] / wrapping / java / openjp2 / java-sources / org / openJpeg / OpenJPEGJavaDecoder.java
index 97008e3b5e96b7098bb2d708b3869ae4e7382c40..f104200041662a6df856f2b6d03d061d2adc1c1b 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.util.Vector;\r
-\r
-/** This class decodes one J2K codestream into an image (width + height + depth + pixels[], \r
- * using the OpenJPEG.org library.\r
- * To be able to log messages, the called must register a IJavaJ2KDecoderLogger object.\r
- */\r
-public class OpenJPEGJavaDecoder {\r
-\r
-       public interface IJavaJ2KDecoderLogger {\r
-               public void logDecoderMessage(String message);\r
-               public void logDecoderError(String message);\r
-       }\r
-       \r
-    private static boolean isInitialized = false;\r
-    \r
-       // ===== decompression parameters =============>\r
-       // These value may be changed for each image\r
-    private String[] decoder_arguments = null;\r
-       /** number of resolutions decompositions */\r
-       private int nbResolutions = -1;\r
-       /** the quality layers */\r
-       private int[] layers = null;\r
-\r
-       /** Contains the 8 bpp version of the image. May NOT be filled together with image16 or image24.<P>\r
-        * We store in Java the 8 or 16 bpp version of the image while the decoder 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 J2K compressed bytecode to decode */\r
-    private byte compressedStream[] = null;\r
-    /** Holds the compressed version of the index file, to be used by the decoder */\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
-    /** This parameter is never used in Java but is read by the C library to know the number of resolutions to skip when decoding, \r
-     * i.e. if there are 5 resolutions and skipped=1 ==> decode until resolution 4.  */\r
-    private int skippedResolutions = 0;\r
-    \r
-    private Vector<IJavaJ2KDecoderLogger> loggers = new Vector();\r
-\r
-\r
-    public OpenJPEGJavaDecoder(String openJPEGlibraryFullPathAndName, IJavaJ2KDecoderLogger messagesAndErrorsLogger) throws ExceptionInInitializerError\r
-    {\r
-       this(openJPEGlibraryFullPathAndName);\r
-       loggers.addElement(messagesAndErrorsLogger);\r
-    }\r
-\r
-    public OpenJPEGJavaDecoder(String openJPEGlibraryFullPathAndName) throws ExceptionInInitializerError\r
-    {\r
-       if (!isInitialized) {\r
-               try {\r
-                       System.load(openJPEGlibraryFullPathAndName);\r
-                       isInitialized = true;\r
-               } catch (Throwable t) {\r
-                       throw new ExceptionInInitializerError("OpenJPEG Java Decoder: probably impossible to find the C library");\r
-               }\r
-       }\r
-    }\r
-    \r
-    public void addLogger(IJavaJ2KDecoderLogger messagesAndErrorsLogger) {\r
-       loggers.addElement(messagesAndErrorsLogger);\r
-    }\r
-    \r
-    public void removeLogger(IJavaJ2KDecoderLogger messagesAndErrorsLogger) {\r
-       loggers.removeElement(messagesAndErrorsLogger);\r
-    }\r
-    \r
-    public int  decodeJ2KtoImage() {\r
-               if ((image16 == null || (image16 != null && image16.length != width*height)) && (depth==-1 || depth==16)) {\r
-                       image16 = new short[width*height];\r
-                       logMessage("OpenJPEGJavaDecoder.decompressImage: image16 length = " + image16.length + " (" + width + " x " + height + ") ");\r
-               }\r
-               if ((image8 == null || (image8 != null && image8.length != width*height)) && (depth==-1 || depth==8)) {\r
-                       image8 = new byte[width*height];\r
-                       logMessage("OpenJPEGJavaDecoder.decompressImage: image8 length = " + image8.length + " (" + width + " x " + height + ") ");\r
-               }\r
-               if ((image24 == null || (image24 != null && image24.length != width*height)) && (depth==-1 || depth==24)) {\r
-                       image24 = new int[width*height];\r
-                       logMessage("OpenJPEGJavaDecoder.decompressImage: image24 length = " + image24.length + " (" + width + " x " + height + ") ");\r
-               }\r
-               \r
-               String[] arguments = new String[0 + (decoder_arguments != null ? decoder_arguments.length : 0)];\r
-               int offset = 0;\r
-               if (decoder_arguments != null) {\r
-                       for (int i=0; i<decoder_arguments.length; i++) {\r
-                               arguments[i+offset] = decoder_arguments[i];\r
-                       }\r
-               }\r
-\r
-               return internalDecodeJ2KtoImage(arguments);\r
-    }\r
-    \r
-    /** \r
-     * Decode the j2k stream given in the codestream byte[] and fills the image8, image16 or image24 array, according to the bit depth.\r
-     */\r
-    private native int internalDecodeJ2KtoImage(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
-       /** Number of resolutions contained in the image */\r
-       public int getNbResolutions() {\r
-               return nbResolutions;\r
-       }\r
-\r
-       /** Number of resolutions contained in the image */\r
-       public void setNbResolutions(int nbResolutions) {\r
-               this.nbResolutions = nbResolutions;\r
-       }\r
-\r
-       /** Width of the image in pixels */\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
-       /** Contains the decompressed version of the image, if the depth in is [9,16] bpp.\r
-        * Returns NULL otherwise.\r
-        */\r
-       public short[] getImage16() {\r
-               return image16;\r
-       }\r
-\r
-       /** Contains the decompressed version of the image, if the depth in is [17,24] bpp and the image is in color.\r
-        * Returns NULL otherwise.\r
-        */\r
-       public int[] getImage24() {\r
-               return image24;\r
-       }\r
-\r
-       /** Contains the decompressed version of the image, if the depth in is [1,8] bpp.\r
-        * Returns NULL otherwise.\r
-        */\r
-       public byte[] getImage8() {\r
-               return image8;\r
-       }\r
-\r
-       /** Sets the compressed version of the index file for this image.\r
-        * This index file is used by the decompressor\r
-        */\r
-       public void setCompressedIndex(byte[] compressedIndex) {\r
-               this.compressedIndex = compressedIndex;\r
-       }\r
-\r
-       /** Sets the codestream to be decoded */\r
-       public void setCompressedStream(byte[] compressedStream) {\r
-               this.compressedStream = compressedStream;\r
-       }\r
-\r
-       /** @return the compressed code stream length, or -1 if not defined */\r
-       public long getCodestreamLength() {\r
-               if (compressedStream == null)\r
-                       return -1;\r
-               else return compressedStream.length;\r
-       }\r
-       \r
-       /** This method is called either directly or by the C methods */\r
-       public void logMessage(String message) {\r
-               for (IJavaJ2KDecoderLogger logger:loggers)\r
-                       logger.logDecoderMessage(message);\r
-       }\r
-       \r
-       /** This method is called either directly or by the C methods */\r
-       public void logError(String error) {\r
-               for (IJavaJ2KDecoderLogger logger:loggers)\r
-                       logger.logDecoderError(error);\r
-       }\r
-\r
-       public void reset() {\r
-               nbResolutions = -1;\r
-               layers = 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 void setSkippedResolutions(int numberOfSkippedResolutions) {\r
-               skippedResolutions = numberOfSkippedResolutions;\r
-       }\r
-\r
-       /** Contains all the decoding arguments other than the input/output file */\r
-       public void setDecoderArguments(String[] argumentsForTheDecoder) {\r
-               decoder_arguments = argumentsForTheDecoder;\r
-       }\r
-\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.util.Vector;
+
+/** This class decodes one J2K codestream into an image (width + height + depth + pixels[], 
+ * using the OpenJPEG.org library.
+ * To be able to log messages, the called must register a IJavaJ2KDecoderLogger object.
+ */
+public class OpenJPEGJavaDecoder {
+
+       public interface IJavaJ2KDecoderLogger {
+               public void logDecoderMessage(String message);
+               public void logDecoderError(String message);
+       }
+       
+    private static boolean isInitialized = false;
+    
+       // ===== decompression parameters =============>
+       // These value may be changed for each image
+    private String[] decoder_arguments = null;
+       /** number of resolutions decompositions */
+       private int nbResolutions = -1;
+       /** the quality layers */
+       private int[] layers = null;
+
+       /** Contains the 8 bpp version of the image. May NOT be filled together with image16 or image24.<P>
+        * We store in Java the 8 or 16 bpp version of the image while the decoder 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 J2K compressed bytecode to decode */
+    private byte compressedStream[] = null;
+    /** Holds the compressed version of the index file, to be used by the decoder */
+    private byte compressedIndex[] = null;
+    /** Width and Height of the image */
+    private int width = -1;
+    private int height = -1;
+    private int depth = -1;
+    /** This parameter is never used in Java but is read by the C library to know the number of resolutions to skip when decoding, 
+     * i.e. if there are 5 resolutions and skipped=1 ==> decode until resolution 4.  */
+    private int skippedResolutions = 0;
+    
+    private Vector<IJavaJ2KDecoderLogger> loggers = new Vector();
+
+
+    public OpenJPEGJavaDecoder(String openJPEGlibraryFullPathAndName, IJavaJ2KDecoderLogger messagesAndErrorsLogger) throws ExceptionInInitializerError
+    {
+       this(openJPEGlibraryFullPathAndName);
+       loggers.addElement(messagesAndErrorsLogger);
+    }
+
+    public OpenJPEGJavaDecoder(String openJPEGlibraryFullPathAndName) throws ExceptionInInitializerError
+    {
+       if (!isInitialized) {
+               try {
+                       System.load(openJPEGlibraryFullPathAndName);
+                       isInitialized = true;
+               } catch (Throwable t) {
+                       throw new ExceptionInInitializerError("OpenJPEG Java Decoder: probably impossible to find the C library");
+               }
+       }
+    }
+    
+    public void addLogger(IJavaJ2KDecoderLogger messagesAndErrorsLogger) {
+       loggers.addElement(messagesAndErrorsLogger);
+    }
+    
+    public void removeLogger(IJavaJ2KDecoderLogger messagesAndErrorsLogger) {
+       loggers.removeElement(messagesAndErrorsLogger);
+    }
+    
+    public int  decodeJ2KtoImage() {
+               if ((image16 == null || (image16 != null && image16.length != width*height)) && (depth==-1 || depth==16)) {
+                       image16 = new short[width*height];
+                       logMessage("OpenJPEGJavaDecoder.decompressImage: image16 length = " + image16.length + " (" + width + " x " + height + ") ");
+               }
+               if ((image8 == null || (image8 != null && image8.length != width*height)) && (depth==-1 || depth==8)) {
+                       image8 = new byte[width*height];
+                       logMessage("OpenJPEGJavaDecoder.decompressImage: image8 length = " + image8.length + " (" + width + " x " + height + ") ");
+               }
+               if ((image24 == null || (image24 != null && image24.length != width*height)) && (depth==-1 || depth==24)) {
+                       image24 = new int[width*height];
+                       logMessage("OpenJPEGJavaDecoder.decompressImage: image24 length = " + image24.length + " (" + width + " x " + height + ") ");
+               }
+               
+               String[] arguments = new String[0 + (decoder_arguments != null ? decoder_arguments.length : 0)];
+               int offset = 0;
+               if (decoder_arguments != null) {
+                       for (int i=0; i<decoder_arguments.length; i++) {
+                               arguments[i+offset] = decoder_arguments[i];
+                       }
+               }
+
+               return internalDecodeJ2KtoImage(arguments);
+    }
+    
+    /** 
+     * Decode the j2k stream given in the codestream byte[] and fills the image8, image16 or image24 array, according to the bit depth.
+     */
+    private native int internalDecodeJ2KtoImage(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;
+       }
+
+       /** Number of resolutions contained in the image */
+       public int getNbResolutions() {
+               return nbResolutions;
+       }
+
+       /** Number of resolutions contained in the image */
+       public void setNbResolutions(int nbResolutions) {
+               this.nbResolutions = nbResolutions;
+       }
+
+       /** Width of the image in pixels */
+       public int getWidth() {
+               return width;
+       }
+
+       /** Width of the image in pixels */
+       public void setWidth(int width) {
+               this.width = width;
+       }
+
+       /** Contains the decompressed version of the image, if the depth in is [9,16] bpp.
+        * Returns NULL otherwise.
+        */
+       public short[] getImage16() {
+               return image16;
+       }
+
+       /** Contains the decompressed version of the image, if the depth in is [17,24] bpp and the image is in color.
+        * Returns NULL otherwise.
+        */
+       public int[] getImage24() {
+               return image24;
+       }
+
+       /** Contains the decompressed version of the image, if the depth in is [1,8] bpp.
+        * Returns NULL otherwise.
+        */
+       public byte[] getImage8() {
+               return image8;
+       }
+
+       /** Sets the compressed version of the index file for this image.
+        * This index file is used by the decompressor
+        */
+       public void setCompressedIndex(byte[] compressedIndex) {
+               this.compressedIndex = compressedIndex;
+       }
+
+       /** Sets the codestream to be decoded */
+       public void setCompressedStream(byte[] compressedStream) {
+               this.compressedStream = compressedStream;
+       }
+
+       /** @return the compressed code stream length, or -1 if not defined */
+       public long getCodestreamLength() {
+               if (compressedStream == null)
+                       return -1;
+               else return compressedStream.length;
+       }
+       
+       /** This method is called either directly or by the C methods */
+       public void logMessage(String message) {
+               for (IJavaJ2KDecoderLogger logger:loggers)
+                       logger.logDecoderMessage(message);
+       }
+       
+       /** This method is called either directly or by the C methods */
+       public void logError(String error) {
+               for (IJavaJ2KDecoderLogger logger:loggers)
+                       logger.logDecoderError(error);
+       }
+
+       public void reset() {
+               nbResolutions = -1;
+               layers = null;
+               image8 = null;
+               image16 = null;
+               image24 = null;
+               compressedStream = null;
+           compressedIndex = null;
+           width = -1;
+           height = -1;
+           depth = -1;
+       }
+
+       public void setSkippedResolutions(int numberOfSkippedResolutions) {
+               skippedResolutions = numberOfSkippedResolutions;
+       }
+
+       /** Contains all the decoding arguments other than the input/output file */
+       public void setDecoderArguments(String[] argumentsForTheDecoder) {
+               decoder_arguments = argumentsForTheDecoder;
+       }
+
+
+}