~cosme/ubuntu/precise/freeimage/freeimage-3.15.1

« back to all changes in this revision

Viewing changes to Source/LibOpenJPEG/mct.c

  • Committer: Stefano Rivera
  • Date: 2010-07-24 15:35:51 UTC
  • mto: This revision was merged to the branch mainline in revision 5.
  • Revision ID: stefanor@ubuntu.com-20100724153551-6s3fth1653huk31a
Tags: upstream-3.13.1
ImportĀ upstreamĀ versionĀ 3.31.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
44
44
/* <summary> */
45
45
/* Foward reversible MCT. */
46
46
/* </summary> */
47
 
void mct_encode(int *c0, int *c1, int *c2, int n) {
 
47
void mct_encode(
 
48
                int* restrict c0,
 
49
                int* restrict c1,
 
50
                int* restrict c2,
 
51
                int n)
 
52
{
48
53
        int i;
49
 
        for (i = 0; i < n; i++) {
50
 
                int r, g, b, y, u, v;
51
 
                r = c0[i];
52
 
                g = c1[i];
53
 
                b = c2[i];
54
 
                y = (r + (g << 1) + b) >> 2;
55
 
                u = b - g;
56
 
                v = r - g;
 
54
        for(i = 0; i < n; ++i) {
 
55
                int r = c0[i];
 
56
                int g = c1[i];
 
57
                int b = c2[i];
 
58
                int y = (r + (g * 2) + b) >> 2;
 
59
                int u = b - g;
 
60
                int v = r - g;
57
61
                c0[i] = y;
58
62
                c1[i] = u;
59
63
                c2[i] = v;
63
67
/* <summary> */
64
68
/* Inverse reversible MCT. */
65
69
/* </summary> */
66
 
void mct_decode(int *c0, int *c1, int *c2, int n) {
 
70
void mct_decode(
 
71
                int* restrict c0,
 
72
                int* restrict c1, 
 
73
                int* restrict c2, 
 
74
                int n)
 
75
{
67
76
        int i;
68
 
        for (i = 0; i < n; i++) {
69
 
                int y, u, v, r, g, b;
70
 
                y = c0[i];
71
 
                u = c1[i];
72
 
                v = c2[i];
73
 
                g = y - ((u + v) >> 2);
74
 
                r = v + g;
75
 
                b = u + g;
 
77
        for (i = 0; i < n; ++i) {
 
78
                int y = c0[i];
 
79
                int u = c1[i];
 
80
                int v = c2[i];
 
81
                int g = y - ((u + v) >> 2);
 
82
                int r = v + g;
 
83
                int b = u + g;
76
84
                c0[i] = r;
77
85
                c1[i] = g;
78
86
                c2[i] = b;
89
97
/* <summary> */
90
98
/* Foward irreversible MCT. */
91
99
/* </summary> */
92
 
void mct_encode_real(int *c0, int *c1, int *c2, int n) {
 
100
void mct_encode_real(
 
101
                int* restrict c0,
 
102
                int* restrict c1,
 
103
                int* restrict c2,
 
104
                int n)
 
105
{
93
106
        int i;
94
 
        for (i = 0; i < n; i++) {
95
 
                int r, g, b, y, u, v;
96
 
                r = c0[i];
97
 
                g = c1[i];
98
 
                b = c2[i];
99
 
                y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934);
100
 
                u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096);
101
 
                v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666);
 
107
        for(i = 0; i < n; ++i) {
 
108
                int r = c0[i];
 
109
                int g = c1[i];
 
110
                int b = c2[i];
 
111
                int y =  fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934);
 
112
                int u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096);
 
113
                int v =  fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666);
102
114
                c0[i] = y;
103
115
                c1[i] = u;
104
116
                c2[i] = v;
108
120
/* <summary> */
109
121
/* Inverse irreversible MCT. */
110
122
/* </summary> */
111
 
void mct_decode_real(int *c0, int *c1, int *c2, int n) {
 
123
void mct_decode_real(
 
124
                float* restrict c0,
 
125
                float* restrict c1,
 
126
                float* restrict c2,
 
127
                int n)
 
128
{
112
129
        int i;
113
 
        for (i = 0; i < n; i++) {
114
 
                int y, u, v, r, g, b;
115
 
                y = c0[i];
116
 
                u = c1[i];
117
 
                v = c2[i];
118
 
                r = y + fix_mul(v, 11485);
119
 
                g = y - fix_mul(u, 2819) - fix_mul(v, 5850);
120
 
                b = y + fix_mul(u, 14516);
 
130
        for(i = 0; i < n; ++i) {
 
131
                float y = c0[i];
 
132
                float u = c1[i];
 
133
                float v = c2[i];
 
134
                float r = y + (v * 1.402f);
 
135
                float g = y - (u * 0.34413f) - (v * (0.71414f));
 
136
                float b = y + (u * 1.772f);
121
137
                c0[i] = r;
122
138
                c1[i] = g;
123
139
                c2[i] = b;