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 }