Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4758 | right-hear | 1 | /* |
2 | * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium |
||
3 | * Copyright (c) 2002-2007, Professor Benoit Macq |
||
4 | * Copyright (c) 2001-2003, David Janssens |
||
5 | * Copyright (c) 2002-2003, Yannick Verschueren |
||
6 | * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe |
||
7 | * Copyright (c) 2005, Herve Drolon, FreeImage Team |
||
8 | * Copyright (c) 2006-2007, Parvatha Elangovan |
||
9 | * All rights reserved. |
||
10 | * |
||
11 | * Redistribution and use in source and binary forms, with or without |
||
12 | * modification, are permitted provided that the following conditions |
||
13 | * are met: |
||
14 | * 1. Redistributions of source code must retain the above copyright |
||
15 | * notice, this list of conditions and the following disclaimer. |
||
16 | * 2. Redistributions in binary form must reproduce the above copyright |
||
17 | * notice, this list of conditions and the following disclaimer in the |
||
18 | * documentation and/or other materials provided with the distribution. |
||
19 | * |
||
20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' |
||
21 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||
22 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||
23 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
||
24 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||
25 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||
26 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||
27 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||
28 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
||
29 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||
30 | * POSSIBILITY OF SUCH DAMAGE. |
||
31 | */ |
||
32 | |||
33 | #include "opj_includes.h" |
||
34 | |||
35 | /** @defgroup PI PI - Implementation of a packet iterator */ |
||
36 | /*@{*/ |
||
37 | |||
38 | /** @name Local static functions */ |
||
39 | /*@{*/ |
||
40 | |||
41 | /** |
||
42 | Get next packet in layer-resolution-component-precinct order. |
||
43 | @param pi packet iterator to modify |
||
44 | @return returns false if pi pointed to the last packet or else returns true |
||
45 | */ |
||
46 | static bool pi_next_lrcp(opj_pi_iterator_t * pi); |
||
47 | /** |
||
48 | Get next packet in resolution-layer-component-precinct order. |
||
49 | @param pi packet iterator to modify |
||
50 | @return returns false if pi pointed to the last packet or else returns true |
||
51 | */ |
||
52 | static bool pi_next_rlcp(opj_pi_iterator_t * pi); |
||
53 | /** |
||
54 | Get next packet in resolution-precinct-component-layer order. |
||
55 | @param pi packet iterator to modify |
||
56 | @return returns false if pi pointed to the last packet or else returns true |
||
57 | */ |
||
58 | static bool pi_next_rpcl(opj_pi_iterator_t * pi); |
||
59 | /** |
||
60 | Get next packet in precinct-component-resolution-layer order. |
||
61 | @param pi packet iterator to modify |
||
62 | @return returns false if pi pointed to the last packet or else returns true |
||
63 | */ |
||
64 | static bool pi_next_pcrl(opj_pi_iterator_t * pi); |
||
65 | /** |
||
66 | Get next packet in component-precinct-resolution-layer order. |
||
67 | @param pi packet iterator to modify |
||
68 | @return returns false if pi pointed to the last packet or else returns true |
||
69 | */ |
||
70 | static bool pi_next_cprl(opj_pi_iterator_t * pi); |
||
71 | |||
72 | /*@}*/ |
||
73 | |||
74 | /*@}*/ |
||
75 | |||
76 | /* |
||
77 | ========================================================== |
||
78 | local functions |
||
79 | ========================================================== |
||
80 | */ |
||
81 | |||
82 | static bool pi_next_lrcp(opj_pi_iterator_t * pi) { |
||
83 | opj_pi_comp_t *comp = NULL; |
||
84 | opj_pi_resolution_t *res = NULL; |
||
85 | long index = 0; |
||
86 | |||
87 | if (!pi->first) { |
||
88 | comp = &pi->comps[pi->compno]; |
||
89 | res = &comp->resolutions[pi->resno]; |
||
90 | goto LABEL_SKIP; |
||
91 | } else { |
||
92 | pi->first = 0; |
||
93 | } |
||
94 | |||
95 | for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { |
||
96 | for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; |
||
97 | pi->resno++) { |
||
98 | for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { |
||
99 | comp = &pi->comps[pi->compno]; |
||
100 | if (pi->resno >= comp->numresolutions) { |
||
101 | continue; |
||
102 | } |
||
103 | res = &comp->resolutions[pi->resno]; |
||
104 | if (!pi->tp_on){ |
||
105 | pi->poc.precno1 = res->pw * res->ph; |
||
106 | } |
||
107 | for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { |
||
108 | index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; |
||
109 | if (!pi->include[index]) { |
||
110 | pi->include[index] = 1; |
||
111 | return true; |
||
112 | } |
||
113 | LABEL_SKIP:; |
||
114 | } |
||
115 | } |
||
116 | } |
||
117 | } |
||
118 | |||
119 | return false; |
||
120 | } |
||
121 | |||
122 | static bool pi_next_rlcp(opj_pi_iterator_t * pi) { |
||
123 | opj_pi_comp_t *comp = NULL; |
||
124 | opj_pi_resolution_t *res = NULL; |
||
125 | long index = 0; |
||
126 | |||
127 | if (!pi->first) { |
||
128 | comp = &pi->comps[pi->compno]; |
||
129 | res = &comp->resolutions[pi->resno]; |
||
130 | goto LABEL_SKIP; |
||
131 | } else { |
||
132 | pi->first = 0; |
||
133 | } |
||
134 | |||
135 | for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { |
||
136 | for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { |
||
137 | for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { |
||
138 | comp = &pi->comps[pi->compno]; |
||
139 | if (pi->resno >= comp->numresolutions) { |
||
140 | continue; |
||
141 | } |
||
142 | res = &comp->resolutions[pi->resno]; |
||
143 | if(!pi->tp_on){ |
||
144 | pi->poc.precno1 = res->pw * res->ph; |
||
145 | } |
||
146 | for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { |
||
147 | index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; |
||
148 | if (!pi->include[index]) { |
||
149 | pi->include[index] = 1; |
||
150 | return true; |
||
151 | } |
||
152 | LABEL_SKIP:; |
||
153 | } |
||
154 | } |
||
155 | } |
||
156 | } |
||
157 | |||
158 | return false; |
||
159 | } |
||
160 | |||
161 | static bool pi_next_rpcl(opj_pi_iterator_t * pi) { |
||
162 | opj_pi_comp_t *comp = NULL; |
||
163 | opj_pi_resolution_t *res = NULL; |
||
164 | long index = 0; |
||
165 | |||
166 | if (!pi->first) { |
||
167 | goto LABEL_SKIP; |
||
168 | } else { |
||
169 | int compno, resno; |
||
170 | pi->first = 0; |
||
171 | pi->dx = 0; |
||
172 | pi->dy = 0; |
||
173 | for (compno = 0; compno < pi->numcomps; compno++) { |
||
174 | comp = &pi->comps[compno]; |
||
175 | for (resno = 0; resno < comp->numresolutions; resno++) { |
||
176 | int dx, dy; |
||
177 | res = &comp->resolutions[resno]; |
||
178 | dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); |
||
179 | dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); |
||
180 | pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); |
||
181 | pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); |
||
182 | } |
||
183 | } |
||
184 | } |
||
185 | if (!pi->tp_on){ |
||
186 | pi->poc.ty0 = pi->ty0; |
||
187 | pi->poc.tx0 = pi->tx0; |
||
188 | pi->poc.ty1 = pi->ty1; |
||
189 | pi->poc.tx1 = pi->tx1; |
||
190 | } |
||
191 | for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { |
||
192 | for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { |
||
193 | for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { |
||
194 | for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { |
||
195 | int levelno; |
||
196 | int trx0, try0; |
||
197 | int trx1, try1; |
||
198 | int rpx, rpy; |
||
199 | int prci, prcj; |
||
200 | comp = &pi->comps[pi->compno]; |
||
201 | if (pi->resno >= comp->numresolutions) { |
||
202 | continue; |
||
203 | } |
||
204 | res = &comp->resolutions[pi->resno]; |
||
205 | levelno = comp->numresolutions - 1 - pi->resno; |
||
206 | trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); |
||
207 | try0 = int_ceildiv(pi->ty0, comp->dy << levelno); |
||
208 | trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); |
||
209 | try1 = int_ceildiv(pi->ty1, comp->dy << levelno); |
||
210 | rpx = res->pdx + levelno; |
||
211 | rpy = res->pdy + levelno; |
||
212 | if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){ |
||
213 | continue; |
||
214 | } |
||
215 | if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ |
||
216 | continue; |
||
217 | } |
||
218 | |||
219 | if ((res->pw==0)||(res->ph==0)) continue; |
||
220 | |||
221 | if ((trx0==trx1)||(try0==try1)) continue; |
||
222 | |||
223 | prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) |
||
224 | - int_floordivpow2(trx0, res->pdx); |
||
225 | prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) |
||
226 | - int_floordivpow2(try0, res->pdy); |
||
227 | pi->precno = prci + prcj * res->pw; |
||
228 | for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { |
||
229 | index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; |
||
230 | if (!pi->include[index]) { |
||
231 | pi->include[index] = 1; |
||
232 | return true; |
||
233 | } |
||
234 | LABEL_SKIP:; |
||
235 | } |
||
236 | } |
||
237 | } |
||
238 | } |
||
239 | } |
||
240 | |||
241 | return false; |
||
242 | } |
||
243 | |||
244 | static bool pi_next_pcrl(opj_pi_iterator_t * pi) { |
||
245 | opj_pi_comp_t *comp = NULL; |
||
246 | opj_pi_resolution_t *res = NULL; |
||
247 | long index = 0; |
||
248 | |||
249 | if (!pi->first) { |
||
250 | comp = &pi->comps[pi->compno]; |
||
251 | goto LABEL_SKIP; |
||
252 | } else { |
||
253 | int compno, resno; |
||
254 | pi->first = 0; |
||
255 | pi->dx = 0; |
||
256 | pi->dy = 0; |
||
257 | for (compno = 0; compno < pi->numcomps; compno++) { |
||
258 | comp = &pi->comps[compno]; |
||
259 | for (resno = 0; resno < comp->numresolutions; resno++) { |
||
260 | int dx, dy; |
||
261 | res = &comp->resolutions[resno]; |
||
262 | dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); |
||
263 | dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); |
||
264 | pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); |
||
265 | pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); |
||
266 | } |
||
267 | } |
||
268 | } |
||
269 | if (!pi->tp_on){ |
||
270 | pi->poc.ty0 = pi->ty0; |
||
271 | pi->poc.tx0 = pi->tx0; |
||
272 | pi->poc.ty1 = pi->ty1; |
||
273 | pi->poc.tx1 = pi->tx1; |
||
274 | } |
||
275 | for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { |
||
276 | for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { |
||
277 | for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { |
||
278 | comp = &pi->comps[pi->compno]; |
||
279 | for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { |
||
280 | int levelno; |
||
281 | int trx0, try0; |
||
282 | int trx1, try1; |
||
283 | int rpx, rpy; |
||
284 | int prci, prcj; |
||
285 | res = &comp->resolutions[pi->resno]; |
||
286 | levelno = comp->numresolutions - 1 - pi->resno; |
||
287 | trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); |
||
288 | try0 = int_ceildiv(pi->ty0, comp->dy << levelno); |
||
289 | trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); |
||
290 | try1 = int_ceildiv(pi->ty1, comp->dy << levelno); |
||
291 | rpx = res->pdx + levelno; |
||
292 | rpy = res->pdy + levelno; |
||
293 | if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){ |
||
294 | continue; |
||
295 | } |
||
296 | if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ |
||
297 | continue; |
||
298 | } |
||
299 | |||
300 | if ((res->pw==0)||(res->ph==0)) continue; |
||
301 | |||
302 | if ((trx0==trx1)||(try0==try1)) continue; |
||
303 | |||
304 | prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) |
||
305 | - int_floordivpow2(trx0, res->pdx); |
||
306 | prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) |
||
307 | - int_floordivpow2(try0, res->pdy); |
||
308 | pi->precno = prci + prcj * res->pw; |
||
309 | for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { |
||
310 | index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; |
||
311 | if (!pi->include[index]) { |
||
312 | pi->include[index] = 1; |
||
313 | return true; |
||
314 | } |
||
315 | LABEL_SKIP:; |
||
316 | } |
||
317 | } |
||
318 | } |
||
319 | } |
||
320 | } |
||
321 | |||
322 | return false; |
||
323 | } |
||
324 | |||
325 | static bool pi_next_cprl(opj_pi_iterator_t * pi) { |
||
326 | opj_pi_comp_t *comp = NULL; |
||
327 | opj_pi_resolution_t *res = NULL; |
||
328 | long index = 0; |
||
329 | |||
330 | if (!pi->first) { |
||
331 | comp = &pi->comps[pi->compno]; |
||
332 | goto LABEL_SKIP; |
||
333 | } else { |
||
334 | pi->first = 0; |
||
335 | } |
||
336 | |||
337 | for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { |
||
338 | int resno; |
||
339 | comp = &pi->comps[pi->compno]; |
||
340 | pi->dx = 0; |
||
341 | pi->dy = 0; |
||
342 | for (resno = 0; resno < comp->numresolutions; resno++) { |
||
343 | int dx, dy; |
||
344 | res = &comp->resolutions[resno]; |
||
345 | dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); |
||
346 | dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); |
||
347 | pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); |
||
348 | pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); |
||
349 | } |
||
350 | if (!pi->tp_on){ |
||
351 | pi->poc.ty0 = pi->ty0; |
||
352 | pi->poc.tx0 = pi->tx0; |
||
353 | pi->poc.ty1 = pi->ty1; |
||
354 | pi->poc.tx1 = pi->tx1; |
||
355 | } |
||
356 | for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { |
||
357 | for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { |
||
358 | for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { |
||
359 | int levelno; |
||
360 | int trx0, try0; |
||
361 | int trx1, try1; |
||
362 | int rpx, rpy; |
||
363 | int prci, prcj; |
||
364 | res = &comp->resolutions[pi->resno]; |
||
365 | levelno = comp->numresolutions - 1 - pi->resno; |
||
366 | trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); |
||
367 | try0 = int_ceildiv(pi->ty0, comp->dy << levelno); |
||
368 | trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); |
||
369 | try1 = int_ceildiv(pi->ty1, comp->dy << levelno); |
||
370 | rpx = res->pdx + levelno; |
||
371 | rpy = res->pdy + levelno; |
||
372 | if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){ |
||
373 | continue; |
||
374 | } |
||
375 | if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ |
||
376 | continue; |
||
377 | } |
||
378 | |||
379 | if ((res->pw==0)||(res->ph==0)) continue; |
||
380 | |||
381 | if ((trx0==trx1)||(try0==try1)) continue; |
||
382 | |||
383 | prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) |
||
384 | - int_floordivpow2(trx0, res->pdx); |
||
385 | prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) |
||
386 | - int_floordivpow2(try0, res->pdy); |
||
387 | pi->precno = prci + prcj * res->pw; |
||
388 | for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { |
||
389 | index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; |
||
390 | if (!pi->include[index]) { |
||
391 | pi->include[index] = 1; |
||
392 | return true; |
||
393 | } |
||
394 | LABEL_SKIP:; |
||
395 | } |
||
396 | } |
||
397 | } |
||
398 | } |
||
399 | } |
||
400 | |||
401 | return false; |
||
402 | } |
||
403 | |||
404 | /* |
||
405 | ========================================================== |
||
406 | Packet iterator interface |
||
407 | ========================================================== |
||
408 | */ |
||
409 | |||
410 | opj_pi_iterator_t *pi_create_decode(opj_image_t *image, opj_cp_t *cp, int tileno) { |
||
411 | int p, q; |
||
412 | int compno, resno, pino; |
||
413 | opj_pi_iterator_t *pi = NULL; |
||
414 | opj_tcp_t *tcp = NULL; |
||
415 | opj_tccp_t *tccp = NULL; |
||
416 | |||
417 | tcp = &cp->tcps[tileno]; |
||
418 | |||
419 | pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t)); |
||
420 | if(!pi) { |
||
421 | /* TODO: throw an error */ |
||
422 | return NULL; |
||
423 | } |
||
424 | |||
425 | for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */ |
||
426 | int maxres = 0; |
||
427 | int maxprec = 0; |
||
428 | p = tileno % cp->tw; |
||
429 | q = tileno / cp->tw; |
||
430 | |||
431 | pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); |
||
432 | pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); |
||
433 | pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); |
||
434 | pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); |
||
435 | pi[pino].numcomps = image->numcomps; |
||
436 | |||
437 | pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t)); |
||
438 | if(!pi[pino].comps) { |
||
439 | /* TODO: throw an error */ |
||
440 | pi_destroy(pi, cp, tileno); |
||
441 | return NULL; |
||
442 | } |
||
443 | |||
444 | for (compno = 0; compno < pi->numcomps; compno++) { |
||
445 | int tcx0, tcy0, tcx1, tcy1; |
||
446 | opj_pi_comp_t *comp = &pi[pino].comps[compno]; |
||
447 | tccp = &tcp->tccps[compno]; |
||
448 | comp->dx = image->comps[compno].dx; |
||
449 | comp->dy = image->comps[compno].dy; |
||
450 | comp->numresolutions = tccp->numresolutions; |
||
451 | |||
452 | comp->resolutions = (opj_pi_resolution_t*) opj_calloc(comp->numresolutions, sizeof(opj_pi_resolution_t)); |
||
453 | if(!comp->resolutions) { |
||
454 | /* TODO: throw an error */ |
||
455 | pi_destroy(pi, cp, tileno); |
||
456 | return NULL; |
||
457 | } |
||
458 | |||
459 | tcx0 = int_ceildiv(pi->tx0, comp->dx); |
||
460 | tcy0 = int_ceildiv(pi->ty0, comp->dy); |
||
461 | tcx1 = int_ceildiv(pi->tx1, comp->dx); |
||
462 | tcy1 = int_ceildiv(pi->ty1, comp->dy); |
||
463 | if (comp->numresolutions > maxres) { |
||
464 | maxres = comp->numresolutions; |
||
465 | } |
||
466 | |||
467 | for (resno = 0; resno < comp->numresolutions; resno++) { |
||
468 | int levelno; |
||
469 | int rx0, ry0, rx1, ry1; |
||
470 | int px0, py0, px1, py1; |
||
471 | opj_pi_resolution_t *res = &comp->resolutions[resno]; |
||
472 | if (tccp->csty & J2K_CCP_CSTY_PRT) { |
||
473 | res->pdx = tccp->prcw[resno]; |
||
474 | res->pdy = tccp->prch[resno]; |
||
475 | } else { |
||
476 | res->pdx = 15; |
||
477 | res->pdy = 15; |
||
478 | } |
||
479 | levelno = comp->numresolutions - 1 - resno; |
||
480 | rx0 = int_ceildivpow2(tcx0, levelno); |
||
481 | ry0 = int_ceildivpow2(tcy0, levelno); |
||
482 | rx1 = int_ceildivpow2(tcx1, levelno); |
||
483 | ry1 = int_ceildivpow2(tcy1, levelno); |
||
484 | px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; |
||
485 | py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; |
||
486 | px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; |
||
487 | py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; |
||
488 | res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); |
||
489 | res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); |
||
490 | |||
491 | if (res->pw*res->ph > maxprec) { |
||
492 | maxprec = res->pw*res->ph; |
||
493 | } |
||
494 | |||
495 | } |
||
496 | } |
||
497 | |||
498 | tccp = &tcp->tccps[0]; |
||
499 | pi[pino].step_p = 1; |
||
500 | pi[pino].step_c = maxprec * pi[pino].step_p; |
||
501 | pi[pino].step_r = image->numcomps * pi[pino].step_c; |
||
502 | pi[pino].step_l = maxres * pi[pino].step_r; |
||
503 | |||
504 | if (pino == 0) { |
||
505 | pi[pino].include = (short int*) opj_calloc(image->numcomps * maxres * tcp->numlayers * maxprec, sizeof(short int)); |
||
506 | if(!pi[pino].include) { |
||
507 | /* TODO: throw an error */ |
||
508 | pi_destroy(pi, cp, tileno); |
||
509 | return NULL; |
||
510 | } |
||
511 | } |
||
512 | else { |
||
513 | pi[pino].include = pi[pino - 1].include; |
||
514 | } |
||
515 | |||
516 | if (tcp->POC == 0) { |
||
517 | pi[pino].first = 1; |
||
518 | pi[pino].poc.resno0 = 0; |
||
519 | pi[pino].poc.compno0 = 0; |
||
520 | pi[pino].poc.layno1 = tcp->numlayers; |
||
521 | pi[pino].poc.resno1 = maxres; |
||
522 | pi[pino].poc.compno1 = image->numcomps; |
||
523 | pi[pino].poc.prg = tcp->prg; |
||
524 | } else { |
||
525 | pi[pino].first = 1; |
||
526 | pi[pino].poc.resno0 = tcp->pocs[pino].resno0; |
||
527 | pi[pino].poc.compno0 = tcp->pocs[pino].compno0; |
||
528 | pi[pino].poc.layno1 = tcp->pocs[pino].layno1; |
||
529 | pi[pino].poc.resno1 = tcp->pocs[pino].resno1; |
||
530 | pi[pino].poc.compno1 = tcp->pocs[pino].compno1; |
||
531 | pi[pino].poc.prg = tcp->pocs[pino].prg; |
||
532 | } |
||
533 | pi[pino].poc.layno0 = 0; |
||
534 | pi[pino].poc.precno0 = 0; |
||
535 | pi[pino].poc.precno1 = maxprec; |
||
536 | |||
537 | } |
||
538 | |||
539 | return pi; |
||
540 | } |
||
541 | |||
542 | |||
543 | opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno, J2K_T2_MODE t2_mode){ |
||
544 | int p, q, pino; |
||
545 | int compno, resno; |
||
546 | int maxres = 0; |
||
547 | int maxprec = 0; |
||
548 | opj_pi_iterator_t *pi = NULL; |
||
549 | opj_tcp_t *tcp = NULL; |
||
550 | opj_tccp_t *tccp = NULL; |
||
551 | |||
552 | tcp = &cp->tcps[tileno]; |
||
553 | |||
554 | pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t)); |
||
555 | if(!pi) { return NULL;} |
||
556 | pi->tp_on = cp->tp_on; |
||
557 | |||
558 | for(pino = 0;pino < tcp->numpocs+1 ; pino ++){ |
||
559 | p = tileno % cp->tw; |
||
560 | q = tileno / cp->tw; |
||
561 | |||
562 | pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); |
||
563 | pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); |
||
564 | pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); |
||
565 | pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); |
||
566 | pi[pino].numcomps = image->numcomps; |
||
567 | |||
568 | pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t)); |
||
569 | if(!pi[pino].comps) { |
||
570 | pi_destroy(pi, cp, tileno); |
||
571 | return NULL; |
||
572 | } |
||
573 | |||
574 | for (compno = 0; compno < pi[pino].numcomps; compno++) { |
||
575 | int tcx0, tcy0, tcx1, tcy1; |
||
576 | opj_pi_comp_t *comp = &pi[pino].comps[compno]; |
||
577 | tccp = &tcp->tccps[compno]; |
||
578 | comp->dx = image->comps[compno].dx; |
||
579 | comp->dy = image->comps[compno].dy; |
||
580 | comp->numresolutions = tccp->numresolutions; |
||
581 | |||
582 | comp->resolutions = (opj_pi_resolution_t*) opj_malloc(comp->numresolutions * sizeof(opj_pi_resolution_t)); |
||
583 | if(!comp->resolutions) { |
||
584 | pi_destroy(pi, cp, tileno); |
||
585 | return NULL; |
||
586 | } |
||
587 | |||
588 | tcx0 = int_ceildiv(pi[pino].tx0, comp->dx); |
||
589 | tcy0 = int_ceildiv(pi[pino].ty0, comp->dy); |
||
590 | tcx1 = int_ceildiv(pi[pino].tx1, comp->dx); |
||
591 | tcy1 = int_ceildiv(pi[pino].ty1, comp->dy); |
||
592 | if (comp->numresolutions > maxres) { |
||
593 | maxres = comp->numresolutions; |
||
594 | } |
||
595 | |||
596 | for (resno = 0; resno < comp->numresolutions; resno++) { |
||
597 | int levelno; |
||
598 | int rx0, ry0, rx1, ry1; |
||
599 | int px0, py0, px1, py1; |
||
600 | opj_pi_resolution_t *res = &comp->resolutions[resno]; |
||
601 | if (tccp->csty & J2K_CCP_CSTY_PRT) { |
||
602 | res->pdx = tccp->prcw[resno]; |
||
603 | res->pdy = tccp->prch[resno]; |
||
604 | } else { |
||
605 | res->pdx = 15; |
||
606 | res->pdy = 15; |
||
607 | } |
||
608 | levelno = comp->numresolutions - 1 - resno; |
||
609 | rx0 = int_ceildivpow2(tcx0, levelno); |
||
610 | ry0 = int_ceildivpow2(tcy0, levelno); |
||
611 | rx1 = int_ceildivpow2(tcx1, levelno); |
||
612 | ry1 = int_ceildivpow2(tcy1, levelno); |
||
613 | px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; |
||
614 | py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; |
||
615 | px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; |
||
616 | py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; |
||
617 | res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); |
||
618 | res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); |
||
619 | |||
620 | if (res->pw*res->ph > maxprec) { |
||
621 | maxprec = res->pw * res->ph; |
||
622 | } |
||
623 | } |
||
624 | } |
||
625 | |||
626 | tccp = &tcp->tccps[0]; |
||
627 | pi[pino].step_p = 1; |
||
628 | pi[pino].step_c = maxprec * pi[pino].step_p; |
||
629 | pi[pino].step_r = image->numcomps * pi[pino].step_c; |
||
630 | pi[pino].step_l = maxres * pi[pino].step_r; |
||
631 | |||
632 | for (compno = 0; compno < pi->numcomps; compno++) { |
||
633 | opj_pi_comp_t *comp = &pi->comps[compno]; |
||
634 | for (resno = 0; resno < comp->numresolutions; resno++) { |
||
635 | int dx, dy; |
||
636 | opj_pi_resolution_t *res = &comp->resolutions[resno]; |
||
637 | dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); |
||
638 | dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); |
||
639 | pi[pino].dx = !pi->dx ? dx : int_min(pi->dx, dx); |
||
640 | pi[pino].dy = !pi->dy ? dy : int_min(pi->dy, dy); |
||
641 | } |
||
642 | } |
||
643 | |||
644 | if (pino == 0) { |
||
645 | pi[pino].include = (short int*) opj_calloc(tcp->numlayers * pi[pino].step_l, sizeof(short int)); |
||
646 | if(!pi[pino].include) { |
||
647 | pi_destroy(pi, cp, tileno); |
||
648 | return NULL; |
||
649 | } |
||
650 | } |
||
651 | else { |
||
652 | pi[pino].include = pi[pino - 1].include; |
||
653 | } |
||
654 | |||
655 | /* Generation of boundaries for each prog flag*/ |
||
656 | if(tcp->POC && ( cp->cinema || ((!cp->cinema) && (t2_mode == FINAL_PASS)))){ |
||
657 | tcp->pocs[pino].compS= tcp->pocs[pino].compno0; |
||
658 | tcp->pocs[pino].compE= tcp->pocs[pino].compno1; |
||
659 | tcp->pocs[pino].resS = tcp->pocs[pino].resno0; |
||
660 | tcp->pocs[pino].resE = tcp->pocs[pino].resno1; |
||
661 | tcp->pocs[pino].layE = tcp->pocs[pino].layno1; |
||
662 | tcp->pocs[pino].prg = tcp->pocs[pino].prg1; |
||
663 | if (pino > 0) |
||
664 | tcp->pocs[pino].layS = (tcp->pocs[pino].layE > tcp->pocs[pino - 1].layE) ? tcp->pocs[pino - 1].layE : 0; |
||
665 | }else { |
||
666 | tcp->pocs[pino].compS= 0; |
||
667 | tcp->pocs[pino].compE= image->numcomps; |
||
668 | tcp->pocs[pino].resS = 0; |
||
669 | tcp->pocs[pino].resE = maxres; |
||
670 | tcp->pocs[pino].layS = 0; |
||
671 | tcp->pocs[pino].layE = tcp->numlayers; |
||
672 | tcp->pocs[pino].prg = tcp->prg; |
||
673 | } |
||
674 | tcp->pocs[pino].prcS = 0; |
||
675 | tcp->pocs[pino].prcE = maxprec;; |
||
676 | tcp->pocs[pino].txS = pi[pino].tx0; |
||
677 | tcp->pocs[pino].txE = pi[pino].tx1; |
||
678 | tcp->pocs[pino].tyS = pi[pino].ty0; |
||
679 | tcp->pocs[pino].tyE = pi[pino].ty1; |
||
680 | tcp->pocs[pino].dx = pi[pino].dx; |
||
681 | tcp->pocs[pino].dy = pi[pino].dy; |
||
682 | } |
||
683 | return pi; |
||
684 | } |
||
685 | |||
686 | |||
687 | |||
688 | void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) { |
||
689 | int compno, pino; |
||
690 | opj_tcp_t *tcp = &cp->tcps[tileno]; |
||
691 | if(pi) { |
||
692 | for (pino = 0; pino < tcp->numpocs + 1; pino++) { |
||
693 | if(pi[pino].comps) { |
||
694 | for (compno = 0; compno < pi->numcomps; compno++) { |
||
695 | opj_pi_comp_t *comp = &pi[pino].comps[compno]; |
||
696 | if(comp->resolutions) { |
||
697 | opj_free(comp->resolutions); |
||
698 | } |
||
699 | } |
||
700 | opj_free(pi[pino].comps); |
||
701 | } |
||
702 | } |
||
703 | if(pi->include) { |
||
704 | opj_free(pi->include); |
||
705 | } |
||
706 | opj_free(pi); |
||
707 | } |
||
708 | } |
||
709 | |||
710 | bool pi_next(opj_pi_iterator_t * pi) { |
||
711 | switch (pi->poc.prg) { |
||
712 | case LRCP: |
||
713 | return pi_next_lrcp(pi); |
||
714 | case RLCP: |
||
715 | return pi_next_rlcp(pi); |
||
716 | case RPCL: |
||
717 | return pi_next_rpcl(pi); |
||
718 | case PCRL: |
||
719 | return pi_next_pcrl(pi); |
||
720 | case CPRL: |
||
721 | return pi_next_cprl(pi); |
||
722 | case PROG_UNKNOWN: |
||
723 | return false; |
||
724 | } |
||
725 | |||
726 | return false; |
||
727 | } |
||
728 | |||
729 | bool pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp){ |
||
730 | char prog[4]; |
||
731 | int i; |
||
732 | int incr_top=1,resetX=0; |
||
733 | opj_tcp_t *tcps =&cp->tcps[tileno]; |
||
734 | opj_poc_t *tcp= &tcps->pocs[pino]; |
||
735 | |||
736 | pi[pino].first = 1; |
||
737 | pi[pino].poc.prg = tcp->prg; |
||
738 | |||
739 | switch(tcp->prg){ |
||
740 | case CPRL: strncpy(prog, "CPRL",4); |
||
741 | break; |
||
742 | case LRCP: strncpy(prog, "LRCP",4); |
||
743 | break; |
||
744 | case PCRL: strncpy(prog, "PCRL",4); |
||
745 | break; |
||
746 | case RLCP: strncpy(prog, "RLCP",4); |
||
747 | break; |
||
748 | case RPCL: strncpy(prog, "RPCL",4); |
||
749 | break; |
||
750 | case PROG_UNKNOWN: |
||
751 | return true; |
||
752 | } |
||
753 | |||
754 | if(!(cp->tp_on && ((!cp->cinema && (t2_mode == FINAL_PASS)) || cp->cinema))){ |
||
755 | pi[pino].poc.resno0 = tcp->resS; |
||
756 | pi[pino].poc.resno1 = tcp->resE; |
||
757 | pi[pino].poc.compno0 = tcp->compS; |
||
758 | pi[pino].poc.compno1 = tcp->compE; |
||
759 | pi[pino].poc.layno0 = tcp->layS; |
||
760 | pi[pino].poc.layno1 = tcp->layE; |
||
761 | pi[pino].poc.precno0 = tcp->prcS; |
||
762 | pi[pino].poc.precno1 = tcp->prcE; |
||
763 | pi[pino].poc.tx0 = tcp->txS; |
||
764 | pi[pino].poc.ty0 = tcp->tyS; |
||
765 | pi[pino].poc.tx1 = tcp->txE; |
||
766 | pi[pino].poc.ty1 = tcp->tyE; |
||
767 | }else { |
||
768 | if( tpnum < cur_totnum_tp){ |
||
769 | for(i=3;i>=0;i--){ |
||
770 | switch(prog[i]){ |
||
771 | case 'C': |
||
772 | if (i > tppos){ |
||
773 | pi[pino].poc.compno0 = tcp->compS; |
||
774 | pi[pino].poc.compno1 = tcp->compE; |
||
775 | }else{ |
||
776 | if (tpnum == 0){ |
||
777 | tcp->comp_t = tcp->compS; |
||
778 | pi[pino].poc.compno0 = tcp->comp_t; |
||
779 | pi[pino].poc.compno1 = tcp->comp_t+1; |
||
780 | tcp->comp_t+=1; |
||
781 | }else{ |
||
782 | if (incr_top == 1){ |
||
783 | if(tcp->comp_t ==tcp->compE){ |
||
784 | tcp->comp_t = tcp->compS; |
||
785 | pi[pino].poc.compno0 = tcp->comp_t; |
||
786 | pi[pino].poc.compno1 = tcp->comp_t+1; |
||
787 | tcp->comp_t+=1; |
||
788 | incr_top=1; |
||
789 | }else{ |
||
790 | pi[pino].poc.compno0 = tcp->comp_t; |
||
791 | pi[pino].poc.compno1 = tcp->comp_t+1; |
||
792 | tcp->comp_t+=1; |
||
793 | incr_top=0; |
||
794 | } |
||
795 | }else{ |
||
796 | pi[pino].poc.compno0 = tcp->comp_t-1; |
||
797 | pi[pino].poc.compno1 = tcp->comp_t; |
||
798 | } |
||
799 | } |
||
800 | } |
||
801 | break; |
||
802 | |||
803 | case 'R': |
||
804 | if (i > tppos){ |
||
805 | pi[pino].poc.resno0 = tcp->resS; |
||
806 | pi[pino].poc.resno1 = tcp->resE; |
||
807 | }else{ |
||
808 | if (tpnum == 0){ |
||
809 | tcp->res_t = tcp->resS; |
||
810 | pi[pino].poc.resno0 = tcp->res_t; |
||
811 | pi[pino].poc.resno1 = tcp->res_t+1; |
||
812 | tcp->res_t+=1; |
||
813 | }else{ |
||
814 | if (incr_top == 1){ |
||
815 | if(tcp->res_t==tcp->resE){ |
||
816 | tcp->res_t = tcp->resS; |
||
817 | pi[pino].poc.resno0 = tcp->res_t; |
||
818 | pi[pino].poc.resno1 = tcp->res_t+1; |
||
819 | tcp->res_t+=1; |
||
820 | incr_top=1; |
||
821 | }else{ |
||
822 | pi[pino].poc.resno0 = tcp->res_t; |
||
823 | pi[pino].poc.resno1 = tcp->res_t+1; |
||
824 | tcp->res_t+=1; |
||
825 | incr_top=0; |
||
826 | } |
||
827 | }else{ |
||
828 | pi[pino].poc.resno0 = tcp->res_t - 1; |
||
829 | pi[pino].poc.resno1 = tcp->res_t; |
||
830 | } |
||
831 | } |
||
832 | } |
||
833 | break; |
||
834 | |||
835 | case 'L': |
||
836 | if (i > tppos){ |
||
837 | pi[pino].poc.layno0 = tcp->layS; |
||
838 | pi[pino].poc.layno1 = tcp->layE; |
||
839 | }else{ |
||
840 | if (tpnum == 0){ |
||
841 | tcp->lay_t = tcp->layS; |
||
842 | pi[pino].poc.layno0 = tcp->lay_t; |
||
843 | pi[pino].poc.layno1 = tcp->lay_t+1; |
||
844 | tcp->lay_t+=1; |
||
845 | }else{ |
||
846 | if (incr_top == 1){ |
||
847 | if(tcp->lay_t == tcp->layE){ |
||
848 | tcp->lay_t = tcp->layS; |
||
849 | pi[pino].poc.layno0 = tcp->lay_t; |
||
850 | pi[pino].poc.layno1 = tcp->lay_t+1; |
||
851 | tcp->lay_t+=1; |
||
852 | incr_top=1; |
||
853 | }else{ |
||
854 | pi[pino].poc.layno0 = tcp->lay_t; |
||
855 | pi[pino].poc.layno1 = tcp->lay_t+1; |
||
856 | tcp->lay_t+=1; |
||
857 | incr_top=0; |
||
858 | } |
||
859 | }else{ |
||
860 | pi[pino].poc.layno0 = tcp->lay_t - 1; |
||
861 | pi[pino].poc.layno1 = tcp->lay_t; |
||
862 | } |
||
863 | } |
||
864 | } |
||
865 | break; |
||
866 | |||
867 | case 'P': |
||
868 | switch(tcp->prg){ |
||
869 | case LRCP: |
||
870 | case RLCP: |
||
871 | if (i > tppos){ |
||
872 | pi[pino].poc.precno0 = tcp->prcS; |
||
873 | pi[pino].poc.precno1 = tcp->prcE; |
||
874 | }else{ |
||
875 | if (tpnum == 0){ |
||
876 | tcp->prc_t = tcp->prcS; |
||
877 | pi[pino].poc.precno0 = tcp->prc_t; |
||
878 | pi[pino].poc.precno1 = tcp->prc_t+1; |
||
879 | tcp->prc_t+=1; |
||
880 | }else{ |
||
881 | if (incr_top == 1){ |
||
882 | if(tcp->prc_t == tcp->prcE){ |
||
883 | tcp->prc_t = tcp->prcS; |
||
884 | pi[pino].poc.precno0 = tcp->prc_t; |
||
885 | pi[pino].poc.precno1 = tcp->prc_t+1; |
||
886 | tcp->prc_t+=1; |
||
887 | incr_top=1; |
||
888 | }else{ |
||
889 | pi[pino].poc.precno0 = tcp->prc_t; |
||
890 | pi[pino].poc.precno1 = tcp->prc_t+1; |
||
891 | tcp->prc_t+=1; |
||
892 | incr_top=0; |
||
893 | } |
||
894 | }else{ |
||
895 | pi[pino].poc.precno0 = tcp->prc_t - 1; |
||
896 | pi[pino].poc.precno1 = tcp->prc_t; |
||
897 | } |
||
898 | } |
||
899 | } |
||
900 | break; |
||
901 | default: |
||
902 | if (i > tppos){ |
||
903 | pi[pino].poc.tx0 = tcp->txS; |
||
904 | pi[pino].poc.ty0 = tcp->tyS; |
||
905 | pi[pino].poc.tx1 = tcp->txE; |
||
906 | pi[pino].poc.ty1 = tcp->tyE; |
||
907 | }else{ |
||
908 | if (tpnum == 0){ |
||
909 | tcp->tx0_t = tcp->txS; |
||
910 | tcp->ty0_t = tcp->tyS; |
||
911 | pi[pino].poc.tx0 = tcp->tx0_t; |
||
912 | pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx); |
||
913 | pi[pino].poc.ty0 = tcp->ty0_t; |
||
914 | pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); |
||
915 | tcp->tx0_t = pi[pino].poc.tx1; |
||
916 | tcp->ty0_t = pi[pino].poc.ty1; |
||
917 | }else{ |
||
918 | if (incr_top == 1){ |
||
919 | if(tcp->tx0_t >= tcp->txE){ |
||
920 | if(tcp->ty0_t >= tcp->tyE){ |
||
921 | tcp->ty0_t = tcp->tyS; |
||
922 | pi[pino].poc.ty0 = tcp->ty0_t; |
||
923 | pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); |
||
924 | tcp->ty0_t = pi[pino].poc.ty1; |
||
925 | incr_top=1;resetX=1; |
||
926 | }else{ |
||
927 | pi[pino].poc.ty0 = tcp->ty0_t; |
||
928 | pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); |
||
929 | tcp->ty0_t = pi[pino].poc.ty1; |
||
930 | incr_top=0;resetX=1; |
||
931 | } |
||
932 | if(resetX==1){ |
||
933 | tcp->tx0_t = tcp->txS; |
||
934 | pi[pino].poc.tx0 = tcp->tx0_t; |
||
935 | pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx); |
||
936 | tcp->tx0_t = pi[pino].poc.tx1; |
||
937 | } |
||
938 | }else{ |
||
939 | pi[pino].poc.tx0 = tcp->tx0_t; |
||
940 | pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx); |
||
941 | tcp->tx0_t = pi[pino].poc.tx1; |
||
942 | pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); |
||
943 | pi[pino].poc.ty1 = tcp->ty0_t ; |
||
944 | incr_top=0; |
||
945 | } |
||
946 | }else{ |
||
947 | pi[pino].poc.tx0 = tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx); |
||
948 | pi[pino].poc.tx1 = tcp->tx0_t ; |
||
949 | pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); |
||
950 | pi[pino].poc.ty1 = tcp->ty0_t ; |
||
951 | } |
||
952 | } |
||
953 | } |
||
954 | break; |
||
955 | } |
||
956 | break; |
||
957 | } |
||
958 | } |
||
959 | } |
||
960 | } |
||
961 | return false; |
||
962 | }>>>><>><>>>><>><>><>><>>>>><>><>><>><>>>>>><>><>><>><>><>><>><>><>><>><>><>><>>>>><>><>>>>><>><>><>><>><>><>><>><>><>><>><>><>>>>>><>><>>>>><>><>><>><>><>><>><>><>><>><>><>><>>>>>><>><>>>>>>>>>>> |
||
963 |