[trunk] Set of warnings fix for gcc -pedantic
[openjpeg.git] / src / lib / openjp3d / t1_3d.c
1 /*\r
2  * Copyrigth (c) 2006, M�nica D�ez, LPI-UVA, Spain\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  * 1. Redistributions of source code must retain the above copyright\r
9  *    notice, this list of conditions and the following disclaimer.\r
10  * 2. Redistributions in binary form must reproduce the above copyright\r
11  *    notice, this list of conditions and the following disclaimer in the\r
12  *    documentation and/or other materials provided with the distribution.\r
13  *\r
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
18  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
24  * POSSIBILITY OF SUCH DAMAGE.\r
25  */\r
26 \r
27 #include "opj_includes.h"\r
28 \r
29 /** @defgroup T1_3D T1_3D - Implementation of the tier-1 coding */\r
30 /*@{*/\r
31 \r
32 /** @name Local static functions */\r
33 /*@{*/\r
34 \r
35 static int t1_3d_getctxno_zc(unsigned int f, int orient);\r
36 static int t1_3d_getctxno_sc(unsigned int f);\r
37 static int t1_3d_getctxno_mag(unsigned int f, int fsvr);\r
38 static int t1_3d_getspb(unsigned int f);\r
39 static int t1_3d_getnmsedec_sig(opj_t1_3d_t *t1, int x, int bitpos);\r
40 static int t1_3d_getnmsedec_ref(opj_t1_3d_t *t1, int x, int bitpos);\r
41 static void t1_3d_updateflags(unsigned int *fp, int s);\r
42 /**\r
43 Encode significant pass\r
44 */\r
45 static void t1_3d_enc_sigpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, int *dp, int orient, int bpno, int one, int *nmsedec, char type, int vsc);\r
46 /**\r
47 Decode significant pass\r
48 */\r
49 static void t1_3d_dec_sigpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, int *dp, int orient, int oneplushalf, char type, int vsc);\r
50 /**\r
51 Encode significant pass\r
52 */\r
53 static void t1_3d_enc_sigpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, int orient, int *nmsedec, char type, int cblksty);\r
54 /**\r
55 Decode significant pass\r
56 */\r
57 static void t1_3d_dec_sigpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, int orient, char type, int cblksty);\r
58 /**\r
59 Encode refinement pass\r
60 */\r
61 static void t1_3d_enc_refpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, int *dp, int bpno, int one, int *nmsedec, char type, int vsc);\r
62 /**\r
63 Decode refinement pass\r
64 */\r
65 static void t1_3d_dec_refpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, int *dp, int poshalf, int neghalf, char type, int vsc);\r
66 /**\r
67 Encode refinement pass\r
68 */\r
69 static void t1_3d_enc_refpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, int *nmsedec, char type, int cblksty);\r
70 /**\r
71 Decode refinement pass\r
72 */\r
73 static void t1_3d_dec_refpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, char type, int cblksty);\r
74 /**\r
75 Encode clean-up pass\r
76 */\r
77 static void t1_3d_enc_clnpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, int *dp, int orient, int bpno, int one, int *nmsedec, int partial, int vsc);\r
78 /**\r
79 Decode clean-up pass\r
80 */\r
81 static void t1_3d_dec_clnpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, int *dp, int orient, int oneplushalf, int partial, int vsc);\r
82 /**\r
83 Encode clean-up pass\r
84 */\r
85 static void t1_3d_enc_clnpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, int orient, int *nmsedec, int cblksty);\r
86 /**\r
87 Decode clean-up pass\r
88 */\r
89 static void t1_3d_dec_clnpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, int orient, int cblksty);\r
90 /**\r
91 Encode 1 code-block\r
92 @param t1 T1 handle\r
93 @param cblk Code-block coding parameters\r
94 @param orient\r
95 @param compno Component number\r
96 @param level[3]\r
97 @param dwtid[3]\r
98 @param stepsize\r
99 @param cblksty Code-block style\r
100 @param numcomps\r
101 @param tile\r
102 */\r
103 static void t1_3d_encode_cblk(opj_t1_3d_t *t1, opj_tcd_cblk_t * cblk, int orient, int compno,  int level[3], int dwtid[3], double stepsize, int cblksty, int numcomps, opj_tcd_tile_t * tile);\r
104 /**\r
105 Decode 1 code-block\r
106 @param t1 T1 handle\r
107 @param cblk Code-block coding parameters\r
108 @param orient\r
109 @param roishift Region of interest shifting value\r
110 @param cblksty Code-block style\r
111 */\r
112 static void t1_3d_decode_cblk(opj_t1_3d_t *t1, opj_tcd_cblk_t * cblk, int orient, int roishift, int cblksty);\r
113 static int t1_3d_init_ctxno_zc(unsigned int f, int orient);\r
114 static int t1_3d_init_ctxno_sc(unsigned int f);\r
115 static int t1_3d_init_ctxno_mag(unsigned int f, int f2);\r
116 static int t1_3d_init_spb(unsigned int f);\r
117 /**\r
118 Initialize the look-up tables of the Tier-1 coder/decoder\r
119 @param t1 T1 handle\r
120 */\r
121 static void t1_3d_init_luts(opj_t1_3d_t *t1);\r
122 \r
123 /*@}*/\r
124 \r
125 /*@}*/\r
126 \r
127 /* ----------------------------------------------------------------------- */\r
128 \r
129 static int t1_3d_getctxno_zc(unsigned int f, int orient) {\r
130         return t1_3d_init_ctxno_zc((f & T1_3D_SIG_OTH), orient);\r
131 }\r
132 \r
133 static int t1_3d_getctxno_sc(unsigned int f) {\r
134         return t1_3d_init_ctxno_sc((f & T1_3D_SIG_PRIM) | ((f >> 16) & T1_3D_SGN));\r
135         /*return t1->lut_ctxno_sc[((f & T1_3D_SIG_PRIM) | ((f >> 16) & T1_3D_SGN)) >> 4];*/\r
136 }\r
137 \r
138 static int t1_3d_getctxno_mag(unsigned int f, int fsvr) {\r
139         return t1_3d_init_ctxno_mag((f & T1_3D_SIG_OTH), fsvr);\r
140 }\r
141 \r
142 static int t1_3d_getspb(unsigned int f) {\r
143         return t1_3d_init_spb((f & T1_3D_SIG_PRIM) | ((f >> 16) & T1_3D_SGN));\r
144         /*return t1->lut_spb[((f & T1_3D_SIG_PRIM) | ((f >> 16) & T1_3D_SGN)) >> 4];*/\r
145 }\r
146 \r
147 static int t1_3d_getnmsedec_sig(opj_t1_3d_t *t1, int x, int bitpos) {\r
148         if (bitpos > T1_NMSEDEC_FRACBITS) {\r
149                 return t1->lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];\r
150         }\r
151         \r
152         return t1->lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];\r
153 }\r
154 \r
155 static int t1_3d_getnmsedec_ref(opj_t1_3d_t *t1, int x, int bitpos) {\r
156         if (bitpos > T1_NMSEDEC_FRACBITS) {\r
157                 return t1->lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];\r
158         }\r
159 \r
160     return t1->lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];\r
161 }\r
162 \r
163 static void t1_3d_updateflags(unsigned int *fp, int s) {\r
164         unsigned int *np = fp - (T1_MAXCBLKW + 2);\r
165         unsigned int *sp = fp + (T1_MAXCBLKW + 2);\r
166 \r
167         unsigned int *bwp = fp + ((T1_MAXCBLKW + 2)*(T1_MAXCBLKH +2));\r
168         unsigned int *bnp = bwp - (T1_MAXCBLKW + 2);\r
169         unsigned int *bsp = bwp + (T1_MAXCBLKW + 2);\r
170         \r
171         unsigned int *fwp = fp - ((T1_MAXCBLKW + 2)*(T1_MAXCBLKH +2));\r
172         unsigned int *fnp = fwp - (T1_MAXCBLKW + 2);\r
173         unsigned int *fsp = fwp + (T1_MAXCBLKW + 2);\r
174 \r
175         np[-1] |= T1_3D_SIG_SE;\r
176         np[1] |= T1_3D_SIG_SW;\r
177         sp[-1] |= T1_3D_SIG_NE;\r
178         sp[1] |= T1_3D_SIG_NW;\r
179         *np |= T1_3D_SIG_S;\r
180         *sp |= T1_3D_SIG_N;\r
181         fp[-1] |= T1_3D_SIG_E;\r
182         fp[1] |= T1_3D_SIG_W;\r
183 \r
184         *fwp |= T1_3D_SIG_FC;\r
185         *bwp |= T1_3D_SIG_BC;\r
186 \r
187         fnp[-1] |= T1_3D_SIG_FSE;\r
188         fnp[1] |= T1_3D_SIG_FSW;\r
189         fsp[-1] |= T1_3D_SIG_FNE;\r
190         fsp[1] |= T1_3D_SIG_FNW;\r
191         *fnp |= T1_3D_SIG_FS;\r
192         *fsp |= T1_3D_SIG_FN;\r
193         fwp[-1] |= T1_3D_SIG_FE;\r
194         fwp[1] |= T1_3D_SIG_FW;\r
195 \r
196         bnp[-1] |= T1_3D_SIG_BSE;\r
197         bnp[1] |= T1_3D_SIG_BSW;\r
198         bsp[-1] |= T1_3D_SIG_BNE;\r
199         bsp[1] |= T1_3D_SIG_BNW;\r
200         *bnp |= T1_3D_SIG_BS;\r
201         *bsp |= T1_3D_SIG_BN;\r
202         bwp[-1] |= T1_3D_SIG_BE;\r
203         bwp[1] |= T1_3D_SIG_BW;\r
204 \r
205         if (s) {\r
206                 *np |= (T1_3D_SGN_S << 16);\r
207                 *sp |= (T1_3D_SGN_N << 16);\r
208                 fp[-1] |= (T1_3D_SGN_E << 16);\r
209                 fp[1] |= (T1_3D_SGN_W << 16);\r
210                 *fwp |= (T1_3D_SGN_F << 16);\r
211                 *bwp |= (T1_3D_SGN_B << 16);\r
212         }\r
213 }\r
214 \r
215 static void t1_3d_enc_sigpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, int *dp, int orient, int bpno, int one, int *nmsedec, char type, int vsc) {\r
216         int v, flagsvr;\r
217         unsigned int flag;\r
218 \r
219         opj_mqc_t *mqc = t1->mqc;       /* MQC component */\r
220         \r
221         flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | (T1_3D_SGN_S << 16)))) : (*fp);\r
222         flagsvr = (*fsvr);\r
223         if ((flag & T1_3D_SIG_OTH) && !(flagsvr & (T1_3D_SIG | T1_3D_VISIT))) {\r
224                 v = int_abs(*dp) & one ? 1 : 0;\r
225                 if (type == T1_TYPE_RAW) {      /* BYPASS/LAZY MODE */\r
226                         mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient));    /* ESSAI */\r
227                         mqc_bypass_enc(mqc, v);\r
228                 } else {\r
229                         mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient));\r
230                         mqc_encode(mqc, v);\r
231                 }\r
232                 if (v) {\r
233                         v = *dp < 0 ? 1 : 0;\r
234                         *nmsedec +=     t1_3d_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);\r
235                         if (type == T1_TYPE_RAW) {      /* BYPASS/LAZY MODE */\r
236                                 mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag));    /* ESSAI */\r
237                                 mqc_bypass_enc(mqc, v);\r
238                         } else {\r
239                                 mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag));\r
240                                 mqc_encode(mqc, v ^ t1_3d_getspb(flag));\r
241                         }\r
242                         t1_3d_updateflags(fp, v);\r
243                         *fsvr |= T1_3D_SIG;\r
244                 }\r
245                 *fsvr |= T1_3D_VISIT;\r
246         }\r
247 }\r
248 \r
249 static void t1_3d_dec_sigpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, int *dp, int orient, int oneplushalf, char type, int vsc) {\r
250         int v, flagsvr;\r
251         unsigned int flag;\r
252         \r
253         opj_raw_t *raw = t1->raw;       /* RAW component */\r
254         opj_mqc_t *mqc = t1->mqc;       /* MQC component */\r
255         \r
256         flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | (T1_3D_SGN_S << 16)))) : (*fp);\r
257         flagsvr = (*fsvr);\r
258         if ((flag & T1_3D_SIG_OTH) && !(flagsvr & (T1_3D_SIG | T1_3D_VISIT))) {\r
259                 if (type == T1_TYPE_RAW) {\r
260                         if (raw_decode(raw)) {\r
261                                 v = raw_decode(raw);    /* ESSAI */\r
262                                 *dp = v ? -oneplushalf : oneplushalf;\r
263                                 t1_3d_updateflags(fp, v);\r
264                                 *fsvr |= T1_3D_SIG;\r
265                         }\r
266                 } else {\r
267                         mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient));\r
268                         if (mqc_decode(mqc)) {\r
269                                 mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag));\r
270                                 v = mqc_decode(mqc) ^ t1_3d_getspb(flag);\r
271                                 *dp = v ? -oneplushalf : oneplushalf;\r
272                                 t1_3d_updateflags(fp, v);\r
273                                 *fsvr |= T1_3D_SIG;\r
274                         }\r
275                 }\r
276                 *fsvr |= T1_3D_VISIT;\r
277         }\r
278 }                               /* VSC and  BYPASS by Antonin */\r
279 \r
280 static void t1_3d_enc_sigpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, int orient, int *nmsedec, char type, int cblksty) {\r
281         int i, j, k, m, one, vsc;\r
282         *nmsedec = 0;\r
283         one = 1 << (bpno + T1_NMSEDEC_FRACBITS);\r
284         for (m = 0; m < l; m++) {\r
285                 for (k = 0; k < h; k += 4) {\r
286                         for (i = 0; i < w; i++) {\r
287                                 for (j = k; j < k + 4 && j < h; j++) {\r
288                                         vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;\r
289                                         t1_3d_enc_sigpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], orient, bpno, one, nmsedec, type, vsc);\r
290                                 }\r
291                         }\r
292                 }\r
293         }\r
294 }\r
295 \r
296 static void t1_3d_dec_sigpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, int orient, char type, int cblksty) {\r
297         int i, j, k, m, one, half, oneplushalf, vsc;\r
298         one = 1 << bpno;\r
299         half = one >> 1;\r
300         oneplushalf = one | half;\r
301         for (m = 0; m < l; m++) {\r
302                 for (k = 0; k < h; k += 4) {\r
303                         for (i = 0; i < w; i++) {\r
304                                 for (j = k; j < k + 4 && j < h; j++) {\r
305                                         vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;\r
306                                         t1_3d_dec_sigpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], orient, oneplushalf, type, vsc);\r
307                                 }\r
308                         }\r
309                 }\r
310         }\r
311 }                               /* VSC and  BYPASS by Antonin */\r
312 \r
313 static void t1_3d_enc_refpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, int *dp, int bpno, int one, int *nmsedec, char type, int vsc) {\r
314         int v, flagsvr;\r
315         unsigned int flag;\r
316 \r
317         opj_mqc_t *mqc = t1->mqc;       /* MQC component */\r
318         \r
319         flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | (T1_3D_SGN_S << 16)))) : (*fp);\r
320         flagsvr = (*fsvr);\r
321         if ((flagsvr & (T1_3D_SIG | T1_3D_VISIT)) == T1_3D_SIG) {\r
322                 *nmsedec += t1_3d_getnmsedec_ref(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);\r
323                 v = int_abs(*dp) & one ? 1 : 0;\r
324                 if (type == T1_TYPE_RAW) {      /* BYPASS/LAZY MODE */\r
325                         mqc_setcurctx(mqc, t1_3d_getctxno_mag(flag, flagsvr));  /* ESSAI */\r
326                         mqc_bypass_enc(mqc, v);\r
327                 } else {\r
328                         mqc_setcurctx(mqc, t1_3d_getctxno_mag(flag, flagsvr));\r
329                         mqc_encode(mqc, v);\r
330                 }\r
331                 *fsvr |= T1_3D_REFINE;\r
332         }\r
333 }\r
334 \r
335 static void t1_3d_dec_refpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, int *dp, int poshalf, int neghalf, char type, int vsc) {\r
336         int v, t, flagsvr;\r
337         unsigned int flag;\r
338 \r
339         opj_mqc_t *mqc = t1->mqc;       /* MQC component */\r
340         opj_raw_t *raw = t1->raw;       /* RAW component */\r
341         \r
342         flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | (T1_3D_SGN_S << 16)))) : (*fp);\r
343         flagsvr = (*fsvr);\r
344         if ((flagsvr & (T1_3D_SIG | T1_3D_VISIT)) == T1_3D_SIG) {\r
345                 if (type == T1_TYPE_RAW) {\r
346                         mqc_setcurctx(mqc, t1_3d_getctxno_mag(flag, flagsvr));  /* ESSAI */\r
347                         v = raw_decode(raw);\r
348                 } else {\r
349                         mqc_setcurctx(mqc, t1_3d_getctxno_mag(flag, flagsvr));\r
350                         v = mqc_decode(mqc);\r
351                 }\r
352                 t = v ? poshalf : neghalf;\r
353                 *dp += *dp < 0 ? -t : t;\r
354                 *fsvr |= T1_3D_REFINE;\r
355         }\r
356 }                               /* VSC and  BYPASS by Antonin  */\r
357 \r
358 static void t1_3d_enc_refpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, int *nmsedec, char type, int cblksty) {\r
359         int i, j, k, m, one, vsc;\r
360         *nmsedec = 0;\r
361         one = 1 << (bpno + T1_NMSEDEC_FRACBITS);\r
362         for (m = 0; m < l; m++){\r
363                 for (k = 0; k < h; k += 4) {\r
364                         for (i = 0; i < w; i++) {\r
365                                 for (j = k; j < k + 4 && j < h; j++) {\r
366                                         vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;\r
367                                         t1_3d_enc_refpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], bpno, one, nmsedec, type, vsc);\r
368                                 }\r
369                         }\r
370                 }\r
371         }       \r
372 }\r
373 \r
374 static void t1_3d_dec_refpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, char type, int cblksty) {\r
375         int i, j, k, m, one, poshalf, neghalf;\r
376         int vsc;\r
377         one = 1 << bpno;\r
378         poshalf = one >> 1;\r
379         neghalf = bpno > 0 ? -poshalf : -1;\r
380         for (m = 0; m < l; m++) {\r
381                 for (k = 0; k < h; k += 4) {\r
382                         for (i = 0; i < w; i++) {\r
383                                 for (j = k; j < k + 4 && j < h; j++) {\r
384                                         vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;\r
385                                         t1_3d_dec_refpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], poshalf, neghalf, type, vsc);\r
386                                 }\r
387                         }\r
388                 }\r
389         }\r
390 }                               /* VSC and  BYPASS by Antonin */\r
391 \r
392 static void t1_3d_enc_clnpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, int *dp, int orient, int bpno, int one, int *nmsedec, int partial, int vsc) {\r
393         int v, flagsvr;\r
394         unsigned int flag;\r
395 \r
396         opj_mqc_t *mqc = t1->mqc;       /* MQC component */\r
397         \r
398         flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | (T1_3D_SGN_S << 16)))) : (*fp);\r
399         flagsvr = (*fsvr);\r
400         if (partial) {\r
401                 goto LABEL_PARTIAL;\r
402         }\r
403         if (!(*fsvr & (T1_3D_SIG | T1_3D_VISIT))) {\r
404                 mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient));\r
405                 v = int_abs(*dp) & one ? 1 : 0;\r
406                 mqc_encode(mqc, v);\r
407                 if (v) {\r
408 LABEL_PARTIAL:\r
409                         *nmsedec += t1_3d_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);\r
410                         mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag));\r
411                         v = *dp < 0 ? 1 : 0;\r
412                         mqc_encode(mqc, v ^ t1_3d_getspb(flag));\r
413                         t1_3d_updateflags(fp, v);\r
414                         *fsvr |= T1_3D_SIG;\r
415                 }\r
416         }\r
417         *fsvr &= ~T1_3D_VISIT;\r
418 }\r
419 \r
420 static void t1_3d_dec_clnpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, int *dp, int orient, int oneplushalf, int partial, int vsc) {\r
421         int v, flagsvr;\r
422         unsigned int flag;\r
423 \r
424         opj_mqc_t *mqc = t1->mqc;       /* MQC component */\r
425         \r
426         flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | (T1_3D_SGN_S << 16)))) : (*fp);\r
427         flagsvr = (*fsvr);\r
428         if (partial) {\r
429                 goto LABEL_PARTIAL;\r
430         }\r
431         if (!(flagsvr & (T1_3D_SIG | T1_3D_VISIT))) {\r
432                 mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient));\r
433                 if (mqc_decode(mqc)) {\r
434 LABEL_PARTIAL:\r
435                         mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag));\r
436                         v = mqc_decode(mqc) ^ t1_3d_getspb(flag);\r
437                         *dp = v ? -oneplushalf : oneplushalf;\r
438                         t1_3d_updateflags(fp, v);\r
439                         *fsvr |= T1_3D_SIG;\r
440                 }\r
441         }\r
442         *fsvr &= ~T1_3D_VISIT;\r
443 }                               /* VSC and  BYPASS by Antonin */\r
444 \r
445 static void t1_3d_enc_clnpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, int orient, int *nmsedec, int cblksty) {\r
446         int i, j, k, m, one, agg, runlen, vsc;\r
447         \r
448         opj_mqc_t *mqc = t1->mqc;       /* MQC component */\r
449         \r
450         *nmsedec = 0;\r
451         one = 1 << (bpno + T1_NMSEDEC_FRACBITS);\r
452         for (m = 0; m < l; m++) {\r
453                 for (k = 0; k < h; k += 4) {\r
454                         for (i = 0; i < w; i++) {\r
455                                 if (k + 3 < h) {\r
456                                         if (cblksty & J3D_CCP_CBLKSTY_VSC) {\r
457                                                 agg = !( ((t1->flagSVR[1 + m][1 + k][1 + i] | (T1_3D_SIG | T1_3D_VISIT)) & (t1->flags[1 + m][1 + k][1 + i] & T1_3D_SIG_OTH))\r
458                                                         ||   ((t1->flagSVR[1 + m][1 + k + 1][1 + i] | (T1_3D_SIG | T1_3D_VISIT)) & (t1->flags[1 + m][1 + k + 1][1 + i] & T1_3D_SIG_OTH))\r
459                                                         ||   ((t1->flagSVR[1 + m][1 + k + 2][1 + i] | (T1_3D_SIG | T1_3D_VISIT)) & (t1->flags[1 + m][1 + k + 2][1 + i] & T1_3D_SIG_OTH))\r
460                                                         ||   ((t1->flagSVR[1 + m][1 + k + 3][1 + i] | (T1_3D_SIG | T1_3D_VISIT)) & ((t1->flags[1 + m][1 + k + 3][1 + i] & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | (T1_3D_SGN_S << 16)))) & (T1_3D_SIG_OTH)))\r
461                                                         );\r
462                                         } else {\r
463                                                 agg = !(\r
464                                                         ((t1->flagSVR[1 + m][1 + k][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | (t1->flags[1 + m][1 + k][1 + i] & T1_3D_SIG_OTH))\r
465                                                         || ((t1->flagSVR[1 + m][1 + k + 1][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | (t1->flags[1 + m][1 + k + 1][1 + i] & T1_3D_SIG_OTH))\r
466                                                         || ((t1->flagSVR[1 + m][1 + k + 2][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | (t1->flags[1 + m][1 + k + 2][1 + i] & T1_3D_SIG_OTH))\r
467                                                         || ((t1->flagSVR[1 + m][1 + k + 3][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | (t1->flags[1 + m][1 + k + 3][1 + i] & T1_3D_SIG_OTH))\r
468                                                         );\r
469                                         }\r
470                                 } else {\r
471                                         agg = 0;\r
472                                 }\r
473                                 if (agg) {\r
474                                         for (runlen = 0; runlen < 4; runlen++) {\r
475                                                 if (int_abs(t1->data[m][k + runlen][i]) & one)\r
476                                                         break;\r
477                                         }\r
478                                         mqc_setcurctx(mqc, T1_CTXNO_AGG);\r
479                                         mqc_encode(mqc, runlen != 4);\r
480                                         if (runlen == 4) {\r
481                                                 continue;\r
482                                         }\r
483                                         mqc_setcurctx(mqc, T1_CTXNO_UNI);\r
484                                         mqc_encode(mqc, runlen >> 1);\r
485                                         mqc_encode(mqc, runlen & 1);\r
486                                 } else {\r
487                                         runlen = 0;\r
488                                 }\r
489                                 for (j = k + runlen; j < k + 4 && j < h; j++) {\r
490                                         vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;\r
491                                         t1_3d_enc_clnpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], orient, bpno, one, nmsedec, agg && (j == k + runlen), vsc);\r
492                                 }\r
493                         }\r
494                 }\r
495         }\r
496 }\r
497 \r
498 static void t1_3d_dec_clnpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, int orient, int cblksty) {\r
499         int i, j, k, m, one, half, oneplushalf, agg, runlen, vsc;\r
500         int segsym = cblksty & J3D_CCP_CBLKSTY_SEGSYM;\r
501         \r
502         opj_mqc_t *mqc = t1->mqc;       /* MQC component */\r
503         \r
504         one = 1 << bpno;\r
505         half = one >> 1;\r
506         oneplushalf = one | half;\r
507         for (m = 0; m < l; m++) {\r
508                 for (k = 0; k < h; k += 4) {\r
509                         for (i = 0; i < w; i++) {\r
510                                 if (k + 3 < h) {\r
511                                         if (cblksty & J3D_CCP_CBLKSTY_VSC) {\r
512                                                 agg = !(\r
513                                                         ((t1->flagSVR[1 + m][1 + k][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | (t1->flags[1 + m][1 + k][1 + i] & T1_3D_SIG_OTH))\r
514                                                         || ((t1->flagSVR[1 + m][1 + k + 1][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | (t1->flags[1 + m][1 + k + 1][1 + i] & T1_3D_SIG_OTH))\r
515                                                         || ((t1->flagSVR[1 + m][1 + k + 2][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | (t1->flags[1 + m][1 + k + 2][1 + i] & T1_3D_SIG_OTH))\r
516                                                         || ((t1->flagSVR[1 + m][1 + k + 3][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | ((t1->flags[1 + m][1 + k + 3][1 + i] & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | (T1_3D_SGN_S << 16)))) & (T1_3D_SIG_OTH)))\r
517                                                         );\r
518                                         } else {\r
519                                                 agg = !(\r
520                                                         ((t1->flagSVR[1 + m][1 + k][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | (t1->flags[1 + m][1 + k][1 + i] & T1_3D_SIG_OTH))\r
521                                                         || ((t1->flagSVR[1 + m][1 + k + 1][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | (t1->flags[1 + m][1 + k + 1][1 + i] & T1_3D_SIG_OTH))\r
522                                                         || ((t1->flagSVR[1 + m][1 + k + 2][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | (t1->flags[1 + m][1 + k + 2][1 + i] & T1_3D_SIG_OTH))\r
523                                                         || ((t1->flagSVR[1 + m][1 + k + 3][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | (t1->flags[1 + m][1 + k + 3][1 + i] & T1_3D_SIG_OTH))\r
524                                                         );\r
525                                         }\r
526                                 } else {\r
527                                         agg = 0;\r
528                                 }\r
529                                 if (agg) {\r
530                                         mqc_setcurctx(mqc, T1_CTXNO_AGG);\r
531                                         if (!mqc_decode(mqc)) {\r
532                                                 continue;\r
533                                         }\r
534                                         mqc_setcurctx(mqc, T1_CTXNO_UNI);\r
535                                         runlen = mqc_decode(mqc);\r
536                                         runlen = (runlen << 1) | mqc_decode(mqc);\r
537                                 } else {\r
538                                         runlen = 0;\r
539                                 }\r
540                                 for (j = k + runlen; j < k + 4 && j < h; j++) {\r
541                                         vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;\r
542                                         t1_3d_dec_clnpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], orient, oneplushalf, agg && (j == k + runlen), vsc);\r
543                                 }\r
544                         }\r
545                 }\r
546         }\r
547         if (segsym) {\r
548                 int v = 0;\r
549                 mqc_setcurctx(mqc, T1_CTXNO_UNI);\r
550                 v = mqc_decode(mqc);\r
551                 v = (v << 1) | mqc_decode(mqc);\r
552                 v = (v << 1) | mqc_decode(mqc);\r
553                 v = (v << 1) | mqc_decode(mqc);\r
554                 /*\r
555                 if (v!=0xa) {\r
556                         opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);\r
557                 } \r
558                 */\r
559         }\r
560 }                               /* VSC and  BYPASS by Antonin */\r
561 \r
562 \r
563 static void t1_3d_encode_cblk(opj_t1_3d_t *t1, opj_tcd_cblk_t * cblk, int orient, int compno, int level[3], int dwtid[3], double stepsize, int cblksty, int numcomps, opj_tcd_tile_t * tile) {\r
564         int i, j, k;\r
565         int w, h, l;\r
566         int passno;\r
567         int bpno, passtype;\r
568         int max;\r
569         int nmsedec = 0;\r
570         double cumwmsedec = 0;\r
571         char type = T1_TYPE_MQ;\r
572         \r
573         opj_mqc_t *mqc = t1->mqc;       /* MQC component */\r
574         \r
575         w = cblk->x1 - cblk->x0;\r
576         h = cblk->y1 - cblk->y0;\r
577         l = cblk->z1 - cblk->z0;\r
578 \r
579         max = 0;\r
580         for (k = 0; k < l; k++) {\r
581                 for (j = 0; j < h; j++) {\r
582                         for (i = 0; i < w; i++) {\r
583                                 max = int_max(max, int_abs(t1->data[k][j][i]));\r
584                         }\r
585                 }\r
586         }\r
587         for (k = 0; k <= l; k++) {\r
588                 for (j = 0; j <= h; j++) {\r
589                         for (i = 0; i <= w; i++) {\r
590                                 t1->flags[k][j][i] = 0;\r
591                                 t1->flagSVR[k][j][i] = 0;\r
592                         }\r
593                 }\r
594         }\r
595         \r
596         cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0;\r
597         \r
598         bpno = cblk->numbps - 1;\r
599         passtype = 2;\r
600         \r
601         mqc_reset_enc(mqc);\r
602         mqc_init_enc(mqc, cblk->data);\r
603         \r
604         for (passno = 0; bpno >= 0; passno++) {\r
605                 opj_tcd_pass_t *pass = &cblk->passes[passno];\r
606                 int correction = 3;\r
607                 double tmpwmsedec;\r
608                 type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;\r
609                 \r
610                 switch (passtype) {\r
611                         case 0:\r
612                                 t1_3d_enc_sigpass(t1, w, h, l, bpno, orient, &nmsedec, type, cblksty);\r
613                                 break;\r
614                         case 1:\r
615                                 t1_3d_enc_refpass(t1, w, h, l, bpno, &nmsedec, type, cblksty);\r
616                                 break;\r
617                         case 2:\r
618                                 t1_3d_enc_clnpass(t1, w, h, l, bpno, orient, &nmsedec, cblksty);\r
619                                 /* code switch SEGMARK (i.e. SEGSYM) */\r
620                                 if (cblksty & J3D_CCP_CBLKSTY_SEGSYM)\r
621                                         mqc_segmark_enc(mqc);\r
622                                 break;\r
623                 }\r
624                 \r
625                 /* fixed_quality */\r
626                 tmpwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, stepsize, numcomps, dwtid);\r
627                 cumwmsedec += tmpwmsedec;\r
628                 tile->distotile += tmpwmsedec;\r
629                 \r
630                 /* Code switch "RESTART" (i.e. TERMALL) */\r
631                 if ((cblksty & J3D_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && (bpno - 1 < 0))) {\r
632                         if (type == T1_TYPE_RAW) {\r
633                                 mqc_flush(mqc);\r
634                                 correction = 1;\r
635                                 /* correction = mqc_bypass_flush_enc(); */\r
636                         } else {                        /* correction = mqc_restart_enc(); */\r
637                                 mqc_flush(mqc);\r
638                                 correction = 1;\r
639                         }\r
640                         pass->term = 1;\r
641                 } else {\r
642                         if (((bpno < (cblk->numbps - 4) && (passtype > 0)) \r
643                                 || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J3D_CCP_CBLKSTY_LAZY)) {\r
644                                 if (type == T1_TYPE_RAW) {\r
645                                         mqc_flush(mqc);\r
646                                         correction = 1;\r
647                                 } else {        \r
648                                         mqc_flush(mqc);\r
649                                         correction = 1;\r
650                                 }\r
651                                 pass->term = 1;\r
652                         } else {\r
653                                 pass->term = 0;\r
654                         }\r
655                 }\r
656                 \r
657                 if (++passtype == 3) {\r
658                         passtype = 0;\r
659                         bpno--;\r
660                 }\r
661                 \r
662                 if (pass->term && bpno > 0) {\r
663                         type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;\r
664                         if (type == T1_TYPE_RAW)\r
665                                 mqc_bypass_init_enc(mqc);\r
666                         else\r
667                                 mqc_restart_init_enc(mqc);\r
668                 }\r
669                 \r
670                 pass->distortiondec = cumwmsedec;\r
671                 pass->rate = mqc_numbytes(mqc) + correction;    /* FIXME */\r
672                 pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);\r
673 \r
674                 /* Code-switch "RESET" */\r
675                 if (cblksty & J3D_CCP_CBLKSTY_RESET)\r
676                         mqc_reset_enc(mqc);\r
677         }\r
678         \r
679         /* Code switch "ERTERM" (i.e. PTERM) */\r
680         if (cblksty & J3D_CCP_CBLKSTY_PTERM)\r
681                 mqc_erterm_enc(mqc);\r
682         else /* Default coding */ if (!(cblksty & J3D_CCP_CBLKSTY_LAZY))\r
683                 mqc_flush(mqc);\r
684         \r
685         cblk->totalpasses = passno;\r
686 }\r
687 \r
688 static void t1_3d_decode_cblk(opj_t1_3d_t *t1, opj_tcd_cblk_t * cblk, int orient, int roishift, int cblksty) {\r
689         int i, j, k;\r
690         int w, h, l;\r
691         int bpno, passtype;\r
692         int segno, passno;\r
693         char type = T1_TYPE_MQ; /* BYPASS mode */\r
694         opj_raw_t *raw = t1->raw;       /* RAW component */\r
695         opj_mqc_t *mqc = t1->mqc;       /* MQC component */\r
696         \r
697         w = cblk->x1 - cblk->x0;\r
698         h = cblk->y1 - cblk->y0;\r
699         l = cblk->z1 - cblk->z0;\r
700 \r
701     for (k = 0; k < l; k++) {\r
702                 for (j = 0; j < h; j++) {\r
703                         for (i = 0; i < w; i++) {\r
704                                 t1->data[k][j][i] = 0;\r
705                         }\r
706                 }\r
707         }\r
708         \r
709         for (k = 0; k <= l; k++) {\r
710                 for (j = 0; j <= h; j++) {\r
711                         for (i = 0; i <= w; i++) {\r
712                                 t1->flags[k][j][i] = 0;\r
713                                 t1->flagSVR[k][j][i] = 0;\r
714                         }\r
715                 }\r
716         }\r
717 \r
718         \r
719         bpno = roishift + cblk->numbps - 1;\r
720         passtype = 2;\r
721         \r
722         mqc_reset_enc(mqc);\r
723         \r
724         for (segno = 0; segno < cblk->numsegs; segno++) {\r
725                 opj_tcd_seg_t *seg = &cblk->segs[segno];\r
726                 \r
727                 /* BYPASS mode */\r
728                 type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;\r
729                 if (type == T1_TYPE_RAW) {\r
730                         raw_init_dec(raw, seg->data, seg->len);\r
731                 } else {\r
732                         mqc_init_dec(mqc, seg->data, seg->len);\r
733                 }\r
734                 \r
735                 for (passno = 0; passno < seg->numpasses; passno++) {\r
736                         switch (passtype) {\r
737                                 case 0:\r
738                                         t1_3d_dec_sigpass(t1, w, h, l, bpno+1, orient, type, cblksty);\r
739                                         break;\r
740                                 case 1:\r
741                                         t1_3d_dec_refpass(t1, w, h, l, bpno+1, type, cblksty);\r
742                                         break;\r
743                                 case 2:\r
744                                         t1_3d_dec_clnpass(t1, w, h, l, bpno+1, orient, cblksty);\r
745                                         break;\r
746                         }\r
747                         \r
748                         if ((cblksty & J3D_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {\r
749                                 mqc_reset_enc(mqc);\r
750                         }\r
751                         if (++passtype == 3) {\r
752                                 passtype = 0;\r
753                                 bpno--;\r
754                         }\r
755 \r
756                 }\r
757         }\r
758 }\r
759 \r
760 static int t1_3d_init_ctxno_zc(unsigned int f, int orient) {\r
761         unsigned int h, v, c;\r
762         unsigned int d2xy, d2xz, d2yz, d3;\r
763         int n;\r
764         unsigned int hvc, hc, d2, d2xy2yz, d2xy2xz;\r
765         n = 0;\r
766         h = ((f & T1_3D_SIG_W) != 0) + ((f & T1_3D_SIG_E) != 0);\r
767         v = ((f & T1_3D_SIG_N) != 0) + ((f & T1_3D_SIG_S) != 0);\r
768         c = ((f & T1_3D_SIG_FC) != 0) + ((f & T1_3D_SIG_BC) != 0);\r
769         d2xy = ((f & T1_3D_SIG_NW) != 0) + ((f & T1_3D_SIG_NE) != 0) + ((f & T1_3D_SIG_SE) != 0) + ((f & T1_3D_SIG_SW) != 0);\r
770         d2xz = ((f & T1_3D_SIG_FW) != 0) + ((f & T1_3D_SIG_BW) != 0) + ((f & T1_3D_SIG_FE) != 0) + ((f & T1_3D_SIG_BE) != 0);\r
771         d2yz = ((f & T1_3D_SIG_FN) != 0) + ((f & T1_3D_SIG_FS) != 0) + ((f & T1_3D_SIG_BN) != 0) + ((f & T1_3D_SIG_BS) != 0);\r
772     d3 = ((f & T1_3D_SIG_FNW) != 0) + ((f & T1_3D_SIG_FNE) != 0) + ((f & T1_3D_SIG_FSE) != 0) + ((f & T1_3D_SIG_FSW) != 0) \r
773                 + ((f & T1_3D_SIG_BNW) != 0) + ((f & T1_3D_SIG_BNE) != 0) + ((f & T1_3D_SIG_BSE) != 0) + ((f & T1_3D_SIG_BSW) != 0);\r
774         \r
775         switch (orient) {\r
776                 case 0: /*LLL*/\r
777                 case 7: /*HHH*/\r
778                         hvc = h + v + c;\r
779                         d2 = d2xy + d2xz + d2yz;\r
780                         if (!hvc) {\r
781                                 if (!d2) {\r
782                     n = (!d3) ? 0 : 1;\r
783                                 } else if (d2 == 1) {\r
784                                         n = (!d3) ? 2 : 3;\r
785                                 } else {\r
786                                         n = (!d3) ? 4 : 5;\r
787                                 }\r
788                         } else if (hvc == 1) {\r
789                                 if (!d2) {\r
790                     n = (!d3) ? 6 : 7;\r
791                                 } else if (d2 == 1) {\r
792                                         n = (!d3) ? 8 : 9;\r
793                                 } else {\r
794                                         n = 10;\r
795                                 }\r
796                         } else if (hvc == 2) {\r
797                                 if (!d2) {\r
798                     n = (!d3) ? 11 : 12;\r
799                                 } else {\r
800                                         n = 13;\r
801                                 }\r
802                         } else if (hvc == 3) {\r
803                                 n = 14;\r
804                         } else {\r
805                                 n = 15;\r
806                         }\r
807                         break;\r
808                 /*LHL, HLL, LLH*/\r
809                 case 1:\r
810                 case 2:\r
811                 case 4:\r
812                         hc = h + c;\r
813                         d2xy2yz = d2xy + d2yz;\r
814             if (!hc) {\r
815                                 if (!v) {\r
816                                         if (!d2xy) {\r
817                                                 n = (!d2xy2yz) ? ((!d3) ? 0 : 1) : ((!d3) ? 2 : 3);     \r
818                                         } else if (d2xy == 1) {\r
819                                                 n = (!d2xy2yz) ? ((!d3) ? 4 : 5) : 6;   \r
820                                         } else { /*>=2*/\r
821                         n = 7;\r
822                                         }\r
823                                 } else {\r
824                                         n = (v == 1) ? 8 : 9; /* =1 or =2*/\r
825                                 } \r
826                         } else if (hc == 1) {\r
827                                 n = (!v) ? ( (!d2xy) ? ( (!d2xy2yz) ? ( (!d3) ? 10 : 11) : (12) ) : (13) ) : (14);\r
828                         } else { /*if (hc >= 2)*/\r
829                                 n = 15;\r
830                         }\r
831                         break;\r
832                 /*HLH, HHL, LHH*/\r
833                 case 3:\r
834                 case 5:\r
835                 case 6:\r
836                         hc = h + c;\r
837                         d2xy2xz = d2xy + d2xz;\r
838                         if (!v) {\r
839                                 if (!d2xz) {\r
840                                         if (!hc && !d2xy2xz) {\r
841                                                 n = (!d3) ? 0 : 1;\r
842                                         } else if (hc == 1) {\r
843                                                 n = (!d2xy2xz) ?  2 : 3;\r
844                                         } else { /*if >= 2*/\r
845                                                 n = 4;\r
846                                         }\r
847                                 } else if ( d2xz>=1 && !hc ) {\r
848                                         n = 5;\r
849                                 } else if ( hc>=1 ) {\r
850                                         n = (d2xz==1) ? 6 : 7;\r
851                                 } \r
852                         } else if (v == 1) {\r
853                                 if (!d2xz) {\r
854                                         n = (!hc) ? 8 : 9;\r
855                                 } else if (d2xz == 1) {\r
856                                         n = (!hc) ? 10 : 11;\r
857                                 } else if (d2xz == 2) {\r
858                                         n = (!hc) ? 12 : 13;\r
859                                 } else { /* if (d2xz >= 3) {*/\r
860                                         n = 14;\r
861                                 }\r
862                         } else if (v == 2) {\r
863                                 n = 15;\r
864                         } \r
865                         break;\r
866         }\r
867         \r
868         return (T1_3D_CTXNO_ZC + n);\r
869 }\r
870 \r
871 static int t1_3d_init_ctxno_sc(unsigned int f) {\r
872         int hc, vc, cc;\r
873         int n = 0;\r
874 \r
875         hc = int_min( ( (f & (T1_3D_SIG_E | T1_3D_SGN_E)) == T1_3D_SIG_E ) \r
876                                         + ( (f & (T1_3D_SIG_W | T1_3D_SGN_W)) == T1_3D_SIG_W ) , 1) \r
877                 - int_min( ( (f & (T1_3D_SIG_E | T1_3D_SGN_E)) == (T1_3D_SIG_E | T1_3D_SGN_E) ) \r
878                                         + ( (f & (T1_3D_SIG_W | T1_3D_SGN_W) ) == (T1_3D_SIG_W | T1_3D_SGN_W)), 1);\r
879         \r
880         vc = int_min(((f & (T1_3D_SIG_N | T1_3D_SGN_N)) == T1_3D_SIG_N) \r
881                                         + ((f & (T1_3D_SIG_S | T1_3D_SGN_S)) == T1_3D_SIG_S), 1) \r
882                 - int_min(((f & (T1_3D_SIG_N | T1_3D_SGN_N)) == (T1_3D_SIG_N | T1_3D_SGN_N)) \r
883                                         + ((f & (T1_3D_SIG_S | T1_3D_SGN_S)) == (T1_3D_SIG_S | T1_3D_SGN_S)), 1);\r
884         \r
885         cc = int_min(((f & (T1_3D_SIG_FC | T1_3D_SGN_F)) == T1_3D_SIG_FC) \r
886                                         + ((f & (T1_3D_SIG_BC | T1_3D_SGN_B)) == T1_3D_SIG_BC), 1) \r
887                 - int_min(((f & (T1_3D_SIG_FC | T1_3D_SGN_F)) == (T1_3D_SIG_FC | T1_3D_SGN_F)) \r
888                                         + ((f & (T1_3D_SIG_BC | T1_3D_SGN_B)) == (T1_3D_SIG_BC | T1_3D_SGN_B)), 1);\r
889         if (hc < 0) {\r
890                 hc = -hc;\r
891                 vc = -vc;\r
892                 cc = -cc;\r
893         }\r
894 \r
895         if (!hc) {\r
896                 if (!vc) \r
897                         n = (!cc) ? 0 : 1;\r
898                 else if (vc == -1)\r
899                         n = (!cc) ? 1 : ( (cc>0) ? 2 : 4);\r
900                 else if (vc == 1)\r
901                         n = (!cc) ? 1 : ( (cc<0) ? 2 : 4);\r
902         } else if (hc == 1) {\r
903                 if (!vc)\r
904                         n = (!cc) ? 1 : ( (cc<0) ? 2 : 4);\r
905                 else if (vc == 1)\r
906                         n = (!cc) ? 4 : ( (cc>0) ? 5 : 3);\r
907                 else if (vc == -1)\r
908                         n = (!cc) ? 2 : 3;\r
909         } else if (hc == -1) {\r
910                 if (!vc)\r
911                         n = (!cc) ? 1 : ( (cc>0) ? 2 : 4);\r
912                 else if (vc == 1)\r
913                         n = (!cc) ? 2 : 3;\r
914                 else if (vc == -1)\r
915                         n = (!cc) ? 4 : ( (cc<0) ? 5 : 3);\r
916         }\r
917         \r
918         return (T1_3D_CTXNO_SC + n);\r
919 }\r
920 \r
921 static int t1_3d_init_ctxno_mag(unsigned int f, int f2) {\r
922         int n;\r
923         if (!(f2 & T1_3D_REFINE))       /*First refinement for this coefficient (no previous refinement)*/\r
924                 n = (f & (T1_3D_SIG_PRIM)) ? 1 : 0;\r
925         else\r
926                 n = 2;\r
927         \r
928         return (T1_3D_CTXNO_MAG + n);\r
929 }\r
930 \r
931 static int t1_3d_init_spb(unsigned int f) {\r
932         int hc, vc, cc;\r
933         int n = 0;\r
934         \r
935         hc = int_min( ( (f & (T1_3D_SIG_E | T1_3D_SGN_E)) == T1_3D_SIG_E ) \r
936                                         + ( (f & (T1_3D_SIG_W | T1_3D_SGN_W)) == T1_3D_SIG_W ) , 1) \r
937                 - int_min( ( (f & (T1_3D_SIG_E | T1_3D_SGN_E)) == (T1_3D_SIG_E | T1_3D_SGN_E) ) \r
938                                         + ( (f & (T1_3D_SIG_W | T1_3D_SGN_W) ) == (T1_3D_SIG_W | T1_3D_SGN_W)), 1);\r
939         \r
940         vc = int_min(((f & (T1_3D_SIG_N | T1_3D_SGN_N)) == T1_3D_SIG_N) \r
941                                         + ((f & (T1_3D_SIG_S | T1_3D_SGN_S)) == T1_3D_SIG_S), 1) \r
942                 - int_min(((f & (T1_3D_SIG_N | T1_3D_SGN_N)) == (T1_3D_SIG_N | T1_3D_SGN_N)) \r
943                                         + ((f & (T1_3D_SIG_S | T1_3D_SGN_S)) == (T1_3D_SIG_S | T1_3D_SGN_S)), 1);\r
944         \r
945         cc = int_min(((f & (T1_3D_SIG_FC | T1_3D_SGN_F)) == T1_3D_SIG_FC) \r
946                                         + ((f & (T1_3D_SIG_BC | T1_3D_SGN_B)) == T1_3D_SIG_BC), 1) \r
947                 - int_min(((f & (T1_3D_SIG_FC | T1_3D_SGN_F)) == (T1_3D_SIG_FC | T1_3D_SGN_F)) \r
948                                         + ((f & (T1_3D_SIG_BC | T1_3D_SGN_B)) == (T1_3D_SIG_BC | T1_3D_SGN_B)), 1);\r
949         \r
950         n = ((hc + vc + cc) < 0); \r
951         \r
952         return n;\r
953 }\r
954 \r
955 static void t1_3d_init_luts(opj_t1_3d_t *t1) {\r
956         int i;\r
957         double u, v, t;\r
958         /*for (j = 0; j < 4; j++) {\r
959                 for (i = 0; i < 256; ++i) {\r
960                         t1->lut_ctxno_zc[(j << 8) | i] = t1_3d_init_ctxno_zc(i, j);\r
961                 }\r
962         }\r
963         for (i = 0; i < 4096; i++) {\r
964                 t1->lut_ctxno_sc[i] = t1_3d_init_ctxno_sc(i << 4);\r
965         }\r
966         for (j = 0; j < 2; j++) {\r
967                 for (i = 0; i < 2048; ++i) {\r
968                         t1->lut_ctxno_mag[(j << 11) + i] = t1_3d_init_ctxno_mag((j ? T1_3D_REFINE : 0) | i);\r
969                 }\r
970         }\r
971         for (i = 0; i < 4096; ++i) {\r
972                 t1->lut_spb[i] = t1_3d_init_spb(i << 4);\r
973         }*/\r
974         /* FIXME FIXME FIXME */\r
975         for (i = 0; i < (1 << T1_NMSEDEC_BITS); i++) {\r
976                 t = i / pow(2, T1_NMSEDEC_FRACBITS);\r
977                 u = t;\r
978                 v = t - 1.5;\r
979                 t1->lut_nmsedec_sig[i] = \r
980                         int_max(0, \r
981                         (int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));\r
982                 t1->lut_nmsedec_sig0[i] =\r
983                         int_max(0,\r
984                         (int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));\r
985                 u = t - 1.0;\r
986                 if (i & (1 << (T1_NMSEDEC_BITS - 1))) {\r
987                         v = t - 1.5;\r
988                 } else {\r
989                         v = t - 0.5;\r
990                 }\r
991                 t1->lut_nmsedec_ref[i] =\r
992                         int_max(0,\r
993                         (int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));\r
994                 t1->lut_nmsedec_ref0[i] =\r
995                         int_max(0,\r
996                         (int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));\r
997         }\r
998 }\r
999 \r
1000 /* ----------------------------------------------------------------------- */\r
1001 \r
1002 opj_t1_3d_t* t1_3d_create(opj_common_ptr cinfo) {\r
1003         opj_t1_3d_t *t1 = (opj_t1_3d_t*)opj_malloc(sizeof(opj_t1_3d_t));\r
1004         if(t1) {\r
1005                 t1->cinfo = cinfo;\r
1006                 /* create MQC and RAW handles */\r
1007                 t1->mqc = mqc_create();\r
1008                 t1->raw = raw_create();\r
1009                 /* initialize the look-up tables of the Tier-1 coder/decoder */\r
1010                 t1_3d_init_luts(t1);\r
1011         }\r
1012         return t1;\r
1013 }\r
1014 \r
1015 void t1_3d_destroy(opj_t1_3d_t *t1) {\r
1016         if(t1) {\r
1017                 /* destroy MQC and RAW handles */\r
1018                 mqc_destroy(t1->mqc);\r
1019                 raw_destroy(t1->raw);\r
1020                 opj_free(t1);\r
1021         }\r
1022 }\r
1023 \r
1024 void t1_3d_encode_cblks(opj_t1_3d_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp) {\r
1025         int compno, resno, bandno, precno, cblkno;\r
1026         int x, y, z, i, j, k, orient;\r
1027         int level[3];\r
1028         tile->distotile = 0;            /* fixed_quality */\r
1029 \r
1030         for (compno = 0; compno < tile->numcomps; compno++) {\r
1031                 opj_tcd_tilecomp_t *tilec = &tile->comps[compno];\r
1032 \r
1033                 for (resno = 0; resno < tilec->numresolution[0]; resno++) {\r
1034                         opj_tcd_resolution_t *res = &tilec->resolutions[resno];\r
1035 \r
1036                         for (bandno = 0; bandno < res->numbands; bandno++) {\r
1037                                 opj_tcd_band_t *band = &res->bands[bandno];\r
1038 \r
1039                                 for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2]; precno++) {\r
1040                                         opj_tcd_precinct_t *prc = &band->precincts[precno];\r
1041 \r
1042                                         for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; cblkno++) {\r
1043                                                 opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];\r
1044 \r
1045                                                 if (band->bandno == 0) {\r
1046                                                         x = cblk->x0 - band->x0;\r
1047                                                         y = cblk->y0 - band->y0;\r
1048                                                         z = cblk->z0 - band->z0;\r
1049                                                 } else if (band->bandno == 1) {\r
1050                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1051                                                         x = pres->x1 - pres->x0 + cblk->x0 - band->x0;\r
1052                                                         y = cblk->y0 - band->y0;\r
1053                                                         z = cblk->z0 - band->z0;\r
1054                                                 } else if (band->bandno == 2) {\r
1055                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1056                                                         x = cblk->x0 - band->x0;\r
1057                                                         y = pres->y1 - pres->y0 + cblk->y0 - band->y0;\r
1058                                                         z = cblk->z0 - band->z0;\r
1059                                                 } else if (band->bandno == 3) {         \r
1060                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1061                                                         x = pres->x1 - pres->x0 + cblk->x0 - band->x0;\r
1062                                                         y = pres->y1 - pres->y0 + cblk->y0 - band->y0;\r
1063                                                         z = cblk->z0 - band->z0;\r
1064                                                 } else if (band->bandno == 4) {\r
1065                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1066                                                         x = cblk->x0 - band->x0;\r
1067                                                         y = cblk->y0 - band->y0;\r
1068                                                         z = pres->z1 - pres->z0 + cblk->z0 - band->z0;\r
1069                                                 } else if (band->bandno == 5) {\r
1070                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1071                                                         x = pres->x1 - pres->x0 + cblk->x0 - band->x0;\r
1072                                                         y = cblk->y0 - band->y0;\r
1073                                                         z = pres->z1 - pres->z0 + cblk->z0 - band->z0;\r
1074                                                 } else if (band->bandno == 6) {\r
1075                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1076                                                         x = cblk->x0 - band->x0;\r
1077                                                         y = pres->y1 - pres->y0 + cblk->y0 - band->y0;\r
1078                                                         z = pres->z1 - pres->z0 + cblk->z0 - band->z0;\r
1079                                                 } else if (band->bandno == 7) {         \r
1080                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1081                                                         x = pres->x1 - pres->x0 + cblk->x0 - band->x0;\r
1082                                                         y = pres->y1 - pres->y0 + cblk->y0 - band->y0;\r
1083                                                         z = pres->z1 - pres->z0 + cblk->z0 - band->z0;\r
1084                                                 }\r
1085 \r
1086                                                 if (tcp->tccps[compno].reversible == 1) {\r
1087                                                         for (k = 0; k < cblk->z1 - cblk->z0; k++) {\r
1088                                                                 for (j = 0; j < cblk->y1 - cblk->y0; j++) {\r
1089                                     for (i = 0; i < cblk->x1 - cblk->x0; i++) {\r
1090                                         t1->data[k][j][i] = \r
1091                                                                                 tilec->data[(x + i) + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] << T1_NMSEDEC_FRACBITS;\r
1092                                                                         }\r
1093                                                                 }\r
1094                                                         }\r
1095                                                 } else if (tcp->tccps[compno].reversible == 0) {\r
1096                                                         for (k = 0; k < cblk->z1 - cblk->z0; k++) {\r
1097                                                                 for (j = 0; j < cblk->y1 - cblk->y0; j++) {\r
1098                                     for (i = 0; i < cblk->x1 - cblk->x0; i++) {\r
1099                                         t1->data[k][j][i] = fix_mul(\r
1100                                                                                 tilec->data[(x + i) + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)],\r
1101                                                                                 8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (13 - T1_NMSEDEC_FRACBITS);\r
1102                                                                         }\r
1103                                                                 }\r
1104                                                         }\r
1105                                                 }\r
1106                                                 orient = band->bandno;  /* FIXME */\r
1107                                                 for (i = 0; i < 3; i++) \r
1108                                                         level[i] = tilec->numresolution[i] - 1 - resno;\r
1109 \r
1110                                                 t1_3d_encode_cblk(t1, cblk, orient, compno, level, tcp->tccps[compno].dwtid, band->stepsize, tcp->tccps[compno].cblksty, tile->numcomps, tile);\r
1111                                                         \r
1112                                         } /* cblkno */\r
1113                                 } /* precno */\r
1114                         } /* bandno */\r
1115                 } /* resno  */\r
1116         } /* compno  */\r
1117 }\r
1118 \r
1119 void t1_3d_decode_cblks(opj_t1_3d_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp) {\r
1120         int compno, resno, bandno, precno, cblkno;\r
1121         \r
1122         for (compno = 0; compno < tile->numcomps; compno++) {\r
1123                 opj_tcd_tilecomp_t *tilec = &tile->comps[compno];\r
1124 \r
1125                 for (resno = 0; resno < tilec->numresolution[0]; resno++) {\r
1126                         opj_tcd_resolution_t *res = &tilec->resolutions[resno];\r
1127 \r
1128                         for (bandno = 0; bandno < res->numbands; bandno++) {\r
1129                                 opj_tcd_band_t *band = &res->bands[bandno];\r
1130 \r
1131                                 for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2]; precno++) {\r
1132                                         opj_tcd_precinct_t *prc = &band->precincts[precno];\r
1133 \r
1134                                         for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; cblkno++) {\r
1135                                                 int x, y, z, i, j, k, orient;\r
1136                                                 opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];\r
1137 \r
1138                                                 orient = band->bandno;  /* FIXME */\r
1139 \r
1140                                                 /*fprintf(stdout,"[INFO] t1_3d_decode_cblk(t1, cblk, orient(%d), tcp->tccps[compno].roishift (%d), tcp->tccps[compno].cblksty (%d));\n",orient,tcp->tccps[compno].roishift, tcp->tccps[compno].cblksty);*/\r
1141                                                 t1_3d_decode_cblk(t1, cblk, orient, tcp->tccps[compno].roishift, tcp->tccps[compno].cblksty);\r
1142 \r
1143                                                 if (band->bandno == 0) {\r
1144                                                         x = cblk->x0 - band->x0;\r
1145                                                         y = cblk->y0 - band->y0;\r
1146                                                         z = cblk->z0 - band->z0;\r
1147                                                 } else if (band->bandno == 1) {\r
1148                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1149                                                         x = pres->x1 - pres->x0 + cblk->x0 - band->x0;\r
1150                                                         y = cblk->y0 - band->y0;\r
1151                                                         z = cblk->z0 - band->z0;\r
1152                                                 } else if (band->bandno == 2) {\r
1153                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1154                                                         x = cblk->x0 - band->x0;\r
1155                                                         y = pres->y1 - pres->y0 + cblk->y0 - band->y0;\r
1156                                                         z = cblk->z0 - band->z0;\r
1157                                                 } else if (band->bandno == 3) {         \r
1158                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1159                                                         x = pres->x1 - pres->x0 + cblk->x0 - band->x0;\r
1160                                                         y = pres->y1 - pres->y0 + cblk->y0 - band->y0;\r
1161                                                         z = cblk->z0 - band->z0;\r
1162                                                 } else if (band->bandno == 4) {\r
1163                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1164                                                         x = cblk->x0 - band->x0;\r
1165                                                         y = cblk->y0 - band->y0;\r
1166                                                         z = pres->z1 - pres->z0 + cblk->z0 - band->z0;\r
1167                                                 } else if (band->bandno == 5) {\r
1168                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1169                                                         x = pres->x1 - pres->x0 + cblk->x0 - band->x0;\r
1170                                                         y = cblk->y0 - band->y0;\r
1171                                                         z = pres->z1 - pres->z0 + cblk->z0 - band->z0;\r
1172                                                 } else if (band->bandno == 6) {\r
1173                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1174                                                         x = cblk->x0 - band->x0;\r
1175                                                         y = pres->y1 - pres->y0 + cblk->y0 - band->y0;\r
1176                                                         z = pres->z1 - pres->z0 + cblk->z0 - band->z0;\r
1177                                                 } else if (band->bandno == 7) {         \r
1178                                                         opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
1179                                                         x = pres->x1 - pres->x0 + cblk->x0 - band->x0;\r
1180                                                         y = pres->y1 - pres->y0 + cblk->y0 - band->y0;\r
1181                                                         z = pres->z1 - pres->z0 + cblk->z0 - band->z0;\r
1182                                                 }\r
1183                                         \r
1184                                                 if (tcp->tccps[compno].roishift) {\r
1185                                                         int thresh, val, mag;\r
1186                                                         thresh = 1 << tcp->tccps[compno].roishift;\r
1187                                                         for (k = 0; k < cblk->z1 - cblk->z0; k++) {\r
1188                                                                 for (j = 0; j < cblk->y1 - cblk->y0; j++) {\r
1189                                                                         for (i = 0; i < cblk->x1 - cblk->x0; i++) {\r
1190                                                                                 val = t1->data[k][j][i];\r
1191                                                                                 mag = int_abs(val);\r
1192                                                                                 if (mag >= thresh) {\r
1193                                                                                         mag >>= tcp->tccps[compno].roishift;\r
1194                                                                                         t1->data[k][j][i] = val < 0 ? -mag : mag;\r
1195                                                                                 }\r
1196                                                                         }\r
1197                                                                 }\r
1198                                                         }\r
1199                                                 }\r
1200                                                 \r
1201                                                 if (tcp->tccps[compno].reversible == 1) {\r
1202                                                         for (k = 0; k < cblk->z1 - cblk->z0; k++) {\r
1203                                                                 for (j = 0; j < cblk->y1 - cblk->y0; j++) {\r
1204                                                                         for (i = 0; i < cblk->x1 - cblk->x0; i++) {\r
1205                                                                                 int tmp = t1->data[k][j][i];\r
1206                                                                                 tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = tmp/2;\r
1207                                                                         }\r
1208                                                                 }\r
1209                                                         }\r
1210                                                 } else {                /* if (tcp->tccps[compno].reversible == 0) */\r
1211                                                         for (k = 0; k < cblk->z1 - cblk->z0; k++) {\r
1212                                                                 for (j = 0; j < cblk->y1 - cblk->y0; j++) {\r
1213                                                                         for (i = 0; i < cblk->x1 - cblk->x0; i++) {\r
1214                                                                                 double tmp = (double)(t1->data[k][j][i] * band->stepsize * 4096.0);\r
1215                                                                                 if (t1->data[k][j][i] >> 1 == 0) {\r
1216                                                                                         tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = 0;\r
1217                                                                                 } else {\r
1218                                                                                         int tmp2 = ((int) (floor(fabs(tmp)))) + ((int) floor(fabs(tmp*2))%2);\r
1219                                                                                         tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = ((tmp<0)?-tmp2:tmp2);\r
1220                                                                                 }\r
1221                                                                         }\r
1222                                                                 }\r
1223                                                         }\r
1224                                                 }\r
1225                                         } /* cblkno */\r
1226                                 } /* precno */\r
1227                         } /* bandno */\r
1228                 } /* resno */\r
1229         } /* compno */\r
1230 }\r