[trunk] Import patch from issue 171. Only the imagetoraw part was not applied.
authorMathieu Malaterre <mathieu.malaterre@gmail.com>
Thu, 27 Feb 2014 17:04:06 +0000 (17:04 +0000)
committerMathieu Malaterre <mathieu.malaterre@gmail.com>
Thu, 27 Feb 2014 17:04:06 +0000 (17:04 +0000)
Update issue 171

src/bin/jp2/convert.c

index 0b1291de84f028a07ee96d2303e54f62a04a2220..a4b52040ecfe2441b87f791df49f2368d792ebee 100644 (file)
@@ -406,7 +406,7 @@ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) {
 int imagetotga(opj_image_t * image, const char *outfile) {
     int width, height, bpp, x, y;
     OPJ_BOOL write_alpha;
-    int i, adjustR, adjustG, adjustB;
+    int i, v, adjustR, adjustG, adjustB, fails;
     unsigned int alpha_channel;
     float r,g,b,a;
     unsigned char value;
@@ -437,8 +437,9 @@ int imagetotga(opj_image_t * image, const char *outfile) {
 
     /* Write TGA header  */
     bpp = write_alpha ? 32 : 24;
+
     if (!tga_writeheader(fdest, bpp, width , height, OPJ_TRUE))
-        return 1;
+               goto fin;
 
     alpha_channel = image->numcomps-1;
 
@@ -448,56 +449,74 @@ int imagetotga(opj_image_t * image, const char *outfile) {
     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;
-                }
-            }
-        }
-    }
+       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 ... */
+       if(b > 255.) b = 255.; else if(b < 0.) b = 0.;
+       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);
+       goto fin;
+ }
+       if(g > 255.) g = 255.; else if(g < 0.) g = 0.;
+       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);
+       goto fin;
+ }
+       if(r > 255.) r = 255.; else if(r < 0.) r = 0.;
+       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);
+       goto fin;
+ }
+
+       if (write_alpha) 
+ {
+       a = (float)(image->comps[alpha_channel].data[index]);
+       if(a > 255.) a = 255.; else if(a < 0.) a = 0.;
+       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);
+               goto fin;
+          }
+ }
+  }
+   }
+       fails = 0;
+fin:
+       fclose(fdest);
 
-    return 0;
+       return fails;
 }
 
 /* -->> -->> -->> -->>
@@ -1397,70 +1416,90 @@ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) {
     return image;
 }
 
-int imagetopgx(opj_image_t * image, const char *outfile) {
+int imagetopgx(opj_image_t * image, const char *outfile) 
+{
     int w, h;
-    int i, j, compno;
+       int i, j, compno, fails;
     FILE *fdest = NULL;
 
-    for (compno = 0; compno < image->numcomps; compno++) {
-        opj_image_comp_t *comp = &image->comps[compno];
-        char bname[256]; /* buffer for name */
+       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 */
+
+    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);
-        }
+  }
+    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 ) {
+       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);
-    }
+  
+       fails = 1;
+       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, val = image->comps[compno].data[i];
+       unsigned char byte;
+
+       for (j = nbytes - 1; j >= 0; j--) 
+ {
+       v = (int)(val >> (j * 8));
+       if(v > 255) v = 255; else if(v < 0) v = 0;
+       byte = (unsigned char)v;
+       res = fwrite(&byte, 1, 1, fdest);
+
+               if( res < 1 ) 
+          {
+               fprintf(stderr, "failed to write 1 byte for %s\n", name);
+               goto fin;
+          }
+ }
+  }
+       fclose(fdest); fdest = NULL;
+   }
+       fails = 0;
+fin:
+       if(fdest) fclose(fdest);
 
-    return 0;
+       return fails;
 }
 
 /* -->> -->> -->> -->>
@@ -1893,7 +1932,9 @@ int imagetopnm(opj_image_t * image, const char *outfile)
     FILE *fdest = NULL;
     const char *tmp = outfile;
     char *destname;
-    alpha = NULL;
+
+       alpha = NULL;
+
     if((prec = image->comps[0].prec) > 16)
     {
         fprintf(stderr,"%s:%d:imagetopnm\n\tprecision %d is larger than 16"
@@ -1971,16 +2012,22 @@ int imagetopnm(opj_image_t * image, const char *outfile)
             if(two)
             {
                 v = *red + adjustR; ++red;
+if(v > 65535) v = 65535; else if(v < 0) v = 0;
+
                 /* netpbm: */
                 fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v);
 
                 if(triple)
                 {
                     v = *green + adjustG; ++green;
+if(v > 65535) v = 65535; else if(v < 0) v = 0;
+
                     /* netpbm: */
                     fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v);
 
                     v =  *blue + adjustB; ++blue;
+if(v > 65535) v = 65535; else if(v < 0) v = 0;
+
                     /* netpbm: */
                     fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v);
 
@@ -1989,6 +2036,8 @@ int imagetopnm(opj_image_t * image, const char *outfile)
                 if(has_alpha)
                 {
                     v = *alpha + adjustA; ++alpha;
+               if(v > 65535) v = 65535; else if(v < 0) v = 0;
+
                     /* netpbm: */
                     fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v);
                 }
@@ -1997,14 +2046,28 @@ int imagetopnm(opj_image_t * image, const char *outfile)
             }  /* if(two) */
 
             /* prec <= 8: */
+       v = *red++;
+       if(v > 255) v = 255; else if(v < 0) v = 0;
 
-            fprintf(fdest, "%c", (unsigned char)*red++);
+       fprintf(fdest, "%c", (unsigned char)v);
             if(triple)
-                fprintf(fdest, "%c%c",(unsigned char)*green++, (unsigned char)*blue++);
+ {
+       v = *green++;
+       if(v > 255) v = 255; else if(v < 0) v = 0;
+
+       fprintf(fdest, "%c", (unsigned char)v);
+       v = *blue++;
+       if(v > 255) v = 255; else if(v < 0) v = 0;
 
+       fprintf(fdest, "%c", (unsigned char)v);
+ }
             if(has_alpha)
-                fprintf(fdest, "%c", (unsigned char)*alpha++);
+ {
+       v = *alpha++;
+       if(v > 255) v = 255; else if(v < 0) v = 0;
 
+       fprintf(fdest, "%c", (unsigned char)v);
+ }
         }      /* for(i */
 
         fclose(fdest); return 0;
@@ -2049,12 +2112,16 @@ int imagetopnm(opj_image_t * image, const char *outfile)
             for (i = 0; i < wr * hr; i++)
             {
                 v = *red + adjustR; ++red;
+if(v > 65535) v = 65535; else if(v < 0) v = 0;
+
                 /* netpbm: */
                 fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v);
 
                 if(has_alpha)
                 {
                     v = *alpha++;
+if(v > 65535) v = 65535; else if(v < 0) v = 0;
+
                     /* netpbm: */
                     fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v);
                 }
@@ -2064,7 +2131,10 @@ int imagetopnm(opj_image_t * image, const char *outfile)
         {
             for(i = 0; i < wr * hr; ++i)
             {
-                fprintf(fdest, "%c", (unsigned char)(*red + adjustR)); ++red;
+       v = *red + adjustR; ++red;
+       if(v > 255) v = 255; else if(v < 0) v = 0;
+
+        fprintf(fdest, "%c", (unsigned char)v);
             }
         }
         fclose(fdest);
@@ -2174,10 +2244,17 @@ int imagetotif(opj_image_t * image, const char *outfile)
                             b += adjust;
                             if(has_alpha) a += adjust;
                         }
+               if(r > 255) r = 255; else if(r < 0) r = 0;
                         dat8[i+0] = r ;
+               if(g > 255) g = 255; else if(g < 0) g = 0;
                         dat8[i+1] = g ;
+               if(b > 255) b = 255; else if(b < 0) b = 0;
                         dat8[i+2] = b ;
-                        if(has_alpha) dat8[i+3] = a;
+               if(has_alpha) 
+        {
+               if(a > 255) a = 255; else if(a < 0) a = 0;
+               dat8[i+3] = a;
+        }
 
                         index++;
                         last_i = i + step;
@@ -2206,11 +2283,17 @@ int imagetotif(opj_image_t * image, const char *outfile)
                                 b += adjust;
                                 if(has_alpha) a += adjust;
                             }
+               if(r > 255) r = 255; else if(r < 0) r = 0;
+               if(g > 255) g = 255; else if(g < 0) g = 0;
+               if(b > 255) b = 255; else if(b < 0) b = 0;
+
                             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(a > 255) a = 255; else if(a < 0) a = 0;
+
                                 if(i+3 < ssize) dat8[i+3] = a ;  else break;
                             }
                             index++;
@@ -2252,6 +2335,10 @@ int imagetotif(opj_image_t * image, const char *outfile)
                                 b = (b<<ushift) + (b>>dshift);
                                 if(has_alpha) a = (a<<ushift) + (a>>dshift);
                             }
+               if(r > 65535) r = 65535; else if(r < 0) r = 0;
+               if(g > 65535) g = 65535; else if(g < 0) g = 0;
+               if(b > 65535) b = 65535; else if(b < 0) b = 0;
+
                             dat8[i+0] =  r;/*LSB*/
                             dat8[i+1] = (r >> 8);/*MSB*/
                             dat8[i+2] =  g;
@@ -2260,6 +2347,7 @@ int imagetotif(opj_image_t * image, const char *outfile)
                             dat8[i+5] = (b >> 8);
                             if(has_alpha)
                             {
+               if(a > 65535) a = 65535; else if(a < 0) a = 0;
                                 dat8[i+6] =  a;
                                 dat8[i+7] = (a >> 8);
                             }
@@ -2297,6 +2385,10 @@ int imagetotif(opj_image_t * image, const char *outfile)
                                     b = (b<<ushift) + (b>>dshift);
                                     if(has_alpha) a = (a<<ushift) + (a>>dshift);
                                 }
+               if(r > 65535) r = 65535; else if(r < 0) r = 0;
+               if(g > 65535) g = 65535; else if(g < 0) g = 0;
+               if(b > 65535) b = 65535; else if(b < 0) b = 0;
+
                                 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;
@@ -2306,6 +2398,7 @@ int imagetotif(opj_image_t * image, const char *outfile)
 
                                 if(has_alpha)
                                 {
+               if(a > 65535) a = 65535; else if(a < 0) a = 0;
                                     if(i+6 < ssize) dat8[i+6] = a; else break;
                                     if(i+7 < ssize) dat8[i+7] = (a >> 8); else break;
                                 }
@@ -2379,13 +2472,19 @@ int imagetotif(opj_image_t * image, const char *outfile)
                             r += adjust;
                             if(has_alpha) a += adjust;
                         }
+               if(r > 255) r = 255; else if(r < 0) r = 0;
                         dat8[i+0] = r;
-                        if(has_alpha) dat8[i+1] = a;
-                        index++;
+
+               if(has_alpha) 
+        {
+               if(a > 255) a = 255; else if(a < 0) a = 0;
+               dat8[i+1] = a;
                     }
+               index++;
+         }
                     else
                         break;
-                }/*for(i )*/
+          }/*for(i )*/
             }/*if(bps == 8*/
             else
                 if(bps == 16)
@@ -2411,10 +2510,12 @@ int imagetotif(opj_image_t * image, const char *outfile)
                                 r = (r<<ushift) + (r>>dshift);
                                 if(has_alpha) a = (a<<ushift) + (a>>dshift);
                             }
+               if(r > 65535) r = 65535; else if(r < 0) r = 0;
                             dat8[i+0] = r;/*LSB*/
                             dat8[i+1] = r >> 8;/*MSB*/
                             if(has_alpha)
                             {
+               if(a > 65535) a = 65535; else if(a < 0) a = 0;
                                 dat8[i+2] = a;
                                 dat8[i+3] = a >> 8;
                             }
@@ -2490,7 +2591,7 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
     if( !tiBps || !tiPhoto)
     {
         if( !tiBps)
-            fprintf(stderr,"imagetotif: Bits=%d, Only 8 and 16 bits"
+     fprintf(stderr,"tiftoimage: Bits=%d, Only 8 and 16 bits"
                     " implemented\n",tiBps);
         else
             if( !tiPhoto)
@@ -3427,6 +3528,10 @@ int imagetopng(opj_image_t * image, const char *write_idf)
         {
             png_set_packing(png);
         }
+printf("%s:%d:sgnd(%d,%d,%d) w(%d) h(%d) alpha(%d)\n",__FILE__,__LINE__,
+image->comps[0].sgnd,
+image->comps[1].sgnd,image->comps[2].sgnd,width,height,has_alpha);
+
         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);
@@ -3442,18 +3547,21 @@ int imagetopng(opj_image_t * image, const char *write_idf)
                 if(is16)
                 {
                     v = *red + adjustR; ++red;
+               if(v > 65535) v = 65535; else if(v < 0) v = 0;
 
                     if(force16) { v = (v<<ushift) + (v>>dshift); }
 
                     *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v;
 
                     v = *green + adjustG; ++green;
+               if(v > 65535) v = 65535; else if(v < 0) v = 0;
 
                     if(force16) { v = (v<<ushift) + (v>>dshift); }
 
                     *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v;
 
                     v =  *blue + adjustB; ++blue;
+               if(v > 65535) v = 65535; else if(v < 0) v = 0;
 
                     if(force16) { v = (v<<ushift) + (v>>dshift); }
 
@@ -3462,6 +3570,7 @@ int imagetopng(opj_image_t * image, const char *write_idf)
                     if(has_alpha)
                     {
                         v = *alpha + adjustA; ++alpha;
+               if(v > 65535) v = 65535; else if(v < 0) v = 0;
 
                         if(force16) { v = (v<<ushift) + (v>>dshift); }
 
@@ -3471,18 +3580,21 @@ int imagetopng(opj_image_t * image, const char *write_idf)
                 }/* if(is16) */
 
                 v = *red + adjustR; ++red;
+               if(v > 255) v = 255; else if(v < 0) v = 0;
 
                 if(force8) { v = (v<<ushift) + (v>>dshift); }
 
                 *d++ = (unsigned char)(v & mask);
 
                 v = *green + adjustG; ++green;
+               if(v > 255) v = 255; else if(v < 0) v = 0;
 
                 if(force8) { v = (v<<ushift) + (v>>dshift); }
 
                 *d++ = (unsigned char)(v & mask);
 
                 v = *blue + adjustB; ++blue;
+               if(v > 255) v = 255; else if(v < 0) v = 0;
 
                 if(force8) { v = (v<<ushift) + (v>>dshift); }
 
@@ -3491,6 +3603,7 @@ int imagetopng(opj_image_t * image, const char *write_idf)
                 if(has_alpha)
                 {
                     v = *alpha + adjustA; ++alpha;
+               if(v > 255) v = 255; else if(v < 0) v = 0;
 
                     if(force8) { v = (v<<ushift) + (v>>dshift); }
 
@@ -3561,6 +3674,7 @@ int imagetopng(opj_image_t * image, const char *write_idf)
                     for(x = 0; x < width; ++x)
                     {
                         v = *red + adjustR; ++red;
+               if(v > 65535) v = 65535; else if(v < 0) v = 0;
 
                         if(force16) { v = (v<<ushift) + (v>>dshift); }
 
@@ -3569,6 +3683,7 @@ int imagetopng(opj_image_t * image, const char *write_idf)
                         if(has_alpha)
                         {
                             v = *alpha++;
+               if(v > 65535) v = 65535; else if(v < 0) v = 0;
 
                             if(force16) { v = (v<<ushift) + (v>>dshift); }
 
@@ -3591,6 +3706,7 @@ int imagetopng(opj_image_t * image, const char *write_idf)
                     for(x = 0; x < width; ++x)
                     {
                         v = *red + adjustR; ++red;
+               if(v > 255) v = 255; else if(v < 0) v = 0;
 
                         if(force8) { v = (v<<ushift) + (v>>dshift); }
 
@@ -3599,6 +3715,7 @@ int imagetopng(opj_image_t * image, const char *write_idf)
                         if(has_alpha)
                         {
                             v = *alpha + adjustA; ++alpha;
+               if(v > 255) v = 255; else if(v < 0) v = 0;
 
                             if(force8) { v = (v<<ushift) + (v>>dshift); }