minor changes in cmake flags
[openjpeg.git] / libopenjpeg / opj_convert.c
1 #include "opj_includes.h"
2
3 /*--------------------------------------------------------
4 Matrix f�r sYCC, Amendment 1 to IEC 61966-2-1
5
6 Y :   0.299   0.587    0.114   :R
7 Cb:  -0.1687 -0.3312   0.5     :G
8 Cr:   0.5    -0.4187  -0.0812  :B
9
10 Inverse:
11
12 R: 1        -3.68213e-05    1.40199      :Y
13 G: 1.00003  -0.344125      -0.714128     :Cb - 2^(prec - 1)
14 B: 0.999823  1.77204       -8.04142e-06  :Cr - 2^(prec - 1)
15
16 -----------------------------------------------------------*/
17 static void sycc_to_rgb(int offset, int upb, int y, int cb, int cr,
18         int *out_r, int *out_g, int *out_b)
19 {
20         int r, g, b;
21
22         cb -= offset; cr -= offset;
23         r = y + (int)(1.402 * (float)cr);
24         if(r < 0) r = 0; else if(r > upb) r = upb; *out_r = r;
25
26         g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr);
27         if(g < 0) g = 0; else if(g > upb) g = upb; *out_g = g;
28
29         b = y + (int)(1.772 * (float)cb);
30         if(b < 0) b = 0; else if(b > upb) b = upb; *out_b = b;
31 }
32
33 static void opj_convert_sycc444(opj_image_t *img)
34 {
35         int *d0, *d1, *d2, *r, *g, *b;
36         const int *y, *cb, *cr;
37         int maxw, maxh, max, i, offset, upb;
38
39         i = img->comps[0].prec;
40         offset = 1<<(i - 1); upb = (1<<i)-1;
41
42         maxw = img->comps[0].w; maxh = img->comps[0].h;
43         max = maxw * maxh;
44
45         y = img->comps[0].data;
46         cb = img->comps[1].data;
47         cr = img->comps[2].data;
48
49         d0 = r = (int*)opj_malloc(sizeof(int) * max);
50         d1 = g = (int*)opj_malloc(sizeof(int) * max);
51         d2 = b = (int*)opj_malloc(sizeof(int) * max);
52
53         for(i = 0; i < max; ++i)
54    {
55         sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);        
56
57         ++y; ++cb; ++cr; ++r; ++g; ++b;
58    }    
59         opj_free(img->comps[0].data); img->comps[0].data = d0;
60         opj_free(img->comps[1].data); img->comps[1].data = d1;
61         opj_free(img->comps[2].data); img->comps[2].data = d2;
62
63 }/* opj_convert_sycc444() */
64
65 static void opj_convert_sycc422(opj_image_t *img)
66 {       
67         int *d0, *d1, *d2, *r, *g, *b;
68         const int *y, *cb, *cr;
69         int maxw, maxh, max, offset, upb;
70         int i, j;
71
72         i = img->comps[0].prec;
73         offset = 1<<(i - 1); upb = (1<<i)-1;
74
75         maxw = img->comps[0].w; maxh = img->comps[0].h;
76         max = maxw * maxh;
77
78         y = img->comps[0].data;
79         cb = img->comps[1].data;
80         cr = img->comps[2].data;
81
82         d0 = r = (int*)opj_malloc(sizeof(int) * max);
83         d1 = g = (int*)opj_malloc(sizeof(int) * max);
84         d2 = b = (int*)opj_malloc(sizeof(int) * max);
85
86         for(i=0; i < maxh; ++i)
87    {
88         for(j=0; j < maxw; j += 2)
89   {
90         sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
91
92         ++y; ++r; ++g; ++b;
93
94         sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
95
96         ++y; ++r; ++g; ++b; ++cb; ++cr;
97   }
98    }
99         opj_free(img->comps[0].data); img->comps[0].data = d0;
100         opj_free(img->comps[1].data); img->comps[1].data = d1;
101         opj_free(img->comps[2].data); img->comps[2].data = d2;
102
103         img->comps[1].w = maxw; img->comps[1].h = maxh;
104         img->comps[2].w = maxw; img->comps[2].h = maxh;
105         img->comps[1].dx = img->comps[0].dx;
106         img->comps[2].dx = img->comps[0].dx;
107         img->comps[1].dy = img->comps[0].dy;
108         img->comps[2].dy = img->comps[0].dy;
109
110 }/* opj_convert_sycc422() */
111
112 static void opj_convert_sycc420(opj_image_t *img)
113 {
114         int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb;
115         const int *y, *cb, *cr, *ny;
116         int maxw, maxh, max, offset, upb;
117         int i, j;
118
119         i = img->comps[0].prec;
120         offset = 1<<(i - 1); upb = (1<<i)-1;
121
122         maxw = img->comps[0].w; maxh = img->comps[0].h;
123         max = maxw * maxh;
124
125         y = img->comps[0].data;
126         cb = img->comps[1].data;
127         cr = img->comps[2].data;
128
129         d0 = r = (int*)opj_malloc(sizeof(int) * max);
130         d1 = g = (int*)opj_malloc(sizeof(int) * max);
131         d2 = b = (int*)opj_malloc(sizeof(int) * max);
132
133         for(i=0; i < maxh; i += 2)
134    {
135         ny = y + maxw;
136         nr = r + maxw; ng = g + maxw; nb = b + maxw;
137
138         for(j=0; j < maxw;  j += 2)
139   {
140         sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
141
142         ++y; ++r; ++g; ++b;
143
144         sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
145
146         ++y; ++r; ++g; ++b;
147
148         sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
149
150         ++ny; ++nr; ++ng; ++nb;
151
152         sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
153
154         ++ny; ++nr; ++ng; ++nb; ++cb; ++cr;
155   }
156         y += maxw; r += maxw; g += maxw; b += maxw;
157    }
158         opj_free(img->comps[0].data); img->comps[0].data = d0;
159         opj_free(img->comps[1].data); img->comps[1].data = d1;
160         opj_free(img->comps[2].data); img->comps[2].data = d2;
161
162         img->comps[1].w = maxw; img->comps[1].h = maxh;
163         img->comps[2].w = maxw; img->comps[2].h = maxh;
164         img->comps[1].dx = img->comps[0].dx;
165         img->comps[2].dx = img->comps[0].dx;
166         img->comps[1].dy = img->comps[0].dy;
167         img->comps[2].dy = img->comps[0].dy;
168
169 }/* opj_convert_sycc420() */
170
171 void opj_convert_sycc_to_rgb(opj_image_t *img)
172 {
173         if(img->numcomps < 3) 
174    {
175         img->color_space = CLRSPC_GRAY;
176         return;
177    }
178
179         if((img->comps[0].dx == 1)
180         && (img->comps[1].dx == 2)
181         && (img->comps[2].dx == 2)
182         && (img->comps[0].dy == 1)
183         && (img->comps[1].dy == 2)
184         && (img->comps[2].dy == 2))/* horizontal and vertical sub-sample */
185   {
186         opj_convert_sycc420(img);
187   }
188         else
189         if((img->comps[0].dx == 1)
190         && (img->comps[1].dx == 2)
191         && (img->comps[2].dx == 2)
192         && (img->comps[0].dy == 1)
193         && (img->comps[1].dy == 1)
194         && (img->comps[2].dy == 1))/* horizontal sub-sample only */
195   {
196         opj_convert_sycc422(img);
197   }
198         else
199         if((img->comps[0].dx == 1)
200         && (img->comps[1].dx == 1)
201         && (img->comps[2].dx == 1)
202         && (img->comps[0].dy == 1)
203         && (img->comps[1].dy == 1)
204         && (img->comps[2].dy == 1))/* no sub-sample */
205   {
206         opj_convert_sycc444(img);
207   }
208         else
209   {
210         fprintf(stderr,"%s:%d:opj_convert_sycc_to_rgb\n\tCAN NOT CONVERT\n",
211          __FILE__,__LINE__);
212         return;
213   }
214         img->color_space = CLRSPC_SRGB;
215
216 }/* opj_convert_sycc_to_rgb() */