]> Creatis software - gdcm.git/blob - src/gdcmopenjpeg/libopenjpeg/mct.c
ENH: Huge update to openjpeg 1.0 (actually more CVS)...
[gdcm.git] / src / gdcmopenjpeg / libopenjpeg / 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, HervĂ© 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