0bbb022a77790f6a711e37abe9b7807e015766a9
[openjpeg.git] / codec / convert.c
1 /*
2  * Copyright (c) 2001-2003, David Janssens
3  * Copyright (c) 2002-2003, Yannick Verschueren
4  * Copyright (c) 2002-2003,  Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include <openjpeg.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <math.h>
33 #include <string.h>
34
35 /* -->> -->> -->> -->>
36
37   BMP IMAGE FORMAT
38
39  <<-- <<-- <<-- <<-- */
40
41 /* UINT2 defines a two byte word */
42 typedef unsigned short int UINT2;
43
44 /* UINT4 defines a four byte word */
45 typedef unsigned long int UINT4;
46
47 typedef struct {
48   UINT2 bfType;                 /* 'BM' for Bitmap (19776) */
49   UINT4 bfSize;                 /* Size of the file        */
50   UINT2 bfReserved1;            /* Reserved : 0            */
51   UINT2 bfReserved2;            /* Reserved : 0            */
52   UINT4 bfOffBits;              /* Offset                  */
53 } BITMAPFILEHEADER_t;
54
55 typedef struct {
56   UINT4 biSize;                 /* Size of the structure in bytes */
57   UINT4 biWidth;                /* Width of the image in pixels */
58   UINT4 biHeight;               /* Heigth of the image in pixels */
59   UINT2 biPlanes;               /* 1 */
60   UINT2 biBitCount;             /* Number of color bits by pixels */
61   UINT4 biCompression;          /* Type of encoding 0: none 1: RLE8 2: RLE4 */
62   UINT4 biSizeImage;            /* Size of the image in bytes */
63   UINT4 biXpelsPerMeter;        /* Horizontal (X) resolution in pixels/meter */
64   UINT4 biYpelsPerMeter;        /* Vertical (Y) resolution in pixels/meter */
65   UINT4 biClrUsed;              /* Number of color used in the image (0: ALL) */
66   UINT4 biClrImportant;         /* Number of important color (0: ALL) */
67 } BITMAPINFOHEADER_t;
68
69 int bmptoimage(char *filename, j2k_image_t * img, int subsampling_dx,
70                int subsampling_dy, int Dim[2])
71 {
72   FILE *IN;
73   FILE *Compo0 = NULL, *Compo1 = NULL, *Compo2 = NULL;
74   BITMAPFILEHEADER_t File_h;
75   BITMAPINFOHEADER_t Info_h;
76   unsigned char *RGB;
77   unsigned char *table_R, *table_G, *table_B;
78   unsigned int j, w, h, PAD, type = 0;
79
80   int i;
81   int gray_scale = 1, not_end_file = 1; 
82
83   unsigned int line = 0, col = 0;
84   unsigned char v, v2;
85   UINT4 W, H;
86
87   IN = fopen(filename, "rb");
88   if (!IN) {
89     fprintf(stderr,
90             "\033[0;33mFailed to open %s for reading !!\033[0;39m\n",
91             filename);
92     return 0;
93   }
94
95   File_h.bfType = getc(IN);
96   File_h.bfType = (getc(IN) << 8) + File_h.bfType;
97
98   if (File_h.bfType != 19778) {
99     printf("Error, not a BMP file!\n");
100     return 0;
101   } else {
102     /* FILE HEADER */
103     /* ------------- */
104     File_h.bfSize = getc(IN);
105     File_h.bfSize = (getc(IN) << 8) + File_h.bfSize;
106     File_h.bfSize = (getc(IN) << 16) + File_h.bfSize;
107     File_h.bfSize = (getc(IN) << 24) + File_h.bfSize;
108
109     File_h.bfReserved1 = getc(IN);
110     File_h.bfReserved1 = (getc(IN) << 8) + File_h.bfReserved1;
111
112     File_h.bfReserved2 = getc(IN);
113     File_h.bfReserved2 = (getc(IN) << 8) + File_h.bfReserved2;
114
115     File_h.bfOffBits = getc(IN);
116     File_h.bfOffBits = (getc(IN) << 8) + File_h.bfOffBits;
117     File_h.bfOffBits = (getc(IN) << 16) + File_h.bfOffBits;
118     File_h.bfOffBits = (getc(IN) << 24) + File_h.bfOffBits;
119
120     /* INFO HEADER */
121     /* ------------- */
122
123     Info_h.biSize = getc(IN);
124     Info_h.biSize = (getc(IN) << 8) + Info_h.biSize;
125     Info_h.biSize = (getc(IN) << 16) + Info_h.biSize;
126     Info_h.biSize = (getc(IN) << 24) + Info_h.biSize;
127
128     Info_h.biWidth = getc(IN);
129     Info_h.biWidth = (getc(IN) << 8) + Info_h.biWidth;
130     Info_h.biWidth = (getc(IN) << 16) + Info_h.biWidth;
131     Info_h.biWidth = (getc(IN) << 24) + Info_h.biWidth;
132     w = Info_h.biWidth;
133
134     Info_h.biHeight = getc(IN);
135     Info_h.biHeight = (getc(IN) << 8) + Info_h.biHeight;
136     Info_h.biHeight = (getc(IN) << 16) + Info_h.biHeight;
137     Info_h.biHeight = (getc(IN) << 24) + Info_h.biHeight;
138     h = Info_h.biHeight;
139
140     Info_h.biPlanes = getc(IN);
141     Info_h.biPlanes = (getc(IN) << 8) + Info_h.biPlanes;
142
143     Info_h.biBitCount = getc(IN);
144     Info_h.biBitCount = (getc(IN) << 8) + Info_h.biBitCount;
145
146     Info_h.biCompression = getc(IN);
147     Info_h.biCompression = (getc(IN) << 8) + Info_h.biCompression;
148     Info_h.biCompression = (getc(IN) << 16) + Info_h.biCompression;
149     Info_h.biCompression = (getc(IN) << 24) + Info_h.biCompression;
150
151     Info_h.biSizeImage = getc(IN);
152     Info_h.biSizeImage = (getc(IN) << 8) + Info_h.biSizeImage;
153     Info_h.biSizeImage = (getc(IN) << 16) + Info_h.biSizeImage;
154     Info_h.biSizeImage = (getc(IN) << 24) + Info_h.biSizeImage;
155
156     Info_h.biXpelsPerMeter = getc(IN);
157     Info_h.biXpelsPerMeter = (getc(IN) << 8) + Info_h.biXpelsPerMeter;
158     Info_h.biXpelsPerMeter = (getc(IN) << 16) + Info_h.biXpelsPerMeter;
159     Info_h.biXpelsPerMeter = (getc(IN) << 24) + Info_h.biXpelsPerMeter;
160
161     Info_h.biYpelsPerMeter = getc(IN);
162     Info_h.biYpelsPerMeter = (getc(IN) << 8) + Info_h.biYpelsPerMeter;
163     Info_h.biYpelsPerMeter = (getc(IN) << 16) + Info_h.biYpelsPerMeter;
164     Info_h.biYpelsPerMeter = (getc(IN) << 24) + Info_h.biYpelsPerMeter;
165
166     Info_h.biClrUsed = getc(IN);
167     Info_h.biClrUsed = (getc(IN) << 8) + Info_h.biClrUsed;
168     Info_h.biClrUsed = (getc(IN) << 16) + Info_h.biClrUsed;
169     Info_h.biClrUsed = (getc(IN) << 24) + Info_h.biClrUsed;
170
171     Info_h.biClrImportant = getc(IN);
172     Info_h.biClrImportant = (getc(IN) << 8) + Info_h.biClrImportant;
173     Info_h.biClrImportant = (getc(IN) << 16) + Info_h.biClrImportant;
174     Info_h.biClrImportant = (getc(IN) << 24) + Info_h.biClrImportant;
175
176     /* Read the data and store them in the OUT file */
177
178     if (Info_h.biBitCount == 24) {
179       img->x0 = Dim[0];
180       img->y0 = Dim[1];
181       img->x1 =
182         !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
183                                                            1) *
184         subsampling_dx + 1;
185       img->y1 =
186         !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
187                                                            1) *
188         subsampling_dy + 1;
189       img->numcomps = 3;
190       img->color_space = 1;
191       img->comps =
192         (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
193       for (i = 0; i < img->numcomps; i++) {
194         img->comps[i].prec = 8;
195         img->comps[i].bpp = 8;
196         img->comps[i].sgnd = 0;
197         img->comps[i].dx = subsampling_dx;
198         img->comps[i].dy = subsampling_dy;
199       }
200       Compo0 = fopen("Compo0", "wb");
201       if (!Compo0) {
202         fprintf(stderr,
203                 "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
204       }
205       Compo1 = fopen("Compo1", "wb");
206       if (!Compo1) {
207         fprintf(stderr,
208                 "\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
209       }
210       Compo2 = fopen("Compo2", "wb");
211       if (!Compo2) {
212         fprintf(stderr,
213                 "\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
214       }
215
216       /* Place the cursor at the beginning of the image information */
217       fseek(IN, 0, SEEK_SET);
218       fseek(IN, File_h.bfOffBits, SEEK_SET);
219
220       W = Info_h.biWidth;
221       H = Info_h.biHeight;
222
223       // PAD = 4 - (3 * W) % 4;
224       // PAD = (PAD == 4) ? 0 : PAD;
225       PAD = (3 * W) % 4 ? 4 - (3 * W) % 4 : 0;
226
227
228       RGB =
229         (unsigned char *) malloc((3 * W + PAD) * H *
230                                  sizeof(unsigned char));
231
232       fread(RGB, sizeof(unsigned char), (3 * W + PAD) * H, IN);
233
234       for (j = 0; j < (3 * W + PAD) * H; j++) {
235         unsigned char elmt;
236         int Wp = 3 * W + PAD;
237
238         elmt = RGB[(H - (j / Wp + 1)) * Wp + j % Wp];
239         if ((j % Wp) < (3 * W)) {
240           switch (type) {
241           case 0:
242             fprintf(Compo2, "%c", elmt);
243             type = 1;
244             break;
245           case 1:
246             fprintf(Compo1, "%c", elmt);
247             type = 2;
248             break;
249           case 2:
250             fprintf(Compo0, "%c", elmt);
251             type = 0;
252             break;
253           }
254         }
255       }
256
257       fclose(Compo0);
258       fclose(Compo1);
259       fclose(Compo2);
260       free(RGB);
261     } else if (Info_h.biBitCount == 8 && Info_h.biCompression == 0) {
262       img->x0 = Dim[0];
263       img->y0 = Dim[1];
264       img->x1 =
265         !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
266                                                            1) *
267         subsampling_dx + 1;
268       img->y1 =
269         !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
270                                                            1) *
271         subsampling_dy + 1;
272
273       table_R = (unsigned char *) malloc(256 * sizeof(unsigned char));
274       table_G = (unsigned char *) malloc(256 * sizeof(unsigned char));
275       table_B = (unsigned char *) malloc(256 * sizeof(unsigned char));
276
277       for (j = 0; j < Info_h.biClrUsed; j++) {
278         table_B[j] = getc(IN);
279         table_G[j] = getc(IN);
280         table_R[j] = getc(IN);
281         getc(IN);
282         if (table_R[j] != table_G[j] && table_R[j] != table_B[j]
283             && table_G[j] != table_B[j])
284           gray_scale = 0;
285       }
286
287       /* Place the cursor at the beginning of the image information */
288       fseek(IN, 0, SEEK_SET);
289       fseek(IN, File_h.bfOffBits, SEEK_SET);
290
291       W = Info_h.biWidth;
292       H = Info_h.biHeight;
293       if (Info_h.biWidth % 2)
294         W++;
295
296       RGB = (unsigned char *) malloc(W * H * sizeof(unsigned char));
297
298       fread(RGB, sizeof(unsigned char), W * H, IN);
299       if (gray_scale) {
300         img->numcomps = 1;
301         img->comps =
302           (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
303         img->comps[0].prec = 8;
304         img->comps[0].bpp = 8;
305         img->comps[0].sgnd = 0;
306         img->comps[0].dx = subsampling_dx;
307         img->comps[0].dy = subsampling_dy;
308         Compo0 = fopen("Compo0", "wb");
309         if (!Compo0) {
310           fprintf(stderr,
311                   "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
312         }
313         for (j = 0; j < W * H; j++) {
314           if ((j % W < W - 1 && Info_h.biWidth % 2)
315               || !(Info_h.biWidth % 2))
316             fprintf(Compo0, "%c",
317                     table_R[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]]);
318         }
319         fclose(Compo0);
320       } else {
321         img->numcomps = 3;
322         img->comps =
323           (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
324         for (i = 0; i < img->numcomps; i++) {
325           img->comps[i].prec = 8;
326           img->comps[i].bpp = 8;
327           img->comps[i].sgnd = 0;
328           img->comps[i].dx = subsampling_dx;
329           img->comps[i].dy = subsampling_dy;
330         }
331
332         Compo0 = fopen("Compo0", "wb");
333         if (!Compo0) {
334           fprintf(stderr,
335                   "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
336         }
337         Compo1 = fopen("Compo1", "wb");
338         if (!Compo1) {
339           fprintf(stderr,
340                   "\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
341         }
342         Compo2 = fopen("Compo2", "wb");
343         if (!Compo2) {
344           fprintf(stderr,
345                   "\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
346         }
347
348         for (j = 0; j < W * H; j++) {
349           if ((j % W < W - 1 && Info_h.biWidth % 2)
350               || !(Info_h.biWidth % 2)) {
351             fprintf(Compo0, "%c",
352                     table_R[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]]);
353             fprintf(Compo1, "%c",
354                     table_G[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]]);
355             fprintf(Compo2, "%c",
356                     table_B[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]]);
357           }
358
359         }
360         fclose(Compo0);
361         fclose(Compo1);
362         fclose(Compo2);
363       }
364       free(RGB);
365
366     } else if (Info_h.biBitCount == 8 && Info_h.biCompression == 1) {
367       img->x0 = Dim[0];
368       img->y0 = Dim[1];
369       img->x1 =
370         !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
371                                                            1) *
372         subsampling_dx + 1;
373       img->y1 =
374         !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
375                                                            1) *
376         subsampling_dy + 1;
377
378       table_R = (unsigned char *) malloc(256 * sizeof(unsigned char));
379       table_G = (unsigned char *) malloc(256 * sizeof(unsigned char));
380       table_B = (unsigned char *) malloc(256 * sizeof(unsigned char));
381
382       for (j = 0; j < Info_h.biClrUsed; j++) {
383         table_B[j] = getc(IN);
384         table_G[j] = getc(IN);
385         table_R[j] = getc(IN);
386         getc(IN);
387         if (table_R[j] != table_G[j] && table_R[j] != table_B[j]
388             && table_G[j] != table_B[j])
389           gray_scale = 0;
390       }
391
392       /* Place the cursor at the beginning of the image information */
393       fseek(IN, 0, SEEK_SET);
394       fseek(IN, File_h.bfOffBits, SEEK_SET);
395
396       if (gray_scale) {
397         img->numcomps = 1;
398         img->comps = (j2k_comp_t *) malloc(sizeof(j2k_comp_t));
399         img->comps[0].prec = 8;
400         img->comps[0].bpp = 8;
401         img->comps[0].sgnd = 0;
402         img->comps[0].dx = subsampling_dx;
403         img->comps[0].dy = subsampling_dy;
404         Compo0 = fopen("Compo0", "wb");
405         if (!Compo0) {
406           fprintf(stderr,
407                   "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
408         }
409       } else {
410         img->numcomps = 3;
411         img->comps =
412           (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
413         for (i = 0; i < img->numcomps; i++) {
414           img->comps[i].prec = 8;
415           img->comps[i].bpp = 8;
416           img->comps[i].sgnd = 0;
417           img->comps[i].dx = subsampling_dx;
418           img->comps[i].dy = subsampling_dy;
419         }
420         Compo0 = fopen("Compo0", "wb");
421         if (!Compo0) {
422           fprintf(stderr,
423                   "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
424         }
425         Compo1 = fopen("Compo1", "wb");
426         if (!Compo1) {
427           fprintf(stderr,
428                   "\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
429         }
430         Compo2 = fopen("Compo2", "wb");
431         if (!Compo2) {
432           fprintf(stderr,
433                   "\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
434         }
435       }
436
437       RGB =
438         (unsigned char *) malloc(Info_h.biWidth * Info_h.biHeight *
439                                  sizeof(unsigned char));
440
441       while (not_end_file) {
442         v = getc(IN);
443         if (v) {
444           v2 = getc(IN);
445           for (i = 0; i < (int) v; i++) {
446             RGB[line * Info_h.biWidth + col] = v2;
447             col++;
448           }
449         } else {
450           v = getc(IN);
451           switch (v) {
452           case 0:
453             col = 0;
454             line++;
455             break;
456           case 1:
457             line++;
458             not_end_file = 0;
459             break;
460           case 2:
461             printf("No Delta supported\n");
462             return 1;
463             break;
464           default:
465             for (i = 0; i < v; i++) {
466               v2 = getc(IN);
467               RGB[line * Info_h.biWidth + col] = v2;
468               col++;
469             }
470             if (v % 2)
471               v2 = getc(IN);
472           }
473         }
474       }
475       if (gray_scale) {
476         for (line = 0; line < Info_h.biHeight; line++)
477           for (col = 0; col < Info_h.biWidth; col++)
478             fprintf(Compo0, "%c", table_R[(int)
479                                           RGB[(Info_h.biHeight - line -
480                                                1) * Info_h.biWidth +
481                                               col]]);
482         fclose(Compo0);
483       } else {
484         for (line = 0; line < Info_h.biHeight; line++)
485           for (col = 0; col < Info_h.biWidth; col++) {
486             fprintf(Compo0, "%c", table_R[(int)
487                                           RGB[(Info_h.biHeight - line -
488                                                1) * Info_h.biWidth +
489                                               col]]);
490             fprintf(Compo1, "%c", table_G[(int)
491                                           RGB[(Info_h.biHeight - line -
492                                                1) * Info_h.biWidth +
493                                               col]]);
494             fprintf(Compo2, "%c", table_B[(int)
495                                           RGB[(Info_h.biHeight - line -
496                                                1) * Info_h.biWidth +
497                                               col]]);
498           }
499         fclose(Compo0);
500         fclose(Compo1);
501         fclose(Compo2);
502       }
503       free(RGB);
504     } else
505       fprintf(stderr,
506               "Other system than 24 bits/pixels or 8 bits (no RLE coding) is not yet implemented [%d]\n",
507               Info_h.biBitCount);
508
509     fclose(IN);
510     return 1;
511   }
512 }
513
514         /* -->> -->> -->> -->>
515
516            PGX IMAGE FORMAT
517
518            <<-- <<-- <<-- <<-- */
519
520
521 unsigned char readuchar(FILE * f)
522 {
523   unsigned char c1;
524   fread(&c1, 1, 1, f);
525   return c1;
526 }
527
528 unsigned short readushort(FILE * f, int bigendian)
529 {
530   unsigned char c1, c2;
531   fread(&c1, 1, 1, f);
532   fread(&c2, 1, 1, f);
533   if (bigendian)
534     return (c1 << 8) + c2;
535   else
536     return (c2 << 8) + c1;
537 }
538
539 unsigned int readuint(FILE * f, int bigendian)
540 {
541   unsigned char c1, c2, c3, c4;
542   fread(&c1, 1, 1, f);
543   fread(&c2, 1, 1, f);
544   fread(&c3, 1, 1, f);
545   fread(&c4, 1, 1, f);
546   if (bigendian)
547     return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
548   else
549     return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1;
550 }
551
552 int pgxtoimage(char *filename, j2k_image_t * img, int tdy,
553                int subsampling_dx, int subsampling_dy, int Dim[2],
554                j2k_cp_t cp)
555 {
556   FILE *f;
557   int w, h, prec;
558   int i, compno, bandno;
559   char str[256], endian[16];
560   char sign;
561   int bigendian;
562   j2k_comp_t *comp;
563
564   img->numcomps = 1;
565   img->color_space = 2;
566   img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
567   for (compno = 0; compno < img->numcomps; compno++) {
568     FILE *src;
569     char tmp[16];
570     int max = 0;
571     int Y1;
572     comp = &img->comps[compno];
573     sprintf(str, "%s", filename);
574     f = fopen(str, "rb");
575     if (!f) {
576       fprintf(stderr, "Failed to open %s for reading !\n", str);
577       return 0;
578     }
579     if (fscanf(f, "PG %s %c %d %d %d", endian, &sign, &prec, &w, &h) == 5) {
580       fgetc(f);
581       if (!strcmp(endian, "ML"))
582         bigendian = 1;
583       else
584         bigendian = 0;
585       if (compno == 0) {
586         img->x0 = Dim[0];
587         img->y0 = Dim[1];
588         img->x1 =
589           !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
590                                                              1) *
591           subsampling_dx + 1;
592         img->y1 =
593           !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
594                                                              1) *
595           subsampling_dy + 1;
596       } else {
597         if (w != img->x1 || h != img->y1)
598           return 0;
599       }
600
601       if (sign == '-') {
602         comp->sgnd = 1;
603       } else {
604         comp->sgnd = 0;
605       }
606       comp->prec = prec;
607       comp->dx = subsampling_dx;
608       comp->dy = subsampling_dy;
609       bandno = 1;
610
611       Y1 = cp.ty0 + bandno * cp.tdy <
612         img->y1 ? cp.ty0 + bandno * cp.tdy : img->y1;
613       Y1 -= img->y0;
614
615       sprintf(tmp, "bandtile%d", bandno);       /* bandtile file */
616       src = fopen(tmp, "wb");
617       if (!src) {
618         fprintf(stderr, "failed to open %s for writing !\n", tmp);
619       }
620       for (i = 0; i < w * h; i++) {
621         int v;
622         if (i == Y1 * w / subsampling_dy && tdy != -1) {        /* bandtile is full */
623           fclose(src);
624           bandno++;
625           sprintf(tmp, "bandtile%d", bandno);
626           src = fopen(tmp, "wb");
627           if (!src) {
628             fprintf(stderr, "failed to open %s for writing !\n", tmp);
629           }
630           Y1 = cp.ty0 + bandno * cp.tdy <
631             img->y1 ? cp.ty0 + bandno * cp.tdy : img->y1;
632           Y1 -= img->y0;
633         }
634         if (comp->prec <= 8) {
635           if (!comp->sgnd) {
636             v = readuchar(f);
637           } else {
638             v = (char) readuchar(f);
639           }
640         } else if (comp->prec <= 16) {
641           if (!comp->sgnd) {
642             v = readushort(f, bigendian);
643           } else {
644             v = (short) readushort(f, bigendian);
645           }
646         } else {
647           if (!comp->sgnd) {
648             v = readuint(f, bigendian);
649           } else {
650             v = (int) readuint(f, bigendian);
651           }
652         }
653         if (v > max)
654           max = v;
655         fprintf(src, "%d ", v);
656       }
657     } else {
658       return 0;
659     }
660     fclose(f);
661     fclose(src);
662     comp->bpp = int_floorlog2(max) + 1;
663   }
664   return 1;
665 }
666
667 /* -->> -->> -->> -->>
668
669   PNM IMAGE FORMAT
670
671  <<-- <<-- <<-- <<-- */
672
673 int pnmtoimage(char *filename, j2k_image_t * img, int subsampling_dx,
674                int subsampling_dy, int Dim[2])
675 {
676   FILE *f;
677   FILE *Compo0, *Compo1, *Compo2;
678   int w, h;
679   int i;
680   char value;
681   char comment[256];
682
683   f = fopen(filename, "rb");
684   if (!f) {
685     fprintf(stderr,
686             "\033[0;33mFailed to open %s for reading !!\033[0;39m\n",
687             filename);
688     return 0;
689   }
690
691   if (fgetc(f) != 'P')
692     return 0;
693   value = fgetc(f);
694
695   if (value == '2') {
696     fgetc(f);
697     if (fgetc(f) == '#') {
698       fseek(f, 0, SEEK_SET);
699       fscanf(f, "P2\n");
700       fgets(comment, 256, f);
701       fscanf(f, "%d %d\n255", &w, &h);
702     } else {
703       fseek(f, 0, SEEK_SET);
704       fscanf(f, "P2\n%d %d\n255", &w, &h);
705     }
706
707     fgetc(f);
708     img->x0 = Dim[0];
709     img->y0 = Dim[1];
710     img->x1 =
711       !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
712                                                          1) *
713       subsampling_dx + 1;
714     img->y1 =
715       !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
716                                                          1) *
717       subsampling_dy + 1;
718
719     img->numcomps = 1;
720     img->color_space = 2;
721     img->comps = (j2k_comp_t *) malloc(sizeof(j2k_comp_t));
722     img->comps[0].prec = 8;
723     img->comps[0].bpp = 8;
724     img->comps[0].sgnd = 0;
725     img->comps[0].dx = subsampling_dx;
726     img->comps[0].dy = subsampling_dy;
727
728     Compo0 = fopen("Compo0", "wb");
729     if (!Compo0) {
730       fprintf(stderr,
731               "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
732     }
733     for (i = 0; i < w * h; i++) {
734       unsigned int l;
735       fscanf(f, "%d", &l);
736       fprintf(Compo0, "%c", l);
737     }
738     fclose(Compo0);
739   } else if (value == '5') {
740     fgetc(f);
741     if (fgetc(f) == '#') {
742       fseek(f, 0, SEEK_SET);
743       fscanf(f, "P5\n");
744       fgets(comment, 256, f);
745       fscanf(f, "%d %d\n255", &w, &h);
746     } else {
747       fseek(f, 0, SEEK_SET);
748       fscanf(f, "P5\n%d %d\n255", &w, &h);
749     }
750
751     fgetc(f);
752     img->x0 = Dim[0];
753     img->y0 = Dim[1];
754     img->x1 =
755       !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
756                                                          1) *
757       subsampling_dx + 1;
758     img->y1 =
759       !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
760                                                          1) *
761       subsampling_dy + 1;
762
763     img->numcomps = 1;
764     img->color_space = 2;
765     img->comps = (j2k_comp_t *) malloc(sizeof(j2k_comp_t));
766     img->comps[0].prec = 8;
767     img->comps[0].bpp = 8;
768     img->comps[0].sgnd = 0;
769     img->comps[0].dx = subsampling_dx;
770     img->comps[0].dy = subsampling_dy;
771     Compo0 = fopen("Compo0", "wb");
772     if (!Compo0) {
773       fprintf(stderr,
774               "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
775     }
776     for (i = 0; i < w * h; i++) {
777       unsigned char l;
778       fread(&l, 1, 1, f);
779       fwrite(&l, 1, 1, Compo0);
780     }
781     fclose(Compo0);
782   } else if (value == '3') {
783     fgetc(f);
784     if (fgetc(f) == '#') {
785       fseek(f, 0, SEEK_SET);
786       fscanf(f, "P3\n");
787       fgets(comment, 256, f);
788       fscanf(f, "%d %d\n255", &w, &h);
789     } else {
790       fseek(f, 0, SEEK_SET);
791       fscanf(f, "P3\n%d %d\n255", &w, &h);
792     }
793
794     fgetc(f);
795     img->x0 = Dim[0];
796     img->y0 = Dim[1];
797     img->x1 =
798       !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
799                                                          1) *
800       subsampling_dx + 1;
801     img->y1 =
802       !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
803                                                          1) *
804       subsampling_dy + 1;
805     img->numcomps = 3;
806     img->color_space = 1;
807     img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
808     for (i = 0; i < img->numcomps; i++) {
809       img->comps[i].prec = 8;
810       img->comps[i].bpp = 8;
811       img->comps[i].sgnd = 0;
812       img->comps[i].dx = subsampling_dx;
813       img->comps[i].dy = subsampling_dy;
814     }
815     Compo0 = fopen("Compo0", "wb");
816     if (!Compo0) {
817       fprintf(stderr,
818               "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
819     }
820
821     Compo1 = fopen("Compo1", "wb");
822     if (!Compo1) {
823       fprintf(stderr,
824               "\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
825     }
826
827     Compo2 = fopen("Compo2", "wb");
828     if (!Compo2) {
829       fprintf(stderr,
830               "\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
831     }
832
833     for (i = 0; i < w * h; i++) {
834       unsigned int r, g, b;
835       fscanf(f, "%d", &r);
836       fscanf(f, "%d", &g);
837       fscanf(f, "%d", &b);
838       fprintf(Compo0, "%c", r);
839       fprintf(Compo1, "%c", g);
840       fprintf(Compo2, "%c", b);
841     }
842     fclose(Compo0);
843     fclose(Compo1);
844     fclose(Compo2);
845   } else if (value == '6') {
846     fgetc(f);
847     if (fgetc(f) == '#') {
848       fseek(f, 0, SEEK_SET);
849       fscanf(f, "P6\n");
850       fgets(comment, 256, f);
851       fscanf(f, "%d %d\n255", &w, &h);
852     } else {
853       fseek(f, 0, SEEK_SET);
854       fscanf(f, "P6\n%d %d\n255", &w, &h);
855     }
856
857     fgetc(f);
858     img->x0 = Dim[0];
859     img->y0 = Dim[1];
860     img->x1 =
861       !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
862                                                          1) *
863       subsampling_dx + 1;
864     img->y1 =
865       !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
866                                                          1) *
867       subsampling_dy + 1;
868     img->numcomps = 3;
869     img->color_space = 1;
870     img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
871     for (i = 0; i < img->numcomps; i++) {
872       img->comps[i].prec = 8;
873       img->comps[i].bpp = 8;
874       img->comps[i].sgnd = 0;
875       img->comps[i].dx = subsampling_dx;
876       img->comps[i].dy = subsampling_dy;
877     }
878     Compo0 = fopen("Compo0", "wb");
879     if (!Compo0) {
880       fprintf(stderr,
881               "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
882     }
883
884     Compo1 = fopen("Compo1", "wb");
885     if (!Compo1) {
886       fprintf(stderr,
887               "\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
888     }
889
890     Compo2 = fopen("Compo2", "wb");
891     if (!Compo2) {
892       fprintf(stderr,
893               "\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
894     }
895
896     for (i = 0; i < w * h; i++) {
897       unsigned char r, g, b;
898       fread(&r, 1, 1, f);
899       fread(&g, 1, 1, f);
900       fread(&b, 1, 1, f);
901       fwrite(&r, 1, 1, Compo0);
902       fwrite(&g, 1, 1, Compo1);
903       fwrite(&b, 1, 1, Compo2);
904     }
905     fclose(Compo0);
906     fclose(Compo1);
907     fclose(Compo2);
908   } else {
909     return 0;
910   }
911   fclose(f);
912   return 1;
913 }