]> Creatis software - gdcm.git/blob - src/gdcmjasper/src/libjasper/jpc/jpc_mct.c
ENH: Ok since OJ warnings are not going to be fixed anytime soon remove them
[gdcm.git] / src / gdcmjasper / src / libjasper / jpc / jpc_mct.c
1 /*
2  * Copyright (c) 1999-2000 Image Power, Inc. and the University of
3  *   British Columbia.
4  * Copyright (c) 2001-2003 Michael David Adams.
5  * All rights reserved.
6  */
7
8 /* __START_OF_JASPER_LICENSE__
9  * 
10  * JasPer License Version 2.0
11  * 
12  * Copyright (c) 1999-2000 Image Power, Inc.
13  * Copyright (c) 1999-2000 The University of British Columbia
14  * Copyright (c) 2001-2003 Michael David Adams
15  * 
16  * All rights reserved.
17  * 
18  * Permission is hereby granted, free of charge, to any person (the
19  * "User") obtaining a copy of this software and associated documentation
20  * files (the "Software"), to deal in the Software without restriction,
21  * including without limitation the rights to use, copy, modify, merge,
22  * publish, distribute, and/or sell copies of the Software, and to permit
23  * persons to whom the Software is furnished to do so, subject to the
24  * following conditions:
25  * 
26  * 1.  The above copyright notices and this permission notice (which
27  * includes the disclaimer below) shall be included in all copies or
28  * substantial portions of the Software.
29  * 
30  * 2.  The name of a copyright holder shall not be used to endorse or
31  * promote products derived from the Software without specific prior
32  * written permission.
33  * 
34  * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
35  * LICENSE.  NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
36  * THIS DISCLAIMER.  THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
37  * "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
38  * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
39  * PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.  IN NO
40  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
41  * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
42  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
43  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
44  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  NO ASSURANCES ARE
45  * PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE
46  * THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY.
47  * EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS
48  * BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL
49  * PROPERTY RIGHTS OR OTHERWISE.  AS A CONDITION TO EXERCISING THE RIGHTS
50  * GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE
51  * ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY.  THE SOFTWARE
52  * IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL
53  * SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES,
54  * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL
55  * SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH
56  * THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH,
57  * PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
58  * RISK ACTIVITIES").  THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY
59  * EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.
60  * 
61  * __END_OF_JASPER_LICENSE__
62  */
63
64 /*
65  * Multicomponent Transform Code
66  *
67  * $Id: jpc_mct.c,v 1.1 2005/05/22 18:33:04 malaterre Exp $
68  */
69
70 /******************************************************************************\
71 * Includes.
72 \******************************************************************************/
73
74 #include <assert.h>
75
76 #include "jasper/jas_seq.h"
77
78 #include "jpc_fix.h"
79 #include "jpc_mct.h"
80
81 /******************************************************************************\
82 * Code.
83 \******************************************************************************/
84
85 /* Compute the forward RCT. */
86
87 void jpc_rct(jas_matrix_t *c0, jas_matrix_t *c1, jas_matrix_t *c2)
88 {
89   int numrows;
90   int numcols;
91   int i;
92   int j;
93   jpc_fix_t *c0p;
94   jpc_fix_t *c1p;
95   jpc_fix_t *c2p;
96
97   numrows = jas_matrix_numrows(c0);
98   numcols = jas_matrix_numcols(c0);
99
100   /* All three matrices must have the same dimensions. */
101   assert(jas_matrix_numrows(c1) == numrows && jas_matrix_numcols(c1) == numcols
102     && jas_matrix_numrows(c2) == numrows && jas_matrix_numcols(c2) == numcols);
103
104   for (i = 0; i < numrows; i++) {
105     c0p = jas_matrix_getref(c0, i, 0);
106     c1p = jas_matrix_getref(c1, i, 0);
107     c2p = jas_matrix_getref(c2, i, 0);
108     for (j = numcols; j > 0; --j) {
109       int r;
110       int g;
111       int b;
112       int y;
113       int u;
114       int v;
115       r = *c0p;
116       g = *c1p;
117       b = *c2p;
118       y = (r + (g << 1) + b) >> 2;
119       u = b - g;
120       v = r - g;
121       *c0p++ = y;
122       *c1p++ = u;
123       *c2p++ = v;
124     }
125   }
126 }
127
128 /* Compute the inverse RCT. */
129
130 void jpc_irct(jas_matrix_t *c0, jas_matrix_t *c1, jas_matrix_t *c2)
131 {
132   int numrows;
133   int numcols;
134   int i;
135   int j;
136   jpc_fix_t *c0p;
137   jpc_fix_t *c1p;
138   jpc_fix_t *c2p;
139
140   numrows = jas_matrix_numrows(c0);
141   numcols = jas_matrix_numcols(c0);
142
143   /* All three matrices must have the same dimensions. */
144   assert(jas_matrix_numrows(c1) == numrows && jas_matrix_numcols(c1) == numcols
145     && jas_matrix_numrows(c2) == numrows && jas_matrix_numcols(c2) == numcols);
146
147   for (i = 0; i < numrows; i++) {
148     c0p = jas_matrix_getref(c0, i, 0);
149     c1p = jas_matrix_getref(c1, i, 0);
150     c2p = jas_matrix_getref(c2, i, 0);
151     for (j = numcols; j > 0; --j) {
152       int r;
153       int g;
154       int b;
155       int y;
156       int u;
157       int v;
158       y = *c0p;
159       u = *c1p;
160       v = *c2p;
161       g = y - ((u + v) >> 2);
162       r = v + g;
163       b = u + g;
164       *c0p++ = r;
165       *c1p++ = g;
166       *c2p++ = b;
167     }
168   }
169 }
170
171 void jpc_ict(jas_matrix_t *c0, jas_matrix_t *c1, jas_matrix_t *c2)
172 {
173   int numrows;
174   int numcols;
175   int i;
176   int j;
177   jpc_fix_t r;
178   jpc_fix_t g;
179   jpc_fix_t b;
180   jpc_fix_t y;
181   jpc_fix_t u;
182   jpc_fix_t v;
183   jpc_fix_t *c0p;
184   jpc_fix_t *c1p;
185   jpc_fix_t *c2p;
186
187   numrows = jas_matrix_numrows(c0);
188   assert(jas_matrix_numrows(c1) == numrows && jas_matrix_numrows(c2) == numrows);
189   numcols = jas_matrix_numcols(c0);
190   assert(jas_matrix_numcols(c1) == numcols && jas_matrix_numcols(c2) == numcols);
191   for (i = 0; i < numrows; ++i) {
192     c0p = jas_matrix_getref(c0, i, 0);
193     c1p = jas_matrix_getref(c1, i, 0);
194     c2p = jas_matrix_getref(c2, i, 0);
195     for (j = numcols; j > 0; --j) {
196       r = *c0p;
197       g = *c1p;
198       b = *c2p;
199       y = jpc_fix_add3(jpc_fix_mul(jpc_dbltofix(0.299), r), jpc_fix_mul(jpc_dbltofix(0.587), g),
200         jpc_fix_mul(jpc_dbltofix(0.114), b));
201       u = jpc_fix_add3(jpc_fix_mul(jpc_dbltofix(-0.16875), r), jpc_fix_mul(jpc_dbltofix(-0.33126), g),
202         jpc_fix_mul(jpc_dbltofix(0.5), b));
203       v = jpc_fix_add3(jpc_fix_mul(jpc_dbltofix(0.5), r), jpc_fix_mul(jpc_dbltofix(-0.41869), g),
204         jpc_fix_mul(jpc_dbltofix(-0.08131), b));
205       *c0p++ = y;
206       *c1p++ = u;
207       *c2p++ = v;
208     }
209   }
210 }
211
212 void jpc_iict(jas_matrix_t *c0, jas_matrix_t *c1, jas_matrix_t *c2)
213 {
214   int numrows;
215   int numcols;
216   int i;
217   int j;
218   jpc_fix_t r;
219   jpc_fix_t g;
220   jpc_fix_t b;
221   jpc_fix_t y;
222   jpc_fix_t u;
223   jpc_fix_t v;
224   jpc_fix_t *c0p;
225   jpc_fix_t *c1p;
226   jpc_fix_t *c2p;
227
228   numrows = jas_matrix_numrows(c0);
229   assert(jas_matrix_numrows(c1) == numrows && jas_matrix_numrows(c2) == numrows);
230   numcols = jas_matrix_numcols(c0);
231   assert(jas_matrix_numcols(c1) == numcols && jas_matrix_numcols(c2) == numcols);
232   for (i = 0; i < numrows; ++i) {
233     c0p = jas_matrix_getref(c0, i, 0);
234     c1p = jas_matrix_getref(c1, i, 0);
235     c2p = jas_matrix_getref(c2, i, 0);
236     for (j = numcols; j > 0; --j) {
237       y = *c0p;
238       u = *c1p;
239       v = *c2p;
240       r = jpc_fix_add(y, jpc_fix_mul(jpc_dbltofix(1.402), v));
241       g = jpc_fix_add3(y, jpc_fix_mul(jpc_dbltofix(-0.34413), u),
242         jpc_fix_mul(jpc_dbltofix(-0.71414), v));
243       b = jpc_fix_add(y, jpc_fix_mul(jpc_dbltofix(1.772), u));
244       *c0p++ = r;
245       *c1p++ = g;
246       *c2p++ = b;
247     }
248   }
249 }
250
251 jpc_fix_t jpc_mct_getsynweight(int mctid, int cmptno)
252 {
253   jpc_fix_t synweight;
254
255   synweight = JPC_FIX_ONE;
256   switch (mctid) {
257   case JPC_MCT_RCT:
258     switch (cmptno) {
259     case 0:
260       synweight = jpc_dbltofix(sqrt(3.0));
261       break;
262     case 1:
263       synweight = jpc_dbltofix(sqrt(0.6875));
264       break;
265     case 2:
266       synweight = jpc_dbltofix(sqrt(0.6875));
267       break;
268     }
269     break;
270   case JPC_MCT_ICT:
271     switch (cmptno) {
272     case 0:
273       synweight = jpc_dbltofix(sqrt(3.0000));
274       break;
275     case 1:
276       synweight = jpc_dbltofix(sqrt(3.2584));
277       break;
278     case 2:
279       synweight = jpc_dbltofix(sqrt(2.4755));
280       break;
281     }
282     break;
283 #if 0
284   default:
285     synweight = JPC_FIX_ONE;
286     break;
287 #endif
288   }
289
290   return synweight;
291 }