fixed lt_version in configure.ac
[openjpeg.git] / libjp3dvm / mct.c
1 /*\r
2  * Copyright (c) 2001-2003, David Janssens\r
3  * Copyright (c) 2002-2003, Yannick Verschueren\r
4  * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
5  * Copyright (c) 2005, Herve Drolon, FreeImage Team\r
6  * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
7  * All rights reserved.\r
8  *\r
9  * Redistribution and use in source and binary forms, with or without\r
10  * modification, are permitted provided that the following conditions\r
11  * are met:\r
12  * 1. Redistributions of source code must retain the above copyright\r
13  *    notice, this list of conditions and the following disclaimer.\r
14  * 2. Redistributions in binary form must reproduce the above copyright\r
15  *    notice, this list of conditions and the following disclaimer in the\r
16  *    documentation and/or other materials provided with the distribution.\r
17  *\r
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
28  * POSSIBILITY OF SUCH DAMAGE.\r
29  */\r
30 \r
31 #include "opj_includes.h"\r
32 \r
33 /* <summary> */\r
34 /* This table contains the norms of the basis function of the reversible MCT. */\r
35 /* </summary> */\r
36 static const double mct_norms[3] = { 1.732, .8292, .8292 };\r
37 \r
38 /* <summary> */\r
39 /* This table contains the norms of the basis function of the irreversible MCT. */\r
40 /* </summary> */\r
41 static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 };\r
42 \r
43 /* <summary> */\r
44 /* Foward reversible MCT. */\r
45 /* </summary> */\r
46 void mct_encode(int *c0, int *c1, int *c2, int n) {\r
47         int i;\r
48         for (i = 0; i < n; i++) {\r
49                 int r, g, b, y, u, v;\r
50                 r = c0[i];\r
51                 g = c1[i];\r
52                 b = c2[i];\r
53                 y = (r + (g << 1) + b) >> 2;\r
54                 u = b - g;\r
55                 v = r - g;\r
56                 c0[i] = y;\r
57                 c1[i] = u;\r
58                 c2[i] = v;\r
59         }\r
60 }\r
61 \r
62 /* <summary> */\r
63 /* Inverse reversible MCT. */\r
64 /* </summary> */\r
65 void mct_decode(int *c0, int *c1, int *c2, int n) {\r
66         int i;\r
67         for (i = 0; i < n; i++) {\r
68                 int y, u, v, r, g, b;\r
69                 y = c0[i];\r
70                 u = c1[i];\r
71                 v = c2[i];\r
72                 g = y - ((u + v) >> 2);\r
73                 r = v + g;\r
74                 b = u + g;\r
75                 c0[i] = r;\r
76                 c1[i] = g;\r
77                 c2[i] = b;\r
78         }\r
79 }\r
80 \r
81 /* <summary> */\r
82 /* Get norm of basis function of reversible MCT. */\r
83 /* </summary> */\r
84 double mct_getnorm(int compno) {\r
85         return mct_norms[compno];\r
86 }\r
87 \r
88 /* <summary> */\r
89 /* Foward irreversible MCT. */\r
90 /* </summary> */\r
91 void mct_encode_real(int *c0, int *c1, int *c2, int n) {\r
92         int i;\r
93         for (i = 0; i < n; i++) {\r
94                 int r, g, b, y, u, v;\r
95                 r = c0[i];\r
96                 g = c1[i];\r
97                 b = c2[i];\r
98                 y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934);\r
99                 u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096);\r
100                 v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666);\r
101                 c0[i] = y;\r
102                 c1[i] = u;\r
103                 c2[i] = v;\r
104         }\r
105 }\r
106 \r
107 /* <summary> */\r
108 /* Inverse irreversible MCT. */\r
109 /* </summary> */\r
110 void mct_decode_real(int *c0, int *c1, int *c2, int n) {\r
111         int i;\r
112         for (i = 0; i < n; i++) {\r
113                 int y, u, v, r, g, b;\r
114                 y = c0[i];\r
115                 u = c1[i];\r
116                 v = c2[i];\r
117                 r = y + fix_mul(v, 11485);\r
118                 g = y - fix_mul(u, 2819) - fix_mul(v, 5850);\r
119                 b = y + fix_mul(u, 14516);\r
120                 c0[i] = r;\r
121                 c1[i] = g;\r
122                 c2[i] = b;\r
123         }\r
124 }\r
125 \r
126 /* <summary> */\r
127 /* Get norm of basis function of irreversible MCT. */\r
128 /* </summary> */\r
129 double mct_getnorm_real(int compno) {\r
130         return mct_norms_real[compno];\r
131 }\r