Mercurial > libavcodec.hg
comparison indeo3.c @ 1198:cae31b22b14e libavcodec
code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
author | tmmm |
---|---|
date | Sat, 19 Apr 2003 13:30:09 +0000 |
parents | 60bd91a6e218 |
children | d63e0185a90f |
comparison
equal
deleted
inserted
replaced
1197:d9cbc8ef5a33 | 1198:cae31b22b14e |
---|---|
253 long usl7; | 253 long usl7; |
254 } ustr_t; | 254 } ustr_t; |
255 | 255 |
256 /* ---------------------------------------------------------------------- */ | 256 /* ---------------------------------------------------------------------- */ |
257 | 257 |
258 #define LV1_CHECK(buf1,rle_v3,lv1,lp2) \ | |
259 if((lv1 & 0x80) != 0) { \ | |
260 if(rle_v3 != 0) \ | |
261 rle_v3 = 0; \ | |
262 else { \ | |
263 rle_v3 = 1; \ | |
264 buf1 -= 2; \ | |
265 } \ | |
266 } \ | |
267 lp2 = 4; | |
268 | |
269 | |
270 #define RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) \ | |
271 if(rle_v3 == 0) { \ | |
272 rle_v2 = *buf1; \ | |
273 rle_v1 = 1; \ | |
274 if(rle_v2 > 32) { \ | |
275 rle_v2 -= 32; \ | |
276 rle_v1 = 0; \ | |
277 } \ | |
278 rle_v3 = 1; \ | |
279 } \ | |
280 buf1--; | |
281 | |
282 | |
283 #define LP2_CHECK(buf1,rle_v3,lp2) \ | |
284 if(lp2 == 0 && rle_v3 != 0) \ | |
285 rle_v3 = 0; \ | |
286 else { \ | |
287 buf1--; \ | |
288 rle_v3 = 1; \ | |
289 } | |
290 | |
291 | |
292 #define RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) \ | |
293 rle_v2--; \ | |
294 if(rle_v2 == 0) { \ | |
295 rle_v3 = 0; \ | |
296 buf1 += 2; \ | |
297 } \ | |
298 lp2 = 4; | |
299 | |
258 static void iv_Decode_Chunk(Indeo3DecodeContext *s, | 300 static void iv_Decode_Chunk(Indeo3DecodeContext *s, |
259 unsigned char *cur, unsigned char *ref, int width, int height, | 301 unsigned char *cur, unsigned char *ref, int width, int height, |
260 unsigned char *buf1, long fflags2, unsigned char *hdr, | 302 unsigned char *buf1, long fflags2, unsigned char *hdr, |
261 unsigned char *buf2, int min_width_160) | 303 unsigned char *buf2, int min_width_160) |
262 { | 304 { |
266 char *ref_vectors; | 308 char *ref_vectors; |
267 unsigned char *cur_frm_pos, *ref_frm_pos, *cp, *cp2; | 309 unsigned char *cur_frm_pos, *ref_frm_pos, *cp, *cp2; |
268 unsigned long *cur_lp, *ref_lp, *correction_lp[2], *correctionloworder_lp[2], | 310 unsigned long *cur_lp, *ref_lp, *correction_lp[2], *correctionloworder_lp[2], |
269 *correctionhighorder_lp[2]; | 311 *correctionhighorder_lp[2]; |
270 unsigned short *correction_type_sp[2]; | 312 unsigned short *correction_type_sp[2]; |
271 ustr_t xustr[20], *ptr_ustr; | 313 ustr_t strip_tbl[20], *strip; |
272 int i, j, k, lp1, lp2, flag1, cmd, blks_width, blks_height, region_160_width, | 314 int i, j, k, lp1, lp2, flag1, cmd, blks_width, blks_height, region_160_width, |
273 rle_v1, rle_v2, rle_v3; | 315 rle_v1, rle_v2, rle_v3; |
274 | 316 |
275 bit_buf = 0; | 317 bit_buf = 0; |
276 ref_vectors = NULL; | 318 ref_vectors = NULL; |
278 width_tbl = width_tbl_arr + 1; | 320 width_tbl = width_tbl_arr + 1; |
279 i = (width < 0 ? width + 3 : width)/4; | 321 i = (width < 0 ? width + 3 : width)/4; |
280 for(j = -1; j < 8; j++) | 322 for(j = -1; j < 8; j++) |
281 width_tbl[j] = i * j; | 323 width_tbl[j] = i * j; |
282 | 324 |
283 ptr_ustr = xustr; | 325 strip = strip_tbl; |
284 | 326 |
285 for(region_160_width = 0; region_160_width < (width - min_width_160); region_160_width += min_width_160); | 327 for(region_160_width = 0; region_160_width < (width - min_width_160); region_160_width += min_width_160); |
286 | 328 |
287 ptr_ustr->ypos = ptr_ustr->xpos = 0; | 329 strip->ypos = strip->xpos = 0; |
288 for(ptr_ustr->width = min_width_160; width > ptr_ustr->width; ptr_ustr->width *= 2); | 330 for(strip->width = min_width_160; width > strip->width; strip->width *= 2); |
289 ptr_ustr->height = height; | 331 strip->height = height; |
290 ptr_ustr->split_direction = 0; | 332 strip->split_direction = 0; |
291 ptr_ustr->split_flag = 0; | 333 strip->split_flag = 0; |
292 ptr_ustr->usl7 = 0; | 334 strip->usl7 = 0; |
293 | 335 |
294 bit_pos = 0; | 336 bit_pos = 0; |
295 | 337 |
296 rle_v1 = rle_v2 = rle_v3 = 0; | 338 rle_v1 = rle_v2 = rle_v3 = 0; |
297 | 339 |
298 while(ptr_ustr >= xustr) { | 340 while(strip >= strip_tbl) { |
299 if(bit_pos <= 0) { | 341 if(bit_pos <= 0) { |
300 bit_pos = 8; | 342 bit_pos = 8; |
301 bit_buf = *buf1++; | 343 bit_buf = *buf1++; |
302 } | 344 } |
303 | 345 |
304 bit_pos -= 2; | 346 bit_pos -= 2; |
305 cmd = (bit_buf >> bit_pos) & 0x03; | 347 cmd = (bit_buf >> bit_pos) & 0x03; |
306 | 348 |
307 if(cmd == 0) { | 349 if(cmd == 0) { |
308 ptr_ustr++; | 350 strip++; |
309 memcpy(ptr_ustr, ptr_ustr-1, sizeof(ustr_t)); | 351 memcpy(strip, strip-1, sizeof(ustr_t)); |
310 ptr_ustr->split_flag = 1; | 352 strip->split_flag = 1; |
311 ptr_ustr->split_direction = 0; | 353 strip->split_direction = 0; |
312 ptr_ustr->height = (ptr_ustr->height > 8 ? ((ptr_ustr->height+8)>>4)<<3 : 4); | 354 strip->height = (strip->height > 8 ? ((strip->height+8)>>4)<<3 : 4); |
313 continue; | 355 continue; |
314 } else if(cmd == 1) { | 356 } else if(cmd == 1) { |
315 ptr_ustr++; | 357 strip++; |
316 memcpy(ptr_ustr, ptr_ustr-1, sizeof(ustr_t)); | 358 memcpy(strip, strip-1, sizeof(ustr_t)); |
317 ptr_ustr->split_flag = 1; | 359 strip->split_flag = 1; |
318 ptr_ustr->split_direction = 1; | 360 strip->split_direction = 1; |
319 ptr_ustr->width = (ptr_ustr->width > 8 ? ((ptr_ustr->width+8)>>4)<<3 : 4); | 361 strip->width = (strip->width > 8 ? ((strip->width+8)>>4)<<3 : 4); |
320 continue; | 362 continue; |
321 } else if(cmd == 2) { | 363 } else if(cmd == 2) { |
322 if(ptr_ustr->usl7 == 0) { | 364 if(strip->usl7 == 0) { |
323 ptr_ustr->usl7 = 1; | 365 strip->usl7 = 1; |
324 ref_vectors = NULL; | 366 ref_vectors = NULL; |
325 continue; | 367 continue; |
326 } | 368 } |
327 } else if(cmd == 3) { | 369 } else if(cmd == 3) { |
328 if(ptr_ustr->usl7 == 0) { | 370 if(strip->usl7 == 0) { |
329 ptr_ustr->usl7 = 1; | 371 strip->usl7 = 1; |
330 ref_vectors = buf2 + (*buf1 * 2); | 372 ref_vectors = buf2 + (*buf1 * 2); |
331 buf1++; | 373 buf1++; |
332 continue; | 374 continue; |
333 } | 375 } |
334 } | 376 } |
335 | 377 |
336 cur_frm_pos = cur + width * ptr_ustr->ypos + ptr_ustr->xpos; | 378 cur_frm_pos = cur + width * strip->ypos + strip->xpos; |
337 | 379 |
338 if((blks_width = ptr_ustr->width) < 0) | 380 if((blks_width = strip->width) < 0) |
339 blks_width += 3; | 381 blks_width += 3; |
340 blks_width >>= 2; | 382 blks_width >>= 2; |
341 blks_height = ptr_ustr->height; | 383 blks_height = strip->height; |
342 | 384 |
343 if(ref_vectors != NULL) { | 385 if(ref_vectors != NULL) { |
344 ref_frm_pos = ref + (ref_vectors[0] + ptr_ustr->ypos) * width + | 386 ref_frm_pos = ref + (ref_vectors[0] + strip->ypos) * width + |
345 ref_vectors[1] + ptr_ustr->xpos; | 387 ref_vectors[1] + strip->xpos; |
346 } else | 388 } else |
347 ref_frm_pos = cur_frm_pos - width_tbl[4]; | 389 ref_frm_pos = cur_frm_pos - width_tbl[4]; |
348 | 390 |
349 if(cmd == 2) { | 391 if(cmd == 2) { |
350 if(bit_pos <= 0) { | 392 if(bit_pos <= 0) { |
426 lp2 = 3; | 468 lp2 = 3; |
427 } | 469 } |
428 break; | 470 break; |
429 case 8: | 471 case 8: |
430 if(lp2 == 0) { | 472 if(lp2 == 0) { |
431 if(rle_v3 == 0) { | 473 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) |
432 rle_v2 = *buf1; | |
433 rle_v1 = 1; | |
434 if(rle_v2 > 32) { | |
435 rle_v2 -= 32; | |
436 rle_v1 = 0; | |
437 } | |
438 rle_v3 = 1; | |
439 } | |
440 buf1--; | |
441 | 474 |
442 if(rle_v1 == 1 || ref_vectors != NULL) { | 475 if(rle_v1 == 1 || ref_vectors != NULL) { |
443 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) | 476 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) |
444 cur_lp[j] = ref_lp[j]; | 477 cur_lp[j] = ref_lp[j]; |
445 } | 478 } |
446 | 479 |
447 rle_v2--; | 480 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) |
448 if(rle_v2 == 0) { | |
449 rle_v3 = 0; | |
450 buf1 += 2; | |
451 } | |
452 lp2 = 4; | |
453 break; | 481 break; |
454 } else { | 482 } else { |
455 rle_v1 = 1; | 483 rle_v1 = 1; |
456 rle_v2 = *buf1 - 1; | 484 rle_v2 = *buf1 - 1; |
457 } | 485 } |
458 case 5: | 486 case 5: |
459 if(lp2 == 0 && rle_v3 != 0) | 487 LP2_CHECK(buf1,rle_v3,lp2) |
460 rle_v3 = 0; | |
461 else { | |
462 buf1--; | |
463 rle_v3 = 1; | |
464 } | |
465 case 4: | 488 case 4: |
466 for(i = 0, j = 0; i < (4 - lp2); i++, j += width_tbl[1]) | 489 for(i = 0, j = 0; i < (4 - lp2); i++, j += width_tbl[1]) |
467 cur_lp[j] = ref_lp[j]; | 490 cur_lp[j] = ref_lp[j]; |
468 lp2 = 4; | 491 lp2 = 4; |
469 break; | 492 break; |
489 lv += (lv << 8); | 512 lv += (lv << 8); |
490 lv += (lv << 16); | 513 lv += (lv << 16); |
491 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) | 514 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) |
492 cur_lp[j] = lv; | 515 cur_lp[j] = lv; |
493 | 516 |
494 if((lv1 & 0x80) != 0) { | 517 LV1_CHECK(buf1,rle_v3,lv1,lp2) |
495 if(rle_v3 != 0) | |
496 rle_v3 = 0; | |
497 else { | |
498 rle_v3 = 1; | |
499 buf1 -= 2; | |
500 } | |
501 } | |
502 lp2 = 4; | |
503 break; | 518 break; |
504 default: | 519 default: |
505 return; | 520 return; |
506 } | 521 } |
507 } | 522 } |
530 ref_lp = ((unsigned long *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1]; | 545 ref_lp = ((unsigned long *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1]; |
531 | 546 |
532 switch(correction_type_sp[lp2 & 0x01][k]) { | 547 switch(correction_type_sp[lp2 & 0x01][k]) { |
533 case 0: | 548 case 0: |
534 cur_lp[width_tbl[1]] = ((*ref_lp >> 1) + correction_lp[lp2 & 0x01][k]) << 1; | 549 cur_lp[width_tbl[1]] = ((*ref_lp >> 1) + correction_lp[lp2 & 0x01][k]) << 1; |
535 if(lp2 > 0 || flag1 == 0 || ptr_ustr->ypos != 0) | 550 if(lp2 > 0 || flag1 == 0 || strip->ypos != 0) |
536 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; | 551 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; |
537 else | 552 else |
538 cur_lp[0] = ((*ref_lp >> 1) + correction_lp[lp2 & 0x01][k]) << 1; | 553 cur_lp[0] = ((*ref_lp >> 1) + correction_lp[lp2 & 0x01][k]) << 1; |
539 lp2++; | 554 lp2++; |
540 break; | 555 break; |
542 case 1: | 557 case 1: |
543 ((unsigned short *)cur_lp)[width_tbl[2]] = | 558 ((unsigned short *)cur_lp)[width_tbl[2]] = |
544 ((((unsigned short *)ref_lp)[0] >> 1) + correction_lp[lp2 & 0x01][*buf1++]) << 1; | 559 ((((unsigned short *)ref_lp)[0] >> 1) + correction_lp[lp2 & 0x01][*buf1++]) << 1; |
545 ((unsigned short *)cur_lp)[width_tbl[2]+1] = | 560 ((unsigned short *)cur_lp)[width_tbl[2]+1] = |
546 ((((unsigned short *)ref_lp)[1] >> 1) + correction_lp[lp2 & 0x01][k]) << 1; | 561 ((((unsigned short *)ref_lp)[1] >> 1) + correction_lp[lp2 & 0x01][k]) << 1; |
547 if(lp2 > 0 || flag1 == 0 || ptr_ustr->ypos != 0) | 562 if(lp2 > 0 || flag1 == 0 || strip->ypos != 0) |
548 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; | 563 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; |
549 else | 564 else |
550 cur_lp[0] = cur_lp[width_tbl[1]]; | 565 cur_lp[0] = cur_lp[width_tbl[1]]; |
551 lp2++; | 566 lp2++; |
552 break; | 567 break; |
581 lp2 = 4; | 596 lp2 = 4; |
582 break; | 597 break; |
583 | 598 |
584 case 8: | 599 case 8: |
585 if(lp2 == 0) { | 600 if(lp2 == 0) { |
586 if(rle_v3 == 0) { | 601 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) |
587 rle_v2 = *buf1; | |
588 rle_v1 = 1; | |
589 if(rle_v2 > 32) { | |
590 rle_v2 -= 32; | |
591 rle_v1 = 0; | |
592 } | |
593 rle_v3 = 1; | |
594 } | |
595 buf1--; | |
596 | 602 |
597 if(rle_v1 == 1) { | 603 if(rle_v1 == 1) { |
598 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) | 604 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) |
599 cur_lp[j] = ref_lp[j]; | 605 cur_lp[j] = ref_lp[j]; |
600 } | 606 } |
601 | 607 |
602 rle_v2--; | 608 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) |
603 if(rle_v2 == 0) { | |
604 rle_v3 = 0; | |
605 buf1 += 2; | |
606 } | |
607 lp2 = 4; | |
608 break; | 609 break; |
609 } else { | 610 } else { |
610 rle_v2 = (*buf1) - 1; | 611 rle_v2 = (*buf1) - 1; |
611 rle_v1 = 1; | 612 rle_v1 = 1; |
612 } | 613 } |
613 case 5: | 614 case 5: |
614 if(lp2 == 0 && rle_v3 != 0) | 615 LP2_CHECK(buf1,rle_v3,lp2) |
615 rle_v3 = 0; | |
616 else { | |
617 buf1--; | |
618 rle_v3 = 1; | |
619 } | |
620 case 4: | 616 case 4: |
621 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) | 617 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) |
622 cur_lp[j] = *ref_lp; | 618 cur_lp[j] = *ref_lp; |
623 lp2 = 4; | 619 lp2 = 4; |
624 break; | 620 break; |
631 lv += (lv << 16); | 627 lv += (lv << 16); |
632 | 628 |
633 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) | 629 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) |
634 cur_lp[j] = lv; | 630 cur_lp[j] = lv; |
635 | 631 |
636 if((lv1 & 0x80) != 0) { | 632 LV1_CHECK(buf1,rle_v3,lv1,lp2) |
637 if(rle_v3 != 0) | |
638 rle_v3 = 0; | |
639 else { | |
640 rle_v3 = 1; | |
641 buf1 -= 2; | |
642 } | |
643 } | |
644 lp2 = 4; | |
645 break; | 633 break; |
646 | 634 |
647 default: | 635 default: |
648 return; | 636 return; |
649 } | 637 } |
678 | 666 |
679 switch(correction_type_sp[lp2 & 0x01][k]) { | 667 switch(correction_type_sp[lp2 & 0x01][k]) { |
680 case 0: | 668 case 0: |
681 cur_lp[width_tbl[1]] = ((lv1 >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1; | 669 cur_lp[width_tbl[1]] = ((lv1 >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1; |
682 cur_lp[width_tbl[1]+1] = ((lv2 >> 1) + correctionhighorder_lp[lp2 & 0x01][k]) << 1; | 670 cur_lp[width_tbl[1]+1] = ((lv2 >> 1) + correctionhighorder_lp[lp2 & 0x01][k]) << 1; |
683 if(lp2 > 0 || ptr_ustr->ypos != 0 || flag1 == 0) { | 671 if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) { |
684 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; | 672 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; |
685 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; | 673 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; |
686 } else { | 674 } else { |
687 cur_lp[0] = cur_lp[width_tbl[1]]; | 675 cur_lp[0] = cur_lp[width_tbl[1]]; |
688 cur_lp[1] = cur_lp[width_tbl[1]+1]; | 676 cur_lp[1] = cur_lp[width_tbl[1]+1]; |
691 break; | 679 break; |
692 | 680 |
693 case 1: | 681 case 1: |
694 cur_lp[width_tbl[1]] = ((lv1 >> 1) + correctionloworder_lp[lp2 & 0x01][*buf1++]) << 1; | 682 cur_lp[width_tbl[1]] = ((lv1 >> 1) + correctionloworder_lp[lp2 & 0x01][*buf1++]) << 1; |
695 cur_lp[width_tbl[1]+1] = ((lv2 >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1; | 683 cur_lp[width_tbl[1]+1] = ((lv2 >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1; |
696 if(lp2 > 0 || ptr_ustr->ypos != 0 || flag1 == 0) { | 684 if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) { |
697 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; | 685 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; |
698 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; | 686 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; |
699 } else { | 687 } else { |
700 cur_lp[0] = cur_lp[width_tbl[1]]; | 688 cur_lp[0] = cur_lp[width_tbl[1]]; |
701 cur_lp[1] = cur_lp[width_tbl[1]+1]; | 689 cur_lp[1] = cur_lp[width_tbl[1]+1]; |
741 } | 729 } |
742 break; | 730 break; |
743 | 731 |
744 case 8: | 732 case 8: |
745 if(lp2 == 0) { | 733 if(lp2 == 0) { |
746 if(rle_v3 == 0) { | 734 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) |
747 rle_v2 = *buf1; | |
748 rle_v1 = 1; | |
749 if(rle_v2 > 32) { | |
750 rle_v2 -= 32; | |
751 rle_v1 = 0; | |
752 } | |
753 rle_v3 = 1; | |
754 } | |
755 buf1--; | |
756 if(rle_v1 == 1) { | 735 if(rle_v1 == 1) { |
757 if(flag1 != 0) { | 736 if(flag1 != 0) { |
758 for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) { | 737 for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) { |
759 cur_lp[j] = lv1; | 738 cur_lp[j] = lv1; |
760 cur_lp[j+1] = lv2; | 739 cur_lp[j+1] = lv2; |
766 cur_lp[j] = lv1; | 745 cur_lp[j] = lv1; |
767 cur_lp[j+1] = lv2; | 746 cur_lp[j+1] = lv2; |
768 } | 747 } |
769 } | 748 } |
770 } | 749 } |
771 rle_v2--; | 750 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) |
772 if(rle_v2 == 0) { | |
773 rle_v3 = 0; | |
774 buf1 += 2; | |
775 } | |
776 lp2 = 4; | |
777 break; | 751 break; |
778 } else { | 752 } else { |
779 rle_v1 = 1; | 753 rle_v1 = 1; |
780 rle_v2 = (*buf1) - 1; | 754 rle_v2 = (*buf1) - 1; |
781 } | 755 } |
782 case 5: | 756 case 5: |
783 if(lp2 == 0 && rle_v3 != 0) | 757 LP2_CHECK(buf1,rle_v3,lp2) |
784 rle_v3 = 0; | |
785 else { | |
786 buf1--; | |
787 rle_v3 = 1; | |
788 } | |
789 case 4: | 758 case 4: |
790 if(lp2 == 0 && flag1 != 0) { | 759 if(lp2 == 0 && flag1 != 0) { |
791 for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) { | 760 for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) { |
792 cur_lp[j] = lv1; | 761 cur_lp[j] = lv1; |
793 cur_lp[j+1] = lv2; | 762 cur_lp[j+1] = lv2; |
825 lv = (lv1 & 0x7F) << 1; | 794 lv = (lv1 & 0x7F) << 1; |
826 lv += (lv << 8); | 795 lv += (lv << 8); |
827 lv += (lv << 16); | 796 lv += (lv << 16); |
828 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) | 797 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) |
829 cur_lp[j] = lv; | 798 cur_lp[j] = lv; |
830 if((lv1 & 0x80) != 0) { | 799 LV1_CHECK(buf1,rle_v3,lv1,lp2) |
831 if(rle_v3 != 0) | |
832 rle_v3 = 0; | |
833 else { | |
834 rle_v3 = 1; | |
835 buf1 -= 2; | |
836 } | |
837 } | |
838 lp2 = 4; | |
839 break; | 800 break; |
840 | 801 |
841 default: | 802 default: |
842 return; | 803 return; |
843 } | 804 } |
898 } | 859 } |
899 break; | 860 break; |
900 | 861 |
901 case 8: | 862 case 8: |
902 if(lp2 == 0) { | 863 if(lp2 == 0) { |
903 if(rle_v3 == 0) { | 864 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) |
904 rle_v2 = *buf1; | |
905 rle_v1 = 1; | |
906 if(rle_v2 > 32) { | |
907 rle_v2 -= 32; | |
908 rle_v1 = 0; | |
909 } | |
910 rle_v3 = 1; | |
911 } | |
912 buf1--; | |
913 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) { | 865 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) { |
914 ((unsigned long *)cur_frm_pos)[j] = ((unsigned long *)ref_frm_pos)[j]; | 866 ((unsigned long *)cur_frm_pos)[j] = ((unsigned long *)ref_frm_pos)[j]; |
915 ((unsigned long *)cur_frm_pos)[j+1] = ((unsigned long *)ref_frm_pos)[j+1]; | 867 ((unsigned long *)cur_frm_pos)[j+1] = ((unsigned long *)ref_frm_pos)[j+1]; |
916 } | 868 } |
917 rle_v2--; | 869 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) |
918 if(rle_v2 == 0) { | |
919 rle_v3 = 0; | |
920 buf1 += 2; | |
921 } | |
922 lp2 = 4; | |
923 break; | 870 break; |
924 } else { | 871 } else { |
925 rle_v1 = 1; | 872 rle_v1 = 1; |
926 rle_v2 = (*buf1) - 1; | 873 rle_v2 = (*buf1) - 1; |
927 } | 874 } |
928 case 5: | 875 case 5: |
929 case 7: | 876 case 7: |
930 if(lp2 == 0 && rle_v3 != 0) | 877 LP2_CHECK(buf1,rle_v3,lp2) |
931 rle_v3 = 0; | |
932 else { | |
933 buf1--; | |
934 rle_v3 = 1; | |
935 } | |
936 case 6: | 878 case 6: |
937 case 4: | 879 case 4: |
938 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) { | 880 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) { |
939 cur_lp[j] = ref_lp[j]; | 881 cur_lp[j] = ref_lp[j]; |
940 cur_lp[j+1] = ref_lp[j+1]; | 882 cur_lp[j+1] = ref_lp[j+1]; |
948 lv = (lv1 & 0x7F) << 1; | 890 lv = (lv1 & 0x7F) << 1; |
949 lv += (lv << 8); | 891 lv += (lv << 8); |
950 lv += (lv << 16); | 892 lv += (lv << 16); |
951 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) | 893 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) |
952 ((unsigned long *)cur_frm_pos)[j] = ((unsigned long *)cur_frm_pos)[j+1] = lv; | 894 ((unsigned long *)cur_frm_pos)[j] = ((unsigned long *)cur_frm_pos)[j+1] = lv; |
953 if((lv1 & 0x80) != 0) { | 895 LV1_CHECK(buf1,rle_v3,lv1,lp2) |
954 if(rle_v3 != 0) | |
955 rle_v3 = 0; | |
956 else { | |
957 rle_v3 = 1; | |
958 buf1 -= 2; | |
959 } | |
960 } | |
961 lp2 = 4; | |
962 break; | 896 break; |
963 | 897 |
964 default: | 898 default: |
965 return; | 899 return; |
966 } | 900 } |
1020 } | 954 } |
1021 break; | 955 break; |
1022 | 956 |
1023 case 8: | 957 case 8: |
1024 if(lp2 == 0) { | 958 if(lp2 == 0) { |
1025 if(rle_v3 == 0) { | 959 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) |
1026 rle_v2 = *buf1; | |
1027 rle_v1 = 1; | |
1028 if(rle_v2 > 32) { | |
1029 rle_v2 -= 32; | |
1030 rle_v1 = 0; | |
1031 } | |
1032 rle_v3 = 1; | |
1033 } | |
1034 buf1--; | |
1035 | 960 |
1036 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) | 961 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) |
1037 cur_lp[j] = ref_lp[j]; | 962 cur_lp[j] = ref_lp[j]; |
1038 | 963 |
1039 rle_v2--; | 964 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) |
1040 if(rle_v2 == 0) { | |
1041 rle_v3 = 0; | |
1042 buf1 += 2; | |
1043 } | |
1044 lp2 = 4; | |
1045 break; | 965 break; |
1046 } else { | 966 } else { |
1047 rle_v1 = 1; | 967 rle_v1 = 1; |
1048 rle_v2 = (*buf1) - 1; | 968 rle_v2 = (*buf1) - 1; |
1049 } | 969 } |
1050 case 5: | 970 case 5: |
1051 case 7: | 971 case 7: |
1052 if(lp2 == 0 && rle_v3 != 0) | 972 LP2_CHECK(buf1,rle_v3,lp2) |
1053 rle_v3 = 0; | |
1054 else { | |
1055 buf1--; | |
1056 rle_v3 = 1; | |
1057 } | |
1058 case 4: | 973 case 4: |
1059 case 6: | 974 case 6: |
1060 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) | 975 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) |
1061 cur_lp[j] = ref_lp[j]; | 976 cur_lp[j] = ref_lp[j]; |
1062 lp2 = 4; | 977 lp2 = 4; |
1068 lv = (lv1 & 0x7F) << 1; | 983 lv = (lv1 & 0x7F) << 1; |
1069 lv += (lv << 8); | 984 lv += (lv << 8); |
1070 lv += (lv << 16); | 985 lv += (lv << 16); |
1071 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) | 986 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) |
1072 cur_lp[j] = lv; | 987 cur_lp[j] = lv; |
1073 if((lv1 & 0x80) != 0) { | 988 LV1_CHECK(buf1,rle_v3,lv1,lp2) |
1074 if(rle_v3 != 0) | |
1075 rle_v3 = 0; | |
1076 else { | |
1077 rle_v3 = 1; | |
1078 buf1 -= 2; | |
1079 } | |
1080 } | |
1081 lp2 = 4; | |
1082 break; | 989 break; |
1083 | 990 |
1084 default: | 991 default: |
1085 return; | 992 return; |
1086 } | 993 } |
1098 default: | 1005 default: |
1099 return; | 1006 return; |
1100 } | 1007 } |
1101 } | 1008 } |
1102 | 1009 |
1103 if(ptr_ustr < xustr) | 1010 if(strip < strip_tbl) |
1104 return; | 1011 return; |
1105 | 1012 |
1106 for( ; ptr_ustr >= xustr; ptr_ustr--) { | 1013 for( ; strip >= strip_tbl; strip--) { |
1107 if(ptr_ustr->split_flag != 0) { | 1014 if(strip->split_flag != 0) { |
1108 ptr_ustr->split_flag = 0; | 1015 strip->split_flag = 0; |
1109 ptr_ustr->usl7 = (ptr_ustr-1)->usl7; | 1016 strip->usl7 = (strip-1)->usl7; |
1110 | 1017 |
1111 if(ptr_ustr->split_direction) { | 1018 if(strip->split_direction) { |
1112 ptr_ustr->xpos += ptr_ustr->width; | 1019 strip->xpos += strip->width; |
1113 ptr_ustr->width = (ptr_ustr-1)->width - ptr_ustr->width; | 1020 strip->width = (strip-1)->width - strip->width; |
1114 if(region_160_width <= ptr_ustr->xpos && width < ptr_ustr->width + ptr_ustr->xpos) | 1021 if(region_160_width <= strip->xpos && width < strip->width + strip->xpos) |
1115 ptr_ustr->width = width - ptr_ustr->xpos; | 1022 strip->width = width - strip->xpos; |
1116 } else { | 1023 } else { |
1117 ptr_ustr->ypos += ptr_ustr->height; | 1024 strip->ypos += strip->height; |
1118 ptr_ustr->height = (ptr_ustr-1)->height - ptr_ustr->height; | 1025 strip->height = (strip-1)->height - strip->height; |
1119 } | 1026 } |
1120 break; | 1027 break; |
1121 } | 1028 } |
1122 } | 1029 } |
1123 } | 1030 } |