Engauge Digitizer  2
Jpeg2000Convert.cpp
Go to the documentation of this file.
1 /*
2  * The copyright in this software is being made available under the 2-clauses
3  * BSD License, included below. This software may be subject to other third
4  * party and contributor rights, including patent rights, and no such rights
5  * are granted under this license.
6  *
7  * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
8  * Copyright (c) 2002-2014, Professor Benoit Macq
9  * Copyright (c) 2001-2003, David Janssens
10  * Copyright (c) 2002-2003, Yannick Verschueren
11  * Copyright (c) 2003-2007, Francois-Olivier Devaux
12  * Copyright (c) 2003-2014, Antonin Descampe
13  * Copyright (c) 2005, Herve Drolon, FreeImage Team
14  * Copyright (c) 2006-2007, Parvatha Elangovan
15  * All rights reserved.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions
19  * are met:
20  * 1. Redistributions of source code must retain the above copyright
21  * notice, this list of conditions and the following disclaimer.
22  * 2. Redistributions in binary form must reproduce the above copyright
23  * notice, this list of conditions and the following disclaimer in the
24  * documentation and/or other materials provided with the distribution.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
27  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 //#include "opj_apps_config.h"
40 
41 #include "Logger.h"
42 #include "openjpeg.h"
43 #include "Jpeg2000Convert.h"
44 #include <QBuffer>
45 #include <QDataStream>
46 #include <QDebug>
47 #include <qmath.h>
48 #include <string.h>
49 
50 int imagetopnm(opj_image_t * image,
51  QBuffer &buffer)
52 {
53  int *red, *green, *blue, *alpha = nullptr;
54  int wr, hr, max;
55  int i;
56  unsigned int compno, ncomp;
57  int adjustR, adjustG, adjustB, adjustA;
58  int two, has_alpha, triple;
59  int prec, v;
60  char bufferLocal[1024];
61  QDataStream str (&buffer);
62 
63  if((prec = qFloor (image->comps[0].prec)) > 16)
64  {
65  fprintf(stderr,"%s:%d:imagetopnm\n\tprecision %d is larger than 16"
66  "\n\t: refused.\n",__FILE__,__LINE__,prec);
67  return 1;
68  }
69  two = has_alpha = 0;
70  ncomp = image->numcomps;
71 
72  if (ncomp == 2 /* GRAYA */
73  || (ncomp > 2 /* RGB, RGBA */
74  && image->comps[0].dx == image->comps[1].dx
75  && image->comps[1].dx == image->comps[2].dx
76  && image->comps[0].dy == image->comps[1].dy
77  && image->comps[1].dy == image->comps[2].dy
78  && image->comps[0].prec == image->comps[1].prec
79  && image->comps[1].prec == image->comps[2].prec
80  ))
81  {
82  two = (prec > 8);
83  triple = (ncomp > 2);
84  wr = qFloor (image->comps[0].w);
85  hr = qFloor (image->comps[0].h);
86  max = (1<<prec) - 1; has_alpha = (ncomp == 4 || ncomp == 2);
87 
88  red = image->comps[0].data;
89 
90  if(triple)
91  {
92  green = image->comps[1].data;
93  blue = image->comps[2].data;
94  }
95  else green = blue = nullptr;
96 
97  if(has_alpha)
98  {
99  const char *tt = (triple?"RGB_ALPHA":"GRAYSCALE_ALPHA");
100 
101  sprintf(bufferLocal,
102  "P7\n# OpenJPEG-%s\nWIDTH %d\nHEIGHT %d\nDEPTH %d\n"
103  "MAXVAL %d\nTUPLTYPE %s\nENDHDR\n",
104  opj_version(),
105  wr,
106  hr,
107  ncomp,
108  max,
109  tt);
110  str.writeRawData (bufferLocal,
111  strlen (bufferLocal));
112  alpha = image->comps[ncomp - 1].data;
113  adjustA = (image->comps[ncomp - 1].sgnd ?
114  1 << (image->comps[ncomp - 1].prec - 1) : 0);
115  }
116  else
117  {
118  sprintf(bufferLocal,
119  "P6\n# OpenJPEG-%s\n%d %d\n%d\n",
120  opj_version(),
121  wr,
122  hr,
123  max);
124  str.writeRawData (bufferLocal,
125  strlen (bufferLocal));
126  adjustA = 0;
127  }
128  adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
129 
130  if(triple)
131  {
132  adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0);
133  adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0);
134  }
135  else adjustG = adjustB = 0;
136 
137  for(i = 0; i < wr * hr; ++i)
138  {
139  if(two)
140  {
141  v = *red + adjustR; ++red;
142  if(v > 65535) v = 65535; else if(v < 0) v = 0;
143 
144  sprintf(bufferLocal,
145  "%c%c",
146  static_cast<unsigned char> (v>>8),
147  static_cast<unsigned char> (v));
148  str.writeRawData (bufferLocal,
149  2);
150 
151  if(triple)
152  {
153  v = *green + adjustG; ++green;
154  if(v > 65535) v = 65535; else if(v < 0) v = 0;
155 
156  sprintf(bufferLocal,
157  "%c%c",
158  static_cast<unsigned char> (v>>8),
159  static_cast<unsigned char> (v));
160  str.writeRawData (bufferLocal,
161  2);
162 
163  v = *blue + adjustB; ++blue;
164  if(v > 65535) v = 65535; else if(v < 0) v = 0;
165 
166  sprintf(bufferLocal,
167  "%c%c",
168  static_cast<unsigned char> (v>>8),
169  static_cast<unsigned char> (v));
170  str.writeRawData (bufferLocal,
171  2);
172 
173  }/* if(triple) */
174 
175  if(has_alpha)
176  {
177  v = *alpha + adjustA; ++alpha;
178  if(v > 65535) v = 65535; else if(v < 0) v = 0;
179 
180  sprintf(bufferLocal,
181  "%c%c",
182  static_cast<unsigned char> (v>>8),
183  static_cast<unsigned char> (v));
184  str.writeRawData (bufferLocal,
185  2);
186  }
187  continue;
188 
189  } /* if(two) */
190 
191  /* prec <= 8: */
192  v = *red++;
193  if(v > 255) v = 255; else if(v < 0) v = 0;
194 
195  sprintf(bufferLocal,
196  "%c",
197  static_cast<unsigned char> (v));
198  str.writeRawData (bufferLocal,
199  1);
200  if(triple)
201  {
202  v = *green++;
203  if(v > 255) v = 255; else if(v < 0) v = 0;
204 
205  sprintf(bufferLocal,
206  "%c",
207  static_cast<unsigned char> (v));
208  str.writeRawData (bufferLocal,
209  1);
210  v = *blue++;
211  if(v > 255) v = 255; else if(v < 0) v = 0;
212 
213  sprintf(bufferLocal,
214  "%c",
215  static_cast<unsigned char> (v));
216  str.writeRawData (bufferLocal,
217  1);
218  }
219  if(has_alpha)
220  {
221  v = *alpha++;
222  if(v > 255) v = 255; else if(v < 0) v = 0;
223 
224  sprintf(bufferLocal,
225  "%c",
226  static_cast<unsigned char> (v));
227  str.writeRawData (bufferLocal,
228  1);
229  }
230  } /* for(i */
231 
232  return 0;
233  }
234 
235  /* YUV or MONO: */
236 
237  if (image->numcomps > ncomp)
238  {
239  LOG4CPP_WARN_S ((*mainCat)) << "imagetopnm will only use the first component";
240  }
241 
242  for (compno = 0; compno < ncomp; compno++)
243  {
244  wr = qFloor (image->comps[compno].w);
245  hr = qFloor (image->comps[compno].h);
246  prec = qFloor (image->comps[compno].prec);
247  max = (1<<prec) - 1;
248 
249  sprintf(bufferLocal,
250  "P5\n#OpenJPEG-%s\n%d %d\n%d\n",
251  opj_version(),
252  wr,
253  hr,
254  max);
255  str.writeRawData (bufferLocal,
256  strlen (bufferLocal));
257 
258  red = image->comps[compno].data;
259  adjustR =
260  (image->comps[compno].sgnd ? 1 << (image->comps[compno].prec - 1) : 0);
261 
262  if(prec > 8)
263  {
264  for (i = 0; i < wr * hr; i++)
265  {
266  v = *red + adjustR; ++red;
267  if(v > 65535) v = 65535; else if(v < 0) v = 0;
268 
269  sprintf(bufferLocal,
270  "%c%c",
271  static_cast<unsigned char> (v>>8),
272  static_cast<unsigned char> (v));
273  str.writeRawData (bufferLocal,
274  2);
275 
276  if(has_alpha)
277  {
278  v = *alpha++;
279  if(v > 65535) v = 65535; else if(v < 0) v = 0;
280 
281  sprintf(bufferLocal,
282  "%c%c",
283  static_cast<unsigned char> (v>>8),
284  static_cast<unsigned char> (v));
285  str.writeRawData (bufferLocal,
286  2);
287  }
288  }/* for(i */
289  }
290  else /* prec <= 8 */
291  {
292  for(i = 0; i < wr * hr; ++i)
293  {
294  v = *red + adjustR; ++red;
295  if(v > 255) v = 255; else if(v < 0) v = 0;
296 
297  sprintf(bufferLocal,
298  "%c",
299  static_cast<unsigned char> (v));
300  str.writeRawData (bufferLocal,
301  1);
302  }
303  }
304  } /* for (compno */
305 
306  return 0;
307 }/* imagetopnm() */
int imagetopnm(opj_image_t *image, QBuffer &buffer)
log4cpp::Category * mainCat
Definition: Logger.cpp:14
#define LOG4CPP_WARN_S(logger)
Definition: convenience.h:14