Update to 2.0.0 tree from current Fremantle build
[opencv] / 3rdparty / libjasper / 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) 2001-2006 Michael David Adams
13  * Copyright (c) 1999-2000 Image Power, Inc.
14  * Copyright (c) 1999-2000 The University of British Columbia
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.2 2008-05-26 09:40:52 vp153 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 }