[trunk] Fix OpenJPWL compilation
authorMathieu Malaterre <mathieu.malaterre@gmail.com>
Thu, 25 Oct 2012 08:15:41 +0000 (08:15 +0000)
committerMathieu Malaterre <mathieu.malaterre@gmail.com>
Thu, 25 Oct 2012 08:15:41 +0000 (08:15 +0000)
Simply move files over from branch 1.5 onto current trunk, and use current openmj2 copy (it contains a copy of openjpeg 1.5.x)

src/bin/jpwl/CMakeLists.txt
src/bin/jpwl/convert.c [new file with mode: 0644]
src/bin/jpwl/convert.h [new file with mode: 0644]
src/bin/jpwl/index.c [new file with mode: 0644]
src/bin/jpwl/index.h [new file with mode: 0644]
src/bin/jpwl/opj_jpwl_compress.c [new file with mode: 0644]
src/bin/jpwl/opj_jpwl_decompress.c [new file with mode: 0644]
src/bin/jpwl/windirent.h [new file with mode: 0644]
src/lib/openjpwl/CMakeLists.txt
src/lib/openmj2/opj_includes.h

index a9461aba9653952a1d23966eadfaa2b9c12ac9ce..9c4407b7300a8b41a04766c99771388466d2652d 100644 (file)
@@ -2,8 +2,8 @@
 
 # First thing define the common source:
 set(common_SRCS
-  ../jp2/convert.c
-  ../jp2/index.c
+  convert.c
+  index.c
   ${OPENJPEG_SOURCE_DIR}/src/bin/common/color.c
   ${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.c
   )
@@ -11,7 +11,7 @@ set(common_SRCS
 # Headers file are located here:
 include_directories(
   ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2
   ${OPENJPEG_SOURCE_DIR}/src/bin/common
   ${LCMS_INCLUDE_DIRNAME}
   ${Z_INCLUDE_DIRNAME}
@@ -31,7 +31,8 @@ foreach(exe decompress compress)
   set(jpwl_exe opj_jpwl_${exe})
   set(jp2_exe opj_${exe})
   add_executable(${jpwl_exe}
-    ../jp2/${jp2_exe}.c
+    #../jp2/${jp2_exe}.c
+    ${jpwl_exe}.c
     ${common_SRCS}
   )
   set_property(
diff --git a/src/bin/jpwl/convert.c b/src/bin/jpwl/convert.c
new file mode 100644 (file)
index 0000000..11e89f7
--- /dev/null
@@ -0,0 +1,3563 @@
+/*
+ * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2007, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * 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.
+ */
+#include "opj_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifdef HAVE_LIBTIFF
+#include <tiffio.h>
+#endif /* HAVE_LIBTIFF */
+
+#ifdef HAVE_LIBPNG
+#include <zlib.h>
+#include <png.h>
+#endif /* HAVE_LIBPNG */
+
+#include "openjpeg.h"
+#include "convert.h"
+
+/*
+ * Get logarithm of an integer and round downwards.
+ *
+ * log2(a)
+ */
+static int int_floorlog2(int a) {
+       int l;
+       for (l = 0; a > 1; l++) {
+               a >>= 1;
+       }
+       return l;
+}
+
+/* -->> -->> -->> -->>
+
+  TGA IMAGE FORMAT
+
+ <<-- <<-- <<-- <<-- */
+
+#ifdef INFORMATION_ONLY
+/* TGA header definition. */
+struct tga_header
+{                           
+    unsigned char   id_length;              /* Image id field length    */
+    unsigned char   colour_map_type;        /* Colour map type          */
+    unsigned char   image_type;             /* Image type               */
+    /*
+    ** Colour map specification
+    */
+    unsigned short  colour_map_index;       /* First entry index        */
+    unsigned short  colour_map_length;      /* Colour map length        */
+    unsigned char   colour_map_entry_size;  /* Colour map entry size    */
+    /*
+    ** Image specification
+    */
+    unsigned short  x_origin;               /* x origin of image        */
+    unsigned short  y_origin;               /* u origin of image        */
+    unsigned short  image_width;            /* Image width              */
+    unsigned short  image_height;           /* Image height             */
+    unsigned char   pixel_depth;            /* Pixel depth              */
+    unsigned char   image_desc;             /* Image descriptor         */
+};
+#endif /* INFORMATION_ONLY */
+
+static unsigned short get_ushort(unsigned short val) {
+
+#ifdef WORDS_BIGENDIAN
+       return( ((val & 0xff) << 8) + (val >> 8) );
+#else
+    return( val );
+#endif
+
+}
+
+#define TGA_HEADER_SIZE 18
+
+static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel, 
+       unsigned int *width, unsigned int *height, int *flip_image)
+{
+       int palette_size;
+       unsigned char *tga ;
+       unsigned char id_len, cmap_type, image_type;
+       unsigned char pixel_depth, image_desc;
+       unsigned short cmap_index, cmap_len, cmap_entry_size;
+       unsigned short x_origin, y_origin, image_w, image_h;
+
+       if (!bits_per_pixel || !width || !height || !flip_image)
+               return 0;
+       tga = (unsigned char*)malloc(18);
+
+       if ( fread(tga, TGA_HEADER_SIZE, 1, fp) != 1 )
+       {
+               fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+           return 0 ;
+       }
+       id_len = (unsigned char)tga[0];
+       cmap_type = (unsigned char)tga[1];
+       image_type = (unsigned char)tga[2];
+       cmap_index = get_ushort(*(unsigned short*)(&tga[3]));
+       cmap_len = get_ushort(*(unsigned short*)(&tga[5]));
+       cmap_entry_size = (unsigned char)tga[7];
+
+
+       x_origin = get_ushort(*(unsigned short*)(&tga[8]));
+       y_origin = get_ushort(*(unsigned short*)(&tga[10]));
+       image_w = get_ushort(*(unsigned short*)(&tga[12]));
+       image_h = get_ushort(*(unsigned short*)(&tga[14]));
+       pixel_depth = (unsigned char)tga[16];
+       image_desc  = (unsigned char)tga[17];
+
+       free(tga);
+
+       *bits_per_pixel = (unsigned int)pixel_depth;
+       *width  = (unsigned int)image_w;
+       *height = (unsigned int)image_h;
+
+       /* Ignore tga identifier, if present ... */
+       if (id_len)
+       {
+               unsigned char *id = (unsigned char *) malloc(id_len);
+               if ( !fread(id, id_len, 1, fp) )
+               {
+                       fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+                       free(id);
+                   return 0 ;
+               }
+               free(id);  
+       }
+
+       /* Test for compressed formats ... not yet supported ...
+       // Note :-  9 - RLE encoded palettized.
+       //                 10 - RLE encoded RGB. */
+       if (image_type > 8)
+       {
+               fprintf(stderr, "Sorry, compressed tga files are not currently supported.\n");
+               return 0 ;
+       }
+
+       *flip_image = !(image_desc & 32);
+
+       /* Palettized formats are not yet supported, skip over the palette, if present ... */
+       palette_size = cmap_len * (cmap_entry_size/8);
+       
+       if (palette_size>0)
+       {
+               fprintf(stderr, "File contains a palette - not yet supported.");
+               fseek(fp, palette_size, SEEK_CUR);
+       }
+       return 1;
+}
+
+#if WORDS_BIGENDIAN == 1
+
+static inline int16_t swap16(int16_t x)
+{
+  return((((u_int16_t)x & 0x00ffU) <<  8) |
+     (((u_int16_t)x & 0xff00U) >>  8));
+}
+
+#endif
+
+static int tga_writeheader(FILE *fp, int bits_per_pixel, int width, int height, 
+       opj_bool flip_image)
+{
+       unsigned short image_w, image_h, us0;
+       unsigned char uc0, image_type;
+       unsigned char pixel_depth, image_desc;
+
+       if (!bits_per_pixel || !width || !height)
+               return 0;
+
+       pixel_depth = 0;
+
+       if ( bits_per_pixel < 256 )
+               pixel_depth = (unsigned char)bits_per_pixel;
+       else{
+               fprintf(stderr,"ERROR: Wrong bits per pixel inside tga_header");
+               return 0;
+       }
+       uc0 = 0;
+
+       if(fwrite(&uc0, 1, 1, fp) != 1) goto fails; /* id_length */
+       if(fwrite(&uc0, 1, 1, fp) != 1) goto fails; /* colour_map_type */
+
+       image_type = 2; /* Uncompressed. */
+       if(fwrite(&image_type, 1, 1, fp) != 1) goto fails;
+
+       us0 = 0;
+       if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* colour_map_index */
+       if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* colour_map_length */
+       if(fwrite(&uc0, 1, 1, fp) != 1) goto fails; /* colour_map_entry_size */
+
+       if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* x_origin */
+       if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* y_origin */
+
+       image_w = (unsigned short)width;
+       image_h = (unsigned short) height;
+
+#if WORDS_BIGENDIAN == 0
+       if(fwrite(&image_w, 2, 1, fp) != 1) goto fails;
+       if(fwrite(&image_h, 2, 1, fp) != 1) goto fails;
+#else
+       image_w = swap16(image_w);
+       image_h = swap16(image_h);
+       if(fwrite(&image_w, 2, 1, fp) != 1) goto fails;
+       if(fwrite(&image_h, 2, 1, fp) != 1) goto fails;
+#endif
+
+       if(fwrite(&pixel_depth, 1, 1, fp) != 1) goto fails;
+
+       image_desc = 8; /* 8 bits per component. */
+
+       if (flip_image)
+               image_desc |= 32;
+       if(fwrite(&image_desc, 1, 1, fp) != 1) goto fails;
+
+       return 1;
+
+fails:
+       fputs("\nwrite_tgaheader: write ERROR\n", stderr);
+       return 0;
+}
+
+opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) {
+       FILE *f;
+       opj_image_t *image;
+       unsigned int image_width, image_height, pixel_bit_depth;
+       unsigned int x, y;
+       int flip_image=0;
+       opj_image_cmptparm_t cmptparm[4];       /* maximum 4 components */
+       int numcomps;
+       OPJ_COLOR_SPACE color_space;
+       opj_bool mono ;
+       opj_bool save_alpha;
+       int subsampling_dx, subsampling_dy;
+       int i;  
+
+       f = fopen(filename, "rb");
+       if (!f) {
+               fprintf(stderr, "Failed to open %s for reading !!\n", filename);
+               return 0;
+       }
+
+       if (!tga_readheader(f, &pixel_bit_depth, &image_width, &image_height, &flip_image))
+               return NULL;
+
+       /* We currently only support 24 & 32 bit tga's ... */
+       if (!((pixel_bit_depth == 24) || (pixel_bit_depth == 32)))
+               return NULL;
+
+       /* initialize image components */   
+       memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t));
+
+       mono = (pixel_bit_depth == 8) || (pixel_bit_depth == 16);  /* Mono with & without alpha. */
+       save_alpha = (pixel_bit_depth == 16) || (pixel_bit_depth == 32); /* Mono with alpha, or RGB with alpha */
+
+       if (mono) {
+               color_space = CLRSPC_GRAY;
+               numcomps = save_alpha ? 2 : 1;
+       }       
+       else {
+               numcomps = save_alpha ? 4 : 3;
+               color_space = CLRSPC_SRGB;
+       }
+
+       subsampling_dx = parameters->subsampling_dx;
+       subsampling_dy = parameters->subsampling_dy;
+
+       for (i = 0; i < numcomps; i++) {
+               cmptparm[i].prec = 8;
+               cmptparm[i].bpp = 8;
+               cmptparm[i].sgnd = 0;
+               cmptparm[i].dx = subsampling_dx;
+               cmptparm[i].dy = subsampling_dy;
+               cmptparm[i].w = image_width;
+               cmptparm[i].h = image_height;
+       }
+
+       /* create the image */
+       image = opj_image_create(numcomps, &cmptparm[0], color_space);
+
+       if (!image)
+               return NULL;
+
+       /* set image offset and reference grid */
+       image->x0 = parameters->image_offset_x0;
+       image->y0 = parameters->image_offset_y0;
+       image->x1 =     !image->x0 ? (image_width - 1) * subsampling_dx + 1 : image->x0 + (image_width - 1) * subsampling_dx + 1;
+       image->y1 =     !image->y0 ? (image_height - 1) * subsampling_dy + 1 : image->y0 + (image_height - 1) * subsampling_dy + 1;
+
+       /* set image data */
+       for (y=0; y < image_height; y++) 
+       {
+               int index;
+
+               if (flip_image)
+                       index = (image_height-y-1)*image_width;
+               else
+                       index = y*image_width;
+
+               if (numcomps==3)
+               {
+                       for (x=0;x<image_width;x++) 
+                       {
+                               unsigned char r,g,b;
+
+                               if( !fread(&b, 1, 1, f) )
+                               {
+                                       fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+                                       opj_image_destroy(image);
+                                   return NULL;
+                               }
+                               if ( !fread(&g, 1, 1, f) )
+                               {
+                                       fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+                                       opj_image_destroy(image);
+                                   return NULL;
+                               }
+                               if ( !fread(&r, 1, 1, f) )
+                               {
+                                       fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+                                       opj_image_destroy(image);
+                                   return NULL;
+                               }
+
+                               image->comps[0].data[index]=r;
+                               image->comps[1].data[index]=g;
+                               image->comps[2].data[index]=b;
+                               index++;
+                       }
+               }
+               else if (numcomps==4)
+               {
+                       for (x=0;x<image_width;x++) 
+                       {
+                               unsigned char r,g,b,a;
+                               if ( !fread(&b, 1, 1, f) )
+                               {
+                                       fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+                                       opj_image_destroy(image);
+                                   return NULL;
+                               }
+                               if ( !fread(&g, 1, 1, f) )
+                               {
+                                       fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+                                       opj_image_destroy(image);
+                                   return NULL;
+                               }
+                               if ( !fread(&r, 1, 1, f) )
+                               {
+                                       fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+                                       opj_image_destroy(image);
+                                   return NULL;
+                               }
+                               if ( !fread(&a, 1, 1, f) )
+                               {
+                                       fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+                                       opj_image_destroy(image);
+                                   return NULL;
+                               }
+
+                               image->comps[0].data[index]=r;
+                               image->comps[1].data[index]=g;
+                               image->comps[2].data[index]=b;
+                               image->comps[3].data[index]=a;
+                               index++;
+                       }
+               }
+               else {
+                       fprintf(stderr, "Currently unsupported bit depth : %s\n", filename);
+               }
+       }       
+       return image;
+}
+
+int imagetotga(opj_image_t * image, const char *outfile) {
+       int width, height, bpp, x, y;
+       opj_bool write_alpha;
+       int i, adjustR, adjustG, adjustB;
+       unsigned int alpha_channel;
+       float r,g,b,a;
+       unsigned char value;
+       float scale;
+       FILE *fdest;
+  size_t res;
+
+       fdest = fopen(outfile, "wb");
+       if (!fdest) {
+               fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile);
+               return 1;
+       }
+
+       for (i = 0; i < image->numcomps-1; i++) {
+               if ((image->comps[0].dx != image->comps[i+1].dx) 
+                       ||(image->comps[0].dy != image->comps[i+1].dy) 
+                       ||(image->comps[0].prec != image->comps[i+1].prec))     {
+      fprintf(stderr, "Unable to create a tga file with such J2K image charateristics.");
+      return 1;
+   }
+       }
+
+       width = image->comps[0].w;
+       height = image->comps[0].h; 
+
+       /* Mono with alpha, or RGB with alpha. */
+       write_alpha = (image->numcomps==2) || (image->numcomps==4);   
+
+       /* Write TGA header  */
+       bpp = write_alpha ? 32 : 24;
+       if (!tga_writeheader(fdest, bpp, width , height, OPJ_TRUE))
+               return 1;
+
+       alpha_channel = image->numcomps-1; 
+
+       scale = 255.0f / (float)((1<<image->comps[0].prec)-1);
+
+       adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+       adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0);
+       adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0);
+
+       for (y=0; y < height; y++) {
+               unsigned int index=y*width;
+
+               for (x=0; x < width; x++, index++)      {
+                       r = (float)(image->comps[0].data[index] + adjustR);
+
+                       if (image->numcomps>2) {
+                               g = (float)(image->comps[1].data[index] + adjustG);
+                               b = (float)(image->comps[2].data[index] + adjustB);
+                       }
+                       else  {/* Greyscale ... */
+                               g = r;
+                               b = r;
+                       }
+
+                       /* TGA format writes BGR ... */
+                       value = (unsigned char)(b*scale);
+                       res = fwrite(&value,1,1,fdest);
+      if( res < 1 ) {
+        fprintf(stderr, "failed to write 1 byte for %s\n", outfile);
+        return 1;
+      }
+
+                       value = (unsigned char)(g*scale);
+                       res = fwrite(&value,1,1,fdest);
+      if( res < 1 ) {
+        fprintf(stderr, "failed to write 1 byte for %s\n", outfile);
+        return 1;
+      }
+
+                       value = (unsigned char)(r*scale);
+                       res = fwrite(&value,1,1,fdest);
+      if( res < 1 ) {
+        fprintf(stderr, "failed to write 1 byte for %s\n", outfile);
+        return 1;
+      }
+
+                       if (write_alpha) {
+                               a = (float)(image->comps[alpha_channel].data[index]);
+                               value = (unsigned char)(a*scale);
+                               res = fwrite(&value,1,1,fdest);
+        if( res < 1 ) {
+          fprintf(stderr, "failed to write 1 byte for %s\n", outfile);
+          return 1;
+        }
+                       }
+               }
+       }
+
+       return 0;
+}
+
+/* -->> -->> -->> -->>
+
+  BMP IMAGE FORMAT
+
+ <<-- <<-- <<-- <<-- */
+
+/* WORD defines a two byte word */
+typedef unsigned short int WORD;
+
+/* DWORD defines a four byte word */
+typedef unsigned int DWORD;
+
+typedef struct {
+  WORD bfType;                 /* 'BM' for Bitmap (19776) */
+  DWORD bfSize;                        /* Size of the file        */
+  WORD bfReserved1;            /* Reserved : 0            */
+  WORD bfReserved2;            /* Reserved : 0            */
+  DWORD bfOffBits;             /* Offset                  */
+} BITMAPFILEHEADER_t;
+
+typedef struct {
+  DWORD biSize;                        /* Size of the structure in bytes */
+  DWORD biWidth;               /* Width of the image in pixels */
+  DWORD biHeight;              /* Heigth of the image in pixels */
+  WORD biPlanes;               /* 1 */
+  WORD biBitCount;             /* Number of color bits by pixels */
+  DWORD biCompression;         /* Type of encoding 0: none 1: RLE8 2: RLE4 */
+  DWORD biSizeImage;           /* Size of the image in bytes */
+  DWORD biXpelsPerMeter;       /* Horizontal (X) resolution in pixels/meter */
+  DWORD biYpelsPerMeter;       /* Vertical (Y) resolution in pixels/meter */
+  DWORD biClrUsed;             /* Number of color used in the image (0: ALL) */
+  DWORD biClrImportant;                /* Number of important color (0: ALL) */
+} BITMAPINFOHEADER_t;
+
+opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters) 
+{
+       int subsampling_dx = parameters->subsampling_dx;
+       int subsampling_dy = parameters->subsampling_dy;
+
+       int i, numcomps, w, h;
+       OPJ_COLOR_SPACE color_space;
+       opj_image_cmptparm_t cmptparm[3];       /* maximum of 3 components */
+       opj_image_t * image = NULL;
+
+       FILE *IN;
+       BITMAPFILEHEADER_t File_h;
+       BITMAPINFOHEADER_t Info_h;
+       unsigned char *RGB;
+       unsigned char *table_R, *table_G, *table_B;
+       unsigned int j, PAD = 0;
+
+       int x, y, index;
+       int gray_scale = 1;
+       int has_color;
+       DWORD W, H;
+  
+       IN = fopen(filename, "rb");
+       if (!IN) 
+   {
+       fprintf(stderr, "Failed to open %s for reading !!\n", filename);
+       return NULL;
+   }
+       
+       File_h.bfType = getc(IN);
+       File_h.bfType = (getc(IN) << 8) + File_h.bfType;
+       
+       if (File_h.bfType != 19778) 
+   {
+       fprintf(stderr,"Error, not a BMP file!\n");
+       fclose(IN);
+       return NULL;
+   }
+               /* FILE HEADER */
+               /* ------------- */
+       File_h.bfSize = getc(IN);
+       File_h.bfSize = (getc(IN) << 8) + File_h.bfSize;
+       File_h.bfSize = (getc(IN) << 16) + File_h.bfSize;
+       File_h.bfSize = (getc(IN) << 24) + File_h.bfSize;
+
+       File_h.bfReserved1 = getc(IN);
+       File_h.bfReserved1 = (getc(IN) << 8) + File_h.bfReserved1;
+
+       File_h.bfReserved2 = getc(IN);
+       File_h.bfReserved2 = (getc(IN) << 8) + File_h.bfReserved2;
+
+       File_h.bfOffBits = getc(IN);
+       File_h.bfOffBits = (getc(IN) << 8) + File_h.bfOffBits;
+       File_h.bfOffBits = (getc(IN) << 16) + File_h.bfOffBits;
+       File_h.bfOffBits = (getc(IN) << 24) + File_h.bfOffBits;
+
+               /* INFO HEADER */
+               /* ------------- */
+
+       Info_h.biSize = getc(IN);
+       Info_h.biSize = (getc(IN) << 8) + Info_h.biSize;
+       Info_h.biSize = (getc(IN) << 16) + Info_h.biSize;
+       Info_h.biSize = (getc(IN) << 24) + Info_h.biSize;
+
+       if(Info_h.biSize != 40)
+   {
+       fprintf(stderr,"Error, unknown BMP header size %d\n", Info_h.biSize);
+       fclose(IN);
+       return NULL;
+   }
+       Info_h.biWidth = getc(IN);
+       Info_h.biWidth = (getc(IN) << 8) + Info_h.biWidth;
+       Info_h.biWidth = (getc(IN) << 16) + Info_h.biWidth;
+       Info_h.biWidth = (getc(IN) << 24) + Info_h.biWidth;
+       w = Info_h.biWidth;
+
+       Info_h.biHeight = getc(IN);
+       Info_h.biHeight = (getc(IN) << 8) + Info_h.biHeight;
+       Info_h.biHeight = (getc(IN) << 16) + Info_h.biHeight;
+       Info_h.biHeight = (getc(IN) << 24) + Info_h.biHeight;
+       h = Info_h.biHeight;
+
+       Info_h.biPlanes = getc(IN);
+       Info_h.biPlanes = (getc(IN) << 8) + Info_h.biPlanes;
+
+       Info_h.biBitCount = getc(IN);
+       Info_h.biBitCount = (getc(IN) << 8) + Info_h.biBitCount;
+
+       Info_h.biCompression = getc(IN);
+       Info_h.biCompression = (getc(IN) << 8) + Info_h.biCompression;
+       Info_h.biCompression = (getc(IN) << 16) + Info_h.biCompression;
+       Info_h.biCompression = (getc(IN) << 24) + Info_h.biCompression;
+
+       Info_h.biSizeImage = getc(IN);
+       Info_h.biSizeImage = (getc(IN) << 8) + Info_h.biSizeImage;
+       Info_h.biSizeImage = (getc(IN) << 16) + Info_h.biSizeImage;
+       Info_h.biSizeImage = (getc(IN) << 24) + Info_h.biSizeImage;
+
+       Info_h.biXpelsPerMeter = getc(IN);
+       Info_h.biXpelsPerMeter = (getc(IN) << 8) + Info_h.biXpelsPerMeter;
+       Info_h.biXpelsPerMeter = (getc(IN) << 16) + Info_h.biXpelsPerMeter;
+       Info_h.biXpelsPerMeter = (getc(IN) << 24) + Info_h.biXpelsPerMeter;
+
+       Info_h.biYpelsPerMeter = getc(IN);
+       Info_h.biYpelsPerMeter = (getc(IN) << 8) + Info_h.biYpelsPerMeter;
+       Info_h.biYpelsPerMeter = (getc(IN) << 16) + Info_h.biYpelsPerMeter;
+       Info_h.biYpelsPerMeter = (getc(IN) << 24) + Info_h.biYpelsPerMeter;
+
+       Info_h.biClrUsed = getc(IN);
+       Info_h.biClrUsed = (getc(IN) << 8) + Info_h.biClrUsed;
+       Info_h.biClrUsed = (getc(IN) << 16) + Info_h.biClrUsed;
+       Info_h.biClrUsed = (getc(IN) << 24) + Info_h.biClrUsed;
+
+       Info_h.biClrImportant = getc(IN);
+       Info_h.biClrImportant = (getc(IN) << 8) + Info_h.biClrImportant;
+       Info_h.biClrImportant = (getc(IN) << 16) + Info_h.biClrImportant;
+       Info_h.biClrImportant = (getc(IN) << 24) + Info_h.biClrImportant;
+
+               /* Read the data and store them in the OUT file */
+
+       if (Info_h.biBitCount == 24) 
+   {
+       numcomps = 3;
+       color_space = CLRSPC_SRGB;
+       /* initialize image components */
+       memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
+       for(i = 0; i < numcomps; i++) 
+  {
+       cmptparm[i].prec = 8;
+       cmptparm[i].bpp = 8;
+       cmptparm[i].sgnd = 0;
+       cmptparm[i].dx = subsampling_dx;
+       cmptparm[i].dy = subsampling_dy;
+       cmptparm[i].w = w;
+       cmptparm[i].h = h;
+  }
+       /* create the image */
+       image = opj_image_create(numcomps, &cmptparm[0], color_space);
+       if(!image) 
+  {
+       fclose(IN);
+       return NULL;
+  }
+
+       /* set image offset and reference grid */
+       image->x0 = parameters->image_offset_x0;
+       image->y0 = parameters->image_offset_y0;
+       image->x1 =     !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1;
+       image->y1 =     !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1;
+
+       /* set image data */
+
+       /* Place the cursor at the beginning of the image information */
+       fseek(IN, 0, SEEK_SET);
+       fseek(IN, File_h.bfOffBits, SEEK_SET);
+                       
+       W = Info_h.biWidth;
+       H = Info_h.biHeight;
+
+       /* PAD = 4 - (3 * W) % 4; */
+       /* PAD = (PAD == 4) ? 0 : PAD; */
+       PAD = (3 * W) % 4 ? 4 - (3 * W) % 4 : 0;
+                       
+       RGB = (unsigned char *) 
+        malloc((3 * W + PAD) * H * sizeof(unsigned char));
+                       
+       if ( fread(RGB, sizeof(unsigned char), (3 * W + PAD) * H, IN) != (3 * W + PAD) * H )
+       {
+               free(RGB);
+               opj_image_destroy(image);
+               fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+           return NULL;
+       }
+                       
+       index = 0;
+
+       for(y = 0; y < (int)H; y++) 
+  {
+       unsigned char *scanline = RGB + (3 * W + PAD) * (H - 1 - y);
+       for(x = 0; x < (int)W; x++) 
+ {
+       unsigned char *pixel = &scanline[3 * x];
+       image->comps[0].data[index] = pixel[2]; /* R */
+       image->comps[1].data[index] = pixel[1]; /* G */
+       image->comps[2].data[index] = pixel[0]; /* B */
+       index++;
+ }
+  }
+       free(RGB);
+   }/* if (Info_h.biBitCount == 24) */ 
+       else 
+       if (Info_h.biBitCount == 8 && Info_h.biCompression == 0)/*RGB */
+   {
+       if(Info_h.biClrUsed == 0) Info_h.biClrUsed = 256;
+       else
+       if(Info_h.biClrUsed > 256) Info_h.biClrUsed = 256;
+
+       table_R = (unsigned char *) malloc(256 * sizeof(unsigned char));
+       table_G = (unsigned char *) malloc(256 * sizeof(unsigned char));
+       table_B = (unsigned char *) malloc(256 * sizeof(unsigned char));
+               
+       has_color = 0;  
+       for (j = 0; j < Info_h.biClrUsed; j++) 
+  {
+       table_B[j] = (unsigned char)getc(IN);
+       table_G[j] = (unsigned char)getc(IN);
+       table_R[j] = (unsigned char)getc(IN);
+       getc(IN);
+       has_color += 
+        !(table_R[j] == table_G[j] && table_R[j] == table_B[j]);
+  }
+       if(has_color) gray_scale = 0;
+                  
+       /* Place the cursor at the beginning of the image information */
+       fseek(IN, 0, SEEK_SET);
+       fseek(IN, File_h.bfOffBits, SEEK_SET);
+                       
+       W = Info_h.biWidth;
+       H = Info_h.biHeight;
+       if (Info_h.biWidth % 2)
+        W++;
+                       
+       numcomps = gray_scale ? 1 : 3;
+       color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB;
+               /* initialize image components */
+       memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
+       for(i = 0; i < numcomps; i++) 
+  {
+       cmptparm[i].prec = 8;
+       cmptparm[i].bpp = 8;
+       cmptparm[i].sgnd = 0;
+       cmptparm[i].dx = subsampling_dx;
+       cmptparm[i].dy = subsampling_dy;
+       cmptparm[i].w = w;
+       cmptparm[i].h = h;
+  }
+       /* create the image */
+       image = opj_image_create(numcomps, &cmptparm[0], color_space);
+       if(!image) 
+  {
+       fclose(IN);
+       free(table_R); free(table_G); free(table_B);
+       return NULL;
+  }
+
+       /* set image offset and reference grid */
+       image->x0 = parameters->image_offset_x0;
+       image->y0 = parameters->image_offset_y0;
+       image->x1 =     !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1;
+       image->y1 =     !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1;
+
+       /* set image data */
+
+       RGB = (unsigned char *) malloc(W * H * sizeof(unsigned char));
+                       
+       if ( fread(RGB, sizeof(unsigned char), W * H, IN) != W * H )
+       {
+               free(table_R);
+               free(table_G);
+               free(table_B);
+               free(RGB);
+               opj_image_destroy(image);
+               fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+           return NULL;
+       }
+       if (gray_scale) 
+  {
+       index = 0;
+       for (j = 0; j < W * H; j++) 
+ {
+               if ((j % W < W - 1 && Info_h.biWidth % 2) || !(Info_h.biWidth % 2)) 
+          {
+               image->comps[0].data[index] = 
+                table_R[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]];
+               index++;
+          }
+ }
+
+  } 
+       else 
+  {
+       index = 0;
+       for (j = 0; j < W * H; j++) 
+ {
+               if ((j % W < W - 1 && Info_h.biWidth % 2) 
+               || !(Info_h.biWidth % 2)) 
+          {
+               unsigned char pixel_index = 
+                RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)];
+               image->comps[0].data[index] = table_R[pixel_index];
+               image->comps[1].data[index] = table_G[pixel_index];
+               image->comps[2].data[index] = table_B[pixel_index];
+               index++;
+          }
+ }
+  }
+       free(RGB);
+       free(table_R);
+       free(table_G);
+       free(table_B);
+   }/* RGB8 */ 
+       else 
+       if (Info_h.biBitCount == 8 && Info_h.biCompression == 1)/*RLE8*/
+       {
+               unsigned char *pix, *beyond;
+               int *gray, *red, *green, *blue;
+               unsigned int x, y, max;
+               int i, c, c1;
+               unsigned char uc;
+
+               if (Info_h.biClrUsed == 0)
+                       Info_h.biClrUsed = 256;
+               else if (Info_h.biClrUsed > 256)
+                       Info_h.biClrUsed = 256;
+
+               table_R = (unsigned char *) malloc(256 * sizeof(unsigned char));
+               table_G = (unsigned char *) malloc(256 * sizeof(unsigned char));
+               table_B = (unsigned char *) malloc(256 * sizeof(unsigned char));
+
+               has_color = 0;
+               for (j = 0; j < Info_h.biClrUsed; j++)
+               {
+                       table_B[j] = (unsigned char)getc(IN);
+                       table_G[j] = (unsigned char)getc(IN);
+                       table_R[j] = (unsigned char)getc(IN);
+                       getc(IN);
+                       has_color += !(table_R[j] == table_G[j] && table_R[j] == table_B[j]);
+               }
+
+               if (has_color)
+                       gray_scale = 0;
+
+               numcomps = gray_scale ? 1 : 3;
+               color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB;
+               /* initialize image components */
+               memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
+               for (i = 0; i < numcomps; i++)
+               {
+                       cmptparm[i].prec = 8;
+                       cmptparm[i].bpp = 8;
+                       cmptparm[i].sgnd = 0;
+                       cmptparm[i].dx = subsampling_dx;
+                       cmptparm[i].dy = subsampling_dy;
+                       cmptparm[i].w = w;
+                       cmptparm[i].h = h;
+               }
+               /* create the image */
+               image = opj_image_create(numcomps, &cmptparm[0], color_space);
+               if (!image)
+               {
+                       fclose(IN);
+                       free(table_R);
+                       free(table_G);
+                       free(table_B);
+                       return NULL;
+               }
+
+               /* set image offset and reference grid */
+               image->x0 = parameters->image_offset_x0;
+               image->y0 = parameters->image_offset_y0;
+               image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w
+                               - 1) * subsampling_dx + 1;
+               image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h
+                               - 1) * subsampling_dy + 1;
+
+               /* set image data */
+
+               /* Place the cursor at the beginning of the image information */
+               fseek(IN, 0, SEEK_SET);
+               fseek(IN, File_h.bfOffBits, SEEK_SET);
+
+               W = Info_h.biWidth;
+               H = Info_h.biHeight;
+               RGB = (unsigned char *) calloc(1, W * H * sizeof(unsigned char));
+               beyond = RGB + W * H;
+               pix = beyond - W;
+               x = y = 0;
+
+               while (y < H)
+               {
+                       c = getc(IN);
+
+                       if (c)
+                       {
+                               c1 = getc(IN);
+
+                               for (i = 0; i < c && x < W && pix < beyond; i++, x++, pix++)
+                                       *pix = (unsigned char)c1;
+                       }
+                       else
+                       {
+                               c = getc(IN);
+
+                               if (c == 0x00) /* EOL */
+                               {
+                                       x = 0;
+                                       ++y;
+                                       pix = RGB + x + (H - y - 1) * W;
+                               }
+                               else if (c == 0x01) /* EOP */
+                                       break;
+                               else if (c == 0x02) /* MOVE by dxdy */
+                               {
+                                       c = getc(IN);
+                                       x += c;
+                                       c = getc(IN);
+                                       y += c;
+                                       pix = RGB + (H - y - 1) * W + x;
+                               }
+                               else /* 03 .. 255 */
+                               {
+                                       i = 0;
+                                       for (; i < c && x < W && pix < beyond; i++, x++, pix++)
+                                       {
+                                               c1 = getc(IN);
+                                               *pix = (unsigned char)c1;
+                                       }
+                                       if (c & 1) /* skip padding byte */
+                                               getc(IN);
+                               }
+                       }
+               }/* while() */
+
+               if (gray_scale)
+               {
+                       gray = image->comps[0].data;
+                       pix = RGB;
+                       max = W * H;
+
+                       while (max--)
+                       {
+                               uc = *pix++;
+
+                               *gray++ = table_R[uc];
+                       }
+               }
+               else
+               {
+                       /*int *red, *green, *blue;*/
+
+                       red = image->comps[0].data;
+                       green = image->comps[1].data;
+                       blue = image->comps[2].data;
+                       pix = RGB;
+                       max = W * H;
+
+                       while (max--)
+                       {
+                               uc = *pix++;
+
+                               *red++ = table_R[uc];
+                               *green++ = table_G[uc];
+                               *blue++ = table_B[uc];
+                       }
+               }
+               free(RGB);
+               free(table_R);
+               free(table_G);
+               free(table_B);
+       }/* RLE8 */
+       else 
+   {
+       fprintf(stderr, 
+       "Other system than 24 bits/pixels or 8 bits (no RLE coding) "
+               "is not yet implemented [%d]\n", Info_h.biBitCount);
+   }
+       fclose(IN);
+       return image;
+}
+
+int imagetobmp(opj_image_t * image, const char *outfile) {
+       int w, h;
+       int i, pad;
+       FILE *fdest = NULL;
+       int adjustR, adjustG, adjustB;
+
+  if (image->comps[0].prec < 8) {
+    fprintf(stderr, "Unsupported precision: %d\n", image->comps[0].prec);
+    return 1;
+  }
+       if (image->numcomps >= 3 && image->comps[0].dx == image->comps[1].dx
+               && image->comps[1].dx == image->comps[2].dx
+               && image->comps[0].dy == image->comps[1].dy
+               && image->comps[1].dy == image->comps[2].dy
+               && image->comps[0].prec == image->comps[1].prec
+               && image->comps[1].prec == image->comps[2].prec) {
+               
+               /* -->> -->> -->> -->>    
+               24 bits color       
+               <<-- <<-- <<-- <<-- */
+           
+               fdest = fopen(outfile, "wb");
+               if (!fdest) {
+                       fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile);
+                       return 1;
+               }
+           
+               w = image->comps[0].w;      
+               h = image->comps[0].h;
+           
+               fprintf(fdest, "BM");
+           
+               /* FILE HEADER */
+               /* ------------- */
+               fprintf(fdest, "%c%c%c%c",
+                       (unsigned char) (h * w * 3 + 3 * h * (w % 2) + 54) & 0xff,
+                       (unsigned char) ((h * w * 3 + 3 * h * (w % 2) + 54)     >> 8) & 0xff,
+                       (unsigned char) ((h * w * 3 + 3 * h * (w % 2) + 54)     >> 16) & 0xff,
+                       (unsigned char) ((h * w * 3 + 3 * h * (w % 2) + 54)     >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,((54) >> 16) & 0xff, ((54) >> 24) & 0xff);
+           
+               /* INFO HEADER   */
+               /* ------------- */
+               fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,     ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (unsigned char) ((w) & 0xff),
+                       (unsigned char) ((w) >> 8) & 0xff,
+                       (unsigned char) ((w) >> 16) & 0xff,
+                       (unsigned char) ((w) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (unsigned char) ((h) & 0xff),
+                       (unsigned char) ((h) >> 8) & 0xff,
+                       (unsigned char) ((h) >> 16) & 0xff,
+                       (unsigned char) ((h) >> 24) & 0xff);
+               fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
+               fprintf(fdest, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (unsigned char) (3 * h * w + 3 * h * (w % 2)) & 0xff,
+                       (unsigned char) ((h * w * 3 + 3 * h * (w % 2)) >> 8) & 0xff,
+                       (unsigned char) ((h * w * 3 + 3 * h * (w % 2)) >> 16) & 0xff,
+                       (unsigned char) ((h * w * 3 + 3 * h * (w % 2)) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
+           
+               if (image->comps[0].prec > 8) {
+                       adjustR = image->comps[0].prec - 8;
+                       printf("BMP CONVERSION: Truncating component 0 from %d bits to 8 bits\n", image->comps[0].prec);
+               }
+               else 
+                       adjustR = 0;
+               if (image->comps[1].prec > 8) {
+                       adjustG = image->comps[1].prec - 8;
+                       printf("BMP CONVERSION: Truncating component 1 from %d bits to 8 bits\n", image->comps[1].prec);
+               }
+               else 
+                       adjustG = 0;
+               if (image->comps[2].prec > 8) {
+                       adjustB = image->comps[2].prec - 8;
+                       printf("BMP CONVERSION: Truncating component 2 from %d bits to 8 bits\n", image->comps[2].prec);
+               }
+               else 
+                       adjustB = 0;
+
+               for (i = 0; i < w * h; i++) {
+                       unsigned char rc, gc, bc;
+                       int r, g, b;
+                                                       
+                       r = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
+                       r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+                       r = ((r >> adjustR)+((r >> (adjustR-1))%2));
+                       if(r > 255) r = 255; else if(r < 0) r = 0;
+                       rc = (unsigned char)r;
+
+                       g = image->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
+                       g += (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0);
+                       g = ((g >> adjustG)+((g >> (adjustG-1))%2));
+                       if(g > 255) g = 255; else if(g < 0) g = 0;
+                       gc = (unsigned char)g;
+
+                       b = image->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
+                       b += (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0);
+                       b = ((b >> adjustB)+((b >> (adjustB-1))%2));
+                       if(b > 255) b = 255; else if(b < 0) b = 0;
+                       bc = (unsigned char)b;
+
+                       fprintf(fdest, "%c%c%c", bc, gc, rc);
+                       
+                       if ((i + 1) % w == 0) {
+                               for (pad = (3 * w) % 4 ? 4 - (3 * w) % 4 : 0; pad > 0; pad--)   /* ADD */
+                                       fprintf(fdest, "%c", 0);
+                       }
+               }
+               fclose(fdest);
+       } else {                        /* Gray-scale */
+
+               /* -->> -->> -->> -->>
+               8 bits non code (Gray scale)
+               <<-- <<-- <<-- <<-- */
+
+               fdest = fopen(outfile, "wb");
+               w = image->comps[0].w;      
+               h = image->comps[0].h;
+           
+               fprintf(fdest, "BM");
+           
+               /* FILE HEADER */
+               /* ------------- */
+               fprintf(fdest, "%c%c%c%c", (unsigned char) (h * w + 54 + 1024 + h * (w % 2)) & 0xff,
+                       (unsigned char) ((h * w + 54 + 1024 + h * (w % 2)) >> 8) & 0xff,
+                       (unsigned char) ((h * w + 54 + 1024 + h * (w % 2)) >> 16) & 0xff,
+                       (unsigned char) ((h * w + 54 + 1024 + w * (w % 2)) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (54 + 1024) & 0xff, ((54 + 1024) >> 8) & 0xff, 
+                       ((54 + 1024) >> 16) & 0xff,
+                       ((54 + 1024) >> 24) & 0xff);
+           
+               /* INFO HEADER */
+               /* ------------- */
+               fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,     ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (unsigned char) ((w) & 0xff),
+                       (unsigned char) ((w) >> 8) & 0xff,
+                       (unsigned char) ((w) >> 16) & 0xff,
+                       (unsigned char) ((w) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (unsigned char) ((h) & 0xff),
+                       (unsigned char) ((h) >> 8) & 0xff,
+                       (unsigned char) ((h) >> 16) & 0xff,
+                       (unsigned char) ((h) >> 24) & 0xff);
+               fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
+               fprintf(fdest, "%c%c", (8) & 0xff, ((8) >> 8) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (unsigned char) (h * w + h * (w % 2)) & 0xff,
+                       (unsigned char) ((h * w + h * (w % 2)) >> 8) &  0xff,
+                       (unsigned char) ((h * w + h * (w % 2)) >> 16) & 0xff,
+                       (unsigned char) ((h * w + h * (w % 2)) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, ((256) >> 16) & 0xff, ((256) >> 24) & 0xff);
+               fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, ((256) >> 16) & 0xff, ((256) >> 24) & 0xff);
+
+               if (image->comps[0].prec > 8) {
+                       adjustR = image->comps[0].prec - 8;
+                       printf("BMP CONVERSION: Truncating component 0 from %d bits to 8 bits\n", image->comps[0].prec);
+               }else 
+                       adjustR = 0;
+
+               for (i = 0; i < 256; i++) {
+                       fprintf(fdest, "%c%c%c%c", i, i, i, 0);
+               }
+
+               for (i = 0; i < w * h; i++) {
+                       int r;
+                       
+                       r = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
+                       r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+                       r = ((r >> adjustR)+((r >> (adjustR-1))%2));
+                       if(r > 255) r = 255; else if(r < 0) r = 0;
+
+                       fprintf(fdest, "%c", (unsigned char)r);
+
+                       if ((i + 1) % w == 0) {
+                               for (pad = w % 4 ? 4 - w % 4 : 0; pad > 0; pad--)       /* ADD */
+                                       fprintf(fdest, "%c", 0);
+                       }
+               }
+               fclose(fdest);
+       }
+
+       return 0;
+}
+
+/* -->> -->> -->> -->>
+
+PGX IMAGE FORMAT
+
+<<-- <<-- <<-- <<-- */
+
+
+static unsigned char readuchar(FILE * f)
+{
+  unsigned char c1;
+  if ( !fread(&c1, 1, 1, f) )
+  {
+         fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+         return 0;
+  }
+  return c1;
+}
+
+static unsigned short readushort(FILE * f, int bigendian)
+{
+  unsigned char c1, c2;
+  if ( !fread(&c1, 1, 1, f) )
+  {
+         fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+         return 0;
+  }
+  if ( !fread(&c2, 1, 1, f) )
+  {
+         fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+         return 0;
+  }
+  if (bigendian)
+    return (c1 << 8) + c2;
+  else
+    return (c2 << 8) + c1;
+}
+
+static unsigned int readuint(FILE * f, int bigendian)
+{
+  unsigned char c1, c2, c3, c4;
+  if ( !fread(&c1, 1, 1, f) )
+  {
+         fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+         return 0;
+  }
+  if ( !fread(&c2, 1, 1, f) )
+  {
+         fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+         return 0;
+  }
+  if ( !fread(&c3, 1, 1, f) )
+  {
+         fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+         return 0;
+  }
+  if ( !fread(&c4, 1, 1, f) )
+  {
+         fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+         return 0;
+  }
+  if (bigendian)
+    return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
+  else
+    return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1;
+}
+
+opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) {
+       FILE *f = NULL;
+       int w, h, prec;
+       int i, numcomps, max;
+       OPJ_COLOR_SPACE color_space;
+       opj_image_cmptparm_t cmptparm;  /* maximum of 1 component  */
+       opj_image_t * image = NULL;
+       int adjustS, ushift, dshift, force8;
+
+       char endian1,endian2,sign;
+       char signtmp[32];
+
+       char temp[32];
+       int bigendian;
+       opj_image_comp_t *comp = NULL;
+
+       numcomps = 1;
+       color_space = CLRSPC_GRAY;
+
+       memset(&cmptparm, 0, sizeof(opj_image_cmptparm_t));
+
+       max = 0;
+
+       f = fopen(filename, "rb");
+       if (!f) {
+         fprintf(stderr, "Failed to open %s for reading !\n", filename);
+         return NULL;
+       }
+
+       fseek(f, 0, SEEK_SET);
+       if( fscanf(f, "PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d",temp,&endian1,&endian2,signtmp,&prec,temp,&w,temp,&h) != 9){
+               fprintf(stderr, "ERROR: Failed to read the right number of element from the fscanf() function!\n");
+               return NULL;
+       }
+
+       i=0;
+       sign='+';               
+       while (signtmp[i]!='\0') {
+               if (signtmp[i]=='-') sign='-';
+               i++;
+       }
+       
+       fgetc(f);
+       if (endian1=='M' && endian2=='L') {
+               bigendian = 1;
+       } else if (endian2=='M' && endian1=='L') {
+               bigendian = 0;
+       } else {
+               fprintf(stderr, "Bad pgx header, please check input file\n");
+               return NULL;
+       }
+
+       /* initialize image component */
+
+       cmptparm.x0 = parameters->image_offset_x0;
+       cmptparm.y0 = parameters->image_offset_y0;
+       cmptparm.w = !cmptparm.x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm.x0 + (w - 1) * parameters->subsampling_dx + 1;
+       cmptparm.h = !cmptparm.y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm.y0 + (h - 1) * parameters->subsampling_dy + 1;
+       
+       if (sign == '-') {
+               cmptparm.sgnd = 1;
+       } else {
+               cmptparm.sgnd = 0;
+       }
+       if(prec < 8)
+   {
+       force8 = 1;
+       ushift = 8 - prec; dshift = prec - ushift;
+       if(cmptparm.sgnd) adjustS = (1<<(prec - 1)); else adjustS = 0;
+       cmptparm.sgnd = 0;
+       prec = 8;
+   }
+       else ushift = dshift = force8 = adjustS = 0;
+
+       cmptparm.prec = prec;
+       cmptparm.bpp = prec;
+       cmptparm.dx = parameters->subsampling_dx;
+       cmptparm.dy = parameters->subsampling_dy;
+       
+       /* create the image */
+       image = opj_image_create(numcomps, &cmptparm, color_space);
+       if(!image) {
+               fclose(f);
+               return NULL;
+       }
+       /* set image offset and reference grid */
+       image->x0 = cmptparm.x0;
+       image->y0 = cmptparm.x0;
+       image->x1 = cmptparm.w;
+       image->y1 = cmptparm.h;
+
+       /* set image data */
+
+       comp = &image->comps[0];
+
+       for (i = 0; i < w * h; i++) {
+               int v;
+               if(force8)
+          {
+               v = readuchar(f) + adjustS;
+               v = (v<<ushift) + (v>>dshift);
+               comp->data[i] = (unsigned char)v;
+
+               if(v > max) max = v;
+
+               continue;
+          }
+               if (comp->prec == 8) {
+                       if (!comp->sgnd) {
+                               v = readuchar(f);
+                       } else {
+                               v = (char) readuchar(f);
+                       }
+               } else if (comp->prec <= 16) {
+                       if (!comp->sgnd) {
+                               v = readushort(f, bigendian);
+                       } else {
+                               v = (short) readushort(f, bigendian);
+                       }
+               } else {
+                       if (!comp->sgnd) {
+                               v = readuint(f, bigendian);
+                       } else {
+                               v = (int) readuint(f, bigendian);
+                       }
+               }
+               if (v > max)
+                       max = v;
+               comp->data[i] = v;
+       }
+       fclose(f);
+       comp->bpp = int_floorlog2(max) + 1;
+
+       return image;
+}
+
+int imagetopgx(opj_image_t * image, const char *outfile) {
+       int w, h;
+       int i, j, compno;
+       FILE *fdest = NULL;
+
+       for (compno = 0; compno < image->numcomps; compno++) {
+               opj_image_comp_t *comp = &image->comps[compno];
+               char bname[256]; /* buffer for name */
+    char *name = bname; /* pointer */
+    int nbytes = 0;
+    size_t res;
+    const size_t olen = strlen(outfile);
+    const size_t dotpos = olen - 4;
+    const size_t total = dotpos + 1 + 1 + 4; /* '-' + '[1-3]' + '.pgx' */
+    if( outfile[dotpos] != '.' ) {
+      /* `pgx` was recognized but there is no dot at expected position */
+      fprintf(stderr, "ERROR -> Impossible happen." );
+      return 1;
+      }
+    if( total > 256 ) {
+      name = (char*)malloc(total+1);
+      }
+    strncpy(name, outfile, dotpos);
+               /*if (image->numcomps > 1) {*/
+                       sprintf(name+dotpos, "_%d.pgx", compno);
+               /*} else {
+                       strcpy(name+dotpos, ".pgx");
+               }*/
+               fdest = fopen(name, "wb");
+               if (!fdest) {
+                       fprintf(stderr, "ERROR -> failed to open %s for writing\n", name);
+                       return 1;
+               }
+    /* dont need name anymore */
+    if( total > 256 ) {
+      free(name);
+      }
+
+               w = image->comps[compno].w;
+               h = image->comps[compno].h;
+           
+               fprintf(fdest, "PG ML %c %d %d %d\n", comp->sgnd ? '-' : '+', comp->prec, w, h);
+               if (comp->prec <= 8) {
+                       nbytes = 1;
+               } else if (comp->prec <= 16) {
+                       nbytes = 2;
+               } else {
+                       nbytes = 4;
+               }
+               for (i = 0; i < w * h; i++) {
+                       int v = image->comps[compno].data[i];
+                       for (j = nbytes - 1; j >= 0; j--) {
+                               char byte = (char) (v >> (j * 8));
+                               res = fwrite(&byte, 1, 1, fdest);
+        if( res < 1 ) {
+          fprintf(stderr, "failed to write 1 byte for %s\n", name);
+          return 1;
+        }
+                       }
+               }
+               fclose(fdest);
+       }
+
+       return 0;
+}
+
+/* -->> -->> -->> -->>
+
+PNM IMAGE FORMAT
+
+<<-- <<-- <<-- <<-- */
+
+struct pnm_header
+{
+    int width, height, maxval, depth, format;
+    char rgb, rgba, gray, graya, bw;
+    char ok;
+};
+
+static char *skip_white(char *s)
+{
+    while(*s)
+   {
+    if(*s == '\n' || *s == '\r') return NULL;
+    if(isspace(*s)) { ++s; continue; }
+    return s;
+   }
+    return NULL;
+}
+
+static char *skip_int(char *start, int *out_n)
+{
+    char *s;
+    char c;
+
+    *out_n = 0; s = start;
+
+    s = skip_white(start);
+    if(s == NULL) return NULL;
+    start = s;
+
+    while(*s)
+   {
+    if( !isdigit(*s)) break;
+    ++s;
+   }
+    c = *s; *s = 0; *out_n = atoi(start); *s = c;
+    return s;
+}
+
+static char *skip_idf(char *start, char out_idf[256])
+{
+    char *s;
+    char c;
+
+    s = skip_white(start);
+    if(s == NULL) return NULL;
+    start = s;
+
+    while(*s)
+   {
+    if(isalpha(*s) || *s == '_') { ++s; continue; }
+    break;
+   }
+    c = *s; *s = 0; strncpy(out_idf, start, 255); *s = c;
+    return s;
+}
+
+static void read_pnm_header(FILE *reader, struct pnm_header *ph)
+{
+    char *s;
+    int format, have_wh, end, ttype;
+    char idf[256], type[256];
+    char line[256];
+
+    if (fgets(line, 250, reader) == NULL)
+    {
+       fprintf(stderr,"\nWARNING: fgets return a NULL value");
+       return;
+    }
+
+    if(line[0] != 'P')
+   {
+    fprintf(stderr,"read_pnm_header:PNM:magic P missing\n"); return;
+   }
+    format = atoi(line + 1);
+    if(format < 1 || format > 7)
+   {
+    fprintf(stderr,"read_pnm_header:magic format %d invalid\n", format);
+    return;
+   }
+    ph->format = format;
+    ttype = end = have_wh = 0;
+
+    while(fgets(line, 250, reader))
+   {
+    if(*line == '#') continue;
+
+    s = line;
+
+    if(format == 7)
+  {
+    s = skip_idf(s, idf);
+
+    if(s == NULL || *s == 0) return;
+
+    if(strcmp(idf, "ENDHDR") == 0)
+ {
+    end = 1; break;
+ }
+    if(strcmp(idf, "WIDTH") == 0)
+ {
+    s = skip_int(s, &ph->width);
+    if(s == NULL || *s == 0) return;
+
+    continue;
+ }
+    if(strcmp(idf, "HEIGHT") == 0)
+ {
+    s = skip_int(s, &ph->height);
+    if(s == NULL || *s == 0) return;
+
+    continue;
+ }
+    if(strcmp(idf, "DEPTH") == 0)
+ {
+    s = skip_int(s, &ph->depth);
+    if(s == NULL || *s == 0) return;
+
+    continue;
+ }
+    if(strcmp(idf, "MAXVAL") == 0)
+ {
+    s = skip_int(s, &ph->maxval);
+    if(s == NULL || *s == 0) return;
+
+    continue;
+ }
+    if(strcmp(idf, "TUPLTYPE") == 0)
+ {
+    s = skip_idf(s, type);
+    if(s == NULL || *s == 0) return;
+
+        if(strcmp(type, "BLACKANDWHITE") == 0)
+       {
+        ph->bw = 1; ttype = 1; continue;
+       }
+        if(strcmp(type, "GRAYSCALE") == 0)
+       {
+        ph->gray = 1; ttype = 1; continue;
+       }
+        if(strcmp(type, "GRAYSCALE_ALPHA") == 0)
+       {
+        ph->graya = 1; ttype = 1; continue;
+       }
+        if(strcmp(type, "RGB") == 0)
+       {
+        ph->rgb = 1; ttype = 1; continue;
+       }
+        if(strcmp(type, "RGB_ALPHA") == 0)
+       {
+        ph->rgba = 1; ttype = 1; continue;
+       }
+    fprintf(stderr,"read_pnm_header:unknown P7 TUPLTYPE %s\n",type);
+    return;
+ }
+    fprintf(stderr,"read_pnm_header:unknown P7 idf %s\n",idf);
+    return;
+  } /* if(format == 7) */
+
+    if( !have_wh)
+  {
+    s = skip_int(s, &ph->width);
+
+    s = skip_int(s, &ph->height);
+
+    have_wh = 1;
+
+    if(format == 1 || format == 4) break;
+
+    continue;
+  }
+    if(format == 2 || format == 3 || format == 5 || format == 6)
+  {
+/* P2, P3, P5, P6: */
+    s = skip_int(s, &ph->maxval);
+
+    if(ph->maxval > 65535) return;
+  }
+    break;
+   }/* while(fgets( ) */
+    if(format == 2 || format == 3 || format > 4)
+   {
+    if(ph->maxval < 1 || ph->maxval > 65535) return;
+   }
+    if(ph->width < 1 || ph->height < 1) return;
+
+    if(format == 7)
+   {
+    if(!end)
+  {
+    fprintf(stderr,"read_pnm_header:P7 without ENDHDR\n"); return;
+  }
+    if(ph->depth < 1 || ph->depth > 4) return;
+
+    if(ph->width && ph->height && ph->depth & ph->maxval && ttype)
+     ph->ok = 1;
+   }
+    else
+   {
+    if(format != 1 && format != 4)
+  {
+    if(ph->width && ph->height && ph->maxval) ph->ok = 1;
+  }
+    else
+  {
+    if(ph->width && ph->height) ph->ok = 1;
+    ph->maxval = 255;
+  }
+   }
+}
+
+static int has_prec(int val)
+{
+    if(val < 2) return 1;
+    if(val < 4) return 2;
+    if(val < 8) return 3;
+    if(val < 16) return 4;
+    if(val < 32) return 5;
+    if(val < 64) return 6;
+    if(val < 128) return 7;
+    if(val < 256) return 8;
+    if(val < 512) return 9;
+    if(val < 1024) return 10;
+    if(val < 2048) return 11;
+    if(val < 4096) return 12;
+    if(val < 8192) return 13;
+    if(val < 16384) return 14;
+    if(val < 32768) return 15;
+    return 16;
+}
+
+opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) {
+       int subsampling_dx = parameters->subsampling_dx;
+       int subsampling_dy = parameters->subsampling_dy;
+
+       FILE *fp = NULL;
+       int i, compno, numcomps, w, h, prec, format;
+       OPJ_COLOR_SPACE color_space;
+       opj_image_cmptparm_t cmptparm[4]; /* RGBA: max. 4 components */
+       opj_image_t * image = NULL;
+       struct pnm_header header_info;
+       
+       if((fp = fopen(filename, "rb")) == NULL)
+   {
+       fprintf(stderr, "pnmtoimage:Failed to open %s for reading!\n",filename);
+       return NULL;
+   }
+       memset(&header_info, 0, sizeof(struct pnm_header));
+
+       read_pnm_header(fp, &header_info);
+
+       if(!header_info.ok) { fclose(fp); return NULL; }
+
+       format = header_info.format;
+
+    switch(format)
+   {
+    case 1: /* ascii bitmap */
+    case 4: /* raw bitmap */
+        numcomps = 1;
+        break;
+
+    case 2: /* ascii greymap */
+    case 5: /* raw greymap */
+        numcomps = 1;
+        break;
+
+    case 3: /* ascii pixmap */
+    case 6: /* raw pixmap */
+        numcomps = 3;
+        break;
+
+    case 7: /* arbitrary map */
+        numcomps = header_info.depth;
+               break;
+
+    default: fclose(fp); return NULL;
+   }
+    if(numcomps < 3)
+     color_space = CLRSPC_GRAY;/* GRAY, GRAYA */
+    else
+     color_space = CLRSPC_SRGB;/* RGB, RGBA */
+
+    prec = has_prec(header_info.maxval);
+
+       if(prec < 8) prec = 8;
+
+    w = header_info.width;
+    h = header_info.height;
+    subsampling_dx = parameters->subsampling_dx;
+    subsampling_dy = parameters->subsampling_dy;
+
+    memset(&cmptparm[0], 0, numcomps * sizeof(opj_image_cmptparm_t));
+
+    for(i = 0; i < numcomps; i++)
+   {
+    cmptparm[i].prec = prec;
+    cmptparm[i].bpp = prec;
+    cmptparm[i].sgnd = 0;
+    cmptparm[i].dx = subsampling_dx;
+    cmptparm[i].dy = subsampling_dy;
+    cmptparm[i].w = w;
+    cmptparm[i].h = h;
+   }
+    image = opj_image_create(numcomps, &cmptparm[0], color_space);
+
+    if(!image) { fclose(fp); return NULL; }
+
+/* set image offset and reference grid */
+       image->x0 = parameters->image_offset_x0;
+       image->y0 = parameters->image_offset_y0;
+       image->x1 = parameters->image_offset_x0 + (w - 1) *     subsampling_dx + 1;
+       image->y1 = parameters->image_offset_y0 + (h - 1) *     subsampling_dy + 1;
+
+    if((format == 2) || (format == 3)) /* ascii pixmap */
+   {
+    unsigned int index;
+
+    for (i = 0; i < w * h; i++)
+  {
+    for(compno = 0; compno < numcomps; compno++)
+ {
+       index = 0;
+    if (fscanf(fp, "%u", &index) != 1)
+       fprintf(stderr, "\nWARNING: fscanf return a number of element different from the expected.\n");
+
+    image->comps[compno].data[i] = (index * 255)/header_info.maxval;
+ }
+  }
+   }
+    else
+    if((format == 5)
+    || (format == 6)
+    ||((format == 7)
+        && (   header_info.gray || header_info.graya
+            || header_info.rgb || header_info.rgba)))/* binary pixmap */
+   {
+    unsigned char c0, c1, one;
+
+    one = (prec < 9); 
+
+    for (i = 0; i < w * h; i++)
+  {
+    for(compno = 0; compno < numcomps; compno++)
+ {
+         if ( !fread(&c0, 1, 1, fp) )
+                 fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+        if(one)
+       {
+        image->comps[compno].data[i] = c0;
+       }
+        else
+       {
+         if ( !fread(&c1, 1, 1, fp) )
+                 fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+/* netpbm: */
+               image->comps[compno].data[i] = ((c0<<8) | c1);
+       }
+ }
+  }
+   }
+    else
+    if(format == 1) /* ascii bitmap */
+   {
+    for (i = 0; i < w * h; i++)
+  {
+    unsigned int index;
+
+    if ( fscanf(fp, "%u", &index) != 1)
+       fprintf(stderr, "\nWARNING: fscanf return a number of element different from the expected.\n");
+
+    image->comps[0].data[i] = (index?0:255);
+  }
+   }
+    else
+    if(format == 4)
+   {
+    int x, y, bit;
+    unsigned char uc;
+
+    i = 0;
+    for(y = 0; y < h; ++y)
+  {
+    bit = -1; uc = 0;
+
+    for(x = 0; x < w; ++x)
+ {
+        if(bit == -1)
+       {
+        bit = 7;
+        uc = (unsigned char)getc(fp);
+       }
+    image->comps[0].data[i] = (((uc>>bit) & 1)?0:255);
+    --bit; ++i;
+ }
+  }
+   }
+       else
+       if((format == 7 && header_info.bw)) /*MONO*/
+   {
+       unsigned char uc;
+
+       for(i = 0; i < w * h; ++i)
+  {
+         if ( !fread(&uc, 1, 1, fp) )
+                 fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
+       image->comps[0].data[i] = (uc & 1)?0:255;
+  }
+   }
+    fclose(fp);
+
+    return image;
+}/* pnmtoimage() */
+
+int imagetopnm(opj_image_t * image, const char *outfile) 
+{
+       int *red, *green, *blue, *alpha;
+       int wr, hr, max;
+       int i, compno, ncomp;
+       int adjustR, adjustG, adjustB, adjustA;
+       int fails, two, want_gray, has_alpha, triple;
+       int prec, v;
+       FILE *fdest = NULL;
+       const char *tmp = outfile;
+       char *destname;
+  alpha = NULL;
+    if((prec = image->comps[0].prec) > 16)
+   {
+       fprintf(stderr,"%s:%d:imagetopnm\n\tprecision %d is larger than 16"
+       "\n\t: refused.\n",__FILE__,__LINE__,prec);
+       return 1;
+   }
+    two = has_alpha = 0; fails = 1;
+       ncomp = image->numcomps;
+
+       while (*tmp) ++tmp; tmp -= 2; 
+       want_gray = (*tmp == 'g' || *tmp == 'G'); 
+       ncomp = image->numcomps;
+
+       if(want_gray) ncomp = 1;
+
+       if (ncomp == 2 /* GRAYA */
+       || (ncomp > 2 /* RGB, RGBA */
+               && image->comps[0].dx == image->comps[1].dx
+               && image->comps[1].dx == image->comps[2].dx
+               && image->comps[0].dy == image->comps[1].dy
+               && image->comps[1].dy == image->comps[2].dy
+               && image->comps[0].prec == image->comps[1].prec
+               && image->comps[1].prec == image->comps[2].prec
+          ))
+   {
+       fdest = fopen(outfile, "wb");
+
+       if (!fdest) 
+  {
+       fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile);
+       return fails;
+  }
+       two = (prec > 8);
+       triple = (ncomp > 2);
+       wr = image->comps[0].w; hr = image->comps[0].h;
+       max = (1<<prec) - 1; has_alpha = (ncomp == 4 || ncomp == 2);
+
+    red = image->comps[0].data;
+
+       if(triple)
+  {
+    green = image->comps[1].data;
+    blue = image->comps[2].data;
+  }
+       else green = blue = NULL;
+       
+       if(has_alpha)
+  {
+       const char *tt = (triple?"RGB_ALPHA":"GRAYSCALE_ALPHA");
+
+       fprintf(fdest, "P7\n# OpenJPEG-%s\nWIDTH %d\nHEIGHT %d\nDEPTH %d\n"
+               "MAXVAL %d\nTUPLTYPE %s\nENDHDR\n", opj_version(),
+               wr, hr, ncomp, max, tt);
+       alpha = image->comps[ncomp - 1].data;
+       adjustA = (image->comps[ncomp - 1].sgnd ?
+        1 << (image->comps[ncomp - 1].prec - 1) : 0);
+  }
+       else
+  {
+       fprintf(fdest, "P6\n# OpenJPEG-%s\n%d %d\n%d\n", 
+               opj_version(), wr, hr, max);
+       adjustA = 0;
+  }
+    adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+
+       if(triple)
+  {
+    adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0);
+    adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0);
+  }
+       else adjustG = adjustB = 0;
+
+    for(i = 0; i < wr * hr; ++i)
+  {
+       if(two)
+ {
+       v = *red + adjustR; ++red;
+/* netpbm: */
+       fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v);
+
+               if(triple)
+          {
+               v = *green + adjustG; ++green;
+/* netpbm: */
+               fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v);
+
+               v =  *blue + adjustB; ++blue;
+/* netpbm: */
+               fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v);
+
+          }/* if(triple) */
+
+        if(has_alpha)
+       {
+        v = *alpha + adjustA; ++alpha;
+/* netpbm: */
+               fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v);
+       }
+        continue;
+
+ }     /* if(two) */
+
+/* prec <= 8: */
+
+       fprintf(fdest, "%c", (unsigned char)*red++);
+       if(triple)
+        fprintf(fdest, "%c%c",(unsigned char)*green++, (unsigned char)*blue++);
+
+       if(has_alpha)
+        fprintf(fdest, "%c", (unsigned char)*alpha++);
+
+  }    /* for(i */
+
+       fclose(fdest); return 0;
+   }
+
+/* YUV or MONO: */
+
+       if (image->numcomps > ncomp) 
+   {
+       fprintf(stderr,"WARNING -> [PGM file] Only the first component\n");
+       fprintf(stderr,"           is written to the file\n");
+   }
+       destname = (char*)malloc(strlen(outfile) + 8);
+
+       for (compno = 0; compno < ncomp; compno++) 
+   {
+       if (ncomp > 1) 
+        sprintf(destname, "%d.%s", compno, outfile);
+       else
+        sprintf(destname, "%s", outfile);
+
+       fdest = fopen(destname, "wb");
+       if (!fdest) 
+  {
+       fprintf(stderr, "ERROR -> failed to open %s for writing\n", destname);
+       free(destname);
+       return 1;
+  }
+       wr = image->comps[compno].w; hr = image->comps[compno].h;
+       prec = image->comps[compno].prec;
+       max = (1<<prec) - 1;
+
+       fprintf(fdest, "P5\n#OpenJPEG-%s\n%d %d\n%d\n", 
+               opj_version(), wr, hr, max);
+
+       red = image->comps[compno].data;
+       adjustR = 
+       (image->comps[compno].sgnd ? 1 << (image->comps[compno].prec - 1) : 0);
+
+    if(prec > 8)
+  {
+       for (i = 0; i < wr * hr; i++) 
+ {
+       v = *red + adjustR; ++red;
+/* netpbm: */
+       fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v);
+
+        if(has_alpha)
+      {
+        v = *alpha++;
+/* netpbm: */
+               fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v);
+      }
+ }/* for(i */
+  }
+       else /* prec <= 8 */
+  {
+       for(i = 0; i < wr * hr; ++i)
+ {
+        fprintf(fdest, "%c", (unsigned char)(*red + adjustR)); ++red;
+ }
+  }
+       fclose(fdest);
+   } /* for (compno */
+       free(destname);
+
+       return 0;
+}/* imagetopnm() */
+
+#ifdef HAVE_LIBTIFF
+/* -->> -->> -->> -->>
+
+       TIFF IMAGE FORMAT
+
+ <<-- <<-- <<-- <<-- */
+
+int imagetotif(opj_image_t * image, const char *outfile) 
+{
+       int width, height, imgsize;
+       int bps,index,adjust, sgnd;
+       int ushift, dshift, has_alpha, force16;
+       TIFF *tif;
+       tdata_t buf;
+       tstrip_t strip;
+       tsize_t strip_size;
+
+       ushift = dshift = force16 = has_alpha = 0;
+       bps = image->comps[0].prec;
+
+       if(bps > 8 && bps < 16)
+   {
+       ushift = 16 - bps; dshift = bps - ushift;
+       bps = 16; force16 = 1;
+   }
+
+       if(bps != 8 && bps != 16)
+   {
+       fprintf(stderr,"imagetotif: Bits=%d, Only 8 and 16 bits implemented\n",
+        bps);
+       fprintf(stderr,"\tAborting\n");
+       return 1;
+   }
+       tif = TIFFOpen(outfile, "wb");
+
+       if (!tif) 
+   {
+       fprintf(stderr, "imagetotif:failed to open %s for writing\n", outfile);
+       return 1;
+   }
+       sgnd = image->comps[0].sgnd;
+       adjust = sgnd ? 1 << (image->comps[0].prec - 1) : 0;
+
+       if(image->numcomps >= 3 
+       && image->comps[0].dx == image->comps[1].dx
+       && image->comps[1].dx == image->comps[2].dx
+       && image->comps[0].dy == image->comps[1].dy
+       && image->comps[1].dy == image->comps[2].dy
+       && image->comps[0].prec == image->comps[1].prec
+       && image->comps[1].prec == image->comps[2].prec) 
+   {
+       has_alpha = (image->numcomps == 4);
+
+       width   = image->comps[0].w;
+       height  = image->comps[0].h;
+       imgsize = width * height ;
+       TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width);
+       TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height);
+       TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3 + has_alpha);
+       TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps);
+       TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
+       TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
+       TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
+       TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
+       strip_size = TIFFStripSize(tif);
+       buf = _TIFFmalloc(strip_size);
+       index=0;
+
+       for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) 
+  {
+       unsigned char *dat8;
+       tsize_t i, ssize, last_i = 0;
+  int step, restx;
+       ssize = TIFFStripSize(tif);
+       dat8 = (unsigned char*)buf;
+
+       if(bps == 8)
+ {
+       step = 3 + has_alpha;
+       restx = step - 1;
+
+               for(i=0; i < ssize - restx; i += step) 
+          {    
+               int r, g, b, a = 0;
+
+               if(index < imgsize)
+         {
+               r = image->comps[0].data[index];
+               g = image->comps[1].data[index];
+               b = image->comps[2].data[index];
+               if(has_alpha) a = image->comps[3].data[index];
+
+               if(sgnd)
+        {
+               r += adjust;
+               g += adjust;
+               b += adjust;
+               if(has_alpha) a += adjust;
+        }
+               dat8[i+0] = r ;
+               dat8[i+1] = g ;
+               dat8[i+2] = b ;
+               if(has_alpha) dat8[i+3] = a;
+
+               index++;
+               last_i = i + step;
+         }
+               else
+                break;
+          }/*for(i = 0;)*/
+
+               if(last_i < ssize)
+          {
+               for(i = last_i; i < ssize; i += step) 
+         { 
+               int r, g, b, a = 0;
+
+               if(index < imgsize)
+        {
+               r = image->comps[0].data[index];
+               g = image->comps[1].data[index];
+               b = image->comps[2].data[index];
+               if(has_alpha) a = image->comps[3].data[index];
+
+               if(sgnd)
+       {
+               r += adjust;
+               g += adjust;
+               b += adjust;
+               if(has_alpha) a += adjust;
+       }
+               dat8[i+0] = r ;
+               if(i+1 < ssize) dat8[i+1] = g ;  else break;
+               if(i+2 < ssize) dat8[i+2] = b ;  else break;
+               if(has_alpha)
+       {
+               if(i+3 < ssize) dat8[i+3] = a ;  else break;
+       }
+               index++;
+        }
+               else
+                break;
+         }/*for(i)*/
+          }/*if(last_i < ssize)*/
+
+ }     /*if(bps == 8)*/
+       else 
+       if(bps == 16)
+ {
+       step = 6 + has_alpha + has_alpha;
+       restx = step - 1;
+
+               for(i = 0; i < ssize - restx ; i += step) 
+          {  
+               int r, g, b, a = 0;
+
+               if(index < imgsize)
+         {
+               r = image->comps[0].data[index];
+               g = image->comps[1].data[index];
+               b = image->comps[2].data[index];
+               if(has_alpha) a = image->comps[3].data[index];
+
+               if(sgnd)
+        {
+               r += adjust;
+               g += adjust;
+               b += adjust;
+               if(has_alpha) a += adjust;
+        }
+               if(force16) 
+        { 
+               r = (r<<ushift) + (r>>dshift); 
+               g = (g<<ushift) + (g>>dshift); 
+               b = (b<<ushift) + (b>>dshift); 
+               if(has_alpha) a = (a<<ushift) + (a>>dshift);
+        }
+               dat8[i+0] =  r;/*LSB*/
+               dat8[i+1] = (r >> 8);/*MSB*/
+               dat8[i+2] =  g;
+               dat8[i+3] = (g >> 8);
+               dat8[i+4] =  b;
+               dat8[i+5] = (b >> 8);
+               if(has_alpha) 
+        { 
+               dat8[i+6] =  a; 
+               dat8[i+7] = (a >> 8); 
+        }
+               index++;
+               last_i = i + step;
+         }
+               else
+                break;
+          }/*for(i = 0;)*/
+
+               if(last_i < ssize)
+          {
+               for(i = last_i ; i < ssize ; i += step) 
+         {    
+               int r, g, b, a = 0;
+
+               if(index < imgsize)
+        {
+               r = image->comps[0].data[index];
+               g = image->comps[1].data[index];
+               b = image->comps[2].data[index];
+               if(has_alpha) a = image->comps[3].data[index];
+
+               if(sgnd)
+       {
+               r += adjust;
+               g += adjust;
+               b += adjust;
+               if(has_alpha) a += adjust;
+       }
+           if(force16)
+       {
+           r = (r<<ushift) + (r>>dshift);
+           g = (g<<ushift) + (g>>dshift);
+           b = (b<<ushift) + (b>>dshift);
+           if(has_alpha) a = (a<<ushift) + (a>>dshift);
+       }
+               dat8[i+0] =  r;/*LSB*/
+               if(i+1 < ssize) dat8[i+1] = (r >> 8);else break;/*MSB*/
+               if(i+2 < ssize) dat8[i+2] =  g;      else break;
+               if(i+3 < ssize) dat8[i+3] = (g >> 8);else break;
+               if(i+4 < ssize) dat8[i+4] =  b;      else break;
+               if(i+5 < ssize) dat8[i+5] = (b >> 8);else break;
+
+               if(has_alpha)
+       {
+               if(i+6 < ssize) dat8[i+6] = a; else break;
+               if(i+7 < ssize) dat8[i+7] = (a >> 8); else break;
+       }
+               index++;
+        }
+               else
+                break;
+         }/*for(i)*/
+          }/*if(last_i < ssize)*/
+
+ }/*if(bps == 16)*/
+       (void)TIFFWriteEncodedStrip(tif, strip, (void*)buf, strip_size);
+  }/*for(strip = 0; )*/
+
+       _TIFFfree((void*)buf);
+       TIFFClose(tif);
+
+       return 0;
+   }/*RGB(A)*/
+
+       if(image->numcomps == 1 /* GRAY */
+       || (   image->numcomps == 2 /* GRAY_ALPHA */
+               && image->comps[0].dx == image->comps[1].dx
+               && image->comps[0].dy == image->comps[1].dy
+               && image->comps[0].prec == image->comps[1].prec))
+   {
+       int step;
+
+       has_alpha = (image->numcomps == 2);
+
+       width   = image->comps[0].w;
+       height  = image->comps[0].h;
+       imgsize = width * height;
+
+/* Set tags */
+       TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width);
+       TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height);
+       TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1 + has_alpha);
+       TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps);
+       TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
+       TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
+       TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+       TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
+
+/* Get a buffer for the data */
+       strip_size = TIFFStripSize(tif);
+       buf = _TIFFmalloc(strip_size);
+       index = 0;
+
+       for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) 
+  {
+       unsigned char *dat8;
+       tsize_t i, ssize = TIFFStripSize(tif);
+       dat8 = (unsigned char*)buf;
+
+       if(bps == 8)
+ {
+       step = 1 + has_alpha;
+
+               for(i=0; i < ssize; i += step) 
+          { 
+               if(index < imgsize)
+         {
+               int r, a = 0;
+
+               r = image->comps[0].data[index];
+               if(has_alpha) a = image->comps[1].data[index];
+
+               if(sgnd)
+        {
+               r += adjust;
+               if(has_alpha) a += adjust;
+        }
+               dat8[i+0] = r;
+               if(has_alpha) dat8[i+1] = a;
+               index++;
+        }
+               else
+                break;
+         }/*for(i )*/
+ }/*if(bps == 8*/
+       else 
+       if(bps == 16)
+ {
+       step = 2 + has_alpha + has_alpha;
+
+               for(i=0; i < ssize; i += step) 
+          {
+               if(index < imgsize)
+         {
+               int r, a = 0;
+
+               r = image->comps[0].data[index];
+               if(has_alpha) a = image->comps[1].data[index];
+
+               if(sgnd)
+        {
+               r += adjust;
+               if(has_alpha) a += adjust;
+        }
+               if(force16)
+        {
+               r = (r<<ushift) + (r>>dshift);
+               if(has_alpha) a = (a<<ushift) + (a>>dshift);
+        }
+               dat8[i+0] = r;/*LSB*/
+               dat8[i+1] = r >> 8;/*MSB*/
+               if(has_alpha)
+        {
+               dat8[i+2] = a;
+               dat8[i+3] = a >> 8;
+        }
+               index++;
+         }/*if(index < imgsize)*/
+               else
+                break;
+          }/*for(i )*/
+ }
+       (void)TIFFWriteEncodedStrip(tif, strip, (void*)buf, strip_size);
+  }/*for(strip*/
+
+       _TIFFfree(buf);
+       TIFFClose(tif);
+
+       return 0;
+   }
+
+       TIFFClose(tif);
+
+       fprintf(stderr,"imagetotif: Bad color format.\n"
+        "\tOnly RGB(A) and GRAY(A) has been implemented\n");
+       fprintf(stderr,"\tFOUND: numcomps(%d)\n\tAborting\n",
+        image->numcomps);
+
+       return 1;
+}/* imagetotif() */
+
+/*
+ * libtiff/tif_getimage.c : 1,2,4,8,16 bitspersample accepted
+ * CINEMA                 : 12 bit precision
+*/
+opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
+{
+       int subsampling_dx = parameters->subsampling_dx;
+       int subsampling_dy = parameters->subsampling_dy;
+       TIFF *tif;
+       tdata_t buf;
+       tstrip_t strip;
+       tsize_t strip_size;
+       int j, numcomps, w, h,index;
+       OPJ_COLOR_SPACE color_space;
+       opj_image_cmptparm_t cmptparm[4]; /* RGBA */
+       opj_image_t *image = NULL;
+       int imgsize = 0;
+       int has_alpha = 0;
+       unsigned short tiBps, tiPhoto, tiSf, tiSpp, tiPC;
+       unsigned int tiWidth, tiHeight;
+
+       tif = TIFFOpen(filename, "r");
+
+       if(!tif) 
+   {
+       fprintf(stderr, "tiftoimage:Failed to open %s for reading\n", filename);
+       return 0;
+   }
+       tiBps = tiPhoto = tiSf = tiSpp = tiPC = 0;
+       tiWidth = tiHeight = 0;
+
+       TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &tiWidth);
+       TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &tiHeight);
+       TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &tiBps);
+       TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &tiSf);
+       TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &tiSpp);
+       TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &tiPhoto);
+       TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &tiPC);
+       w= tiWidth;
+       h= tiHeight;
+
+   {
+       unsigned short b = tiBps, p = tiPhoto;
+
+       if(tiBps != 8 && tiBps != 16 && tiBps != 12) b = 0;
+       if(tiPhoto != 1 && tiPhoto != 2) p = 0;
+
+    if( !b || !p)
+  {
+       if( !b)
+     fprintf(stderr,"imagetotif: Bits=%d, Only 8 and 16 bits"
+      " implemented\n",tiBps);
+       else
+       if( !p)
+     fprintf(stderr,"tiftoimage: Bad color format %d.\n\tOnly RGB(A)"
+      " and GRAY(A) has been implemented\n",(int) tiPhoto);
+
+    fprintf(stderr,"\tAborting\n");
+       TIFFClose(tif);
+
+    return NULL;
+  }
+   }
+   {/* From: tiff-4.0.x/libtiff/tif_getimage.c : */
+       uint16* sampleinfo;
+       uint16 extrasamples;
+
+       TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES,
+        &extrasamples, &sampleinfo);
+
+       if(extrasamples >= 1)
+  {
+       switch(sampleinfo[0]) 
+ {
+       case EXTRASAMPLE_UNSPECIFIED: 
+/* Workaround for some images without correct info about alpha channel
+*/
+               if(tiSpp > 3)
+                has_alpha = 1;
+               break;
+
+       case EXTRASAMPLE_ASSOCALPHA: /* data pre-multiplied */
+       case EXTRASAMPLE_UNASSALPHA: /* data not pre-multiplied */
+               has_alpha = 1;
+               break;
+ }
+  }
+       else /* extrasamples == 0 */
+        if(tiSpp == 4 || tiSpp == 2) has_alpha = 1;
+   }
+
+/* initialize image components
+*/ 
+       memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t));
+
+       if(tiPhoto == PHOTOMETRIC_RGB) /* RGB(A) */
+   {
+       numcomps = 3 + has_alpha;
+       color_space = CLRSPC_SRGB;
+
+       for(j = 0; j < numcomps; j++) 
+  {
+       if(parameters->cp_cinema) 
+ {
+       cmptparm[j].prec = 12;
+       cmptparm[j].bpp = 12;
+ }
+       else
+ {
+       cmptparm[j].prec = tiBps;
+       cmptparm[j].bpp = tiBps;
+ }
+       cmptparm[j].dx = subsampling_dx;
+       cmptparm[j].dy = subsampling_dy;
+       cmptparm[j].w = w;
+       cmptparm[j].h = h;
+  }
+
+       image = opj_image_create(numcomps, &cmptparm[0], color_space);
+
+       if(!image) 
+  {
+       TIFFClose(tif);
+       return NULL;
+  }
+/* set image offset and reference grid 
+*/
+       image->x0 = parameters->image_offset_x0;
+       image->y0 = parameters->image_offset_y0;
+       image->x1 =     !image->x0 ? (w - 1) * subsampling_dx + 1 :
+               image->x0 + (w - 1) * subsampling_dx + 1;
+       image->y1 =     !image->y0 ? (h - 1) * subsampling_dy + 1 :
+               image->y0 + (h - 1) * subsampling_dy + 1;
+
+       buf = _TIFFmalloc(TIFFStripSize(tif));
+
+       strip_size=TIFFStripSize(tif);
+       index = 0;
+       imgsize = image->comps[0].w * image->comps[0].h ;
+/* Read the Image components
+*/
+       for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) 
+  {
+       unsigned char *dat8;
+       int step;
+       tsize_t i, ssize;
+       ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size);
+       dat8 = (unsigned char*)buf;
+
+       if(tiBps == 16)
+ {
+       step = 6 + has_alpha + has_alpha;
+
+               for(i = 0; i < ssize; i += step) 
+          {
+               if(index < imgsize)
+         {
+               image->comps[0].data[index] = ( dat8[i+1] << 8 ) | dat8[i+0]; /* R */
+               image->comps[1].data[index] = ( dat8[i+3] << 8 ) | dat8[i+2]; /* G */
+               image->comps[2].data[index] = ( dat8[i+5] << 8 ) | dat8[i+4]; /* B */
+               if(has_alpha)
+                image->comps[3].data[index] = ( dat8[i+7] << 8 ) | dat8[i+6];
+
+               if(parameters->cp_cinema)
+        {
+/* Rounding 16 to 12 bits
+*/
+               image->comps[0].data[index] = 
+                       (image->comps[0].data[index] + 0x08) >> 4 ;
+               image->comps[1].data[index] = 
+                       (image->comps[1].data[index] + 0x08) >> 4 ;
+               image->comps[2].data[index] = 
+                       (image->comps[2].data[index] + 0x08) >> 4 ;
+               if(has_alpha)
+                image->comps[3].data[index] =
+                       (image->comps[3].data[index] + 0x08) >> 4 ;
+        }
+               index++;
+         }
+               else
+                break;
+          }/*for(i = 0)*/
+ }/*if(tiBps == 16)*/
+       else 
+       if(tiBps == 8)
+ {
+       step = 3 + has_alpha;
+
+               for(i = 0; i < ssize; i += step) 
+          {
+               if(index < imgsize)
+         {
+               image->comps[0].data[index] = dat8[i+0];/* R */
+               image->comps[1].data[index] = dat8[i+1];/* G */
+               image->comps[2].data[index] = dat8[i+2];/* B */
+               if(has_alpha)
+                image->comps[3].data[index] = dat8[i+3];
+
+               if(parameters->cp_cinema)
+        {
+/* Rounding 8 to 12 bits
+*/
+               image->comps[0].data[index] = image->comps[0].data[index] << 4 ;
+               image->comps[1].data[index] = image->comps[1].data[index] << 4 ;
+               image->comps[2].data[index] = image->comps[2].data[index] << 4 ;
+               if(has_alpha)
+                image->comps[3].data[index] = image->comps[3].data[index] << 4 ;
+        }
+               index++;
+         }/*if(index*/
+               else
+                break;
+          }/*for(i )*/
+ }/*if( tiBps == 8)*/
+       else
+       if(tiBps == 12)/* CINEMA file */
+ {
+       step = 9;
+
+               for(i = 0; i < ssize; i += step) 
+          {
+               if((index < imgsize)&(index+1 < imgsize))
+         {
+               image->comps[0].data[index]   = ( dat8[i+0]<<4 )        |(dat8[i+1]>>4);
+               image->comps[1].data[index]   = ((dat8[i+1]& 0x0f)<< 8) | dat8[i+2];
+
+               image->comps[2].data[index]   = ( dat8[i+3]<<4)         |(dat8[i+4]>>4);
+               image->comps[0].data[index+1] = ((dat8[i+4]& 0x0f)<< 8) | dat8[i+5];
+
+               image->comps[1].data[index+1] = ( dat8[i+6] <<4)        |(dat8[i+7]>>4);
+               image->comps[2].data[index+1] = ((dat8[i+7]& 0x0f)<< 8) | dat8[i+8];
+
+               index += 2;
+         }
+               else
+                break;
+          }/*for(i )*/
+ }
+  }/*for(strip = 0; )*/
+
+       _TIFFfree(buf);
+       TIFFClose(tif);
+
+       return image;
+   }/*RGB(A)*/
+
+       if(tiPhoto == PHOTOMETRIC_MINISBLACK) /* GRAY(A) */
+   {
+       numcomps = 1 + has_alpha;
+       color_space = CLRSPC_GRAY;
+
+       for(j = 0; j < numcomps; ++j)
+  {
+       cmptparm[j].prec = tiBps;
+       cmptparm[j].bpp = tiBps;
+       cmptparm[j].dx = subsampling_dx;
+       cmptparm[j].dy = subsampling_dy;
+       cmptparm[j].w = w;
+       cmptparm[j].h = h;
+  }
+       image = opj_image_create(numcomps, &cmptparm[0], color_space);
+
+       if(!image) 
+  {
+       TIFFClose(tif);
+       return NULL;
+  }
+/* set image offset and reference grid 
+*/
+       image->x0 = parameters->image_offset_x0;
+       image->y0 = parameters->image_offset_y0;
+       image->x1 =     !image->x0 ? (w - 1) * subsampling_dx + 1 :
+               image->x0 + (w - 1) * subsampling_dx + 1;
+       image->y1 =     !image->y0 ? (h - 1) * subsampling_dy + 1 :
+               image->y0 + (h - 1) * subsampling_dy + 1;
+
+       buf = _TIFFmalloc(TIFFStripSize(tif));
+
+       strip_size = TIFFStripSize(tif);
+       index = 0;
+       imgsize = image->comps[0].w * image->comps[0].h ;
+/* Read the Image components
+*/
+       for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) 
+  {
+       unsigned char *dat8;
+       tsize_t i, ssize;
+       int step;
+
+       ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size);
+       dat8 = (unsigned char*)buf;
+
+               if(tiBps == 16)
+          {
+               step = 2 + has_alpha + has_alpha;
+
+               for(i = 0; i < ssize; i += step) 
+         {
+               if(index < imgsize)
+        {
+               image->comps[0].data[index] = ( dat8[i+1] << 8 ) | dat8[i+0];
+               if(has_alpha)
+                image->comps[1].data[index] = ( dat8[i+3] << 8 ) | dat8[i+2];
+               index++;
+        }
+               else
+                break;
+         }/*for(i )*/
+          }
+               else 
+               if(tiBps == 8)
+          {
+               step = 1 + has_alpha;
+
+               for(i = 0; i < ssize; i += step) 
+         {
+               if(index < imgsize)
+        {
+               image->comps[0].data[index] = dat8[i+0];
+               if(has_alpha)
+                image->comps[1].data[index] = dat8[i+1];
+               index++;
+        }
+               else
+                break;
+         }/*for(i )*/
+          }
+  }/*for(strip = 0;*/
+
+       _TIFFfree(buf);
+       TIFFClose(tif);
+
+   }/*GRAY(A)*/
+
+       return image;
+
+}/* tiftoimage() */
+
+#endif /* HAVE_LIBTIFF */
+
+/* -->> -->> -->> -->>
+
+       RAW IMAGE FORMAT
+
+ <<-- <<-- <<-- <<-- */
+
+opj_image_t* rawtoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp) {
+       int subsampling_dx = parameters->subsampling_dx;
+       int subsampling_dy = parameters->subsampling_dy;
+
+       FILE *f = NULL;
+       int i, compno, numcomps, w, h;
+       OPJ_COLOR_SPACE color_space;
+       opj_image_cmptparm_t *cmptparm; 
+       opj_image_t * image = NULL;
+       unsigned short ch;
+       
+       if((! (raw_cp->rawWidth & raw_cp->rawHeight & raw_cp->rawComp & raw_cp->rawBitDepth)) == 0)
+       {
+               fprintf(stderr,"\nError: invalid raw image parameters\n");
+               fprintf(stderr,"Please use the Format option -F:\n");
+               fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n");
+               fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n");
+               fprintf(stderr,"Aborting\n");
+               return NULL;
+       }
+
+       f = fopen(filename, "rb");
+       if (!f) {
+               fprintf(stderr, "Failed to open %s for reading !!\n", filename);
+               fprintf(stderr,"Aborting\n");
+               return NULL;
+       }
+       numcomps = raw_cp->rawComp;
+       color_space = CLRSPC_SRGB;
+       w = raw_cp->rawWidth;
+       h = raw_cp->rawHeight;
+       cmptparm = (opj_image_cmptparm_t*) malloc(numcomps * sizeof(opj_image_cmptparm_t));
+       
+       /* initialize image components */       
+       memset(&cmptparm[0], 0, numcomps * sizeof(opj_image_cmptparm_t));
+       for(i = 0; i < numcomps; i++) {         
+               cmptparm[i].prec = raw_cp->rawBitDepth;
+               cmptparm[i].bpp = raw_cp->rawBitDepth;
+               cmptparm[i].sgnd = raw_cp->rawSigned;
+               cmptparm[i].dx = subsampling_dx;
+               cmptparm[i].dy = subsampling_dy;
+               cmptparm[i].w = w;
+               cmptparm[i].h = h;
+       }
+       /* create the image */
+       image = opj_image_create(numcomps, &cmptparm[0], color_space);
+       if(!image) {
+               fclose(f);
+               return NULL;
+       }
+       /* set image offset and reference grid */
+       image->x0 = parameters->image_offset_x0;
+       image->y0 = parameters->image_offset_y0;
+       image->x1 = parameters->image_offset_x0 + (w - 1) *     subsampling_dx + 1;
+       image->y1 = parameters->image_offset_y0 + (h - 1) *     subsampling_dy + 1;
+
+       if(raw_cp->rawBitDepth <= 8)
+       {
+               unsigned char value = 0;
+               for(compno = 0; compno < numcomps; compno++) {
+                       for (i = 0; i < w * h; i++) {
+                               if (!fread(&value, 1, 1, f)) {
+                                       fprintf(stderr,"Error reading raw file. End of file probably reached.\n");
+                                       return NULL;
+                               }
+                               image->comps[compno].data[i] = raw_cp->rawSigned?(char)value:value;
+                       }
+               }
+       }
+       else if(raw_cp->rawBitDepth <= 16)
+       {
+               unsigned short value;
+               for(compno = 0; compno < numcomps; compno++) {
+                       for (i = 0; i < w * h; i++) {
+                               unsigned char temp;
+                               if (!fread(&temp, 1, 1, f)) {
+                                       fprintf(stderr,"Error reading raw file. End of file probably reached.\n");
+                                       return NULL;
+                               }
+                               value = temp << 8;
+                               if (!fread(&temp, 1, 1, f)) {
+                                       fprintf(stderr,"Error reading raw file. End of file probably reached.\n");
+                                       return NULL;
+                               }
+                               value += temp;
+                               image->comps[compno].data[i] = raw_cp->rawSigned?(short)value:value;
+                       }
+               }
+       }
+       else {
+               fprintf(stderr,"OpenJPEG cannot encode raw components with bit depth higher than 16 bits.\n");
+               return NULL;
+       }
+
+       if (fread(&ch, 1, 1, f)) {
+               fprintf(stderr,"Warning. End of raw file not reached... processing anyway\n");
+       }
+       fclose(f);
+
+       return image;
+}
+
+int imagetoraw(opj_image_t * image, const char *outfile)
+{
+       FILE *rawFile = NULL;
+  size_t res;
+       int compno;
+       int w, h;
+       int line, row;
+       int *ptr;
+
+       if((image->numcomps * image->x1 * image->y1) == 0)
+       {
+               fprintf(stderr,"\nError: invalid raw image parameters\n");
+               return 1;
+       }
+
+       rawFile = fopen(outfile, "wb");
+       if (!rawFile) {
+               fprintf(stderr, "Failed to open %s for writing !!\n", outfile);
+               return 1;
+       }
+
+       fprintf(stdout,"Raw image characteristics: %d components\n", image->numcomps);
+
+       for(compno = 0; compno < image->numcomps; compno++)
+       {
+               fprintf(stdout,"Component %d characteristics: %dx%dx%d %s\n", compno, image->comps[compno].w,
+                       image->comps[compno].h, image->comps[compno].prec, image->comps[compno].sgnd==1 ? "signed": "unsigned");
+
+               w = image->comps[compno].w;
+               h = image->comps[compno].h;
+
+               if(image->comps[compno].prec <= 8)
+               {
+                       if(image->comps[compno].sgnd == 1)
+                       {
+                               signed char curr;
+                               int mask = (1 << image->comps[compno].prec) - 1;
+                               ptr = image->comps[compno].data;
+                               for (line = 0; line < h; line++) {
+                                       for(row = 0; row < w; row++)    {                               
+                                               curr = (signed char) (*ptr & mask);
+                                               res = fwrite(&curr, sizeof(signed char), 1, rawFile);
+            if( res < 1 ) {
+              fprintf(stderr, "failed to write 1 byte for %s\n", outfile);
+              return 1;
+            }
+                                               ptr++;
+                                       }
+                               }
+                       }
+                       else if(image->comps[compno].sgnd == 0)
+                       {
+                               unsigned char curr;
+                               int mask = (1 << image->comps[compno].prec) - 1;
+                               ptr = image->comps[compno].data;
+                               for (line = 0; line < h; line++) {
+                                       for(row = 0; row < w; row++)    {       
+                                               curr = (unsigned char) (*ptr & mask);
+                                               res = fwrite(&curr, sizeof(unsigned char), 1, rawFile);
+            if( res < 1 ) {
+              fprintf(stderr, "failed to write 1 byte for %s\n", outfile);
+              return 1;
+            }
+                                               ptr++;
+                                       }
+                               }
+                       }
+               }
+               else if(image->comps[compno].prec <= 16)
+               {
+                       if(image->comps[compno].sgnd == 1)
+                       {
+                               signed short int curr;
+                               int mask = (1 << image->comps[compno].prec) - 1;
+                               ptr = image->comps[compno].data;
+                               for (line = 0; line < h; line++) {
+                                       for(row = 0; row < w; row++)    {                                       
+                                               unsigned char temp;
+                                               curr = (signed short int) (*ptr & mask);
+                                               temp = (unsigned char) (curr >> 8);
+                                               res = fwrite(&temp, 1, 1, rawFile);
+            if( res < 1 ) {
+              fprintf(stderr, "failed to write 1 byte for %s\n", outfile);
+              return 1;
+            }
+                                               temp = (unsigned char) curr;
+                                               res = fwrite(&temp, 1, 1, rawFile);
+            if( res < 1 ) {
+              fprintf(stderr, "failed to write 1 byte for %s\n", outfile);
+              return 1;
+            }
+                                               ptr++;
+                                       }
+                               }
+                       }
+                       else if(image->comps[compno].sgnd == 0)
+                       {
+                               unsigned short int curr;
+                               int mask = (1 << image->comps[compno].prec) - 1;
+                               ptr = image->comps[compno].data;
+                               for (line = 0; line < h; line++) {
+                                       for(row = 0; row < w; row++)    {                               
+                                               unsigned char temp;
+                                               curr = (unsigned short int) (*ptr & mask);
+                                               temp = (unsigned char) (curr >> 8);
+                                               res = fwrite(&temp, 1, 1, rawFile);
+            if( res < 1 ) {
+              fprintf(stderr, "failed to write 1 byte for %s\n", outfile);
+              return 1;
+            }
+                                               temp = (unsigned char) curr;
+                                               res = fwrite(&temp, 1, 1, rawFile);
+            if( res < 1 ) {
+              fprintf(stderr, "failed to write 1 byte for %s\n", outfile);
+              return 1;
+            }
+                                               ptr++;
+                                       }
+                               }
+                       }
+               }
+               else if (image->comps[compno].prec <= 32)
+               {
+                       fprintf(stderr,"More than 16 bits per component no handled yet\n");
+                       return 1;
+               }
+               else
+               {
+                       fprintf(stderr,"Error: invalid precision: %d\n", image->comps[compno].prec);
+                       return 1;
+               }
+       }
+       fclose(rawFile);
+       return 0;
+}
+
+#ifdef HAVE_LIBPNG
+
+#define PNG_MAGIC "\x89PNG\x0d\x0a\x1a\x0a"
+#define MAGIC_SIZE 8
+/* PNG allows bits per sample: 1, 2, 4, 8, 16 */
+
+opj_image_t *pngtoimage(const char *read_idf, opj_cparameters_t * params)
+{
+       png_structp  png;
+       png_infop    info;
+       double gamma, display_exponent;
+       int bit_depth, interlace_type,compression_type, filter_type;
+       int unit;
+       png_uint_32 resx, resy;
+       unsigned int i, j;
+       png_uint_32  width, height;
+       int color_type, has_alpha, is16;
+       unsigned char *s;
+       FILE *reader;
+       unsigned char **rows;
+/* j2k: */
+       opj_image_t *image;
+       opj_image_cmptparm_t cmptparm[4];
+       int sub_dx, sub_dy;
+       unsigned int nr_comp;
+       int *r, *g, *b, *a;
+       unsigned char sigbuf[8];
+
+       if((reader = fopen(read_idf, "rb")) == NULL)
+   {
+       fprintf(stderr,"pngtoimage: can not open %s\n",read_idf);
+       return NULL;
+   }
+       image = NULL; png = NULL; rows = NULL;
+
+       if(fread(sigbuf, 1, MAGIC_SIZE, reader) != MAGIC_SIZE
+       || memcmp(sigbuf, PNG_MAGIC, MAGIC_SIZE) != 0)
+   {
+       fprintf(stderr,"pngtoimage: %s is no valid PNG file\n",read_idf);
+       goto fin;
+   }
+/* libpng-VERSION/example.c: 
+ * PC : screen_gamma = 2.2;
+ * Mac: screen_gamma = 1.7 or 1.0;
+*/
+       display_exponent = 2.2;
+
+       if((png = png_create_read_struct(PNG_LIBPNG_VER_STRING,
+                                   NULL, NULL, NULL)) == NULL)
+         goto fin;
+       if((info = png_create_info_struct(png)) == NULL)
+         goto fin;
+
+       if(setjmp(png_jmpbuf(png)))
+         goto fin;
+
+       png_init_io(png, reader);
+       png_set_sig_bytes(png, MAGIC_SIZE);
+
+       png_read_info(png, info);
+
+       if(png_get_IHDR(png, info, &width, &height,
+               &bit_depth, &color_type, &interlace_type, 
+               &compression_type, &filter_type) == 0)
+        goto fin;
+
+/* png_set_expand():
+ * expand paletted images to RGB, expand grayscale images of
+ * less than 8-bit depth to 8-bit depth, and expand tRNS chunks
+ * to alpha channels.
+*/
+       if(color_type == PNG_COLOR_TYPE_PALETTE)
+         png_set_expand(png);
+       else
+       if(color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
+         png_set_expand(png);
+
+       if(png_get_valid(png, info, PNG_INFO_tRNS))
+         png_set_expand(png);
+
+       is16 = (bit_depth == 16);
+
+/* GRAY => RGB; GRAY_ALPHA => RGBA
+*/
+       if(color_type == PNG_COLOR_TYPE_GRAY
+       || color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+   {
+       png_set_gray_to_rgb(png);
+       color_type = 
+        (color_type == PNG_COLOR_TYPE_GRAY? PNG_COLOR_TYPE_RGB:
+               PNG_COLOR_TYPE_RGB_ALPHA);
+   }
+       if( !png_get_gAMA(png, info, &gamma))
+         gamma = 0.45455;
+
+       png_set_gamma(png, display_exponent, gamma);
+
+       png_read_update_info(png, info);
+
+       png_get_pHYs(png, info, &resx, &resy, &unit);
+
+       color_type = png_get_color_type(png, info);
+
+       has_alpha = (color_type == PNG_COLOR_TYPE_RGB_ALPHA);
+
+       nr_comp = 3 + has_alpha;
+
+       bit_depth = png_get_bit_depth(png, info);
+
+       rows = (unsigned char**)calloc(height+1, sizeof(unsigned char*));
+       for(i = 0; i < height; ++i)
+        rows[i] = (unsigned char*)malloc(png_get_rowbytes(png,info));
+
+       png_read_image(png, rows);
+
+       memset(&cmptparm, 0, 4 * sizeof(opj_image_cmptparm_t));
+
+       sub_dx = params->subsampling_dx; sub_dy = params->subsampling_dy;
+
+       for(i = 0; i < nr_comp; ++i)
+   {
+       cmptparm[i].prec = bit_depth;
+/* bits_per_pixel: 8 or 16 */
+       cmptparm[i].bpp = bit_depth;
+       cmptparm[i].sgnd = 0;
+       cmptparm[i].dx = sub_dx;
+       cmptparm[i].dy = sub_dy;
+       cmptparm[i].w = width;
+       cmptparm[i].h = height;
+   }
+
+       image = opj_image_create(nr_comp, &cmptparm[0], CLRSPC_SRGB);
+
+       if(image == NULL) goto fin;
+
+    image->x0 = params->image_offset_x0;
+    image->y0 = params->image_offset_y0;
+    image->x1 = image->x0 + (width  - 1) * sub_dx + 1 + image->x0;
+    image->y1 = image->y0 + (height - 1) * sub_dy + 1 + image->y0;
+
+       r = image->comps[0].data;
+       g = image->comps[1].data;
+       b = image->comps[2].data;
+       a = image->comps[3].data;
+
+       for(i = 0; i < height; ++i)
+   {
+       s = rows[i];
+
+       for(j = 0; j < width; ++j)
+  {
+       if(is16)
+ {
+       *r++ = s[0]<<8|s[1]; s += 2;
+
+       *g++ = s[0]<<8|s[1]; s += 2;
+       
+       *b++ = s[0]<<8|s[1]; s += 2;
+       
+       if(has_alpha) { *a++ = s[0]<<8|s[1]; s += 2; }
+
+       continue;
+ }
+       *r++ = *s++; *g++ = *s++; *b++ = *s++;
+
+       if(has_alpha) *a++ = *s++;
+  }
+   }
+fin:
+       if(rows)
+   {
+       for(i = 0; i < height; ++i)
+        free(rows[i]);
+       free(rows);
+   }
+       if(png)
+         png_destroy_read_struct(&png, &info, NULL);
+
+       fclose(reader);
+
+       return image;
+
+}/* pngtoimage() */
+
+int imagetopng(opj_image_t * image, const char *write_idf)
+{
+       FILE *writer;
+       png_structp png;
+       png_infop info;
+       int *red, *green, *blue, *alpha;
+       unsigned char *row_buf, *d;
+       int has_alpha, width, height, nr_comp, color_type;
+       int adjustR, adjustG, adjustB, adjustA, x, y, fails;
+       int prec, ushift, dshift, is16, force16, force8;
+       unsigned short mask = 0xffff;
+       png_color_8 sig_bit;
+
+       is16 = force16 = force8 = ushift = dshift = 0; fails = 1;
+       prec = image->comps[0].prec;
+       nr_comp = image->numcomps;
+
+       if(prec > 8 && prec < 16)
+   {
+       ushift = 16 - prec; dshift = prec - ushift;
+       prec = 16; force16 = 1;
+   }
+       else
+       if(prec < 8 && nr_comp > 1)/* GRAY_ALPHA, RGB, RGB_ALPHA */
+   {
+       ushift = 8 - prec; dshift = 8 - ushift;
+       prec = 8; force8 = 1;
+   }
+
+       if(prec != 1 && prec != 2 && prec != 4 && prec != 8 && prec != 16)
+   {
+       fprintf(stderr,"imagetopng: can not create %s"
+        "\n\twrong bit_depth %d\n", write_idf, prec);
+       return fails;
+   }
+       writer = fopen(write_idf, "wb");
+
+       if(writer == NULL) return fails;
+
+       info = NULL; has_alpha = 0;
+
+/* Create and initialize the png_struct with the desired error handler
+ * functions.  If you want to use the default stderr and longjump method,
+ * you can supply NULL for the last three parameters.  We also check that
+ * the library version is compatible with the one used at compile time,
+ * in case we are using dynamically linked libraries.  REQUIRED.
+*/
+       png = png_create_write_struct(PNG_LIBPNG_VER_STRING,
+               NULL, NULL, NULL);
+/*png_voidp user_error_ptr, user_error_fn, user_warning_fn); */
+
+       if(png == NULL) goto fin;
+
+/* Allocate/initialize the image information data.  REQUIRED 
+*/
+       info = png_create_info_struct(png);
+
+       if(info == NULL) goto fin;
+
+/* Set error handling.  REQUIRED if you are not supplying your own
+ * error handling functions in the png_create_write_struct() call.
+*/
+       if(setjmp(png_jmpbuf(png))) goto fin;
+
+/* I/O initialization functions is REQUIRED 
+*/
+       png_init_io(png, writer);
+
+/* Set the image information here.  Width and height are up to 2^31,
+ * bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on
+ * the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY,
+ * PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB,
+ * or PNG_COLOR_TYPE_RGB_ALPHA.  interlace is either PNG_INTERLACE_NONE or
+ * PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST
+ * currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE. 
+ * REQUIRED
+ *
+ * ERRORS:
+ *
+ * color_type == PNG_COLOR_TYPE_PALETTE && bit_depth > 8
+ * color_type == PNG_COLOR_TYPE_RGB && bit_depth < 8
+ * color_type == PNG_COLOR_TYPE_GRAY_ALPHA && bit_depth < 8
+ * color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8
+ * 
+*/
+       png_set_compression_level(png, Z_BEST_COMPRESSION);
+
+       if(prec == 16) mask = 0xffff;
+       else
+       if(prec == 8) mask = 0x00ff;
+       else
+       if(prec == 4) mask = 0x000f;
+       else
+       if(prec == 2) mask = 0x0003;
+       else
+       if(prec == 1) mask = 0x0001;
+
+       if(nr_comp >= 3
+    && image->comps[0].dx == image->comps[1].dx
+    && image->comps[1].dx == image->comps[2].dx
+    && image->comps[0].dy == image->comps[1].dy
+    && image->comps[1].dy == image->comps[2].dy
+    && image->comps[0].prec == image->comps[1].prec
+    && image->comps[1].prec == image->comps[2].prec)
+   {
+       int v;
+
+    has_alpha = (nr_comp > 3); 
+
+       is16 = (prec == 16);
+       
+    width = image->comps[0].w;
+    height = image->comps[0].h;
+
+       red = image->comps[0].data;
+       green = image->comps[1].data;
+       blue = image->comps[2].data;
+
+    sig_bit.red = sig_bit.green = sig_bit.blue = prec;
+
+       if(has_alpha) 
+  {
+       sig_bit.alpha = prec;
+       alpha = image->comps[3].data; 
+       color_type = PNG_COLOR_TYPE_RGB_ALPHA;
+       adjustA = (image->comps[3].sgnd ? 1 << (image->comps[3].prec - 1) : 0);
+  }
+       else 
+  {
+       sig_bit.alpha = 0; alpha = NULL;
+       color_type = PNG_COLOR_TYPE_RGB;
+       adjustA = 0;
+  }
+       png_set_sBIT(png, info, &sig_bit);
+
+       png_set_IHDR(png, info, width, height, prec, 
+        color_type,
+        PNG_INTERLACE_NONE,
+        PNG_COMPRESSION_TYPE_BASE,  PNG_FILTER_TYPE_BASE);
+/*=============================*/
+       png_write_info(png, info);
+/*=============================*/
+       if(prec < 8)
+  {
+       png_set_packing(png);
+  }
+    adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+    adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0);
+    adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0);
+
+       row_buf = (unsigned char*)malloc(width * nr_comp * 2);
+
+       for(y = 0; y < height; ++y)
+  {
+       d = row_buf;
+
+       for(x = 0; x < width; ++x)
+ {
+               if(is16)
+          {
+               v = *red + adjustR; ++red;
+               
+               if(force16) { v = (v<<ushift) + (v>>dshift); }
+
+               *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v;
+
+               v = *green + adjustG; ++green;
+               
+               if(force16) { v = (v<<ushift) + (v>>dshift); }
+
+               *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v;
+
+               v =  *blue + adjustB; ++blue;
+               
+               if(force16) { v = (v<<ushift) + (v>>dshift); }
+
+               *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v;
+
+               if(has_alpha)
+         {
+               v = *alpha + adjustA; ++alpha;
+               
+               if(force16) { v = (v<<ushift) + (v>>dshift); }
+
+               *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v;
+         }
+               continue;
+          }/* if(is16) */
+
+               v = *red + adjustR; ++red;
+
+               if(force8) { v = (v<<ushift) + (v>>dshift); }
+
+               *d++ = (unsigned char)(v & mask);
+
+               v = *green + adjustG; ++green;
+
+               if(force8) { v = (v<<ushift) + (v>>dshift); }
+
+               *d++ = (unsigned char)(v & mask);
+
+               v = *blue + adjustB; ++blue;
+
+               if(force8) { v = (v<<ushift) + (v>>dshift); }
+
+               *d++ = (unsigned char)(v & mask);
+
+               if(has_alpha)
+          {
+               v = *alpha + adjustA; ++alpha;
+
+               if(force8) { v = (v<<ushift) + (v>>dshift); }
+
+               *d++ = (unsigned char)(v & mask);
+          }
+ }     /* for(x) */
+
+       png_write_row(png, row_buf);
+
+  }    /* for(y) */
+       free(row_buf);
+
+   }/* nr_comp >= 3 */
+       else
+       if(nr_comp == 1 /* GRAY */
+       || (   nr_comp == 2 /* GRAY_ALPHA */
+               && image->comps[0].dx == image->comps[1].dx
+               && image->comps[0].dy == image->comps[1].dy
+               && image->comps[0].prec == image->comps[1].prec))
+   {
+       int v;
+
+       red = image->comps[0].data;
+
+    sig_bit.gray = prec;
+    sig_bit.red = sig_bit.green = sig_bit.blue = sig_bit.alpha = 0;
+       alpha = NULL; adjustA = 0;
+       color_type = PNG_COLOR_TYPE_GRAY;
+
+    if(nr_comp == 2) 
+  { 
+       has_alpha = 1; sig_bit.alpha = prec;
+       alpha = image->comps[1].data;
+       color_type = PNG_COLOR_TYPE_GRAY_ALPHA;
+       adjustA = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0);
+  }
+    width = image->comps[0].w;
+    height = image->comps[0].h;
+
+       png_set_IHDR(png, info, width, height, sig_bit.gray,
+     color_type,
+     PNG_INTERLACE_NONE,
+     PNG_COMPRESSION_TYPE_BASE,  PNG_FILTER_TYPE_BASE);
+
+       png_set_sBIT(png, info, &sig_bit);
+/*=============================*/
+       png_write_info(png, info);
+/*=============================*/
+       adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+
+       if(prec < 8)
+  {
+       png_set_packing(png);
+  }
+
+       if(prec > 8)
+  {
+       row_buf = (unsigned char*)
+        malloc(width * nr_comp * sizeof(unsigned short));
+
+       for(y = 0; y < height; ++y)
+ {
+       d = row_buf;
+
+               for(x = 0; x < width; ++x)
+          {
+               v = *red + adjustR; ++red;
+
+               if(force16) { v = (v<<ushift) + (v>>dshift); }
+
+               *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v;
+
+               if(has_alpha)
+         {
+               v = *alpha++;
+
+               if(force16) { v = (v<<ushift) + (v>>dshift); }
+
+               *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v;
+         }
+          }/* for(x) */
+       png_write_row(png, row_buf);
+
+ }     /* for(y) */
+       free(row_buf);
+  }
+       else /* prec <= 8 */
+  {
+       row_buf = (unsigned char*)calloc(width, nr_comp * 2);
+
+       for(y = 0; y < height; ++y)
+ {
+       d = row_buf;
+
+               for(x = 0; x < width; ++x)
+          {
+               v = *red + adjustR; ++red;
+
+               if(force8) { v = (v<<ushift) + (v>>dshift); }
+
+               *d++ = (unsigned char)(v & mask);
+
+               if(has_alpha)
+         {
+               v = *alpha + adjustA; ++alpha;
+
+               if(force8) { v = (v<<ushift) + (v>>dshift); }
+
+               *d++ = (unsigned char)(v & mask);
+         }
+          }/* for(x) */
+
+       png_write_row(png, row_buf);
+
+ }     /* for(y) */
+       free(row_buf);
+  }
+   }
+       else
+   {
+       fprintf(stderr,"imagetopng: can not create %s\n",write_idf);
+       goto fin;
+   }
+       png_write_end(png, info);
+
+       fails = 0;
+
+fin:
+
+       if(png)
+   {
+    png_destroy_write_struct(&png, &info);
+   }
+       fclose(writer);
+
+       if(fails) remove(write_idf);
+
+       return fails;
+}/* imagetopng() */
+#endif /* HAVE_LIBPNG */
diff --git a/src/bin/jpwl/convert.h b/src/bin/jpwl/convert.h
new file mode 100644 (file)
index 0000000..d2f82fc
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2007, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * 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.
+ */
+#ifndef __J2K_CONVERT_H
+#define __J2K_CONVERT_H
+
+/**@name RAW image encoding parameters */
+/*@{*/
+typedef struct raw_cparameters {
+       /** width of the raw image */
+       int rawWidth;
+       /** height of the raw image */
+       int rawHeight;
+       /** components of the raw image */
+       int rawComp;
+       /** bit depth of the raw image */
+       int rawBitDepth;
+       /** signed/unsigned raw image */
+       opj_bool rawSigned;
+       /*@}*/
+} raw_cparameters_t;
+
+/* TGA conversion */
+opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters);
+int imagetotga(opj_image_t * image, const char *outfile);
+
+/* BMP conversion */
+opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters);
+int imagetobmp(opj_image_t *image, const char *outfile);
+
+/* TIFF conversion*/
+opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters);
+int imagetotif(opj_image_t *image, const char *outfile);
+/**
+Load a single image component encoded in PGX file format
+@param filename Name of the PGX file to load
+@param parameters *List ?*
+@return Returns a greyscale image if successful, returns NULL otherwise
+*/
+opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters);
+int imagetopgx(opj_image_t *image, const char *outfile);
+
+opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters);
+int imagetopnm(opj_image_t *image, const char *outfile);
+
+/* RAW conversion */
+int imagetoraw(opj_image_t * image, const char *outfile);
+opj_image_t* rawtoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp);
+
+/* PNG conversion*/
+extern int imagetopng(opj_image_t *image, const char *write_idf);
+extern opj_image_t* pngtoimage(const char *filename, opj_cparameters_t *parameters);
+
+#endif /* __J2K_CONVERT_H */
+
diff --git a/src/bin/jpwl/index.c b/src/bin/jpwl/index.c
new file mode 100644 (file)
index 0000000..22389c7
--- /dev/null
@@ -0,0 +1,391 @@
+/*
+ * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2007, Professor Benoit Macq
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * 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.
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include "openjpeg.h"
+#include "index.h"
+
+/* ------------------------------------------------------------------------------------ */
+
+/**
+Write a structured index to a file
+@param cstr_info Codestream information 
+@param index Index filename
+@return Returns 0 if successful, returns 1 otherwise
+*/
+int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
+       int tileno, compno, layno, resno, precno, pack_nb, x, y;
+       FILE *stream = NULL;
+       double total_disto = 0;
+/* UniPG>> */
+       int tilepartno;
+       char disto_on, numpix_on;
+
+#ifdef USE_JPWL
+       if (!strcmp(index, JPWL_PRIVATEINDEX_NAME))
+               return 0;
+#endif /* USE_JPWL */
+/* <<UniPG */
+
+       if (!cstr_info)         
+               return 1;
+
+       stream = fopen(index, "w");
+       if (!stream) {
+               fprintf(stderr, "failed to open index file [%s] for writing\n", index);
+               return 1;
+       }
+       
+       if (cstr_info->tile[0].distotile)
+               disto_on = 1;
+       else 
+               disto_on = 0;
+
+       if (cstr_info->tile[0].numpix)
+               numpix_on = 1;
+       else 
+               numpix_on = 0;
+
+       fprintf(stream, "%d %d\n", cstr_info->image_w, cstr_info->image_h);
+       fprintf(stream, "%d\n", cstr_info->prog);
+       fprintf(stream, "%d %d\n", cstr_info->tile_x, cstr_info->tile_y);
+       fprintf(stream, "%d %d\n", cstr_info->tw, cstr_info->th);
+       fprintf(stream, "%d\n", cstr_info->numcomps);
+       fprintf(stream, "%d\n", cstr_info->numlayers);
+       fprintf(stream, "%d\n", cstr_info->numdecompos[0]); /* based on component 0 */
+
+       for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) {
+               fprintf(stream, "[%d,%d] ", 
+                       (1 << cstr_info->tile[0].pdx[resno]), (1 << cstr_info->tile[0].pdx[resno]));    /* based on tile 0 and component 0 */
+       }
+
+       fprintf(stream, "\n");
+/* UniPG>> */
+       fprintf(stream, "%d\n", cstr_info->main_head_start);
+/* <<UniPG */
+       fprintf(stream, "%d\n", cstr_info->main_head_end);
+       fprintf(stream, "%d\n", cstr_info->codestream_size);
+       
+       fprintf(stream, "\nINFO ON TILES\n");
+       fprintf(stream, "tileno start_pos  end_hd  end_tile   nbparts");
+       if (disto_on)
+               fprintf(stream,"         disto");
+       if (numpix_on)
+               fprintf(stream,"     nbpix");
+       if (disto_on && numpix_on)
+               fprintf(stream,"  disto/nbpix");
+       fprintf(stream, "\n");
+
+       for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
+               fprintf(stream, "%4d %9d %9d %9d %9d", 
+                       cstr_info->tile[tileno].tileno,
+                       cstr_info->tile[tileno].start_pos,
+                       cstr_info->tile[tileno].end_header,
+                       cstr_info->tile[tileno].end_pos,
+                       cstr_info->tile[tileno].num_tps);
+               if (disto_on)
+                       fprintf(stream," %9e", cstr_info->tile[tileno].distotile);
+               if (numpix_on)
+                       fprintf(stream," %9d", cstr_info->tile[tileno].numpix);
+               if (disto_on && numpix_on)
+                       fprintf(stream," %9e", cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].numpix);
+               fprintf(stream, "\n");
+       }
+               
+       for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
+               int start_pos, end_ph_pos, end_pos;
+               double disto = 0;
+               int max_numdecompos = 0;
+               pack_nb = 0;
+
+               for (compno = 0; compno < cstr_info->numcomps; compno++) {
+                       if (max_numdecompos < cstr_info->numdecompos[compno])
+                               max_numdecompos = cstr_info->numdecompos[compno];
+               }       
+
+               fprintf(stream, "\nTILE %d DETAILS\n", tileno); 
+               fprintf(stream, "part_nb tileno  start_pack num_packs  start_pos end_tph_pos   end_pos\n");
+               for (tilepartno = 0; tilepartno < cstr_info->tile[tileno].num_tps; tilepartno++)
+                       fprintf(stream, "%4d %9d   %9d %9d  %9d %11d %9d\n",
+                               tilepartno, tileno,
+                               cstr_info->tile[tileno].tp[tilepartno].tp_start_pack,
+                               cstr_info->tile[tileno].tp[tilepartno].tp_numpacks,
+                               cstr_info->tile[tileno].tp[tilepartno].tp_start_pos,
+                               cstr_info->tile[tileno].tp[tilepartno].tp_end_header,
+                               cstr_info->tile[tileno].tp[tilepartno].tp_end_pos
+                               );
+
+               if (cstr_info->prog == LRCP) {  /* LRCP */
+                       fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos");
+                       if (disto_on)
+                               fprintf(stream, " disto");
+                       fprintf(stream,"\n");
+
+                       for (layno = 0; layno < cstr_info->numlayers; layno++) {
+                               for (resno = 0; resno < max_numdecompos + 1; resno++) {
+                                       for (compno = 0; compno < cstr_info->numcomps; compno++) {
+                                               int prec_max;
+                                               if (resno > cstr_info->numdecompos[compno])
+                                                       break;
+                                               prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                                               for (precno = 0; precno < prec_max; precno++) {
+                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
+                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
+                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;
+                                                       fprintf(stream, "%4d %6d %7d %5d %6d  %6d    %6d     %6d %7d",
+                                                               pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos);
+                                                       if (disto_on)
+                                                               fprintf(stream, " %8e", disto);
+                                                       fprintf(stream, "\n");
+                                                       total_disto += disto;
+                                                       pack_nb++;
+                                               }
+                                       }
+                               }
+                       }
+               } /* LRCP */
+
+               else if (cstr_info->prog == RLCP) {     /* RLCP */                      
+                       fprintf(stream, "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos\n");
+                       if (disto_on)
+                               fprintf(stream, " disto");
+                       fprintf(stream,"\n");
+
+                       for (resno = 0; resno < max_numdecompos + 1; resno++) {
+                               for (layno = 0; layno < cstr_info->numlayers; layno++) {
+                                       for (compno = 0; compno < cstr_info->numcomps; compno++) {
+                                               int prec_max; 
+                                               if (resno > cstr_info->numdecompos[compno])
+                                                       break;
+                                               prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                                               for (precno = 0; precno < prec_max; precno++) {
+                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
+                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
+                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;
+                                                       fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d   %9d %7d",
+                                                               pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos);
+                                                       if (disto_on)
+                                                               fprintf(stream, " %8e", disto);
+                                                       fprintf(stream, "\n");
+                                                       total_disto += disto;
+                                                       pack_nb++;
+                                               }
+                                       }
+                               }
+                       }
+               } /* RLCP */
+
+               else if (cstr_info->prog == RPCL) {     /* RPCL */
+
+                       fprintf(stream, "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos"); 
+                       if (disto_on)
+                               fprintf(stream, " disto");
+                       fprintf(stream,"\n");
+
+                       for (resno = 0; resno < max_numdecompos + 1; resno++) {
+                               int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                               for (precno = 0; precno < numprec; precno++) {                                                          
+                                       /* I suppose components have same XRsiz, YRsiz */
+                                       int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;
+                                       int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;
+                                       int x1 = x0 + cstr_info->tile_x;
+                                       int y1 = y0 + cstr_info->tile_y;
+                                       for (compno = 0; compno < cstr_info->numcomps; compno++) {                                      
+                                               int pcnx = cstr_info->tile[tileno].pw[resno];
+                                               int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );
+                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );
+                                               int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
+                                               int precno_y = (int) floor( (float)precno/(float)pcnx );
+                                               if (resno > cstr_info->numdecompos[compno])
+                                                       break;
+                                               for(y = y0; y < y1; y++) {                                                      
+                                                       if (precno_y*pcy == y ) {
+                                                               for (x = x0; x < x1; x++) {                                                                     
+                                                                       if (precno_x*pcx == x ) {
+                                                                               for (layno = 0; layno < cstr_info->numlayers; layno++) {
+                                                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
+                                                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
+                                                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;
+                                                                                       fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d   %9d %7d",
+                                                                                               pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos); 
+                                                                                       if (disto_on)
+                                                                                               fprintf(stream, " %8e", disto);
+                                                                                       fprintf(stream, "\n");
+                                                                                       total_disto += disto;
+                                                                                       pack_nb++; 
+                                                                               }
+                                                                       }
+                                                               }/* x = x0..x1 */
+                                                       } 
+                                               }  /* y = y0..y1 */
+                                       } /* precno */
+                               } /* compno */
+                       } /* resno */
+               } /* RPCL */
+
+               else if (cstr_info->prog == PCRL) {     /* PCRL */
+                       /* I suppose components have same XRsiz, YRsiz */
+                       int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;
+                       int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;
+                       int x1 = x0 + cstr_info->tile_x;
+                       int y1 = y0 + cstr_info->tile_y;
+
+                       /* Count the maximum number of precincts */
+                       int max_numprec = 0;
+                       for (resno = 0; resno < max_numdecompos + 1; resno++) {
+                               int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                               if (numprec > max_numprec)
+                                       max_numprec = numprec;
+                       }
+
+                       fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos"); 
+                       if (disto_on)
+                               fprintf(stream, " disto");
+                       fprintf(stream,"\n");
+
+                       for (precno = 0; precno < max_numprec; precno++) {
+                               for (compno = 0; compno < cstr_info->numcomps; compno++) {
+                                       for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {
+                                               int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                                               int pcnx = cstr_info->tile[tileno].pw[resno];
+                                               int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );
+                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );
+                                               int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
+                                               int precno_y = (int) floor( (float)precno/(float)pcnx );
+                                               if (precno >= numprec)
+                                                       continue;
+                                               for(y = y0; y < y1; y++) {                                                      
+                                                       if (precno_y*pcy == y ) {
+                                                               for (x = x0; x < x1; x++) {                                                                     
+                                                                       if (precno_x*pcx == x ) {
+                                                                               for (layno = 0; layno < cstr_info->numlayers; layno++) {
+                                                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
+                                                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
+                                                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;
+                                                                                       fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d   %9d %7d",
+                                                                                               pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos); 
+                                                                                       if (disto_on)
+                                                                                               fprintf(stream, " %8e", disto);
+                                                                                       fprintf(stream, "\n");
+                                                                                       total_disto += disto;
+                                                                                       pack_nb++; 
+                                                                               }
+                                                                       }
+                                                               }/* x = x0..x1 */
+                                                       } 
+                                               }  /* y = y0..y1 */
+                                       } /* resno */
+                               } /* compno */
+                       } /* precno */
+               } /* PCRL */
+
+               else {  /* CPRL */
+                       /* Count the maximum number of precincts */
+                       int max_numprec = 0;
+                       for (resno = 0; resno < max_numdecompos + 1; resno++) {
+                               int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                               if (numprec > max_numprec)
+                                       max_numprec = numprec;
+                       }
+
+                       fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos"); 
+                       if (disto_on)
+                               fprintf(stream, " disto");
+                       fprintf(stream,"\n");
+
+                       for (compno = 0; compno < cstr_info->numcomps; compno++) {
+                               /* I suppose components have same XRsiz, YRsiz */
+                               int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;
+                               int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;
+                               int x1 = x0 + cstr_info->tile_x;
+                               int y1 = y0 + cstr_info->tile_y;
+
+                               for (precno = 0; precno < max_numprec; precno++) {
+                                       for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {
+                                               int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                                               int pcnx = cstr_info->tile[tileno].pw[resno];
+                                               int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );
+                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );
+                                               int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
+                                               int precno_y = (int) floor( (float)precno/(float)pcnx );
+                                               if (precno >= numprec)
+                                                       continue;
+
+                                               for(y = y0; y < y1; y++) {
+                                                       if (precno_y*pcy == y ) {
+                                                               for (x = x0; x < x1; x++) {
+                                                                       if (precno_x*pcx == x ) {
+                                                                               for (layno = 0; layno < cstr_info->numlayers; layno++) {
+                                                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
+                                                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
+                                                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;
+                                                                                       fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d   %9d %7d",
+                                                                                               pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos); 
+                                                                                       if (disto_on)
+                                                                                               fprintf(stream, " %8e", disto);
+                                                                                       fprintf(stream, "\n");
+                                                                                       total_disto += disto;
+                                                                                       pack_nb++; 
+                                                                               }
+                                                                       }
+                                                               }/* x = x0..x1 */
+                                                       }
+                                               } /* y = y0..y1 */
+                                       } /* resno */
+                               } /* precno */
+                       } /* compno */
+               } /* CPRL */   
+       } /* tileno */
+       
+       if (disto_on) {
+               fprintf(stream, "%8e\n", cstr_info->D_max); /* SE max */        
+               fprintf(stream, "%.8e\n", total_disto); /* SE totale */
+       }
+/* UniPG>> */
+       /* print the markers' list */
+       if (cstr_info->marknum) {
+               fprintf(stream, "\nMARKER LIST\n");
+               fprintf(stream, "%d\n", cstr_info->marknum);
+               fprintf(stream, "type\tstart_pos    length\n");
+               for (x = 0; x < cstr_info->marknum; x++)
+                       fprintf(stream, "%X\t%9d %9d\n", cstr_info->marker[x].type, cstr_info->marker[x].pos, cstr_info->marker[x].len);
+       }
+/* <<UniPG */
+       fclose(stream);
+
+       fprintf(stderr,"Generated index file %s\n", index);
+
+       return 0;
+}
diff --git a/src/bin/jpwl/index.h b/src/bin/jpwl/index.h
new file mode 100644 (file)
index 0000000..6c2231d
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2007, Professor Benoit Macq
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * 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.
+ */
+
+#ifndef __J2K_INDEX_H
+#define __J2K_INDEX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+Write a structured index to a file
+@param cstr_info Codestream information 
+@param index Index filename
+@return Returns 0 if successful, returns 1 otherwise
+*/
+int write_index_file(opj_codestream_info_t *cstr_info, char *index);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __J2K_INDEX_H */
+
diff --git a/src/bin/jpwl/opj_jpwl_compress.c b/src/bin/jpwl/opj_jpwl_compress.c
new file mode 100644 (file)
index 0000000..b931ff3
--- /dev/null
@@ -0,0 +1,1813 @@
+/*
+ * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2007, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * 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.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef _WIN32
+#include "windirent.h"
+#else
+#include <dirent.h>
+#endif /* _WIN32 */
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <strings.h>
+#define _stricmp strcasecmp
+#define _strnicmp strncasecmp
+#endif /* _WIN32 */
+
+#include "opj_config.h"
+#include "openjpeg.h"
+#include "opj_getopt.h"
+#include "convert.h"
+#include "index.h"
+
+#include "format_defs.h"
+
+#define CINEMA_24_CS 1302083   /*Codestream length for 24fps*/
+#define CINEMA_48_CS 651041            /*Codestream length for 48fps*/
+#define COMP_24_CS 1041666             /*Maximum size per color component for 2K & 4K @ 24fps*/
+#define COMP_48_CS 520833              /*Maximum size per color component for 2K @ 48fps*/
+
+typedef struct dircnt{
+       /** Buffer for holding images read from Directory*/
+       char *filename_buf;
+       /** Pointer to the buffer*/
+       char **filename;
+}dircnt_t;
+
+typedef struct img_folder{
+       /** The directory path of the folder containing input images*/
+       char *imgdirpath;
+       /** Output format*/
+       char *out_format;
+       /** Enable option*/
+       char set_imgdir;
+       /** Enable Cod Format for output*/
+       char set_out_format;
+       /** User specified rate stored in case of cinema option*/
+       float *rates;
+}img_fol_t;
+
+void encode_help_display(void) {
+       fprintf(stdout,"HELP for image_to_j2k\n----\n\n");
+       fprintf(stdout,"- the -h option displays this help information on screen\n\n");
+
+/* UniPG>> */
+       fprintf(stdout,"List of parameters for the JPEG 2000 "
+#ifdef USE_JPWL
+               "+ JPWL "
+#endif /* USE_JPWL */
+               "encoder:\n");
+/* <<UniPG */
+       fprintf(stdout,"\n");
+       fprintf(stdout,"REMARKS:\n");
+       fprintf(stdout,"---------\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"The markers written to the main_header are : SOC SIZ COD QCD COM.\n");
+       fprintf(stdout,"COD and QCD never appear in the tile_header.\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"By default:\n");
+       fprintf(stdout,"------------\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout," * Lossless\n");
+       fprintf(stdout," * 1 tile\n");
+       fprintf(stdout," * Size of precinct : 2^15 x 2^15 (means 1 precinct)\n");
+       fprintf(stdout," * Size of code-block : 64 x 64\n");
+       fprintf(stdout," * Number of resolutions: 6\n");
+       fprintf(stdout," * No SOP marker in the codestream\n");
+       fprintf(stdout," * No EPH marker in the codestream\n");
+       fprintf(stdout," * No sub-sampling in x or y direction\n");
+       fprintf(stdout," * No mode switch activated\n");
+       fprintf(stdout," * Progression order: LRCP\n");
+       fprintf(stdout," * No index file\n");
+       fprintf(stdout," * No ROI upshifted\n");
+       fprintf(stdout," * No offset of the origin of the image\n");
+       fprintf(stdout," * No offset of the origin of the tiles\n");
+       fprintf(stdout," * Reversible DWT 5-3\n");
+/* UniPG>> */
+#ifdef USE_JPWL
+       fprintf(stdout," * No JPWL protection\n");
+#endif /* USE_JPWL */
+/* <<UniPG */
+       fprintf(stdout,"\n");
+       fprintf(stdout,"Parameters:\n");
+       fprintf(stdout,"------------\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"Required Parameters (except with -h):\n");
+       fprintf(stdout,"One of the two options -ImgDir or -i must be used\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-ImgDir      : Image file Directory path (example ../Images) \n");
+       fprintf(stdout,"    When using this option -OutFor must be used\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-OutFor \n");
+       fprintf(stdout,"    REQUIRED only if -ImgDir is used\n");
+       fprintf(stdout,"          Need to specify only format without filename <BMP>  \n");
+       fprintf(stdout,"    Currently accepts PBM, PGM, PPM, PNM, PAM, PGX, PNG, BMP, TIF, RAW and TGA formats\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-i           : source file  (-i source.pnm also *pbm, *.pgm, *.ppm, *.pam, *.pgx, *png, *.bmp, *.tif, *.raw, *.tga) \n");
+       fprintf(stdout,"    When using this option -o must be used\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-o           : destination file (-o dest.j2k or .jp2) \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"Optional Parameters:\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-h           : display the help information \n ");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-cinema2K    : Digital Cinema 2K profile compliant codestream for 2K resolution.(-cinema2k 24 or 48) \n");
+  fprintf(stdout,"       Need to specify the frames per second for a 2K resolution. Only 24 or 48 fps is allowed\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-cinema4K    : Digital Cinema 4K profile compliant codestream for 4K resolution \n");
+       fprintf(stdout,"          Frames per second not required. Default value is 24fps\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-r           : different compression ratios for successive layers (-r 20,10,5)\n ");
+       fprintf(stdout,"                 - The rate specified for each quality level is the desired \n");
+       fprintf(stdout,"                   compression factor.\n");
+       fprintf(stdout,"                   Example: -r 20,10,1 means quality 1: compress 20x, \n");
+       fprintf(stdout,"                     quality 2: compress 10x and quality 3: compress lossless\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"               (options -r and -q cannot be used together)\n ");
+       fprintf(stdout,"\n");
+
+       fprintf(stdout,"-q           : different psnr for successive layers (-q 30,40,50) \n ");
+
+       fprintf(stdout,"               (options -r and -q cannot be used together)\n ");
+
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-n           : number of resolutions (-n 3) \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-b           : size of code block (-b 32,32) \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-c           : size of precinct (-c 128,128) \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-t           : size of tile (-t 512,512) \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-p           : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-s           : subsampling factor (-s 2,2) [-s X,Y] \n");
+       fprintf(stdout,"             Remark: subsampling bigger than 2 can produce error\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-POC         : Progression order change (-POC T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL) \n");
+       fprintf(stdout,"      Example: T1=0,0,1,5,3,CPRL \n");
+       fprintf(stdout,"                         : Ttilenumber=Resolution num start,Component num start,Layer num end,Resolution num end,Component num end,Progression order\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-SOP         : write SOP marker before each packet \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-EPH         : write EPH marker after each header packet \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-M           : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n");
+       fprintf(stdout,"                 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n");
+       fprintf(stdout,"                 Indicate multiple modes by adding their values. \n");
+       fprintf(stdout,"                 ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-TP          : devide packets of every tile into tile-parts (-TP R) [R, L, C]\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-x           : create an index file *.Idx (-x index_name.Idx) \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-ROI         : c=%%d,U=%%d : quantization indices upshifted \n");
+       fprintf(stdout,"               for component c=%%d [%%d = 0,1,2]\n");
+       fprintf(stdout,"               with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI c=0,U=25) \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-d           : offset of the origin of the image (-d 150,300) \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-T           : offset of the origin of the tiles (-T 100,75) \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-I           : use the irreversible DWT 9-7 (-I) \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-F           : characteristics of the raw input image\n");
+       fprintf(stdout,"               -F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n");
+       fprintf(stdout,"               Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-jpip        : write jpip codestream index box in JP2 output file\n");
+       fprintf(stdout,"               NOTICE: currently supports only RPCL order\n");
+       fprintf(stdout,"\n");
+/* UniPG>> */
+#ifdef USE_JPWL
+       fprintf(stdout,"-W           : adoption of JPWL (Part 11) capabilities (-W params)\n");
+       fprintf(stdout,"               The parameters can be written and repeated in any order:\n");
+       fprintf(stdout,"               [h<tilepart><=type>,s<tilepart><=method>,a=<addr>,...\n");
+       fprintf(stdout,"                ...,z=<size>,g=<range>,p<tilepart:pack><=type>]\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"                 h selects the header error protection (EPB): 'type' can be\n");
+       fprintf(stdout,"                   [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]\n");
+       fprintf(stdout,"                   if 'tilepart' is absent, it is for main and tile headers\n");
+       fprintf(stdout,"                   if 'tilepart' is present, it applies from that tile\n");
+       fprintf(stdout,"                     onwards, up to the next h<> spec, or to the last tilepart\n");
+       fprintf(stdout,"                     in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS);
+       fprintf(stdout,"\n");
+       fprintf(stdout,"                 p selects the packet error protection (EEP/UEP with EPBs)\n");
+       fprintf(stdout,"                  to be applied to raw data: 'type' can be\n");
+       fprintf(stdout,"                   [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]\n");
+       fprintf(stdout,"                   if 'tilepart:pack' is absent, it is from tile 0, packet 0\n");
+       fprintf(stdout,"                   if 'tilepart:pack' is present, it applies from that tile\n");
+       fprintf(stdout,"                     and that packet onwards, up to the next packet spec\n");
+       fprintf(stdout,"                     or to the last packet in the last tilepart in the stream\n");
+       fprintf(stdout,"                     (max. %d specs)\n", JPWL_MAX_NO_PACKSPECS);
+       fprintf(stdout,"\n");
+       fprintf(stdout,"                 s enables sensitivity data insertion (ESD): 'method' can be\n");
+       fprintf(stdout,"                   [-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR\n");
+       fprintf(stdout,"                    4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED]\n");
+       fprintf(stdout,"                   if 'tilepart' is absent, it is for main header only\n");
+       fprintf(stdout,"                   if 'tilepart' is present, it applies from that tile\n");
+       fprintf(stdout,"                     onwards, up to the next s<> spec, or to the last tilepart\n");
+       fprintf(stdout,"                     in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS);
+       fprintf(stdout,"\n");
+       fprintf(stdout,"                 g determines the addressing mode: <range> can be\n");
+       fprintf(stdout,"                   [0=PACKET 1=BYTE RANGE 2=PACKET RANGE]\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"                 a determines the size of data addressing: <addr> can be\n");
+       fprintf(stdout,"                   2/4 bytes (small/large codestreams). If not set, auto-mode\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"                 z determines the size of sensitivity values: <size> can be\n");
+       fprintf(stdout,"                   1/2 bytes, for the transformed pseudo-floating point value\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"                 ex.:\n");
+       fprintf(stdout,"                   h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,\n");
+       fprintf(stdout,"                     s0=6,s3=-1,a=0,g=1,z=1\n");
+       fprintf(stdout,"                 means\n");
+       fprintf(stdout,"                   predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2,\n");
+       fprintf(stdout,"                   CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs,\n");
+       fprintf(stdout,"                   UEP rs(78,32) for packets 0 to 23 of tile 0,\n");
+       fprintf(stdout,"                   UEP rs(56,32) for packs. 24 to the last of tilepart 0,\n");
+       fprintf(stdout,"                   UEP rs default for packets of tilepart 1,\n");
+       fprintf(stdout,"                   no UEP for packets 0 to 19 of tilepart 3,\n");
+       fprintf(stdout,"                   UEP CRC-32 for packs. 20 of tilepart 3 to last tilepart,\n");
+       fprintf(stdout,"                   relative sensitivity ESD for MH,\n");
+       fprintf(stdout,"                   TSE ESD from TPH 0 to TPH 2, byte range with automatic\n");
+       fprintf(stdout,"                   size of addresses and 1 byte for each sensitivity value\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"                 ex.:\n");
+       fprintf(stdout,"                       h,s,p\n");
+       fprintf(stdout,"                 means\n");
+       fprintf(stdout,"                   default protection to headers (MH and TPHs) as well as\n");
+       fprintf(stdout,"                   data packets, one ESD in MH\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"                 N.B.: use the following recommendations when specifying\n");
+       fprintf(stdout,"                       the JPWL parameters list\n");
+       fprintf(stdout,"                   - when you use UEP, always pair the 'p' option with 'h'\n");
+       fprintf(stdout,"                 \n");
+#endif /* USE_JPWL */
+/* <<UniPG */
+       fprintf(stdout,"IMPORTANT:\n");
+       fprintf(stdout,"-----------\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"The index file has the structure below:\n");
+       fprintf(stdout,"---------------------------------------\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"Image_height Image_width\n");
+       fprintf(stdout,"progression order\n");
+       fprintf(stdout,"Tiles_size_X Tiles_size_Y\n");
+       fprintf(stdout,"Tiles_nb_X Tiles_nb_Y\n");
+       fprintf(stdout,"Components_nb\n");
+       fprintf(stdout,"Layers_nb\n");
+       fprintf(stdout,"decomposition_levels\n");
+       fprintf(stdout,"[Precincts_size_X_res_Nr Precincts_size_Y_res_Nr]...\n");
+       fprintf(stdout,"   [Precincts_size_X_res_0 Precincts_size_Y_res_0]\n");
+       fprintf(stdout,"Main_header_start_position\n");
+       fprintf(stdout,"Main_header_end_position\n");
+       fprintf(stdout,"Codestream_size\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"INFO ON TILES\n");
+       fprintf(stdout,"tileno start_pos end_hd end_tile nbparts disto nbpix disto/nbpix\n");
+       fprintf(stdout,"Tile_0 start_pos end_Theader end_pos NumParts TotalDisto NumPix MaxMSE\n");
+       fprintf(stdout,"Tile_1   ''           ''        ''        ''       ''    ''      ''\n");
+       fprintf(stdout,"...\n");
+       fprintf(stdout,"Tile_Nt   ''           ''        ''        ''       ''    ''     ''\n");
+       fprintf(stdout,"...\n");
+       fprintf(stdout,"TILE 0 DETAILS\n");
+       fprintf(stdout,"part_nb tileno num_packs start_pos end_tph_pos end_pos\n");
+       fprintf(stdout,"...\n");
+       fprintf(stdout,"Progression_string\n");
+       fprintf(stdout,"pack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos disto\n");
+       fprintf(stdout,"Tpacket_0 Tile layer res. comp. prec. start_pos end_pos disto\n");
+       fprintf(stdout,"...\n");
+       fprintf(stdout,"Tpacket_Np ''   ''    ''   ''    ''       ''       ''     ''\n");
+
+       fprintf(stdout,"MaxDisto\n");
+
+       fprintf(stdout,"TotalDisto\n\n");
+}
+
+OPJ_PROG_ORDER give_progression(char progression[4]) {
+       if(strncmp(progression, "LRCP", 4) == 0) {
+               return LRCP;
+       }
+       if(strncmp(progression, "RLCP", 4) == 0) {
+               return RLCP;
+       }
+       if(strncmp(progression, "RPCL", 4) == 0) {
+               return RPCL;
+       }
+       if(strncmp(progression, "PCRL", 4) == 0) {
+               return PCRL;
+       }
+       if(strncmp(progression, "CPRL", 4) == 0) {
+               return CPRL;
+       }
+
+       return PROG_UNKNOWN;
+}
+
+int get_num_images(char *imgdirpath){
+       DIR *dir;
+       struct dirent* content;
+       int num_images = 0;
+
+       /*Reading the input images from given input directory*/
+
+       dir= opendir(imgdirpath);
+       if(!dir){
+               fprintf(stderr,"Could not open Folder %s\n",imgdirpath);
+               return 0;
+       }
+
+       num_images=0;
+       while((content=readdir(dir))!=NULL){
+               if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 )
+                       continue;
+               num_images++;
+       }
+       return num_images;
+}
+
+int load_images(dircnt_t *dirptr, char *imgdirpath){
+       DIR *dir;
+       struct dirent* content;
+       int i = 0;
+
+       /*Reading the input images from given input directory*/
+
+       dir= opendir(imgdirpath);
+       if(!dir){
+               fprintf(stderr,"Could not open Folder %s\n",imgdirpath);
+               return 1;
+       }else   {
+               fprintf(stderr,"Folder opened successfully\n");
+       }
+
+       while((content=readdir(dir))!=NULL){
+               if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 )
+                       continue;
+
+               strcpy(dirptr->filename[i],content->d_name);
+               i++;
+       }
+       return 0;
+}
+
+int get_file_format(char *filename) {
+       unsigned int i;
+       static const char *extension[] = {
+    "pgx", "pnm", "pgm", "ppm", "pbm", "pam", "bmp", "tif", "raw", "tga", "png", "j2k", "jp2", "j2c", "jpc"
+    };
+       static const int format[] = {
+    PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, J2K_CFMT, J2K_CFMT
+    };
+       char * ext = strrchr(filename, '.');
+       if (ext == NULL)
+               return -1;
+       ext++;
+       for(i = 0; i < sizeof(format)/sizeof(*format); i++) {
+               if(_strnicmp(ext, extension[i], 3) == 0) {
+                       return format[i];
+               }
+       }
+       return -1;
+}
+
+char * get_file_name(char *name){
+       char *fname;
+       fname= (char*)malloc(OPJ_PATH_LEN*sizeof(char));
+       fname= strtok(name,".");
+       return fname;
+}
+
+char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_cparameters_t *parameters){
+       char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN];
+  char *temp_p, temp1[OPJ_PATH_LEN]="";
+
+       strcpy(image_filename,dirptr->filename[imageno]);
+       fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename);
+       parameters->decod_format = get_file_format(image_filename);
+       if (parameters->decod_format == -1)
+               return 1;
+       sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename);
+       strncpy(parameters->infile, infilename, sizeof(infilename));
+
+       /*Set output file*/
+       strcpy(temp_ofname,get_file_name(image_filename));
+       while((temp_p = strtok(NULL,".")) != NULL){
+               strcat(temp_ofname,temp1);
+               sprintf(temp1,".%s",temp_p);
+       }
+       if(img_fol->set_out_format==1){
+               sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format);
+               strncpy(parameters->outfile, outfilename, sizeof(outfilename));
+       }
+ return 0;
+}
+
+static int initialise_4K_poc(opj_poc_t *POC, int numres){
+       POC[0].tile  = 1;
+       POC[0].resno0  = 0;
+       POC[0].compno0 = 0;
+       POC[0].layno1  = 1;
+       POC[0].resno1  = numres-1;
+       POC[0].compno1 = 3;
+       POC[0].prg1 = CPRL;
+       POC[1].tile  = 1;
+       POC[1].resno0  = numres-1;
+       POC[1].compno0 = 0;
+       POC[1].layno1  = 1;
+       POC[1].resno1  = numres;
+       POC[1].compno1 = 3;
+       POC[1].prg1 = CPRL;
+       return 2;
+}
+
+void cinema_parameters(opj_cparameters_t *parameters){
+       parameters->tile_size_on = OPJ_FALSE;
+       parameters->cp_tdx=1;
+       parameters->cp_tdy=1;
+
+       /*Tile part*/
+       parameters->tp_flag = 'C';
+       parameters->tp_on = 1;
+
+       /*Tile and Image shall be at (0,0)*/
+       parameters->cp_tx0 = 0;
+       parameters->cp_ty0 = 0;
+       parameters->image_offset_x0 = 0;
+       parameters->image_offset_y0 = 0;
+
+       /*Codeblock size= 32*32*/
+       parameters->cblockw_init = 32;
+       parameters->cblockh_init = 32;
+       parameters->csty |= 0x01;
+
+       /*The progression order shall be CPRL*/
+       parameters->prog_order = CPRL;
+
+       /* No ROI */
+       parameters->roi_compno = -1;
+
+       parameters->subsampling_dx = 1;         parameters->subsampling_dy = 1;
+
+       /* 9-7 transform */
+       parameters->irreversible = 1;
+
+}
+
+void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol){
+       int i;
+       float temp_rate;
+
+       switch (parameters->cp_cinema){
+       case CINEMA2K_24:
+       case CINEMA2K_48:
+               if(parameters->numresolution > 6){
+                       parameters->numresolution = 6;
+               }
+               if (!((image->comps[0].w == 2048) | (image->comps[0].h == 1080))){
+                       fprintf(stdout,"Image coordinates %d x %d is not 2K compliant.\nJPEG Digital Cinema Profile-3 "
+                               "(2K profile) compliance requires that at least one of coordinates match 2048 x 1080\n",
+                               image->comps[0].w,image->comps[0].h);
+                       parameters->cp_rsiz = STD_RSIZ;
+               }
+       break;
+
+       case CINEMA4K_24:
+               if(parameters->numresolution < 1){
+                               parameters->numresolution = 1;
+                       }else if(parameters->numresolution > 7){
+                               parameters->numresolution = 7;
+                       }
+               if (!((image->comps[0].w == 4096) | (image->comps[0].h == 2160))){
+                       fprintf(stdout,"Image coordinates %d x %d is not 4K compliant.\nJPEG Digital Cinema Profile-4"
+                               "(4K profile) compliance requires that at least one of coordinates match 4096 x 2160\n",
+                               image->comps[0].w,image->comps[0].h);
+                       parameters->cp_rsiz = STD_RSIZ;
+               }
+               parameters->numpocs = initialise_4K_poc(parameters->POC,parameters->numresolution);
+               break;
+       default :
+               break;
+       }
+
+       switch (parameters->cp_cinema){
+               case CINEMA2K_24:
+               case CINEMA4K_24:
+                       for(i=0 ; i<parameters->tcp_numlayers ; i++){
+                               temp_rate = 0 ;
+                               if (img_fol->rates[i]== 0){
+                                       parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+                                       (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy);
+                               }else{
+                                       temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+                                               (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy);
+                                       if (temp_rate > CINEMA_24_CS ){
+                                               parameters->tcp_rates[i]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+                                               (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy);
+                                       }else{
+                                               parameters->tcp_rates[i]= img_fol->rates[i];
+                                       }
+                               }
+                       }
+                       parameters->max_comp_size = COMP_24_CS;
+                       break;
+
+               case CINEMA2K_48:
+                       for(i=0 ; i<parameters->tcp_numlayers ; i++){
+                               temp_rate = 0 ;
+                               if (img_fol->rates[i]== 0){
+                                       parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+                                       (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy);
+                               }else{
+                                       temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+                                               (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy);
+                                       if (temp_rate > CINEMA_48_CS ){
+                                               parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+                                               (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy);
+                                       }else{
+                                               parameters->tcp_rates[i]= img_fol->rates[i];
+                                       }
+                               }
+                       }
+                       parameters->max_comp_size = COMP_48_CS;
+                       break;
+               default:
+                       break;
+       }
+       parameters->cp_disto_alloc = 1;
+}
+
+/* ------------------------------------------------------------------------------------ */
+
+int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
+                                                                                                       img_fol_t *img_fol, raw_cparameters_t *raw_cp, char *indexfilename) {
+       int i, j, totlen, c;
+       opj_option_t long_option[]={
+               {"cinema2K",REQ_ARG, NULL ,'w'},
+               {"cinema4K",NO_ARG, NULL ,'y'},
+               {"ImgDir",REQ_ARG, NULL ,'z'},
+               {"TP",REQ_ARG, NULL ,'u'},
+               {"SOP",NO_ARG, NULL ,'S'},
+               {"EPH",NO_ARG, NULL ,'E'},
+               {"OutFor",REQ_ARG, NULL ,'O'},
+               {"POC",REQ_ARG, NULL ,'P'},
+               {"ROI",REQ_ARG, NULL ,'R'},
+               {"jpip",NO_ARG, NULL, 'J'}
+       };
+
+       /* parse the command line */
+       const char optlist[] = "i:o:r:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C:F:u:J"
+#ifdef USE_JPWL
+               "W:"
+#endif /* USE_JPWL */
+               "h";
+
+       totlen=sizeof(long_option);
+       img_fol->set_out_format=0;
+       raw_cp->rawWidth = 0;
+
+       do{
+               c = opj_getopt_long(argc, argv, optlist,long_option,totlen);
+               if (c == -1)
+                       break;
+               switch (c) {
+                       case 'i':                       /* input file */
+                       {
+                               char *infile = opj_optarg;
+                               parameters->decod_format = get_file_format(infile);
+                               switch(parameters->decod_format) {
+                                       case PGX_DFMT:
+                                       case PXM_DFMT:
+                                       case BMP_DFMT:
+                                       case TIF_DFMT:
+                                       case RAW_DFMT:
+                                       case TGA_DFMT:
+                                       case PNG_DFMT:
+                                               break;
+                                       default:
+                                               fprintf(stderr,
+                                                       "!! Unrecognized format for infile : %s "
+              "[accept only *.pnm, *.pgm, *.ppm, *.pgx, *png, *.bmp, *.tif, *.raw or *.tga] !!\n\n",
+                                                       infile);
+                                               return 1;
+                               }
+                               strncpy(parameters->infile, infile, sizeof(parameters->infile)-1);
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+                       case 'o':                       /* output file */
+                       {
+                               char *outfile = opj_optarg;
+                               parameters->cod_format = get_file_format(outfile);
+                               switch(parameters->cod_format) {
+                                       case J2K_CFMT:
+                                       case JP2_CFMT:
+                                               break;
+                                       default:
+                                               fprintf(stderr, "Unknown output format image %s [only *.j2k, *.j2c or *.jp2]!! \n", outfile);
+                                               return 1;
+                               }
+                               strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1);
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+                       case 'O':                       /* output format */
+                               {
+                                       char outformat[50];
+                                       char *of = opj_optarg;
+                                       sprintf(outformat,".%s",of);
+                                       img_fol->set_out_format = 1;
+                                       parameters->cod_format = get_file_format(outformat);
+                                       switch(parameters->cod_format) {
+                                               case J2K_CFMT:
+                                               case JP2_CFMT:
+                                                       img_fol->out_format = opj_optarg;
+                                                       break;
+                                               default:
+                                                       fprintf(stderr, "Unknown output format image [only j2k, j2c, jp2]!! \n");
+                                                       return 1;
+                                       }
+                               }
+                               break;
+
+
+                               /* ----------------------------------------------------- */
+
+
+                       case 'r':                       /* rates rates/distorsion */
+                       {
+                               char *s = opj_optarg;
+                               parameters->tcp_numlayers = 0;
+                               while (sscanf(s, "%f", &parameters->tcp_rates[parameters->tcp_numlayers]) == 1) {
+                                       parameters->tcp_numlayers++;
+                                       while (*s && *s != ',') {
+                                               s++;
+                                       }
+                                       if (!*s)
+                                               break;
+                                       s++;
+                               }
+                               parameters->cp_disto_alloc = 1;
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+
+                       case 'F':                       /* Raw image format parameters */
+                       {
+                               char signo;
+                               char *s = opj_optarg;
+                               if (sscanf(s, "%d,%d,%d,%d,%c", &raw_cp->rawWidth, &raw_cp->rawHeight, &raw_cp->rawComp, &raw_cp->rawBitDepth, &signo) == 5) {
+                                       if (signo == 's') {
+                                               raw_cp->rawSigned = OPJ_TRUE;
+                                               fprintf(stdout,"\nRaw file parameters: %d,%d,%d,%d Signed\n", raw_cp->rawWidth, raw_cp->rawHeight, raw_cp->rawComp, raw_cp->rawBitDepth);
+                                       }
+                                       else if (signo == 'u') {
+                                               raw_cp->rawSigned = OPJ_FALSE;
+                                               fprintf(stdout,"\nRaw file parameters: %d,%d,%d,%d Unsigned\n", raw_cp->rawWidth, raw_cp->rawHeight, raw_cp->rawComp, raw_cp->rawBitDepth);
+                                       }
+                                       else {
+                                               fprintf(stderr,"\nError: invalid raw image parameters: Unknown sign of raw file\n");
+                                               fprintf(stderr,"Please use the Format option -F:\n");
+                                               fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n");
+                                               fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n");
+                                               fprintf(stderr,"Aborting\n");
+                                       }
+                               }
+                               else {
+                                       fprintf(stderr,"\nError: invalid raw image parameters\n");
+                                       fprintf(stderr,"Please use the Format option -F:\n");
+                                       fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n");
+                                               fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n");
+                                       fprintf(stderr,"Aborting\n");
+                                       return 1;
+                               }
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+                       case 'q':                       /* add fixed_quality */
+                       {
+                               char *s = opj_optarg;
+                               while (sscanf(s, "%f", &parameters->tcp_distoratio[parameters->tcp_numlayers]) == 1) {
+                                       parameters->tcp_numlayers++;
+                                       while (*s && *s != ',') {
+                                               s++;
+                                       }
+                                       if (!*s)
+                                               break;
+                                       s++;
+                               }
+                               parameters->cp_fixed_quality = 1;
+                       }
+                       break;
+
+                               /* dda */
+                               /* ----------------------------------------------------- */
+
+                       case 'f':                       /* mod fixed_quality (before : -q) */
+                       {
+                               int *row = NULL, *col = NULL;
+                               int numlayers = 0, numresolution = 0, matrix_width = 0;
+
+                               char *s = opj_optarg;
+                               sscanf(s, "%d", &numlayers);
+                               s++;
+                               if (numlayers > 9)
+                                       s++;
+
+                               parameters->tcp_numlayers = numlayers;
+                               numresolution = parameters->numresolution;
+                               matrix_width = numresolution * 3;
+                               parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int));
+                               s = s + 2;
+
+                               for (i = 0; i < numlayers; i++) {
+                                       row = &parameters->cp_matrice[i * matrix_width];
+                                       col = row;
+                                       parameters->tcp_rates[i] = 1;
+                                       sscanf(s, "%d,", &col[0]);
+                                       s += 2;
+                                       if (col[0] > 9)
+                                               s++;
+                                       col[1] = 0;
+                                       col[2] = 0;
+                                       for (j = 1; j < numresolution; j++) {
+                                               col += 3;
+                                               sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]);
+                                               s += 6;
+                                               if (col[0] > 9)
+                                                       s++;
+                                               if (col[1] > 9)
+                                                       s++;
+                                               if (col[2] > 9)
+                                                       s++;
+                                       }
+                                       if (i < numlayers - 1)
+                                               s++;
+                               }
+                               parameters->cp_fixed_alloc = 1;
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+                       case 't':                       /* tiles */
+                       {
+                               sscanf(opj_optarg, "%d,%d", &parameters->cp_tdx, &parameters->cp_tdy);
+                               parameters->tile_size_on = OPJ_TRUE;
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+                       case 'n':                       /* resolution */
+                       {
+                               sscanf(opj_optarg, "%d", &parameters->numresolution);
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+                       case 'c':                       /* precinct dimension */
+                       {
+                               char sep;
+                               int res_spec = 0;
+
+                               char *s = opj_optarg;
+                               do {
+                                       sep = 0;
+                                       sscanf(s, "[%d,%d]%c", &parameters->prcw_init[res_spec],
+                                 &parameters->prch_init[res_spec], &sep);
+                                       parameters->csty |= 0x01;
+                                       res_spec++;
+                                       s = strpbrk(s, "]") + 2;
+                               }
+                               while (sep == ',');
+                               parameters->res_spec = res_spec;
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+                       case 'b':                       /* code-block dimension */
+                       {
+                               int cblockw_init = 0, cblockh_init = 0;
+                               sscanf(opj_optarg, "%d,%d", &cblockw_init, &cblockh_init);
+                               if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024
+                                       || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) {
+                                       fprintf(stderr,
+                                               "!! Size of code_block error (option -b) !!\n\nRestriction :\n"
+            "    * width*height<=4096\n    * 4<=width,height<= 1024\n\n");
+                                       return 1;
+                               }
+                               parameters->cblockw_init = cblockw_init;
+                               parameters->cblockh_init = cblockh_init;
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+                       case 'x':                       /* creation of index file */
+                       {
+                               char *index = opj_optarg;
+                               strncpy(indexfilename, index, OPJ_PATH_LEN);
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+                       case 'p':                       /* progression order */
+                       {
+                               char progression[4];
+
+                               strncpy(progression, opj_optarg, 4);
+                               parameters->prog_order = give_progression(progression);
+                               if (parameters->prog_order == -1) {
+                                       fprintf(stderr, "Unrecognized progression order "
+            "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n");
+                                       return 1;
+                               }
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+                       case 's':                       /* subsampling factor */
+                       {
+                               if (sscanf(opj_optarg, "%d,%d", &parameters->subsampling_dx,
+                                    &parameters->subsampling_dy) != 2) {
+                                       fprintf(stderr, "'-s' sub-sampling argument error !  [-s dx,dy]\n");
+                                       return 1;
+                               }
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+                       case 'd':                       /* coordonnate of the reference grid */
+                       {
+                               if (sscanf(opj_optarg, "%d,%d", &parameters->image_offset_x0,
+                                    &parameters->image_offset_y0) != 2) {
+                                       fprintf(stderr, "-d 'coordonnate of the reference grid' argument "
+            "error !! [-d x0,y0]\n");
+                                       return 1;
+                               }
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+                       case 'h':                       /* display an help description */
+                               encode_help_display();
+                               return 1;
+
+                               /* ----------------------------------------------------- */
+
+                       case 'P':                       /* POC */
+                       {
+                               int numpocs = 0;                /* number of progression order change (POC) default 0 */
+                               opj_poc_t *POC = NULL;  /* POC : used in case of Progression order change */
+
+                               char *s = opj_optarg;
+                               POC = parameters->POC;
+
+                               while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile,
+                                       &POC[numpocs].resno0, &POC[numpocs].compno0,
+                                       &POC[numpocs].layno1, &POC[numpocs].resno1,
+                                       &POC[numpocs].compno1, POC[numpocs].progorder) == 7) {
+                                       POC[numpocs].prg1 = give_progression(POC[numpocs].progorder);
+                                       numpocs++;
+                                       while (*s && *s != '/') {
+                                               s++;
+                                       }
+                                       if (!*s) {
+                                               break;
+                                       }
+                                       s++;
+                               }
+                               parameters->numpocs = numpocs;
+                       }
+                       break;
+
+                               /* ------------------------------------------------------ */
+
+                       case 'S':                       /* SOP marker */
+                       {
+                               parameters->csty |= 0x02;
+                       }
+                       break;
+
+                               /* ------------------------------------------------------ */
+
+                       case 'E':                       /* EPH marker */
+                       {
+                               parameters->csty |= 0x04;
+                       }
+                       break;
+
+                               /* ------------------------------------------------------ */
+
+                       case 'M':                       /* Mode switch pas tous au point !! */
+                       {
+                               int value = 0;
+                               if (sscanf(opj_optarg, "%d", &value) == 1) {
+                                       for (i = 0; i <= 5; i++) {
+                                               int cache = value & (1 << i);
+                                               if (cache)
+                                                       parameters->mode |= (1 << i);
+                                       }
+                               }
+                       }
+                       break;
+
+                               /* ------------------------------------------------------ */
+
+                       case 'R':                       /* ROI */
+                       {
+                               if (sscanf(opj_optarg, "c=%d,U=%d", &parameters->roi_compno,
+                                           &parameters->roi_shift) != 2) {
+                                       fprintf(stderr, "ROI error !! [-ROI c='compno',U='shift']\n");
+                                       return 1;
+                               }
+                       }
+                       break;
+
+                               /* ------------------------------------------------------ */
+
+                       case 'T':                       /* Tile offset */
+                       {
+                               if (sscanf(opj_optarg, "%d,%d", &parameters->cp_tx0, &parameters->cp_ty0) != 2) {
+                                       fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]");
+                                       return 1;
+                               }
+                       }
+                       break;
+
+                               /* ------------------------------------------------------ */
+
+                       case 'C':                       /* add a comment */
+                       {
+                               parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1);
+                               if(parameters->cp_comment) {
+                                       strcpy(parameters->cp_comment, opj_optarg);
+                               }
+                       }
+                       break;
+
+
+                               /* ------------------------------------------------------ */
+
+                       case 'I':                       /* reversible or not */
+                       {
+                               parameters->irreversible = 1;
+                       }
+                       break;
+
+                       /* ------------------------------------------------------ */
+
+                       case 'u':                       /* Tile part generation*/
+                       {
+                               parameters->tp_flag = opj_optarg[0];
+                               parameters->tp_on = 1;
+                       }
+                       break;
+
+                               /* ------------------------------------------------------ */
+
+                       case 'z':                       /* Image Directory path */
+                       {
+                               img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1);
+                               strcpy(img_fol->imgdirpath,opj_optarg);
+                               img_fol->set_imgdir=1;
+                       }
+                       break;
+
+                               /* ------------------------------------------------------ */
+
+                       case 'w':                       /* Digital Cinema 2K profile compliance*/
+                       {
+                               int fps=0;
+                               sscanf(opj_optarg,"%d",&fps);
+                               if(fps == 24){
+                                       parameters->cp_cinema = CINEMA2K_24;
+                               }else if(fps == 48 ){
+                                       parameters->cp_cinema = CINEMA2K_48;
+                               }else {
+                                       fprintf(stderr,"Incorrect value!! must be 24 or 48\n");
+                                       return 1;
+                               }
+                               fprintf(stdout,"CINEMA 2K compliant codestream\n");
+                               parameters->cp_rsiz = CINEMA2K;
+
+                       }
+                       break;
+
+                               /* ------------------------------------------------------ */
+
+                       case 'y':                       /* Digital Cinema 4K profile compliance*/
+                       {
+                               parameters->cp_cinema = CINEMA4K_24;
+                               fprintf(stdout,"CINEMA 4K compliant codestream\n");
+                               parameters->cp_rsiz = CINEMA4K;
+                       }
+                       break;
+
+                               /* ------------------------------------------------------ */
+
+/* UniPG>> */
+#ifdef USE_JPWL
+                               /* ------------------------------------------------------ */
+
+                       case 'W':                       /* JPWL capabilities switched on */
+                       {
+                               char *token = NULL;
+                               int hprot, pprot, sens, addr, size, range;
+
+                               /* we need to enable indexing */
+                               if (!indexfilename || !*indexfilename) {
+                                       strncpy(indexfilename, JPWL_PRIVATEINDEX_NAME, OPJ_PATH_LEN);
+                               }
+
+                               /* search for different protection methods */
+
+                               /* break the option in comma points and parse the result */
+                               token = strtok(opj_optarg, ",");
+                               while(token != NULL) {
+
+                                       /* search header error protection method */
+                                       if (*token == 'h') {
+
+                                               static int tile = 0, tilespec = 0, lasttileno = 0;
+
+                                               hprot = 1; /* predefined method */
+
+                                               if(sscanf(token, "h=%d", &hprot) == 1) {
+                                                       /* Main header, specified */
+                                                       if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) ||
+                                                               ((hprot >= 37) && (hprot <= 128)))) {
+                                                               fprintf(stderr, "ERROR -> invalid main header protection method h = %d\n", hprot);
+                                                               return 1;
+                                                       }
+                                                       parameters->jpwl_hprot_MH = hprot;
+
+                                               } else if(sscanf(token, "h%d=%d", &tile, &hprot) == 2) {
+                                                       /* Tile part header, specified */
+                                                       if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) ||
+                                                               ((hprot >= 37) && (hprot <= 128)))) {
+                                                               fprintf(stderr, "ERROR -> invalid tile part header protection method h = %d\n", hprot);
+                                                               return 1;
+                                                       }
+                                                       if (tile < 0) {
+                                                               fprintf(stderr, "ERROR -> invalid tile part number on protection method t = %d\n", tile);
+                                                               return 1;
+                                                       }
+                                                       if (tilespec < JPWL_MAX_NO_TILESPECS) {
+                                                               parameters->jpwl_hprot_TPH_tileno[tilespec] = lasttileno = tile;
+                                                               parameters->jpwl_hprot_TPH[tilespec++] = hprot;
+                                                       }
+
+                                               } else if(sscanf(token, "h%d", &tile) == 1) {
+                                                       /* Tile part header, unspecified */
+                                                       if (tile < 0) {
+                                                               fprintf(stderr, "ERROR -> invalid tile part number on protection method t = %d\n", tile);
+                                                               return 1;
+                                                       }
+                                                       if (tilespec < JPWL_MAX_NO_TILESPECS) {
+                                                               parameters->jpwl_hprot_TPH_tileno[tilespec] = lasttileno = tile;
+                                                               parameters->jpwl_hprot_TPH[tilespec++] = hprot;
+                                                       }
+
+
+                                               } else if (!strcmp(token, "h")) {
+                                                       /* Main header, unspecified */
+                                                       parameters->jpwl_hprot_MH = hprot;
+
+                                               } else {
+                                                       fprintf(stderr, "ERROR -> invalid protection method selection = %s\n", token);
+                                                       return 1;
+                                               };
+
+                                       }
+
+                                       /* search packet error protection method */
+                                       if (*token == 'p') {
+
+                                               static int pack = 0, tile = 0, packspec = 0;
+
+                                               pprot = 1; /* predefined method */
+
+                                               if (sscanf(token, "p=%d", &pprot) == 1) {
+                                                       /* Method for all tiles and all packets */
+                                                       if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) ||
+                                                               ((pprot >= 37) && (pprot <= 128)))) {
+                                                               fprintf(stderr, "ERROR -> invalid default packet protection method p = %d\n", pprot);
+                                                               return 1;
+                                                       }
+                                                       parameters->jpwl_pprot_tileno[0] = 0;
+                                                       parameters->jpwl_pprot_packno[0] = 0;
+                                                       parameters->jpwl_pprot[0] = pprot;
+
+                                               } else if (sscanf(token, "p%d=%d", &tile, &pprot) == 2) {
+                                                       /* method specified from that tile on */
+                                                       if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) ||
+                                                               ((pprot >= 37) && (pprot <= 128)))) {
+                                                               fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot);
+                                                               return 1;
+                                                       }
+                                                       if (tile < 0) {
+                                                               fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile);
+                                                               return 1;
+                                                       }
+                                                       if (packspec < JPWL_MAX_NO_PACKSPECS) {
+                                                               parameters->jpwl_pprot_tileno[packspec] = tile;
+                                                               parameters->jpwl_pprot_packno[packspec] = 0;
+                                                               parameters->jpwl_pprot[packspec++] = pprot;
+                                                       }
+
+                                               } else if (sscanf(token, "p%d:%d=%d", &tile, &pack, &pprot) == 3) {
+                                                       /* method fully specified from that tile and that packet on */
+                                                       if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) ||
+                                                               ((pprot >= 37) && (pprot <= 128)))) {
+                                                               fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot);
+                                                               return 1;
+                                                       }
+                                                       if (tile < 0) {
+                                                               fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile);
+                                                               return 1;
+                                                       }
+                                                       if (pack < 0) {
+                                                               fprintf(stderr, "ERROR -> invalid packet number on protection method p = %d\n", pack);
+                                                               return 1;
+                                                       }
+                                                       if (packspec < JPWL_MAX_NO_PACKSPECS) {
+                                                               parameters->jpwl_pprot_tileno[packspec] = tile;
+                                                               parameters->jpwl_pprot_packno[packspec] = pack;
+                                                               parameters->jpwl_pprot[packspec++] = pprot;
+                                                       }
+
+                                               } else if (sscanf(token, "p%d:%d", &tile, &pack) == 2) {
+                                                       /* default method from that tile and that packet on */
+                                                       if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) ||
+                                                               ((pprot >= 37) && (pprot <= 128)))) {
+                                                               fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot);
+                                                               return 1;
+                                                       }
+                                                       if (tile < 0) {
+                                                               fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile);
+                                                               return 1;
+                                                       }
+                                                       if (pack < 0) {
+                                                               fprintf(stderr, "ERROR -> invalid packet number on protection method p = %d\n", pack);
+                                                               return 1;
+                                                       }
+                                                       if (packspec < JPWL_MAX_NO_PACKSPECS) {
+                                                               parameters->jpwl_pprot_tileno[packspec] = tile;
+                                                               parameters->jpwl_pprot_packno[packspec] = pack;
+                                                               parameters->jpwl_pprot[packspec++] = pprot;
+                                                       }
+
+                                               } else if (sscanf(token, "p%d", &tile) == 1) {
+                                                       /* default from a tile on */
+                                                       if (tile < 0) {
+                                                               fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile);
+                                                               return 1;
+                                                       }
+                                                       if (packspec < JPWL_MAX_NO_PACKSPECS) {
+                                                               parameters->jpwl_pprot_tileno[packspec] = tile;
+                                                               parameters->jpwl_pprot_packno[packspec] = 0;
+                                                               parameters->jpwl_pprot[packspec++] = pprot;
+                                                       }
+
+
+                                               } else if (!strcmp(token, "p")) {
+                                                       /* all default */
+                                                       parameters->jpwl_pprot_tileno[0] = 0;
+                                                       parameters->jpwl_pprot_packno[0] = 0;
+                                                       parameters->jpwl_pprot[0] = pprot;
+
+                                               } else {
+                                                       fprintf(stderr, "ERROR -> invalid protection method selection = %s\n", token);
+                                                       return 1;
+                                               };
+
+                                       }
+
+                                       /* search sensitivity method */
+                                       if (*token == 's') {
+
+                                               static int tile = 0, tilespec = 0, lasttileno = 0;
+
+                                               sens = 0; /* predefined: relative error */
+
+                                               if(sscanf(token, "s=%d", &sens) == 1) {
+                                                       /* Main header, specified */
+                                                       if ((sens < -1) || (sens > 7)) {
+                                                               fprintf(stderr, "ERROR -> invalid main header sensitivity method s = %d\n", sens);
+                                                               return 1;
+                                                       }
+                                                       parameters->jpwl_sens_MH = sens;
+
+                                               } else if(sscanf(token, "s%d=%d", &tile, &sens) == 2) {
+                                                       /* Tile part header, specified */
+                                                       if ((sens < -1) || (sens > 7)) {
+                                                               fprintf(stderr, "ERROR -> invalid tile part header sensitivity method s = %d\n", sens);
+                                                               return 1;
+                                                       }
+                                                       if (tile < 0) {
+                                                               fprintf(stderr, "ERROR -> invalid tile part number on sensitivity method t = %d\n", tile);
+                                                               return 1;
+                                                       }
+                                                       if (tilespec < JPWL_MAX_NO_TILESPECS) {
+                                                               parameters->jpwl_sens_TPH_tileno[tilespec] = lasttileno = tile;
+                                                               parameters->jpwl_sens_TPH[tilespec++] = sens;
+                                                       }
+
+                                               } else if(sscanf(token, "s%d", &tile) == 1) {
+                                                       /* Tile part header, unspecified */
+                                                       if (tile < 0) {
+                                                               fprintf(stderr, "ERROR -> invalid tile part number on sensitivity method t = %d\n", tile);
+                                                               return 1;
+                                                       }
+                                                       if (tilespec < JPWL_MAX_NO_TILESPECS) {
+                                                               parameters->jpwl_sens_TPH_tileno[tilespec] = lasttileno = tile;
+                                                               parameters->jpwl_sens_TPH[tilespec++] = hprot;
+                                                       }
+
+                                               } else if (!strcmp(token, "s")) {
+                                                       /* Main header, unspecified */
+                                                       parameters->jpwl_sens_MH = sens;
+
+                                               } else {
+                                                       fprintf(stderr, "ERROR -> invalid sensitivity method selection = %s\n", token);
+                                                       return 1;
+                                               };
+
+                                               parameters->jpwl_sens_size = 2; /* 2 bytes for default size */
+                                       }
+
+                                       /* search addressing size */
+                                       if (*token == 'a') {
+
+
+                                               addr = 0; /* predefined: auto */
+
+                                               if(sscanf(token, "a=%d", &addr) == 1) {
+                                                       /* Specified */
+                                                       if ((addr != 0) && (addr != 2) && (addr != 4)) {
+                                                               fprintf(stderr, "ERROR -> invalid addressing size a = %d\n", addr);
+                                                               return 1;
+                                                       }
+                                                       parameters->jpwl_sens_addr = addr;
+
+                                               } else if (!strcmp(token, "a")) {
+                                                       /* default */
+                                                       parameters->jpwl_sens_addr = addr; /* auto for default size */
+
+                                               } else {
+                                                       fprintf(stderr, "ERROR -> invalid addressing selection = %s\n", token);
+                                                       return 1;
+                                               };
+
+                                       }
+
+                                       /* search sensitivity size */
+                                       if (*token == 'z') {
+
+
+                                               size = 1; /* predefined: 1 byte */
+
+                                               if(sscanf(token, "z=%d", &size) == 1) {
+                                                       /* Specified */
+                                                       if ((size != 0) && (size != 1) && (size != 2)) {
+                                                               fprintf(stderr, "ERROR -> invalid sensitivity size z = %d\n", size);
+                                                               return 1;
+                                                       }
+                                                       parameters->jpwl_sens_size = size;
+
+                                               } else if (!strcmp(token, "a")) {
+                                                       /* default */
+                                                       parameters->jpwl_sens_size = size; /* 1 for default size */
+
+                                               } else {
+                                                       fprintf(stderr, "ERROR -> invalid size selection = %s\n", token);
+                                                       return 1;
+                                               };
+
+                                       }
+
+                                       /* search range method */
+                                       if (*token == 'g') {
+
+
+                                               range = 0; /* predefined: 0 (packet) */
+
+                                               if(sscanf(token, "g=%d", &range) == 1) {
+                                                       /* Specified */
+                                                       if ((range < 0) || (range > 3)) {
+                                                               fprintf(stderr, "ERROR -> invalid sensitivity range method g = %d\n", range);
+                                                               return 1;
+                                                       }
+                                                       parameters->jpwl_sens_range = range;
+
+                                               } else if (!strcmp(token, "g")) {
+                                                       /* default */
+                                                       parameters->jpwl_sens_range = range;
+
+                                               } else {
+                                                       fprintf(stderr, "ERROR -> invalid range selection = %s\n", token);
+                                                       return 1;
+                                               };
+
+                                       }
+
+                                       /* next token or bust */
+                                       token = strtok(NULL, ",");
+                               };
+
+
+                               /* some info */
+                               fprintf(stdout, "Info: JPWL capabilities enabled\n");
+                               parameters->jpwl_epc_on = OPJ_TRUE;
+
+                       }
+                       break;
+#endif /* USE_JPWL */
+/* <<UniPG */
+/* ------------------------------------------------------ */
+                       
+                       case 'J':                       /* jpip on */
+                       {
+                         /*parameters->jpip_on = OPJ_TRUE;*/
+                       }
+                       break;
+                               /* ------------------------------------------------------ */
+
+
+                       default:
+                               fprintf(stderr, "ERROR -> Command line not valid\n");
+                               return 1;
+               }
+       }while(c != -1);
+
+       /* check for possible errors */
+       if (parameters->cp_cinema){
+               if(parameters->tcp_numlayers > 1){
+                       parameters->cp_rsiz = STD_RSIZ;
+       fprintf(stdout,"Warning: DC profiles do not allow more than one quality layer. The codestream created will not be compliant with the DC profile\n");
+               }
+       }
+       if(img_fol->set_imgdir == 1){
+               if(!(parameters->infile[0] == 0)){
+                       fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n");
+                       return 1;
+               }
+               if(img_fol->set_out_format == 0){
+                       fprintf(stderr, "Error: When -ImgDir is used, -OutFor <FORMAT> must be used !!\n");
+                       fprintf(stderr, "Only one format allowed! Valid formats are j2k and jp2!!\n");
+                       return 1;
+               }
+               if(!((parameters->outfile[0] == 0))){
+                       fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n");
+                       fprintf(stderr, "Specify OutputFormat using -OutFor<FORMAT> !!\n");
+                       return 1;
+               }
+       }else{
+               if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {
+                       fprintf(stderr, "Example: %s -i image.ppm  -o image.j2k\n",argv[0]);
+                       fprintf(stderr, "    Try: %s -h\n",argv[0]);
+                       return 1;
+               }
+       }
+
+       if (parameters->decod_format == RAW_DFMT && raw_cp->rawWidth == 0) {
+                       fprintf(stderr,"\nError: invalid raw image parameters\n");
+                       fprintf(stderr,"Please use the Format option -F:\n");
+                       fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n");
+                                               fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n");
+                       fprintf(stderr,"Aborting\n");
+                       return 1;
+       }
+
+       if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality)
+               && (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_alloc ^ parameters->cp_fixed_quality))) {
+               fprintf(stderr, "Error: options -r -q and -f cannot be used together !!\n");
+               return 1;
+       }                               /* mod fixed_quality */
+
+       /* if no rate entered, lossless by default */
+       if (parameters->tcp_numlayers == 0) {
+               parameters->tcp_rates[0] = 0;   /* MOD antonin : losslessbug */
+               parameters->tcp_numlayers++;
+               parameters->cp_disto_alloc = 1;
+       }
+
+       if((parameters->cp_tx0 > parameters->image_offset_x0) || (parameters->cp_ty0 > parameters->image_offset_y0)) {
+               fprintf(stderr,
+                       "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n",
+                       parameters->cp_tx0, parameters->image_offset_x0, parameters->cp_ty0, parameters->image_offset_y0);
+               return 1;
+       }
+
+       for (i = 0; i < parameters->numpocs; i++) {
+               if (parameters->POC[i].prg == -1) {
+                       fprintf(stderr,
+                               "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n",
+                               i + 1);
+               }
+       }
+
+       return 0;
+}
+
+/* -------------------------------------------------------------------------- */
+
+/**
+sample error callback expecting a FILE* client object
+*/
+void error_callback(const char *msg, void *client_data) {
+       FILE *stream = (FILE*)client_data;
+       fprintf(stream, "[ERROR] %s", msg);
+}
+/**
+sample warning callback expecting a FILE* client object
+*/
+void warning_callback(const char *msg, void *client_data) {
+       FILE *stream = (FILE*)client_data;
+       fprintf(stream, "[WARNING] %s", msg);
+}
+/**
+sample debug callback expecting a FILE* client object
+*/
+void info_callback(const char *msg, void *client_data) {
+       FILE *stream = (FILE*)client_data;
+       fprintf(stream, "[INFO] %s", msg);
+}
+
+/* -------------------------------------------------------------------------- */
+
+int main(int argc, char **argv) {
+       opj_bool bSuccess;
+       opj_cparameters_t parameters;   /* compression parameters */
+       img_fol_t img_fol;
+       opj_event_mgr_t event_mgr;              /* event manager */
+       opj_image_t *image = NULL;
+       int i,num_images;
+       int imageno;
+       dircnt_t *dirptr = NULL;
+       raw_cparameters_t raw_cp;
+       opj_codestream_info_t cstr_info;                /* Codestream information structure */
+       char indexfilename[OPJ_PATH_LEN];       /* index file name */
+
+       /*
+       configure the event callbacks (not required)
+       setting of each callback is optionnal
+       */
+       memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
+       event_mgr.error_handler = error_callback;
+       event_mgr.warning_handler = warning_callback;
+       event_mgr.info_handler = info_callback;
+
+       /* set encoding parameters to default values */
+       opj_set_default_encoder_parameters(&parameters);
+
+       /* Initialize indexfilename and img_fol */
+       *indexfilename = 0;
+       memset(&img_fol,0,sizeof(img_fol_t));
+
+       /* parse input and get user encoding parameters */
+       if(parse_cmdline_encoder(argc, argv, &parameters,&img_fol, &raw_cp, indexfilename) == 1) {
+               return 1;
+       }
+
+       if (parameters.cp_cinema){
+               img_fol.rates = (float*)malloc(parameters.tcp_numlayers * sizeof(float));
+               for(i=0; i< parameters.tcp_numlayers; i++){
+                       img_fol.rates[i] = parameters.tcp_rates[i];
+               }
+               cinema_parameters(&parameters);
+       }
+
+       /* Create comment for codestream */
+       if(parameters.cp_comment == NULL) {
+    const char comment[] = "Created by OpenJPEG version ";
+               const size_t clen = strlen(comment);
+    const char *version = opj_version();
+/* UniPG>> */
+#ifdef USE_JPWL
+               parameters.cp_comment = (char*)malloc(clen+strlen(version)+11);
+               sprintf(parameters.cp_comment,"%s%s with JPWL", comment, version);
+#else
+               parameters.cp_comment = (char*)malloc(clen+strlen(version)+1);
+               sprintf(parameters.cp_comment,"%s%s", comment, version);
+#endif
+/* <<UniPG */
+       }
+
+       /* Read directory if necessary */
+       if(img_fol.set_imgdir==1){
+               num_images=get_num_images(img_fol.imgdirpath);
+               dirptr=(dircnt_t*)malloc(sizeof(dircnt_t));
+               if(dirptr){
+                       dirptr->filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char));     /* Stores at max 10 image file names*/
+                       dirptr->filename = (char**) malloc(num_images*sizeof(char*));
+                       if(!dirptr->filename_buf){
+                               return 0;
+                       }
+                       for(i=0;i<num_images;i++){
+                               dirptr->filename[i] = dirptr->filename_buf + i*OPJ_PATH_LEN;
+                       }
+               }
+               if(load_images(dirptr,img_fol.imgdirpath)==1){
+                       return 0;
+               }
+               if (num_images==0){
+                       fprintf(stdout,"Folder is empty\n");
+                       return 0;
+               }
+       }else{
+               num_images=1;
+       }
+       /*Encoding image one by one*/
+       for(imageno=0;imageno<num_images;imageno++)     {
+               image = NULL;
+               fprintf(stderr,"\n");
+
+               if(img_fol.set_imgdir==1){
+                       if (get_next_file(imageno, dirptr,&img_fol, &parameters)) {
+                               fprintf(stderr,"skipping file...\n");
+                               continue;
+                       }
+               }
+               switch(parameters.decod_format) {
+                       case PGX_DFMT:
+                               break;
+                       case PXM_DFMT:
+                               break;
+                       case BMP_DFMT:
+                               break;
+                       case TIF_DFMT:
+                               break;
+                       case RAW_DFMT:
+                               break;
+                       case TGA_DFMT:
+                               break;
+                       case PNG_DFMT:
+                               break;
+                       default:
+                               fprintf(stderr,"skipping file...\n");
+                               continue;
+               }
+
+                       /* decode the source image */
+                       /* ----------------------- */
+
+                       switch (parameters.decod_format) {
+                               case PGX_DFMT:
+                                       image = pgxtoimage(parameters.infile, &parameters);
+                                       if (!image) {
+                                               fprintf(stderr, "Unable to load pgx file\n");
+                                               return 1;
+                                       }
+                                       break;
+
+                               case PXM_DFMT:
+                                       image = pnmtoimage(parameters.infile, &parameters);
+                                       if (!image) {
+                                               fprintf(stderr, "Unable to load pnm file\n");
+                                               return 1;
+                                       }
+                                       break;
+
+                               case BMP_DFMT:
+                                       image = bmptoimage(parameters.infile, &parameters);
+                                       if (!image) {
+                                               fprintf(stderr, "Unable to load bmp file\n");
+                                               return 1;
+                                       }
+                                       break;
+#ifdef HAVE_LIBTIFF
+                               case TIF_DFMT:
+                                       image = tiftoimage(parameters.infile, &parameters);
+                                       if (!image) {
+                                               fprintf(stderr, "Unable to load tiff file\n");
+                                               return 1;
+                                       }
+                               break;
+#endif /* HAVE_LIBTIFF */
+                               case RAW_DFMT:
+                                       image = rawtoimage(parameters.infile, &parameters, &raw_cp);
+                                       if (!image) {
+                                               fprintf(stderr, "Unable to load raw file\n");
+                                               return 1;
+                                       }
+                               break;
+
+                               case TGA_DFMT:
+                                       image = tgatoimage(parameters.infile, &parameters);
+                                       if (!image) {
+                                               fprintf(stderr, "Unable to load tga file\n");
+                                               return 1;
+                                       }
+                               break;
+#ifdef HAVE_LIBPNG
+                               case PNG_DFMT:
+                                       image = pngtoimage(parameters.infile, &parameters);
+                                       if (!image) {
+                                               fprintf(stderr, "Unable to load png file\n");
+                                               return 1;
+                                       }
+                                       break;
+#endif /* HAVE_LIBPNG */
+               }
+/* Can happen if input file is TIFF or PNG 
+ * and HAVE_LIBTIF or HAVE_LIBPNG is undefined
+*/
+                       if( !image)
+                  {
+                       fprintf(stderr, "Unable to load file: got no image\n");
+                       return 1;
+                  }
+                       /* Decide if MCT should be used */
+                       parameters.tcp_mct = image->numcomps == 3 ? 1 : 0;
+
+                       if(parameters.cp_cinema){
+                               cinema_setup_encoder(&parameters,image,&img_fol);
+                       }
+
+                       /* encode the destination image */
+                       /* ---------------------------- */
+
+                       if (parameters.cod_format == J2K_CFMT) {        /* J2K format output */
+                               int codestream_length;
+        size_t res;
+                               opj_cio_t *cio = NULL;
+                               FILE *f = NULL;
+
+                               /* get a J2K compressor handle */
+                               opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K);
+
+                               /* catch events using our callbacks and give a local context */
+                               opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);
+
+                               /* setup the encoder parameters using the current image and user parameters */
+                               opj_setup_encoder(cinfo, &parameters, image);
+
+                               /* open a byte stream for writing */
+                               /* allocate memory for all tiles */
+                               cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
+
+                               /* encode the image */
+                               if (*indexfilename)                                     /* If need to extract codestream information*/
+                                 bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info);
+                               else
+                                       bSuccess = opj_encode(cinfo, cio, image, NULL);
+                               if (!bSuccess) {
+                                       opj_cio_close(cio);
+                                       fprintf(stderr, "failed to encode image\n");
+                                       return 1;
+                               }
+                               codestream_length = cio_tell(cio);
+
+                               /* write the buffer to disk */
+                               f = fopen(parameters.outfile, "wb");
+                               if (!f) {
+                                       fprintf(stderr, "failed to open %s for writing\n", parameters.outfile);
+                                       return 1;
+                               }
+                               res = fwrite(cio->buffer, 1, codestream_length, f);
+        if( res < (size_t)codestream_length ) { /* FIXME */
+                                       fprintf(stderr, "failed to write %d (%s)\n", codestream_length, parameters.outfile);
+                                       return 1;
+         }
+                               fclose(f);
+
+                               fprintf(stderr,"Generated outfile %s\n",parameters.outfile);
+                               /* close and free the byte stream */
+                               opj_cio_close(cio);
+
+                               /* Write the index to disk */
+                               if (*indexfilename) {
+                                       bSuccess = write_index_file(&cstr_info, indexfilename);
+                                       if (bSuccess) {
+                                               fprintf(stderr, "Failed to output index file into [%s]\n", indexfilename);
+                                       }
+                               }
+
+                               /* free remaining compression structures */
+                               opj_destroy_compress(cinfo);
+                               if (*indexfilename)
+                                       opj_destroy_cstr_info(&cstr_info);
+                       } else {                        /* JP2 format output */
+                               int codestream_length;
+        size_t res;
+                               opj_cio_t *cio = NULL;
+                               FILE *f = NULL;
+                               opj_cinfo_t *cinfo = NULL;
+
+                               /* get a JP2 compressor handle */                               
+                               cinfo = opj_create_compress(CODEC_JP2);
+
+                               /* catch events using our callbacks and give a local context */
+                               opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);
+
+                               /* setup the encoder parameters using the current image and using user parameters */
+                               opj_setup_encoder(cinfo, &parameters, image);
+
+                               /* open a byte stream for writing */
+                               /* allocate memory for all tiles */
+                               cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
+
+                               /* encode the image */
+                               if (*indexfilename /*|| parameters.jpip_on*/) /* If need to extract codestream information*/
+                                 bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info);
+                               else
+                                       bSuccess = opj_encode(cinfo, cio, image, NULL);
+                               if (!bSuccess) {
+                                       opj_cio_close(cio);
+                                       fprintf(stderr, "failed to encode image\n");
+                                       return 1;
+                               }
+                               codestream_length = cio_tell(cio);
+
+                               /* write the buffer to disk */
+                               f = fopen(parameters.outfile, "wb");
+                               if (!f) {
+                                       fprintf(stderr, "failed to open %s for writing\n", parameters.outfile);
+                                       return 1;
+                               }
+                               res = fwrite(cio->buffer, 1, codestream_length, f);
+        if( res < (size_t)codestream_length ) { /* FIXME */
+                                       fprintf(stderr, "failed to write %d (%s)\n", codestream_length, parameters.outfile);
+                                       return 1;
+         }
+                               fclose(f);
+                               fprintf(stderr,"Generated outfile %s\n",parameters.outfile);
+                               /* close and free the byte stream */
+                               opj_cio_close(cio);
+
+                               /* Write the index to disk */
+                               if (*indexfilename) {
+                                       bSuccess = write_index_file(&cstr_info, indexfilename);
+                                       if (bSuccess) {
+                                               fprintf(stderr, "Failed to output index file\n");
+                                       }
+                               }
+
+                               /* free remaining compression structures */
+                               opj_destroy_compress(cinfo);
+                               if (*indexfilename)
+                                       opj_destroy_cstr_info(&cstr_info);
+                       }
+
+                       /* free image data */
+                       opj_image_destroy(image);
+       }
+
+       /* free user parameters structure */
+  if(parameters.cp_comment) free(parameters.cp_comment);
+       if(parameters.cp_matrice) free(parameters.cp_matrice);
+
+       return 0;
+}
diff --git a/src/bin/jpwl/opj_jpwl_decompress.c b/src/bin/jpwl/opj_jpwl_decompress.c
new file mode 100644 (file)
index 0000000..36967b2
--- /dev/null
@@ -0,0 +1,854 @@
+/*
+ * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2007, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * 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.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef _WIN32
+#include "windirent.h"
+#else
+#include <dirent.h>
+#endif /* _WIN32 */
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <strings.h>
+#define _stricmp strcasecmp
+#define _strnicmp strncasecmp
+#endif /* _WIN32 */
+
+#include "opj_config.h"
+#include "openjpeg.h"
+#include "opj_getopt.h"
+#include "convert.h"
+#include "index.h"
+
+#ifdef HAVE_LIBLCMS2
+#include <lcms2.h>
+#endif
+#ifdef HAVE_LIBLCMS1
+#include <lcms.h>
+#endif
+#include "color.h"
+
+#include "format_defs.h"
+
+typedef struct dircnt{
+       /** Buffer for holding images read from Directory*/
+       char *filename_buf;
+       /** Pointer to the buffer*/
+       char **filename;
+}dircnt_t;
+
+
+typedef struct img_folder{
+       /** The directory path of the folder containing input images*/
+       char *imgdirpath;
+       /** Output format*/
+       const char *out_format;
+       /** Enable option*/
+       char set_imgdir;
+       /** Enable Cod Format for output*/
+       char set_out_format;
+
+}img_fol_t;
+
+void decode_help_display(void) {
+       fprintf(stdout,"HELP for j2k_to_image\n----\n\n");
+       fprintf(stdout,"- the -h option displays this help information on screen\n\n");
+
+/* UniPG>> */
+       fprintf(stdout,"List of parameters for the JPEG 2000 "
+#ifdef USE_JPWL
+               "+ JPWL "
+#endif /* USE_JPWL */
+               "decoder:\n");
+/* <<UniPG */
+       fprintf(stdout,"\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"  -ImgDir \n");
+       fprintf(stdout,"        Image file Directory path \n");
+       fprintf(stdout,"  -OutFor \n");
+       fprintf(stdout,"    REQUIRED only if -ImgDir is used\n");
+       fprintf(stdout,"          Need to specify only format without filename <BMP>  \n");
+       fprintf(stdout,"    Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA formats\n");
+       fprintf(stdout,"  -i <compressed file>\n");
+       fprintf(stdout,"    REQUIRED only if an Input image directory not specified\n");
+       fprintf(stdout,"    Currently accepts J2K-files, JP2-files and JPT-files. The file type\n");
+       fprintf(stdout,"    is identified based on its suffix.\n");
+       fprintf(stdout,"  -o <decompressed file>\n");
+       fprintf(stdout,"    REQUIRED\n");
+       fprintf(stdout,"    Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA files\n");
+       fprintf(stdout,"    Binary data is written to the file (not ascii). If a PGX\n");
+       fprintf(stdout,"    filename is given, there will be as many output files as there are\n");
+       fprintf(stdout,"    components: an indice starting from 0 will then be appended to the\n");
+       fprintf(stdout,"    output filename, just before the \"pgx\" extension. If a PGM filename\n");
+       fprintf(stdout,"    is given and there are more than one component, only the first component\n");
+       fprintf(stdout,"    will be written to the file.\n");
+       fprintf(stdout,"  -r <reduce factor>\n");
+       fprintf(stdout,"    Set the number of highest resolution levels to be discarded. The\n");
+       fprintf(stdout,"    image resolution is effectively divided by 2 to the power of the\n");
+       fprintf(stdout,"    number of discarded levels. The reduce factor is limited by the\n");
+       fprintf(stdout,"    smallest total number of decomposition levels among tiles.\n");
+       fprintf(stdout,"  -l <number of quality layers to decode>\n");
+       fprintf(stdout,"    Set the maximum number of quality layers to decode. If there are\n");
+       fprintf(stdout,"    less quality layers than the specified number, all the quality layers\n");
+       fprintf(stdout,"    are decoded.\n");
+       fprintf(stdout,"  -x  \n"); 
+       fprintf(stdout,"    Create an index file *.Idx (-x index_name.Idx) \n");
+       fprintf(stdout,"\n");
+/* UniPG>> */
+#ifdef USE_JPWL
+       fprintf(stdout,"  -W <options>\n");
+       fprintf(stdout,"    Activates the JPWL correction capability, if the codestream complies.\n");
+       fprintf(stdout,"    Options can be a comma separated list of <param=val> tokens:\n");
+       fprintf(stdout,"    c, c=numcomps\n");
+       fprintf(stdout,"       numcomps is the number of expected components in the codestream\n");
+       fprintf(stdout,"       (search of first EPB rely upon this, default is %d)\n", JPWL_EXPECTED_COMPONENTS);
+#endif /* USE_JPWL */
+/* <<UniPG */
+       fprintf(stdout,"\n");
+}
+
+/* -------------------------------------------------------------------------- */
+
+int get_num_images(char *imgdirpath){
+       DIR *dir;
+       struct dirent* content; 
+       int num_images = 0;
+
+       /*Reading the input images from given input directory*/
+
+       dir= opendir(imgdirpath);
+       if(!dir){
+               fprintf(stderr,"Could not open Folder %s\n",imgdirpath);
+               return 0;
+       }
+       
+       while((content=readdir(dir))!=NULL){
+               if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 )
+                       continue;
+               num_images++;
+       }
+       return num_images;
+}
+
+int load_images(dircnt_t *dirptr, char *imgdirpath){
+       DIR *dir;
+       struct dirent* content; 
+       int i = 0;
+
+       /*Reading the input images from given input directory*/
+
+       dir= opendir(imgdirpath);
+       if(!dir){
+               fprintf(stderr,"Could not open Folder %s\n",imgdirpath);
+               return 1;
+       }else   {
+               fprintf(stderr,"Folder opened successfully\n");
+       }
+       
+       while((content=readdir(dir))!=NULL){
+               if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 )
+                       continue;
+
+               strcpy(dirptr->filename[i],content->d_name);
+               i++;
+       }
+       return 0;       
+}
+
+int get_file_format(char *filename) {
+       unsigned int i;
+       static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" };
+       static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT };
+       char * ext = strrchr(filename, '.');
+       if (ext == NULL)
+               return -1;
+       ext++;
+       if(ext) {
+               for(i = 0; i < sizeof(format)/sizeof(*format); i++) {
+                       if(_strnicmp(ext, extension[i], 3) == 0) {
+                               return format[i];
+                       }
+               }
+       }
+
+       return -1;
+}
+
+char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_dparameters_t *parameters){
+       char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN];
+       char *temp_p, temp1[OPJ_PATH_LEN]="";
+
+       strcpy(image_filename,dirptr->filename[imageno]);
+       fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename);
+       parameters->decod_format = get_file_format(image_filename);
+       if (parameters->decod_format == -1)
+               return 1;
+       sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename);
+       strncpy(parameters->infile, infilename, sizeof(infilename));
+
+       /*Set output file*/
+       strcpy(temp_ofname,strtok(image_filename,"."));
+       while((temp_p = strtok(NULL,".")) != NULL){
+               strcat(temp_ofname,temp1);
+               sprintf(temp1,".%s",temp_p);
+       }
+       if(img_fol->set_out_format==1){
+               sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format);
+               strncpy(parameters->outfile, outfilename, sizeof(outfilename));
+       }
+       return 0;
+}
+
+/* -------------------------------------------------------------------------- */
+int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,img_fol_t *img_fol, char *indexfilename) {
+       /* parse the command line */
+       int totlen, c;
+       opj_option_t long_option[]={
+               {"ImgDir",REQ_ARG, NULL ,'y'},
+               {"OutFor",REQ_ARG, NULL ,'O'},
+       };
+
+       const char optlist[] = "i:o:r:l:x:"
+
+/* UniPG>> */
+#ifdef USE_JPWL
+                                       "W:"
+#endif /* USE_JPWL */
+/* <<UniPG */
+                       "h"             ;
+       totlen=sizeof(long_option);
+       img_fol->set_out_format = 0;
+       do {
+               c = opj_getopt_long(argc, argv,optlist,long_option,totlen);
+               if (c == -1)
+                       break;
+               switch (c) {
+                       case 'i':                       /* input file */
+                       {
+                               char *infile = opj_optarg;
+                               parameters->decod_format = get_file_format(infile);
+                               switch(parameters->decod_format) {
+                                       case J2K_CFMT:
+                                       case JP2_CFMT:
+                                       case JPT_CFMT:
+                                               break;
+                                       default:
+                                               fprintf(stderr, 
+                                                       "!! Unrecognized format for infile : %s [accept only *.j2k, *.jp2, *.jpc or *.jpt] !!\n\n", 
+                                                       infile);
+                                               return 1;
+                               }
+                               strncpy(parameters->infile, infile, sizeof(parameters->infile)-1);
+                       }
+                       break;
+                               
+                               /* ----------------------------------------------------- */
+
+                       case 'o':                       /* output file */
+                       {
+                               char *outfile = opj_optarg;
+                               parameters->cod_format = get_file_format(outfile);
+                               switch(parameters->cod_format) {
+                                       case PGX_DFMT:
+                                       case PXM_DFMT:
+                                       case BMP_DFMT:
+                                       case TIF_DFMT:
+                                       case RAW_DFMT:
+                                       case TGA_DFMT:
+                                       case PNG_DFMT:
+                                               break;
+                                       default:
+                                               fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outfile);
+                                               return 1;
+                               }
+                               strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1);
+                       }
+                       break;
+                       
+                               /* ----------------------------------------------------- */
+
+                       case 'O':                       /* output format */
+                       {
+                               char outformat[50];
+                               char *of = opj_optarg;
+                               sprintf(outformat,".%s",of);
+                               img_fol->set_out_format = 1;
+                               parameters->cod_format = get_file_format(outformat);
+                               switch(parameters->cod_format) {
+                                       case PGX_DFMT:
+                                               img_fol->out_format = "pgx";
+                                               break;
+                                       case PXM_DFMT:
+                                               img_fol->out_format = "ppm";
+                                               break;
+                                       case BMP_DFMT:
+                                               img_fol->out_format = "bmp";
+                                               break;
+                                       case TIF_DFMT:
+                                               img_fol->out_format = "tif";
+                                               break;
+                                       case RAW_DFMT:
+                                               img_fol->out_format = "raw";
+                                               break;
+                                       case TGA_DFMT:
+                                               img_fol->out_format = "raw";
+                                               break;
+                                       case PNG_DFMT:
+                                               img_fol->out_format = "png";
+                                               break;
+                                       default:
+                                               fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outformat);
+                                               return 1;
+                                               break;
+                               }
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+
+                       case 'r':               /* reduce option */
+                       {
+                               sscanf(opj_optarg, "%d", &parameters->cp_reduce);
+                       }
+                       break;
+                       
+                               /* ----------------------------------------------------- */
+      
+
+                       case 'l':               /* layering option */
+                       {
+                               sscanf(opj_optarg, "%d", &parameters->cp_layer);
+                       }
+                       break;
+                       
+                               /* ----------------------------------------------------- */
+
+                       case 'h':                       /* display an help description */
+                               decode_help_display();
+                               return 1;                               
+
+                               /* ------------------------------------------------------ */
+
+                       case 'y':                       /* Image Directory path */
+                               {
+                                       img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1);
+                                       strcpy(img_fol->imgdirpath,opj_optarg);
+                                       img_fol->set_imgdir=1;
+                               }
+                               break;
+                               /* ----------------------------------------------------- */                                                             
+                       case 'x':                       /* Creation of index file */
+                               {
+                                       char *index = opj_optarg;
+                                       strncpy(indexfilename, index, OPJ_PATH_LEN);
+                               }
+                               break;
+                               /* ----------------------------------------------------- */
+                               /* UniPG>> */
+#ifdef USE_JPWL
+                       
+                       case 'W':                       /* activate JPWL correction */
+                       {
+                               char *token = NULL;
+
+                               token = strtok(opj_optarg, ",");
+                               while(token != NULL) {
+
+                                       /* search expected number of components */
+                                       if (*token == 'c') {
+
+                                               static int compno;
+
+                                               compno = JPWL_EXPECTED_COMPONENTS; /* predefined no. of components */
+
+                                               if(sscanf(token, "c=%d", &compno) == 1) {
+                                                       /* Specified */
+                                                       if ((compno < 1) || (compno > 256)) {
+                                                               fprintf(stderr, "ERROR -> invalid number of components c = %d\n", compno);
+                                                               return 1;
+                                                       }
+                                                       parameters->jpwl_exp_comps = compno;
+
+                                               } else if (!strcmp(token, "c")) {
+                                                       /* default */
+                                                       parameters->jpwl_exp_comps = compno; /* auto for default size */
+
+                                               } else {
+                                                       fprintf(stderr, "ERROR -> invalid components specified = %s\n", token);
+                                                       return 1;
+                                               };
+                                       }
+
+                                       /* search maximum number of tiles */
+                                       if (*token == 't') {
+
+                                               static int tileno;
+
+                                               tileno = JPWL_MAXIMUM_TILES; /* maximum no. of tiles */
+
+                                               if(sscanf(token, "t=%d", &tileno) == 1) {
+                                                       /* Specified */
+                                                       if ((tileno < 1) || (tileno > JPWL_MAXIMUM_TILES)) {
+                                                               fprintf(stderr, "ERROR -> invalid number of tiles t = %d\n", tileno);
+                                                               return 1;
+                                                       }
+                                                       parameters->jpwl_max_tiles = tileno;
+
+                                               } else if (!strcmp(token, "t")) {
+                                                       /* default */
+                                                       parameters->jpwl_max_tiles = tileno; /* auto for default size */
+
+                                               } else {
+                                                       fprintf(stderr, "ERROR -> invalid tiles specified = %s\n", token);
+                                                       return 1;
+                                               };
+                                       }
+
+                                       /* next token or bust */
+                                       token = strtok(NULL, ",");
+                               };
+                               parameters->jpwl_correct = OPJ_TRUE;
+                               fprintf(stdout, "JPWL correction capability activated\n");
+                               fprintf(stdout, "- expecting %d components\n", parameters->jpwl_exp_comps);
+                       }
+                       break;  
+#endif /* USE_JPWL */
+/* <<UniPG */            
+
+                               /* ----------------------------------------------------- */
+                       
+                       default:
+                               fprintf(stderr,"WARNING -> this option is not valid \"-%c %s\"\n",c, opj_optarg);
+                               break;
+               }
+       }while(c != -1);
+
+       /* check for possible errors */
+       if(img_fol->set_imgdir==1){
+               if(!(parameters->infile[0]==0)){
+                       fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n");
+                       return 1;
+               }
+               if(img_fol->set_out_format == 0){
+                       fprintf(stderr, "Error: When -ImgDir is used, -OutFor <FORMAT> must be used !!\n");
+                       fprintf(stderr, "Only one format allowed! Valid format PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA!!\n");
+                       return 1;
+               }
+               if(!((parameters->outfile[0] == 0))){
+                       fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n");
+                       return 1;
+               }
+       }else{
+               if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {
+                       fprintf(stderr, "Example: %s -i image.j2k -o image.pgm\n",argv[0]);
+                       fprintf(stderr, "    Try: %s -h\n",argv[0]);
+                       return 1;
+               }
+       }
+
+       return 0;
+}
+
+/* -------------------------------------------------------------------------- */
+
+/**
+sample error callback expecting a FILE* client object
+*/
+void error_callback(const char *msg, void *client_data) {
+       FILE *stream = (FILE*)client_data;
+       fprintf(stream, "[ERROR] %s", msg);
+}
+/**
+sample warning callback expecting a FILE* client object
+*/
+void warning_callback(const char *msg, void *client_data) {
+       FILE *stream = (FILE*)client_data;
+       fprintf(stream, "[WARNING] %s", msg);
+}
+/**
+sample debug callback expecting no client object
+*/
+void info_callback(const char *msg, void *client_data) {
+       (void)client_data;
+       fprintf(stdout, "[INFO] %s", msg);
+}
+
+/* -------------------------------------------------------------------------- */
+
+int main(int argc, char **argv) {
+       opj_dparameters_t parameters;   /* decompression parameters */
+       img_fol_t img_fol;
+       opj_event_mgr_t event_mgr;              /* event manager */
+       opj_image_t *image = NULL;
+       FILE *fsrc = NULL;
+       unsigned char *src = NULL;
+       int file_length;
+       int num_images;
+       int i,imageno;
+       dircnt_t *dirptr = NULL;
+       opj_dinfo_t* dinfo = NULL;      /* handle to a decompressor */
+       opj_cio_t *cio = NULL;
+       opj_codestream_info_t cstr_info;  /* Codestream information structure */
+       char indexfilename[OPJ_PATH_LEN];       /* index file name */
+
+       /* configure the event callbacks (not required) */
+       memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
+       event_mgr.error_handler = error_callback;
+       event_mgr.warning_handler = warning_callback;
+       event_mgr.info_handler = info_callback;
+
+       /* set decoding parameters to default values */
+       opj_set_default_decoder_parameters(&parameters);
+
+       /* Initialize indexfilename and img_fol */
+       *indexfilename = 0;
+       memset(&img_fol,0,sizeof(img_fol_t));
+
+       /* parse input and get user encoding parameters */
+       if(parse_cmdline_decoder(argc, argv, &parameters,&img_fol, indexfilename) == 1) {
+               return 1;
+       }
+
+       /* Initialize reading of directory */
+       if(img_fol.set_imgdir==1){      
+               num_images=get_num_images(img_fol.imgdirpath);
+
+               dirptr=(dircnt_t*)malloc(sizeof(dircnt_t));
+               if(dirptr){
+                       dirptr->filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char));     /* Stores at max 10 image file names*/
+                       dirptr->filename = (char**) malloc(num_images*sizeof(char*));
+
+                       if(!dirptr->filename_buf){
+                               return 1;
+                       }
+                       for(i=0;i<num_images;i++){
+                               dirptr->filename[i] = dirptr->filename_buf + i*OPJ_PATH_LEN;
+                       }
+               }
+               if(load_images(dirptr,img_fol.imgdirpath)==1){
+                       return 1;
+               }
+               if (num_images==0){
+                       fprintf(stdout,"Folder is empty\n");
+                       return 1;
+               }
+       }else{
+               num_images=1;
+       }
+
+       /*Encoding image one by one*/
+       for(imageno = 0; imageno < num_images ; imageno++)      {
+               image = NULL;
+               fprintf(stderr,"\n");
+
+               if(img_fol.set_imgdir==1){
+                       if (get_next_file(imageno, dirptr,&img_fol, &parameters)) {
+                               fprintf(stderr,"skipping file...\n");
+                               continue;
+                       }
+               }
+
+               /* read the input file and put it in memory */
+               /* ---------------------------------------- */
+               fsrc = fopen(parameters.infile, "rb");
+               if (!fsrc) {
+                       fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile);
+                       return 1;
+               }
+               fseek(fsrc, 0, SEEK_END);
+               file_length = ftell(fsrc);
+               fseek(fsrc, 0, SEEK_SET);
+               src = (unsigned char *) malloc(file_length);
+               if (fread(src, 1, file_length, fsrc) != (size_t)file_length)
+               {
+                       free(src);
+                       fclose(fsrc);
+                       fprintf(stderr, "\nERROR: fread return a number of element different from the expected.\n");
+                       return 1;
+               }
+               fclose(fsrc);
+
+               /* decode the code-stream */
+               /* ---------------------- */
+
+               switch(parameters.decod_format) {
+               case J2K_CFMT:
+               {
+                       /* JPEG-2000 codestream */
+
+                       /* get a decoder handle */
+                       dinfo = opj_create_decompress(CODEC_J2K);
+
+                       /* catch events using our callbacks and give a local context */
+                       opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
+
+                       /* setup the decoder decoding parameters using user parameters */
+                       opj_setup_decoder(dinfo, &parameters);
+
+                       /* open a byte stream */
+                       cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
+
+                       /* decode the stream and fill the image structure */
+                       if (*indexfilename)                             /* If need to extract codestream information*/
+                               image = opj_decode_with_info(dinfo, cio, &cstr_info);
+                       else
+                               image = opj_decode(dinfo, cio);
+                       if(!image) {
+                               fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
+                               opj_destroy_decompress(dinfo);
+                               opj_cio_close(cio);
+                               free(src);
+                               return 1;
+                       }
+
+                       /* close the byte stream */
+                       opj_cio_close(cio);
+
+                       /* Write the index to disk */
+                       if (*indexfilename) {
+                               opj_bool bSuccess;
+                               bSuccess = write_index_file(&cstr_info, indexfilename);
+                               if (bSuccess) {
+                                       fprintf(stderr, "Failed to output index file\n");
+                               }
+                       }
+               }
+               break;
+
+               case JP2_CFMT:
+               {
+                       /* JPEG 2000 compressed image data */
+
+                       /* get a decoder handle */
+                       dinfo = opj_create_decompress(CODEC_JP2);
+
+                       /* catch events using our callbacks and give a local context */
+                       opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
+
+                       /* setup the decoder decoding parameters using the current image and user parameters */
+                       opj_setup_decoder(dinfo, &parameters);
+
+                       /* open a byte stream */
+                       cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
+
+                       /* decode the stream and fill the image structure */
+                       if (*indexfilename)                             /* If need to extract codestream information*/
+                               image = opj_decode_with_info(dinfo, cio, &cstr_info);
+                       else
+                               image = opj_decode(dinfo, cio);                 
+                       if(!image) {
+                               fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
+                               opj_destroy_decompress(dinfo);
+                               opj_cio_close(cio);
+                               free(src);
+                               return 1;
+                       }
+
+                       /* close the byte stream */
+                       opj_cio_close(cio);
+
+                       /* Write the index to disk */
+                       if (*indexfilename) {
+                               opj_bool bSuccess;
+                               bSuccess = write_index_file(&cstr_info, indexfilename);
+                               if (bSuccess) {
+                                       fprintf(stderr, "Failed to output index file\n");
+                               }
+                       }
+               }
+               break;
+
+               case JPT_CFMT:
+               {
+                       /* JPEG 2000, JPIP */
+
+                       /* get a decoder handle */
+                       dinfo = opj_create_decompress(CODEC_JPT);
+
+                       /* catch events using our callbacks and give a local context */
+                       opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
+
+                       /* setup the decoder decoding parameters using user parameters */
+                       opj_setup_decoder(dinfo, &parameters);
+
+                       /* open a byte stream */
+                       cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
+
+                       /* decode the stream and fill the image structure */
+                       if (*indexfilename)                             /* If need to extract codestream information*/
+                               image = opj_decode_with_info(dinfo, cio, &cstr_info);
+                       else
+                               image = opj_decode(dinfo, cio);
+                       if(!image) {
+                               fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
+                               opj_destroy_decompress(dinfo);
+                               opj_cio_close(cio);
+                               free(src);
+                               return 1;
+                       }
+
+                       /* close the byte stream */
+                       opj_cio_close(cio);
+
+                       /* Write the index to disk */
+                       if (*indexfilename) {
+                               opj_bool bSuccess;
+                               bSuccess = write_index_file(&cstr_info, indexfilename);
+                               if (bSuccess) {
+                                       fprintf(stderr, "Failed to output index file\n");
+                               }
+                       }
+               }
+               break;
+
+               default:
+                       fprintf(stderr, "skipping file..\n");
+                       continue;
+       }
+
+               /* free the memory containing the code-stream */
+               free(src);
+               src = NULL;
+
+       if(image->color_space == CLRSPC_SYCC)
+   {
+       color_sycc_to_rgb(image);
+   }
+
+       if(image->icc_profile_buf)
+   {
+#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
+       color_apply_icc_profile(image);
+#endif
+
+       free(image->icc_profile_buf);
+       image->icc_profile_buf = NULL; image->icc_profile_len = 0;
+   }
+
+               /* create output image */
+               /* ------------------- */
+               switch (parameters.cod_format) {
+               case PXM_DFMT:                  /* PNM PGM PPM */
+                       if (imagetopnm(image, parameters.outfile)) {
+                               fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
+                       }
+                       else {
+                               fprintf(stdout,"Generated Outfile %s\n",parameters.outfile);
+                       }
+                       break;
+
+               case PGX_DFMT:                  /* PGX */
+                       if(imagetopgx(image, parameters.outfile)){
+                               fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
+                       }
+                       else {
+                               fprintf(stdout,"Generated Outfile %s\n",parameters.outfile);
+                       }
+                       break;
+
+               case BMP_DFMT:                  /* BMP */
+                       if(imagetobmp(image, parameters.outfile)){
+                               fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
+                       }
+                       else {
+                               fprintf(stdout,"Generated Outfile %s\n",parameters.outfile);
+                       }
+                       break;
+#ifdef HAVE_LIBTIFF
+               case TIF_DFMT:                  /* TIFF */
+                       if(imagetotif(image, parameters.outfile)){
+                               fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
+                       }
+                       else {
+                               fprintf(stdout,"Generated Outfile %s\n",parameters.outfile);
+                       }
+                       break;
+#endif /* HAVE_LIBTIFF */
+               case RAW_DFMT:                  /* RAW */
+                       if(imagetoraw(image, parameters.outfile)){
+                               fprintf(stdout,"Error generating raw file. Outfile %s not generated\n",parameters.outfile);
+                       }
+                       else {
+                               fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile);
+                       }
+                       break;
+
+               case TGA_DFMT:                  /* TGA */
+                       if(imagetotga(image, parameters.outfile)){
+                               fprintf(stdout,"Error generating tga file. Outfile %s not generated\n",parameters.outfile);
+                       }
+                       else {
+                               fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile);
+                       }
+                       break;
+#ifdef HAVE_LIBPNG
+               case PNG_DFMT:                  /* PNG */
+                       if(imagetopng(image, parameters.outfile)){
+                               fprintf(stdout,"Error generating png file. Outfile %s not generated\n",parameters.outfile);
+                       }
+                       else {
+                               fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile);
+                       }
+                       break;
+#endif /* HAVE_LIBPNG */
+/* Can happen if output file is TIFF or PNG
+ * and HAVE_LIBTIF or HAVE_LIBPNG is undefined
+*/
+                       default:
+                               fprintf(stderr,"Outfile %s not generated\n",parameters.outfile);
+               }
+
+               /* free remaining structures */
+               if(dinfo) {
+                       opj_destroy_decompress(dinfo);
+               }
+               /* free codestream information structure */
+               if (*indexfilename)     
+                       opj_destroy_cstr_info(&cstr_info);
+               /* free image data structure */
+               opj_image_destroy(image);
+
+       }
+       return 0;
+}
+/*end main*/
+
+
+
+
diff --git a/src/bin/jpwl/windirent.h b/src/bin/jpwl/windirent.h
new file mode 100644 (file)
index 0000000..944b7d7
--- /dev/null
@@ -0,0 +1,679 @@
+
+/*
+ * uce-dirent.h - operating system independent dirent implementation
+ * 
+ * Copyright (C) 1998-2002  Toni Ronkko
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * ``Software''), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL TONI RONKKO BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ * 
+ * May 28 1998, Toni Ronkko <tronkko@messi.uku.fi>
+ *
+ * $Id: uce-dirent.h,v 1.7 2002/05/13 10:48:35 tr Exp $
+ *
+ * $Log: uce-dirent.h,v $
+ * Revision 1.7  2002/05/13 10:48:35  tr
+ * embedded some source code directly to the header so that no source
+ * modules need to be included in the MS Visual C project using the
+ * interface, removed all the dependencies to other headers of the `uce'
+ * library so that the header can be made public
+ *
+ * Revision 1.6  2002/04/12 16:22:04  tr
+ * Unified Compiling Environment (UCE) replaced `std' library
+ *
+ * Revision 1.5  2001/07/20 16:33:40  tr
+ * moved to `std' library and re-named defines accordingly
+ *
+ * Revision 1.4  2001/07/10 16:47:18  tronkko
+ * revised comments
+ *
+ * Revision 1.3  2001/01/11 13:16:43  tr
+ * using ``uce-machine.h'' for finding out defines such as `FREEBSD'
+ *
+ * Revision 1.2  2000/10/08 16:00:41  tr
+ * copy of FreeBSD man page
+ *
+ * Revision 1.1  2000/07/10 05:53:16  tr
+ * Initial revision
+ *
+ * Revision 1.2  1998/07/19 18:29:14  tr
+ * Added error reporting capabilities and some asserts.
+ *
+ * Revision 1.1  1998/07/04 16:27:51  tr
+ * Initial revision
+ *
+ * 
+ * MSVC 1.0 scans automatic dependencies incorrectly when your project
+ * contains this very header.  The problem is that MSVC cannot handle
+ * include directives inside #if..#endif block those are never entered.
+ * Since this header ought to compile in many different operating systems,
+ * there had to be several conditional blocks that are compiled only in
+ * operating systems for what they were designed for.  MSVC 1.0 cannot
+ * handle inclusion of sys/dir.h in a part that is compiled only in Apollo
+ * operating system.  To fix the problem you need to insert DIR.H into
+ * SYSINCL.DAT located in MSVC\BIN directory and restart visual C++.
+ * Consult manuals for more informaton about the problem.
+ *
+ * Since many UNIX systems have dirent.h we assume to have one also.
+ * However, if your UNIX system does not have dirent.h you can download one
+ * for example at: http://ftp.uni-mannheim.de/ftp/GNU/dirent/dirent.tar.gz.
+ * You can also see if you have one of dirent.h, direct.h, dir.h, ndir.h,
+ * sys/dir.h and sys/ndir.h somewhere.  Try defining HAVE_DIRENT_H,
+ * HAVE_DIRECT_H, HAVE_DIR_H, HAVE_NDIR_H, HAVE_SYS_DIR_H and
+ * HAVE_SYS_NDIR_H according to the files found.
+ */
+#ifndef DIRENT_H
+#define DIRENT_H
+#define DIRENT_H_INCLUDED
+
+/* find out platform */
+#if defined(MSDOS)                             /* MS-DOS */
+#elif defined(__MSDOS__)                       /* Turbo C/Borland */
+# define MSDOS
+#elif defined(__DOS__)                         /* Watcom */
+# define MSDOS
+#endif
+
+#if defined(WIN32)                             /* MS-Windows */
+#elif defined(__NT__)                          /* Watcom */
+# define WIN32
+#elif defined(_WIN32)                          /* Microsoft */
+# define WIN32
+#elif defined(__WIN32__)                       /* Borland */
+# define WIN32
+#endif
+
+/*
+ * See what kind of dirent interface we have unless autoconf has already
+ * determinated that.
+ */
+#if !defined(HAVE_DIRENT_H) && !defined(HAVE_DIRECT_H) && !defined(HAVE_SYS_DIR_H) && !defined(HAVE_NDIR_H) && !defined(HAVE_SYS_NDIR_H) && !defined(HAVE_DIR_H)
+# if defined(_MSC_VER)                         /* Microsoft C/C++ */
+    /* no dirent.h */
+# elif defined(__MINGW32__)                    /* MinGW */
+    /* no dirent.h */
+# elif defined(__BORLANDC__)                   /* Borland C/C++ */
+#   define HAVE_DIRENT_H
+#   define VOID_CLOSEDIR
+# elif defined(__TURBOC__)                     /* Borland Turbo C */
+    /* no dirent.h */
+# elif defined(__WATCOMC__)                    /* Watcom C/C++ */
+#   define HAVE_DIRECT_H
+# elif defined(__apollo)                       /* Apollo */
+#   define HAVE_SYS_DIR_H
+# elif defined(__hpux)                         /* HP-UX */
+#   define HAVE_DIRENT_H
+# elif (defined(__alpha) || defined(__alpha__)) && !defined(__linux__)  /* Alpha OSF1 */
+#   error "not implemented"
+# elif defined(__sgi)                          /* Silicon Graphics */
+#   define HAVE_DIRENT_H
+# elif defined(sun) || defined(__sun)           /* Sun Solaris */
+#   define HAVE_DIRENT_H
+# elif defined(__FreeBSD__)                    /* FreeBSD */
+#   define HAVE_DIRENT_H
+# elif defined(__linux__)                      /* Linux */
+#   define HAVE_DIRENT_H
+# elif defined(__GNUC__)                       /* GNU C/C++ */
+#   define HAVE_DIRENT_H
+# else
+#   error "not implemented"
+# endif
+#endif
+
+/* include proper interface headers */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+# ifdef FREEBSD
+#   define NAMLEN(dp) ((int)((dp)->d_namlen))
+# else
+#   define NAMLEN(dp) ((int)(strlen((dp)->d_name)))
+# endif
+
+#elif defined(HAVE_NDIR_H)
+# include <ndir.h>
+# define NAMLEN(dp) ((int)((dp)->d_namlen))
+
+#elif defined(HAVE_SYS_NDIR_H)
+# include <sys/ndir.h>
+# define NAMLEN(dp) ((int)((dp)->d_namlen))
+
+#elif defined(HAVE_DIRECT_H)
+# include <direct.h>
+# define NAMLEN(dp) ((int)((dp)->d_namlen))
+
+#elif defined(HAVE_DIR_H)
+# include <dir.h>
+# define NAMLEN(dp) ((int)((dp)->d_namlen))
+
+#elif defined(HAVE_SYS_DIR_H)
+# include <sys/types.h>
+# include <sys/dir.h>
+# ifndef dirent
+#   define dirent direct
+# endif
+# define NAMLEN(dp) ((int)((dp)->d_namlen))
+
+#elif defined(MSDOS) || defined(WIN32)
+
+  /* figure out type of underlaying directory interface to be used */
+# if defined(WIN32)
+#   define DIRENT_WIN32_INTERFACE
+# elif defined(MSDOS)
+#   define DIRENT_MSDOS_INTERFACE
+# else
+#   error "missing native dirent interface"
+# endif
+
+  /*** WIN32 specifics ***/
+# if defined(DIRENT_WIN32_INTERFACE)
+#   include <windows.h>
+#   if !defined(DIRENT_MAXNAMLEN)
+#     define DIRENT_MAXNAMLEN (MAX_PATH)
+#   endif
+
+
+  /*** MS-DOS specifics ***/
+# elif defined(DIRENT_MSDOS_INTERFACE)
+#   include <dos.h>
+
+    /* Borland defines file length macros in dir.h */
+#   if defined(__BORLANDC__)
+#     include <dir.h>
+#     if !defined(DIRENT_MAXNAMLEN)
+#       define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT))
+#     endif
+#     if !defined(_find_t)
+#       define _find_t find_t
+#     endif
+
+    /* Turbo C defines ffblk structure in dir.h */
+#   elif defined(__TURBOC__)
+#     include <dir.h>
+#     if !defined(DIRENT_MAXNAMLEN)
+#       define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT))
+#     endif
+#     define DIRENT_USE_FFBLK
+
+    /* MSVC */
+#   elif defined(_MSC_VER)
+#     if !defined(DIRENT_MAXNAMLEN)
+#       define DIRENT_MAXNAMLEN (12)
+#     endif
+
+    /* Watcom */
+#   elif defined(__WATCOMC__)
+#     if !defined(DIRENT_MAXNAMLEN)
+#       if defined(__OS2__) || defined(__NT__)
+#         define DIRENT_MAXNAMLEN (255)
+#       else
+#         define DIRENT_MAXNAMLEN (12)
+#       endif
+#     endif
+
+#   endif
+# endif
+
+  /*** generic MS-DOS and MS-Windows stuff ***/
+# if !defined(NAME_MAX) && defined(DIRENT_MAXNAMLEN)
+#   define NAME_MAX DIRENT_MAXNAMLEN
+# endif
+# if NAME_MAX < DIRENT_MAXNAMLEN
+#   error "assertion failed: NAME_MAX >= DIRENT_MAXNAMLEN"
+# endif
+
+
+  /*
+   * Substitute for real dirent structure.  Note that `d_name' field is a
+   * true character array although we have it copied in the implementation
+   * dependent data.  We could save some memory if we had declared `d_name'
+   * as a pointer refering the name within implementation dependent data.
+   * We have not done that since some code may rely on sizeof(d_name) to be
+   * something other than four.  Besides, directory entries are typically so
+   * small that it takes virtually no time to copy them from place to place.
+   */
+  typedef struct dirent {
+    char d_name[NAME_MAX + 1];
+
+    /*** Operating system specific part ***/
+# if defined(DIRENT_WIN32_INTERFACE)       /*WIN32*/
+    WIN32_FIND_DATA data;
+# elif defined(DIRENT_MSDOS_INTERFACE)     /*MSDOS*/
+#   if defined(DIRENT_USE_FFBLK)
+    struct ffblk data;
+#   else
+    struct _find_t data;
+#   endif
+# endif
+  } dirent;
+
+  /* DIR substitute structure containing directory name.  The name is
+   * essential for the operation of ``rewinndir'' function. */
+  typedef struct DIR {
+    char          *dirname;                    /* directory being scanned */
+    dirent        current;                     /* current entry */
+    int           dirent_filled;               /* is current un-processed? */
+
+  /*** Operating system specific part ***/
+#  if defined(DIRENT_WIN32_INTERFACE)
+    HANDLE        search_handle;
+#  elif defined(DIRENT_MSDOS_INTERFACE)
+#  endif
+  } DIR;
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* supply prototypes for dirent functions */
+static DIR *opendir (const char *dirname);
+static struct dirent *readdir (DIR *dirp);
+static int closedir (DIR *dirp);
+static void rewinddir (DIR *dirp);
+
+/*
+ * Implement dirent interface as static functions so that the user does not
+ * need to change his project in any way to use dirent function.  With this
+ * it is sufficient to include this very header from source modules using
+ * dirent functions and the functions will be pulled in automatically.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+/* use ffblk instead of _find_t if requested */
+#if defined(DIRENT_USE_FFBLK)
+# define _A_ARCH   (FA_ARCH)
+# define _A_HIDDEN (FA_HIDDEN)
+# define _A_NORMAL (0)
+# define _A_RDONLY (FA_RDONLY)
+# define _A_SUBDIR (FA_DIREC)
+# define _A_SYSTEM (FA_SYSTEM)
+# define _A_VOLID  (FA_LABEL)
+# define _dos_findnext(dest) findnext(dest)
+# define _dos_findfirst(name,flags,dest) findfirst(name,dest,flags)
+#endif
+
+static int _initdir (DIR *p);
+static const char *_getdirname (const struct dirent *dp);
+static void _setdirname (struct DIR *dirp);
+
+/*
+ * <function name="opendir">
+ * <intro>open directory stream for reading
+ * <syntax>DIR *opendir (const char *dirname);
+ *
+ * <desc>Open named directory stream for read and return pointer to the
+ * internal working area that is used for retrieving individual directory
+ * entries.  The internal working area has no fields of your interest.
+ *
+ * <ret>Returns a pointer to the internal working area or NULL in case the 
+ * directory stream could not be opened.  Global `errno' variable will set
+ * in case of error as follows:
+ *
+ * <table>
+ * [EACESS  |Permission denied.
+ * [EMFILE  |Too many open files used by the process.
+ * [ENFILE  |Too many open files in system.
+ * [ENOENT  |Directory does not exist.
+ * [ENOMEM  |Insufficient memory.
+ * [ENOTDIR |dirname does not refer to directory.  This value is not
+ *           reliable on MS-DOS and MS-Windows platforms.  Many
+ *           implementations return ENOENT even when the name refers to a
+ *           file.]
+ * </table>
+ * </function>
+ */
+static DIR *opendir(const char *dirname)
+{
+  DIR *dirp;
+  assert (dirname != NULL);
+  
+  dirp = (DIR*)malloc (sizeof (struct DIR));
+  if (dirp != NULL) {
+    char *p;
+    
+    /* allocate room for directory name */
+    dirp->dirname = (char*) malloc (strlen (dirname) + 1 + strlen ("\\*.*"));
+    if (dirp->dirname == NULL) {
+      /* failed to duplicate directory name.  errno set by malloc() */
+      free (dirp);
+      return NULL;
+    }
+    /* Copy directory name while appending directory separator and "*.*".
+     * Directory separator is not appended if the name already ends with
+     * drive or directory separator.  Directory separator is assumed to be
+     * '/' or '\' and drive separator is assumed to be ':'. */
+    strcpy (dirp->dirname, dirname);
+    p = strchr (dirp->dirname, '\0');
+    if (dirp->dirname < p  &&
+        *(p - 1) != '\\'  &&  *(p - 1) != '/'  &&  *(p - 1) != ':')
+    {
+      strcpy (p++, "\\");
+    }
+# ifdef DIRENT_WIN32_INTERFACE
+    strcpy (p, "*"); /*scan files with and without extension in win32*/
+# else
+    strcpy (p, "*.*"); /*scan files with and without extension in DOS*/
+# endif
+
+    /* open stream */
+    if (_initdir (dirp) == 0) {
+      /* initialization failed */
+      free (dirp->dirname);
+      free (dirp);
+      return NULL;
+    }
+  }
+  return dirp;
+}
+
+
+/*
+ * <function name="readdir">
+ * <intro>read a directory entry
+ * <syntax>struct dirent *readdir (DIR *dirp);
+ *
+ * <desc>Read individual directory entry and return pointer to a structure
+ * containing the name of the entry.  Individual directory entries returned
+ * include normal files, sub-directories, pseudo-directories "." and ".."
+ * and also volume labels, hidden files and system files in MS-DOS and
+ * MS-Windows.   You might want to use stat(2) function to determinate which
+ * one are you dealing with.  Many dirent implementations already contain
+ * equivalent information in dirent structure but you cannot depend on
+ * this.
+ *
+ * The dirent structure contains several system dependent fields that
+ * generally have no interest to you.  The only interesting one is char
+ * d_name[] that is also portable across different systems.  The d_name
+ * field contains the name of the directory entry without leading path.
+ * While d_name is portable across different systems the actual storage
+ * capacity of d_name varies from system to system and there is no portable
+ * way to find out it at compile time as different systems define the
+ * capacity of d_name with different macros and some systems do not define
+ * capacity at all (besides actual declaration of the field). If you really
+ * need to find out storage capacity of d_name then you might want to try
+ * NAME_MAX macro. The NAME_MAX is defined in POSIX standard althought
+ * there are many MS-DOS and MS-Windows implementations those do not define
+ * it.  There are also systems that declare d_name as "char d_name[1]" and
+ * then allocate suitable amount of memory at run-time.  Thanks to Alain
+ * Decamps (Alain.Decamps@advalvas.be) for pointing it out to me.
+ *
+ * This all leads to the fact that it is difficult to allocate space
+ * for the directory names when the very same program is being compiled on
+ * number of operating systems.  Therefore I suggest that you always
+ * allocate space for directory names dynamically.
+ *
+ * <ret>
+ * Returns a pointer to a structure containing name of the directory entry
+ * in `d_name' field or NULL if there was an error.  In case of an error the
+ * global `errno' variable will set as follows:
+ *
+ * <table>
+ * [EBADF  |dir parameter refers to an invalid directory stream.  This value
+ *          is not set reliably on all implementations.]
+ * </table>
+ * </function>
+ */
+static struct dirent *
+readdir (DIR *dirp)
+{
+  assert(dirp != NULL);
+  if (dirp == NULL) {
+    errno = EBADF;
+    return NULL;
+  }
+
+#if defined(DIRENT_WIN32_INTERFACE)
+  if (dirp->search_handle == INVALID_HANDLE_VALUE) {
+    /* directory stream was opened/rewound incorrectly or it ended normally */
+    errno = EBADF;
+    return NULL;
+  }
+#endif
+
+  if (dirp->dirent_filled != 0) {
+    /*
+     * Directory entry has already been retrieved and there is no need to
+     * retrieve a new one.  Directory entry will be retrieved in advance
+     * when the user calls readdir function for the first time.  This is so
+     * because real dirent has separate functions for opening and reading
+     * the stream whereas Win32 and DOS dirents open the stream
+     * automatically when we retrieve the first file.  Therefore, we have to
+     * save the first file when opening the stream and later we have to
+     * return the saved entry when the user tries to read the first entry.
+     */
+    dirp->dirent_filled = 0;
+  } else {
+    /* fill in entry and return that */
+#if defined(DIRENT_WIN32_INTERFACE)
+    if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) {
+      /* Last file has been processed or an error occured */
+      FindClose (dirp->search_handle);
+      dirp->search_handle = INVALID_HANDLE_VALUE;
+      errno = ENOENT;
+      return NULL;
+    }
+
+# elif defined(DIRENT_MSDOS_INTERFACE)
+    if (_dos_findnext (&dirp->current.data) != 0) {
+      /* _dos_findnext and findnext will set errno to ENOENT when no
+       * more entries could be retrieved. */
+      return NULL;
+    }
+# endif
+
+    _setdirname (dirp);
+    assert (dirp->dirent_filled == 0);
+  }
+  return &dirp->current;
+}
+
+
+/*
+ * <function name="closedir">
+ * <intro>close directory stream.
+ * <syntax>int closedir (DIR *dirp);
+ *
+ * <desc>Close directory stream opened by the `opendir' function.  Close of
+ * directory stream invalidates the DIR structure as well as previously read
+ * dirent entry.
+ *
+ * <ret>The function typically returns 0 on success and -1 on failure but
+ * the function may be declared to return void on same systems.  At least
+ * Borland C/C++ and some UNIX implementations use void as a return type.
+ * The dirent wrapper tries to define VOID_CLOSEDIR whenever closedir is
+ * known to return nothing.  The very same definition is made by the GNU
+ * autoconf if you happen to use it.
+ *
+ * The global `errno' variable will set to EBADF in case of error.
+ * </function>
+ */
+static int
+closedir (DIR *dirp)
+{   
+  int retcode = 0;
+
+  /* make sure that dirp points to legal structure */
+  assert (dirp != NULL);
+  if (dirp == NULL) {
+    errno = EBADF;
+    return -1;
+  }
+  /* free directory name and search handles */
+  if (dirp->dirname != NULL) free (dirp->dirname);
+
+#if defined(DIRENT_WIN32_INTERFACE)
+  if (dirp->search_handle != INVALID_HANDLE_VALUE) {
+    if (FindClose (dirp->search_handle) == FALSE) {
+      /* Unknown error */
+      retcode = -1;
+      errno = EBADF;
+    }
+  }
+#endif                     
+
+  /* clear dirp structure to make sure that it cannot be used anymore*/
+  memset (dirp, 0, sizeof (*dirp));
+# if defined(DIRENT_WIN32_INTERFACE)
+  dirp->search_handle = INVALID_HANDLE_VALUE;
+# endif
+
+  free (dirp);
+  return retcode;
+}
+
+
+/*
+ * <function name="rewinddir">
+ * <intro>rewind directory stream to the beginning
+ * <syntax>void rewinddir (DIR *dirp);
+ *
+ * <desc>Rewind directory stream to the beginning so that the next call of
+ * readdir() returns the very first directory entry again.  However, note
+ * that next call of readdir() may not return the same directory entry as it
+ * did in first time.  The directory stream may have been affected by newly
+ * created files.
+ *
+ * Almost every dirent implementation ensure that rewinddir will update
+ * the directory stream to reflect any changes made to the directory entries
+ * since the previous ``opendir'' or ``rewinddir'' call.  Keep an eye on
+ * this if your program depends on the feature.  I know at least one dirent
+ * implementation where you are required to close and re-open the stream to
+ * see the changes.
+ *
+ * <ret>Returns nothing.  If something went wrong while rewinding, you will
+ * notice it later when you try to retrieve the first directory entry.
+ */
+static void
+rewinddir (DIR *dirp)
+{   
+  /* make sure that dirp is legal */
+  assert (dirp != NULL);
+  if (dirp == NULL) {
+    errno = EBADF;
+    return;
+  }
+  assert (dirp->dirname != NULL);
+  
+  /* close previous stream */
+#if defined(DIRENT_WIN32_INTERFACE)
+  if (dirp->search_handle != INVALID_HANDLE_VALUE) {
+    if (FindClose (dirp->search_handle) == FALSE) {
+      /* Unknown error */
+      errno = EBADF;
+    }
+  }
+#endif
+
+  /* re-open previous stream */
+  if (_initdir (dirp) == 0) {
+    /* initialization failed but we cannot deal with error.  User will notice
+     * error later when she tries to retrieve first directory enty. */
+    /*EMPTY*/;
+  }
+}
+
+
+/*
+ * Open native directory stream object and retrieve first file.
+ * Be sure to close previous stream before opening new one.
+ */
+static int
+_initdir (DIR *dirp)
+{ 
+  assert (dirp != NULL);
+  assert (dirp->dirname != NULL);
+  dirp->dirent_filled = 0;
+
+# if defined(DIRENT_WIN32_INTERFACE)
+  /* Open stream and retrieve first file */
+  dirp->search_handle = FindFirstFile (dirp->dirname, &dirp->current.data);
+  if (dirp->search_handle == INVALID_HANDLE_VALUE) {
+    /* something went wrong but we don't know what.  GetLastError() could
+     * give us more information about the error, but then we should map
+     * the error code into errno. */
+    errno = ENOENT;
+    return 0;
+  }
+
+# elif defined(DIRENT_MSDOS_INTERFACE)
+  if (_dos_findfirst (dirp->dirname,
+          _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN,
+          &dirp->current.data) != 0)
+  {
+    /* _dos_findfirst and findfirst will set errno to ENOENT when no 
+     * more entries could be retrieved. */
+    return 0;
+  }
+# endif
+
+  /* initialize DIR and it's first entry */
+  _setdirname (dirp);
+  dirp->dirent_filled = 1;
+  return 1;
+}
+
+
+/*
+ * Return implementation dependent name of the current directory entry.
+ */
+static const char *
+_getdirname (const struct dirent *dp)
+{
+#if defined(DIRENT_WIN32_INTERFACE)
+  return dp->data.cFileName;
+  
+#elif defined(DIRENT_USE_FFBLK)
+  return dp->data.ff_name;
+  
+#else
+  return dp->data.name;
+#endif  
+}
+
+
+/*
+ * Copy name of implementation dependent directory entry to the d_name field.
+ */
+static void
+_setdirname (struct DIR *dirp) {
+  /* make sure that d_name is long enough */
+  assert (strlen (_getdirname (&dirp->current)) <= NAME_MAX);
+  
+  strncpy (dirp->current.d_name,
+      _getdirname (&dirp->current),
+      NAME_MAX);
+  dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/
+}
+  
+# ifdef __cplusplus
+}
+# endif
+# define NAMLEN(dp) ((int)(strlen((dp)->d_name)))
+
+#else
+# error "missing dirent interface"
+#endif
+
+
+#endif /*DIRENT_H*/
index 39ea7419ea9b085411ca2a0eeb0a63aefc52264a..616edf58c06d20b99fff7f9d7da66742114a8cda 100644 (file)
@@ -3,25 +3,24 @@
 add_definitions(-DUSE_JPWL)
 
 set(OPENJPEG_SRCS
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/bio.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/cio.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/dwt.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/event.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/image.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/j2k.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/jp2.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/jpt.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/mct.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/mqc.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/openjpeg.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/opj_clock.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/pi.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/raw.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/t1.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/t2.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/tcd.c
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/tgt.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/function_list.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/bio.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/cio.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/dwt.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/event.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/image.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/j2k.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/jp2.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/jpt.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/mct.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/mqc.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/openjpeg.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/j2k_lib.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/pi.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/raw.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/t1.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/t2.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/tcd.c
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/tgt.c
 )
 
 set(JPWL_SRCS crc.c jpwl.c jpwl_lib.c rs.c)
@@ -34,8 +33,8 @@ endif()
 
 include_directories(
   ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h
-  ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2
-  ${OPENJPEG_SOURCE_DIR}/src/lib
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2
+  ${OPENJPEG_SOURCE_DIR}/src/lib/openjpwl
   )
 
 # Build the library
index e5366f5e6de6a8c0d64f26ff372859340e969c14..e483390c751d2d51aa1bc7b33900d0bd4d098d31 100644 (file)
@@ -130,7 +130,7 @@ static INLINE long lrintf(float f){
 
 /* JPWL>> */
 #ifdef USE_JPWL
-#include "./jpwl/jpwl.h"
+#include "jpwl.h"
 #endif /* USE_JPWL */
 /* <<JPWL */